metanorma-mpfd 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,6 +25,11 @@
25
25
  <ref name="ObligationType"/>
26
26
  </attribute>
27
27
  </optional>
28
+ <optional>
29
+ <attribute name="unnumbered">
30
+ <data type="boolean"/>
31
+ </attribute>
32
+ </optional>
28
33
  <attribute name="id">
29
34
  <data type="ID"/>
30
35
  </attribute>
@@ -0,0 +1,30 @@
1
+ module Asciidoctor
2
+ module Mpfd
3
+ class Converter < Standoc::Converter
4
+ def content_validate(doc)
5
+ super
6
+ bibdata_validate(doc.root)
7
+ end
8
+
9
+ def bibdata_validate(doc)
10
+ doctype_validate(doc)
11
+ stage_validate(doc)
12
+ end
13
+
14
+ def doctype_validate(xmldoc)
15
+ doctype = xmldoc&.at("//bibdata/ext/doctype")&.text
16
+ %w(policy-and-procedures best-practices supporting-document
17
+ report legal directives proposal standard).include? doctype or
18
+ warn "Document Attributes: #{doctype} is not a recognised document type"
19
+ end
20
+
21
+ def stage_validate(xmldoc)
22
+ stage = xmldoc&.at("//bibdata/status/stage")&.text
23
+ %w(proposal working-draft committee-draft draft-standard final-draft
24
+ published withdrawn).include? stage or
25
+ warn "Document Attributes: #{stage} is not a recognised status"
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,220 @@
1
+ require "isodoc"
2
+ require_relative "metadata"
3
+ require "fileutils"
4
+
5
+ module IsoDoc
6
+ module Mpfd
7
+ module BaseConvert
8
+ def convert1(docxml, filename, dir)
9
+ FileUtils.cp html_doc_path("logo.jpg"), File.join(@localdir, "logo.jpg")
10
+ FileUtils.cp html_doc_path('mpfa-logo-no-text@4x.png'), File.join(@localdir, "mpfa-logo-no-text@4x.png")
11
+ @files_to_delete << File.join(@localdir, "logo.jpg")
12
+ @files_to_delete << File.join(@localdir, "mpfa-logo-no-text@4x.png")
13
+ super
14
+ end
15
+
16
+ def metadata_init(lang, script, labels)
17
+ @meta = Metadata.new(lang, script, labels)
18
+ end
19
+
20
+ def annex_name(annex, name, div)
21
+ div.h1 **{ class: "Annex" } do |t|
22
+ t << "#{anchor(annex['id'], :label)} "
23
+ t.b do |b|
24
+ name&.children&.each { |c2| parse(c2, b) }
25
+ end
26
+ end
27
+ end
28
+
29
+ def fileloc(loc)
30
+ File.join(File.dirname(__FILE__), loc)
31
+ end
32
+
33
+ def i18n_init(lang, script)
34
+ super
35
+ y = if lang == "en"
36
+ YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
37
+ elsif lang == "zh" && script == "Hans"
38
+ YAML.load_file(File.join(File.dirname(__FILE__),
39
+ "i18n-zh-Hans.yaml"))
40
+ else
41
+ YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
42
+ end
43
+ @labels = @labels.merge(y)
44
+ @annex_lbl = y["annex"]
45
+ @clause_lbl = y["clause"]
46
+ end
47
+
48
+ def terms_defs_title(f)
49
+ return f&.at(ns("./title"))&.content
50
+ end
51
+
52
+ TERM_CLAUSE = "//preface/terms | "\
53
+ "//preface/clause[descendant::terms]".freeze
54
+
55
+ SECTIONS_XPATH =
56
+ "//foreword | //introduction | //preface/terms | //preface/clause | //annex | "\
57
+ "//sections/clause | //bibliography/references | "\
58
+ "//bibliography/clause".freeze
59
+
60
+ def terms_defs(isoxml, out, num)
61
+ f = isoxml.at(ns(self.class::TERM_CLAUSE)) or return num
62
+ out.div **attr_code(id: f["id"]) do |div|
63
+ clause_name(nil, terms_defs_title(f), div, nil)
64
+ f.elements.each do |e|
65
+ parse(e, div) unless %w{title source}.include? e.name
66
+ end
67
+ end
68
+ num
69
+ end
70
+
71
+ FRONT_CLAUSE = "//*[parent::preface]".freeze
72
+
73
+ def preface(isoxml, out)
74
+ isoxml.xpath(ns(self.class::FRONT_CLAUSE)).each do |c|
75
+ if c.name == "terms" || c.at(ns(".//terms")) then terms_defs isoxml, out, 0
76
+ else
77
+ out.div **attr_code(id: c["id"]) do |s|
78
+ clause_name(anchor(c['id'], :label),
79
+ c&.at(ns("./title"))&.content, s, nil)
80
+ c.elements.reject { |c1| c1.name == "title" }.each do |c1|
81
+ parse(c1, s)
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ def initial_anchor_names(d)
89
+ d.xpath(ns(self.class::FRONT_CLAUSE)).each do |c|
90
+ preface_names(c)
91
+ sequential_asset_names(c)
92
+ end
93
+ middle_section_asset_names(d)
94
+ clause_names(d, 0)
95
+ termnote_anchor_names(d)
96
+ termexample_anchor_names(d)
97
+ end
98
+
99
+ def middle(isoxml, out)
100
+ middle_title(out)
101
+ clause isoxml, out
102
+ annex isoxml, out
103
+ bibliography isoxml, out
104
+ end
105
+
106
+ def termdef_parse(node, out)
107
+ set_termdomain("")
108
+ node.children.each { |n| parse(n, out) }
109
+ end
110
+
111
+ def annex_name_lbl(clause, num)
112
+ l10n("<b>#{@annex_lbl} #{num}</b>")
113
+ end
114
+
115
+ def clause_names(docxml, sect_num)
116
+ q = "//clause[parent::sections]"
117
+ @topnum = nil
118
+ lvl = 0
119
+ docxml.xpath(ns(q)).each do |c|
120
+ container_names(c, 0)
121
+ sect_num, lvl = sect_names(c, nil, sect_num, 0, lvl)
122
+ end
123
+ end
124
+
125
+ def container_names(clause, lvl)
126
+ if clause["container"]
127
+ @anchors[clause["id"]] =
128
+ { label: nil, xref: clause.at(ns("./title"))&.text, level: lvl+1 }
129
+ end
130
+ clause.xpath(ns("./clause | ./term | ./terms | "\
131
+ "./definitions")).each do |c|
132
+ container_names(c, clause["container"] ? lvl+1 : lvl)
133
+ end
134
+ end
135
+
136
+ def sect_names(clause, num, i, lvl, prev_lvl)
137
+ return i if clause.nil?
138
+ curr = i
139
+ if !clause["container"]
140
+ retlvl = lvl
141
+ i+=1
142
+ curr = i
143
+ name = num.nil? ? i.to_s : "#{num}.#{i}"
144
+ @anchors[clause["id"]] = { label: name, xref: l10n("#{@clause_lbl} #{name}"), level: lvl+1 }
145
+ end
146
+ prev = lvl
147
+ j = 0
148
+ clause.xpath(ns("./clause | ./term | ./terms | "\
149
+ "./definitions")).each do |c|
150
+ if clause["container"]
151
+ i, lvl = sect_names(c, num, i, lvl, lvl)
152
+ else
153
+ j, prev = sect_names(c, name, j, lvl+1, prev)
154
+ end
155
+ end
156
+ i = j if j >0
157
+ i = curr if lvl < prev
158
+ [i, prev]
159
+ end
160
+
161
+ def annex_naming(c, num, lvl, i)
162
+ if c["guidance"] then annex_names1(c, "#{num}E", lvl + 1)
163
+ else
164
+ i+= 1 unless c["container"]
165
+ annex_names1(c, "#{num}.#{i}", lvl + 1)
166
+ end
167
+ i
168
+ end
169
+
170
+ def annex_names(clause, num)
171
+ @anchors[clause["id"]] = { label: annex_name_lbl(clause, num),
172
+ xref: "#{@annex_lbl} #{num}", level: 1 }
173
+ i = 0
174
+ clause.xpath(ns("./clause")).each do |c|
175
+ container_names(c, 0)
176
+ i = annex_naming(c, num, 1, i)
177
+ end
178
+ hierarchical_asset_names(clause, num)
179
+ end
180
+
181
+ def annex_names1(clause, num, level)
182
+ clause["container"] or @anchors[clause["id"]] =
183
+ { label: num, xref: "#{@annex_lbl} #{num}", level: level }
184
+ i = 0
185
+ clause.xpath(ns("./clause")).each do |c|
186
+ i = annex_naming(c, num, level, i)
187
+ end
188
+ end
189
+
190
+ def clause(isoxml, out)
191
+ isoxml.xpath(ns(self.class::MIDDLE_CLAUSE)).each do |c|
192
+ out.div **attr_code(id: c["id"]) do |s|
193
+ clause_name(anchor(c['id'], :label),
194
+ c&.at(ns("./title"))&.content, s, class: c["container"] ? "containerhdr" : nil )
195
+ c.elements.reject { |c1| c1.name == "title" }.each do |c1|
196
+ parse(c1, s)
197
+ end
198
+ end
199
+ end
200
+ end
201
+
202
+ def clause_parse_title(node, div, c1, out)
203
+ if node["inline-header"] == "true"
204
+ inline_header_title(out, node, c1)
205
+ else
206
+ attrs = { class: node["container"] ? "containerhdr" : nil }
207
+ div.send "h#{anchor(node['id'], :level) || '1'}", **attr_code(attrs) do |h|
208
+ lbl = anchor(node['id'], :label, false)
209
+ h << "#{lbl}. " if lbl && !@suppressheadingnumbers
210
+ c1&.children&.each { |c2| parse(c2, h) }
211
+ end
212
+ end
213
+ end
214
+
215
+ def ol_depth(node)
216
+ ol_style(node["type"])
217
+ end
218
+ end
219
+ end
220
+ end
@@ -1,6 +1,6 @@
1
1
  <!--
