isodoc 1.8.0 → 1.8.2.2

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: e798df14fbf858fd0540d3fb2837774ec6a1924d5590ad4a628699888eff8425
4
- data.tar.gz: 8f3e143a4c3cbcba0c4c349c315c6bf7b067164cd4cc22bd06a85dce71268e73
3
+ metadata.gz: acaea1b02c6f852beb40a1344fff745a7ff335cebba6484151acc0e73d4146a4
4
+ data.tar.gz: 23fce1207ac948de9b61c487dc8a91c2fd8ceeddb1a522b3608a85aad02c1923
5
5
  SHA512:
6
- metadata.gz: 6a0fbbabc25df62e19eeefecbf3369188194e28348ac6758f59024b58c0e4e23695440e41263c049455a12b1ce210e602c58e6142e9b8b95ac79d2fa8a64d341
7
- data.tar.gz: 888429742fbf4ee0ab902b1a34d5edb8d7657b2fb561ecf3fe872fe48de14267e0e7edcae1e27c86ed5b36dc8d0becccd0ca6f96f6f1239936fb1bd287dc0130
6
+ metadata.gz: ad28bd8420ad35320fc9f67470bf5e4b44b3dc7e27c48867e50bfc6446ed0b57709bc4576518337e87bf72f8920a8035e4a34dd7486c7f739c2edcfc348b709e
7
+ data.tar.gz: 3c04a7a2eb965caeda51cd538a770387bb7d0a610893f46b6c09f4ef44178024b493c077390f0a6e765b17330e3af5004e2308964920061eef3f10c73e894b2e
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)
@@ -119,6 +119,7 @@ module IsoDoc
119
119
 
120
120
  def convert1(docxml, filename, dir)
121
121
  @xrefs.parse docxml
122
+ bibitem_lookup(docxml)
122
123
  noko do |xml|
123
124
  xml.html **{ lang: @lang.to_s } do |html|
124
125
  html.parent.add_namespace("epub", "http://www.idpf.org/2007/ops")
@@ -130,6 +131,13 @@ module IsoDoc
130
131
  end.join("\n")
131
132
  end
132
133
 
134
+ def bibitem_lookup(docxml)
135
+ @bibitems = docxml.xpath(ns("//references/bibitem"))
136
+ .each_with_object({}) do |b, m|
137
+ m[b["id"]] = b
138
+ end
139
+ end
140
+
133
141
  def metadata_init(lang, script, i18n)
134
142
  @meta = Metadata.new(lang, script, i18n)
135
143
  end
@@ -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,10 +41,8 @@ module IsoDoc
41
41
  end
42
42
 
43
43
  def eref_target(node)
44
- href = "##{node['bibitemid']}"
45
- url = node.at(ns("//bibitem[@id = '#{node['bibitemid']}']/"\
46
- "uri[@type = 'citation']"))
47
- return href unless url
44
+ return "##{node['bibitemid']}" unless url = @bibitems[node["bibitemid"]]
45
+ &.at(ns("./uri[@type = 'citation']"))
48
46
 
49
47
  href = suffix_url(url.text)
50
48
  anchor = node&.at(ns(".//locality[@type = 'anchor']"))&.text&.strip
@@ -5,6 +5,7 @@ module IsoDoc
5
5
  module HtmlFunction
6
6
  module Html
7
7
  def convert1(docxml, filename, dir)
8
+ bibitem_lookup(docxml)
8
9
  noko do |xml|
9
10
  xml.html **{ lang: @lang.to_s } do |html|
10
11
  info docxml, nil
@@ -1,5 +1,6 @@
1
1
  require "isodoc/html_function/mathvariant_to_plain"
2
2
  require_relative "postprocess_footnotes"
3
+ require "metanorma-utils"
3
4
 
4
5
  module IsoDoc
5
6
  module HtmlFunction
@@ -74,7 +75,8 @@ module IsoDoc
74
75
  head = docxml.at("//*[local-name() = 'head']")
75
76
  head << htmlstylesheet(@htmlstylesheet)
76
77
  s = htmlstylesheet(@htmlstylesheet_override) and head << s
