isodoc 2.5.10 → 2.6.1

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/isodoc.gemspec +1 -1
  3. data/lib/isodoc/base_style/metanorma_word.css +3 -3
  4. data/lib/isodoc/base_style/metanorma_word.scss +5 -3
  5. data/lib/isodoc/common.rb +13 -13
  6. data/lib/isodoc/convert.rb +4 -2
  7. data/lib/isodoc/function/blocks.rb +1 -4
  8. data/lib/isodoc/function/blocks_example_note.rb +1 -7
  9. data/lib/isodoc/function/inline.rb +2 -2
  10. data/lib/isodoc/function/references.rb +13 -15
  11. data/lib/isodoc/function/section.rb +35 -63
  12. data/lib/isodoc/function/section_titles.rb +0 -14
  13. data/lib/isodoc/function/to_word_html.rb +44 -21
  14. data/lib/isodoc/function/utils.rb +1 -0
  15. data/lib/isodoc/html_function/footnotes.rb +2 -2
  16. data/lib/isodoc/html_function/html.rb +0 -10
  17. data/lib/isodoc/init.rb +11 -3
  18. data/lib/isodoc/metadata.rb +3 -3
  19. data/lib/isodoc/metadata_contributor.rb +7 -1
  20. data/lib/isodoc/presentation_function/erefs.rb +2 -2
  21. data/lib/isodoc/presentation_function/image.rb +22 -10
  22. data/lib/isodoc/presentation_function/inline.rb +12 -13
  23. data/lib/isodoc/presentation_function/refs.rb +16 -3
  24. data/lib/isodoc/presentation_function/section.rb +39 -20
  25. data/lib/isodoc/presentation_function/terms.rb +7 -0
  26. data/lib/isodoc/presentation_function/xrefs.rb +4 -4
  27. data/lib/isodoc/presentation_xml_convert.rb +3 -1
  28. data/lib/isodoc/version.rb +1 -1
  29. data/lib/isodoc/word_function/body.rb +15 -6
  30. data/lib/isodoc/word_function/inline.rb +3 -3
  31. data/lib/isodoc/word_function/postprocess.rb +20 -4
  32. data/lib/isodoc/xref/xref_gen.rb +5 -5
  33. data/lib/isodoc/xref/xref_sect_gen.rb +90 -34
  34. data/lib/isodoc-yaml/i18n-ar.yaml +1 -1
  35. data/lib/isodoc-yaml/i18n-de.yaml +1 -1
  36. data/lib/isodoc-yaml/i18n-en.yaml +1 -1
  37. data/lib/isodoc-yaml/i18n-es.yaml +1 -1
  38. data/lib/isodoc-yaml/i18n-fr.yaml +1 -1
  39. data/lib/isodoc-yaml/i18n-ja.yaml +1 -1
  40. data/lib/isodoc-yaml/i18n-ru.yaml +1 -1
  41. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -1
  42. metadata +4 -4
@@ -108,25 +108,37 @@ module IsoDoc
108
108
 
109
109
  def svg_to_emf(node)
110
110
  uri = svg_to_emf_uri(node)
111
- if node.elements&.first&.name == "svg" &&
112
- (!node["height"] || node["height"] == "auto")
113
- node["height"] = node.elements.first["height"]
114
- node["width"] = node.elements.first["width"]
115
- end
111
+ svg_impose_height_attr(node)
116
112
  ret = imgfile_suffix(uri, "emf")
117
- File.exist?(ret) and return ret
113
+ if File.exist?(ret) && File.exist?(node["src"])
114
+ warn "Exists: #{ret}, Exists: #{node['src']}"
115
+ return ret
116
+ end
117
+ warn "Converting..."
118
118
  inkscape_convert(uri, ret, '--export-type="emf"')
119
119
  end
120
120
 
121
+ def svg_impose_height_attr(node)
122
+ e = node.elements&.first or return
123
+ (e.name == "svg" &&
124
+ (!node["height"] || node["height"] == "auto")) or return
125
+ node["height"] = e["height"]
126
+ node["width"] = e["width"]
127
+ end
128
+
121
129
  def inkscape_convert(uri, file, option)
