metanorma-itu 1.0.18 → 1.2.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 +0 -1
  3. data/.github/workflows/ubuntu.yml +10 -7
  4. data/.github/workflows/windows.yml +0 -1
  5. data/Rakefile +2 -0
  6. data/lib/asciidoctor/itu/cleanup.rb +128 -95
  7. data/lib/asciidoctor/itu/converter.rb +36 -61
  8. data/lib/asciidoctor/itu/isodoc.rng +12 -6
  9. data/lib/asciidoctor/itu/validate.rb +22 -11
  10. data/lib/isodoc/itu.rb +1 -0
  11. data/lib/isodoc/itu/base_convert.rb +32 -78
  12. data/lib/isodoc/itu/html/_coverpage.css +349 -0
  13. data/lib/isodoc/itu/html/_coverpage.scss +2 -0
  14. data/lib/isodoc/itu/html/htmlstyle.css +1159 -0
  15. data/lib/isodoc/itu/html/itu.css +1138 -0
  16. data/lib/isodoc/itu/html/itu.scss +0 -1
  17. data/lib/isodoc/itu/html/wordstyle.css +1808 -0
  18. data/lib/isodoc/itu/html/wordstyle.scss +0 -1
  19. data/lib/isodoc/itu/html_convert.rb +8 -4
  20. data/lib/isodoc/itu/i18n-en.yaml +25 -0
  21. data/lib/isodoc/itu/i18n.rb +14 -0
  22. data/lib/isodoc/itu/init.rb +29 -0
  23. data/lib/isodoc/itu/itu.recommendation-annex.xsl +1759 -1864
  24. data/lib/isodoc/itu/itu.recommendation.xsl +1759 -1864
  25. data/lib/isodoc/itu/itu.resolution.xsl +1759 -1864
  26. data/lib/isodoc/itu/metadata.rb +8 -5
  27. data/lib/isodoc/itu/pdf_convert.rb +0 -14
  28. data/lib/isodoc/itu/presentation_xml_convert.rb +55 -0
  29. data/lib/isodoc/itu/ref.rb +12 -14
  30. data/lib/isodoc/itu/terms.rb +10 -32
  31. data/lib/isodoc/itu/word_convert.rb +25 -14
  32. data/lib/isodoc/itu/xref.rb +73 -36
  33. data/lib/metanorma/itu/processor.rb +10 -8
  34. data/lib/metanorma/itu/version.rb +1 -1
  35. data/metanorma-itu.gemspec +3 -2
  36. metadata +31 -12
  37. data/lib/asciidoctor/itu/i18n-en.yaml +0 -16
@@ -922,6 +922,9 @@
922
922
  <optional>
923
923
  <attribute name="script"/>
924
924
  </optional>
925
+ <optional>
926
+ <attribute name="type"/>
927
+ </optional>
925
928
  <optional>
926
929
  <attribute name="obligation">
927
930
  <choice>
@@ -961,9 +964,6 @@
961
964
  </define>
962
965
  <define name="content-subsection">
963
966
  <element name="clause">
964
- <optional>
965
- <attribute name="type"/>
966
- </optional>
967
967
  <ref name="Content-Section"/>
968
968
  </element>
969
969
  </define>
@@ -992,6 +992,9 @@
992
992
  </choice>
993
993
  </attribute>
994
994
  </optional>
995
+ <optional>
996
+ <attribute name="type"/>
997
+ </optional>
995
998
  <optional>
996
999
  <ref name="section-title"/>
997
1000
  </optional>
@@ -1011,9 +1014,6 @@
1011
1014
  </define>
1012
1015
  <define name="clause">
1013
1016
  <element name="clause">
1014
- <optional>
1015
- <attribute name="type"/>
1016
- </optional>
1017
1017
  <ref name="Clause-Section"/>
1018
1018
  </element>
1019
1019
  </define>
@@ -1042,6 +1042,9 @@
1042
1042
  </choice>
1043
1043
  </attribute>
1044
1044
  </optional>
1045
+ <optional>
1046
+ <attribute name="type"/>
1047
+ </optional>
1045
1048
  <optional>