77
- @bare and head << "<style>body {margin-left: 2em; margin-right: 2em;}</style>"
78
+ @bare and
79
+ head << "<style>body {margin-left: 2em; margin-right: 2em;}</style>"
78
80
  docxml
79
81
  end
80
82
 
@@ -167,11 +169,7 @@ module IsoDoc
167
169
  end
168
170
 
169
171
  def datauri(img)
170
- type = img["src"].split(".")[-1]
171
- supertype = type == "xml" ? "application" : "image"
172
- bin = IO.binread(image_localfile(img))
173
- data = Base64.strict_encode64(bin)
174
- img["src"] = "data:#{supertype}/#{type};base64,#{data}"
172
+ img["src"] = Metanorma::Utils::datauri(img["src"], @localdir)
175
173
  end
176
174
 
177
175
  def image_suffix(img)
@@ -6,7 +6,7 @@ module IsoDoc
6
6
  vote-ended}.freeze
7
7
 
8
8
  def months
9
- {
9
+ {
10
10
  "01": @labels["month_january"],
11
11
  "02": @labels["month_february"],
12
12
  "03": @labels["month_march"],
@@ -19,30 +19,32 @@ module IsoDoc
19
19
  "10": @labels["month_october"],
20
20
  "11": @labels["month_november"],
21
21
  "12": @labels["month_december"],
22
- }
22
+ }
23
23
  end
24
24
 
25
25
  def monthyr(isodate)
26
26
  m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)/.match isodate
27
27
  return isodate unless m && m[:yr] && m[:mo]
28
+
28
29
  l10n("#{months[m[:mo].to_sym]} #{m[:yr]}",
29
- @lang, @script)
30
+ @lang, @script)
30
31
  end
31
32
 
32
33
  def MMMddyyyy(isodate)
33
34
  return nil if isodate.nil?
35
+
34
36
  arr = isodate.split("-")
35
- date = if arr.size == 1 and (/^\d+$/.match isodate)
36
- Date.new(*arr.map(&:to_i)).strftime("%Y")
37
- elsif arr.size == 2
38
- Date.new(*arr.map(&:to_i)).strftime("%B %Y")
39
- else
40
- Date.parse(isodate).strftime("%B %d, %Y")
41
- end
37
+ if arr.size == 1 && (/^\d+$/.match isodate)
38
+ Date.new(*arr.map(&:to_i)).strftime("%Y")
39
+ elsif arr.size == 2
40
+ Date.new(*arr.map(&:to_i)).strftime("%B %Y")
41
+ else
42
+ Date.parse(isodate).strftime("%B %d, %Y")
43
+ end
42
44
  end
43
45
 
44
46
  def bibdate(isoxml, _out)
45
- isoxml.xpath(ns('//bibdata/date')).each do |d|
47
+ isoxml.xpath(ns("//bibdata/date")).each do |d|
46
48
  set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
47
49
  end
48
50
  end
@@ -10,7 +10,7 @@ module IsoDoc
10
10
  "</localized-strings>"
11
11
  end
12
12
 
13
- def docid_prefixes(docxml)
13
+ def docid_prefixes(docxml)
14
14
  docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
15
15
  i.children = @xrefs.klass.docid_prefix(i["type"], i.text)
16
16
  end
@@ -97,7 +97,7 @@ module IsoDoc
97
97
 
98
98
  # https://stackoverflow.com/a/31822406
99
99
  def blank?(elem)
100
- elem.nil? || elem.respond_to?(:empty?) && elem.empty?
100
+ elem.nil? || (elem.respond_to?(:empty?) && elem.empty?)
101
101
  end
102
102
 
103
103
  def trim_hash(hash)
@@ -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_field(desgn, name)
125
+ designation_boldface(desgn)
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
171
+
172
+ name << ", /#{f.children.to_xml}/"
173
+ end
130
174
 
131
- def termexample(docxml)
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,13 @@ 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
178
222
  end
179
223
  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)
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "1.8.0".freeze
2
+ VERSION = "1.8.2.2".freeze
3
3
  end
