metanorma-itu 1.0.12 → 1.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +8 -7
  3. data/.github/workflows/ubuntu.yml +12 -9
  4. data/.github/workflows/windows.yml +8 -8
  5. data/lib/asciidoctor/itu/biblio.rng +142 -37
  6. data/lib/asciidoctor/itu/cleanup.rb +80 -71
  7. data/lib/asciidoctor/itu/converter.rb +7 -11
  8. data/lib/asciidoctor/itu/front.rb +47 -18
  9. data/lib/asciidoctor/itu/isodoc.rng +48 -2
  10. data/lib/asciidoctor/itu/validate.rb +1 -1
  11. data/lib/isodoc/itu/base_convert.rb +63 -14
  12. data/lib/isodoc/itu/html/_coverpage.scss +7 -3
  13. data/lib/isodoc/itu/html/header.html +8 -8
  14. data/lib/isodoc/itu/html/html_itu_titlepage.html +6 -7
  15. data/lib/isodoc/itu/html/htmlstyle.scss +17 -9
  16. data/lib/isodoc/itu/html/itu.scss +28 -1
  17. data/lib/isodoc/itu/html/scripts.html +14 -27
  18. data/lib/isodoc/itu/html/word_itu_intro.html +11 -1
  19. data/lib/isodoc/itu/html/word_itu_titlepage.html +3 -6
  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 +3903 -0
  24. data/lib/isodoc/itu/itu.recommendation.xsl +3903 -0
  25. data/lib/isodoc/itu/itu.resolution.xsl +3903 -0
  26. data/lib/isodoc/itu/metadata.rb +16 -6
  27. data/lib/isodoc/itu/pdf_convert.rb +17 -44
  28. data/lib/isodoc/itu/ref.rb +48 -21
  29. data/lib/isodoc/itu/terms.rb +4 -5
  30. data/lib/isodoc/itu/word_convert.rb +7 -3
  31. data/lib/isodoc/itu/xref.rb +27 -16
  32. data/lib/metanorma/itu/processor.rb +8 -0
  33. data/lib/metanorma/itu/version.rb +1 -1
  34. data/metanorma-itu.gemspec +1 -1
  35. metadata +7 -5
  36. data/lib/isodoc/itu/html/scripts.pdf.html +0 -72
@@ -90,15 +90,6 @@ module Asciidoctor
90
90
  end
91
91
  end
92
92
 
93
- def norm_ref_parse(attrs, xml, node)
94
- @norm_ref = true
95
- xml.references **attr_code(attrs) do |xml_section|
96
- xml_section.title { |t| t << "References" }
97
- xml_section << node.content
98
- end
99
- @norm_ref = false
100
- end
101
-
102
93
  def term_def_title(toplevel, node)
103
94
  return node.title unless toplevel
104
95
  "Definitions"
@@ -131,8 +122,6 @@ module Asciidoctor
131
122
  div.next = "<p>#{@term_def_boilerplate}</p>"
132
123
  end
133
124
 
134
- NORM_REF = "//bibliography/references[title = 'References']".freeze
135
-
136
125
  def load_yaml(lang, script)
137
126
  y = if @i18nyaml then YAML.load_file(@i18nyaml)
138
127
  elsif lang == "en"
@@ -148,6 +137,13 @@ module Asciidoctor
148
137
  super
149
138
  end
150
139
 
140
+ def metadata_keywords(node, xml)
141
+ return unless node.attr("keywords")
142
+ node.attr("keywords").split(/,[ ]*/).sort.each_with_index do |kw, i|
143
+ xml.keyword (i == 0 ? kw.capitalize : kw)
144
+ end
145
+ end
146
+
151
147
  def html_extract_attributes(node)
152
148
  super.merge(hierarchical_assets: node.attr("hierarchical-object-numbering"))
153
149
  end
@@ -4,36 +4,63 @@ require "fileutils"
4
4
 
5
5
  module Asciidoctor
6
6
  module ITU
7
-
8
- # A {Converter} implementation that generates RSD output, and a document
9
- # schema encapsulation of the document for validation
10
- #
11
7
  class Converter < Standoc::Converter