1046
1049
  <ref name="section-title"/>
1047
1050
  </optional>
@@ -1180,6 +1183,9 @@
1180
1183
  <optional>
1181
1184
  <attribute name="script"/>
1182
1185
  </optional>
1186
+ <optional>
1187
+ <attribute name="type"/>
1188
+ </optional>
1183
1189
  <optional>
1184
1190
  <attribute name="obligation">
1185
1191
  <choice>
@@ -12,13 +12,16 @@ module Asciidoctor
12
12
  recommendation-corrigendum recommendation-errata recommendation-annex
13
13
  focus-group implementers-guide technical-paper technical-report
14
14
  joint-itu-iso-iec).include? doctype or
15
- @log.add("Document Attributes", nil, "#{doctype} is not a recognised document type")
15
+ @log.add("Document Attributes", nil,
16
+ "#{doctype} is not a recognised document type")
16
17
  end
17
18
 
18
19
  def stage_validate(xmldoc)
19
20
  stage = xmldoc&.at("//bibdata/status/stage")&.text
20
- %w(in-force superseded in-force-prepublished withdrawn draft).include? stage or
21
- @log.add("Document Attributes", nil, "#{stage} is not a recognised status")
21
+ %w(in-force superseded in-force-prepublished withdrawn
22
+ draft).include? stage or
23
+ @log.add("Document Attributes", nil,
24
+ "#{stage} is not a recognised status")
22
25
  end
23
26
 
24
27
  def content_validate(doc)
@@ -38,7 +41,8 @@ module Asciidoctor
38
41
  xmldoc.xpath("//bibdata/series/title").each do |s|
39
42
  series = s.text.sub(/^[A-Z]: /, "")
40
43
  t.downcase.include?(series.downcase) and
41
- @log.add("Document Attributes", nil, "Title includes series name #{series}")
44
+ @log.add("Document Attributes", nil,
45
+ "Title includes series name #{series}")
42
46
  end
43
47
  end
44
48
 
@@ -56,7 +60,8 @@ module Asciidoctor
56
60
  xmldoc.xpath("//preface/*").each do |c|
57
61
  extract_text(c).split(/\.\s+/).each do |t|
58
62
  /\b(shall|must)\b/i.match(t) and
59
- @log.add("Style", c, "Requirement possibly in preface: #{t.strip}")
63
+ @log.add("Style", c,
64
+ "Requirement possibly in preface: #{t.strip}")
60
65
  end
61
66
  end
62
67
  end
@@ -86,20 +91,24 @@ module Asciidoctor
86
91
  end
87
92
 
88
93
  def approval_validate(xmldoc)
89
- s = xmldoc.at("//bibdata/ext/recommendationstatus/approvalstage") || return
94
+ s = xmldoc.at("//bibdata/ext/recommendationstatus/approvalstage") or
95
+ return
90
96
  process = s["process"]
91
97
  if process == "aap" and %w(determined in-force).include? s.text
92
- @log.add("Document Attributes", nil, "Recommendation Status #{s.text} inconsistent with AAP")
98
+ @log.add("Document Attributes", nil,
99
+ "Recommendation Status #{s.text} inconsistent with AAP")
93
100
  end
94
101
  if process == "tap" and !%w(determined in-force).include? s.text
95
- @log.add("Document Attributes", nil, "Recommendation Status #{s.text} inconsistent with TAP")
102
+ @log.add("Document Attributes", nil,
103
+ "Recommendation Status #{s.text} inconsistent with TAP")
96
104
  end
97
105
  end
98
106
 
99
107
  def itu_identifier_validate(xmldoc)
100
108
  s = xmldoc.xpath("//bibdata/docidentifier[@type = 'ITU']").each do |x|
101
109
  /^ITU-[RTF] [AD-VX-Z]\.[0-9]+$/.match(x.text) or
102
- @log.add("Style", nil, "#{x.text} does not match ITU document identifier conventions")
110
+ @log.add("Style", nil, "#{x.text} does not match ITU document "\
111
+ "identifier conventions")
103
112
  end
