isodoc 2.1.1 → 2.1.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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/isodoc.gemspec +4 -1
  3. data/lib/isodoc/base_style/blocks.scss +7 -0
  4. data/lib/isodoc/class_utils.rb +16 -0
  5. data/lib/isodoc/function/inline.rb +2 -0
  6. data/lib/isodoc/function/lists.rb +24 -9
  7. data/lib/isodoc/function/to_word_html.rb +1 -0
  8. data/lib/isodoc/function/utils.rb +21 -7
  9. data/lib/isodoc/gem_tasks.rb +19 -10
  10. data/lib/isodoc/i18n.rb +19 -0
  11. data/lib/isodoc/metadata.rb +2 -2
  12. data/lib/isodoc/presentation_function/block.rb +7 -3
  13. data/lib/isodoc/presentation_function/image.rb +1 -1
  14. data/lib/isodoc/presentation_function/inline.rb +11 -12
  15. data/lib/isodoc/presentation_function/section.rb +1 -1
  16. data/lib/isodoc/presentation_function/xrefs.rb +23 -9
  17. data/lib/isodoc/presentation_xml_convert.rb +1 -0
  18. data/lib/isodoc/version.rb +1 -1
  19. data/lib/isodoc/word_function/body.rb +6 -3
  20. data/lib/isodoc/word_function/inline.rb +7 -2
  21. data/lib/isodoc/xref/xref_gen.rb +6 -6
  22. data/lib/isodoc/xref.rb +1 -1
  23. data/lib/isodoc-yaml/i18n-ar.yaml +1 -0
  24. data/lib/isodoc-yaml/i18n-de.yaml +1 -0
  25. data/lib/isodoc-yaml/i18n-en.yaml +1 -0
  26. data/lib/isodoc-yaml/i18n-es.yaml +1 -0
  27. data/lib/isodoc-yaml/i18n-fr.yaml +1 -0
  28. data/lib/isodoc-yaml/i18n-ru.yaml +1 -0
  29. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
  30. metadata +3 -50
  31. data/.github/workflows/rake.yml +0 -15
  32. data/.github/workflows/release.yml +0 -24
  33. data/.hound.yml +0 -5
  34. data/.oss-guides.rubocop.yml +0 -1077
  35. data/.rubocop.yml +0 -10
  36. data/Rakefile +0 -8
  37. data/bin/rspec +0 -17
  38. data/spec/assets/header.html +0 -7
  39. data/spec/assets/html.scss +0 -20
  40. data/spec/assets/html_override.css +0 -1
  41. data/spec/assets/htmlcover.html +0 -4
  42. data/spec/assets/htmlintro.html +0 -5
  43. data/spec/assets/i18n.yaml +0 -41
  44. data/spec/assets/iso.xml +0 -8
  45. data/spec/assets/odf.emf +0 -0
  46. data/spec/assets/odf.svg +0 -1
  47. data/spec/assets/odf1.svg +0 -4
  48. data/spec/assets/outputtest/a.xml +0 -66
  49. data/spec/assets/outputtest/iso.international-standard.xsl +0 -3011
  50. data/spec/assets/rice_image1 +0 -0
  51. data/spec/assets/rice_image1.png +0 -0
  52. data/spec/assets/scripts.html +0 -3
  53. data/spec/assets/scripts_override.html +0 -3
  54. data/spec/assets/std.css +0 -2
  55. data/spec/assets/word.css +0 -2
  56. data/spec/assets/word_override.css +0 -1
  57. data/spec/assets/wordcover.html +0 -3
  58. data/spec/assets/wordintro.html +0 -4
  59. data/spec/isodoc/blocks_spec.rb +0 -2934
  60. data/spec/isodoc/cleanup_spec.rb +0 -1056
  61. data/spec/isodoc/footnotes_spec.rb +0 -264
  62. data/spec/isodoc/form_spec.rb +0 -160
  63. data/spec/isodoc/i18n_spec.rb +0 -1201
  64. data/spec/isodoc/inline_spec.rb +0 -2301
  65. data/spec/isodoc/lists_spec.rb +0 -469
  66. data/spec/isodoc/metadata_spec.rb +0 -401
  67. data/spec/isodoc/postproc_spec.rb +0 -2938
  68. data/spec/isodoc/presentation_xml_spec.rb +0 -1476
  69. data/spec/isodoc/ref_spec.rb +0 -955
  70. data/spec/isodoc/section_spec.rb +0 -2123
  71. data/spec/isodoc/table_spec.rb +0 -588
  72. data/spec/isodoc/terms_spec.rb +0 -712
  73. data/spec/isodoc/utils_spec.rb +0 -57
  74. data/spec/isodoc/xref_numbering_spec.rb +0 -378
  75. data/spec/isodoc/xref_spec.rb +0 -1837
  76. data/spec/isodoc/xslfo_convert_spec.rb +0 -103
  77. data/spec/spec_helper.rb +0 -88
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aff7d421567c13d1c20aa58af56f75a5ef83d78c5268580cef8236b951e41f4d
4
- data.tar.gz: 3f81f0d40caa3e069cc814195e565e824c5fd072a8ca408aa70ce2d7026862eb
3
+ metadata.gz: 3bf48bda8bc7d17d20a766f93c30bcf9f6e7e597497f8663f2c96ff292ada4f5
4
+ data.tar.gz: 7efd7f5c3aff9ee37fc631eecd1a564213ab56f92780807d1dff2b17e05c402b
5
5
  SHA512:
6
- metadata.gz: 722f301c40200078c8753612504b5311bd5f1f87041143c9172b70a9b121066579ffb7fd9ce13ebce46a052360e105590fce318324a25175878685ca65958210
7
- data.tar.gz: 1f78ddc58e32b347464eb1f73245fc85b4ddb3cb6ac5d27aa9bdaf6f0cc47dfd1db74e648e26ee8ad2860d28eef7530d503471a8ade31f572d9d495299ee033b
6
+ metadata.gz: 449d645dc7a4caaf2cd778dedfa4bb995344c3c83b076abbe4ea971b32d6fc9515ee7ae1140d76dfbc5f2c01220513979ea239c095fc2037b84263996a728e4f
7
+ data.tar.gz: 2031af0175ba1ba995fe3cca887180fa0e0d097dcfd6e2afb51eb7dc60ad8934bfbf4fc17dd9f91f1f2fba8e63e46efd8cee7a2fb2e9693d3f3f804ef432f662
data/isodoc.gemspec CHANGED
@@ -24,7 +24,10 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.bindir = "bin"
26
26
  spec.require_paths = ["lib"]
27
- spec.files = `git ls-files`.split("\n")
27
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
28
+ f.match(%r{^(test|spec|features|.github)/}) \
29
+ || f.match(%r{\.[a-zA-Z0-9_-]+\.yml|Rakefile|bin/rspec})
30
+ end
28
31
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
29
32
  spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
30
33
 
@@ -23,6 +23,13 @@
23
23
  }
24
24
  }
25
25
 