12
8
  def metadata_status(node, xml)
13
9
  xml.status do |s|
14
10
  s.stage (node.attributes.has_key?("draft") ? "draft" :
15
- (node.attr("status") || node.attr("docstage") || "published" ))
11
+ (node.attr("status") || node.attr("docstage") ||
12
+ "published" ))
16
13
  end
17
14
  end
18
15
 
19
16
  def title_english(node, xml)
20
- ["en"].each do |lang|
21
- at = { language: lang, format: "text/plain", type: "main" }
22
- a = node.attr("title") || node.attr("title-en") || node.title
23
- xml.title Asciidoctor::Standoc::Utils::asciidoc_sub(a), **attr_code(at)
24
- if a = node.attr("annextitle") || node.attr("annextitle-en")
25
- at[:type] = "annex"
26
- xml.title Asciidoctor::Standoc::Utils::asciidoc_sub(a), **attr_code(at)
17
+ at = { language: "en", format: "text/plain", type: "main" }
18
+ a = node.attr("title") || node.attr("title-en")
19
+ xml.title **attr_code(at) do |t|
20
+ t << (Asciidoctor::Standoc::Utils::asciidoc_sub(a) || node.title)
21
+ end
22
+ if a = node.attr("annextitle") || node.attr("annextitle-en")
23
+ at[:type] = "annex"
24
+ xml.title **attr_code(at) do |t|
25
+ t << Asciidoctor::Standoc::Utils::asciidoc_sub(a)
27
26
  end
28
27
  end
29
28
  end
30
29
 
31
30
  def title_otherlangs(node, xml)
32
31
  node.attributes.each do |k, v|
33
- next unless /^(annex)?title-(?<titlelang>.+)$/ =~ k
34
- next if titlelang == "en"
35
- xml.title v, { language: titlelang, format: "text/plain",
36
- type: /^annex/.match(k) ? "annex" : "main" }
32
+ next unless /^(annex)?title-(?<lang>.+)$/ =~ k
33
+ next if lang == "en"
34
+ type = /^annex/.match(k) ? "annex" : "main"
35
+ xml.title **attr_code(language: lang, format: "text/plain",
36
+ type: type) do |t|
37
+ t << v
38
+ end
39
+ end
40
+ end
41
+
42
+ def title(node, xml)
43
+ super
44
+ subtitle_english(node, xml)
45
+ subtitle_otherlangs(node, xml)
46
+ end
47
+
48
+ def subtitle_english(node, xml)
49
+ at = { language: "en", format: "text/plain", type: "subtitle" }
50
+ a = node.attr("subtitle") || node.attr("subtitle-en")
51
+ xml.title **attr_code(at) do |t|
52
+ t << Asciidoctor::Standoc::Utils::asciidoc_sub(a)
53
+ end
54
+ end
55
+
56
+ def subtitle_otherlangs(node, xml)
57
+ node.attributes.each do |k, v|
58
+ next unless /^subtitle-(?<lang>.+)$/ =~ k
59
+ next if lang == "en"
60
+ xml.title **attr_code(language: lang, format: "text/plain",
61
+ type: "subtitle") do |t|
62
+ t << v
63
+ end
37
64
  end
38
65
  end
39
66
 
@@ -89,11 +116,13 @@ module Asciidoctor
89
116
 
90
117
  def metadata_committee2(node, g, suffix, prefix)
91
118
  g.name node.attr("#{prefix}group#{suffix}")
92
- g.acronym node.attr("#{prefix}groupacronym#{suffix}") if node.attr("#{prefix}groupacronym#{suffix}")
119
+ node.attr("#{prefix}groupacronym#{suffix}") and
120
+ g.acronym node.attr("#{prefix}groupacronym#{suffix}")
93
121
  if node.attr("#{prefix}groupyearstart#{suffix}")
94
122
  g.period do |p|
95
123
  p.start node.attr("#{prefix}groupyearstart#{suffix}")