@@ -54,11 +54,11 @@ module IsoDoc
54
54
  end
55
55
 
56
56
  def para_class(_node)
57
- classtype = nil
58
- classtype = "Note" if @note
59
- classtype = "MsoCommentText" if in_comment
60
- classtype = "Sourcecode" if @annotation
61
- classtype
57
+ return "Sourcecode" if @annotation
58
+ return "MsoCommentText" if @in_comment
59
+ return "Note" if @note
60
+
61
+ nil
62
62
  end
63
63
 
64
64
  def para_parse(node, out)
@@ -86,21 +86,31 @@ module IsoDoc
86
86
  end
87
87
 
88
88
  def dl_parse(node, out)
89
+ return super unless node.ancestors("table, dl").empty?
90
+
91
+ dl_parse_table(node, out)
92
+ end
93
+
94
+ def dl_parse_table(node, out)
89
95
  out.table **{ class: "dl" } do |v|
90
96
  node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
91
- v.tr do |tr|
92
- tr.td **{ valign: "top", align: "left" } do |term|
93
- dt_parse(dt, term)
94
- end
95
- tr.td **{ valign: "top" } do |listitem|
96
- dd.children.each { |n| parse(n, listitem) }
97
- end
98
- end
97
+ dl_parse_table1(v, dt, dd)
99
98
  end
100
99
  dl_parse_notes(node, v)
101
100
  end
102
101
  end
103
102
 
103
+ def dl_parse_table1(table, dterm, ddefn)
104
+ table.tr do |tr|
105
+ tr.td **{ valign: "top", align: "left" } do |term|
106
+ dt_parse(dterm, term)
107
+ end
108
+ tr.td **{ valign: "top" } do |listitem|
109
+ ddefn.children.each { |n| parse(n, listitem) }
110
+ end
111
+ end
112
+ end
113
+
104
114
  def dl_parse_notes(node, out)
105
115
  return if node.elements.reject { |n| dt_dd? n }.empty?
106
116
 
@@ -120,8 +130,8 @@ module IsoDoc
120
130
  dl
121
131
  end
122
132
 
133
+ # get rid of footnote link, it is in diagram
123
134
  def figure_aside_process(fig, aside, key)
124
- # get rid of footnote link, it is in diagram
125
135
  fig&.at("./a[@class='TableFootnoteRef']")&.remove
126
136
  fnref = fig.at(".//span[@class='TableFootnoteRef']/..")
127
137
  tr = key.add_child("<tr></tr>").first
@@ -1,10 +1,6 @@
1
1
  module IsoDoc
2
2
  module WordFunction
3
3
  module Comments
4
- def in_comment
5
- @in_comment
6
- end
7
-
8
4
  def comments(div)
9
5
  return if @comments.empty?
10
6
 
@@ -7,6 +7,10 @@ module IsoDoc
7
7
  recommendation permission figure table formula
8
8
  admonition sourcecode).freeze
9
9
 
10
+ def blank?(text)
11
+ text.nil? || text.empty?
12
+ end
13
+
10
14
  def amend_preprocess(xmldoc)
11
15
  xmldoc.xpath(ns("//amend[newcontent]")).each do |a|
12
16
  autonum = amend_autonums(a)
@@ -39,11 +43,9 @@ module IsoDoc
39
43
  end
40
44
 
41
45
  def termnote_anchor_names(docxml)
42
- docxml.xpath(ns("//term[descendant::termnote]")).each do |t|
46
+ docxml.xpath(ns("//term[termnote]")).each do |t|
43
47
  c = Counter.new
44
- t.xpath(ns(".//termnote")).each do |n|
45
- next if n["id"].nil? || n["id"].empty?
46
-
48
+ t.xpath(ns("./termnote")).reject { |n| blank?(n["id"]) }.each do |n|
47
49
  c.increment(n)
48
50
  @anchors[n["id"]] =
