isodoc 1.8.1 → 1.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec504b3b905ec960bef74398b3789ab5b7eb248dc05a7c3f64590db77d31cac6
4
- data.tar.gz: c2de4c1589a7ff282715f4930a1851393358a64fd407c5a1e3bda02beddc0782
3
+ metadata.gz: f13a3c3a1018484dfa9518b6831d188803ca83c2d89ee872ff17723994c0fae7
4
+ data.tar.gz: b4461e1537e949cbfbc851309cc1f29c974a38fda8728f405591dc586267943c
5
5
  SHA512:
6
- metadata.gz: 34a1c43f6f34f90aa326ed7ff50ede791eadaf22c05ebf0f4183fb2cb3c708bd4f0512572b638a94e236b807f5a873986c24579fe126eb88ad15ef1e178c64d2
7
- data.tar.gz: 23fbe4f295729ad565ab787903e9c4b49388671766b91477dc3d26302b8499da892f77d6e034ce4f6cc4ba1b0956c8dbb051e94a3a336acdb661d1e6d30e584b
6
+ metadata.gz: eb0cf999d3a0155a13913543101228f4c1d60c4705dfdd67ca76f4e21fd00e59853040e4bbe516b64d4fc11a0aaf7da3573f8932f6bf7112dd3293ccc82263a2
7
+ data.tar.gz: c43855701417ffcad7a7e85086b489995ac1af483752c5b9ad1f958fbf944e38a94ca5fd3b4dcf90103608cad6a2d9b6d08fa46a877dffaeef14475212e7056c
data/Gemfile CHANGED
@@ -9,3 +9,5 @@ gemspec
9
9
  if File.exist? "Gemfile.devel"
10
10
  eval File.read("Gemfile.devel"), nil, "Gemfile.devel" # rubocop:disable Security/Eval
11
11
  end
12
+
13
+ gem "reline", "~> 0.2.8.pre.11"
data/isodoc.gemspec CHANGED
@@ -43,7 +43,7 @@ Gem::Specification.new do |spec|
43
43
  spec.add_dependency "twitter_cldr", ">= 6.6.0"
44
44
  spec.add_dependency "uuidtools"
45
45
 
46
- spec.add_development_dependency "byebug", "~> 9.1"
46
+ spec.add_development_dependency "debug"
47
47
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
48
48
  spec.add_development_dependency "guard", "~> 2.14"
49
49
  spec.add_development_dependency "guard-rspec", "~> 4.7"
@@ -16,7 +16,7 @@ module IsoDoc
16
16
  xpath.gsub(%r{/([a-zA-z])}, "/xmlns:\\1")
17
17
  .gsub(%r{::([a-zA-z])}, "::xmlns:\\1")
18
18
  .gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]* ?=)}, "[xmlns:\\1")
19
- .gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]*\])}, "[xmlns:\\1")
19
+ .gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]*[/\]])}, "[xmlns:\\1")
20
20
  end
21
21
 
22
22
  def liquid(doc)
@@ -2,17 +2,7 @@ module IsoDoc
2
2
  module Function
3
3
  module Cleanup
4
4
  def textcleanup(docxml)
5
- termref_cleanup(passthrough_cleanup(docxml))
6
- end
7
-
8
- def termref_cleanup(docxml)
9
- docxml
10
- .gsub(/\s*\[MODIFICATION\]\s*\[\/TERMREF\]/,
11
- l10n(", #{@i18n.modified} [/TERMREF]"))
12
- .gsub(%r{\s*\[/TERMREF\]\s*</p>\s*<p>\s*\[TERMREF\]}, "; ")
13
- .gsub(/\[TERMREF\]\s*/, l10n("[#{@i18n.source}: "))
14
- .gsub(%r{\s*\[/TERMREF\]\s*}, l10n("]"))
15
- .gsub(/\s*\[MODIFICATION\]/, l10n(", #{@i18n.modified} &mdash; "))
5
+ passthrough_cleanup(docxml)
16
6
  end
