metanorma-itu 1.0.14 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +8 -0
  3. data/.github/workflows/ubuntu.yml +10 -0
  4. data/.github/workflows/windows.yml +8 -0
  5. data/lib/asciidoctor/itu/biblio.rng +36 -6
  6. data/lib/asciidoctor/itu/cleanup.rb +15 -8
  7. data/lib/asciidoctor/itu/converter.rb +18 -27
  8. data/lib/asciidoctor/itu/front.rb +25 -0
  9. data/lib/asciidoctor/itu/isodoc.rng +450 -4
  10. data/lib/asciidoctor/itu/reqt.rng +23 -0
  11. data/lib/isodoc/itu.rb +1 -0
  12. data/lib/isodoc/itu/base_convert.rb +71 -17
  13. data/lib/isodoc/itu/html/_coverpage.scss +7 -3
  14. data/lib/isodoc/itu/html/html_itu_titlepage.html +4 -5
  15. data/lib/isodoc/itu/html/htmlstyle.scss +9 -5
  16. data/lib/isodoc/itu/html/itu.scss +27 -0
  17. data/lib/isodoc/itu/html/scripts.html +10 -7
  18. data/lib/isodoc/itu/html/word_itu_intro.html +11 -1
  19. data/lib/isodoc/itu/html/word_itu_titlepage.html +1 -4
  20. data/lib/isodoc/itu/html/wordstyle.scss +6 -5
  21. data/lib/isodoc/itu/html_convert.rb +3 -3
  22. data/lib/isodoc/itu/i18n-en.yaml +2 -1
  23. data/lib/isodoc/itu/itu.recommendation-annex.xsl +4358 -0
  24. data/lib/isodoc/itu/itu.recommendation.xsl +1354 -447
  25. data/lib/isodoc/itu/itu.resolution.xsl +1354 -447
  26. data/lib/isodoc/itu/metadata.rb +16 -6
  27. data/lib/isodoc/itu/pdf_convert.rb +6 -12
  28. data/lib/isodoc/itu/presentation_xml_convert.rb +10 -0
  29. data/lib/isodoc/itu/ref.rb +45 -23
  30. data/lib/isodoc/itu/terms.rb +9 -22
  31. data/lib/isodoc/itu/word_convert.rb +10 -8
  32. data/lib/isodoc/itu/xref.rb +56 -21
  33. data/lib/metanorma/itu/processor.rb +12 -6
  34. data/lib/metanorma/itu/version.rb +1 -1
  35. data/metanorma-itu.gemspec +2 -2
  36. metadata +12 -12
  37. data/lib/isodoc/itu/html/scripts.pdf.html +0 -72
@@ -11,12 +11,15 @@ module IsoDoc
11
11
  File.expand_path(File.join(here, "html", "International_Telecommunication_Union_Logo.svg")))
12
12
  set(:logo_comb,
13
13
  File.expand_path(File.join(here, "html", "itu-document-comb.png")))
14
- set(:logo_word, File.expand_path(File.join(here, "html", "International_Telecommunication_Union_Logo.svg")))
14
+ set(:logo_word,
15
+ File.expand_path(File.join(here, "html", "International_Telecommunication_Union_Logo.svg")))
15
16
  end
16
17
 
17
18
  def title(isoxml, _out)
18
- main = isoxml&.at(ns("//bibdata/title[@language='en']"))&.text
19
+ main = isoxml&.at(ns("//bibdata/title[@language='#{@lang}'][@type = 'main']"))&.text
19
20
  set(:doctitle, main)
21
+ main = isoxml&.at(ns("//bibdata/title[@language='#{@lang}'][@type = 'subtitle']"))&.text
22
+ set(:docsubtitle, main)
20
23
  series = isoxml&.at(ns("//bibdata/series[@type='main']/title"))&.text
21
24
  set(:series, series)
22
25
  series1 =
@@ -66,11 +69,18 @@ module IsoDoc
66
69
  end
67
70
 
68
71
  def keywords(isoxml, _out)