104
113
  end
105
114
 
@@ -121,8 +130,10 @@ module Asciidoctor
121
130
  para = t.at("./definition") || return
122
131
  term = t.at("./preferred").text
123
132
  termdef_warn(term, /^[A-Z][a-z]+/, t, term, "term is not lowercase")
124
- termdef_warn(para.text, /^[a-z]/, t, term, "term definition does not start with capital")
125
- termdef_warn(para.text, /[^.]$/, t, term, "term definition does not end with period")
133
+ termdef_warn(para.text, /^[a-z]/, t, term,
134
+ "term definition does not start with capital")
135
+ termdef_warn(para.text, /[^.]$/, t, term,
136
+ "term definition does not end with period")
126
137
  end
127
138
  end
128
139
 
@@ -3,6 +3,7 @@ require "isodoc/itu/base_convert"
3
3
  require "isodoc/itu/html_convert"
4
4
  require "isodoc/itu/pdf_convert"
5
5
  require "isodoc/itu/word_convert"
6
+ require "isodoc/itu/presentation_xml_convert"
6
7
 
7
8
  module IsoDoc
8
9
  module ITU
@@ -1,5 +1,4 @@
1
1
  require "isodoc"
2
- require_relative "metadata"
3
2
  require "fileutils"
4
3
  require_relative "./ref.rb"
5
4
  require_relative "./xref.rb"
@@ -8,27 +7,13 @@ require_relative "./terms.rb"
8
7
  module IsoDoc
9
8
  module ITU
10
9
  module BaseConvert
11
- def load_yaml(lang, script)
12
- y = if @i18nyaml then YAML.load_file(@i18nyaml)
13
- elsif lang == "en"
14
- YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
15
- else
16
- YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
17
- end
18
- super.merge(y)
19
- end
20
-
21
- def metadata_init(lang, script, labels)
22
- @meta = Metadata.new(lang, script, labels)
23
- end
24
-
25
10
  FRONT_CLAUSE = "//*[parent::preface]"\
26
11
  "[not(local-name() = 'abstract')]".freeze
27
12
 
28
13
  def preface(isoxml, out)
29
14
  isoxml.xpath(ns(FRONT_CLAUSE)).each do |c|
30
15
  title = c&.at(ns("./title"))
31
- out.div **attr_code(id: c["id"]) do |s|
16
+ out.div **attr_code(clause_attrs(c)) do |s|
32
17
  clause_name(nil, title, s, class: "IntroTitle")
33
18
  c.elements.reject { |c1| c1.name == "title" }.each do |c1|
34
19
  parse(c1, s)
@@ -47,15 +32,8 @@ module IsoDoc
47
32
  ""
48
33
  end
49
34
 
50
- def note_label(node)
51
- n = get_anchors[node["id"]]
52
- (n.nil? || n[:label].nil? || n[:label].empty?) and
53
- return "#{@note_lbl} &ndash; "
54
- l10n("#{@note_lbl} #{n[:label]} &ndash; ")
55
- end
56
-
57
- def prefix_container(container, linkend, _target)
58
- l10n("#{linkend} #{@labels["in"]} #{anchor(container, :xref)}")
35
+ def note_delim
36
+ " &ndash; "
59
37
  end
60
38
 
61
39
  def ol_depth(node)
@@ -73,12 +51,7 @@ module IsoDoc
73
51
  def annex_name(annex, name, div)
74
52
  r_a = @meta.get[:doctype_original] == "recommendation-annex"
75
53
  div.h1 **{ class: r_a ? "RecommendationAnnex" : "Annex" } do |t|
76
- t << "#{anchor(annex['id'], :label)} "
77
- t.br
78
- t.br
79
- t.b do |b|
80
- name&.children&.each { |c2| parse(c2, b) }
81
- end
54
+ name&.children&.each { |c2| parse(c2, t) }
82
55
  end
83
56
  annex_obligation_subtitle(annex, div)
84
57
  end
@@ -86,34 +59,26 @@ module IsoDoc
86
59
  def annex_obligation_subtitle(annex, div)
