isodoc 2.12.1 → 2.12.3

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/isodoc.gemspec +1 -1
  3. data/lib/isodoc/convert.rb +0 -21
  4. data/lib/isodoc/function/blocks.rb +8 -8
  5. data/lib/isodoc/function/blocks_example_note.rb +46 -23
  6. data/lib/isodoc/function/inline.rb +31 -8
  7. data/lib/isodoc/function/lists.rb +4 -4
  8. data/lib/isodoc/function/references.rb +5 -5
  9. data/lib/isodoc/function/reqt.rb +2 -2
  10. data/lib/isodoc/function/section.rb +25 -25
  11. data/lib/isodoc/function/section_titles.rb +15 -12
  12. data/lib/isodoc/function/table.rb +1 -1
  13. data/lib/isodoc/function/terms.rb +17 -14
  14. data/lib/isodoc/function/to_word_html.rb +5 -0
  15. data/lib/isodoc/html_function/footnotes.rb +2 -1
  16. data/lib/isodoc/html_function/html.rb +1 -5
  17. data/lib/isodoc/init.rb +14 -4
  18. data/lib/isodoc/metadata.rb +9 -0
  19. data/lib/isodoc/metadata_contributor.rb +1 -1
  20. data/lib/isodoc/metadata_date.rb +1 -1
  21. data/lib/isodoc/presentation_function/autonum.rb +139 -0
  22. data/lib/isodoc/presentation_function/block.rb +48 -39
  23. data/lib/isodoc/presentation_function/docid.rb +0 -23
  24. data/lib/isodoc/presentation_function/erefs.rb +4 -2
  25. data/lib/isodoc/presentation_function/image.rb +21 -5
  26. data/lib/isodoc/presentation_function/inline.rb +1 -1
  27. data/lib/isodoc/presentation_function/reqt.rb +1 -1
  28. data/lib/isodoc/presentation_function/section.rb +46 -118
  29. data/lib/isodoc/presentation_function/sourcecode.rb +7 -4
  30. data/lib/isodoc/presentation_function/terms.rb +3 -4
  31. data/lib/isodoc/presentation_function/title.rb +107 -0
  32. data/lib/isodoc/presentation_function/xrefs.rb +17 -10
  33. data/lib/isodoc/presentation_xml_convert.rb +2 -1
  34. data/lib/isodoc/version.rb +1 -1
  35. data/lib/isodoc/word_function/body.rb +7 -35
  36. data/lib/isodoc/word_function/footnotes.rb +1 -1
  37. data/lib/isodoc/word_function/lists.rb +12 -10
  38. data/lib/isodoc/word_function/postprocess_cover.rb +0 -2
  39. data/lib/isodoc/word_function/postprocess_table.rb +1 -1
  40. data/lib/isodoc/word_function/postprocess_toc.rb +1 -1
  41. data/lib/isodoc/word_function/table.rb +2 -2
  42. data/lib/isodoc/xref/xref_anchor.rb +31 -16
  43. data/lib/isodoc/xref/xref_counter_types.rb +3 -2
  44. data/lib/isodoc/xref/xref_gen.rb +57 -33
  45. data/lib/isodoc/xref/xref_gen_seq.rb +145 -56
  46. data/lib/isodoc/xref/xref_sect_gen.rb +60 -28
  47. data/lib/isodoc/xref/xref_util.rb +43 -1
  48. data/lib/isodoc/xref.rb +3 -0
  49. data/lib/isodoc-yaml/i18n-ar.yaml +9 -9
  50. data/lib/isodoc-yaml/i18n-de.yaml +9 -9
  51. data/lib/isodoc-yaml/i18n-en.yaml +9 -9
  52. data/lib/isodoc-yaml/i18n-es.yaml +9 -9
  53. data/lib/isodoc-yaml/i18n-fr.yaml +9 -9
  54. data/lib/isodoc-yaml/i18n-ja.yaml +10 -10
  55. data/lib/isodoc-yaml/i18n-ru.yaml +9 -9
  56. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +9 -9
  57. data/lib/nokogiri/xml/node.rb +1 -0
  58. metadata +6 -4
@@ -28,24 +28,27 @@ module IsoDoc
28
28
  end
29
29
  end
30
30
 
31
- def para_then_remainder(first, node, para, div)
32
- if first.name == "p"
33
- first.children.each { |n| parse(n, para) }
34
- node.elements.drop(1).each { |n| parse(n, div) }
35
- else
36
- node.elements.each { |n| parse(n, div) }
37
- end
31
+ def termnote_p_class
32
+ nil
38
33
  end