69
- keywords = []
70
- isoxml.xpath(ns("//bibdata/keyword")).each do |kw|
71
- keywords << kw.text
72
+ super
73
+ set(:keywords, get[:keywords].sort)
74
+ end
75
+
76
+ def doctype(isoxml, _out)
77
+ d = isoxml&.at(ns("//bibdata/ext/doctype"))&.text
78
+ set(:doctype_original, d)
79
+ if d == "recommendation-annex"
80
+ set(:doctype, "Recommendation")
81
+ else
82
+ super
72
83
  end
73
- set(:keywords, keywords.sort)
74
84
  end
75
85
 
76
86
  def ip_notice_received(isoxml, _out)
@@ -13,19 +13,13 @@ module IsoDoc
13
13
  super
14
14
  end
15
15
 
16
- def convert(filename, file = nil, debug = false)
17
- file = File.read(filename, encoding: "utf-8") if file.nil?
18
- docxml, outname_html, dir = convert_init(file, filename, debug)
19
- resolution = docxml.at(ns("//bibdata/ext[doctype = 'resolution']"))
20
- /\.xml$/.match(filename) or
21
- filename = Tempfile.open([outname_html, ".xml"], encoding: "utf-8") do |f|
22
- f.write file
23
- f.path
16
+ def pdf_stylesheet(docxml)
17
+ case doctype = docxml&.at(ns("//bibdata/ext/doctype"))&.text
18
+ when "resolution" then "itu.resolution.xsl"
19
+ when "recommendation-annex" then "itu.recommendation-annex.xsl"
20
+ else
21
+ "itu.recommendation.xsl"
24
22
  end
25
- FileUtils.rm_rf dir
26
- ::Metanorma::Output::XslfoPdf.new.convert(
27
- filename, outname_html + ".pdf",
28
- File.join(@libdir, resolution ? "itu.resolution.xsl" : "itu.recommendation.xsl"))
29
23
  end
30
24
  end
31
25
  end
@@ -0,0 +1,10 @@
1
+ require_relative "base_convert"
2
+ require "isodoc"
3
+
4
+ module IsoDoc
5
+ module ITU
6
+ class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
7
+ end
8
+ end
9
+ end
10
+
@@ -6,7 +6,7 @@ module IsoDoc
6
6
  module ITU
7
7
  module BaseConvert
8
8
  def norm_ref(isoxml, out, num)
9
- q = "//bibliography/references[title = 'References']"
9
+ q = "//bibliography/references[@normative = 'true']"
10
10
  f = isoxml.at(ns(q)) or return num
11
11
  out.div do |div|
12
12
  num = num + 1
@@ -17,11 +17,14 @@ module IsoDoc
17
17
  end
18
18
 
19
19
  def nonstd_bibitem(list, b, ordinal, biblio)
20
- list.p **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
21
- ref << "[#{render_identifier(bibitem_ref_code(b))}]"
22
- date_note_process(b, ref)
23
- insert_tab(ref, 1)
24
- reference_format(b, ref)
20
+ list.tr **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
21
+ id = render_identifier(bibitem_ref_code(b))
22
+ ref.td **{style: "vertical-align:top"} do |td|
23
+ td << (id[0] || "[#{id[1]}]")&.
24
+ gsub(/-/, "&#x2011;")&.gsub(/ /, "&#xa0;")
25
+ date_note_process(b, td)
26
+ end
27
+ ref.td { |td| reference_format(b, td) }
25
28
  end
26
29
  end
27
30
 
@@ -29,6 +32,36 @@ module IsoDoc
29
32
  nonstd_bibitem(list, b, ordinal, biblio)
30
33
  end
31
34
 
35
+ def biblio_list(f, div, biblio)
36
+ div.table **{ class: "biblio", border: "0" } do |t|
37
+ i = 0
38
+ t.tbody do |tbody|
39
+ f.elements.each do |b|
40
+ if b.name == "bibitem"
41
+ next if implicit_reference(b)
42
+ i += 1
43
+ nonstd_bibitem(tbody, b, i, biblio)
44
+ else
45
+ unless %w(title clause references).include? b.name
46
+ tbody.tx do |tx|
47
+ parse(b, tx)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ f.xpath(ns("./clause | ./references")).each do |x|
55
+ parse(x, div)
56
+ end
57
+ end
58
+
59
+ def bracket_if_num(x)
60
+ return nil if x.nil?
61
+ x = x.text.sub(/^\[/, "").sub(/\]$/, "")
62
+ "[#{x}]"
63
+ end
64
+
32
65
  def reference_format(b, r)
