metanorma-itu 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.hound.yml +3 -0
  3. data/.rubocop.yml +10 -0
  4. data/.travis.yml +17 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +25 -0
  8. data/README.adoc +72 -0
  9. data/Rakefile +6 -0
  10. data/appveyor.yml +29 -0
  11. data/lib/asciidoctor/itu.rb +7 -0
  12. data/lib/asciidoctor/itu/biblio.rng +949 -0
  13. data/lib/asciidoctor/itu/converter.rb +164 -0
  14. data/lib/asciidoctor/itu/front.rb +182 -0
  15. data/lib/asciidoctor/itu/isodoc.rng +1132 -0
  16. data/lib/asciidoctor/itu/isostandard.rng +801 -0
  17. data/lib/asciidoctor/itu/itu.rng +223 -0
  18. data/lib/asciidoctor/itu/reqt.rng +162 -0
  19. data/lib/asciidoctor/itu/validate.rb +55 -0
  20. data/lib/isodoc/itu.rb +11 -0
  21. data/lib/isodoc/itu/base_convert.rb +210 -0
  22. data/lib/isodoc/itu/html/Logo_ITU.jpg +0 -0
  23. data/lib/isodoc/itu/html/header.html +162 -0
  24. data/lib/isodoc/itu/html/html_itu_intro.html +42 -0
  25. data/lib/isodoc/itu/html/html_itu_titlepage.html +144 -0
  26. data/lib/isodoc/itu/html/htmlstyle.scss +1167 -0
  27. data/lib/isodoc/itu/html/itu-document-comb.png +0 -0
  28. data/lib/isodoc/itu/html/itu.scss +707 -0
  29. data/lib/isodoc/itu/html/logo.png +0 -0
  30. data/lib/isodoc/itu/html/scripts.html +82 -0
  31. data/lib/isodoc/itu/html/scripts.pdf.html +70 -0
  32. data/lib/isodoc/itu/html/word_itu_intro.html +246 -0
  33. data/lib/isodoc/itu/html/word_itu_titlepage.html +283 -0
  34. data/lib/isodoc/itu/html/wordstyle.scss +1237 -0
  35. data/lib/isodoc/itu/html_convert.rb +72 -0
  36. data/lib/isodoc/itu/i18n-en.yaml +2 -0
  37. data/lib/isodoc/itu/metadata.rb +100 -0
  38. data/lib/isodoc/itu/pdf_convert.rb +70 -0
  39. data/lib/isodoc/itu/word_convert.rb +115 -0
  40. data/lib/metanorma-itu.rb +8 -0
  41. data/lib/metanorma/itu.rb +11 -0
  42. data/lib/metanorma/itu/processor.rb +43 -0
  43. data/lib/metanorma/itu/version.rb +5 -0
  44. data/metanorma-itu.gemspec +44 -0
  45. metadata +327 -0
