metanorma-standoc 2.0.1 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/lib/metanorma/standoc/base.rb +61 -22
  3. data/lib/metanorma/standoc/basicdoc.rng +5 -3
  4. data/lib/metanorma/standoc/biblio.rng +7 -5
  5. data/lib/metanorma/standoc/blocks.rb +3 -3
  6. data/lib/metanorma/standoc/cleanup_boilerplate.rb +3 -3
  7. data/lib/metanorma/standoc/cleanup_image.rb +117 -3
  8. data/lib/metanorma/standoc/cleanup_ref.rb +32 -3
  9. data/lib/metanorma/standoc/cleanup_ref_dl.rb +20 -16
  10. data/lib/metanorma/standoc/cleanup_section.rb +2 -2
  11. data/lib/metanorma/standoc/cleanup_terms_designations.rb +4 -2
  12. data/lib/metanorma/standoc/cleanup_text.rb +0 -22
  13. data/lib/metanorma/standoc/cleanup_xref.rb +82 -13
  14. data/lib/metanorma/standoc/converter.rb +2 -0
  15. data/lib/metanorma/standoc/inline.rb +21 -12
  16. data/lib/metanorma/standoc/isodoc.rng +142 -4
  17. data/lib/metanorma/standoc/macros.rb +14 -1
  18. data/lib/metanorma/standoc/macros_embed.rb +72 -0
  19. data/lib/metanorma/standoc/ref.rb +11 -7
  20. data/lib/metanorma/standoc/ref_utility.rb +2 -1
  21. data/lib/metanorma/standoc/render.rb +7 -3
  22. data/lib/metanorma/standoc/table.rb +8 -10
  23. data/lib/metanorma/standoc/term_lookup_cleanup.rb +9 -6
  24. data/lib/metanorma/standoc/terms.rb +10 -7
  25. data/lib/metanorma/standoc/utils.rb +3 -1
  26. data/lib/metanorma/standoc/validate.rb +7 -2
  27. data/lib/metanorma/standoc/version.rb +1 -1
  28. data/spec/assets/a1.adoc +8 -0
  29. data/spec/assets/a2.adoc +8 -0
  30. data/spec/assets/a3.adoc +9 -0
  31. data/spec/assets/a4.adoc +4 -0
  32. data/spec/metanorma/base_spec.rb +1 -1
  33. data/spec/metanorma/cleanup_blocks_spec.rb +136 -0
  34. data/spec/metanorma/cleanup_spec.rb +13 -13
  35. data/spec/metanorma/cleanup_terms_spec.rb +1 -1
  36. data/spec/metanorma/inline_spec.rb +31 -0
  37. data/spec/metanorma/isobib_cache_spec.rb +2 -2
  38. data/spec/metanorma/macros_plantuml_spec.rb +41 -42
  39. data/spec/metanorma/macros_spec.rb +288 -2
  40. data/spec/metanorma/processor_spec.rb +17 -13
  41. data/spec/metanorma/refs_spec.rb +633 -461
  42. data/spec/metanorma/section_spec.rb +1 -1
  43. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +48 -48
  44. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec1.yml +13 -13
  45. data/spec/vcr_cassettes/hide_refs.yml +100 -100
  46. data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
  47. data/spec/vcr_cassettes/isobib_get_123_1.yml +25 -25
  48. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +35 -35
  49. data/spec/vcr_cassettes/isobib_get_123_2001.yml +11 -11
  50. data/spec/vcr_cassettes/isobib_get_124.yml +13 -13
  51. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +18 -18
  52. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +86 -66
  53. metadata +7 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5ab9cbdae658ec4088c0670d2ce1a117799a9325dbb8b8aa24e59b44e94e24c
4
- data.tar.gz: da30d4d7b276b67e2363643e8ae1296a352bc4acee0ef9f2727da00ad276b3cc
3
+ metadata.gz: 48ca241528c217b9b563a2d3f6f2e13b52f2fa24e679ca2de431ebde8d10fb98
4
+ data.tar.gz: f6b70cd60a959376474a35ef4d364f69f9e15fd6582a53571a71cec995d90a01
5
5
  SHA512:
6
- metadata.gz: e8600c60d56d27820da72dbc7259db4e3a91a3e362a4cefa0a5497b545076dab93277e87c5a0368f3037249ed79b5421e92300a8847bcf7c5bdcaca2392a3eab
7
- data.tar.gz: 216bdaa7621b5b722f65a7d86eabbeaf65788df7f135927d04044838c6db31d50999155de829df6e57f5563a4f201121f36cde9c9c023a9af546019ab65d848e
6
+ metadata.gz: f175a4b49b2aa24d8c8b566a6929401f1a61fb217cf2ee03b506d93482a086afb7b09c85e7c6d88c93d1ef57d41e5a79dc6122bf41624842118dfa75759823b4
7
+ data.tar.gz: c395e93a7f1d3c03c63f1063f1689beb3e1725b81d26b2b38769038d491e8fade8462ab1b2f3b6324eede90c7e03b1473ce40873b903fd3859852436d69e7a9a
@@ -31,48 +31,65 @@ module Metanorma
31
31
  @refids = Set.new
32
32
  @anchors = {}
33
33
  @internal_eref_namespaces = []
34
+ @seen_headers = []
34
35
  @draft = node.attributes.has_key?("draft")
35
36
  @novalid = node.attr("novalid")
36
37
  @smartquotes = node.attr("smartquotes") != "false"
37
38
  @keepasciimath = node.attr("mn-keep-asciimath") &&
38
39
  node.attr("mn-keep-asciimath") != "false"
39
- @fontheader = default_fonts(node)
40
- @files_to_delete = []
41
- @filename = if node.attr("docfile")
42
- File.basename(node.attr("docfile"))&.gsub(/\.adoc$/, "")
43
- else ""
44
- end
45
- @localdir = Metanorma::Utils::localdir(node)
46
- @output_dir = outputdir node
47
- @no_isobib_cache = node.attr("no-isobib-cache")
48
- @no_isobib = node.attr("no-isobib")
49
40
  @index_terms = node.attr("index-terms")
50
41
  @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
51
42
  @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
52
- @bibdb = nil
53
- @seen_headers = []
54
43
  @datauriimage = node.attr("data-uri-image") != "false"
55
44
  @boilerplateauthority = node.attr("boilerplate-authority")
56
45
  @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
57
46
  @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
47
+ init_toc(node)
48
+ init_output(node)
49
+ init_i18n(node)
50
+ init_biblio(node)
51
+ @metadata_attrs = metadata_attrs(node)
52
+ end
53
+
54
+ def init_toc(node)
55
+ @htmltoclevels = node.attr("htmltoclevels")
56
+ @doctoclevels = node.attr("doctoclevels")
57
+ @toclevels = node.attr("toclevels")
58
+ @tocfigures = node.attr("toc-figures")
59
+ @toctables = node.attr("toc-tables")
60
+ @tocrecommendations = node.attr("toc-recommendations")
61
+ end
62
+
63
+ def init_output(node)
64
+ @fontheader = default_fonts(node)
58
65
  @log = Metanorma::Utils::Log.new
59
- init_bib_caches(node)
60
- init_iev_caches(node)
66
+ @files_to_delete = []
67
+ @filename = if node.attr("docfile")
68
+ File.basename(node.attr("docfile"))&.gsub(/\.adoc$/, "")
69
+ else ""
70
+ end
71
+ @localdir = Metanorma::Utils::localdir(node)
72
+ @output_dir = outputdir node
73
+ end
74
+
75
+ def init_i18n(node)
61
76
  @lang = (node.attr("language") || "en")
62
77
  @script = (node.attr("script") ||
63
78
  Metanorma::Utils.default_script(node.attr("language")))
64
79
  @isodoc = isodoc(@lang, @script, node.attr("i18nyaml"))
65
80
  @i18n = @isodoc.i18n