33
66
  reference_format_start(b, r)
34
67
  reference_format_title(b, r)
@@ -38,20 +71,13 @@ module IsoDoc
38
71
  s.gsub(/ |\_|\-/, " ").split(/ /).map(&:capitalize).join(" ")
39
72
  end
40
73
 
74
+ def pref_ref_code(b)
75
+ b.at(ns("./docidentifier[@type = 'ITU']")) || super
76
+ end
77
+
41
78
  IGNORE_IDS =
42
79
  "@type = 'DOI' or @type = 'ISSN' or @type = 'ISBN' or @type = 'rfc-anchor'".freeze
43
80
 
44
- def bibitem_ref_code(b)
45
- id = b.at(ns("./docidentifier[@type = 'metanorma']"))
46
- id ||= b.at(ns("./docidentifier[@type = 'ITU']"))
47
- id ||= b.at(ns("./docidentifier[not(#{IGNORE_IDS})]"))
48
- id ||= b.at(ns("./docidentifier"))
49
- return id if id
50
- id = Nokogiri::XML::Node.new("docidentifier", b.document)
51
- id.text = "(NO ID)"
52
- id
53
- end
54
-
55
81
  def multi_bibitem_ref_code(b)
56
82
  id = b.xpath(ns("./docidentifier[not(@type = 'metanorma' or #{IGNORE_IDS})]"))
57
83
  id.empty? and id = b.xpath(ns("./docidentifier[not(@type = 'metanorma')]"))
@@ -59,7 +85,7 @@ module IsoDoc
59
85
  id.sort_by { |i| i["type"] == "ITU" ? 0 : 1 }
60
86
  end
61
87
 
62
- def render_identifiers(ids)
88
+ def render_multi_identifiers(ids)
63
89
  ids.map do |id|
64
90
  id["type"] == "ITU" ? doctype_title(id) :
65
91
  docid_prefix(id["type"], id.text.sub(/^\[/, "").sub(/\]$/, ""))
@@ -78,7 +104,7 @@ module IsoDoc
78
104
 
79
105
  def reference_format_start(b, r)
80
106
  id = multi_bibitem_ref_code(b)
81
- id1 = render_identifiers(id)
107
+ id1 = render_multi_identifiers(id)
82
108
  r << id1
83
109
  date = b.at(ns("./date[@type = 'published']")) and
84
110
  r << " (#{date.text.sub(/-.*$/, '')})"
@@ -96,10 +122,6 @@ module IsoDoc
96
122
  /\.$/.match(title&.text) or r << "."
97
123
  end
98
124
  end
99
-
100
- def format_ref(ref, prefix, isopub, date, allparts)
101
- docid_prefix(prefix, ref).sub(/^\[/, "").sub(/\]$/, "")
102
- end
103
125
  end
104
126
  end
105
127
  end
@@ -1,8 +1,8 @@
1
1
  module IsoDoc
2
2
  module ITU
3
3
  module BaseConvert
4
- def term_def_title(node)
5
- node
4
+ def term_def_title(node)
5
+ node
6
6
  end
7
7
 
8
8
  def terms_defs(node, out, num)
@@ -35,11 +35,11 @@ module IsoDoc
35
35
  def termdef_parse1(node, div, term, defn, source)
36
36
  div.p **{ class: "TermNum", id: node["id"] } do |p|
37
37
  p.b do |b|
38
- b << anchor(node["id"], :label)
38
+ b << @xrefs.anchor(node["id"], :label)
39
39
  insert_tab(b, 1)
40
40
  term.children.each { |n| parse(n, b) }
41
41
  end
42
- source and p << " [#{source.value}]"
42
+ source and p << " #{bracket_opt(source.value)}"
43
43
  p << ": "