2
- <div class="document-stage-band" id='{{ status | downcase | replace: " ", "-" }}-band'>
3
- <p class="document-stage">{{ status }}</p>
2
+ <div class="document-stage-band" id='{{ stage | downcase | replace: " ", "-" }}-band'>
3
+ <p class="document-stage">{{ stage }}</p>
4
4
  </div>
5
5
 
6
6
  <div class="document-type-band" id='{{ doctype | downcase | replace: " ", "-" }}-band'>
@@ -39,7 +39,7 @@
39
39
  <div class="coverpage-logo">
40
40
  <span class="doc-edition">{{ edition }} Edition</span>
41
41
  <span>{{ revdate_monthyear }} {{ draftinfo }}</span>
42
- <span>Status: {{ status }}</span>
42
+ <span>Status: {{ stage }}</span>
43
43
  </div>
44
44
 
45
45
  <div class="coverpage-location">
@@ -1,6 +1,5 @@
1
+ require_relative "base_convert"
1
2
  require "isodoc"
2
- require_relative "metadata"
3
- require "fileutils"
4
3
 
5
4
  module IsoDoc
6
5
  module Mpfd
@@ -14,13 +13,7 @@ module IsoDoc
14
13
  super
15
14
  end
16
15
 
17
- def convert1(docxml, filename, dir)
18
- FileUtils.cp html_doc_path("logo.jpg"), File.join(@localdir, "logo.jpg")
19
- FileUtils.cp html_doc_path('mpfa-logo-no-text@4x.png'), File.join(@localdir, "mpfa-logo-no-text@4x.png")
20
- @files_to_delete << File.join(@localdir, "logo.jpg")
21
- @files_to_delete << File.join(@localdir, "mpfa-logo-no-text@4x.png")
22
- super
23
- end
16
+ include BaseConvert
24
17
 