17
7
 
18
8
  def passthrough_cleanup(docxml)
@@ -5,7 +5,7 @@ module IsoDoc
5
5
  module Inline
6
6
  def link_parse(node, out)
7
7
  url = node["target"]
8
- node["updatetype"] == "true" and url = suffix_url(url)
8
+ node["update-type"] == "true" and url = suffix_url(url)
9
9
  out.a **attr_code(href: url, title: node["alt"]) do |l|
10
10
  if node.text.empty?
11
11
  l << node["target"].sub(/^mailto:/, "")
@@ -41,8 +41,8 @@ module IsoDoc
41
41
  end
42
42
 
43
43
  def eref_target(node)
44
- return "##{node['bibitemid']}" unless url = @bibitems[node["bibitemid"]]
45
- &.at(ns("./uri[@type = 'citation']"))
44
+ return "##{node['bibitemid']}" unless (!@bibitems.nil? &&
45
+ url = @bibitems[node["bibitemid"]]&.at(ns("./uri[@type = 'citation']")))
46
46
 
47
47
  href = suffix_url(url.text)
48
48
  anchor = node&.at(ns(".//locality[@type = 'anchor']"))&.text&.strip
@@ -6,7 +6,6 @@ module IsoDoc
6
6
  end
7
7
 
8
8
  def modification_parse(node, out)
9
- out << "[MODIFICATION]"
10
9
  para = node.at(ns("./p"))
11
10
  para.children.each { |n| parse(n, out) }
12
11
  end
@@ -58,9 +57,7 @@ module IsoDoc
58
57
 
59
58
  def termref_parse(node, out)
60
59
  out.p do |p|
61
- p << "[TERMREF]"
62
60
  node.children.each { |n| parse(n, p) }
63
- p << "[/TERMREF]"
64
61
  end
65
62
  end
66
63
 
@@ -37,10 +37,9 @@ module IsoDoc
37
37
  end
38
38
 
39
39
  def attr_code(attributes)
40
- attributes = attributes.compact.map
41
- attributes.map do |k, v|
42
- [k, v.is_a?(String) ? HTMLEntities.new.decode(v) : v]
43
- end.to_h
40
+ attributes.compact.transform_values do |v|
41
+ v.is_a?(String) ? HTMLEntities.new.decode(v) : v
42
+ end
44
43
  end
45
44
 
46
45
  DOCTYPE_HDR = "<!DOCTYPE html SYSTEM "\
@@ -188,10 +187,17 @@ module IsoDoc
188
187
  end
189
188
 
190
189
  def image_localfile(img)
190
+ case img["src"]
191
+ when /^data:/
192
+ save_dataimage(img["src"], false)
193
+ when %r{^([A-Z]:)?/}
194
+ img["src"]
195
+ =begin
191
196
  if /^data:/.match? img["src"]
192
197
  save_dataimage(img["src"], false)
193
198
  elsif %r{^([A-Z]:)?/}.match? img["src"]
194
199
  img["src"]
200
+ =end
195
201
  else
196
202
  File.join(@localdir, img["src"])
197
203
  end
@@ -211,7 +217,6 @@ module IsoDoc
211
217
  c = HTMLEntities.new
212
218
  text.split(/([<>])/).each_slice(4).map do |a|
213
219
  a[0] = c.encode(c.decode(a[0]), :hexadecimal)
214
- a[2] = c.encode(c.decode(a[2]), :hexadecimal) if a.size >= 3
215
220
  a
216
221
  end.join
217
222
  end
data/lib/isodoc/i18n.rb CHANGED
@@ -55,8 +55,8 @@ module IsoDoc
55
55
  @labels = y
56
56
  @labels["language"] = @lang
57
57
  @labels["script"] = @script
58
- @labels.each do |k, v|
59
- self.class.send(:define_method, k.downcase) { v }
58
+ @labels.each do |k, _v|
59
+ self.class.send(:define_method, k.downcase) { get[k] }
60
60
  end