66
- @htmltoclevels = node.attr("htmltoclevels")
67
- @doctoclevels = node.attr("doctoclevels")
68
- @toclevels = node.attr("toclevels")
69
- @metadata_attrs = metadata_attrs(node)
81
+ end
82
+
83
+ def init_biblio(node)
84
+ @no_isobib_cache = node.attr("no-isobib-cache")
85
+ @no_isobib = node.attr("no-isobib")
86
+ @bibdb = nil
87
+ init_bib_caches(node)
88
+ init_iev_caches(node)
70
89
  end
71
90
 
72
91
  def document(node)
73
- init(node)
74
- ret = makexml(node).to_xml(encoding: "US-ASCII", indent: 2)
75
- outputs(node, ret) unless node.attr("nodoc") || !node.attr("docfile")
92
+ ret = document1(node)
76
93
  clean_exit
77
94
  ret
78
95
  rescue StandardError => e
@@ -81,6 +98,28 @@ module Metanorma
81
98
  raise e
82
99
  end
83
100
 
101
+ def document1(node)
102
+ init(node)
103
+ ret = makexml(node)
104
+ .to_xml(encoding: "UTF-8", indent: 2,
105
+ save_with: Nokogiri::XML::Node::SaveOptions::AS_XML)
106
+ outputs(node, ret) unless node.attr("nodoc") || !node.attr("docfile")
107
+ ret
108
+ end
109
+
110
+ def insert_xml_cr(doc)
111
+ doc
112
+ .gsub(%r{(</(clause|table|figure|p|bibitem|ul|ol|dl|dt|dd|li|example|
113
+ sourcecode|formula|quote|references|annex|appendix|title|
114
+ name|note|thead|tbody|tfoot|th|td|form|requirement|
115
+ recommendation|permission|imagemap|svgmap|preferred|
116
+ admitted|related|deprecates|letter-symbol|domain|
117
+ graphical-symbol|expression|abbreviation-type|subject|
118
+ pronunciation|grammar|term|terms|termnote|termexample|
119
+ termsource|origin|termref|modification)>)}x, "\\1\n")
120
+ .gsub(%r{(<(title|name))}x, "\n\\1")
121
+ end
122
+
84
123
  def version
85
124
  flavour = self.class.name.sub(/::Converter$/, "").sub(/^.+::/, "")
86
125
  Metanorma.versioned(Metanorma, flavour)[-1]::VERSION
@@ -110,7 +149,7 @@ module Metanorma
110
149
 
111
150
  def makexml(node)
112
151
  result = makexml1(node)
113
- ret1 = cleanup(Nokogiri::XML(result))
152
+ ret1 = cleanup(Nokogiri::XML(insert_xml_cr(result)))
114
153
  ret1.root.add_namespace(nil, xml_namespace)
115
154
  validate(ret1) unless @novalid
116
155
  ret1
@@ -173,9 +173,11 @@
173
173
  <data type="dateTime"/>
174
174
  </attribute>
175
175
  </optional>
176
- <attribute name="from">
177
- <data type="IDREF"/>
178
- </attribute>
176
+ <optional>
177
+ <attribute name="from">
178
+ <data type="IDREF"/>
179
+ </attribute>
180
+ </optional>
179
181
  <optional>
180
182
  <attribute name="to">
181
183
  <data type="IDREF"/>
@@ -209,9 +209,6 @@
209
209
  <zeroOrMore>
210
210
  <ref name="contact"/>
211
211
  </zeroOrMore>
212
- <zeroOrMore>
213
- <ref name="uri"/>
214
- </zeroOrMore>
215
212
  </element>
216
213
  </define>
217
214
  <define name="fullname">
@@ -401,9 +398,9 @@
401
398
  <choice>
402
399
  <!-- iso191606 TODO -->
403
400
  <group>
404
- <oneOrMore>
401
+ <zeroOrMore>
405
402
  <ref name="street"/>
406
- </oneOrMore>
403
+ </zeroOrMore>
407
404
  <ref name="city"/>
408
405
  <optional>
409
406
  <ref name="state"/>
@@ -828,6 +825,11 @@
828
825
  <optional>
829
826
  <attribute name="scope"/>
830
827
  </optional>