44
44
  end
45
45
  defn and defn.children.each { |n| parse(n, div) }
@@ -60,24 +60,11 @@ module IsoDoc
60
60
  end
61
61
 
62
62
  def termnote_parse(node, out)
63
- out.div **{ class: "Note" } do |div|
64
- first = node.first_element_child
65
- div.p do |p|
66
- p << note_label(node) # "#{anchor(node['id'], :label) || '???'}: "
67
- para_then_remainder(first, node, p, div)
68
- end
69
- end
70
- end
71
-
72
- def termnote_anchor_names(docxml)
73
- docxml.xpath(ns("//term[descendant::termnote]")).each do |t|
74
- c = IsoDoc::Function::XrefGen::Counter.new
75
- notes = t.xpath(ns(".//termnote"))
76
- notes.each do |n|
77
- return if n["id"].nil? || n["id"].empty?
78
- idx = notes.size == 1 ? "" : " #{c.increment(n).print}"
79
- @anchors[n["id"]] = anchor_struct(idx, n, @note_xref_lbl,
80
- "termnote", false)
63
+ out.div **note_attrs(node) do |div|
64
+ first = node.first_element_child
65
+ div.p do |p|
66
+ p << note_label(node) # "#{@xrefs.anchor(node['id'], :label) || '???'}: "
67
+ para_then_remainder(first, node, p, div)
81
68
  end
82
69
  end
83
70
  end
@@ -48,7 +48,7 @@ module IsoDoc
48
48
  kw.nil? || kw.empty? and return
49
49
  out.div do |div|
50
50
  clause_name(nil, "Keywords", div, class: "IntroTitle")
51
- div.p kw.sort.join(", ") + "."
51
+ div.p kw.join(", ") + "."
52
52
  end
53
53
  end
54
54
 
@@ -105,21 +105,24 @@ module IsoDoc
105
105
  super
106
106
  abstractbox = docxml.at("//div[@id='abstractbox']")
107
107
  historybox = docxml.at("//div[@id='historybox']")
108
+ sourcebox = docxml.at("//div[@id='sourcebox']")
108
109
  keywordsbox = docxml.at("//div[@id='keywordsbox']")
109
110
  abstract = docxml.at("//p[@class = 'h1Preface' and text() = 'Summary']/..")
110
111
  history = docxml.at("//p[@class = 'h1Preface' and text() = 'History']/..")
112
+ source = docxml.at("//p[@class = 'h1Preface' and text() = 'Source']/..")
111
113
  keywords = docxml.at("//p[@class = 'h1Preface' and text() = 'Keywords']/..")
112
114
  abstract.parent = abstractbox if abstract && abstractbox
113
115
  history.parent = historybox if history && historybox
116
+ source.parent = sourcebox if source && sourcebox
114
117
  keywords.parent = keywordsbox if keywords && keywordsbox
115
118
  end
116
119
 
117
120
  def formula_parse1(node, out)
118
- out.div **attr_code(id: node["id"], class: "formula") do |div|
121
+ out.div **attr_code(class: "formula") do |div|
119
122
  div.p **attr_code(class: "formula") do |p|
120
123
  insert_tab(div, 1)
121
124
  parse(node.at(ns("./stem")), div)
122
- lbl = anchor(node['id'], :label, false)
125
+ lbl = @xrefs.anchor(node['id'], :label, false)
123
126
  unless lbl.nil?
124
127
  insert_tab(div, 1)
125
128
  div << "(#{lbl})"
@@ -150,10 +153,8 @@ module IsoDoc
150
153
  super.merge(valign: "top")
151
154
  end
152
155
 
153
- def ol_parse(node, out)
154
- out.ol **attr_code(class: node["class"], id: node["id"] ) do |ol|
155
- node.children.each { |n| parse(n, ol) }
156
- end
156
+ def ol_attrs(node)
157
+ { class: node["class"], id: node["id"], style: keep_style(node) }
157
158
  end
158
159
 
159
160
  def toWord(result, filename, dir, header)