26
+ @mixin listBlock() {
27
+ .ListTitle {
28
+ @include blockTitle();
29
+ text-align: left;
30
+ }
31
+ }
32
+
26
33
  @mixin figureBlock() {
27
34
  .FigureTitle, .figure-title {
28
35
  @include blockTitle();
@@ -62,5 +62,21 @@ module IsoDoc
62
62
  end
63
63
  xml.root.children.to_xml
64
64
  end
65
+
66
+ def nearest_block_parent(node)
67
+ until %w(p title td th name formula li dt dd sourcecode pre quote
68
+ note example)
69
+ .include?(node.name)
70
+ node = node.parent
71
+ end
72
+ node
73
+ end
74
+
75
+ # node is at the start of sentence in a Metanorma XML context
76
+ def start_of_sentence(node)
77
+ prec = nearest_block_parent(node).xpath("./descendant-or-self::text()") &
78
+ node.xpath("./preceding::text()")
79
+ prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map(&:text).join)
80
+ end
65
81
  end
66
82
  end
@@ -14,6 +14,8 @@ module IsoDoc
14
14
  end
15
15
  end
16
16
 
17
+ def location_parse(node, out); end
18
+
17
19
  def span_parse(node, out)
18
20
  node.children.each { |n| parse(n, out) }
19
21
  end
@@ -1,13 +1,21 @@
1
1
  module IsoDoc
2
2
  module Function
3
3
  module Lists
4
+ def list_title_parse(node, out)
5
+ name = node.at(ns("./name")) or return
6
+ out.p **{ class: "ListTitle" } do |p|
7
+ name&.children&.each { |n| parse(n, p) }
8
+ end
9
+ end
10
+
4
11
  def ul_attrs(node)
5
12
  { id: node["id"], style: keep_style(node) }
6
13
  end
7
14
 
8
15
  def ul_parse(node, out)
16
+ list_title_parse(node, out)
9
17
  out.ul **attr_code(ul_attrs(node)) do |ul|
10
- node.children.each { |n| parse(n, ul) }
18
+ node.children.each { |n| n.name == "name" or parse(n, ul) }
11
19
  end
12
20
  end
13
21
 
@@ -44,8 +52,9 @@ module IsoDoc
44
52
  end
45
53
 
46
54
  def ol_parse(node, out)
55
+ list_title_parse(node, out)
47
56
  out.ol **attr_code(ol_attrs(node)) do |ol|
48
- node.children.each { |n| parse(n, ol) }
57
+ node.children.each { |n| n.name == "name" or parse(n, ol) }
49
58
  end
50
59
  end
51
60
 
@@ -82,17 +91,23 @@ module IsoDoc
82
91
  end
83
92
 
84
93
  def dl_parse(node, out)
94
+ list_title_parse(node, out)
85
95
  out.dl **dl_attrs(node) do |v|
86
96
  node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
87
- v.dt **attr_code(id: dt["id"]) do |term|
88
- dt_parse(dt, term)
89
- end
90
- v.dd **attr_code(id: dd["id"]) do |listitem|
91
- dd.children.each { |n| parse(n, listitem) }
92
- end
97
+ dl_parse1(v, dt, dd)
93
98
  end
94
99
  end
95
- node.elements.reject { |n| dt_dd? n }.each { |n| parse(n, out) }
100
+ node.elements.reject { |n| dt_dd?(n) || n.name == "name" }
101
+ .each { |n| parse(n, out) }
102
+ end
103
+
104
+ def dl_parse1(dlist, dterm, ddef)
105
+ dlist.dt **attr_code(id: dterm["id"]) do |term|
106
+ dt_parse(dterm, term)
107
+ end
108
+ dlist.dd **attr_code(id: ddef["id"]) do |listitem|
109
+ ddef.children.each { |n| parse(n, listitem) }
110
+ end
96
111
  end
97
112
  end
98
113
  end
@@ -231,6 +231,7 @@ module IsoDoc
231
231
  when "toc" then toc_parse(node, out)
232
232
  when "variant-title" then variant_title(node, out)
233
233
  when "span" then span_parse(node, out)
234
+ when "location" then location_parse(node, out)
234
235
  else error_parse(node, out)
235
236
  end
236
237
  end
@@ -11,6 +11,10 @@ module IsoDoc
11
11
  self.class.ns(xpath)
12
12
  end
13
13
 
14
+ def start_of_sentence(node)
15
+ self.class.start_of_sentence(node)
16
+ end
17
+
14
18
  def insert_tab(out, count)
15
19
  tab = %w(Hans Hant).include?(@script) ? "&#x3000;" : "&#xa0; "
16
20
  [1..count].each { out << tab }
@@ -58,24 +62,30 @@ module IsoDoc
58
62
  end
59
63
  end
60
64
 
61
- def to_xhtml_prep(xml)
62
- xml.gsub!(/<\?xml[^>]*>/, "")
63
- /<!DOCTYPE /.match(xml) || (xml = DOCTYPE_HDR + xml)
65
+ def numeric_escapes(xml)
66
+ c = HTMLEntities.new
64
67
  xml.split(/(&[^ \r\n\t#;]+;)/).map do |t|
65
68
  if /^(&[^ \t\r\n#;]+;)/.match?(t)
66
- HTMLEntities.new.encode(HTMLEntities.new.decode(t), :hexadecimal)
69
+ c.encode(c.decode(t), :hexadecimal)
67
70
  else t
68
71
  end
69
72
  end.join
70
73
  end
71
74
 
75
+ def to_xhtml_prep(xml)
76
+ xml.gsub!(/<\?xml[^>]*>/, "")
77
+ /<!DOCTYPE /.match(xml) || (xml = DOCTYPE_HDR + xml)
78
+ numeric_escapes(xml)
79
+ end
80
+
72
81
  def to_xhtml_fragment(xml)
73
82
  doc = ::Nokogiri::XML.parse(NOKOHEAD)
74
83
  doc.fragment(xml)
75
84
  end
76
85
 
77
86
  def from_xhtml(xml)
78
- xml.to_xml.sub(%r{ xmlns="http://www.w3.org/1999/xhtml"}, "")
87
+ numeric_escapes(xml.to_xml
88
+ .sub(%r{ xmlns="http://www.w3.org/1999/xhtml"}, ""))
79
89
  end
80
90
 
81
91
  CLAUSE_ANCESTOR =
@@ -100,8 +110,12 @@ module IsoDoc
100
110
  "local-name() = 'figure' or local-name() = 'formula' or "\
101
111
  "local-name() = 'table' or local-name() = 'example']/@id"
102
112
 
103
- def get_note_container_id(node)
104
- container = node.xpath(NOTE_CONTAINER_ANCESTOR)
113
+ # no recursion on references
114
+ def get_note_container_id(node, type)
115
+ xpath = NOTE_CONTAINER_ANCESTOR.dup
116
+ %w(figure table example).include?(type) and
117
+ xpath.sub!(%r[ or local-name\(\) = '#{type}'], "")
118
+ container = node.xpath(xpath)
105
119
  container&.last&.text || nil
106
120
  end
107
121
 
@@ -8,14 +8,20 @@ module IsoDoc
8
8
  module GemTasks
9
9
  extend Rake::DSL if defined? Rake::DSL
10
10
 
11
+ @@css_list = []
12
+
11
13
  module_function
12
14
 
15
+ def self.css_list
16
+ @@css_list
17
+ end
18
+
13
19
  def install
14
20
  rule ".css" => [proc { |tn| tn.sub(/\.css$/, ".scss") }] do |current_task|
15
21
  puts(current_task)
16
22
  compile_scss_task(current_task)
17
23
  rescue StandardError => e
18
- notify_borken_compilation(e, current_task)
24
+ notify_broken_compilation(e, current_task)
19
25
  end
20
26
 
21
27
  scss_files = Rake::FileList["lib/**/*.scss"]
@@ -40,25 +46,27 @@ module IsoDoc
40
46
  end
41
47
  end
42
48
 
43
- def notify_borken_compilation(error, current_task)
49
+ def interactive?
50
+ ENV["CI"] == nil
51
+ end
52
+
53
+ def notify_broken_compilation(error, current_task)
44
54
  puts("Cannot compile #{current_task} because of #{error.message}")
55
+ return unless interactive?
56
+
45
57
  puts("continue anyway[y|n]?")
46
- answer = STDIN.gets.strip
47
- if %w[y yes].include?(answer.strip.downcase)
48
- puts("Cannot compile #{current_task} because of #{error.message}")
49
- else
50
- exit(0)
51
- end
58
+ answer = $stdin.gets.strip
59
+ exit(0) unless %w[y yes].include?(answer.strip.downcase)
52
60
  end
53
61
 
54
62
  def git_cache_compiled_files
55
- CLEAN.each do |css_file|
63
+ @@css_list.each do |css_file|
56
64
  sh "git add #{css_file}"
57
65
  end
58
66
  end
59
67
 
60
68
  def git_rm_compiled_files
61
- CLEAN.each do |css_file|
69
+ @@css_list.each do |css_file|
62
70
  sh "git rm --cached #{css_file}"
63
71
  end
64
72
  end
@@ -129,6 +137,7 @@ module IsoDoc
129
137
  File.open(compiled_path, "w:UTF-8") do |f|
130
138
  f.write(content)
131
139
  end
140
+ @@css_list << compiled_path
132
141
  CLEAN << compiled_path
133
142
  end
134
143
  end
data/lib/isodoc/i18n.rb CHANGED
@@ -23,3 +23,22 @@ module IsoDoc
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ class ::Hash
28
+ def deep_merge(second)
29
+ merger = proc { |_, v1, v2|
30
+ if Hash === v1 && Hash === v2
31
+ v1.merge(v2, &merger)
32
+ elsif Array === v1 && Array === v2
33
+ v1 | v2
34
+ elsif [:undefined, nil,
35
+ :nil].include?(v2)
36
+ v1
37
+ else
38
+ v2
39
+ end
40
+ }
41
+ merge(second.to_h, &merger)
42
+ end
43
+ end
44
+
@@ -11,8 +11,8 @@ module IsoDoc
11
11
  Common::ns(xpath)
12
12
  end
13
13
 
14
- def l10n(a, b, c)
15
- @i18n.l10n(a, b, c)
14
+ def l10n(expr, lang, script)
15
+ @i18n.l10n(expr, lang, script)
16
16
  end
17
17
 
18
18
  def initialize(lang, script, i18n, fonts_options = {})
@@ -8,6 +8,10 @@ module IsoDoc
8
8
  text.capitalize
9
9
  end
10
10
 
11
+ def block_delim
12
+ "&#xa0;&#x2014; "
13
+ end
14
+
11
15
  def prefix_name(node, delim, number, elem)
12
16
  return if number.nil? || number.empty?
13
17
 
@@ -31,7 +35,7 @@ module IsoDoc
31
35
  return if labelled_ancestor(elem)
32
36
 
33
37
  lbl = @xrefs.anchor(elem["id"], :label, false) or return
34
- prefix_name(elem, "&#xa0;&#x2014; ",
38
+ prefix_name(elem, block_delim,
35
39
  l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
36
40
  end
37
41
 
@@ -60,7 +64,7 @@ module IsoDoc
60
64
  else
61
65
  l10n("#{@i18n.example} #{n[:label]}")
62
66
  end
63
- prefix_name(elem, "&#xa0;&#x2014; ", lbl, "name")
67
+ prefix_name(elem, block_delim, lbl, "name")
64
68
  end
65
69
 
66
70
  def note(docxml)
@@ -130,7 +134,7 @@ module IsoDoc
130
134
  return if elem["unnumbered"] && !elem.at(ns("./name"))
131
135
 
132
136
  n = @xrefs.anchor(elem["id"], :label, false)
133
- prefix_name(elem, "&#xa0;&#x2014; ", l10n("#{lower2cap @i18n.table} #{n}"),
137
+ prefix_name(elem, block_delim, l10n("#{lower2cap @i18n.table} #{n}"),
134
138
  "name")
135
139
  end
136
140
 
@@ -32,7 +32,7 @@ module IsoDoc
32
32
  return if elem.at(ns("./figure")) && !elem.at(ns("./name"))
33
33
 
34
34
  lbl = @xrefs.anchor(elem["id"], :label, false) or return
35
- prefix_name(elem, "&#xa0;&#x2014; ",
35
+ prefix_name(elem, block_delim,
36
36
  l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
37
37
  end
38
38
 
@@ -3,14 +3,6 @@ require_relative "xrefs"
3
3
 
4
4
  module IsoDoc
5
5
  class PresentationXMLConvert < ::IsoDoc::Convert
6
- def nearest_block_parent(node)
7
- until %w(p title td th name formula li dt dd sourcecode pre)
8
- .include?(node.name)
9
- node = node.parent
10
- end
11
- node
12
- end
13
-
14
6
  def non_locality_elems(node)
15
7
  node.children.reject do |c|
16
8
  %w{locality localityStack location}.include? c.name
@@ -179,12 +171,13 @@ module IsoDoc
179
171
  def eref_locality_populate(type, node)
180
172
  return "" if node["droploc"] == "true"
181
173
 
182
- loc = @i18n.locality[type] || type.sub(/^locality:/, "")
183
- loc = case node["case"]
174
+ loc = type.sub(/^locality:/, "")
175
+ ret = @i18n.locality[loc] || loc
176
+ ret = case node["case"]
184
177
  when "lowercase" then loc.downcase
185
- else Metanorma::Utils.strict_capitalize_first(loc)
178
+ else Metanorma::Utils.strict_capitalize_first(ret)
186
179
  end
187
- " #{loc}"
180
+ " #{ret}"
188
181
  end
189
182
 
190
183
  def xref(docxml)
@@ -226,6 +219,12 @@ module IsoDoc
226
219
  end
227
220
  end
228
221
 
222
+ def identifier(docxml)
223
+ docxml.xpath(ns("//identifier")).each do |n|
224
+ n.name = "tt"
225
+ end
226
+ end
227
+
229
228
  private
230
229
 
231
230
  def found_matching_variant_sibling(node)
@@ -177,7 +177,7 @@ module IsoDoc
177
177
 
178
178
  def toc(docxml)
179
179
  docxml.xpath(ns("//toc//xref[text()]")).each do |x|
180
- lbl = @xrefs.get[x["target"]][:label] or next
180
+ lbl = @xrefs.anchor(x["target"], :label) or next
181
181
  x.children.first.previous = "#{lbl}<tab/>"
182
182
  end
183
183
  end
@@ -26,24 +26,39 @@ module IsoDoc
26
26
  def anchor_linkend1(node)
27
27
  linkend = @xrefs.anchor(node["target"], :xref)
28
28
  container = @xrefs.anchor(node["target"], :container, false)
29
- (container && get_note_container_id(node) != container &&
30
- @xrefs.get[node["target"]]) and
29
+ prefix_container?(container, node) and
31
30
  linkend = prefix_container(container, linkend, node["target"])
32
31
  capitalise_xref(node, linkend, anchor_value(node["target"]))
33
32
  end
34
33
 
34
+ def prefix_container?(container, node)
35
+ type = @xrefs.anchor(node["target"], :type)
36
+ container &&
37
+ get_note_container_id(node, type) != container &&
38
+ @xrefs.get[node["target"]]
39
+ end
40
+
35
41
  def combine_xref_locations(node)
36
42
  locs = gather_xref_locations(node)
37
43
  linkend = if can_conflate_xref_rendering?(locs)
38
- out = locs.each { |l| l[:target] = anchor_value(l[:target]) }
39
- l10n("#{locs.first[:elem]} #{combine_conn(out)}")
44
+ combine_conflated_xref_locations(locs)
40
45
  else
41
- out = locs.each { |l| l[:target] = anchor_linked1(l[:node]) }
46
+ out = locs.each { |l| l[:target] = anchor_linkend1(l[:node]) }
42
47
  l10n(combine_conn(out))
43
48
  end
44
49
  capitalise_xref(node, linkend, anchor_value(node["target"]))
45
50
  end
46
51
 
52
+ def combine_conflated_xref_locations(locs)
53
+ out = locs.each { |l| l[:target] = anchor_value(l[:target]) }
54
+ ret = l10n("#{locs.first[:elem]} #{combine_conn(out)}")
55
+ container = @xrefs.anchor(locs.first[:node]["target"], :container,
56
+ false)
57
+ prefix_container?(container, locs.first[:node]) and
58
+ ret = prefix_container(container, ret, locs.first[:node]["target"])
59
+ ret
60
+ end
61
+
47
62
  def gather_xref_locations(node)
48
63
  node.xpath(ns("./location")).each_with_object([]) do |l, m|
49
64
  type = @xrefs.anchor(l["target"], :type)
@@ -74,7 +89,8 @@ module IsoDoc
74
89
  end
75
90
 
76
91
  def can_conflate_xref_rendering?(locs)
77
- !locs.all? { |l| l[:container].nil? } &&
92
+ (locs.all? { |l| l[:container].nil? } ||
93
+ locs.all? { |l| l[:container] == locs.first[:container] }) &&
78
94
  locs.all? { |l| l[:type] == locs[0][:type] }
79
95
  end
80
96
 
@@ -89,9 +105,7 @@ module IsoDoc
89
105
  end
90
106
 
91
107
  def capitalise_xref1(node, linkend)
92
- prec = nearest_block_parent(node).xpath("./descendant-or-self::text()") &
93
- node.xpath("./preceding::text()")
94
- if prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map(&:text).join)
108
+ if start_of_sentence(node)
95
109
  Common::case_with_markup(linkend, "capital", @script)
96
110
  else linkend
97
111
  end
@@ -68,6 +68,7 @@ module IsoDoc
68
68
  quotesource docxml
69
69
  mathml docxml
70
70
  variant docxml
71
+ identifier docxml
71
72
  end
72
73
 
73
74
  def terms(docxml)
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.1.1".freeze
2
+ VERSION = "2.1.3".freeze
3
3
  end
@@ -92,8 +92,10 @@ module IsoDoc
92
92
  end
93
93
 
94
94
  def dl_parse_table(node, out)
95
+ list_title_parse(node, out)
95
96
  out.table **{ class: "dl" } do |v|
96
- node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
97
+ node.elements.select { |n| dt_dd?(n) }
98
+ .each_slice(2) do |dt, dd|
97
99
  dl_parse_table1(v, dt, dd)
98
100
  end
99
101
  dl_parse_notes(node, v)
@@ -112,11 +114,12 @@ module IsoDoc
112
114
  end
113
115
 
114
116
  def dl_parse_notes(node, out)
115
- return if node.elements.reject { |n| dt_dd? n }.empty?
117
+ remainder = node.elements.reject { |n| dt_dd?(n) || n.name == "name" }
118
+ return if remainder.empty?
116
119
 
117
120
  out.tr do |tr|
118
121
  tr.td **{ colspan: 2 } do |td|
119
- node.elements.reject { |n| dt_dd? n }.each { |n| parse(n, td) }
122
+ remainder.each { |n| parse(n, td) }
120
123
  end
121
124
  end
122
125
  end
@@ -1,9 +1,14 @@
1
1
  module IsoDoc
2
2
  module WordFunction
3
3
  module Body
4
- def section_break(body)
4
+ def section_break(body, continuous: false)
5
5
  body.p do |p|
6
- p.br **{ clear: "all", class: "section" }
6
+ if continuous
7
+ p.br **{ clear: "all", style: "page-break-before:auto;"\
8
+ "mso-break-type:section-break" }
9
+ else
10
+ p.br **{ clear: "all", class: "section" }
11
+ end
7
12
  end
8
13
  end
9
14
 
@@ -43,7 +43,7 @@ module IsoDoc
43
43
  end
44
44
 
45
45
  def termnote_anchor_names(docxml)
46
- docxml.xpath(ns("//term[termnote]")).each do |t|
46
+ docxml.xpath(ns("//*[termnote]")).each do |t|
47
47
  c = Counter.new
48
48
  t.xpath(ns("./termnote")).reject { |n| blank?(n["id"]) }.each do |n|
49
49
  c.increment(n)
@@ -57,7 +57,7 @@ module IsoDoc
57
57
  end
58
58
 
59
59
  def termexample_anchor_names(docxml)
60
- docxml.xpath(ns("//term[termexample]")).each do |t|
60
+ docxml.xpath(ns("//*[termexample]")).each do |t|
61
61
  examples = t.xpath(ns("./termexample"))
62
62
  c = Counter.new
63
63
  examples.reject { |n| blank?(n["id"]) }.each do |n|
@@ -148,12 +148,12 @@ module IsoDoc
148
148
  c = Counter.new(list["start"] ? list["start"].to_i - 1 : 0)
149
149
  list.xpath(ns("./li")).each do |li|
150
150
  label = c.increment(li).listlabel(list, depth)
151
- label = "#{prev_label}.#{label}" unless prev_label.empty?
151
+ label = "#{prev_label}) #{label}" unless prev_label.empty?
152
152
  label = "#{list_anchor[:xref]} #{label}" if refer_list
153
153
  li["id"] and @anchors[li["id"]] =
154
- { xref: "#{label})", type: "listitem",
155
- container: list_anchor[:container] }
156
- li.xpath(ns("./ol")).each do |ol|
154
+ { xref: "#{label})", type: "listitem", refer_list:
155
+ refer_list, container: list_anchor[:container] }
156
+ (li.xpath(ns(".//ol")) - li.xpath(ns(".//ol//ol"))).each do |ol|
157
157
  list_item_anchor_names(ol, list_anchor, depth + 1, label, false)
158
158
  end
159
159
  end
data/lib/isodoc/xref.rb CHANGED
@@ -52,7 +52,7 @@ module IsoDoc
52
52
 
53
53
  # extract names for all anchors, xref and label
54
54
  def parse(docxml)
55
- amend_preprocess(docxml) if @parse_settings.empty?
55
+ amend_preprocess(docxml) if @parse_settings.empty?
56
56
  initial_anchor_names(docxml)
57
57
  back_anchor_names(docxml)
58
58
  # preempt clause notes with all other types of note (ISO default)
@@ -132,6 +132,7 @@ relatedterms:
132
132
  contrast: مضاد
133
133
  # تباين
134
134
  see: انظر
135
+ seealso: انظر أيضا
135
136
  inflection:
136
137
  فقرة:
137
138
  sg: فقرة
@@ -138,6 +138,7 @@ relatedterms:
138
138
  compare: vergleiche
139
139
  contrast: dagegen
140
140
  see: siehe
141
+ seealso: siehe auch
141
142
  inflection:
142
143
  Klausel:
143
144
  sg: Klausel
@@ -138,6 +138,7 @@ relatedterms:
138
138
  compare: compare
139
139
  contrast: contrast
140
140
  see: see
141
+ seealso: see also
141
142
  inflection:
142
143
  Clause:
143
144
  sg: Clause
@@ -138,6 +138,7 @@ relatedterms:
138
138
  compare: relacionado
139
139
  contrast: difiere
140
140
  see: véase
141
+ seealso: véase tambien
141
142
  inflection:
142
143
  Cláusula:
143
144
  sg: Cláusula
@@ -136,6 +136,7 @@ relatedterms:
136
136
  compare: comparez
137
137
  contrast: contrastez
138
138
  see: voir
139
+ seealso: voir aussi
139
140
  inflection:
140
141
  Clause:
141
142
  sg: Article
@@ -143,6 +143,7 @@ relatedterms:
143
143
  compare: наравне
144
144
  contrast: противоположный
145
145
  see: см.
146
+ seealso: см. также
146
147
  inflection:
147
148
  Пункт:
148
149
  sg: Пункт
@@ -132,4 +132,5 @@ relatedterms:
132
132
  compare: 比较
133
133
  contrast: 对比
134
134
  see: 见
135
+ seealso: 参见
135
136