122
130
  exe = inkscape_installed? or raise "Inkscape missing in PATH, unable" \
123
131
  "to convert image #{uri}. Aborting."
124
132
  uri = Metanorma::Utils::external_path uri
125
133
  exe = Metanorma::Utils::external_path exe
126
- system(%(#{exe} #{option} #{uri})) and
127
- return Metanorma::Utils::datauri(file)
128
-
129
- raise %(Fail on #{exe} #{option} #{uri})
134
+ warn %(#{exe} #{option} #{uri})
135
+ err = system %(#{exe} #{option} #{uri})
136
+ File.exist?(file) and return Metanorma::Utils::datauri(file)
137
+ file2 = uri + File.extname(file)
138
+ warn "Checking #{file2}"
139
+ warn `ls #{File.dirname(file2)}`
140
+ File.exist?(file2) and return Metanorma::Utils::datauri(file2)
141
+ raise %(Fail on #{exe} #{option} #{uri} outputting #{file}: status #{err})
130
142
  end
131
143
 
132
144
  def svg_to_emf_uri(node)
@@ -10,10 +10,10 @@ module IsoDoc
10
10
 
11
11
  def get_linkend(node)
12
12
  node["style"] == "id" and anchor_id_postprocess(node)
13
- return unless xref_empty?(node)
14
-
15
- link = anchor_linkend(node, docid_l10n(node["target"] ||
16
- expand_citeas(node["citeas"])))
13
+ xref_empty?(node) or return
14
+ target = docid_l10n(node["target"]) ||
15
+ expand_citeas(docid_l10n(node["citeas"]))
16
+ link = anchor_linkend(node, target)
17
17
  link += eref_localities(node.xpath(ns("./locality | ./localityStack")),
18
18
  link, node)
19
19
  non_locality_elems(node).each(&:remove)
@@ -24,8 +24,7 @@ module IsoDoc
24
24
  # <locality type="section"><reference>3.1</reference></locality></origin>
25
25
 
26
26
  def unnest_linkend(node)
27
- return unless node.at(ns("./xref[@nested]"))
28
-
27
+ node.at(ns("./xref[@nested]")) or return
29
28
  node.xpath(ns("./xref[@nested]")).each { |x| x.delete("nested") }
30
29
  node.xpath(ns("./location | ./locationStack")).each(&:remove)
31
30
  node.replace(node.children)
@@ -64,15 +63,15 @@ module IsoDoc
64
63
  get_linkend(node)
65
64
  end
66
65
 
67
- def variant(docxml)
68
- docxml.xpath(ns("//variant")).each { |f| variant1(f) }
69
- docxml.xpath(ns("//variant[@remove = 'true']")).each(&:remove)
70
- docxml.xpath(ns("//variant")).each do |v|
71
- next unless v&.next&.name == "variant"
72
-
66
+ def variant(xml)
67
+ b = xml.xpath(ns("//bibdata//variant"))
68
+ (xml.xpath(ns("//variant")) - b).each { |f| variant1(f) }
69
+ (xml.xpath(ns("//variant[@remove = 'true']")) - b).each(&:remove)
70
+ (xml.xpath(ns("//variant")) - b).each do |v|
71
+ v.next&.name == "variant" or next
73
72
  v.next = "/"
74
73
  end
75
- docxml.xpath(ns("//variant")).each { |f| f.replace(f.children) }
74
+ (xml.xpath(ns("//variant")) - b).each { |f| f.replace(f.children) }
76
75
  end
77
76
 
78
77
  def variant1(node)
@@ -7,9 +7,21 @@ module IsoDoc
7
7
  bibitem(x, renderings)
8
8
  end
9
9
  hidden_items(docxml)
10
+ move_norm_ref_to_sections(docxml)
10
11
  @xrefs.parse_inclusions(refs: true).parse(docxml)
11
12
  end
12
13
 
14
+ def move_norm_ref_to_sections(docxml)
15
+ docxml.at(ns(@xrefs.klass.norm_ref_xpath)) or return
16
+ s = docxml.at(ns("//sections")) ||
17
+ docxml.at(ns("//preface"))&.after("<sections/>")&.next_element ||
18
+ docxml.at(ns("//annex | //bibliography"))&.before("<sections/>")
19
+ &.previous_element or return
20
+ docxml.xpath(ns(@xrefs.klass.norm_ref_xpath)).each do |r|
21
+ s << r.remove
22
+ end
23
+ end
24
+
13
25
  def hidden_items(docxml)
14
26
  docxml.xpath(ns("//references[bibitem/@hidden = 'true']")).each do |x|
15
27
  x.at(ns("./bibitem[not(@hidden = 'true')]")) and next
@@ -131,7 +143,8 @@ module IsoDoc
131
143
  idents = @xrefs.klass.render_identifier(ids)
132
144
  ret = if biblio then biblio_ref_entry_code(ordinal, idents, ids,
133
145
  standard, datefn, bib)
134
- else norm_ref_entry_code(ordinal, idents, ids, standard, datefn, bib)
146
+ else norm_ref_entry_code(ordinal, idents, ids, standard, datefn,
147
+ bib)
135
148
  end
136
149
  bib << "<biblio-tag>#{ret}</biblio-tag>"
137
150
  end
@@ -148,8 +161,8 @@ module IsoDoc
148
161
 
149
162
  # if ids is just a number, only use that ([1] Non-Standard)
150
163
  # else, use both ordinal, as prefix, and ids
151
- def biblio_ref_entry_code(ordinal, ids, _id, standard, datefn, _bib)
152
- #standard and id = nil
164
+ def biblio_ref_entry_code(ordinal, ids, _id, _standard, datefn, _bib)
165
+ # standard and id = nil
153
166
  ret = (ids[:ordinal] || ids[:metanorma] || "[#{ordinal}]")
154
167
  if ids[:sdo]
155
168
  ret = prefix_bracketed_ref(ret)
@@ -2,6 +2,14 @@ require_relative "refs"
2
2
 
3
3
  module IsoDoc
4
4
  class PresentationXMLConvert < ::IsoDoc::Convert
5
+ def middle_title(docxml)
6
+ s = docxml.at(ns("//sections")) or return
7
+ t = @meta.get[:doctitle]
8
+ t.nil? || t.empty? and return
9
+ s.children.first.previous =
10
+ "<p class='zzSTDTitle1'>#{t}</p>"
11
+ end
12
+
5
13
  def clause(docxml)
6
14
  docxml.xpath(ns("//clause | " \
7
15
  "//terms | //definitions | //references"))
@@ -17,19 +25,18 @@ module IsoDoc
17
25
  level = @xrefs.anchor(elem["id"], :level, false) ||
18
26
  (elem.ancestors("clause, annex").size + 1)
19
27
  t = elem.at(ns("./title")) and t["depth"] = level
20
- return if !elem.ancestors("boilerplate, metanorma-extension").empty? ||
21
- @suppressheadingnumbers || elem["unnumbered"]
22
-
28
+ !elem.ancestors("boilerplate, metanorma-extension").empty? ||
29
+ @suppressheadingnumbers || elem["unnumbered"] and return
23
30
  lbl = @xrefs.anchor(elem["id"], :label,
24
31
  elem.parent.name != "sections") or return
25
32
  prefix_name(elem, "<tab/>", "#{lbl}#{clausedelim}", "title")
26
33
  end
27
34
 
28
35
  def floattitle(docxml)
29
- docxml.xpath(ns("//clause | //annex | //appendix | //introduction | " \
30
- "//foreword | //preface/abstract | //acknowledgements | " \
31
- "//terms | //definitions | //references | //colophon"))
32
- .each do |f|
36
+ p = "//clause | //annex | //appendix | //introduction | //foreword | " \
37
+ "//preface/abstract | //acknowledgements | //terms | " \
38
+ "//definitions | //references | //colophon | //indexsect"
39
+ docxml.xpath(ns(p)).each do |f|
33
40
  floattitle1(f)
34
41
  end
35
42
  # top-level
@@ -94,9 +101,9 @@ module IsoDoc
94
101
  end
95
102
 
96
103
  def display_order_at(docxml, xpath, idx)
97
- return idx unless c = docxml.at(ns(xpath))
98
-
104
+ c = docxml.at(ns(xpath)) or return idx
99
105
  idx += 1
106
+ idx = preceding_floating_titles(c, idx)
100
107
  c["displayorder"] = idx
101
108
  idx
102
109
  end
@@ -104,24 +111,36 @@ module IsoDoc
104
111
  def display_order_xpath(docxml, xpath, idx)
105
112
  docxml.xpath(ns(xpath)).each do |c|
106
113
  idx += 1
114
+ idx = preceding_floating_titles(c, idx)
115
+ c["displayorder"] = idx
116
+ end
117
+ idx
118
+ end
119
+
120
+ def preceding_floating_titles(node, idx)
121
+ out = node.xpath("./preceding-sibling::*")
122
+ .reverse.each_with_object([]) do |p, m|
123
+ %w(note admonition p).include?(p.name) or break m
124
+ m << p
125
+ end
126
+ out.reject { |c| c["displayorder"] }.reverse.each do |c|
107
127
  c["displayorder"] = idx
128
+ idx += 1
108
129
  end
109
130
  idx
110
131
  end
111
132
 
112
133
  def display_order(docxml)
113
134
  i = 0
114
- i = display_order_xpath(docxml, "//preface/*", i)
115
- i = display_order_at(docxml, "//clause[@type = 'scope']", i)
116
- i = display_order_at(docxml, @xrefs.klass.norm_ref_xpath, i)
117
- i = display_order_at(docxml, "//sections/terms | " \
118
- "//sections/clause[descendant::terms]", i)
119
- i = display_order_at(docxml, "//sections/definitions", i)
120
- i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
121
- i = display_order_xpath(docxml, "//annex", i)
122
- i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
123
- i = display_order_xpath(docxml, "//indexsect", i)
124
- display_order_xpath(docxml, "//colophon/*", i)
135
+ d = @xrefs.clause_order(docxml)
136
+ %i(preface main annex back).each do |s|
137
+ d[s].each do |a|
138
+ i = if a[:multi]
139
+ display_order_xpath(docxml, a[:path], i)
140
+ else display_order_at(docxml, a[:path], i)
141
+ end
142
+ end
143
+ end
125
144
  end
126
145
 
127
146
  def clausetitle(docxml)
@@ -52,6 +52,7 @@ module IsoDoc
52
52
  name << ", #{designation_grammar(g).join(', ')}"
53
53
  designation_localization(desgn, name)
54
54
  designation_pronunciation(desgn, name)
55
+ designation_bookmarks(desgn, name)
55
56
  desgn.children = name.children
56
57
  end
57
58
 
@@ -94,6 +95,12 @@ module IsoDoc
94
95
  name << ", /#{to_xml(f.children)}/"
95
96
  end
96
97
 
98
+ def designation_bookmarks(desgn, name)
99
+ desgn.xpath(ns(".//bookmark")).each do |b|
100
+ name << b.remove
101
+ end
102
+ end
103
+
97
104
  def termexample(docxml)
98
105
  docxml.xpath(ns("//termexample")).each { |f| example1(f) }
99
106
  end
@@ -1,8 +1,8 @@
1
1
  module IsoDoc
2
2
  class PresentationXMLConvert < ::IsoDoc::Convert
3
3
  def prefix_container(container, linkend, node, _target)
4
- l10n(@i18n.nested_xref.sub(/%1/, anchor_xref(node, container))
5
- .sub(/%2/, linkend))
4
+ l10n(@i18n.nested_xref.sub("%1", anchor_xref(node, container))
5
+ .sub("%2", linkend))
6
6
  end
7
7
 
8
8
  def anchor_value(id)
@@ -133,8 +133,8 @@ module IsoDoc
133
133
  end
134
134
 
135
135
  def i18n_chain_boolean(value, entry)
136
- @i18n.send("chain_#{entry[:conn]}").sub(/%1/, value)
137
- .sub(/%2/, loc2xref(entry))
136
+ @i18n.send("chain_#{entry[:conn]}").sub("%1", value)
137
+ .sub("%2", loc2xref(entry))
138
138
  end
139
139
 
140
140
  def can_conflate_xref_rendering?(locs)
@@ -47,9 +47,11 @@ module IsoDoc
47
47
  # to deal with single-term and single-ref annexes
48
48
  def section(docxml)
49
49
  references docxml
50
+ # feeds middle_title
50
51
  # triggers xrefs reparse, so put references before all other sections,
51
52
  # which alter titles and thus can alter xrefs
52
- rearrange_clauses docxml # feeds toc, display_order, clausetitle, clause
53
+ rearrange_clauses docxml # feeds toc, display_order, clausetitle, clause, middle_title
54
+ middle_title docxml
53
55
  annex docxml
54
56
  clause docxml # feeds clausetitle
55
57
  term docxml
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.5.10".freeze
2
+ VERSION = "2.6.1".freeze
3
3
  end
@@ -1,6 +1,6 @@
1
- require_relative "./table"
2
- require_relative "./inline"
3
- require_relative "./lists"
1
+ require_relative "table"
2
+ require_relative "inline"
3
+ require_relative "lists"
4
4
 
5
5
  module IsoDoc
6
6
  module WordFunction
@@ -29,25 +29,34 @@ module IsoDoc
29
29
  def make_body2(body, docxml)
30
30
  body.div class: "WordSection2" do |div2|
31
31
  boilerplate docxml, div2
32
- front docxml, div2
32
+ content(div2, docxml, ns("//preface/*[@displayorder]"))
33
33
  div2.p { |p| p << "&#xa0;" } # placeholder
34
34
  end
35
35
  section_break(body)
36
36
  end
37
37
 
38
+ MAIN_ELEMENTS =
39
+ "//sections/*[@displayorder] | //annex[@displayorder] | " \
40
+ "//bibliography/*[@displayorder] | //colophon/*[@displayorder] | " \
41
+ "//indexsect[@displayorder]".freeze
42
+
38
43
  def make_body3(body, docxml)
39
44
  body.div class: "WordSection3" do |div3|
40
- middle docxml, div3
45
+ content(div3, docxml, ns(self.class::MAIN_ELEMENTS))
41
46
  footnotes div3
42
47
  comments div3
43
48
  end
44
49
  end
45
50
 
46
- def para_class(_node)
51
+ def para_class(node)
47
52
  return "Sourcecode" if @annotation
48
53
  return "MsoCommentText" if @in_comment
49
54
  return "Note" if @note
55
+ if node["type"] == "floating-title"
56
+ return "h#{node['depth']}"
57
+ end
50
58
 
59
+ n = node["class"] and return n
51
60
  nil
52
61
  end
53
62
 
@@ -8,7 +8,7 @@ module IsoDoc
8
8
  end
9
9
 
10
10
  def section_break(body, continuous: false)
11
- body.p do |p|
11
+ body.p class: "section-break" do |p|
12
12
  if continuous
13
13
  p.br clear: "all", style: "page-break-before:auto;" \
14
14
  "mso-break-type:section-break"
@@ -19,7 +19,7 @@ module IsoDoc
19
19
  end
20
20
 
21
21
  def page_break(out)
22
- out.p do |p|
22
+ out.p class: "page-break" do |p|
23
23
  p.br clear: "all",
24
24
  style: "mso-special-character:line-break;" \
25
25
  "page-break-before:always"
@@ -58,7 +58,7 @@ module IsoDoc
58
58
 
59
59
  def xref_parse(node, out)
60
60
  target = if /#/.match?(node["target"])
61
- node["target"].sub(/#/, ".doc#")
61
+ node["target"].sub("#", ".doc#")
62
62
  else
63
63
  "##{node['target']}"
64
64
  end
@@ -1,7 +1,7 @@
1
1
  require "fileutils"
2
- require_relative "./postprocess_cover"
3
- require_relative "./postprocess_toc"
4
- require_relative "./postprocess_table"
2
+ require_relative "postprocess_cover"
3
+ require_relative "postprocess_toc"
4
+ require_relative "postprocess_table"
5
5
 
6
6
  module IsoDoc
7
7
  module WordFunction
@@ -16,7 +16,7 @@ module IsoDoc
16
16
 
17
17
  def toWord(result, filename, dir, header)
18
18
  result = from_xhtml(word_cleanup(to_xhtml(result)))
19
- .gsub(/-DOUBLE_HYPHEN_ESCAPE-/, "--")
19
+ .gsub("-DOUBLE_HYPHEN_ESCAPE-", "--")
20
20
  @wordstylesheet = wordstylesheet_update
21
21
  Html2Doc.new(
22
22
  filename: filename, imagedir: @localdir,
@@ -56,6 +56,7 @@ module IsoDoc
56
56
  word_example_cleanup(docxml)
57
57
  word_pseudocode_cleanup(docxml)
58
58
  word_image_caption(docxml)
59
+ word_floating_titles(docxml)
59
60
  word_section_breaks(docxml)
60
61
  word_tab_clean(docxml)
61
62
  authority_cleanup(docxml)
@@ -173,6 +174,21 @@ module IsoDoc
173
174
  end
174
175
  docxml
175
176
  end
177
+
178
+ # move p.h1 (floating title) after any page, section breaks
179
+ def word_floating_titles(docxml)
180
+ docxml.xpath("//p[@class = 'section-break' or @class = 'page-break']")
181
+ .each do |b|
182
+ out = b.xpath("./preceding-sibling::*").reverse
183
+ .each_with_object([]) do |p, m|
184
+ (p.name == "p" && p["class"] == "h1") or break m
185
+ m << p
186
+ end
187
+ b.delete("class")
188
+ out.empty? and next
189
+ out[-1].previous = b.remove
190
+ end
191
+ end
176
192
  end
177
193
  end
178
194
  end
@@ -44,7 +44,7 @@ module IsoDoc
44
44
  end
45
45
 
46
46
  def termnote_label(note)
47
- @labels["termnote"].gsub(/%/, note.to_s)
47
+ @labels["termnote"].gsub("%", note.to_s)
48
48
  end
49
49
 
50
50
  def increment_label(elems, node, counter, increment: true)
@@ -194,11 +194,11 @@ refer_list)
194
194
 
195
195
  def list_item_anchor_label(label, list_anchor, prev_label, refer_list)
196
196
  prev_label.empty? or
197
- label = @i18n.list_nested_xref.sub(/%1/, "#{prev_label})")
198
- .sub(/%2/, label)
197
+ label = @i18n.list_nested_xref.sub("%1", "#{prev_label})")
198
+ .sub("%2", label)
199
199
  refer_list and
200
- label = @i18n.list_nested_xref.sub(/%1/, list_anchor[:xref])
201
- .sub(/%2/, label)
200
+ label = @i18n.list_nested_xref.sub("%1", list_anchor[:xref])
201
+ .sub("%2", label)
202
202
  label
203
203
  end
204
204
 
@@ -1,18 +1,66 @@
1
1
  module IsoDoc
2
2
  module XrefGen
3
3
  module Sections
4
+ def clause_order(docxml)
5
+ { preface: clause_order_preface(docxml),
6
+ main: clause_order_main(docxml),
7
+ annex: clause_order_annex(docxml),
8
+ back: clause_order_back(docxml) }
9
+ end
10
+
11
+ def clause_order_preface(_docxml)
12
+ [{ path: "//preface/*", multi: true }]
13
+ end
14
+
15
+ def clause_order_main(docxml)
16
+ [
17
+ { path: "//clause[@type = 'scope']" },
18
+ { path: @klass.norm_ref_xpath },
19
+ { path: "//sections/terms | " \
20
+ "//sections/clause[descendant::terms]" },
21
+ { path: "//sections/definitions | " \
22
+ "//sections/clause[descendant::definitions][not(descendant::terms)]" },
23
+ { path: @klass.middle_clause(docxml), multi: true },
24
+ ]
25
+ end
26
+
27
+ def clause_order_annex(_docxml)
28
+ [{ path: "//annex", multi: true }]
29
+ end
30
+
31
+ def clause_order_back(_docxml)
32
+ [
33
+ { path: @klass.bibliography_xpath },
34
+ { path: "//indexsect", multi: true },
35
+ { path: "//colophon/*", multi: true },
36
+ ]
37
+ end
38
+
4
39
  def back_anchor_names(xml)
5
40
  if @parse_settings.empty? || @parse_settings[:clauses]
6
- i = Counter.new("@")
7
- xml.xpath(ns("//annex")).each do |c|
41
+ annex_anchor_names(xml)
42
+ back_clauses_anchor_names(xml)
43
+ end
44
+ references(xml) if @parse_settings.empty? || @parse_settings[:refs]
45
+ end
46
+
47
+ def annex_anchor_names(xml)
48
+ i = Counter.new("@")
49
+ clause_order_annex(xml).each do |a|
50
+ xml.xpath(ns(a[:path])).each do |c|
8
51
  annex_names(c, i.increment(c).print)
52
+ a[:multi] or break
9
53
  end
10
- xml.xpath(ns(@klass.bibliography_xpath)).each do |b|
11
- preface_names(b)
54
+ end
55
+ end
56
+
57
+ def back_clauses_anchor_names(xml)
58
+ clause_order_back(xml).each do |a|
59
+ xml.xpath(ns(a[:path])).each do |c|
60
+ back_names(c)
61
+ a[:multi] or break
12
62
  end
13
- xml.xpath(ns("//colophon/clause")).each { |b| preface_names(b) }
14
63
  end
15
- references(xml) if @parse_settings.empty? || @parse_settings[:refs]
16
64
  end
17
65
 
18
66
  def references(docxml)
@@ -21,20 +69,29 @@ module IsoDoc
21
69
  end
22
70
  end
23
71
 
24
- def initial_anchor_names(doc)
72
+ def initial_anchor_names(xml)
25
73
  if @parse_settings.empty? || @parse_settings[:clauses]
26
- doc.xpath(ns("//preface/*")).each do |c|
27
- c.element? and preface_names(c)
74
+ preface_anchor_names(xml)
75
+ main_anchor_names(xml)
76
+ end
77
+ end
78
+
79
+ def preface_anchor_names(xml)
80
+ clause_order_preface(xml).each do |a|
81
+ xml.xpath(ns(a[:path])).each do |c|
82
+ preface_names(c)
83
+ a[:multi] or break
84
+ end
85
+ end
86
+ end
87
+
88
+ def main_anchor_names(xml)
89
+ n = Counter.new
90
+ clause_order_main(xml).each do |a|
91
+ xml.xpath(ns(a[:path])).each do |c|
92
+ section_names(c, n, 1)
93
+ a[:multi] or break
28
94
  end
29
- # potentially overridden in middle_section_asset_names()
30
- sequential_asset_names(doc.xpath(ns("//preface/*")))
31
- n = Counter.new
32
- n = section_names(doc.at(ns("//clause[@type = 'scope']")), n, 1)
33
- n = section_names(doc.at(ns(@klass.norm_ref_xpath)), n, 1)
34
- n = section_names(doc.at(ns("//sections/terms | " \
35
- "//sections/clause[descendant::terms]")), n, 1)
36
- n = section_names(doc.at(ns("//sections/definitions")), n, 1)
37
- clause_names(doc, n)
38
95
  end
39
96
  end
40
97
 
@@ -57,8 +114,7 @@ module IsoDoc
57
114
  ret = clause.at(ns("./title"))&.text
58
115
  if use_elem_name && !ret
59
116
  clause.name.capitalize
60
- else
61
- ret
117
+ else ret
62
118
  end
63
119
  end
64
120
 
@@ -67,8 +123,15 @@ module IsoDoc
67
123
 
68
124
  # in StanDoc, prefaces have no numbering; they are referenced only by title
69
125
  def preface_names(clause)
70
- return if clause.nil?
126
+ unnumbered_names(clause)
127
+ end
128
+
129
+ def back_names(clause)
130
+ unnumbered_names(clause)
131
+ end
71
132
 
133
+ def unnumbered_names(clause)
134
+ clause.nil? and return
72
135
  preface_name_anchors(clause, 1,
73
136
  clause_title(clause, use_elem_name: true))
74
137
  clause.xpath(ns(SUBCLAUSES)).each_with_index do |c, i|
@@ -94,23 +157,15 @@ module IsoDoc
94
157
  end
95
158
 
96
159
  def middle_section_asset_names(doc)
97
- middle_sections = "//clause[@type = 'scope'] | " \
98
- "#{@klass.norm_ref_xpath} | " \
99
- "//sections/terms | //preface/* | " \
100
- "//sections/definitions | //clause[parent::sections]"
160
+ middle_sections =
161
+ "//clause[@type = 'scope'] | #{@klass.norm_ref_xpath} | " \
162
+ "//sections/terms | //preface/* | " \
163
+ "//sections/definitions | //clause[parent::sections]"
101
164
  sequential_asset_names(doc.xpath(ns(middle_sections)))
102
165
  end
103
166
 
104
- def clause_names(docxml, num)
105
- docxml.xpath(ns(@klass.middle_clause(docxml)))
106
- .each_with_index do |c, _i|
107
- section_names(c, num, 1)
108
- end
109
- end
110
-
111
167
  def section_names(clause, num, lvl)
112
168
  clause.nil? and return num
113
-
114
169
  num.increment(clause)
115
170
  section_name_anchors(clause, num.print, lvl)
116
171
  clause.xpath(ns(SUBCLAUSES)).each_with_object(Counter.new) do |c, i|
@@ -138,7 +193,8 @@ module IsoDoc
138
193
  obl = l10n("(#{@labels['inform_annex']})")
139
194
  clause["obligation"] == "normative" and
140
195
  obl = l10n("(#{@labels['norm_annex']})")
141
- title = Common::case_with_markup(@labels["annex"], "capital", @script)
196
+ title = Common::case_with_markup(@labels["annex"], "capital",
197
+ @script)
142
198
  l10n("<strong>#{title} #{num}</strong><br/>#{obl}")
143
199
  end
144
200
 
@@ -30,7 +30,7 @@ external_terms_boilerplate: |
30
30
  <p> لأغراض هذا المستند ، تنطبق المصطلحات والتعريفات الواردة في%. </ p>
31
31
  internal_external_terms_boilerplate: |
32
32
  <p>لأغراض هذه الوثيقة ،تنطبق المصطلحات والتعاريف الواردة في % وما يلي.</p>
33
- term_defined_in: "[المصطلح المحدد في %]"
33
+ term_defined_in: "(%)"
34
34
  binary_and: "%1 و %2"
35
35
  multiple_and: "%1, و %2"
36
36
  binary_or: "%1 او %2"
@@ -32,7 +32,7 @@ external_terms_boilerplate: |
32
32
  <p>Für die Zwecke dieses Dokuments gelten die in % angegebenen Begriffe und Definitionen.</p>
33
33
  internal_external_terms_boilerplate: |
34
34
  <p>Für die Zwecke dieses Dokuments gelten die in % und im Folgenden aufgeführten Begriffe und Definitionen.</p>
35
- term_defined_in: "[Begriff definiert in %]"
35
+ term_defined_in: "(%)"
36
36
  binary_and: "%1 und %2"
37
37
  multiple_and: "%1, und %2"
38
38
  binary_or: "%1 oder %2"
@@ -38,7 +38,7 @@ external_terms_boilerplate: |
38
38
  internal_external_terms_boilerplate: |
39
39
  <p>For the purposes of this document, the terms and definitions
40
40
  given in % and the following apply.</p>
41
- term_defined_in: "[term defined in %]"
41
+ term_defined_in: "(%)"
42
42
  binary_and: "%1 and %2"
43
43
  multiple_and: "%1, and %2"
44
44
  binary_or: "%1 or %2"