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
@@ -34,7 +34,7 @@ module IsoDoc
34
34
  def make_tr_attr_style(cell, row, rowmax, totalrows, opt)
35
35
  top = row.zero? ? "#{SW1} 1.5pt;" : "none;"
36
36
  bottom = "#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;"
37
- ret = <<~STYLE.gsub(/\n/, "")
37
+ ret = <<~STYLE.delete("\n")
38
38
  border-top:#{top}mso-border-top-alt:#{top}
39
39
  border-bottom:#{bottom}mso-border-bottom-alt:#{bottom}
40
40
  STYLE
@@ -46,7 +46,7 @@ module IsoDoc
46
46
  def keep_rows_together(_cell, rowmax, totalrows, opt)
47
47
  opt[:header] and return true
48
48
  @table_line_count > 15 and return false
49
- (totalrows <= 10 && rowmax < totalrows)
49
+ totalrows <= 10 && rowmax < totalrows
50
50
  end
51
51
 
52
52
  def tbody_parse(node, table)
@@ -1,4 +1,5 @@
1
1
  require "singleton"
2
+ require_relative "xref_util"
2
3
 
3
4
  module IsoDoc
4
5
  module XrefGen
@@ -29,37 +30,51 @@ module IsoDoc
29
30
  @anchors
30
31
  end
31
32
 
32
- def anchor_struct_label(lbl, elem)
33
+ def anchor_struct_label(lbl, node, elem)
33
34
  case elem
34
- when @labels["appendix"] then "#{elem} #{lbl}"
35
+ when @labels["appendix"]
36
+ s = "<semx element='autonum' source='#{node['id'] || node[:id]}'>" \
37
+ "#{lbl}</semx>"
38
+ "<span class='fmt-element-name'>#{elem}</span> #{s}"
35
39
  else
36
- lbl.to_s
40
+ anchor_struct_value(lbl, elem)
37
41
  end
38
42
  end
39
43
 
40
- def anchor_struct_xref(lbl, elem)
41
- l10n("#{elem} #{anchor_struct_value(lbl, elem)}")
44
+ def anchor_struct_xref(lbl, node, elem)
45
+ unless lbl.blank?
46
+ lbl = semx(node, lbl)
47
+ s = " #{anchor_struct_value(lbl, elem)}"
48
+ end
49
+ l10n("<span class='fmt-element-name'>#{elem}</span>#{s}")
50
+ .gsub(/ $/, "")
42
51
  end
43
52
 
44
53
  def anchor_struct_value(lbl, elem)
45
54
  case elem
46
- when @labels["formula"], @labels["inequality"] then "(#{lbl})"
55
+ # TODO hardcoded ( ) ?
56
+ when @labels["formula"], @labels["inequality"] then <<~SPAN.strip
57
+ #{delim_wrap('(')}#{lbl}#{delim_wrap(')')}
58
+ SPAN
47
59
  else
48
- lbl
60
+ lbl.to_s
49
61
  end
50
62
  end
51
63
 
52
- def anchor_struct(lbl, container, elem, type, unnumb = false)
53
- ret = {}
54
- ret[:label] = unnumb == "true" ? nil : anchor_struct_label(lbl, elem)
55
- ret[:xref] = anchor_struct_xref(unnumb == "true" ? "(??)" : lbl, elem)
56
- ret[:xref].gsub!(/ $/, "")
57
- ret[:container] = @klass.get_clause_id(container) unless container.nil?
58
- ret[:type] = type
59
- ret[:elem] = elem
60
- ret[:value] = anchor_struct_value(lbl, elem)
64
+ # def anchor_struct(lbl, container, elem, type, unnumb = false)
65
+ def anchor_struct(lbl, node, elem_name, type, opt = {})
66
+ ret = { type: type, elem: elem_name, label: nil }
67
+ opt[:unnumb] != "true" and
68
+ ret[:label] = anchor_struct_label(lbl, node, elem_name)
69
+ ret[:xref] =
70
+ anchor_struct_xref(opt[:unnumb] == "true" ? "(??)" : lbl, node,
71
+ elem_name)
72
+ ret[:container] = @klass.get_clause_id(node) if opt[:container]
73
+ ret[:value] = stripsemx(lbl)
61
74
  ret