39
34
 
40
35
  def termnote_parse(node, out)
41
- name = node&.at(ns("./name"))&.remove
36
+ para = block_body_first_elem(node)
42
37
  out.div **note_attrs(node) do |div|
43
- div.p do |p|
44
- name&.children&.each { |n| parse(n, p) }
45
- p << " "
46
- para_then_remainder(node.first_element_child, node, p, div)
47
- end
38
+ termnote_parse1(node, para, div)
39
+ para&.xpath("./following-sibling::*")&.each { |n| parse(n, div) }
40
+ end
41
+ end
42
+
43
+ def termnote_parse1(node, para, div)
44
+ div.p **attr_code(class: termnote_p_class) do |p|
45
+ name = node.at(ns("./fmt-name")) and
46
+ p.span class: "termnote_label" do |s|
47
+ children_parse(name, s)
48
+ end
49
+ para&.name == "p" and children_parse(para, p)
48
50
  end
51
+ para&.name != "p" and parse(para, div)
49
52
  end
50
53
 
51
54
  def termref_parse(node, out)
@@ -60,7 +63,7 @@ module IsoDoc
60
63
  end
61
64
 
62
65
  def termdef_parse(node, out)
63
- name = node.at(ns("./name"))&.remove
66
+ name = node.at(ns("./fmt-name"))&.remove
64
67
  out.p class: "TermNum", id: node["id"] do |p|
65
68
  name&.children&.each { |n| parse(n, p) }
66
69
  end
@@ -262,6 +262,11 @@ module IsoDoc
262
262
  when "ruby" then ruby_parse(node, out)
263
263
  when "rt" then rt_parse(node, out)
264
264
  when "rb" then rb_parse(node, out)
265
+ when "semx" then semx_parse(node, out)
266
+ when "name" then name_parse(node, out)
267
+ when "fmt-xref-label" then xref_label_parse(node, out)
268
+ when "fmt-name" then fmt_name_parse(node, out)
269
+ when "floating-title" then floating_title_parse(node, out)
265
270
  else error_parse(node, out)
266
271
  end
267
272
  end
@@ -24,6 +24,7 @@ module IsoDoc
24
24
  end
25
25
  end
26
26
 
27
+ # Move to Presentation XML, as <fmt-footnote>: it's a footnote body
27
28
  def make_table_footnote_text(node, fnid, fnref)
28
29
  attrs = { id: "fn:#{fnid}" }
29
30
  noko do |xml|
@@ -68,7 +69,7 @@ module IsoDoc
68
69
 
69
70
  def footnote_parse(node, out)
70
71
  return table_footnote_parse(node, out) if (@in_table || @in_figure) &&
71
- !node.ancestors.map(&:name).include?("name")
72
+ !node.ancestors.map(&:name).include?("fmt-name")
72
73
 
73
74
  fn = node["reference"] || UUIDTools::UUID.random_create.to_s
74
75
  attrs = { class: "FootnoteRef", href: "#fn:#{fn}" }
@@ -15,10 +15,6 @@ module IsoDoc
15
15
  end.join("\n")
16
16
  end
17
17
 
18
- def preprocess_xslt(docxml)
19
- super
20
- end
21
-
22
18
  def make_body1(body, _docxml)
23
19
  return if @bare
24
20
 
@@ -78,7 +74,7 @@ module IsoDoc
78
74
  end
79
75
 
80
76
  def sourcecode_parse(node, out)
81
- name = node.at(ns("./name"))
77
+ name = node.at(ns("./fmt-name"))
82
78
  tag = node.at(ns(".//sourcecode | .//table")) ? "div" : "pre"
83
79
  attr = sourcecode_attrs(node).merge(class: "sourcecode")
84
80
  out.send tag, **attr do |div|
data/lib/isodoc/init.rb CHANGED
@@ -141,13 +141,14 @@ module IsoDoc
141
141
  self.class::AGENCIES.include?(text)
142
142
  end
143
143
 
144
- # This is highly specific to ISO, but it's not a bad precedent for
145
- # references anyway; keeping here instead of in IsoDoc::Iso for now
146
144
  def docid_l10n(text)
147
145
  text.nil? and return text
148
146
  @i18n.all_parts and text.gsub!(/All Parts/i, @i18n.all_parts.downcase)