96
- p.end node.attr("#{prefix}groupyearend#{suffix}") if node.attr("#{prefix}groupacronym#{suffix}")
124
+ node.attr("#{prefix}groupacronym#{suffix}") and
125
+ p.end node.attr("#{prefix}groupyearend#{suffix}")
97
126
  end
98
127
  end
99
128
  end
@@ -53,6 +53,14 @@
53
53
  <optional>
54
54
  <attribute name="alt"/>
55
55
  </optional>
56
+ <optional>
57
+ <attribute name="case">
58
+ <choice>
59
+ <value>capital</value>
60
+ <value>lowercase</value>
61
+ </choice>
62
+ </attribute>
63
+ </optional>
56
64
  <text/>
57
65
  </element>
58
66
  </define>
@@ -129,6 +137,9 @@
129
137
  </choice>
130
138
  </attribute>
131
139
  </optional>
140
+ <attribute name="normative">
141
+ <data type="boolean"/>
142
+ </attribute>
132
143
  <optional>
133
144
  <ref name="section-title"/>
134
145
  </optional>
@@ -305,6 +316,21 @@
305
316
  </define>
306
317
  </include>
307
318
  <!-- end overrides -->
319
+ <define name="TextElement" combine="choice">
320
+ <ref name="concept"/>
321
+ </define>
322
+ <define name="concept">
323
+ <element name="concept">
324
+ <optional>
325
+ <attribute name="term"/>
326
+ </optional>
327
+ <choice>
328
+ <ref name="eref"/>
329
+ <ref name="xref"/>
330
+ <ref name="termref"/>
331
+ </choice>
332
+ </element>
333
+ </define>
308
334
  <define name="BasicBlock" combine="choice">
309
335
  <choice>
310
336
  <ref name="requirement"/>
@@ -884,7 +910,15 @@
884
910
  <attribute name="id">
885
911
  <data type="ID"/>
886
912
  </attribute>
887
- <ref name="paragraph"/>
913
+ <oneOrMore>
914
+ <choice>
915
+ <ref name="paragraph"/>
916
+ <ref name="ul"/>
917
+ <ref name="ol"/>
918
+ <ref name="dl"/>
919
+ <ref name="formula"/>
920
+ </choice>
921
+ </oneOrMore>
888
922
  </element>
889
923
  </define>
890
924
  <define name="termexample">
@@ -911,7 +945,10 @@
911
945
  </define>
912
946
  <define name="origin">
913
947
  <element name="origin">
914
- <ref name="erefType"/>
948
+ <choice>
949
+ <ref name="erefType"/>
950
+ <ref name="termref"/>
951
+ </choice>
915
952
  </element>
916
953
  </define>
917
954
  <define name="modification">
@@ -919,6 +956,15 @@
919
956
  <ref name="paragraph"/>
920
957
  </element>
921
958
  </define>
959
+ <define name="termref">
960
+ <element name="termref">
961
+ <attribute name="base"/>
962
+ <attribute name="target"/>
963
+ <optional>
964
+ <text/>
965
+ </optional>
966
+ </element>
967
+ </define>
922
968
  <define name="structuredidentifier">
923
969
  <element name="structuredidentifier">
924
970
  <optional>
@@ -45,7 +45,7 @@ module Asciidoctor
45
45
  def extract_text(node)
46
46
  return "" if node.nil?
47
47
  node1 = Nokogiri::XML.fragment(node.to_s)
48
- node1.xpath("//link | //locality").each(&:remove)
48
+ node1.xpath("//link | //locality | //localityStack").each(&:remove)
49
49
  ret = ""
50
50
  node1.traverse { |x| ret += x.text if x.text? }
51
51
  ret
@@ -37,13 +37,20 @@ module IsoDoc
37
37
  end
38
38
  end
39
39
 
40
+ def bracket_opt(b)
41
+ return b if b.nil?
42
+ return b if /^\[.+\]$/.match(b)
43
+ "[#{b}]"
44
+ end
45
+
40
46
  def clausedelim
41
47
  ""
42
48
  end
43
49
 
44
50
  def note_label(node)
45
51
  n = get_anchors[node["id"]]