87
60
  info = annex["obligation"] == "informative"
88
61
  div.p **{class: "annex_obligation" } do |p|
89
- p << (info ? @inform_annex_lbl : @norm_annex_lbl).
62
+ p << (info ? @i18n.inform_annex : @i18n.norm_annex).
90
63
  sub(/%/, @meta.get[:doctype] || "")
91
64
  end
92
65
  end
93
66
 
94
67
  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)
68
+ isoxml.xpath(ns("//annex")).each do |c|
69
+ @meta.get[:doctype_original] == "recommendation-annex" or
70
+ page_break(out)
71
+ out.div **attr_code(id: c["id"], class: "Section3") do |s|
72
+ annex_name(c, nil, s) unless c.at(ns("./title"))
73
+ c.elements.each do |c1|
74
+ if c1.name == "title" then annex_name(c, c1, s)
75
+ else
76
+ parse(c1, s)
77
+ end
104
78
  end
105
79
  end
106
80
  end
107
81
  end
108
- end
109
-
110
- def i18n_init(lang, script)
111
- super
112
- end
113
-
114
- def fileloc(loc)
115
- File.join(File.dirname(__FILE__), loc)
116
- end
117
82
 
118
83
  def cleanup(docxml)
119
84
  super
@@ -131,18 +96,26 @@ module IsoDoc
131
96
  end
132
97
 
133
98
  def term_cleanup(docxml)
99
+ term_cleanup1(docxml)
100
+ term_cleanup2(docxml)
101
+ docxml
102
+ end
103
+
104
+ def term_cleanup1(docxml)
134
105
  docxml.xpath("//p[@class = 'Terms']").each do |d|
135
106
  h2 = d.at("./preceding-sibling::*[@class = 'TermNum'][1]")
136
107
  d.children.first.previous = "<b>#{h2.children.to_xml}</b>&nbsp;"
137
108
  d["id"] = h2["id"]
138
109
  h2.remove
139
110
  end
111
+ end
112
+
113
+ def term_cleanup2(docxml)
140
114
  docxml.xpath("//p[@class = 'TermNum']").each do |d|
141
115
  d1 = d.next_element and d1.name == "p" or next
142
116
  d1.children.each { |e| e.parent = d }
143
117
  d1.remove
144
118
  end
145
- docxml
146
119
  end
147
120
 
148
121
  def refs_cleanup(docxml)
@@ -162,29 +135,6 @@ module IsoDoc
162
135
  super
163
136
  end
164
137
 
165
- def get_eref_linkend(node)
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?
173
- Nokogiri::XML::NodeSet.new(node.document, contents).to_xml
174
- end
175
-
176
- def eref_parse(node, out)
177
- linkend = get_eref_linkend(node)
178
- href = eref_target(node)
179
- if node["type"] == "footnote"
180
- out.sup do |s|
181
- s.a(**{ "href": href }) { |l| l << linkend }
182
- end
183
- else
184
- out.a(**{ "href": href }) { |l| l << linkend }
185
- end
186
- end
187
-
188
138
  def middle_title(out)
189
139
  out.p(**{ class: "zzSTDTitle1" }) do |p|
190
140
  id = @meta.get[:docnumber] and p << "#{@meta.get[:doctype]} #{id}"
@@ -216,9 +166,11 @@ module IsoDoc
216
166
  end
217
167
 
218
168
  def note_p_parse(node, div)
169
+ name = node&.at(ns("./name"))&.remove
219
170
  div.p do |p|
220
- p.span **{ class: "note_label" } do |s|
221
- s << note_label(node)
171
+ name and p.span **{ class: "note_label" } do |s|
172
+ name.children.each { |n| parse(n, s) }
173
+ s << note_delim
222
174
  end
223
175
  node.first_element_child.children.each { |n| parse(n, p) }
224
176
  end
@@ -226,9 +178,11 @@ module IsoDoc
226
178
  end
227
179
 
228
180
  def note_parse1(node, div)
181
+ name = node&.at(ns("./name"))&.remove
229
182
  div.p do |p|