61
61
  end
62
62
 
@@ -68,19 +68,40 @@ module IsoDoc
68
68
  # function localising spaces and punctuation.
69
69
  # Not clear if period needs to be localised for zh
70
70
  def l10n(text, lang = @lang, script = @script)
71
- if lang == "zh" && script == "Hans"
72
- xml = Nokogiri::HTML::DocumentFragment.parse(text)
73
- xml.traverse do |n|
74
- next unless n.text?
71
+ if lang == "zh" && script == "Hans" then l10n_zh(text)
72
+ else bidiwrap(text, lang, script)
73
+ end
74
+ end
75
75
 
76
- n.replace(n.text.gsub(/ /, "").gsub(/:/, ":").gsub(/,/, "、")
77
- .gsub(/\(/, "(").gsub(/\)/, ")").gsub(/\[/, "【").gsub(/\]/, "】"))
78
- end
79
- xml.to_xml.gsub(/<b>/, "").gsub("</b>", "").gsub(/<\?[^>]+>/, "")
76
+ def bidiwrap(text, lang, script)
77
+ my_script, my_rtl, outer_rtl = bidiwrap_vars(lang, script)
78
+ if my_rtl && !outer_rtl
79
+ mark = %w(Arab Aran).include?(my_script) ? "&#x61c;" : "&#x200f;"
80
+ "#{mark}#{text}#{mark}"
81
+ elsif !my_rtl && outer_rtl then "&#x200e;#{text}&#x200e;"
80
82
  else text
81
83
  end
82
84
  end
83
85
 
86
+ def bidiwrap_vars(lang, script)
87
+ my_script = script || Metanorma::Utils.default_script(lang)
88
+ [my_script,
89
+ Metanorma::Utils.rtl_script?(my_script),
90
+ Metanorma::Utils.rtl_script?(@script || Metanorma::Utils
91
+ .default_script(@lang))]
92
+ end
93
+
94
+ def l10n_zh(text)
95
+ xml = Nokogiri::HTML::DocumentFragment.parse(text)
96
+ xml.traverse do |n|
97
+ next unless n.text?
98
+
99
+ n.replace(n.text.gsub(/ /, "").gsub(/:/, ":").gsub(/,/, "、")
100
+ .gsub(/\(/, "(").gsub(/\)/, ")").gsub(/\[/, "【").gsub(/\]/, "】"))
101
+ end
102
+ xml.to_xml.gsub(/<b>/, "").gsub("</b>", "").gsub(/<\?[^>]+>/, "")
103
+ end
104
+
84
105
  def multiple_and(names, andword)
85
106
  return "" if names.empty?
86
107
  return names[0] if names.length == 1
@@ -12,11 +12,11 @@ module IsoDoc
12
12
  return if number.nil? || number.empty?
13
13
 
14
14
  unless name = node.at(ns("./#{elem}"))
15
- node.children.empty? and node.add_child("<#{elem}></#{elem}>") or
15
+ (node.children.empty? and node.add_child("<#{elem}></#{elem}>")) or
16
16
  node.children.first.previous = "<#{elem}></#{elem}>"
17
17
  name = node.children.first
18
18
  end
19
- if name.children.empty? then name.add_child(number)
19
+ if name.children.empty? then name.add_child(cleanup_entities(number))
20
20
  else (name.children.first.previous = "#{number}#{delim}")
21
21
  end
22
22
  end
@@ -29,7 +29,6 @@ module IsoDoc
29
29
 
30
30
  def sourcecode1(elem)
31
31
  return if labelled_ancestor(elem)
32
- return unless elem.ancestors("example").empty?
33
32
 
34
33
  lbl = @xrefs.anchor(elem["id"], :label, false) or return