62
75
  end
76
+
77
+ include ::IsoDoc::XrefGen::Util
63
78
  end
64
79
  end
65
80
  end
@@ -2,11 +2,12 @@ require_relative "xref_counter"
2
2
 
3
3
  module IsoDoc
4
4
  class Xref
5
- def clause_counter(num = 0, opts = { numerals: :arabic })
5
+ def clause_counter(num = 0, opts = {})
6
+ opts[:numerals] ||= :arabic
6
7
  ::IsoDoc::XrefGen::Counter.new(num, opts)
7
8
  end
8
9
 
9
- def list_counter(num = 0, opts = { numerals: :arabic })
10
+ def list_counter(num = 0, opts = {})
10
11
  ::IsoDoc::XrefGen::Counter.new(num, opts)
11
12
  end
12
13
  end
@@ -28,14 +28,18 @@ module IsoDoc
28
28
  autonum
29
29
  end
30
30
 
31
- def termnote_label(note)
32
- @labels["termnote"].gsub("%", note.to_s)
31
+ def termnote_label(node, label)
32
+ if label.blank?
33
+ @labels["termnote"].gsub(/%\s?/, "")
34
+ else
35
+ @labels["termnote"].gsub("%", semx(node, label.to_s))
36
+ end
33
37
  end
34
38
 
35
39
  def increment_label(elems, node, counter, increment: true)
36
40
  elems.size == 1 && !node["number"] and return ""
37
41
  counter.increment(node) if increment
38
- " #{counter.print}"
42
+ counter.print
39
43
  end
40
44
 
41
45
  def termnote_anchor_names(docxml)
@@ -44,10 +48,10 @@ module IsoDoc
44
48
  t.xpath(ns("./termnote")).noblank.each do |n|
45
49
  c.increment(n)
46
50
  @anchors[n["id"]] =
47
- { label: termnote_label(c.print), type: "termnote",
51
+ { label: termnote_label(n, c.print), type: "termnote",
48
52
  value: c.print, elem: @labels["termnote"],
49
53
  container: t["id"],
50
- xref: "#{@labels['note_xref']} #{c.print}" }
54
+ xref: anchor_struct_xref(c.print, n, @labels["note_xref"]) }
51
55
  end
52
56
  end
53
57
  end
@@ -63,7 +67,7 @@ module IsoDoc
63
67
  { label: idx, type: "termexample",
64
68
  value: idx, elem: @labels["example_xref"],
65
69
  container: t["id"],
66
- xref: "#{@labels['example_xref']} #{idx}" }
70
+ xref: anchor_struct_xref(idx, n, @labels["example_xref"]) }
67
71
  end
68
72
  end
69
73
  end
@@ -73,7 +77,7 @@ module IsoDoc
73
77
  notes = s.xpath(child_asset_path("note")) -
74
78
  s.xpath(ns(".//figure//note | .//table//note"))
75
79
  note_anchor_names1(notes, Counter.new)
76
- note_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
80
+ note_anchor_names(s.xpath(ns(child_sections)))
77
81
  end
78
82
  end
79
83
 
@@ -81,7 +85,8 @@ module IsoDoc
81
85
  notes.noblank.each do |n|
82
86
  @anchors[n["id"]] =
83
87
  anchor_struct(increment_label(notes, n, counter), n,
84
- @labels["note_xref"], "note", false)
88
+ @labels["note_xref"], "note",
89
+ { container: true, unnumb: false })
85
90
  end
86
91
  end
87
92
 
@@ -90,7 +95,7 @@ module IsoDoc
90
95
  s.at(ns(".//admonition[@type = 'box']")) or next
91
96
  notes = s.xpath(child_asset_path("admonition[@type = 'box']"))
92
97
  admonition_anchor_names1(notes, Counter.new)