@@ -211,8 +212,9 @@ module IsoDoc
211
212
  next unless auth && dest
212
213
  t == "copyright" and p = auth&.at(".//p") and
213
214
  p["class"] = "boilerplateHdr"
214
- auth&.xpath(".//p[not(@class)]")&.each do |p|
215
+ auth&.xpath(".//p[not(@class)]")&.each_with_index do |p, i|
215
216
  p["class"] = "boilerplate"
217
+ i == 0 && t == "copyright" and p["style"] = "text-align:center;"
216
218
  end
217
219
  auth << "<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>" unless t == "copyright"
218
220
  dest.replace(auth.remove)
@@ -4,20 +4,29 @@ require "fileutils"
4
4
 
5
5
  module IsoDoc
6
6
  module ITU
7
- module BaseConvert
7
+ class Xref < IsoDoc::Xref
8
+ def initialize(lang, script, klass, labels, options)
9
+ super
10
+ @hierarchical_assets = options[:hierarchical_assets]
11
+ end
12
+
8
13
  def annex_name_lbl(clause, num)
9
- lbl = clause["obligation"] == "informative" ? @appendix_lbl : @annex_lbl
14
+ lbl = clause["obligation"] == "informative" ? @labels["appendix"] : @labels["annex"]
10
15
  l10n("<b>#{lbl} #{num}</b>")
11
16
  end
12
17
 
13
18
  def annex_names(clause, num)
14
- lbl = clause["obligation"] == "informative" ? @appendix_lbl : @annex_lbl
19
+ lbl = clause["obligation"] == "informative" ? @labels["appendix"] : @labels["annex"]
15
20
  @anchors[clause["id"]] =
16
21
  { label: annex_name_lbl(clause, num), type: "clause",
17
22
  xref: "#{lbl} #{num}", level: 1 }
18
- clause.xpath(ns("./clause | ./references | ./terms | ./definitions")).
19
- each_with_index do |c, i|
20
- annex_names1(c, "#{num}.#{i + 1}", 2)
23
+ if a = single_annex_special_section(clause)
24
+ annex_names1(a, "#{num}", 1)
25
+ else
26
+ clause.xpath(ns("./clause | ./references | ./terms | ./definitions")).
27
+ each_with_index do |c, i|
28
+ annex_names1(c, "#{num}.#{i + 1}", 2)
29
+ end
21
30
  end
22
31
  hierarchical_asset_names(clause, num)
23
32
  end
@@ -52,8 +61,8 @@ module IsoDoc
52
61
  hierarchical_asset_names(d.xpath("//xmlns:preface/child::*"), "Preface") :
53
62
  sequential_asset_names(d.xpath("//xmlns:preface/child::*"))
54
63
  n = section_names(d.at(ns("//clause[title = 'Scope']")), 0, 1)
55
- n = section_names(d.at(ns("//bibliography/clause[title = 'References'] | "\
56
- "//bibliography/references[title = 'References']")), n, 1)
64
+ n = section_names(d.at(ns("//bibliography/clause[.//references[@normative = 'true']] | "\
65
+ "//bibliography/references[@normative = 'true']")), n, 1)
57
66
  n = section_names(d.at(ns("//sections/terms | "\
58
67
  "//sections/clause[descendant::terms]")), n, 1)
59
68
  n = section_names(d.at(ns("//sections/definitions")), n, 1)
@@ -63,15 +72,11 @@ module IsoDoc
63
72
  termexample_anchor_names(d)
64
73
  end
65
74
 
66
- def hiersep
67
- "-"
68
- end
69
-
70
75
  MIDDLE_SECTIONS = "//clause[title = 'Scope'] | "\
71
- "//foreword | //introduction | //acknowledgements | "\
72
- "//references[title = 'References' or title = 'references'] | "\
73
- "//sections/terms | //preface/clause | "\
74
- "//sections/definitions | //clause[parent::sections]".freeze
76
+ "//foreword | //introduction | //acknowledgements | "\
77
+ "//references[@normative = 'true'] | "\
78
+ "//sections/terms | //preface/clause | "\
79
+ "//sections/definitions | //clause[parent::sections]".freeze
75
80
 