828
+ <optional>
829
+ <attribute name="primary">
830
+ <data type="boolean"/>
831
+ </attribute>
832
+ </optional>
831
833
  <text/>
832
834
  </element>
833
835
  </define>
@@ -174,11 +174,11 @@ module Metanorma
174
174
  def paragraph(node)
175
175
  return termsource(node) if node.role == "source"
176
176
 
177
- noko do |xml|
177
+ ret = noko do |xml|
178
178
  xml.p **para_attrs(node) do |xml_t|
179
179
  xml_t << node.content
180
180
  end
181
- end.join("\n")
181
+ end.join
182
182
  end
183
183
 
184
184
  def quote_attrs(node)
@@ -203,7 +203,7 @@ module Metanorma
203
203
  quote_attribution(node, q)
204
204
  wrap_in_para(node, q)
205
205
  end
206
- end.join("\n")
206
+ end.join
207
207
  end
208
208
 
209
209
  def listing_attrs(node)
@@ -56,9 +56,9 @@ module Metanorma
56
56
  TERM_CLAUSE = "//sections/terms | "\
57
57
  "//sections/clause[descendant::terms]".freeze
58
58
 
59
- NORM_REF = "//bibliography/references[@normative = 'true'] | "\
60
- "//bibliography/clause[.//references[@normative = 'true']]"
61
- .freeze
59
+ NORM_REF =
60
+ "//bibliography/references[@normative = 'true'][not(@hidden)] | "\
61
+ "//bibliography/clause[.//references[@normative = 'true']]".freeze
62
62
 
63
63
  def boilerplate_isodoc(xmldoc)
64
64
  x = xmldoc.dup
@@ -2,6 +2,7 @@ module Metanorma
2
2
  module Standoc
3
3
  module Cleanup
4
4
  def svgmap_cleanup(xmldoc)
5
+ svg_uniqueids(xmldoc)
5
6
  svgmap_moveattrs(xmldoc)
6
7
  svgmap_populate(xmldoc)
7
8
  Metanorma::Utils::svgmap_rewrite(xmldoc, @localdir)
@@ -59,12 +60,125 @@ module Metanorma
59
60
  end
60
61
 
61
62
  def img_cleanup(xmldoc)
62
- return xmldoc unless @datauriimage
63
+ if @datauriimage
64
+ xmldoc.xpath("//image").each do |i|
65
+ # do not datauri encode SVG, we need to deduplicate its IDs
66
+ unless read_in_if_svg(i, @localdir)
67
+ i["src"] = Metanorma::Utils::datauri(i["src"], @localdir)
68
+ end
69
+ end
70
+ end
71
+ svg_uniqueids(xmldoc)
72
+ xmldoc
73
+ end
74
+
75
+ def read_in_if_svg(img, localdir)
76
+ return false unless img["src"]
77
+
78
+ path = Metanorma::Utils::svgmap_rewrite0_path(img["src"], localdir)
79
+ File.file?(path) or return false
80
+ types = MIME::Types.type_for(path) or return false
81
+ types.first == "image/svg+xml" or return false
82
+ svg = File.read(path, encoding: "utf-8") or return false
83
+ img.replace(Nokogiri::XML(svg).root.to_xml)
84
+ true
85
+ end
86
+
87
+ IRI_TAG_PROPERTIES_MAP = {
88
+ clipPath: ["clip-path"],
89
+ "color-profile": nil,
90
+ cursor: nil,
91
+ filter: nil,
92
+ linearGradient: ["fill", "stroke"],
93
+ marker: ["marker", "marker-end", "marker-mid", "marker-start"],
94
+ mask: nil,
95
+ pattern: ["fill", "stroke"],
96
+ radialGradient: ["fill", "stroke"],
97
+ }.freeze
98
+
99
+ SVG_NS = "http://www.w3.org/2000/svg".freeze
100
+
101
+ def svg_uniqueids(xmldoc)
102
+ # only keep non-unique identifiers
103
+ ids = xmldoc.xpath("//m:svg//*/@id | //svg/@id", "m" => SVG_NS)
104
+ .map(&:text).group_by(&:itself).transform_values(&:count)
105
+ .delete_if { |_, v| v < 2 }
106
+ xmldoc.xpath("//m:svg", "m" => SVG_NS).each_with_index do |s, i|
107
+ ids = svg_uniqueids1(s, i, ids)
108
+ end
109
+ end
110
+
111
+ def svg_iri_properties(id_elems)
112
+ iri_tag_names = id_elems.each_with_object([]) do |e, m|
113
+ IRI_TAG_PROPERTIES_MAP.key?(e.name.to_sym) and m = m << e.name
114
+ end.uniq
115
+ iri_properties = iri_tag_names.each_with_object([]) do |t, m|
116
+ (IRI_TAG_PROPERTIES_MAP[t.to_sym] || [t]).each { |t1| m = m << t1 }
117
+ end.uniq
118
+ return [] if iri_properties.empty?
119
+
120
+ iri_properties << "style"
121
+ end
63
122
 