35
34
  prefix_name(elem, "&nbsp;&mdash; ",
@@ -29,8 +29,8 @@ module IsoDoc
29
29
  def figure1(elem)
30
30
  return sourcecode1(elem) if elem["class"] == "pseudocode" ||
31
31
  elem["type"] == "pseudocode"
32
- return if labelled_ancestor(elem) && elem.ancestors("figure").empty? ||
33
- elem.at(ns("./figure")) && !elem.at(ns("./name"))
32
+ return if (labelled_ancestor(elem) && elem.ancestors("figure").empty?) ||
33
+ (elem.at(ns("./figure")) && !elem.at(ns("./name")))
34
34
 
35
35
  lbl = @xrefs.anchor(elem["id"], :label, false) or return
36
36
  prefix_name(elem, "&nbsp;&mdash; ",
@@ -28,11 +28,7 @@ module IsoDoc
28
28
  ref = node.at(ns("./xref | ./eref | ./termref"))
29
29
  ref && opts[:ref] != "false" and r&.next = " "
30
30
  opts[:ital] == "true" and r&.name = "em"
31
- if opts[:linkmention] == "true" && !r.nil? && !ref.nil?
32
- ref2 = ref.clone
33
- r2 = r.clone
34
- r.replace(ref2).children = r2
35
- end
31
+ concept1_linkmention(ref, r, opts)
36
32
  concept1_ref(node, ref, opts)
37
33
  if opts[:ital] == "false"
38
34
  r = node.at(ns(".//renderterm"))
@@ -41,6 +37,14 @@ module IsoDoc
41
37
  node.replace(node.children)
42
38
  end
43
39
 
40
+ def concept1_linkmention(ref, renderterm, opts)
41
+ if opts[:linkmention] == "true" && !renderterm.nil? && !ref.nil?
42
+ ref2 = ref.clone
43
+ r2 = renderterm.clone
44
+ renderterm.replace(ref2).children = r2
45
+ end
46
+ end
47
+
44
48
  def concept1_ref(_node, ref, opts)
45
49
  ref.nil? and return
46
50
  return ref.remove if opts[:ref] == "false"
@@ -78,39 +82,71 @@ module IsoDoc
78
82
  end
79
83
 
80
84
  def designation(docxml)
81
- docxml.xpath(ns("//preferred | //admitted | //deprecates")).each do |p|
82
- designation1(p)
83
- end
84
85
  docxml.xpath(ns("//term")).each do |t|
85
86
  merge_second_preferred(t)
86
87
  end
88
+ docxml.xpath(ns("//preferred | //admitted | //deprecates")).each do |p|
89
+ designation1(p)
90
+ end
87
91
  end
88
92
 
89
93
  def merge_second_preferred(term)
90
94
  pref = nil
91
- term.xpath(ns("./preferred")).each_with_index do |p, i|
95
+ term.xpath(ns("./preferred[expression/name]")).each_with_index do |p, i|
92
96
  if i.zero? then pref = p
93
- else
94
- pref << l10n("; #{p.children.to_xml}")
97
+ elsif merge_preferred_eligible?(pref, p)
98
+ pref.at(ns("./expression/name")) <<
99
+ l10n("; #{p.at(ns('./expression/name')).children.to_xml}")
95
100
  p.remove
96
101
  end
97
102
  end
98
103
  end
99
104
 
105
+ def merge_preferred_eligible?(first, second)
106
+ firstex = first.at(ns("./expression")) || {}
107
+ secondex = second.at(ns("./expression")) || {}
108
+ first["geographic-area"] == second["geographic-area"] &&
109
+ firstex["language"] == secondex["language"] &&
110
+ !first.at(ns("./pronunciation | ./grammar")) &&
111
+ !second.at(ns("./pronunciation | ./grammar"))
112
+ end
113
+
100
114
  def designation1(desgn)
101
115
  s = desgn.at(ns("./termsource"))
102
116
  name = desgn.at(ns("./expression/name | ./letter-symbol/name | "\
103
117
  "./graphical-symbol")) or return
104
118
 
119
+ designation_annotate(desgn, name)
120
+ s and desgn.next = s
121
+ end
122
+
123
+ def designation_annotate(desgn, name)
124
+ designation_boldface(desgn)
125
+ designation_field(desgn, name)
105
126
  g = desgn.at(ns("./expression/grammar")) and
106
- name << " #{designation_grammar(g).join(', ')}"
127
+ name << ", #{designation_grammar(g).join(', ')}"
128
+ designation_localization(desgn, name)
129
+ designation_pronunciation(desgn, name)
107
130
  desgn.children = name.children
108
- s and desgn.next = s
131
+ end
132
+
133
+ def designation_boldface(desgn)
134
+ desgn.name == "preferred" or return
135
+ name = desgn.at(ns("./expression/name | ./letter-symbol/name")) or return
136
+ name.children = "<strong>#{name.children}</strong>"
137
+ end
138
+
139
+ def designation_field(desgn, name)
140
+ f = desgn.xpath(ns("./field-of-application | ./usage-info"))
141
+ &.map { |u| u.children.to_xml }&.join(", ")
142
+ return nil if f&.empty?
143
+
144
+ name << ", &#x3c;#{f}&#x3e;"
109
145
  end
110
146
 
111
147
  def designation_grammar(grammar)
112
148
  ret = []
113
- grammar.xpath(ns("./gender")).each do |x|
149
+ grammar.xpath(ns("./gender | ./number")).each do |x|
114
150
  ret << @i18n.grammar_abbrevs[x.text]
115
151
  end
116
152
  %w(isPreposition isParticiple isAdjective isVerb isAdverb isNoun)
@@ -121,20 +157,28 @@ module IsoDoc
121
157
  ret
122
158
  end
123
159
 
124
- def definition1(elem)
125
- nodes = Nokogiri::XML::NodeSet.new(elem.document)
126
- v = elem&.at(ns("./verbaldefinition"))&.children and nodes += v
127
- n = elem&.at(ns("./nonverbalrepresentation"))&.children and nodes += n
128
- elem.children = nodes
129
- end
160
+ def designation_localization(desgn, name)
161
+ loc = [desgn&.at(ns("./expression/@language"))&.text,
162
+ desgn&.at(ns("./expression/@script"))&.text,
163
+ desgn&.at(ns("./@geographic-area"))&.text].compact
164
+ return if loc.empty?
165
+
166
+ name << ", #{loc.join(' ')}"
167
+ end
168
+
169
+ def designation_pronunciation(desgn, name)
170
+ f = desgn.at(ns("./expression/pronunciation")) or return
130
171
 
131
- def termexample(docxml)
172
+ name << ", /#{f.children.to_xml}/"
173
+ end
174
+
175
+ def termexample(docxml)
132
176
  docxml.xpath(ns("//termexample")).each do |f|
133
177
  example1(f)
134
178
  end
135
179
  end
136
180
 
137
- def termnote(docxml)
181
+ def termnote(docxml)
138
182
  docxml.xpath(ns("//termnote")).each do |f|
139
183
  termnote1(f)
140
184
  end
@@ -155,7 +199,7 @@ module IsoDoc
155
199
  def termdefinition1(elem)
156
200
  unwrap_definition(elem)
157
201
  multidef(elem) if elem.xpath(ns("./definition")).size > 1
158
- end
202
+ end
159
203
 
160
204
  def multidef(elem)
161
205
  d = elem.at(ns("./definition"))
@@ -167,13 +211,34 @@ module IsoDoc
167
211
  d.wrap("<definition></definition>")
168
212
  end
169
213
 
170
- def unwrap_definition(elem)
171
- elem.xpath(ns("./definition")).each do |d|
172
- nodes = Nokogiri::XML::NodeSet.new(elem.document)
173
- v = d&.at(ns("./verbaldefinition"))&.children and nodes += v
174
- n = d&.at(ns("./nonverbalrepresentation"))&.children and nodes += n
175
- d.children = nodes
176
- end
214
+ def unwrap_definition(elem)
215
+ elem.xpath(ns("./definition")).each do |d|
216
+ %w(verbal-definition non-verbal-representation).each do |e|
217
+ v = d&.at(ns("./#{e}"))
218
+ v&.replace(v.children)
177
219
  end
220
+ end
221
+ end
222
+
223
+ def termsource(docxml)
224
+ docxml.xpath(ns("//termsource")).each do |f|
225
+ termsource1(f)
226
+ end
227
+ end
228
+
229
+ def termsource1(elem)
230
+ mod = elem.at(ns("./modification")) and
231
+ termsource_modification(mod)
232
+ elem.children = l10n("[#{@i18n.source}: #{elem.children.to_xml.strip}]")
233
+ elem&.next_element&.name == "termsource" and elem.next = "; "
234
+ end
235
+
236
+ def termsource_modification(mod)
237
+ mod.previous_element.next = ", #{@i18n.modified}"
238
+ mod.text.strip.empty? or mod.previous = " &#x2013; "
239
+ mod.elements.size == 1 and
240
+ mod.elements[0].replace(mod.elements[0].children)
241
+ mod.replace(mod.children)
242
+ end
178
243
  end
179
244
  end
@@ -18,7 +18,7 @@ module IsoDoc
18
18
  info docxml, nil
19
19
  conversions(docxml)
20
20
  docxml.root["type"] = "presentation"
21
- docxml.to_xml
21
+ docxml.to_xml.gsub(/&lt;/, "&#x3c;").gsub(/&gt;/, "&#x3e;")
22
22
  end
23
23
 
24
24
  def conversions(docxml)
@@ -68,6 +68,7 @@ module IsoDoc
68
68
  termnote docxml
69
69
  termdefinition docxml
70
70
  designation docxml
71
+ termsource docxml
71
72
  concept docxml
72
73
  related docxml
73
74
  end
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "1.8.1".freeze
2
+ VERSION = "1.8.3".freeze
3
3
  end
@@ -63,11 +63,8 @@ module IsoDoc
63
63
  c.increment(n)
64
64
  idx = increment_label(examples, n, c, false)
65
65
  @anchors[n["id"]] =
66
- # { type: "termexample", label: idx, value: c.print,
67
- # xref: l10n("#{anchor(t['id'], :xref)}, "\
68
- # "#{@labels['example_xref']} #{c.print}") }
69
- anchor_struct(idx, n,
70
- @labels["example_xref"], "termexample", n["unnumbered"])
66
+ anchor_struct(idx, n, @labels["example_xref"], "termexample",
67
+ n["unnumbered"])
71
68
  end
72
69
  end
73
70
  end
@@ -170,8 +167,7 @@ module IsoDoc
170
167
 
171
168
  def deflist_term_anchor_names(list, list_anchor)
172
169
  list.xpath(ns("./dt")).each do |li|
173
- label = li.text
174
- label = l10n("#{list_anchor[:xref]}: #{label}")
170
+ label = l10n("#{list_anchor[:xref]}: #{dt2xreflabel(li)}")
175
171
  li["id"] and @anchors[li["id"]] =
176
172
  { xref: label, type: "deflistitem",
177
173
  container: list_anchor[:container] }
@@ -181,6 +177,13 @@ module IsoDoc
181
177
  end
182
178
  end
183
179
 
180
+ def dt2xreflabel(dterm)
181
+ label = dterm.dup
182
+ label.xpath(ns(".//p")).each { |x| x.replace(x.children) }
183
+ label.xpath(ns(".//index")).each(&:remove)
184
+ label.children.to_xml
185
+ end
186
+
184
187
  def bookmark_anchor_names(xml)
185
188
  xml.xpath(ns(".//bookmark")).reject { |n| blank?(n["id"]) }.each do |n|
186
189
  parent = nil