149
- text.size < 20 and text.gsub!(/ /, "&#xa0;")
150
- text
147
+ x = Nokogiri::XML::DocumentFragment.parse(text)
148
+ (x.xpath(".//text()") - x.xpath(".//fn//text()")).each do |n|
149
+ n.replace(n.text.gsub(/ /, "&#xa0;"))
150
+ end
151
+ to_xml(x)
151
152
  end
152
153
 
153
154
  def docid_prefix(prefix, docid)
@@ -161,5 +162,14 @@ module IsoDoc
161
162
  %w(ISO IEC IEV ITU W3C BIPM csd metanorma repository metanorma-ordinal)
162
163
  .include? prefix
163
164
  end
165
+
166
+ def connectives_spans(text)
167
+ text.gsub("<conn>", "<span class='fmt-conn'>")
168
+ .gsub("</conn>", "</span>")
169
+ .gsub("<enum-comma>", "<span class='fmt-enum-comma'>")
170
+ .gsub("</enum-comma>", "</span>")
171
+ .gsub("<comma>", "<span class='fmt-comma'>")
172
+ .gsub("</comma>", "</span>")
173
+ end
164
174
  end
165
175
  end
@@ -13,6 +13,15 @@ module IsoDoc
13
13
  @i18n.l10n(expr, lang, script, locale)
14
14
  end
15
15
 
16
+ def connectives_strip(text)
17
+ text.gsub("<conn>", "")
18
+ .gsub("</conn>", "")
19
+ .gsub("<enum-comma>", "")
20
+ .gsub("</enum-comma>", "")
21
+ .gsub("<comma>", "")
22
+ .gsub("</comma>", "")
23
+ end
24
+
16
25
  def initialize(lang, script, locale, i18n, fonts_options = {})
17
26
  @metadata = { lang:, script: }
18
27
  DATETYPES.each { |w| @metadata["#{w.tr('-', '_')}date".to_sym] = "XXX" }
@@ -79,7 +79,7 @@ module IsoDoc
79
79
  def agency(xml)
80
80
  agency, publisher = agency1(xml)
81
81
  set(:agency, agency.sub(%r{/$}, ""))
82
- set(:publisher, @i18n.boolean_conj(publisher, "and"))
82
+ set(:publisher, connectives_strip(@i18n.boolean_conj(publisher, "and")))
83
83
  agency_addr(xml)
84
84
  end
85
85
 
@@ -42,7 +42,7 @@ module IsoDoc
42
42
 
43
43
  def bibdate(isoxml, _out)
44
44
  isoxml.xpath(ns("//bibdata/date")).each do |d|
45
- set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
45
+ set("#{d['type'].tr('-', '_')}date".to_sym, Common::date_range(d))
46
46
  end
47
47
  end
48
48
  end