25
18
  def default_fonts(options)
26
19
  {
@@ -39,10 +32,6 @@ module IsoDoc
39
32
  }
40
33
  end
41
34
 
42
- def metadata_init(lang, script, labels)
43
- @meta = Metadata.new(lang, script, labels)
44
- end
45
-
46
35
  def googlefonts
47
36
  <<~HEAD.freeze
48
37
  <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i|Space+Mono:400,700" rel="stylesheet">
@@ -64,74 +53,6 @@ module IsoDoc
64
53
  docxml
65
54
  end
66
55
 
67
- def annex_name(annex, name, div)
68
- div.h1 **{ class: "Annex" } do |t|
69
- t << "#{get_anchors[annex['id']][:label]} "
70
- t.b do |b|
71
- name&.children&.each { |c2| parse(c2, b) }
72
- end
73
- end
74
- end
75
-
76
- def fileloc(loc)
77
- File.join(File.dirname(__FILE__), loc)
78
- end
79
-
80
- def i18n_init(lang, script)
81
- super
82
- y = if lang == "en"
83
- YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
84
- elsif lang == "zh" && script == "Hans"
85
- YAML.load_file(File.join(File.dirname(__FILE__),
86
- "i18n-zh-Hans.yaml"))
87
- else
88
- YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
89
- end
90
- @labels = @labels.merge(y)
91
- @annex_lbl = y["annex"]
92
- @clause_lbl = y["clause"]
93
- end
94
-
95
- def terms_defs_title(f)
96
- return f&.at(ns("./title"))&.content
97
- end
98
-
99
- TERM_CLAUSE = "//preface/terms | "\
100
- "//preface/clause[descendant::terms]".freeze
101
-
102
- SECTIONS_XPATH =
103
- "//foreword | //introduction | //preface/terms | //preface/clause | //annex | "\
104
- "//sections/clause | //bibliography/references | "\
105
- "//bibliography/clause".freeze
106
-
107
- def terms_defs(isoxml, out, num)
108
- f = isoxml.at(ns(TERM_CLAUSE)) or return num
109
- out.div **attr_code(id: f["id"]) do |div|
110
- clause_name(nil, terms_defs_title(f), div, nil)
111
- f.elements.each do |e|
112
- parse(e, div) unless %w{title source}.include? e.name
113
- end
114
- end
115
- num
116
- end
117
-
118
- FRONT_CLAUSE = "//*[parent::preface]".freeze
119
-
120
- def preface(isoxml, out)
121
- isoxml.xpath(ns(FRONT_CLAUSE)).each do |c|
122
- if c.name == "terms" || c.at(ns(".//terms")) then terms_defs isoxml, out, 0
123
- else
124
- out.div **attr_code(id: c["id"]) do |s|
125
- clause_name(get_anchors[c['id']][:label],
126
- c&.at(ns("./title"))&.content, s, nil)
127
- c.elements.reject { |c1| c1.name == "title" }.each do |c1|
128
- parse(c1, s)
129
- end
130
- end
131
- end
132
- end
133
- end
134
-
135
56
  def make_body3(body, docxml)