93
- admonition_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
98
+ admonition_anchor_names(s.xpath(ns(child_sections)))
94
99
  end
95
100
  end
96
101
 
@@ -98,7 +103,8 @@ module IsoDoc
98
103
  notes.noblank.each do |n|
99
104
  @anchors[n["id"]] ||=
100
105
  anchor_struct(increment_label(notes, n, counter), n,
101
- @labels["box"], "admonition", n["unnumbered"])
106
+ @labels["box"], "admonition",
107
+ { container: true, unnumb: n["unnumbered"] })
102
108
  end
103
109
  end
104
110
 
@@ -106,7 +112,7 @@ module IsoDoc
106
112
  sections.each do |s|
107
113
  notes = s.xpath(child_asset_path("example"))
108
114
  example_anchor_names1(notes, Counter.new)
109
- example_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
115
+ example_anchor_names(s.xpath(ns(child_sections)))
110
116
  end
111
117
  end
112
118
 
@@ -114,7 +120,8 @@ module IsoDoc
114
120
  notes.noblank.each do |n|
115
121
  @anchors[n["id"]] ||=
116
122
  anchor_struct(increment_label(notes, n, counter), n,
117
- @labels["example_xref"], "example", n["unnumbered"])
123
+ @labels["example_xref"], "example",
124
+ { unnumb: n["unnumbered"], container: true })
118
125
  end
119
126
  end
120
127
 
@@ -122,27 +129,35 @@ module IsoDoc
122
129
  sections.each do |s|
123
130
  notes = s.xpath(ns(".//ol")) - s.xpath(ns(".//clause//ol")) -
124
131
  s.xpath(ns(".//appendix//ol")) - s.xpath(ns(".//ol//ol"))
125
- c = list_counter
132
+ c = list_counter(0, {})
126
133
  notes.noblank.each do |n|
127
- @anchors[n["id"]] = anchor_struct(increment_label(notes, n, c), n,
128
- @labels["list"], "list", false)
134
+ @anchors[n["id"]] =
135
+ anchor_struct(increment_label(notes, n, c), n,
136
+ @labels["list"], "list",
137
+ { unnumb: false, container: true })
129
138
  list_item_anchor_names(n, @anchors[n["id"]], 1, "", notes.size != 1)
130
139
  end
131
- list_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
140
+ list_anchor_names(s.xpath(ns(child_sections)))
132
141
  end
133
142
  end
134
143
 
135
- def list_item_anchor_names(list, list_anchor, depth, prev_label, refer_list)
136
- c = list_counter(list["start"] ? list["start"].to_i - 1 : 0)
144
+ def list_item_delim
145
+ ")"
146
+ end
147
+
148
+ def list_item_anchor_names(list, list_anchor, depth, prev_label,
149
+ refer_list)
150
+ c = list_counter(list["start"] ? list["start"].to_i - 1 : 0, {})
137
151
  list.xpath(ns("./li")).each do |li|
138
152
  bare_label, label =