49
51
  { label: termnote_label(c.print), type: "termnote", value: c.print,
@@ -54,18 +56,18 @@ module IsoDoc
54
56
  end
55
57
 
56
58
  def termexample_anchor_names(docxml)
57
- docxml.xpath(ns("//term[descendant::termexample]")).each do |t|
58
- examples = t.xpath(ns(".//termexample"))
59
+ docxml.xpath(ns("//term[termexample]")).each do |t|
60
+ examples = t.xpath(ns("./termexample"))
59
61
  c = Counter.new
60
- examples.each do |n|
61
- next if n["id"].nil? || n["id"].empty?
62
-
62
+ examples.reject { |n| blank?(n["id"]) }.each do |n|
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}") }
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"])
69
71
  end
70
72
  end
71
73
  end
@@ -127,9 +129,7 @@ module IsoDoc
127
129
  notes = s.xpath(ns(".//ol")) - s.xpath(ns(".//clause//ol")) -
128
130
  s.xpath(ns(".//appendix//ol")) - s.xpath(ns(".//ol//ol"))
129
131
  c = Counter.new
130
- notes.each do |n|
131
- next if n["id"].nil? || n["id"].empty?
132
-
132
+ notes.reject { |n| blank?(n["id"]) }.each do |n|
133
133
  @anchors[n["id"]] = anchor_struct(increment_label(notes, n, c), n,
134
134
  @labels["list"], "list", false)
135
135
  list_item_anchor_names(n, @anchors[n["id"]], 1, "", notes.size != 1)
@@ -158,9 +158,7 @@ module IsoDoc
158
158
  notes = s.xpath(ns(".//dl")) - s.xpath(ns(".//clause//dl")) -
159
159
  s.xpath(ns(".//appendix//dl")) - s.xpath(ns(".//dl//dl"))
160
160
  c = Counter.new
161
- notes.each do |n|
162
- next if n["id"].nil? || n["id"].empty?
163
-
161
+ notes.reject { |n| blank?(n["id"]) }.each do |n|
164
162
  @anchors[n["id"]] =
165
163
  anchor_struct(increment_label(notes, n, c), n,
166
164
  @labels["deflist"], "deflist", false)
@@ -183,10 +181,8 @@ module IsoDoc
183
181
  end
184
182
  end
185
183
 
186
- def bookmark_anchor_names(docxml)
187
- docxml.xpath(ns(".//bookmark")).each do |n|
188
- next if n["id"].nil? || n["id"].empty?
189
-
184
+ def bookmark_anchor_names(xml)
185
+ xml.xpath(ns(".//bookmark")).reject { |n| blank?(n["id"]) }.each do |n|
190
186
  parent = nil
191
187
  n.ancestors.each do |a|
192
188
  next unless a["id"] && parent = @anchors.dig(a["id"], :xref)
@@ -34,8 +34,7 @@ module IsoDoc::XrefGen
34
34
 
35
35
  def sequential_table_names(clause)
36
36
  c = Counter.new
37
- clause.xpath(ns(".//table")).each do |t|
38
- next if t["id"].nil? || t["id"].empty?
37
+ clause.xpath(ns(".//table")).reject { |n| blank?(n["id"]) }.each do |t|
39
38
 