@@ -0,0 +1,72 @@
1
+ require "isodoc"
2
+ require_relative "metadata"
3
+ require "fileutils"
4
+
5
+ module IsoDoc
6
+ module ITU
7
+
8
+ # A {Converter} implementation that generates HTML output, and a document
9
+ # schema encapsulation of the document for validation
10
+ #
11
+ class HtmlConvert < IsoDoc::HtmlConvert
12
+ def initialize(options)
13
+ @libdir = File.dirname(__FILE__)
14
+ super
15
+ end
16
+
17
+ def convert1(docxml, filename, dir)
18
+ FileUtils.cp html_doc_path('Logo_ITU.jpg'), "#{@localdir}/Logo_ITU.jpg"
19
+ @files_to_delete << "#{@localdir}/Logo_ITU.jpg"
20
+ super
21
+ end
22
+
23
+ def html_toc(docxml)
24
+ docxml
25
+ end
26
+
27
+ def default_fonts(options)
28
+ {
29
+ bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' : '"Open Sans",sans-serif'),
30
+ headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' : '"Open Sans",sans-serif'),
31
+ monospacefont: '"Space Mono",monospace'
32
+ }
33
+ end
34
+
35
+ def default_file_locations(_options)
36
+ {
37
+ htmlstylesheet: html_doc_path("htmlstyle.scss"),
38
+ htmlcoverpage: html_doc_path("html_itu_titlepage.html"),
39
+ htmlintropage: html_doc_path("html_itu_intro.html"),
40
+ scripts: html_doc_path("scripts.html"),
41
+ }
42
+ end
43
+
44
+ def googlefonts
45
+ <<~HEAD.freeze
46
+ <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,800|Space+Mono:400,700" rel="stylesheet">
47
+ HEAD
48
+ end
49
+
50
+ def make_body(xml, docxml)
51
+ body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72", "xml:lang": "EN-US", class: "container" }
52
+ xml.body **body_attr do |body|
53
+ make_body1(body, docxml)
54
+ make_body2(body, docxml)
55
+ make_body3(body, docxml)
56
+ end
57
+ end
58
+
59
+ def make_body3(body, docxml)
60
+ body.div **{ class: "main-section" } do |div3|
61
+ abstract docxml, div3
62
+ preface docxml, div3
63
+ middle docxml, div3
64
+ footnotes div3
65
+ comments div3
66
+ end
67
+ end
68
+
69
+ include BaseConvert
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,2 @@
1
+ termsdef: Definitions
2
+ termnote: NOTE %
@@ -0,0 +1,100 @@
1
+ require "isodoc"
2
+
3
+ module IsoDoc
4
+ module ITU
5
+
6
+ class Metadata < IsoDoc::Metadata
7
+ def initialize(lang, script, labels)
8
+ super
9
+ end
10
+
11
+ def title(isoxml, _out)
12
+ main = isoxml&.at(ns("//bibdata/title[@language='en']"))&.text
13
+ set(:doctitle, main)
14
+ series = isoxml&.at(ns("//bibdata/series[@type='main']/title"))&.text
15
+ set(:series, series)
16
+ series1 = isoxml&.at(ns("//bibdata/series[@type='secondary']/title"))&.text
17
+ set(:series1, series1)
18
+ series2 = isoxml&.at(ns("//bibdata/series[@type='tertiary']/title"))&.text
19
+ set(:series2, series2)
20
+ end
21
+
22
+ def subtitle(_isoxml, _out)
23
+ nil
24
+ end
25
+
26
+ def author(isoxml, _out)
27
+ bureau = isoxml.at(ns("//bibdata/ext/editorialgroup/bureau"))
28
+ set(:bureau, bureau.text) if bureau
29
+ tc = isoxml.at(ns("//bibdata/ext/editorialgroup/committee"))
30
+ set(:tc, tc.text) if tc
31
+ end
32
+
33
+ def docid(isoxml, _out)
34
+ dn = isoxml.at(ns("//bibdata/docnumber"))
35
+ set(:docnumber, dn&.text)
36
+ dn = isoxml.at(ns("//bibdata/docidentifier"))
37
+ set(:docidentifier, dn&.text)
38
+ end
39
+
40
+ def status_abbr(status)
41
+ case status
42
+ when "working-draft" then "wd"
43
+ when "committee-draft" then "cd"
44
+ when "draft-standard" then "d"
45
+ else
46
+ ""
47
+ end
48
+ end
49
+
50
+ def unpublished(status)
51
+ %w(in-force-prepublished).include? status.downcase
52
+ end
53
+
54
+ def version(isoxml, _out)
55
+ super
56
+ revdate = get[:revdate]
57
+ set(:revdate_monthyear, monthyr(revdate))
58
+ end
59
+
60
+ MONTHS = {
61
+ "01": "January",
62
+ "02": "February",
63
+ "03": "March",
64
+ "04": "April",
65
+ "05": "May",
66
+ "06": "June",
67
+ "07": "July",
68
+ "08": "August",
69
+ "09": "September",
70
+ "10": "October",
71
+ "11": "November",
72
+ "12": "December",
73
+ }.freeze
74
+
75
+ def bibdate(isoxml, _out)
76
+ pubdate = isoxml.xpath(ns("//bibdata/date[@type = 'published']"))
77
+ pubdate and set(:pubdate_monthyear, monthyr(pubdate.text))
78
+ end
79
+
80
+ def monthyr(isodate)
81
+ m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)/.match isodate
82
+ return isodate unless m && m[:yr] && m[:mo]
83
+ return "#{m[:mo]}/#{m[:yr]}"
84
+ end
85
+
86
+ def keywords(isoxml, _out)
87
+ keywords = []
88
+ isoxml.xpath(ns("//bibdata/ext/keyword")).each do |kw|
89
+ keywords << kw.text
90
+ end
91
+ set(:keywords, keywords)
92
+ end
93
+
94
+ def ip_notice_received(isoxml, _out)
95
+ received = isoxml.at(ns("//bibdata/ext/ip-notice-received"))&.text || "false"
96
+ set(:ip_notice_received, received)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,70 @@
1
+ require "isodoc"
2
+ require_relative "metadata"
3
+ require "fileutils"
4
+
5
+ module IsoDoc
6
+ module ITU
7
+ # A {Converter} implementation that generates PDF HTML output, and a
8
+ # document schema encapsulation of the document for validation
9
+ class PdfConvert < IsoDoc::PdfConvert
10
+ def initialize(options)
11
+ @libdir = File.dirname(__FILE__)
12
+ super
13
+ end
14
+
15
+ def convert1(docxml, filename, dir)
16
+ FileUtils.cp html_doc_path('Logo_ITU.jpg'), File.join(@localdir, "Logo_ITU.jpg")
17
+ @files_to_delete << File.join(@localdir, "Logo_ITU.jpg")
18
+ super
19
+ end
20
+
21
+ def html_toc(docxml)
22
+ docxml
23
+ end
24
+
25
+ def default_fonts(options)
26
+ {
27
+ bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' : '"Open Sans",sans-serif'),
28
+ headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' : '"Open Sans",sans-serif'),
29
+ monospacefont: '"Space Mono",monospace'
30
+ }
31
+ end
32
+
33
+ def default_file_locations(_options)
34
+ {
35
+ htmlstylesheet: html_doc_path("htmlstyle.scss"),
36
+ htmlcoverpage: html_doc_path("html_itu_titlepage.html"),
37
+ htmlintropage: html_doc_path("html_itu_intro.html"),
38
+ scripts_pdf: html_doc_path("scripts.pdf.html"),
39
+ }
40
+ end
41
+
42
+ def googlefonts()
43
+ <<~HEAD.freeze
44
+ <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,800|Space+Mono:400,700" rel="stylesheet">
45
+ HEAD
46
+ end
47
+
48
+ def make_body(xml, docxml)
49
+ body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72", "xml:lang": "EN-US", class: "container" }
50
+ xml.body **body_attr do |body|
51
+ make_body1(body, docxml)
52
+ make_body2(body, docxml)
53
+ make_body3(body, docxml)
54
+ end
55
+ end
56
+
57
+ def make_body3(body, docxml)
58
+ body.div **{ class: "main-section" } do |div3|
59
+ abstract docxml, div3
60
+ preface docxml, div3
61
+ middle docxml, div3
62
+ footnotes div3
63
+ comments div3
64
+ end
65
+ end
66
+
67
+ include BaseConvert
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,115 @@
1
+ require "isodoc"
2
+ require_relative "metadata"
3
+ require "fileutils"
4
+
5
+ module IsoDoc
6
+ module ITU
7
+ # A {Converter} implementation that generates Word output, and a document
8
+ # schema encapsulation of the document for validation
9
+
10
+ class WordConvert < IsoDoc::WordConvert
11
+ def initialize(options)
12
+ @libdir = File.dirname(__FILE__)
13
+ super
14
+ end
15
+
16
+ def make_body(xml, docxml)
17
+ body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72" }
18
+ xml.body **body_attr do |body|
19
+ make_body1(body, docxml)
20
+ make_body2(body, docxml)
21
+ make_body3(body, docxml)
22
+ end
23
+ end
24
+
25
+ def make_body2(body, docxml)
26
+ body.div **{ class: "WordSection2" } do |div2|
27
+ info docxml, div2
28
+ abstract docxml, div2
29
+ keywords docxml, div2
30
+ preface docxml, div2
31
+ div2.p { |p| p << "&nbsp;" } # placeholder
32
+ end
33
+ section_break(body)
34
+ end
35
+
36
+ def abstract(isoxml, out)
37
+ f = isoxml.at(ns("//preface/abstract")) || return
38
+ out.div **attr_code(id: f["id"]) do |s|
39
+ clause_name(nil, "Summary", s, class: "AbstractTitle")
40
+ f.elements.each { |e| parse(e, s) unless e.name == "title" }
41
+ end
42
+ end
43
+
44
+ def keywords(_docxml, out)
45
+ kw = @meta.get[:keywords]
46
+ kw.nil? || kw.empty? and return
47
+ out.div do |div|
48
+ clause_name(nil, "Keywords", div, class: "IntroTitle")
49
+ div.p kw.sort.join(", ") + "."
50
+ end
51
+ end
52
+
53
+ def word_preface_cleanup(docxml)
54
+ docxml.xpath("//h1[@class = 'AbstractTitle'] | "\
55
+ "//h1[@class = 'IntroTitle']").each do |h2|
56
+ h2.name = "p"
57
+ h2["class"] = "h1Preface"
58
+ end
59
+ end
60
+
61
+ def word_cleanup(docxml)
62
+ word_preface_cleanup(docxml)
63
+ super
64
+ docxml
65
+ end
66
+
67
+ def middle_title(out)
68
+ out.p(**{ class: "zzSTDTitle1" }) { |p| p << "Recommendation " + @meta.get[:docidentifier] }
69
+ out.p(**{ class: "zzSTDTitle2" }) { |p| p << @meta.get[:doctitle] }
70
+ end
71
+
72
+ def word_preface(docxml)
73
+ super
74
+ abstractbox = docxml.at("//div[@id='abstractbox']")
75
+ historybox = docxml.at("//div[@id='historybox']")
76
+ keywordsbox = docxml.at("//div[@id='keywordsbox']")
77
+ abstract = docxml.at("//p[@class = 'h1Preface' and text() = 'Summary']/..")
78
+ history = docxml.at("//p[@class = 'h1Preface' and text() = 'History']/..")
79
+ keywords = docxml.at("//p[@class = 'h1Preface' and text() = 'Keywords']/..")
80
+ abstract.parent = abstractbox if abstract && abstractbox
81
+ history.parent = historybox if history && historybox
82
+ keywords.parent = keywordsbox if keywords && keywordsbox
83
+ end
84
+
85
+
86
+ def convert1(docxml, filename, dir)
87
+ FileUtils.cp html_doc_path('itu-document-comb.png'), File.join(@localdir, "itu-document-comb.png")
88
+ FileUtils.cp html_doc_path('logo.png'), File.join(@localdir, "logo.png")
89
+ super
90
+ end
91
+
92
+ def default_fonts(options)
93
+ {
94
+ bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' : '"Times New Roman",serif'),
95
+ headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' : '"Times New Roman",serif'),
96
+ monospacefont: '"Courier New",monospace'
97
+ }
98
+ end
99
+
100
+ def default_file_locations(options)
101
+ {
102
+ wordstylesheet: html_doc_path("wordstyle.scss"),
103
+ standardstylesheet: html_doc_path("itu.scss"),
104
+ header: html_doc_path("header.html"),
105
+ wordcoverpage: html_doc_path("word_itu_titlepage.html"),
106
+ wordintropage: html_doc_path("word_itu_intro.html"),
107
+ ulstyle: "l3",
108
+ olstyle: "l2",
109
+ }
110
+ end
111
+
112
+ include BaseConvert
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,8 @@
1
+ require "metanorma/itu"
2
+ require "asciidoctor"
3
+ require "asciidoctor/itu"
4
+ require "isodoc/itu"
5
+
6
+ if defined? Metanorma
7
+ Metanorma::Registry.instance.register(Metanorma::ITU::Processor)
8
+ end
@@ -0,0 +1,11 @@
1
+ require "metanorma/itu/processor"
2
+
3
+ module Metanorma
4
+ module ITU
5
+
6
+ ORGANIZATION_NAME_SHORT = "Acme"
7
+ ORGANIZATION_NAME_LONG = "Acme Corp."
8
+ DOCUMENT_NAMESPACE = "https://open.ribose.com/standards/itu"
9
+
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ require "metanorma/processor"
2
+
3
+ module Metanorma
4
+ module ITU
5
+ class Processor < Metanorma::Processor
6
+
7
+ def initialize
8
+ @short = :itu
9
+ @input_format = :asciidoc
10
+ @asciidoctor_backend = :itu
11
+ end
12
+
13
+ def output_formats
14
+ super.merge(
15
+ html: "html",
16
+ doc: "doc",
17
+ pdf: "pdf"
18
+ )
19
+ end
20
+
21
+ def version
22
+ "Metanorma::Acme #{Metanorma::ITU::VERSION}"
23
+ end
24
+
25
+ def input_to_isodoc(file, filename)
26
+ Metanorma::Input::Asciidoc.new.process(file, filename, @asciidoctor_backend)
27
+ end
28
+
29
+ def output(isodoc_node, outname, format, options={})
30
+ case format
31
+ when :html
32
+ IsoDoc::ITU::HtmlConvert.new(options).convert(outname, isodoc_node)
33
+ when :doc
34
+ IsoDoc::ITU::WordConvert.new(options).convert(outname, isodoc_node)
35
+ when :pdf
36
+ IsoDoc::ITU::PdfConvert.new(options).convert(outname, isodoc_node)
37
+ else
38
+ super
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,5 @@
1
+ module Metanorma
2
+ module ITU
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,44 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "metanorma/itu/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "metanorma-itu"
7
+ spec.version = Metanorma::ITU::VERSION
8
+ spec.authors = ["Ribose Inc."]
9
+ spec.email = ["open.source@ribose.com"]
10
+
11
+ spec.summary = "Metanorma for the ITU"
12
+ spec.description = <<~DESCRIPTION
13
+ Metanorma for the ITU.
14
+ DESCRIPTION
15
+
16
+ spec.homepage = "https://github.com/metanorma/metanorma-itu"
17
+ spec.license = "BSD-2-Clause"
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency "asciidoctor", "~> 1.5.7"
27
+ spec.add_dependency "htmlentities", "~> 4.3.4"
28
+ spec.add_dependency "ruby-jing"
29
+ spec.add_dependency "metanorma-standoc", "~> 1.1.0"
30
+ spec.add_dependency "isodoc", "~> 0.9.0"
31
+
32
+ spec.add_development_dependency "bundler", "~> 2.0.1"
33
+ spec.add_development_dependency "byebug", "~> 9.1"
34
+ spec.add_development_dependency "equivalent-xml", "~> 0.6"
35
+ spec.add_development_dependency "guard", "~> 2.14"
36
+ spec.add_development_dependency "guard-rspec", "~> 4.7"
37
+ spec.add_development_dependency "rake", "~> 12.0"
38
+ spec.add_development_dependency "rspec", "~> 3.6"
39
+ spec.add_development_dependency "rubocop", "= 0.54.0"
40
+ spec.add_development_dependency "simplecov", "~> 0.15"
41
+ spec.add_development_dependency "timecop", "~> 0.9"
42
+ spec.add_development_dependency "metanorma", "~> 0.3.0"
43
+ spec.add_development_dependency "metanorma-cli", "~> 1.1.2"
44
+ end