isodoc 0.7.0 → 0.7.1
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 +4 -4
- data/Gemfile.lock +5 -5
- data/README.adoc +34 -22
- data/isodoc.gemspec +1 -1
- data/lib/isodoc.rb +3 -1
- data/lib/isodoc/blocks.rb +1 -1
- data/lib/isodoc/cleanup.rb +1 -1
- data/lib/isodoc/convert.rb +9 -8
- data/lib/isodoc/{comments.rb → htmlconvert/comments.rb} +1 -1
- data/lib/isodoc/htmlconvert/convert.rb +13 -0
- data/lib/isodoc/{footnotes.rb → htmlconvert/footnotes.rb} +1 -1
- data/lib/isodoc/{html.rb → htmlconvert/html.rb} +29 -4
- data/lib/isodoc/i18n-en.yaml +5 -5
- data/lib/isodoc/i18n.rb +6 -2
- data/lib/isodoc/inline.rb +8 -8
- data/lib/isodoc/iso/convert.rb +4 -0
- data/lib/isodoc/iso/html/style-human.scss +3 -3
- data/lib/isodoc/iso/html/style-iso.scss +2 -2
- data/lib/isodoc/iso/html/wordstyle.scss +27 -0
- data/lib/isodoc/iso/wordconvert.rb +5 -2
- data/lib/isodoc/iso2wordhtml.rb +15 -16
- data/lib/isodoc/lists.rb +1 -1
- data/lib/isodoc/metadata.rb +66 -49
- data/lib/isodoc/references.rb +21 -11
- data/lib/isodoc/section.rb +3 -3
- data/lib/isodoc/table.rb +1 -1
- data/lib/isodoc/terms.rb +1 -1
- data/lib/isodoc/utils.rb +20 -21
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/wordconvert/comments.rb +122 -117
- data/lib/isodoc/wordconvert/convert.rb +5 -2
- data/lib/isodoc/wordconvert/footnotes.rb +14 -1
- data/lib/isodoc/wordconvert/postprocess.rb +7 -2
- data/lib/isodoc/wordconvert/wordconvertmodule.rb +12 -1
- data/lib/isodoc/xref_gen.rb +12 -2
- data/lib/isodoc/xref_sect_gen.rb +5 -4
- data/spec/isodoc/blocks_spec.rb +1 -1
- data/spec/isodoc/footnotes_spec.rb +3 -3
- data/spec/isodoc/i18n_spec.rb +10 -10
- data/spec/isodoc/inline_spec.rb +2 -2
- data/spec/isodoc/iso_spec.rb +79 -0
- data/spec/isodoc/metadata_spec.rb +12 -4
- data/spec/isodoc/postproc_spec.rb +7 -7
- data/spec/isodoc/ref_spec.rb +7 -19
- data/spec/isodoc/section_spec.rb +19 -84
- data/spec/isodoc/terms_spec.rb +1 -1
- data/spec/isodoc/xref_spec.rb +14 -14
- data/spec/spec_helper.rb +3 -3
- metadata +9 -8
data/lib/isodoc/table.rb
CHANGED
data/lib/isodoc/terms.rb
CHANGED
data/lib/isodoc/utils.rb
CHANGED
@@ -1,33 +1,32 @@
|
|
1
1
|
module IsoDoc
|
2
|
-
class
|
3
|
-
def ns(xpath)
|
2
|
+
class Common
|
3
|
+
def self.ns(xpath)
|
4
4
|
xpath.gsub(%r{/([a-zA-z])}, "/xmlns:\\1").
|
5
5
|
gsub(%r{::([a-zA-z])}, "::xmlns:\\1").
|
6
6
|
gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]* ?=)}, "[xmlns:\\1").
|
7
7
|
gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]*\])}, "[xmlns:\\1")
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def ns(xpath)
|
11
|
+
Common::ns(xpath)
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
"95": "(Withdrawal)",
|
24
|
-
}.freeze
|
14
|
+
def self.date_range(date)
|
15
|
+
from = date.at(ns("./from"))
|
16
|
+
to = date.at(ns("./to"))
|
17
|
+
on = date.at(ns("./on"))
|
18
|
+
return on.text if on
|
19
|
+
ret = "#{from.text}–"
|
20
|
+
ret += to.text if to
|
21
|
+
ret
|
22
|
+
end
|
25
23
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
def date_range(date)
|
25
|
+
Common::date_range(date)
|
26
|
+
end
|
27
|
+
|
28
|
+
def insert_tab(out, n)
|
29
|
+
[1..n].each { out << " " }
|
31
30
|
end
|
32
31
|
|
33
32
|
NOKOHEAD = <<~HERE.freeze
|
@@ -133,7 +132,7 @@ module IsoDoc
|
|
133
132
|
end
|
134
133
|
|
135
134
|
def populate_template(docxml, _format)
|
136
|
-
meta =
|
135
|
+
meta = @meta.get.merge(@labels)
|
137
136
|
docxml = docxml.
|
138
137
|
gsub(/\[TERMREF\]\s*/, l10n("[#{@source_lbl}: ")).
|
139
138
|
gsub(/\s*\[\/TERMREF\]\s*/, l10n("]")).
|
data/lib/isodoc/version.rb
CHANGED
@@ -1,140 +1,145 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
end
|
1
|
+
module IsoDoc
|
2
|
+
class WordConvert < Common
|
4
3
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
@comments.each { |fn| div1.parent << fn }
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def review_note_parse(node, out)
|
13
|
-
fn = @comments.length + 1
|
14
|
-
make_comment_link(out, fn, node)
|
15
|
-
@in_comment = true
|
16
|
-
@comments << make_comment_text(node, fn)
|
17
|
-
@in_comment = false
|
18
|
-
end
|
4
|
+
def in_comment
|
5
|
+
@in_comment
|
6
|
+
end
|
19
7
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
8
|
+
def comments(div)
|
9
|
+
return if @comments.empty?
|
10
|
+
div.div **{ style: "mso-element:comment-list" } do |div1|
|
11
|
+
@comments.each { |fn| div1.parent << fn }
|
12
|
+
end
|
13
|
+
end
|
25
14
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
s2.span **{ style: "mso-special-character:comment",
|
33
|
-
target: fn } # do |s|
|
15
|
+
def review_note_parse(node, out)
|
16
|
+
fn = @comments.length + 1
|
17
|
+
make_comment_link(out, fn, node)
|
18
|
+
@in_comment = true
|
19
|
+
@comments << make_comment_text(node, fn)
|
20
|
+
@in_comment = false
|
34
21
|
end
|
35
|
-
end
|
36
|
-
end
|
37
22
|
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
23
|
+
def comment_link_attrs(fn, node)
|
24
|
+
{ style: "MsoCommentReference", target: fn,
|
25
|
+
class: "commentLink", from: node["from"],
|
26
|
+
to: node["to"] }
|
42
27
|
end
|
43
|
-
end
|
44
|
-
end
|
45
28
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
29
|
+
# add in from and to links to move the comment into place
|
30
|
+
def make_comment_link(out, fn, node)
|
31
|
+
out.span(**comment_link_attrs(fn, node)) do |s1|
|
32
|
+
s1.span **{ lang: "EN-GB", style: "font-size:9.0pt" } do |s2|
|
33
|
+
s2.a **{ style: "mso-comment-reference:SMC_#{fn};"\
|
34
|
+
"mso-comment-date:#{node['date'].gsub(/[:-]+/, '')}" }
|
35
|
+
s2.span **{ style: "mso-special-character:comment",
|
36
|
+
target: fn } # do |s|
|
37
|
+
end
|
38
|
+
end
|
52
39
|
end
|
53
|
-
end.join("\n")
|
54
|
-
end
|
55
40
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
41
|
+
def make_comment_target(out)
|
42
|
+
out.span **{ style: "MsoCommentReference" } do |s1|
|
43
|
+
s1.span **{ lang: "EN-GB", style: "font-size:9.0pt" } do |s2|
|
44
|
+
s2.span **{ style: "mso-special-character:comment" }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
61
48
|
|
62
|
-
|
63
|
-
|
64
|
-
|
49
|
+
def make_comment_text(node, fn)
|
50
|
+
noko do |xml|
|
51
|
+
xml.div **{ style: "mso-element:comment", id: fn } do |div|
|
52
|
+
div.span **{ style: %{mso-comment-author:"#{node['reviewer']}"} }
|
53
|
+
make_comment_target(div)
|
54
|
+
node.children.each { |n| parse(n, div) }
|
55
|
+
end
|
56
|
+
end.join("\n")
|
57
|
+
end
|
65
58
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
docxml
|
73
|
-
end
|
59
|
+
def comment_cleanup(docxml)
|
60
|
+
move_comment_link_to_from(docxml)
|
61
|
+
reorder_comments_by_comment_link(docxml)
|
62
|
+
embed_comment_in_comment_list(docxml)
|
63
|
+
end
|
74
64
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
65
|
+
COMMENT_IN_COMMENT_LIST1 =
|
66
|
+
'//div[@style="mso-element:comment-list"]//'\
|
67
|
+
'span[@style="MsoCommentReference"]'.freeze
|
68
|
+
|
69
|
+
def embed_comment_in_comment_list(docxml)
|
70
|
+
#docxml.xpath(COMMENT_IN_COMMENT_LIST).each do |x|
|
71
|
+
docxml.xpath(COMMENT_IN_COMMENT_LIST1).each do |x|
|
72
|
+
n = x.next_element
|
73
|
+
n&.children&.first&.add_previous_sibling(x.remove)
|
74
|
+
end
|
75
|
+
docxml
|
76
|
+
end
|
81
77
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
78
|
+
def move_comment_link_to_from1(x, fromlink)
|
79
|
+
x.remove
|
80
|
+
link = x.at(".//a")
|
81
|
+
fromlink.replace(x)
|
82
|
+
link.children = fromlink
|
83
|
+
end
|
89
84
|
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
85
|
+
def comment_attributes(docxml, x)
|
86
|
+
fromlink = docxml.at("//*[@id='#{x['from']}']")
|
87
|
+
return(nil) if fromlink.nil?
|
88
|
+
tolink = docxml.at("//*[@id='#{x['to']}']") || fromlink
|
89
|
+
target = docxml.at("//*[@id='#{x['target']}']")
|
90
|
+
{ from: fromlink, to: tolink, target: target }
|
91
|
+
end
|
94
92
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
93
|
+
def wrap_comment_cont(from, target)
|
94
|
+
s = from.replace("<span style='mso-comment-continuation:#{target}'>")
|
95
|
+
s.first.children = from
|
96
|
+
end
|
98
97
|
|
99
|
-
def
|
100
|
-
|
101
|
-
while !from.nil? && from["id"] != to
|
102
|
-
following = from.xpath("./following::*")
|
103
|
-
(from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
|
104
|
-
while !incl_to.nil? && !from.nil? && skip_comment_wrap(from)
|
105
|
-
(from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
|
98
|
+
def skip_comment_wrap(from)
|
99
|
+
from["style"] != "mso-special-character:comment"
|
106
100
|
end
|
107
|
-
wrap_comment_cont(from, target) if !from.nil?
|
108
|
-
end
|
109
|
-
end
|
110
101
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
102
|
+
def insert_comment_cont(from, to, target)
|
103
|
+
# includes_to = from.at(".//*[@id='#{to}']")
|
104
|
+
while !from.nil? && from["id"] != to
|
105
|
+
following = from.xpath("./following::*")
|
106
|
+
(from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
|
107
|
+
while !incl_to.nil? && !from.nil? && skip_comment_wrap(from)
|
108
|
+
(from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
|
109
|
+
end
|
110
|
+
wrap_comment_cont(from, target) if !from.nil?
|
111
|
+
end
|
112
|
+
end
|
118
113
|
|
119
|
-
def
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
# comments
|
127
|
-
end
|
114
|
+
def move_comment_link_to_from(docxml)
|
115
|
+
docxml.xpath('//span[@style="MsoCommentReference"][@from]').each do |x|
|
116
|
+
attrs = comment_attributes(docxml, x) || next
|
117
|
+
move_comment_link_to_from1(x, attrs[:from])
|
118
|
+
insert_comment_cont(attrs[:from], x["to"], x["target"])
|
119
|
+
end
|
120
|
+
end
|
128
121
|
|
129
|
-
|
130
|
-
|
122
|
+
def get_comments_from_text(docxml, link_order)
|
123
|
+
comments = []
|
124
|
+
docxml.xpath("//div[@style='mso-element:comment']").each do |c|
|
125
|
+
next unless c["id"] && !link_order[c["id"]].nil?
|
126
|
+
comments << { text: c.remove.to_s, id: c["id"] }
|
127
|
+
end
|
128
|
+
comments.sort! { |a, b| link_order[a[:id]] <=> link_order[b[:id]] }
|
129
|
+
# comments
|
130
|
+
end
|
131
131
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
132
|
+
COMMENT_TARGET_XREFS1 =
|
133
|
+
"//span[@style='mso-special-character:comment']/@target".freeze
|
134
|
+
|
135
|
+
def reorder_comments_by_comment_link(docxml)
|
136
|
+
link_order = {}
|
137
|
+
docxml.xpath(COMMENT_TARGET_XREFS1).each_with_index do |target, i|
|
138
|
+
link_order[target.value] = i
|
139
|
+
end
|
140
|
+
comments = get_comments_from_text(docxml, link_order)
|
141
|
+
list = docxml.at("//*[@style='mso-element:comment-list']") || return
|
142
|
+
list.children = comments.map { |c| c[:text] }.join("\n")
|
143
|
+
end
|
136
144
|
end
|
137
|
-
comments = get_comments_from_text(docxml, link_order)
|
138
|
-
list = docxml.at("//*[@style='mso-element:comment-list']") || return
|
139
|
-
list.children = comments.map { |c| c[:text] }.join("\n")
|
140
145
|
end
|
@@ -5,9 +5,11 @@ require "liquid"
|
|
5
5
|
require_relative "wordconvertmodule"
|
6
6
|
require_relative "comments"
|
7
7
|
require_relative "footnotes"
|
8
|
+
require_relative "postprocess"
|
8
9
|
|
9
10
|
module IsoDoc
|
10
11
|
|
12
|
+
=begin
|
11
13
|
module WordConvertModule
|
12
14
|
# http://tech.tulentsev.com/2012/02/ruby-how-to-override-class-method-with-a-module/
|
13
15
|
# https://www.ruby-forum.com/topic/148303
|
@@ -24,9 +26,10 @@ module IsoDoc
|
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
29
|
+
=end
|
27
30
|
|
28
|
-
class WordConvert <
|
29
|
-
include WordConvertModule
|
31
|
+
class WordConvert < Common
|
32
|
+
#include WordConvertModule
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
module IsoDoc
|
2
|
+
class WordConvert < Common
|
3
|
+
|
4
|
+
def footnotes(div)
|
2
5
|
return if @footnotes.empty?
|
3
6
|
@footnotes.each { |fn| div.parent << fn }
|
4
7
|
end
|
@@ -66,3 +69,13 @@ def footnote_parse(node, out)
|
|
66
69
|
@in_footnote = false
|
67
70
|
@seen_footnote << fn
|
68
71
|
end
|
72
|
+
|
73
|
+
def make_footnote(node, fn)
|
74
|
+
return if @seen_footnote.include?(fn)
|
75
|
+
@in_footnote = true
|
76
|
+
@footnotes << make_generic_footnote_text(node, fn)
|
77
|
+
@in_footnote = false
|
78
|
+
@seen_footnote << fn
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
module IsoDoc
|
2
|
+
class WordConvert < Common
|
3
|
+
|
4
|
+
def postprocess(result, filename, dir)
|
2
5
|
generate_header(filename, dir)
|
3
6
|
result = from_xhtml(cleanup(to_xhtml(result)))
|
4
7
|
toWord(result, filename, dir)
|
@@ -53,7 +56,7 @@ end
|
|
53
56
|
def generate_header(filename, _dir)
|
54
57
|
return unless @header
|
55
58
|
template = Liquid::Template.parse(File.read(@header, encoding: "UTF-8"))
|
56
|
-
meta =
|
59
|
+
meta = @meta.get
|
57
60
|
meta[:filename] = filename
|
58
61
|
params = meta.map { |k, v| [k.to_s, v] }.to_h
|
59
62
|
File.open("header.html", "w") do |f|
|
@@ -107,4 +110,6 @@ def make_WordToC(docxml)
|
|
107
110
|
end
|
108
111
|
toc.sub(/(<p class="MsoToc1">)/,
|
109
112
|
%{\\1#{WORD_TOC_PREFACE1}}) + WORD_TOC_SUFFIX1
|
113
|
+
end
|
114
|
+
end
|
110
115
|
end
|
@@ -1,4 +1,13 @@
|
|
1
|
-
|
1
|
+
module IsoDoc
|
2
|
+
class WordConvert < Common
|
3
|
+
def make_body1(body, _docxml)
|
4
|
+
body.div **{ class: "WordSection1" } do |div1|
|
5
|
+
div1.p { |p| p << " " } # placeholder
|
6
|
+
end
|
7
|
+
section_break(body)
|
8
|
+
end
|
9
|
+
|
10
|
+
def make_body2(body, docxml)
|
2
11
|
body.div **{ class: "WordSection2" } do |div2|
|
3
12
|
info docxml, div2
|
4
13
|
foreword docxml, div2
|
@@ -136,4 +145,6 @@ def figure_aside_process(f, aside, key)
|
|
136
145
|
a.delete("class")
|
137
146
|
a.parent = dd
|
138
147
|
end
|
148
|
+
end
|
149
|
+
end
|
139
150
|
end
|
data/lib/isodoc/xref_gen.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "roman-numerals"
|
2
2
|
|
3
3
|
module IsoDoc
|
4
|
-
class
|
4
|
+
class Common
|
5
5
|
@anchors = {}
|
6
6
|
|
7
7
|
def get_anchors
|
@@ -15,6 +15,7 @@ module IsoDoc
|
|
15
15
|
def termnote_anchor_names(docxml)
|
16
16
|
docxml.xpath(ns("//term[termnote]")).each do |t|
|
17
17
|
t.xpath(ns("./termnote")).each_with_index do |n, i|
|
18
|
+
return if n["id"].nil? || n["id"].empty?
|
18
19
|
@anchors[n["id"]] =
|
19
20
|
{ label: termnote_label(i + 1),
|
20
21
|
xref: l10n("#{@anchors[t['id']][:xref]}, "\
|
@@ -26,6 +27,7 @@ module IsoDoc
|
|
26
27
|
def termexample_anchor_names(docxml)
|
27
28
|
docxml.xpath(ns("//term[termexample]")).each do |t|
|
28
29
|
t.xpath(ns("./termexample")).each_with_index do |n, i|
|
30
|
+
return if n["id"].nil? || n["id"].empty?
|
29
31
|
@anchors[n["id"]] =
|
30
32
|
{ label: (i + 1).to_s,
|
31
33
|
xref: l10n("#{@anchors[t['id']][:xref]}, "\
|
@@ -48,7 +50,7 @@ module IsoDoc
|
|
48
50
|
notes = s.xpath(CHILD_NOTES_XPATH)
|
49
51
|
notes.each_with_index do |n, i|
|
50
52
|
next if @anchors[n["id"]]
|
51
|
-
next if n["id"].nil?
|
53
|
+
next if n["id"].nil? || n["id"].empty?
|
52
54
|
idx = notes.size == 1 ? "" : " #{i + 1}"
|
53
55
|
@anchors[n["id"]] = anchor_struct(idx, s, @note_xref_lbl)
|
54
56
|
end
|
@@ -65,6 +67,7 @@ module IsoDoc
|
|
65
67
|
notes = s.xpath(CHILD_EXAMPLES_XPATH)
|
66
68
|
notes.each_with_index do |n, i|
|
67
69
|
next if @anchors[n["id"]]
|
70
|
+
next if n["id"].nil? || n["id"].empty?
|
68
71
|
idx = notes.size == 1 ? "" : " #{i + 1}"
|
69
72
|
@anchors[n["id"]] = anchor_struct(idx, s, @example_xref_lbl)
|
70
73
|
end
|
@@ -77,6 +80,7 @@ module IsoDoc
|
|
77
80
|
notes = s.xpath(ns(".//ol")) - s.xpath(ns(".//clause//ol")) -
|
78
81
|
s.xpath(ns(".//appendix//ol")) - s.xpath(ns(".//ol//ol"))
|
79
82
|
notes.each_with_index do |n, i|
|
83
|
+
next if n["id"].nil? || n["id"].empty?
|
80
84
|
idx = notes.size == 1 ? "" : " #{i + 1}"
|
81
85
|
@anchors[n["id"]] = anchor_struct(idx, s, @list_lbl)
|
82
86
|
list_item_anchor_names(n, @anchors[n["id"]], 1, "", notes.size != 1)
|
@@ -128,6 +132,7 @@ module IsoDoc
|
|
128
132
|
i += 1
|
129
133
|
end
|
130
134
|
label = i.to_s + (j.zero? ? "" : "-#{j}")
|
135
|
+
next if t["id"].nil? || t["id"].empty?
|
131
136
|
@anchors[t["id"]] = anchor_struct(label, nil, @figure_lbl)
|
132
137
|
end
|
133
138
|
end
|
@@ -159,10 +164,12 @@ module IsoDoc
|
|
159
164
|
|
160
165
|
def sequential_asset_names(clause)
|
161
166
|
clause.xpath(ns(".//table")).each_with_index do |t, i|
|
167
|
+
next if t["id"].nil? || t["id"].empty?
|
162
168
|
@anchors[t["id"]] = anchor_struct(i + 1, nil, @table_lbl)
|
163
169
|
end
|
164
170
|
sequential_figure_names(clause)
|
165
171
|
clause.xpath(ns(".//formula")).each_with_index do |t, i|
|
172
|
+
next if t["id"].nil? || t["id"].empty?
|
166
173
|
@anchors[t["id"]] = anchor_struct(i + 1, t, @formula_lbl)
|
167
174
|
end
|
168
175
|
end
|
@@ -176,16 +183,19 @@ module IsoDoc
|
|
176
183
|
i += 1
|
177
184
|
end
|
178
185
|
label = "#{num}.#{i}" + (j.zero? ? "" : "-#{j}")
|
186
|
+
next if t["id"].nil? || t["id"].empty?
|
179
187
|
@anchors[t["id"]] = anchor_struct(label, nil, @figure_lbl)
|
180
188
|
end
|
181
189
|
end
|
182
190
|
|
183
191
|
def hierarchical_asset_names(clause, num)
|
184
192
|
clause.xpath(ns(".//table")).each_with_index do |t, i|
|
193
|
+
next if t["id"].nil? || t["id"].empty?
|
185
194
|
@anchors[t["id"]] = anchor_struct("#{num}.#{i + 1}", nil, @table_lbl)
|
186
195
|
end
|
187
196
|
hierarchical_figure_names(clause, num)
|
188
197
|
clause.xpath(ns(".//formula")).each_with_index do |t, i|
|
198
|
+
next if t["id"].nil? || t["id"].empty?
|
189
199
|
@anchors[t["id"]] = anchor_struct("#{num}.#{i + 1}", t, @formula_lbl)
|
190
200
|
end
|
191
201
|
end
|