metanorma-jis 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -49,6 +49,13 @@ module IsoDoc
49
49
  end
50
50
 
51
51
  PART_LABEL = { en: "Part", ja: "その" }.freeze
52
+
53
+ def docid(isoxml, _out)
54
+ id = isoxml.at(ns("//bibdata/docidentifier[@type = 'JIS']"))&.text or
55
+ return
56
+ set(:docnumber, id)
57
+ set(:docnumber_undated, id.sub(/:\d{4}$/, ""))
58
+ end
52
59
  end
53
60
  end
54
61
  end
@@ -22,7 +22,7 @@ module IsoDoc
22
22
  def strong1(text)
23
23
  jpan = /^[#{JPAN}]/o.match?(text[0])
24
24
  ret = jpan ? JPAN_BOLD : "<strong>"
25
- text.split("").each do |n|
25
+ text.chars.each do |n|
26
26
  new = /^[#{JPAN}]/o.match?(n)
27
27
  jpan && !new and ret += "</span><strong>"
28
28
  !jpan && new and ret += "</strong>#{JPAN_BOLD}"
@@ -33,6 +33,10 @@ module IsoDoc
33
33
  ret
34
34
  end
35
35
 
36
+ def admits(elem)
37
+ elem.children.first.previous = @i18n.l10n("#{@i18n.admitted}: ")
38
+ end
39
+
36
40
  def block(docxml)
37
41
  super
38
42
  dl docxml
@@ -50,35 +54,74 @@ module IsoDoc
50
54
  end
51
55
 
52
56
  def dl_to_para(node)
57
+ ret = dl_to_para_name(node)
58
+ ret += dl_to_para_terms(node)
59
+ node.elements.reject { |n| %w(dt dd name).include?(n.name) }.each do |x|
60
+ ret += x.to_xml
61
+ end
62
+ dl_id_insert(node, ret)
63
+ end
64
+
65
+ def dl_id_insert(node, ret)
66
+ a = node.replace(ret)
67
+ p = a.at("./descendant-or-self::xmlns:p")
68
+ node["id"] and p << "<bookmark id='#{node['id']}'/>"
69
+ a.xpath("./descendant-or-self::*[@id = '']").each { |x| x.delete("id") }
70
+ end
71
+
72
+ def dl_to_para_name(node)
73
+ e = node.at(ns("./name"))
74
+ "<p class='ListTitle'>#{e&.children&.to_xml || @i18n.key}</p>"
75
+ end
76
+
77
+ def dl_to_para_terms(node)
53
78
  ret = ""
54
- e = node.at(ns("./name")) and
55
- ret += "<p class='ListTitle' id='#{dlist['id']}'>" \
56
- "#{e.children.to_xml}</p>"
57
79
  node.elements.select { |n| dt_dd?(n) }.each_slice(2) do |dt, dd|
58
- term = dt.children.to_xml.gsub(%r{</?p( [^>]*)>}, "")
59
- defn = dd.children.to_xml.gsub(%r{</?p( [^>]*)>}, "")
60
- ret += "<p id='#{dt['id']}'>#{term}: " \
61
- "<bookmark id='#{dd['id']}'/>#{defn}</p>"
62
- end
63
- node.elements.each do |x|
64
- %w(dt dd name).include?(x.name) and next
65
- ret += x.to_xml
80
+ term = strip_para(dt)
81
+ defn = strip_para(dd)
82
+ bkmk = dd["id"] ? "<bookmark id='#{dd['id']}'/>" : ""
83
+ ret += "<p class='dl' id='#{dt['id']}'>#{term}: #{bkmk}#{defn}</p>"
66
84
  end
67
- node.replace(ret.gsub(/ id=''/, ""))
85
+ ret
86
+ end
87
+
88
+ def strip_para(node)
89
+ node.children.to_xml.gsub(%r{</?p( [^>]*)?>}, "")
68
90
  end
69
91
 
70
92
  def table1(node)
71
93
  super
94
+ cols = table_cols_count(node)
95
+ name = node.at(ns("./name"))
96
+ thead = table_thead_pt(node, name)
97
+ table_unit_note(node, thead, cols)
98
+ table_name(name, thead, cols)
99
+ end
100
+
101
+ def table_thead_pt(node, name)
102
+ node.at(ns("./thead")) ||
103
+ name&.after("<thead> </thead>")&.next ||
104
+ node.elements.first.before("<thead> </thead>").previous
105
+ end
106
+
107
+ def table_cols_count(node)
72
108
  cols = 0
73
109
  node.at(ns(".//tr")).xpath(ns("./td | ./th")).each do |x|
74
110
  cols += x["colspan"]&.to_i || 1
75
111
  end
76
- name = node.at(ns("./name"))
77
- h = node.at(ns("./thead")) || name.after("<thead> </thead>").next
78
- unit_note = node.at(ns(".//note[@type = 'units']"))&.remove
79
- unit_note and h.children.first.previous = full_row(cols, unit_row.to_xml)
80
- name and h.children.first.previous =
81
- full_row(cols, "<p class='TableTitle' style='text-align:center;'>#{name.remove.children.to_xml}</p>")
112
+ cols
113
+ end
114
+
115
+ def table_unit_note(node, thead, cols)
116
+ unit_note = node.at(ns(".//note[@type = 'units']")) or return
117
+ thead.children.first.previous = full_row(cols, unit_note.remove.to_xml)
118
+ end
119
+
120
+ def table_name(name, thead, cols)
121
+ name or return
122
+ thead.children.first.previous =
123
+ full_row(cols, "<p class='TableTitle' style='text-align:center;'> " \
124
+ "#{name.remove.children.to_xml}</p>")
82
125
  end
83
126
 
84
127
  def full_row(cols, elem)
@@ -86,12 +129,72 @@ module IsoDoc
86
129
  end
87
130
 
88
131
  def annex1(elem)
89
- lbl = @xrefs.anchor(elem["id"], :label)
90
- if t = elem.at(ns("./title"))
91
- t.children = "<strong>#{to_xml(t.children)}</strong>"
132
+ elem["commentary"] == "true" and return
133
+ lbl = @xrefs.anchor(elem["id"], :label)
134
+ if t = elem.at(ns("./title"))
135
+ t.children = "<strong>#{to_xml(t.children)}</strong>"
136
+ end
137
+ prefix_name(elem, "<br/>", lbl, "title")
138
+ end
139
+
140
+ def annex(docxml)
141
+ super
142
+ move_commentaries_to_end(docxml)
143
+ end
144
+
145
+ def move_commentaries_to_end(docxml)
146
+ docxml.at(ns("//annex[@commentary = 'true']")) or return
147
+ b = docxml.at(ns("//bibliography")) ||
148
+ docxml.at(ns("//annex[last()]")).after(" ").next
149
+ docxml.xpath(ns("//annex[@commentary = 'true']")).reverse.each do |x|
150
+ b.next = x.remove
151
+ end
152
+ end
153
+
154
+ def display_order(docxml)
155
+ i = 0
156
+ i = display_order_xpath(docxml, "//preface/*", i)
157
+ i = display_order_at(docxml, "//sections/introduction", i)
158
+ i = display_order_at(docxml, "//clause[@type = 'scope']", i)
159
+ i = display_order_at(docxml, @xrefs.klass.norm_ref_xpath, i)
160
+ i = display_order_at(docxml, "//sections/terms | " \
161
+ "//sections/clause[descendant::terms]", i)
162
+ i = display_order_at(docxml, "//sections/definitions", i)
163
+ i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
164
+ i = display_order_xpath(docxml, "//annex[not(@commentary = 'true')]", i)
165
+ i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
166
+ i = display_order_xpath(docxml, "//annex[@commentary = 'true']", i)
167
+ i = display_order_xpath(docxml, "//indexsect", i)
168
+ display_order_xpath(docxml, "//colophon/*", i)
169
+ end
170
+
171
+ def tablesource(elem)
172
+ while elem&.next_element&.name == "source"
173
+ elem << "; #{to_xml(elem.next_element.remove.children)}"
174
+ end
175
+ elem.children = l10n("#{@i18n.source}: #{to_xml(elem.children).strip}")
176
+ end
177
+
178
+ def toc_title_insert_pt(docxml)
179
+ ins = docxml.at(ns("//preface")) ||
180
+ docxml.at(ns("//sections | //annex | //bibliography"))
181
+ &.before("<preface> </preface>")
182
+ &.previous_element or return nil
183
+ ins.children.last.after(" ").next
184
+ end
185
+
186
+ def preface_rearrange(doc)
187
+ move_introduction(doc)
188
+ super
189
+ end
190
+
191
+ def move_introduction(doc)
192
+ source = doc.at(ns("//preface/introduction")) or return
193
+ dest = doc.at(ns("//sections")) ||
194
+ doc.at(ns("//preface")).after("<sections> </sections>").next_element
195
+ dest.children.empty? and dest.children = " "
196
+ dest.children.first.next = source
92
197
  end
93
- prefix_name(elem, "<br/>", lbl, "title")
94
- end
95
198
 
96
199
  include Init
97
200
  end
@@ -0,0 +1,58 @@
1
+ module IsoDoc
2
+ module JIS
3
+ class WordConvert < IsoDoc::Iso::WordConvert
4
+ def make_table_footnote_target(out, fnid, fnref)
5
+ attrs = { id: fnid, class: "TableFootnoteRef" }
6
+ out.span do |s|
7
+ s << @i18n.table_footnote
8
+ out.span **attrs do |a|
9
+ a << "#{fnref})"
10
+ end
11
+ insert_tab(s, 1)
12
+ end
13
+ end
14
+
15
+ def table_title_parse(node, out); end
16
+
17
+ def table_attrs(node)
18
+ { id: node["id"], title: node["alt"],
19
+ summary: node["summary"], width: node["width"],
20
+ class: (node.text.length > 4000 ? "MsoTableGridBig" : "MsoTableGrid"),
21
+ style: "border-collapse:collapse;" \
22
+ "mso-table-anchor-horizontal:column;mso-table-overlap:never;" \
23
+ "border:none;mso-padding-alt: " \
24
+ "0cm 5.4pt 0cm 5.4pt;mso-border-insideh:none;" \
25
+ "mso-border-insidev:none;#{keep_style(node)}",
26
+ border: 0, cellspacing: 0, cellpadding: 0 }
27
+ end
28
+
29
+ def make_tr_attr_style(cell, row, rowmax, totalrows, opt)
30
+ top = row.zero? ? "#{SW1} 1.5pt;" : "none;"
31
+ bottom = "#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;"
32
+ ret = <<~STYLE.gsub(/\n/, "")
33
+ border-top:#{top}mso-border-top-alt:#{top}
34
+ border-left:#{bottom}mso-border-top-alt:#{bottom}
35
+ border-right:#{bottom}mso-border-top-alt:#{bottom}
36
+ border-bottom:#{bottom}mso-border-bottom-alt:#{bottom}
37
+ STYLE
38
+ opt[:bordered] or ret = ""
39
+ pb = keep_rows_together(cell, rowmax, totalrows, opt) ? "avoid" : "auto"
40
+ "#{ret}page-break-after:#{pb};"
41
+ end
42
+
43
+ def new_fullcolspan_row(table, tfoot)
44
+ # how many columns in the table?
45
+ cols = 0
46
+ table.at(".//tr").xpath("./td | ./th").each do |td|
47
+ cols += (td["colspan"] ? td["colspan"].to_i : 1)
48
+ end
49
+ style = "border-top:0pt;mso-border-top-alt:0pt;" \
50
+ "border-bottom:#{SW1} 1.5pt;mso-border-bottom-alt:#{SW1} 1.5pt;" \
51
+ "border-left:#{SW1} 1.5pt;mso-border-left-alt:#{SW1} 1.5pt;" \
52
+ "border-right:#{SW1} 1.5pt;mso-border-right-alt:#{SW1} 1.5pt;"
53
+ tfoot.add_child("<tr><td colspan='#{cols}' style='#{style}'/></tr>")
54
+ tfoot.xpath(".//td").last
55
+ end
56
+ end
57
+ end
58
+ end
@@ -21,10 +21,10 @@ module IsoDoc
21
21
  def move_to_inner_cover(docxml)
22
22
  source = docxml.at("//div[@type = 'inner-cover-note']")
23
23
  dest = docxml.at("//div[@id = 'boilerplate-inner-cover-note']")
24
- source && dest and dest.replace(source)
24
+ source && dest and dest.replace(source.remove)
25
25
  source = docxml.at("//div[@type = 'contributors']")
26
26
  dest = docxml.at("//div[@id = 'boilerplate-contributors']")
27
- source && dest and dest.replace(source)
27
+ source && dest and dest.replace(source.remove)
28
28
  docxml
29
29
  end
30
30
 
@@ -120,22 +120,22 @@ module IsoDoc
120
120
  def heading_to_para(docxml)
121
121
  docxml.xpath("//h1[@class = 'ForewordTitle']").each do |p|
122
122
  p.name = "p"
123
- p.xpath("../div/p[not(@class) or @class = 'MsoNormal']").each do |n|
123
+ p.parent.xpath("./p[not(@class) or @class = 'MsoNormal']").each do |n|
124
124
  n["class"] = "ForewordText"
125
125
  end
126
126
  end
127
127
  docxml.xpath("//h1[@class = 'IntroTitle'] | //h1[@class = 'Annex'] | " \
128
128
  "//h2[@class = 'Terms'] | " \
129
129
  "//h3[@class = 'Terms'] | //h4[@class = 'Terms'] | " \
130
- "//h5[@class = 'Terms'] | //h6[@class = 'Terms']").each do |p|
131
- p.name = "p"
130
+ "//h5[@class = 'Terms'] | //h6[@class = 'Terms']").each do |n|
131
+ n.name = "p"
132
132
  end
133
133
  end
134
134
 
135
135
  def word_annex_cleanup1(docxml, lvl)
136
136
  docxml.xpath("//h#{lvl}[ancestor::*[@class = 'Section3']]").each do |h2|
137
137
  h2.name = "p"
138
- h2["class"] = ".h#{lvl}Annex"
138
+ h2["class"] = "h#{lvl}Annex"
139
139
  end
140
140
  end
141
141
  end
@@ -2,6 +2,8 @@ require_relative "base_convert"
2
2
  require "isodoc"
3
3
  require_relative "init"
4
4
  require_relative "word_cleanup"
5
+ require_relative "figure"
6
+ require_relative "table"
5
7
 
6
8
  module IsoDoc
7
9
  module JIS
@@ -97,24 +99,16 @@ module IsoDoc
97
99
  end
98
100
  end
99
101
 
100
- def preface(isoxml, out)
101
- isoxml.xpath(ns("//preface/clause | //preface/references | " \
102
- "//preface/definitions | //preface/terms")).each do |f|
103
- out.div **attr_code(class: "Section3", id: f["id"],
104
- type: f["type"]) do |div|
105
- clause_name(f, f&.at(ns("./title")), div, { class: "IntroTitle" })
106
- f.elements.each do |e|
107
- parse(e, div) unless e.name == "title"
108
- end
109
- end
110
- end
102
+ def preface_attrs(node)
103
+ { id: node["id"], type: node["type"],
104
+ class: node["type"] == "toc" ? "TOC" : "Section3" }
111
105
  end
112
106
 
113
- def introduction(isoxml, out)
114
- f = isoxml.at(ns("//introduction")) || return
115
- out.div class: "Section3", id: f["id"] do |div|
116
- clause_name(f, f.at(ns("./title")), div, { class: "IntroTitle" })
117
- f.elements.each do |e|
107
+ def introduction(clause, out)
108
+ out.div class: "Section3", id: clause["id"] do |div|
109
+ clause_name(clause, clause.at(ns("./title")), div,
110
+ { class: "IntroTitle" })
111
+ clause.elements.each do |e|
118
112
  parse(e, div) unless e.name == "title"
119
113
  end
120
114
  end
@@ -123,11 +117,7 @@ module IsoDoc
123
117
  def make_body2(body, docxml)
124
118
  body.div class: "WordSection2" do |div2|
125
119
  boilerplate docxml, div2
126
- preface_block docxml, div2
127
- abstract docxml, div2
128
- foreword docxml, div2
129
- preface docxml, div2
130
- acknowledgements docxml, div2
120
+ front docxml, div2
131
121
  div2.p { |p| p << "&#xa0;" } # placeholder
132
122
  end
133
123
  section_break(body)
@@ -136,115 +126,18 @@ module IsoDoc
136
126
  def middle(isoxml, out)
137
127
  middle_title(isoxml, out)
138
128
  middle_admonitions(isoxml, out)
139
- introduction isoxml, out
129
+ i = isoxml.at(ns("//sections/introduction")) and
130
+ introduction i, out
140
131
  scope isoxml, out, 0
141
132
  norm_ref isoxml, out, 0
142
- terms_defs isoxml, out, 0
143
- symbols_abbrevs isoxml, out, 0
144
- clause isoxml, out
133
+ clause_etc isoxml, out, 0
145
134
  annex isoxml, out
146
135
  bibliography isoxml, out
147
- # colophon isoxml, out
148
- end
149
-
150
- def figure_attrs(node)
151
- attr_code(id: node["id"], class: "MsoTableGrid",
152
- style: "border-collapse:collapse;" \
153
- "border:none;mso-padding-alt: " \
154
- "0cm 5.4pt 0cm 5.4pt;mso-border-insideh:none;" \
155
- "mso-border-insidev:none;#{keep_style(node)}",
156
- border: 0, cellspacing: 0, cellpadding: 0)
157
- end
158
-
159
- def figure_components(node)
160
- { units: node.at(ns("./note[@type = 'units']/p")),
161
- notes_etc: figure_notes_examples_paras(node
162
- .xpath(ns("./note[not(@type = 'units')] | ./example | ./p"))),
163
- name: node.at(ns("./name")),
164
- key: node.at(ns("./dl")),
165
- img: node.at(ns("./image")),
166
- aside: node.at(ns("./aside")),
167
- subfigs: node.xpath(ns("./figure")).map { |n| figure_components(n) } }
168
- end
169
-
170
- def figure_notes_examples_paras(xpath)
171
- xpath.empty? and return nil
172
- curr = ""
173
- xpath.each_with_object([]) do |e, m|
174
- e.name == curr or m << []
175
- curr = e.name
176
- m[-1] << e
177
- end
178
- end
179
-
180
- def figure_parse1(node, out)
181
- c = figure_components(node)
182
- out.table **figure_attrs(node) do |div|
183
- %i(units img subfigs key notes_etc aside name).each do |key|
184
- case key
185
- when :subfigs
186
- c[key].each do |n|
187
- n[:subname] = n[:name]
188
- figure_row(node, div, n, :img)
189
- figure_row(node, div, n, :subname)
190
- end
191
- when :notes_etc
192
- c[key].each do |n|
193
- figure_row(node, div, n, :notes_etc)
194
- end
195
- else figure_row(node, div, c, key)
196
- end
197
- end
198
- end
199
- end
200
-
201
- def figure_name_parse(_node, div, name)
202
- name.nil? and return
203
- div.p class: "Tabletitle", style: "text-align:center;" do |p|
204
- name.children.each { |n| parse(n, p) }
205
- end
206
- end
207
-
208
- def figure_row(node, table, hash, key)
209
- key != :notes_etc && (
210
- hash[key].nil? || (hash[key].is_a?(Array) && hash[key].empty?)) and
211
- return
212
- table.tr do |r|
213
- r.td valign: "top", style: "padding:0cm 5.4pt 0cm 5.4pt" do |d|
214
- figure_row1(node, d, hash, key)
215
- end
216
- end
217
- end
218
-
219
- def fig_para(klass, row, nodes)
220
- row.td valign: "top", style: "padding:0cm 5.4pt 0cm 5.4pt" do |d|
221
- d.p class: klass do |p|
222
- nodes.each { |n| parse(n, p) }
223
- end
224
- end
225
136
  end
226
137
 
227
- def figure_row1(node, cell, hash, key)
228
- case key
229
- when :units
230
- cell.p class: "UnitStatement" do |p|
231
- hash[key].children.each { |n| parse(n, p) }
232
- end
233
- when :key
234
- figure_key(cell)
235
- parse(hash[key], cell)
236
- when :notes_etc, :aside
237
- hash.each { |n| parse(n, cell) }
238
- when :name then figure_name_parse(node, cell, hash[key])
239
- when :img
240
- cell.p class: "Figure" do |p|
241
- parse(hash[key], p)
242
- end
243
- when :subname
244
- cell.p class: "SubfigureCaption" do |p|
245
- hash[key].children.each { |n| parse(n, p) }
246
- end
247
- end
138
+ def make_body3(body, docxml)
139
+ super
140
+ commentary docxml, body
248
141
  end
249
142
 
250
143
  def footnote_parse(node, out)
@@ -268,57 +161,33 @@ module IsoDoc
268
161
  @seen_footnote << fn
269
162
  end
270
163
 
271
- def make_table_footnote_target(out, fnid, fnref)
272
- attrs = { id: fnid, class: "TableFootnoteRef" }
273
- out.span do |s|
274
- s << @i18n.table_footnote
275
- out.span **attrs do |a|
276
- a << "#{fnref})"
277
- end
278
- insert_tab(s, 1)
164
+ def annex(isoxml, out)
165
+ amd(isoxml) and @suppressheadingnumbers = @oldsuppressheadingnumbers
166
+ isoxml.xpath(ns("//annex[not(@commentary = 'true')]")).each do |c|
167
+ page_break(out)
168
+ render_annex(out, c)
279
169
  end
170
+ amd(isoxml) and @suppressheadingnumbers = true
280
171
  end
281
172
 
282
- def table_title_parse(node, out); end
283
-
284
- def table_attrs(node)
285
- { id: node["id"], title: node["alt"],
286
- summary: node["summary"], width: node["width"],
287
- class: (node.text.length > 4000 ? "MsoTableGridBig" : "MsoTableGrid"),
288
- style: "border-collapse:collapse;" \
289
- "mso-table-anchor-horizontal:column;mso-table-overlap:never;" \
290
- "border:none;mso-padding-alt: " \
291
- "0cm 5.4pt 0cm 5.4pt;mso-border-insideh:none;" \
292
- "mso-border-insidev:none;#{keep_style(node)}",
293
- border: 0, cellspacing: 0, cellpadding: 0 }
294
- end
295
-
296
- def make_tr_attr_style(cell, row, rowmax, totalrows, opt)
297
- top = row.zero? ? "#{SW1} 1.5pt;" : "none;"
298
- bottom = "#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;"
299
- ret = <<~STYLE.gsub(/\n/, "")
300
- border-top:#{top}mso-border-top-alt:#{top}
301
- border-left:#{bottom}mso-border-top-alt:#{bottom}
302
- border-right:#{bottom}mso-border-top-alt:#{bottom}
303
- border-bottom:#{bottom}mso-border-bottom-alt:#{bottom}
304
- STYLE
305
- opt[:bordered] or ret = ""
306
- pb = keep_rows_together(cell, rowmax, totalrows, opt) ? "avoid" : "auto"
307
- "#{ret}page-break-after:#{pb};"
173
+ def commentary(isoxml, out)
174
+ isoxml.xpath(ns("//annex[@commentary = 'true']")).each do |c|
175
+ section_break(out)
176
+ out.div class: "WordSectionCommentary" do |div|
177
+ commentary_title(isoxml, div)
178
+ render_annex(div, c)
179
+ end
180
+ end
308
181
  end
309
182
 
310
- def new_fullcolspan_row(table, tfoot)
311
- # how many columns in the table?
312
- cols = 0
313
- table.at(".//tr").xpath("./td | ./th").each do |td|
314
- cols += (td["colspan"] ? td["colspan"].to_i : 1)
183
+ def render_annex(out, clause)
184
+ out.div **attr_code(annex_attrs(clause)) do |s|
185
+ clause.elements.each do |c1|
186
+ if c1.name == "title" then annex_name(clause, c1, s)
187
+ else parse(c1, s)
188
+ end
189
+ end
315
190
  end
316
- style = "border-top:0pt;mso-border-top-alt:0pt;" \
317
- "border-bottom:#{SW1} 1.5pt;mso-border-bottom-alt:#{SW1} 1.5pt;" \
318
- "border-left:#{SW1} 1.5pt;mso-border-left-alt:#{SW1} 1.5pt;" \
319
- "border-right:#{SW1} 1.5pt;mso-border-right-alt:#{SW1} 1.5pt;"
320
- tfoot.add_child("<tr><td colspan='#{cols}' style='#{style}'/></tr>")
321
- tfoot.xpath(".//td").last
322
191
  end
323
192
 
324
193
  include BaseConvert
@@ -1,5 +1,8 @@
1
1
  module IsoDoc
2
2
  module JIS
3
+ class Counter < IsoDoc::XrefGen::Counter
4
+ end
5
+
3
6
  class Xref < IsoDoc::Iso::Xref
4
7
  def annex_name_lbl(clause, num)
5
8
  obl = l10n("(#{@labels['inform_annex']})")
@@ -8,6 +11,48 @@ module IsoDoc
8
11
  title = Common::case_with_markup(@labels["annex"], "capital", @script)
9
12
  l10n("#{title} #{num}<br/>#{obl}")
10
13
  end
14
+
15
+ def back_anchor_names(xml)
16
+ if @parse_settings.empty? || @parse_settings[:clauses]
17
+ i = Counter.new("@")
18
+ xml.xpath(ns("//annex")).each do |c|
19
+ if c["commentary"] == "true"
20
+ commentary_names(c)
21
+ else
22
+ annex_names(c, i.increment(c).print)
23
+ end
24
+ end
25
+ xml.xpath(ns(@klass.bibliography_xpath)).each do |b|
26
+ preface_names(b)
27
+ end
28
+ xml.xpath(ns("//colophon/clause")).each { |b| preface_names(b) }
29
+ xml.xpath(ns("//indexsect")).each { |b| preface_names(b) }
30
+ end
31
+ references(xml) if @parse_settings.empty? || @parse_settings[:refs]
32
+ end
33
+
34
+ def commentary_names(clause)
35
+ preface_name_anchors(clause, 1, clause_title(clause))
36
+ clause.xpath(ns(SUBCLAUSES)).each_with_object(Counter.new) do |c, i|
37
+ commentary_names1(c, clause["id"], i.increment(c).print, 2)
38
+ end
39
+ end
40
+
41
+ def commentary_names1(clause, root, num, level)
42
+ commentary_name_anchors(clause, num, root, level)
43
+ clause.xpath(ns(SUBCLAUSES)).each_with_object(Counter.new) do |c, i|
44
+ commentary_names1(c, root, "#{num}.#{i.increment(c).print}",
45
+ level + 1)
46
+ end
47
+ end
48
+
49
+ def commentary_name_anchors(clause, num, root, level)
50
+ @anchors[clause["id"]] =
51
+ { label: num, xref: l10n("#{@labels['clause']} #{num}"),
52
+ container: root,
53
+ title: clause_title(clause), level: level, type: "clause",
54
+ elem: @labels["clause"] }
55
+ end
11
56
  end
12
57
  end
13
58
  end
@@ -31,12 +31,13 @@ module Metanorma
31
31
  xmldoc.xpath("//table | //figure").each do |t|
32
32
  seen = {}
33
33
  i = 0
34
- #t.xpath(".//fn[not(ancestor::name)]").each do |fn|
35
34
  t.xpath(".//fn").each do |fn|
36
35
  i, seen = table_footnote_renumber1(fn, i, seen)
37
36
  end
38
37
  end
39
38
  end
39
+
40
+ def docidentifier_cleanup(xmldoc); end
40
41
  end
41
42
  end
42
43
  end
@@ -29,6 +29,16 @@ module Metanorma
29
29
  File.join(@libdir, "jis_intro_jp.xml")
30
30
  end
31
31
 
32
+ def section_attributes(node)
33
+ ret = super
34
+ if node.attr("style") == "appendix" && node.level == 1 &&
35
+ node.option?("commentary")
36
+ ret[:commentary] = true
37
+ node.set_attr("obligation", "informative")
38
+ end
39
+ ret
40
+ end
41
+
32
42
  def html_converter(node)
33
43
  if node.nil?
34
44
  IsoDoc::JIS::HtmlConvert.new({})