139
- list_item_value(li, c, depth, { list_anchor:, prev_label:,
140
- refer_list: depth == 1 ? refer_list : nil })
141
- li["id"] and @anchors[li["id"]] =
142
- { label: bare_label, bare_xref: "#{label})",
143
- xref: "#{label})",
144
- type: "listitem", refer_list:,
145
- container: list_anchor[:container] }
153
+ list_item_value(li, c, depth,
154
+ { list_anchor:, prev_label:,
155
+ refer_list: depth == 1 ? refer_list : nil })
156
+ li["id"] ||= "_#{UUIDTools::UUID.random_create}"
157
+ @anchors[li["id"]] =
158
+ { label: bare_label, bare_xref: "#{label})", type: "listitem",
159
+ xref: %[#{label}#{delim_wrap(list_item_delim)}], refer_list:,
160
+ container: list_anchor[:container] }
146
161
  (li.xpath(ns(".//ol")) - li.xpath(ns(".//ol//ol"))).each do |ol|
147
162
  list_item_anchor_names(ol, list_anchor, depth + 1, label,
148
163
  refer_list)
@@ -152,18 +167,21 @@ module IsoDoc
152
167
 
153
168
  def list_item_value(entry, counter, depth, opts)
154
169
  label = counter.increment(entry).listlabel(entry.parent, depth)
170
+ s = semx(entry, label)
155
171
  [label,
156
- list_item_anchor_label(label, opts[:list_anchor], opts[:prev_label],
172
+ list_item_anchor_label(s, opts[:list_anchor], opts[:prev_label],
157
173
  opts[:refer_list])]
158
174
  end
159
175
 
160
176
  def list_item_anchor_label(label, list_anchor, prev_label, refer_list)
161
177
  prev_label.empty? or
162
- label = @i18n.list_nested_xref.sub("%1", "#{prev_label})")
163
- .sub("%2", label)
178
+ label = @klass.connectives_spans(@i18n.list_nested_xref
179
+ .sub("%1", %[#{prev_label}#{delim_wrap(list_item_delim)}])
180
+ .sub("%2", label))
164
181
  refer_list and
165
- label = @i18n.list_nested_xref.sub("%1", list_anchor[:xref])
166
- .sub("%2", label)
182
+ label = @klass.connectives_spans(@i18n.list_nested_xref
183
+ .sub("%1", list_anchor[:xref])
184
+ .sub("%2", label))
167
185
  label
168
186
  end
169
187
 
@@ -172,7 +190,7 @@ module IsoDoc
172
190
  notes = s.xpath(ns(".//dl")) - s.xpath(ns(".//clause//dl")) -
173
191
  s.xpath(ns(".//appendix//dl")) - s.xpath(ns(".//dl//dl"))
174
192
  deflist_anchor_names1(notes, Counter.new)
175
- deflist_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
193
+ deflist_anchor_names(s.xpath(ns(child_sections)))
176
194
  end
177
195
  end
178
196
 
@@ -180,14 +198,15 @@ module IsoDoc
180
198
  notes.noblank.each do |n|
181
199
  @anchors[n["id"]] =
182
200
  anchor_struct(increment_label(notes, n, counter), n,
183
- @labels["deflist"], "deflist", false)
201
+ @labels["deflist"], "deflist",
202
+ { unnumb: false, container: true })
184
203
  deflist_term_anchor_names(n, @anchors[n["id"]])
185
204
  end
186
205
  end
187
206
 
188
207
  def deflist_term_anchor_names(list, list_anchor)
189
208
  list.xpath(ns("./dt")).each do |li|
190
- label = "#{list_anchor[:xref]}: #{dt2xreflabel(li)}"
209
+ label = deflist_term_anchor_lbl(li, list_anchor)
191
210
  li["id"] and @anchors[li["id"]] =
192
211
  { xref: label, type: "deflistitem",
193
212
  container: list_anchor[:container] }
@@ -197,6 +216,11 @@ module IsoDoc
197
216
  end
198
217
  end
199
218
 
219
+ def deflist_term_anchor_lbl(listitem, list_anchor)
220
+ s = semx(listitem, dt2xreflabel(listitem))
221
+ %(#{list_anchor[:xref]}#{delim_wrap(":")} #{s}</semx>)
222
+ end
223
+
200
224
  def dt2xreflabel(dterm)
201
225
  label = dterm.dup
202
226
  label.xpath(ns(".//p")).each { |x| x.replace(x.children) }
@@ -11,6 +11,10 @@ module IsoDoc
11
11
  "-"
12
12
  end
13
13
 
14
+ def hierreqtsep
15
+ "-"
16
+ end
17
+
14
18
  def subfigure_increment(idx, counter, elem)
15
19
  if elem.parent.name == "figure" then idx += 1
16
20
  else
@@ -30,7 +34,8 @@ module IsoDoc
30
34
  clause.xpath(ns(self.class::FIGURE_NO_CLASS)).noblank.each do |t|
31
35
  # labelled_ancestor(t, %w(figure)) and next # disable nested figure labelling
32
36
  j = subfigure_increment(j, c, t)
33
- sequential_figure_body(j, c, t, "figure", container:)
37
+ sublabel = subfigure_label(j)
38
+ figure_anchor(t, sublabel, c.print, "figure", container: container)
34
39
  end
35
40
  sequential_figure_class_names(clause, container:)
36
41
  end
@@ -43,24 +48,69 @@ module IsoDoc
43
48
  c[t["class"]] ||= Counter.new
44
49
  # labelled_ancestor(t, %w(figure)) and next
45
50
  j = subfigure_increment(j, c[t["class"]], t)
46
- sequential_figure_body(j, c[t["class"]], t, t["class"],
47
- container:)
51
+ sublabel = subfigure_label(j)
52
+ figure_anchor(t, sublabel, c[t["class"]].print, t["class"],
53
+ container: container)
48
54
  end
49
55
  end
50
56
 
57
+ def hier_separator(markup: false)
58
+ h = hiersep
59
+ h.blank? || !markup or h = delim_wrap(h)
60
+ h
61
+ end
62
+
51
63
  def subfigure_label(subfignum)
52
- subfignum.zero? and return ""
53
- "#{hierfigsep}#{subfignum}"
64
+ subfignum.zero? and return
65
+ subfignum.to_s
66
+ end
67
+
68
+ def subfigure_separator(markup: false)
69
+ h = hierfigsep
70
+ h.blank? || !markup or h = delim_wrap(h)
71
+ h
72
+ end
73
+
74
+ def subreqt_separator(markup: false)
75
+ h = hierreqtsep
76
+ h.blank? || !markup or h = delim_wrap(h)
77
+ h
78
+ end
79
+
80
+ def subfigure_delim
81
+ ""
82
+ end
83
+
84
+ def figure_anchor(elem, sublabel, label, klass, container: false)
85
+ if sublabel
86
+ /<semx/.match?(label) or label = semx(elem.parent, label)
87
+ subfigure_anchor(elem, sublabel, label, klass, container: false)
88
+ else
89
+ @anchors[elem["id"]] = anchor_struct(
90
+ label, elem, @labels[klass] || klass.capitalize, klass,
91
+ { unnumb: elem["unnumbered"], container: }
92
+ )
93
+ end
94
+ end
95
+
96
+ def fig_subfig_label(label, sublabel)
97
+ "#{label}#{subfigure_separator}#{sublabel}"
54
98
  end
55
99
 
56
- def sequential_figure_body(subfig, counter, elem, klass, container: false)
57
- label = counter.print
58
- label &&= label + subfigure_label(subfig)
100
+ def subfigure_anchor(elem, sublabel, label, klass, container: false)
101
+ figlabel = fig_subfig_label(label, sublabel)
59
102
  @anchors[elem["id"]] = anchor_struct(
60
- label, container ? elem : nil,
61
- @labels[klass] || klass.capitalize, klass,
62
- elem["unnumbered"]
103
+ figlabel, elem, @labels[klass] || klass.capitalize, klass,
104
+ { unnumb: elem["unnumbered"] }
63
105
  )
106
+ if elem["unnumbered"] != "true"
107
+ x = "#{subfigure_separator(markup: true)}#{semx(elem, sublabel)}"
108
+ @anchors[elem["id"]][:label] = "#{label}#{x}" # "#{semx(elem.parent, label)}#{x}"
109
+ @anchors[elem["id"]][:xref] = @anchors[elem.parent["id"]][:xref] + x +
110
+ delim_wrap(subfigure_delim)
111
+ x = @anchors[elem.parent["id"]][:container] and
112
+ @anchors[elem["id"]][:container] = x
113
+ end
64
114
  end
65
115
 
66
116
  def sequential_table_names(clause, container: false)
@@ -68,8 +118,8 @@ module IsoDoc
68
118
  clause.xpath(ns(".//table")).noblank.each do |t|
69
119
  # labelled_ancestor(t) and next
70
120
  @anchors[t["id"]] = anchor_struct(
71
- c.increment(t).print, container ? t : nil,
72
- @labels["table"], "table", t["unnumbered"]
121
+ c.increment(t).print, t,
122
+ @labels["table"], "table", { unnumb: t["unnumbered"], container: container }
73
123
  )
74
124
  end
75
125
  end
@@ -80,7 +130,7 @@ module IsoDoc
80
130
  @anchors[t["id"]] = anchor_struct(
81
131
  c.increment(t).print, t,
82
132
  t["inequality"] ? @labels["inequality"] : @labels["formula"],
83
- "formula", t["unnumbered"]
133
+ "formula", { unnumb: t["unnumbered"], container: true }
84
134
  )
85
135
  end
86
136
  end
@@ -95,39 +145,49 @@ module IsoDoc
95
145
  ./permission | ./requirement | ./recommendation
96
146
  XPATH
97
147
 
98
- def sequential_permission_names(clause, container: false)
148
+ def sequential_permission_names(clause, container: true)
99
149
  c = ReqCounter.new
100
150
  clause.xpath(ns(FIRST_LVL_REQ)).noblank.each do |t|
101
151
  m = @reqt_models.model(t["model"])
102
152
  klass, label = reqt2class_label(t, m)
103
153
  id = c.increment(label, t).print
104
- sequential_permission_body(id, t, label, klass, m,
154
+ sequential_permission_body(id, nil, t, label, klass, m,
105
155
  container:)
106
- sequential_permission_children(t, id, container:)
156
+ sequential_permission_children(t, id, klass, container:)
107
157
  end
108
158
  end
109
159
 
110
- def sequential_permission_children(elem, lbl, container: false)
160
+ def sequential_permission_children(elem, lbl, klass, container: false)
111
161
  c = ReqCounter.new
112
162
  elem.xpath(ns(REQ_CHILDREN)).noblank.each do |t|
113
163
  m = @reqt_models.model(t["model"])
114
164
  klass, label = reqt2class_nested_label(t, m)
115
- id = "#{lbl}#{hierfigsep}#{c.increment(label, t).print}"
116
- sequential_permission_body(id, t, label, klass, m,
165
+ ctr = c.increment(label, t).print
166
+ id = "#{lbl}#{subreqt_separator}#{ctr}"
167
+ sequential_permission_body(ctr, lbl, t, label, klass, m,
117
168
  container:)
118
- sequential_permission_children(t, id, container:)
169
+ sequential_permission_children(t, id, klass, container:)
119
170
  end
120
171
  end
121
172
 
122
- def sequential_permission_body(id, elem, label, klass, model,
173
+ def sequential_permission_body(id, parent_id, elem, label, klass, model,
123
174
  container: false)
175
+ lbl = parent_id ? "#{parent_id}#{subreqt_separator}#{id}" : id
124
176
  @anchors[elem["id"]] = model.postprocess_anchor_struct(
125
- elem, anchor_struct(id, elem,
126
- label, klass, elem["unnumbered"])
177
+ elem, anchor_struct(lbl, elem,
178
+ label, klass, { unnumb: elem["unnumbered"], container: })
127
179
  )
180
+ @anchors[elem["id"]][:semx] = semx(elem, lbl)
181
+ if parent_id
182
+ x = "#{subreqt_separator(markup: true)}#{semx(elem, id)}"
183
+ @anchors[elem["id"]][:semx] = @anchors[elem.parent["id"]][:semx] + x
184
+ @anchors[elem["id"]][:label] =
185
+ "<span class='fmt-element-name'>#{label}</span> #{@anchors[elem["id"]][:semx]}"
186
+ @anchors[elem["id"]][:xref] = "<span class='fmt-element-name'>#{label}</span> #{@anchors[elem["id"]][:semx]}"
187
+ end
128
188
  model.permission_parts(elem, id, label, klass).each do |n|
129
189
  @anchors[n[:id]] = anchor_struct(n[:number], n[:elem], n[:label],
130
- n[:klass], false)
190
+ n[:klass], { unnumb: false, container: })
131
191
  end
132
192
  end
133
193
 
@@ -156,44 +216,61 @@ container: false)
156
216
  sequential_permission_names(clause, container:)
157
217
  end
158
218
 
159
- def hierarchical_figure_names(clause, num)
219
+ def nodeSet(clauses)
220
+ case clauses
221
+ when Nokogiri::XML::Node
222
+ [clauses]
223
+ when Nokogiri::XML::NodeSet
224
+ clauses
225
+ end
226
+ end
227
+
228
+ # these can take a NodeSet as argument; semx will point to members of the NodeSet,
229
+ # but numbering will be consecutive
230
+ def hierarchical_figure_names(clauses, num)
160
231
  c = Counter.new
161
232
  j = 0
233
+ nodeSet(clauses).each do |clause|
162
234
  clause.xpath(ns(self.class::FIGURE_NO_CLASS)).noblank.each do |t|
163
235
  # labelled_ancestor(t, %w(figure)) and next
164
236
  j = subfigure_increment(j, c, t)
165
- hierarchical_figure_body(num, j, c, t, "figure")
237
+ sublabel = subfigure_label(j)
238
+ # hierarchical_figure_body(num, j, c, t, "figure")
239
+ #figure_anchor(t, sublabel, "#{num}#{hier_separator}#{c.print}", "figure")
240
+ #require "debug"; binding.b
241
+ figure_anchor(t, sublabel, hiersemx(clause, num, c, t), "figure")
166
242
  end
167
243
  hierarchical_figure_class_names(clause, num)
244
+ end
168
245
  end
169
246
 
170
- def hierarchical_figure_class_names(clause, num)
247
+ def hierarchical_figure_class_names(clauses, num)
171
248
  c = {}
172
249
  j = 0
250
+ nodeSet(clauses).each do |clause|
173
251
  clause.xpath(ns(".//figure[@class][not(@class = 'pseudocode')]"))
174
252
  .noblank.each do |t|
175
253
  # labelled_ancestor(t, %w(figure)) and next
176
254
  c[t["class"]] ||= Counter.new
177
255
  j = subfigure_increment(j, c[t["class"]], t)
178
- hierarchical_figure_body(num, j, c[t["class"]], t, t["class"])
256
+ sublabel = subfigure_label(j)
257
+ # hierarchical_figure_body(num, j, c[t["class"]], t, t["class"])
258
+ #figure_anchor(t, sublabel, "#{num}#{hier_separator}#{c[t['class']].print}", t["class"])
259
+ figure_anchor(t, sublabel, hiersemx(clause, num, c[t["class"]], t), t["class"])
260
+ end
179
261
  end
180
262
  end
181
263
 
182
- def hierarchical_figure_body(num, subfignum, counter, block, klass)
183
- label = "#{num}#{hiersep}#{counter.print}" +
184
- subfigure_label(subfignum)
185
- @anchors[block["id"]] =
186
- anchor_struct(label, nil, @labels[klass] || klass.capitalize,
187
- klass, block["unnumbered"])
188
- end
189
-
190
- def hierarchical_table_names(clause, num)
264
+ def hierarchical_table_names(clauses, num)
191
265
  c = Counter.new
266
+ nodeSet(clauses).each do |clause|
192
267
  clause.xpath(ns(".//table")).noblank.each do |t|
193
268
  # labelled_ancestor(t) and next
194
269
  @anchors[t["id"]] =
195
- anchor_struct("#{num}#{hiersep}#{c.increment(t).print}",
196
- nil, @labels["table"], "table", t["unnumbered"])
270
+ #anchor_struct("#{num}#{hier_separator}#{c.increment(t).print}",
271
+ anchor_struct(hiersemx(clause, num, c.increment(t), t),
272
+ t, @labels["table"], "table", { unnumb: t["unnumbered"], container: false })
273
+ end
197
274
  end
198
275
  end
199
276
 
@@ -204,47 +281,59 @@ container: false)
204
281
  hierarchical_permission_names(clause, num)
205
282
  end
206
283
 
207
- def hierarchical_formula_names(clause, num)
284
+ def hierarchical_formula_names(clauses, num)
208
285
  c = Counter.new
286
+ nodeSet(clauses).each do |clause|
209
287
  clause.xpath(ns(".//formula")).noblank.each do |t|
210
288
  @anchors[t["id"]] = anchor_struct(
211
- "#{num}#{hiersep}#{c.increment(t).print}", nil,
289
+ #"#{num}#{hier_separator}#{c.increment(t).print}", t,
290
+ hiersemx(clause, num, c.increment(t), t), t,
212
291
  t["inequality"] ? @labels["inequality"] : @labels["formula"],
213
- "formula", t["unnumbered"]
292
+ "formula", { unnumb: t["unnumbered"], container: false }
214
293
  )
215
294
  end
295
+ end
216
296
  end
217
297
 
218
- def hierarchical_permission_names(clause, num)
298
+ def hierarchical_permission_names(clauses, num)
219
299
  c = ReqCounter.new
300
+ nodeSet(clauses).each do |clause|
220
301
  clause.xpath(ns(FIRST_LVL_REQ)).noblank.each do |t|
221
302
  m = @reqt_models.model(t["model"])
222
303
  klass, label = reqt2class_label(t, m)
223
- id = "#{num}#{hiersep}#{c.increment(label, t).print}"
224
- hierarchical_permission_body(id, t, label, klass, m)
225
- hierarchical_permission_children(t, id)
304
+ #id = "#{num}#{hier_separator}#{c.increment(label, t).print}"
305
+ id = hiersemx(clause, num, c.increment(label, t), t)
306
+ sequential_permission_body(id, nil, t, label, klass, m, container: false)
307
+ sequential_permission_children(t, id, klass, container: false)
226
308
  end
309
+ end
227
310
  end
228
311
 
312
+ # TODO remove
229
313
  def hierarchical_permission_children(block, lbl)
230
314
  c = ReqCounter.new
231
315
  block.xpath(ns(REQ_CHILDREN)).noblank.each do |t|
232
316
  m = @reqt_models.model(t["model"])
233
317
  klass, label = reqt2class_nested_label(t, m)
234
- id = "#{lbl}#{hierfigsep}#{c.increment(label, t).print}"
235
- hierarchical_permission_body(id, t, label, klass, m)
318
+ id = "#{lbl}#{subreqt_separator}#{c.increment(label, t).print}"
319
+ sequential_permission_body(c.print, lbl, t, label, klass, m)
236
320
  hierarchical_permission_children(t, id)
237
321
  end
238
322
  end
239
323
 
240
- def hierarchical_permission_body(id, block, label, klass, model)
241
- @anchors[block["id"]] = model.postprocess_anchor_struct(
242
- block, anchor_struct(id, nil,
243
- label, klass, block["unnumbered"])
324
+ # TODO remove
325
+ def hierarchical_permission_body(id, parent_id, elem, label, klass, model)
326
+ @anchors[elem["id"]] = model.postprocess_anchor_struct(
327
+ elem, anchor_struct(id, elem,
328
+ label, klass, { unnumb: elem["unnumbered"], container: false })
244
329
  )
245
- model.permission_parts(block, id, label, klass).each do |n|
246
- @anchors[n[:id]] = anchor_struct(n[:number], nil, n[:label],
247
- n[:klass], false)
330
+ x = "#{subreqt_separator(markup: true)}#{semx(elem, id)}"
331
+ @anchors[elem["id"]][:label] = "#{semx(elem.parent, parent_id)}#{x}"
332
+ @anchors[elem["id"]][:xref] = @anchors[elem.parent["id"]][:xref] + x
333
+ model.permission_parts(elem, id, label, klass).each do |n|
334
+ # we don't have an n["id"], so we allow n[:id] in anchor_struct
335
+ @anchors[n[:id]] = anchor_struct(n[:number], n, n[:label],
336
+ n[:klass], { unnumb: false, container: false })
248
337
  end
249
338
  end
250
339
  end