136
57
  body.div **{ class: "main-section" } do |div3|
137
58
  preface docxml, div3
@@ -140,137 +61,6 @@ module IsoDoc
140
61
  comments div3
141
62
  end
142
63
  end
143
-
144
- def middle(isoxml, out)
145
- middle_title(out)
146
- clause isoxml, out
147
- annex isoxml, out
148
- bibliography isoxml, out
149
- end
150
-
151
- def termdef_parse(node, out)
152
- set_termdomain("")
153
- node.children.each { |n| parse(n, out) }
154
- end
155
-
156
- def initial_anchor_names(d)
157
- d.xpath(ns(FRONT_CLAUSE)).each do |c|
158
- preface_names(c)
159
- sequential_asset_names(c)
160
- end
161
- middle_section_asset_names(d)
162
- clause_names(d, 0)
163
- termnote_anchor_names(d)
164
- termexample_anchor_names(d)
165
- end
166
-
167
- def annex_name_lbl(clause, num)
168
- l10n("<b>#{@annex_lbl} #{num}</b>")
169
- end
170
-
171
- def clause_names(docxml, sect_num)
172
- q = "//clause[parent::sections]"
173
- @topnum = nil
174
- lvl = 0
175
- docxml.xpath(ns(q)).each do |c|
176
- container_names(c, 0)
177
- sect_num, lvl = sect_names(c, nil, sect_num, 0, lvl)
178
- end
179
- end
180
-
181
- def container_names(clause, lvl)
182
- if clause["container"]
183
- @anchors[clause["id"]] =
184
- { label: nil, xref: clause.at(ns("./title"))&.text, level: lvl+1 }
185
- end
186
- clause.xpath(ns("./clause | ./term | ./terms | "\
187
- "./definitions")).each do |c|
188
- container_names(c, clause["container"] ? lvl+1 : lvl)
189
- end
190
- end
191
-
192
- def sect_names(clause, num, i, lvl, prev_lvl)
193
- return i if clause.nil?
194
- curr = i
195
- if !clause["container"]
196
- retlvl = lvl
197
- i+=1
198
- curr = i
199
- name = num.nil? ? i.to_s : "#{num}.#{i}"
200
- @anchors[clause["id"]] = { label: name, xref: l10n("#{@clause_lbl} #{name}"), level: lvl+1 }
201
- end
202
- prev = lvl
203
- j = 0
204
- clause.xpath(ns("./clause | ./term | ./terms | "\
205
- "./definitions")).each do |c|
206
- if clause["container"]
207
- i, lvl = sect_names(c, num, i, lvl, lvl)
208
- else
209
- j, prev = sect_names(c, name, j, lvl+1, prev)
210
- end
211
- end
212
- i = j if j >0
213
- i = curr if lvl < prev
214
- [i, prev]
215
- end
216
-
217
- def annex_naming(c, num, lvl, i)
218
- if c["guidance"] then annex_names1(c, "#{num}E", lvl + 1)
219
- else
220
- i+= 1 unless c["container"]
221
- annex_names1(c, "#{num}.#{i}", lvl + 1)
222
- end
223
- i
224
- end
225
-
226
- def annex_names(clause, num)
227
- @anchors[clause["id"]] = { label: annex_name_lbl(clause, num),
228
- xref: "#{@annex_lbl} #{num}", level: 1 }
229
- i = 0
230
- clause.xpath(ns("./clause")).each do |c|
231
- container_names(c, 0)
232
- i = annex_naming(c, num, 1, i)
233
- end
234
- hierarchical_asset_names(clause, num)
235
- end
236
-
237
- def annex_names1(clause, num, level)
238
- clause["container"] or @anchors[clause["id"]] =
239
- { label: num, xref: "#{@annex_lbl} #{num}", level: level }
240
- i = 0
241
- clause.xpath(ns("./clause")).each do |c|
242
- i = annex_naming(c, num, level, i)
243
- end
244
- end
245
-
246
- def clause(isoxml, out)
247
- isoxml.xpath(ns(MIDDLE_CLAUSE)).each do |c|
248
- out.div **attr_code(id: c["id"]) do |s|
249
- clause_name(get_anchors[c['id']][:label],
250
- c&.at(ns("./title"))&.content, s, class: c["container"] ? "containerhdr" : nil )
251
- c.elements.reject { |c1| c1.name == "title" }.each do |c1|
252
- parse(c1, s)
253
- end
254
- end
255
- end
256
- end
257
-
258
- def clause_parse_title(node, div, c1, out)
259
- if node["inline-header"] == "true"
260
- inline_header_title(out, node, c1)
261
- else
262
- attrs = { class: node["container"] ? "containerhdr" : nil }
263
- div.send "h#{get_anchors[node['id']][:level]}", **attr_code(attrs) do |h|
264
- lbl = get_anchors[node['id']][:label]
265
- h << "#{lbl}. " if lbl && !@suppressheadingnumbers
266
- c1&.children&.each { |c2| parse(c2, h) }
267
- end
268
- end
269
- end
270
-
271
- def ol_depth(node)
272
- ol_style(node["type"])
273
- end
274
64
  end
275
65
  end
276
66
  end