46
- return "#{@note_lbl} &ndash; " if n.nil? || n[:label].nil? || n[:label].empty?
52
+ (n.nil? || n[:label].nil? || n[:label].empty?) and
53
+ return "#{@note_lbl} &ndash; "
47
54
  l10n("#{@note_lbl} #{n[:label]} &ndash; ")
48
55
  end
49
56
 
@@ -64,7 +71,8 @@ module IsoDoc
64
71
  end
65
72
 
66
73
  def annex_name(annex, name, div)
67
- div.h1 **{ class: "Annex" } do |t|
74
+ r_a = @meta.get[:doctype_original] == "recommendation-annex"
75
+ div.h1 **{ class: r_a ? "RecommendationAnnex" : "Annex" } do |t|
68
76
  t << "#{anchor(annex['id'], :label)} "
69
77
  t.br
70
78
  t.br
@@ -76,14 +84,28 @@ module IsoDoc
76
84
  end
77
85
 
78
86
  def annex_obligation_subtitle(annex, div)
79
- type = annex&.document&.root&.at("//bibdata/ext/doctype")&.text ||
80
- "recommendation"
81
- type = type.split(" ").map {|w| w.capitalize }.join(" ")
82
87
  info = annex["obligation"] == "informative"
83
88
  div.p **{class: "annex_obligation" } do |p|
84
- p << (info ? @inform_annex_lbl : @norm_annex_lbl).sub(/%/, type)
89
+ p << (info ? @inform_annex_lbl : @norm_annex_lbl).
90
+ sub(/%/, @meta.get[:doctype] || "")
91
+ end
92
+ end
93
+
94
+ def annex(isoxml, out)
95
+ isoxml.xpath(ns("//annex")).each do |c|
96
+ @meta.get[:doctype_original] == "recommendation-annex" or
97
+ page_break(out)
98
+ out.div **attr_code(id: c["id"], class: "Section3") do |s|
99
+ annex_name(c, nil, s) unless c.at(ns("./title"))
100
+ c.elements.each do |c1|
101
+ if c1.name == "title" then annex_name(c, c1, s)
102
+ else
103
+ parse(c1, s)
104
+ end
105
+ end
85
106
  end
86
107
  end
108
+ end
87
109
 
88
110
  def i18n_init(lang, script)
89
111
  super
@@ -96,13 +118,24 @@ module IsoDoc
96
118
  def cleanup(docxml)
97
119
  super
98
120
  term_cleanup(docxml)
121
+ refs_cleanup(docxml)
122
+ title_cleanup(docxml)
123
+ end
124
+
125
+ def title_cleanup(docxml)
126
+ docxml.xpath("//h1[@class = 'RecommendationAnnex']").each do |h|
127
+ h.name = "p"
128
+ h["class"] = "h1Annex"
129
+ end
130
+ docxml
99
131
  end
100
132
 
101
133
  def term_cleanup(docxml)
102
134
  docxml.xpath("//p[@class = 'Terms']").each do |d|
103
135
  h2 = d.at("./preceding-sibling::*[@class = 'TermNum'][1]")
104
- h2.add_child("&nbsp;")
105
- h2.add_child(d.remove)
136
+ d.children.first.previous = "<b>#{h2.children.to_xml}</b>&nbsp;"
137
+ d["id"] = h2["id"]
138
+ h2.remove
106
139
  end
107
140
  docxml.xpath("//p[@class = 'TermNum']").each do |d|
108
141
  d1 = d.next_element and d1.name == "p" or next
@@ -112,17 +145,31 @@ module IsoDoc
112
145
  docxml
113
146
  end
114
147
 
148
+ def refs_cleanup(docxml)
149
+ docxml.xpath("//tx[following-sibling::tx]").each do |tx|
150
+ tx << tx.next_element.remove.children
151
+ end
152
+ docxml.xpath("//tx").each do |tx|
153
+ tx.name = "td"
154
+ tx["colspan"] = "2"
155
+ tx.wrap("<tr></tr>")
156
+ end
157
+ docxml
158
+ end
159
+
115
160
  def info(isoxml, out)