64
- xmldoc.xpath("//image").each do |i|
65
- i["src"] = Metanorma::Utils::datauri(i["src"], @localdir)
123
+ def svg_uniqueids1(svg, idx, ids)
124
+ id_elems = svg.xpath(".//*[@id] | ./@id/..")
125
+ iri_properties = svg_iri_properties(id_elems)
126
+ svg_uniqueids2(svg, iri_properties, idx, ids)
127
+ new_ids = id_elems.map { |x| x["id"] }
128
+ .map { |x| x + (ids[x] ? "_inject_#{idx}" : "") }
129
+ ids.merge(new_ids.each.map { |value| [value, true] }.to_h)
130
+ end
131
+
132
+ def svg_uniqueids2(svg, iri_properties, idx, ids)
133
+ svg.traverse do |e|
134
+ next unless e.element?
135
+
136
+ if e.name == "style"
137
+ svg_styleupdate(e, idx, ids)
138
+ elsif !e.attributes.empty?
139
+ svg_attrupdate(e, iri_properties, idx, ids)
140
+ end
141
+ svg_linkupdate(e, idx, ids)
142
+ svg_idupdate(e, idx, ids)
66
143
  end
67
144
  end
145
+
146
+ def svg_update_url(text, idx, ids)
147
+ text.gsub(/url\("?#([a-zA-Z][\w:.-]*)"?\)/) do |x|
148
+ if ids[$1] then "url(##{$1}_inject_#{idx})"
149
+ else x
150
+ end
151
+ end
152
+ end
153
+
154
+ def svg_styleupdate(elem, idx, ids)
155
+ elem.children = svg_update_url(elem.text, idx, ids)
156
+ end
157
+
158
+ def svg_attrupdate(elem, iri_properties, idx, ids)
159
+ iri_properties.each do |p|
160
+ next unless elem[p]
161
+
162
+ elem[p] = svg_update_url(elem[p], idx, ids)
163
+ end
164
+ end
165
+
166
+ def svg_linkupdate(elem, idx, ids)
167
+ %w(xlink:href href).each do |ref|
168
+ iri = elem[ref]&.strip
169
+ next unless /^#/.match?(iri)
170
+ next unless ids[iri.sub(/^#/, "")]
171
+
172
+ elem[ref] += "_inject_#{idx}"
173
+ end
174
+ end
175
+
176
+ def svg_idupdate(elem, idx, ids)
177
+ return unless elem["id"]
178
+ return unless ids[elem["id"]]
179
+
180
+ elem["id"] += "_inject_#{idx}"
181
+ end
68
182
  end
69
183
  end
70
184
  end
@@ -16,7 +16,7 @@ module Metanorma
16
16
  insert = refs&.at("./bibitem")&.previous_element
17
17
  refs.xpath("./bibitem").each(&:remove)
18
18
  bib.reverse.each do |b|
19
- insert and insert.next = b.to_xml or
19
+ (insert and insert.next = b.to_xml) or
20
20
  refs.children.first.add_previous_sibling b.to_xml
21
21
  end
22
22
  extract_notes_from_biblio(refs)
@@ -84,9 +84,39 @@ module Metanorma
84
84
  biblio_reorder(xmldoc)
85
85
  biblio_nested(xmldoc)
86
86
  biblio_renumber(xmldoc)
87
+ biblio_linkonly(xmldoc)
88
+ biblio_hidden_inherit(xmldoc)
87
89
  biblio_no_ext(xmldoc)
88
90
  end
89
91
 
92
+ def biblio_hidden_inherit(xmldoc)
93
+ xmldoc.xpath("//references[@hidden = 'true']").each do |r|
94
+ r.xpath("./bibitem").each do |b|
95
+ b["hidden"] = true
96
+ end
97
+ end
98
+ end
99
+
100
+ def biblio_linkonly(xmldoc)
101
+ return unless xmldoc.at("//xref[@hidden]")
102
+
103
+ ins = xmldoc.at("//bibliography")
104
+ .add_child("<references hidden='true' normative='true'/>").first
105
+ refs = xmldoc.xpath("//xref[@hidden]").each_with_object([]) do |x, m|
106
+ @refids << x["target"]
107
+ m << { id: x["target"], ref: x["hidden"] }
108
+ x.delete("hidden")
109
+ end
110
+ ins << insert_hidden_bibitems(refs)
111
+ end
112
+
113
+ def insert_hidden_bibitems(bib)
114
+ refs = bib.each_with_object([]) do |b, m|
115
+ m << reference1code(%(<ref id="#{b[:id]}">[#{b[:ref]}]</ref>), nil)
116
+ end
117
+ reference_populate(refs)
118
+ end
119
+
90
120
  def biblio_no_ext(xmldoc)
91
121
  xmldoc.xpath("//bibitem/ext").each(&:remove)
92
122
  end
@@ -114,10 +144,9 @@ module Metanorma
114
144
 
115
145
  def reference_names(xmldoc)
116
146
  xmldoc.xpath("//bibitem[not(ancestor::bibitem)]").each do |ref|
117
- # isopub = ref.at(ISO_PUBLISHER_XPATH)
118
147
  docid = ref.at("./docidentifier[@type = 'metanorma']") ||
119
148
  ref.at("./docidentifier[not(@type = 'DOI')]") or next
120
- reference = format_ref(docid.text, docid["type"])
149
+ reference = format_ref(docid.children.to_xml, docid["type"])
121
150
  @anchors[ref["id"]] = { xref: reference }
122
151
  end
123
152
  end
@@ -15,19 +15,20 @@ module Metanorma
15
15
  end
16
16
  end
17
17
 
18
- def validate_ref_dl(bib, c)
18
+ def validate_ref_dl(bib, clause)
19
19
  id = bib["id"]
20
- id ||= c["id"] unless /^_/.match?(c["id"]) # do not accept implicit id
20
+ # do not accept implicit id
21
+ id ||= clause["id"] unless /^_/.match?(clause["id"])
21
22
  unless id
22
- @log.add("Anchors", c,
23
- "The following reference is missing an anchor:\n" + c.to_xml)
23
+ @log.add("Anchors", clause,
24
+ "The following reference is missing an anchor:\n#{clause.to_xml}")
24
25
  return
25
26
  end
26
27
  @refids << id
27
28
  bib["title"] or
28
- @log.add("Bibliography", c, "Reference #{id} is missing a title")
29
+ @log.add("Bibliography", clause, "Reference #{id} is missing a title")
29
30
  bib["docid"] or
30
- @log.add("Bibliography", c,
31
+ @log.add("Bibliography", clause,
31
32
  "Reference #{id} is missing a document identifier (docid)")
32
33
  end
33
34
 
@@ -76,27 +77,30 @@ module Metanorma
76
77
  end
77
78
 
78
79
  # definition list, with at most one level of unordered lists
79
- def dl_bib_extract(c, nested = false)
80
- dl = c.at("./dl") or return
80
+ def dl_bib_extract(clause, nested = false)
81
+ dl = clause.at("./dl") or return
81
82
  bib = {}
82
83
  key = ""
83
84
  dl.xpath("./dt | ./dd").each do |dtd|
84
85
  (dtd.name == "dt" and key = dtd.text.sub(/:+$/, "")) or
85
86
  add_to_hash(bib, key, dd_bib_extract(dtd))
86
87
  end
87
- c.xpath("./clause").each do |c1|
88
+ clause.xpath("./clause").each do |c1|
88
89
  key = c1&.at("./title")&.text&.downcase&.strip
89
90
  next unless %w(contributor relation series).include? key
90
91
 
91
92
  add_to_hash(bib, key, dl_bib_extract(c1, true))
92
93
  end
93
- if !nested && c.at("./title")
94
- title = c.at("./title").remove.children.to_xml
95
- bib["title"] = [bib["title"]] if bib["title"].is_a? Hash
96
- bib["title"] = [bib["title"]] if bib["title"].is_a? String
97
- bib["title"] = [] unless bib["title"]
98
- bib["title"] << title if !title.empty?
99
- end
94
+ dl_bib_extract_title(bib, clause, nested)
95
+ end
96
+
97
+ def dl_bib_extract_title(bib, clause, nested)
98
+ (!nested && clause.at("./title")) or return bib
99
+ title = clause.at("./title").remove.children.to_xml
100
+ bib["title"] = [bib["title"]] if bib["title"].is_a?(Hash) ||
101
+ bib["title"].is_a?(String)
102
+ bib["title"] = [] unless bib["title"]
103
+ bib["title"] << title if !title.empty?
100
104
  bib
101
105
  end
102
106
  end
@@ -54,7 +54,7 @@ module Metanorma
54
54
  end
55
55
 
56
56
  def make_bibliography(xml, sect)
57
- if xml.at("//sections/references")
57
+ if xml.at("//sections/references | //xref[@hidden]")
58
58
  biblio = sect.add_next_sibling("<bibliography/>").first
59
59
  xml.xpath("//sections/references").each do |r|
60
60
  biblio.add_child r.remove
@@ -193,7 +193,7 @@ module Metanorma
193
193
  next unless t.next_element.nil?
194
194
  next if %w(sections annex preface).include? t.parent.name
195
195
 
196
- t.parent.parent << t
196
+ t.parent.next = t
197
197
  found = true
198
198
  end
199
199
  break unless found
@@ -182,10 +182,12 @@ module Metanorma
182
182
 
183
183
  def term_designation_reorder(xmldoc)
184
184
  xmldoc.xpath("//term").each do |t|
185
- %w(preferred admitted deprecates related)
185
+ des = %w(preferred admitted deprecates related)
186
186
  .each_with_object([]) do |tag, m|
187
187
  t.xpath("./#{tag}").each { |x| m << x.remove }
188
- end.reverse.each do |x|
188
+ end.reverse
189
+ t << " "
190
+ des.each do |x|
189
191
  t.children.first.previous = x
190
192
  end
191
193
  end
@@ -28,28 +28,6 @@ module Metanorma
28
28
  end
29
29
 
30
30
  # "abc<tag/>", def => "abc",<tag/> def
31
- =begin
32
- def uninterrupt_quotes_around_xml(xmldoc)
33
- xmldoc.xpath("//*[following::text()[1]"\
34
- "[starts-with(., '\"') or starts-with(., \"'\")]]")
35
- .each do |x|
36
- next if !x.ancestors("pre, tt, sourcecode, stem, figure").empty?
37
-
38
- uninterrupt_quotes_around_xml1(x)
39
- end
40
- end
41
- =end
42
- =begin
43
- def uninterrupt_quotes_around_xml(xmldoc)
44
- xmldoc.traverse do |n|
45
- next unless n.element? && n&.next&.text? &&
46
- n.ancestors("pre, tt, sourcecode, stem, figure").empty?
47
- next unless /^['"]/.match?(n.next.text)
48
-
49
- uninterrupt_quotes_around_xml1(n)
50
- end
51
- end
52
- =end
53
31
  def uninterrupt_quotes_around_xml(xmldoc)
54
32
  xmldoc.traverse do |n|
55
33
  next unless n.text? && n&.previous&.element?