@@ -0,0 +1,139 @@
1
+ module IsoDoc
2
+ class PresentationXMLConvert < ::IsoDoc::Convert
3
+ def prefix_name(node, delims, label, elem)
4
+ label, delims = prefix_name_defaults(node, delims, label)
5
+ name, ins, ids, number = prefix_name_prep(node, elem)
6
+ ins.next = fmt_xref_label(label, number, ids)
7
+ # autonum can be empty, e.g single note in clause: "NOTE []"
8
+ number and node["autonum"] = number.gsub(/<[^>]+>/, "")
9
+ !node.at(ns("./fmt-#{elem}")) &&
10
+ (c = fmt_caption(label, elem, name, ids, delims)) and ins.next = c
11
+ prefix_name_postprocess(node, elem)
12
+ end
13
+
14
+ def prefix_name_defaults(node, delims, label)
15
+ label&.empty? and label = nil
16
+ delims.nil? and delims = {}
17
+ [label, delims]
18
+ end
19
+
20
+ def prefix_name_prep(node, elem)
21
+ lbls = prefix_name_labels(node)
22
+ name = node.at(ns("./#{elem}")) and name["id"] = lbls[:name]
23
+ ins = name || node.add_first_child("<sentinel/>").elements.first
24
+ node["unnumbered"] or
25
+ number = @xrefs.anchor(node["id"], :value, false)&.strip
26
+ [name, ins, lbls, number]
27
+ end
28
+
29
+ def prefix_name_labels(node)
30
+ { elem: node["id"],
31
+ name: "_#{UUIDTools::UUID.random_create}" }
32
+ end
33
+
34
+ def prefix_name_postprocess(node, elem)
35
+ node.at(ns("./sentinel"))&.remove
36
+ strip_duplicate_ids(node, node.at(ns("./#{elem}")),
37
+ node.at(ns("./fmt-#{elem}")))
38
+ end
39
+
40
+ def transfer_id(old, new)
41
+ old["id"] or return
42
+ new["id"] = old["id"]
43
+ old["original-id"] = old["id"]
44
+ old.delete("id")
45
+ end
46
+
47
+ def gather_all_ids(elem)
48
+ elem.xpath(".//*[@id]").each_with_object([]) do |i, m|
49
+ m << i["id"]
50
+ end
51
+ end
52
+
53
+ # remove ids duplicated between title and fmt-title
54
+ # index terms are assumed transferred to fmt-title from title
55
+ def strip_duplicate_ids(_node, sem_title, pres_title)
56
+ sem_title && pres_title or return
57
+ ids = gather_all_ids(pres_title)
58
+ sem_title.xpath(".//*[@id]").each do |x|
59
+ ids.include?(x["id"]) or next
60
+ x["original-id"] = x["id"]
61
+ x.delete("id")
62
+ end
63
+ sem_title.xpath(ns(".//index")).each(&:remove)
64
+ end
65
+
66
+ def semx(node, label, element = "autonum")
67
+ id = node["id"] || node[:id]
68
+ /<semx element='[^']+' source='#{id}'/.match?(label) and return label
69
+ l = stripsemx(label)
70
+ %(<semx element='#{element}' source='#{id}'>#{l}</semx>)
71
+ end
72
+
73
+ def autonum(id, num)
74
+ /<semx/.match?(num) and return num # already contains markup
75
+ "<semx element='autonum' source='#{id}'>#{num}</semx>"
76
+ end
77
+
78
+ def labelled_autonum(label, id, num)
79
+ elem = "<span class='fmt-element-name'>#{label}</span>"
80
+ num.blank? and return elem
81
+ l10n("#{elem} #{autonum(id, num)}")
82
+ end
83
+
84
+ def fmt_xref_label(label, _number, ids)
85
+ label or return ""
86
+ x = @xrefs.anchor(ids[:elem], :xref, false) or return ""
87
+ ret = "<fmt-xref-label>#{x}</fmt-xref-label>"
88
+ container = @xrefs.anchor(ids[:elem], :container, false)
89
+ y = prefix_container_fmt_xref_label(container, x)
90
+ y != x and
91
+ ret += "<fmt-xref-label container='#{container}'>#{y}</fmt-xref-label>"
92
+ ret
93
+ end
94
+
95
+ def prefix_container_fmt_xref_label(container, xref)
96
+ container or return xref
97
+ container_container = @xrefs.anchor(container, :container, false)
98
+ container_label =
99
+ prefix_container_fmt_xref_label(container_container,
100
+ @xrefs.anchor(container, :xref, false))
101
+ l10n(connectives_spans(@i18n.nested_xref
102
+ .sub("%1", "<span class='fmt-xref-container'>#{container_label}</span>")
103
+ .sub("%2", xref)))
104
+ end
105
+
106
+ # detect whether string which may contain XML markup is empty
107
+ def empty_xml?(str)
108
+ str.blank? and return true
109
+ x = Nokogiri::XML::DocumentFragment.parse(str)
110
+ x.to_str.strip.empty?
111
+ end
112
+
113
+ # Remove ".blank?" tests if want empty delim placeholders for manipulation
114
+ def fmt_caption(label, elem, name, ids, delims)
115
+ label = fmt_caption_label_wrap(label)
116
+ c = fmt_caption2(label, elem, name, ids, delims)
117
+ empty_xml?(c) and return
118
+ !delims[:label].blank? and
119
+ f = "<span class='fmt-label-delim'>#{delims[:label]}</span>"
120
+ "<fmt-#{elem}>#{c}#{f}</fmt-#{elem}>"
121
+ end
122
+
123
+ def fmt_caption_label_wrap(label)
124
+ empty_xml?(label) || %r{<span class=['"]fmt-caption-label['"]}.match?(label) or
125
+ label = "<span class='fmt-caption-label'>#{label}</span>"
126
+ label
127
+ end
128
+
129
+ def fmt_caption2(label, elem, name, ids, delims)
130
+ if name && !name.children.empty?
131
+ empty_xml?(label) or
132
+ d = "<span class='fmt-caption-delim'>#{delims[:caption]}</span>"
133
+ attr = " element='#{elem}' source='#{ids[:name]}'"
134
+ "#{label}#{d}<semx #{attr}>#{to_xml(name.children)}</semx>"
135
+ elsif label then label
136
+ end
137
+ end
138
+ end
139
+ end
@@ -1,29 +1,23 @@
1
1
  require_relative "image"
2
2
  require_relative "sourcecode"
3
+ require_relative "autonum"
3
4
  require "rouge"
4
5
 
5
6
  module IsoDoc
6
7
  class PresentationXMLConvert < ::IsoDoc::Convert
7
8
  def lower2cap(text)
8
- /^[[:upper:]][[:upper:]]/.match?(text) and return text
9
- text&.capitalize
9
+ text.nil? and return text
10
+ x = Nokogiri::XML("<a>#{text}</a>")
11
+ firsttext = x.at(".//text()[string-length(normalize-space(.))>0]") or return text
12
+ /^[[:upper:]][[:upper:]]/.match?(firsttext.text) and return text
13
+ firsttext.replace(firsttext.text.capitalize)
14
+ to_xml(x.root.children)
10
15
  end
11
16
 
12
17
  def block_delim
13
18
  "&#xa0;&#x2014; "
14
19
  end
15
20
 
16
- def prefix_name(node, delim, number, elem)
17
- number.nil? || number.empty? and return
18
- unless name = node.at(ns("./#{elem}"))
19
- node.add_first_child "<#{elem}></#{elem}>"
20
- name = node.children.first
21
- end
22
- if name.children.empty? then name.add_child(cleanup_entities(number.strip))
23
- else (name.children.first.previous = "#{number.strip}#{delim}")
24
- end
25
- end
26
-
27
21
  def formula(docxml)
28
22
  docxml.xpath(ns("//formula")).each { |f| formula1(f) }
29
23
  end
@@ -31,7 +25,7 @@ module IsoDoc
31
25
  def formula1(elem)
32
26
  formula_where(elem.at(ns("./dl")))
33
27
  lbl = @xrefs.anchor(elem["id"], :label, false)
34
- lbl.nil? || lbl.empty? or prefix_name(elem, "", "(#{lbl})", "name")
28
+ lbl.nil? || lbl.empty? or prefix_name(elem, {}, lbl, "name")
35
29
  end
36
30
 
37
31
  def formula_where(dlist)
@@ -47,11 +41,8 @@ module IsoDoc
47
41
 
48
42
  def example1(elem)
49
43
  n = @xrefs.get[elem["id"]]
50
- lbl = if n.nil? || n[:label].nil? || n[:label].empty?
51
- @i18n.example
52
- else l10n("#{@i18n.example} #{n[:label]}")
53
- end
54
- prefix_name(elem, block_delim, lbl, "name")
44
+ lbl = labelled_autonum(@i18n.example, elem["id"], n&.dig(:label))
45
+ prefix_name(elem, { caption: block_delim }, lbl, "name")
55
46
  end
56
47
 
57
48
  def note(docxml)
@@ -59,22 +50,18 @@ module IsoDoc
59
50
  end
60
51
 
61
52
  def note_delim(_elem)
62
- ""
53
+ "<tab/>"
63
54
  end
64
55
 
65
56
  def note1(elem)
66
57
  %w(bibdata bibitem).include?(elem.parent.name) ||
67
- elem["notag"] == "true" and return
68
- lbl = note_label(elem)
69
- prefix_name(elem, "", lbl, "name")
58
+ elem["notag"] == "true" or lbl = note_label(elem)
59
+ prefix_name(elem, { label: note_delim(elem) }, lbl, "name")
70
60
  end
71
61
 
72
62
  def note_label(elem)
73
63
  n = @xrefs.get[elem["id"]]
74
- lbl = @i18n.note
75
- (n.nil? || n[:label].nil? || n[:label].empty?) or
76
- lbl = l10n("#{lbl} #{n[:label]}")
77
- "#{lbl}#{note_delim(elem)}"
64
+ labelled_autonum(@i18n.note, elem["id"], n&.dig(:label))
78
65
  end
79
66
 
80
67
  def admonition(docxml)
@@ -85,24 +72,25 @@ module IsoDoc
85
72
  if elem["type"] == "box"
86
73
  admonition_numbered1(elem)
87
74
  elsif elem["notag"] == "true" || elem.at(ns("./name"))
75
+ prefix_name(elem, { label: admonition_delim(elem) }, nil, "name")
88
76
  else
89
77
  label = admonition_label(elem, nil)
90
- prefix_name(elem, "", label, "name")
78
+ prefix_name(elem, { label: admonition_delim(elem) }, label, "name")
91
79
  end
92
- n = elem.at(ns("./name")) and n << admonition_delim(elem)
93
80
  end
94
81
 
95
82
  def admonition_numbered1(elem)
96
- elem["unnumbered"] && !elem.at(ns("./name")) and return
83
+ # elem["unnumbered"] && !elem.at(ns("./name")) and return
97
84
  label = admonition_label(elem, @xrefs.anchor(elem["id"], :label, false))
98
- prefix_name(elem, block_delim, label, "name")
85
+ prefix_name(elem, { caption: block_delim }, label, "name")
99
86
  end
100
87
 
101
88
  def admonition_label(elem, num)
102
89
  lbl = if elem["type"] == "box" then @i18n.box
103
90
  else @i18n.admonition[elem["type"]]&.upcase end
104
- num and lbl = l10n("#{lbl} #{num}")
105
- lbl
91
+ #lbl &&= "<span class='fmt-element-name'>#{lbl}</span>"
92
+ #num and lbl = l10n("#{lbl} #{autonum(elem['id'], num)}")
93
+ labelled_autonum(lbl, elem["id"], num)
106
94
  end
107
95
 
108
96
  def admonition_delim(_elem)
@@ -119,8 +107,14 @@ module IsoDoc
119
107
  labelled_ancestor(elem) and return
120
108
  elem["unnumbered"] && !elem.at(ns("./name")) and return
121
109
  n = @xrefs.anchor(elem["id"], :label, false)
122
- prefix_name(elem, block_delim, l10n("#{lower2cap @i18n.table} #{n}"),
123
- "name")
110
+ #lbl = "<span class='fmt-element-name'>#{lower2cap @i18n.table}</span> "\
111
+ #"#{autonum(elem['id'], n)}"
112
+ lbl = labelled_autonum(lower2cap(@i18n.table), elem["id"], n)
113
+ prefix_name(elem, { caption: table_delim }, l10n(lbl), "name")
114
+ end
115
+
116
+ def table_delim
117
+ block_delim
124
118
  end
125
119
 
126
120
  def table_long_strings_cleanup(docxml)
@@ -156,7 +150,23 @@ module IsoDoc
156
150
  elem.replace(elem.children)
157
151
  end
158
152
 
159
- def dl(docxml); end
153
+ def dl(docxml)
154
+ docxml.xpath(ns("//dl")).each { |f| dl1(f) }
155
+ end
156
+
157
+ def dl1(elem)
158
+ elem.at(ns("./name")) and
159
+ prefix_name(elem, {}, "", "name") # copy name to fmt-name
160
+ end
161
+
162
+ def ul(docxml)
163
+ docxml.xpath(ns("//ul")).each { |f| ul1(f) }
164
+ end
165
+
166
+ def ul1(elem)
167
+ elem.at(ns("./name")) and
168
+ prefix_name(elem, {}, "", "name") # copy name to fmt-name
169
+ end
160
170
 
161
171
  def ol(docxml)
162
172
  docxml.xpath(ns("//ol")).each { |f| ol1(f) }
@@ -179,9 +189,8 @@ module IsoDoc
179
189
 
180
190
  def ol1(elem)
181
191
  elem["type"] ||= ol_depth(elem).to_s
182
- elem.xpath(ns("./li")).each do |li|
183
- li["id"] ||= "_#{UUIDTools::UUID.random_create}"
184
- end
192
+ elem.at(ns("./name")) and
193
+ prefix_name(elem, {}, "", "name") # copy name to fmt-name
185
194
  end
186
195
 
187
196
  def ol_label(elem)
@@ -6,29 +6,6 @@ module IsoDoc
6
6
  end
7
7
  end
8
8
 
9
- =begin
10
- # This is highly specific to ISO, but it's not a bad precedent for
11
- # references anyway; keeping here instead of in IsoDoc::Iso for now
12
- def docid_l10n(text)
13
- text.nil? and return text
14
- @i18n.all_parts and text.gsub!(/All Parts/i, @i18n.all_parts.downcase)
15
- text.size < 20 and text.gsub!(/ /, "&#xa0;")
16
- text
17
- end
18
-
19
- def docid_prefix(prefix, docid)
20
- docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix) &&
21
- !/^#{prefix}\b/.match(docid)
22
- docid_l10n(docid)
23
- end
24
-
25
- def omit_docid_prefix(prefix)
26
- prefix.nil? || prefix.empty? and return true
27
- %w(ISO IEC IEV ITU W3C BIPM csd metanorma repository metanorma-ordinal)
28
- .include? prefix
29
- end
30
- =end
31
-
32
9
  def pref_ref_code(bib)
33
10
  bib["suppress_identifier"] == "true" and return nil
34
11
  ret = bib.xpath(ns("./docidentifier[@scope = 'biblio-tag']"))
@@ -5,7 +5,8 @@ module IsoDoc
5
5
  def citeas(xmldoc)
6
6
  xmldoc.xpath(ns("//eref | //origin | //quote//source")).each do |e|
7
7
  e["bibitemid"] && e["citeas"] or next
8
- a = @xrefs.anchor(e["bibitemid"], :xref, false) and e["citeas"] = a
8
+ a = @xrefs.anchor(e["bibitemid"], :xref, false) and
9
+ e["citeas"] = a.gsub(%r{</?[^>]+>}, "")
9
10
  end
10
11
  end
11
12
 
@@ -87,7 +88,8 @@ module IsoDoc
87
88
  locs1 = []
88
89
  until locs.empty?
89
90
  if locs[1] == "to"
90
- locs1 << @i18n.chain_to.sub("%1", locs[0]).sub("%2", locs[2])
91
+ locs1 << connectives_spans(@i18n.chain_to.sub("%1", locs[0])
92
+ .sub("%2", locs[2]))
91
93
  locs.shift(3)
92
94
  else locs1 << locs.shift
93
95
  end
@@ -43,16 +43,32 @@ module IsoDoc
43
43
  elem.children = x
44
44
  end
45
45
 
46
+ def subfigure_delim
47
+ ""
48
+ # "<span class='fmt-label-delim'>)</span>"
49
+ end
50
+
51
+ def figure_delim(_elem)
52
+ block_delim
53
+ end
54
+
55
+ def figure_name(elem)
56
+ "<span class='fmt-element-name'>#{figure_label(elem)}</span> "
57
+ end
58
+
46
59
  def figure1(elem)
47
60
  elem["class"] == "pseudocode" || elem["type"] == "pseudocode" and
48
61
  return sourcecode1(elem)
49
62
  figure_fn(elem)
50
63
  figure_key(elem.at(ns("./dl")))
51
- figure_label?(elem) or return nil
52
- lbl = @xrefs.anchor(elem["id"], :label, false) or return
53
- # no xref, no label: this can be set in xref
54
- prefix_name(elem, block_delim,
55
- l10n("#{figure_label(elem)} #{lbl}"), "name")
64
+ lbl = @xrefs.anchor(elem["id"], :label, false)
65
+ lbl and a = autonum(elem["id"], lbl)
66
+ figname = figure_name(elem)
67
+ if elem.parent.name == "figure"
68
+ a += subfigure_delim
69
+ end
70
+ lbl && figure_label?(elem) and s = "#{figname}#{a}"
71
+ prefix_name(elem, { caption: figure_delim(elem) }, l10n(s&.strip), "name")
56
72
  end
57
73
 
58
74
  # move footnotes into key, and get rid of footnote reference
@@ -13,7 +13,7 @@ module IsoDoc
13
13
  node["style"] == "id" and anchor_id_postprocess(node)
14
14
  xref_empty?(node) or return
15
15
  target = docid_l10n(node["target"]) ||
16
- expand_citeas(docid_l10n(node["citeas"]))
16
+ docid_l10n(expand_citeas(node["citeas"]))
17
17
  link = anchor_linkend(node, target)
18
18
  link += eref_localities(node.xpath(ns("./locality | ./localityStack")),
19
19
  link, node)
@@ -24,7 +24,7 @@ module IsoDoc
24
24
  def recommendation1(elem, type)
25
25
  lbl = @reqt_models.model(elem["model"])
26
26
  .recommendation_label(elem, type, xrefs)
27
- prefix_name(elem, "", l10n(lbl), "name")
27
+ prefix_name(elem, {}, l10n(lbl), "name")
28
28
  end
29
29
 
30
30
  def requirement_render_preprocessing(docxml); end