116
- @meta.keywords isoxml, out
117
161
  @meta.ip_notice_received isoxml, out
118
162
  super
119
163
  end
120
164
 
121
165
  def get_eref_linkend(node)
122
- link = "[#{anchor_linkend(node, docid_l10n(node["target"] || node["citeas"]))}]"
123
- link += eref_localities(node.xpath(ns("./locality")), link)
124
- contents = node.children.select { |c| c.name != "locality" }
125
- return link if contents.nil? || contents.empty?
166
+ l = anchor_linkend(node, docid_l10n(node["target"] || node["citeas"]))
167
+ l && !/^\[.*\]$/.match(l) and l = "[#{l}]"
168
+ l += eref_localities(node.xpath(ns("./locality | ./localityStack")), l)
169
+ contents = node.children.select do |c|
170
+ !%w{locality localityStack}.include? c.name
171
+ end
172
+ return l if contents.nil? || contents.empty?
126
173
  Nokogiri::XML::NodeSet.new(node.document, contents).to_xml
127
174
  end
128
175
 
@@ -139,9 +186,11 @@ module IsoDoc
139
186
 
140
187
  def middle_title(out)
141
188
  out.p(**{ class: "zzSTDTitle1" }) do |p|
142
- id = @meta.get[:docnumber] and p << "Recommendation #{id}"
189
+ id = @meta.get[:docnumber] and p << "#{@meta.get[:doctype]} #{id}"
143
190
  end
144
191
  out.p(**{ class: "zzSTDTitle2" }) { |p| p << @meta.get[:doctitle] }
192
+ s = @meta.get[:docsubtitle] and
193
+ out.p(**{ class: "zzSTDTitle3" }) { |p| p << s }
145
194
  end
146
195
 
147
196
  def add_parse(node, out)
@@ -62,14 +62,18 @@
62
62
  @include coverpageStageBlock();
63
63
  }
64
64
 