230
- p.span **{ class: "note_label" } do |s|
231
- s << note_label(node)
183
+ name and p.span **{ class: "note_label" } do |s|
184
+ name.children.each { |n| parse(n, s) }
185
+ #s << note_delim
232
186
  end
233
187
  end
234
188
  node.children.each { |n| parse(n, div) }
@@ -0,0 +1,349 @@
1
+ html, body, div, span, applet, object, iframe,
2
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
3
+ a, abbr, acronym, address, big, cite, code,
4
+ del, dfn, em, img, ins, kbd, q, s, samp,
5
+ small, strike, strong, sub, sup, tt, var,
6
+ b, u, i, center,
7
+ ol, ul, li,
8
+ fieldset, form, label, legend,
9
+ table, caption, tbody, tfoot, thead, tr, th, td,
10
+ article, aside, canvas, details, embed,
11
+ figure, figcaption, footer, header, hgroup,
12
+ menu, nav, output, ruby, section, summary,
13
+ time, mark, audio, video {
14
+ margin: 0;
15
+ padding: 0; }
16
+
17
+ html, body, div, span, applet, object, iframe,
18
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
19
+ a, abbr, acronym, address, big, cite, code,
20
+ del, dfn, em, img, ins, kbd, q, s, samp,
21
+ small, strike, strong, sub, sup, tt, var,
22
+ b, u, i, center,
23
+ dl, dt, dd, ol, ul, li,
24
+ fieldset, form, label, legend,
25
+ table, caption, tbody, tfoot, thead, tr, th, td,
26
+ article, aside, canvas, details, embed,
27
+ figure, figcaption, footer, header, hgroup,
28
+ menu, nav, output, ruby, section, summary,
29
+ time, mark, audio, video {
30
+ border: 0;
31
+ font-size: 100%; }
32
+
33
+ html, body, div, span, applet, object, iframe,
34
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
35
+ a, abbr, acronym, address, big, cite, code,
36
+ del, dfn, em, img, ins, kbd, q, s, samp,
37
+ small, strike, strong, tt, var,
38
+ b, u, i, center,
39
+ dl, dd, ol, ul, li,
40
+ fieldset, form, label, legend,
41
+ table, caption, tbody, tfoot, thead, tr, th, td,
42
+ article, aside, canvas, details, embed,
43
+ figure, figcaption, footer, header, hgroup,
44
+ menu, nav, output, ruby, section, summary,
45
+ time, mark, audio, video {
46
+ vertical-align: baseline; }
47
+
48
+ html, body, div, span, applet, object, iframe,
49
+ p, blockquote,
50
+ a, abbr, acronym, address, big, cite,
51
+ del, dfn, em, img, ins, q, s,
52
+ small, strike, strong, sub, sup, var,
53
+ b, u, i, center,
54
+ dl, dt, dd, ol, ul, li,
55
+ fieldset, form, label, legend,
56
+ table, caption, tbody, tfoot, thead, tr, th, td,
57
+ article, aside, canvas, details, embed,
58
+ figure, figcaption, footer, header, hgroup,
59
+ menu, nav, output, ruby, section, summary,
60
+ time, mark, audio, video {
61
+ font-family: {{bodyfont}}; }
62
+
63
+ code, pre, tt, kbd, samp {
64
+ font-family: {{monospacefont}};
65
+ font-variant-ligatures: none; }
66
+
67
+ code *, pre *, tt *, kbd *, samp * {
68
+ font-family: {{monospacefont}} !important;
69
+ font-variant-ligatures: none; }
70
+
71
+ article, aside, details, figcaption, figure,
72
+ footer, header, hgroup, menu, nav, section {
73
+ display: block; }
74
+
75
+ table {
76
+ border-collapse: collapse;
77
+ border-spacing: 0; }
78
+
79
+ h1, h2, h3, h4, h5, h6 {
80
+ font-family: {{headerfont}}; }
81
+
82
+ blockquote, q {
83
+ quotes: none; }
84
+ blockquote:before, blockquote:after, q:before, q:after {
85
+ content: '';
86
+ content: none; }
87
+
88
+ .h2Annex {
89
+ font-family: {{headerfont}}; }
90
+
91
+ dl {
92
+ display: grid;
93
+ grid-template-columns: max-content auto; }
94
+ dl dt p, dl dd p {
95
+ margin-top: 0; }
96
+ dl dt {
97
+ grid-column-start: 1; }
98
+ dl dd {
99
+ grid-column-start: 2; }
100
+
101
+ b, strong {
102
+ font-weight: bold; }
103
+
104
+ div.document-stage-band, div.document-type-band {
105
+ background-color: #333333; }
106
+
107
+ #standard-band {
108
+ background-color: #0AC442; }
109
+
110
+ #standard {
111
+ border-bottom: solid 3px #0AC442; }
112
+
113
+ #directive-band {
114
+ background-color: #540D6E; }
115
+
116
+ #directive {
117
+ border-bottom: solid 3px #540D6E; }
118
+
119
+ #guide-band {
120
+ background-color: #D183C9; }
121
+
122
+ #guide {
123
+ border-bottom: solid 3px #D183C9; }
124
+
125
+ #specification-band {
126
+ background-color: #65AFFF; }
127
+
128
+ #specification {
129
+ border-bottom: solid 3px #65AFFF; }
130
+
131
+ #report-band {
132
+ background-color: #3A405A; }
133
+
134
+ #report {
135
+ border-bottom: solid 3px #3A405A; }
136
+
137
+ #amendment-band {
138
+ background-color: #F26430; }
139
+
140
+ #amendment {
141
+ border-bottom: solid 3px #F26430; }
142
+
143
+ #corrigendum-band {
144
+ background-color: #C84630; }
145
+
146
+ #corrigendum {
147
+ border-bottom: solid 3px #C84630; }
148
+
149
+ #administrative-band {
150
+ background-color: #BFAE48; }
151
+
152
+ #administrative {
153
+ border-bottom: solid 3px #BFAE48; }
154
+
155
+ #advisory-band {
156
+ background-color: #BD9391; }
157
+
158
+ #advisory {
159
+ border-bottom: solid 3px #BD9391; }
160
+
161
+ #proposal-band {
162
+ background-color: #39A0ED; }
163
+
164
+ #proposal {
165
+ border-bottom: solid 3px #39A0ED; }
166
+
167
+ #working-draft-band {
168
+ background-color: #2D7393; }
169
+
170
+ #working-draft {
171
+ border-bottom: solid 3px #2D7393; }
172
+
173
+ #committee-draft-band {
174
+ background-color: #2A6B7C; }
175
+
176
+ #committee-draft {
177
+ border-bottom: solid 3px #2A6B7C; }
178
+
179
+ #draft-standard-band {
180
+ background-color: #1C7F7A; }
181
+
182
+ #draft-standard {
183
+ border-bottom: solid 3px #1C7F7A; }
184
+
185
+ #final-draft-band {
186
+ background-color: #53C170; }
187
+
188
+ #final-draft {
189
+ border-bottom: solid 3px #53C170; }
190
+
191
+ #published-band {
192
+ background-color: #069E2D; }
193
+
194
+ #published {
195
+ border-bottom: solid 3px #069E2D; }
196
+
197
+ #withdrawn-band {
198
+ background-color: #004E64; }
199
+
200
+ #withdrawn {
201
+ border-bottom: solid 3px #004E64; }
202
+
203
+ #cancelled-band {
204
+ background-color: #2E382E; }
205
+
206
+ #cancelled {
207
+ border-bottom: solid 3px #2E382E; }
208
+
209
+ .icon-svg {
210
+ width: 100%;
211
+ color: #5ecf86; }
212
+
213
+ .wrapper-top {
214
+ background: #fff;
215
+ color: #141115;
216
+ padding: 3em 0 6em 10em;
217
+ margin-left: 0em;
218
+ background: url(data:image/png;base64,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);
219
+ background-repeat: repeat-y;
220
+ background-size: 100px; }
221
+
222
+ .doc-type {
223
+ font-size: 18px;
224
+ letter-spacing: 4px;
225
+ color: #797979;
226
+ margin-bottom: 42px; }
227
+
228
+ .ITU-sector, .doc-identifier {
229
+ font-size: 42px;
230
+ font-weight: 800;
231
+ display: inline; }
232
+
233
+ .doc-info-left {
234
+ float: right;
235
+ padding-right: 42px; }
236
+
237
+ .doc-identifier, .publication-month {
238
+ display: block;
239
+ text-align: right; }
240
+
241
+ .publication-month {
242
+ font-size: 18px;
243
+ padding-top: 10px;
244
+ line-height: 1; }
245
+
246
+ .doc-category {
247
+ text-transform: uppercase;
248
+ font-size: 16px;
249
+ line-height: 1.2; }
250
+
251
+ .coverpage-title {
252
+ margin-top: 42px; }
253
+ .coverpage-title span {
254
+ display: block;
255
+ font-size: 20px;
256
+ line-height: 1.5; }
257
+
258
+ .coverpage-maturity,
259
+ .coverpage-stage {
260
+ font-family: {{bodyfont}};
261
+ font-weight: 400;
262
+ font-size: 1em;
263
+ margin: 0 0 2em 0;
264
+ text-transform: uppercase; }
265
+
266
+ span.doc-title, span.doc-annextitle {
267
+ font-size: 26px;
268
+ font-weight: 800;
269
+ margin-top: 20px;
270
+ margin-right: 42px; }
271
+
272
+ span.doc-title {
273
+ border-top: 2px solid #DA1D52; }
274
+
275
+ .doc-footer {
276
+ margin-top: 100px; }
277
+ .doc-footer .keywords {
278
+ display: block; }
279
+ .doc-footer div {
280
+ clear: both; }
281
+ .doc-footer span, .doc-footer .keywords {
282
+ font-size: 18px;
283
+ font-weight: 400;
284
+ letter-spacing: 0;
285
+ color: black;
286
+ float: left;
287
+ padding-right: 10px; }
288
+
289
+ .WordSection11 {
290
+ padding: 0 2em 0 3em; }
291
+
292
+ .info-section {
293
+ padding: 0; }
294
+ @media print {
295
+ .info-section {
296
+ display: none; } }
297
+ .prefatory-section {
298
+ padding: 0 3em 0 6em; }
299
+
300
+ .zzSTDTitle1, .zzSTDTitle2, .zzSTDTitle3, .MsoCommentText {
301
+ display: none; }
302
+
303
+ .coverpage {
304
+ text-align: left;
305
+ padding-left: 1.5em; }
306
+ @media print {
307
+ .coverpage {
308
+ height: 23cm; } }
309
+ /* Document Identity */
310
+ .coverpage-doc-identity {
311
+ font-size: 2em;
312
+ line-height: 2em; }
313
+
314
+ .coverpage-title .title-second {
315
+ display: none; }
316
+
317
+ .coverpage-stage-block {
318
+ font-family: {{bodyfont}};
319
+ font-weight: 600;
320
+ font-size: 1.25em;
321
+ margin: 2em 0em 2em 0em;
322
+ text-transform: uppercase; }
323
+
324
+ /* Draft Warning */
325
+ .coverpage-warning {
326
+ border: #f36f36 solid 2px;
327
+ color: #f36f36 !important;
328
+ margin: 1em 2em;
329
+ color: #2e81c2;
330
+ padding: 2em 1em 1em 1em;
331
+ border-radius: 25px; }
332
+
333
+ .coverpage-warning h1 {
334
+ margin-top: 0em; }
335
+
336
+ .coverpage-warning .title {
337
+ font-family: {{bodyfont}};
338
+ font-weight: 300;
339
+ text-transform: uppercase;
340
+ font-size: 1.2em; }
341
+
342
+ /* Copyright */
343
+ .copyright {
344
+ padding: 1em;
345
+ font-size: 0.9em;
346
+ text-align: left; }
347
+ @media print {
348
+ .copyright {
349
+ page-break-before: always; } }