40
39
  @anchors[t["id"]] = anchor_struct(
41
40
  c.increment(t).print, nil,
@@ -46,8 +45,7 @@ module IsoDoc::XrefGen
46
45
 
47
46
  def sequential_formula_names(clause)
48
47
  c = Counter.new
49
- clause.xpath(ns(".//formula")).each do |t|
50
- next if t["id"].nil? || t["id"].empty?
48
+ clause.xpath(ns(".//formula")).reject { |n| blank?(n["id"]) }.each do |t|
51
49
 
52
50
  @anchors[t["id"]] = anchor_struct(
53
51
  c.increment(t).print, t,
@@ -62,8 +60,8 @@ module IsoDoc::XrefGen
62
60
 
63
61
  def sequential_permission_names(clause, klass, label)
64
62
  c = Counter.new
65
- clause.xpath(ns(".//#{klass}#{FIRST_LVL_REQ}")).each do |t|
66
- next if t["id"].nil? || t["id"].empty?
63
+ clause.xpath(ns(".//#{klass}#{FIRST_LVL_REQ}"))
64
+ .reject { |n| blank?(n["id"]) }.each do |t|
67
65
 
68
66
  id = c.increment(t).print
69
67
  @anchors[t["id"]] = anchor_struct(id, t, label, klass, t["unnumbered"])
@@ -82,8 +80,7 @@ module IsoDoc::XrefGen
82
80
 
83
81
  def sequential_permission_names1(block, lbl, klass, label)
84
82
  c = Counter.new
85
- block.xpath(ns("./#{klass}")).each do |t|
86
- next if t["id"].nil? || t["id"].empty?
83
+ block.xpath(ns("./#{klass}")).reject { |n| blank?(n["id"]) }.each do |t|
87
84
 
88
85
  id = "#{lbl}#{hierfigsep}#{c.increment(t).print}"
89
86
  @anchors[t["id"]] = anchor_struct(id, t, label, klass, t["unnumbered"])
@@ -118,8 +115,7 @@ module IsoDoc::XrefGen
118
115
 
119
116
  def hierarchical_table_names(clause, num)
120
117
  c = Counter.new
121
- clause.xpath(ns(".//table")).each do |t|
122
- next if t["id"].nil? || t["id"].empty?
118
+ clause.xpath(ns(".//table")).reject { |n| blank?(n["id"]) }.each do |t|
123
119
 
124
120
  @anchors[t["id"]] =
125
121
  anchor_struct("#{num}#{hiersep}#{c.increment(t).print}",
@@ -141,8 +137,7 @@ module IsoDoc::XrefGen
141
137
 
142
138
  def hierarchical_formula_names(clause, num)
143
139
  c = Counter.new
144
- clause.xpath(ns(".//formula")).each do |t|
145
- next if t["id"].nil? || t["id"].empty?
140
+ clause.xpath(ns(".//formula")).reject { |n| blank?(n["id"]) }.each do |t|
146
141
 
147
142
  @anchors[t["id"]] = anchor_struct(
148
143
  "#{num}#{hiersep}#{c.increment(t).print}", nil,
@@ -154,8 +149,8 @@ module IsoDoc::XrefGen
154
149
 
155
150
  def hierarchical_permission_names(clause, num, klass, label)
156
151
  c = Counter.new
157
- clause.xpath(ns(".//#{klass}#{FIRST_LVL_REQ}")).each do |t|
158
- next if t["id"].nil? || t["id"].empty?
152
+ clause.xpath(ns(".//#{klass}#{FIRST_LVL_REQ}"))
153
+ .reject { |n| blank?(n["id"]) }.each do |t|
159
154
 
160
155
  id = "#{num}#{hiersep}#{c.increment(t).print}"
161
156
  @anchors[t["id"]] =
@@ -175,8 +170,7 @@ module IsoDoc::XrefGen
175
170
 
176
171
  def hierarchical_permission_names1(block, lbl, klass, label)
177
172
  c = Counter.new
178
- block.xpath(ns("./#{klass}")).each do |t|
179
- next if t["id"].nil? || t["id"].empty?
173
+ block.xpath(ns("./#{klass}")).reject { |n| blank?(n["id"]) }.each do |t|
180
174
 
181
175
  id = "#{lbl}#{hierfigsep}#{c.increment(t).print}"
182
176
  @anchors[t["id"]] =
@@ -94,6 +94,9 @@ grammar_abbrevs:
94
94
  feminine: مؤ
95
95
  neuter: محايد
96
96
  common: خنثى
97
+ singular: مفرد
98
+ dual: مزدوج
99
+ plural: جمع
97
100
  isPreposition: حرف جر
98
101
  isParticiple: النعت
99
102
  isAdjective: صفة
@@ -98,6 +98,9 @@ grammar_abbrevs:
98
98
  feminine: fem
99
99
  neuter: neutr
100
100
  common: gemein
101
+ singular: Sg
102
+ dual: Dual
103
+ plural: Pl
101
104
  isPreposition: Präp
102
105
  isParticiple: Part
103
106
  isAdjective: Adj