65
- span.doc-title {
65
+ span.doc-title, span.doc-annextitle {
66
66
  font-size: 26px;
67
67
  font-weight: 800;
68
68
  margin-top: 20px;
69
- border-top: 2px solid #DA1D52;
70
69
  margin-right: 42px;
71
70
  }
72
71
 
72
+ span.doc-title {
73
+ border-top: 2px solid #DA1D52;
74
+ }
75
+
76
+
73
77
  .doc-footer {
74
78
  margin-top: 100px;
75
79
 
@@ -107,7 +111,7 @@ span.doc-title {
107
111
  padding: 0 3em 0 6em;
108
112
  }
109
113
 
110
- .zzSTDTitle1, .zzSTDTitle2, .MsoCommentText {
114
+ .zzSTDTitle1, .zzSTDTitle2, .zzSTDTitle3, .MsoCommentText {
111
115
  display: none;
112
116
  }
113
117
 
@@ -116,7 +116,7 @@ style='mso-element:field-separator'>
116
116
  style='mso-ansi-language:FR-CH;font-weight:normal;mso-no-proof:yes'>ii</span><!--[if supportFields]><span
117
117
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-end'></span></span><![endif]--><span
118
118
  lang=FR-CH style='mso-ansi-language:FR-CH'><span style='mso-tab-count:1'>              </span>Rec.
119
- ITU‑{{ bureau }} {{ docnumber }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
119
+ ITU‑{{ bureau }} {{ docnumeric }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
120
120
  </div>
121
121
 
122
122
  <div style='mso-element:footer' id=ef2l>
@@ -129,12 +129,12 @@ style='mso-element:field-separator'>
129
129
  style='mso-ansi-language:FR-CH;font-weight:normal;mso-no-proof:yes'>ii</span><!--[if supportFields]><span
130
130
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-end'></span></span><![endif]--><span
131
131
  lang=FR-CH style='mso-ansi-language:FR-CH'><span style='mso-tab-count:1'>              </span>Rec.
132
- ITU‑{{ bureau }} {{ docnumber }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
132
+ ITU‑{{ bureau }} {{ docnumeric }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
133
133
  </div>
134
134
 
135
135
  <div style='mso-element:footer' id=f2>
136
136
  <p class=FooterQP style='line-height:12.0pt'><span lang=EN-GB><span style='mso-tab-count:2'>                                                                                                       </span>Rec.
137
- ITU‑{{ bureau }} {{docnumber}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
137
+ ITU‑{{ bureau }} {{docnumeric}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
138
138
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-begin'></span>
139
139
  PAGE<span style='mso-spacerun:yes'>  </span>\* MERGEFORMAT <span
140
140
  style='mso-element:field-separator'></span></span><![endif]--><span lang=EN-GB
@@ -145,7 +145,7 @@ lang=EN-GB style='font-weight:normal'>

145
145
 
146
146
  <div style='mso-element:footer' id=f2l>
147
147
  <p class=FooterQPLandscape style='line-height:12.0pt'><span lang=EN-GB><span style='mso-tab-count:2'>                                                                                                       </span>Rec.
148
- ITU‑{{ bureau }} {{docnumber}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
148
+ ITU‑{{ bureau }} {{docnumeric}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
149
149
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-begin'></span>
150
150
  PAGE<span style='mso-spacerun:yes'>  </span>\* MERGEFORMAT <span
151
151
  style='mso-element:field-separator'></span></span><![endif]--><span lang=EN-GB
@@ -164,7 +164,7 @@ style='mso-element:field-separator'>
164
164
  style='mso-ansi-language:FR-CH;font-weight:normal;mso-no-proof:yes'>ii</span><!--[if supportFields]><span
165
165
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-end'></span></span><![endif]--><span
166
166
  lang=FR-CH style='mso-ansi-language:FR-CH'><span style='mso-tab-count:1'>              </span>Rec.
167
- ITU‑{{ bureau }} {{ docnumber }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
167
+ ITU‑{{ bureau }} {{ docnumeric }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
168
168
  </div>
169
169
 
170
170
  <div style='mso-element:footer' id=ef3l>
@@ -177,12 +177,12 @@ style='mso-element:field-separator'>
177
177
  style='mso-ansi-language:FR-CH;font-weight:normal;mso-no-proof:yes'>ii</span><!--[if supportFields]><span
178
178
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-end'></span></span><![endif]--><span
179
179
  lang=FR-CH style='mso-ansi-language:FR-CH'><span style='mso-tab-count:1'>              </span>Rec.
180
- ITU‑{{ bureau }} {{ docnumber }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
180
+ ITU‑{{ bureau }} {{ docnumeric }} ({{ pubdate_monthyear }})<o:p></o:p></span></p>
181
181
  </div>
182
182
 
183
183
  <div style='mso-element:footer' id=f3>
184
184
  <p class=FooterQP style='line-height:12.0pt'><span lang=EN-GB><span style='mso-tab-count:2'>                                                                                                       </span>Rec.
185
- ITU‑{{ bureau }} {{docnumber}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
185
+ ITU‑{{ bureau }} {{docnumeric}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
186
186
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-begin'></span>
187
187
  PAGE<span style='mso-spacerun:yes'>  </span>\* MERGEFORMAT <span
188
188
  style='mso-element:field-separator'></span></span><![endif]--><span lang=EN-GB
@@ -193,7 +193,7 @@ lang=EN-GB style='font-weight:normal'>

193
193
 
194
194
  <div style='mso-element:footer' id=f3l>
195
195
  <p class=FooterQPLandscape style='line-height:12.0pt'><span lang=EN-GB><span style='mso-tab-count:2'>                                                                                                       </span>Rec.
196
- ITU‑{{ bureau }} {{docnumber}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
196
+ ITU‑{{ bureau }} {{docnumeric}} ({{ pubdate_monthyear }})<span style='mso-tab-count:1'>             </span></span><!--[if supportFields]><span
197
197
  lang=EN-GB style='font-weight:normal'><span style='mso-element:field-begin'></span>
198
198
  PAGE<span style='mso-spacerun:yes'>  </span>\* MERGEFORMAT <span
199
199
  style='mso-element:field-separator'></span></span><![endif]--><span lang=EN-GB