76
81
  def middle_section_asset_names(d)
77
82
  return super unless @hierarchical_assets
@@ -81,7 +86,7 @@ module IsoDoc
81
86
  end
82
87
 
83
88
  def sequential_figure_names(clause)
84
- c = IsoDoc::Function::XrefGen::Counter.new
89
+ c = IsoDoc::XrefGen::Counter.new
85
90
  j = 0
86
91
  clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]")).each do |t|
87
92
  if t.parent.name == "figure" then j += 1
@@ -92,12 +97,12 @@ module IsoDoc
92
97
  label = c.print + (j.zero? ? "" : "-#{(96 + j).chr.to_s}")
93
98
  next if t["id"].nil? || t["id"].empty?
94
99
  @anchors[t["id"]] =
95
- anchor_struct(label, nil, @figure_lbl, "figure", t["unnumbered"])
100
+ anchor_struct(label, nil, @labels["figure"], "figure", t["unnumbered"])
96
101
  end
97
102
  end
98
103
 
99
104
  def hierarchical_figure_names(clause, num)
100
- c = IsoDoc::Function::XrefGen::Counter.new
105
+ c = IsoDoc::XrefGen::Counter.new
101
106
  j = 0
102
107
  clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]")).each do |t|
103
108
  if t.parent.name == "figure" then j += 1
@@ -108,7 +113,7 @@ module IsoDoc
108
113
  label = "#{num}#{hiersep}#{c.print}" +
109
114
  (j.zero? ? "" : "#{hierfigsep}#{(96 + j).chr.to_s}")
110
115
  next if t["id"].nil? || t["id"].empty?
111
- @anchors[t["id"]] = anchor_struct(label, nil, @figure_lbl, "figure",
116
+ @anchors[t["id"]] = anchor_struct(label, nil, @labels["figure"], "figure",
112
117
  t["unnumbered"])
113
118
  end
114
119
  end
@@ -116,12 +121,42 @@ module IsoDoc
116
121
  def sequential_formula_names(clause)
117
122
  clause&.first&.xpath(ns(MIDDLE_SECTIONS))&.each do |c|
118
123
  if c["id"] && @anchors[c["id"]]
119
- hierarchical_formula_names(c, @anchors[c["id"]][:label] || @anchors[c["id"]][:xref] || "???")
124
+ hierarchical_formula_names(c, @anchors[c["id"]][:label] ||
125
+ @anchors[c["id"]][:xref] || "???")
120
126
  else
121
127
  hierarchical_formula_names(c, "???")
122
128
  end
123
129
  end
124
130
  end
131
+
132
+ def hierarchical_formula_names(clause, num)
133
+ c = IsoDoc::XrefGen::Counter.new
134
+ clause.xpath(ns(".//formula")).each do |t|
135
+ next if t["id"].nil? || t["id"].empty?
136
+ @anchors[t["id"]] =
137
+ anchor_struct("#{num}-#{c.increment(t).print}", nil,
138
+ t["inequality"] ? @labels["inequality"] : @labels["formula"],
139
+ "formula", t["unnumbered"])
140
+ end
141
+ end
142
+
143
+ def reference_names(ref)
144
+ super
145
+ @anchors[ref["id"]] = { xref: @anchors[ref["id"]][:xref].sub(/^\[/, '').sub(/\]$/, '') }
146
+ end
147
+
148
+ def termnote_anchor_names(docxml)
149
+ docxml.xpath(ns("//term[descendant::termnote]")).each do |t|
150
+ c = IsoDoc::XrefGen::Counter.new
151
+ notes = t.xpath(ns(".//termnote"))
152
+ notes.each do |n|
153
+ return if n["id"].nil? || n["id"].empty?
154
+ idx = notes.size == 1 ? "" : " #{c.increment(n).print}"
155
+ @anchors[n["id"]] = anchor_struct(idx, n, @labels["note_xref"],
156
+ "termnote", false)
157
+ end
158
+ end
159
+ end
125
160
  end
126
161
  end
127
162
  end