isodoc 3.5.2 → 3.6.0

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: 85c86c0d97a88786700d65fdfedf86b6bc6c838f64e9278149e14686a0c8d96c
4
- data.tar.gz: 7673f0d5b22d03588611ddbc60336d8cf516d71abb60c75faf24aa541fbf18e0
3
+ metadata.gz: a7090dc22f60e48ff426569497b98e6269308ad72b4a7198fbe08ee42a579944
4
+ data.tar.gz: b5843c03c85e957088107f0a6b30351f67c46117b2bc461c6a95739471077eb3
5
5
  SHA512:
6
- metadata.gz: 2b5193c40be8084d8ba261719bd1ab184227611feaacdac805ad93349a01c2173a8502439a4a206fbaf805cb57015f23ef5915de9433ab866d2c8ca1489d3a9f
7
- data.tar.gz: 83838850dd22316238d0a9c1125fd70f957dea4a361cb55f9697c4580c5c7cad43b1040740111ef710f690854fe180eb057153888e192c912cdfc9dd361b6ebd
6
+ metadata.gz: d0dac37b3d8c895bd2879f877231604b1ed71a350efc3c45bcc514dab06e3360b8d4c5df044412d90a82984639d02413cb9db15b1e3168e42a28d8a48300f4ab
7
+ data.tar.gz: 3f83a6ad5fe77b8fd81d644f8edc56a0dd5a9d24c19202a561ece45c7c3d1d2109a6da4e427a45c3a6d22bb36836d248662765775e605f83a84e2e93e4ed47f6
data/Gemfile CHANGED
@@ -4,6 +4,21 @@ Encoding.default_internal = Encoding::UTF_8
4
4
  source "https://rubygems.org"
5
5
  git_source(:github) { |repo| "https://github.com/#{repo}" }
6
6
 
7
- gemspec
7
+ gem "benchmark"
8
+ gem "canon"
9
+ gem "debug"
10
+ gem "equivalent-xml", "~> 0.6"
11
+ gem "guard", "~> 2.14"
12
+ gem "guard-rspec", "~> 4.7"
13
+ gem "rake"
14
+ gem "rspec", "~> 3.6"
15
+ gem "rubocop", "~> 1"
16
+ gem "rubocop-performance"
17
+ gem "sassc-embedded", "~> 1"
18
+ gem "simplecov", "~> 0.15"
19
+ gem "timecop", "~> 0.9"
8
20
 
9
21
  eval_gemfile("Gemfile.devel") rescue nil
22
+
23
+ gemspec
24
+
data/isodoc.gemspec CHANGED
@@ -30,32 +30,18 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.add_dependency "base64"
32
32
  spec.add_dependency "bigdecimal"
33
- spec.add_dependency "html2doc", "~> 1.10.0"
33
+ spec.add_dependency "html2doc", "~> 1.11.0"
34
34
  # spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
35
35
  # spec.add_dependency "relaton-cli"
36
36
  # spec.add_dependency "metanorma-utils", "~> 1.5.0" # already in isodoc-i18n
37
37
  spec.add_dependency "mn2pdf", ">= 2.13"
38
38
  spec.add_dependency "mn-requirements", "~> 0.5.0"
39
- spec.add_dependency "rake", "~> 13.0"
40
- spec.add_dependency "relaton-render", "~> 1.1.0"
39
+ spec.add_dependency "relaton-render", "~> 1.2.0"
41
40
  spec.add_dependency "roman-numerals"
42
41
  spec.add_dependency "rouge", "~> 4.0"
43
42
  spec.add_dependency "thread_safe"
44
43
  spec.add_dependency "twitter_cldr", ">= 6.6.0"
45
44
  spec.add_dependency "uuidtools"
46
45
 
47
- spec.add_development_dependency "benchmark"
48
- spec.add_development_dependency "bigdecimal"
49
- spec.add_development_dependency "canon", "= 0.2.3"
50
- spec.add_development_dependency "debug"
51
- spec.add_development_dependency "equivalent-xml", "~> 0.6"
52
- spec.add_development_dependency "guard", "~> 2.14"
53
- spec.add_development_dependency "guard-rspec", "~> 4.7"
54
- spec.add_development_dependency "rspec", "~> 3.6"
55
- spec.add_development_dependency "rubocop", "~> 1"
56
- spec.add_development_dependency "rubocop-performance"
57
- spec.add_development_dependency "sassc-embedded", "~> 1"
58
- spec.add_development_dependency "simplecov", "~> 0.15"
59
- spec.add_development_dependency "timecop", "~> 0.9"
60
46
  # spec.metadata["rubygems_mfa_required"] = "true"
61
47
  end
@@ -60,17 +60,17 @@ module IsoDoc
60
60
  def merge_fnref_into_fn_text(elem)
61
61
  fn = elem.at('.//span[@class="TableFootnoteRef"]/..') or return
62
62
  n = fn.next_element
63
- n&.children&.first&.add_previous_sibling(fn.remove)
63
+ n or return
64
+ n.children.first.add_previous_sibling(fn.remove)
64
65
  end
65
66
 
66
67
  # preempt html2doc putting MsoNormal under TableFootnote class
67
68
  def table_footnote_cleanup(docxml)
68
- docxml.xpath("//table[descendant::aside]").each do |t|
69
+ docxml.xpath("//tfoot[descendant::aside]").each do |t|
69
70
  t.xpath(".//aside").each do |a|
70
71
  merge_fnref_into_fn_text(a)
71
72
  a.name = "div"
72
73
  a["class"] = "TableFootnote"
73
- t << a.remove # this is redundant
74
74
  end
75
75
  end
76
76
  table_footnote_cleanup_propagate(docxml)
@@ -83,55 +83,8 @@ module IsoDoc
83
83
  end
84
84
  end
85
85
 
86
- def remove_bottom_border(cell)
87
- # [^;]* (not +): the preceding property name is the unambiguous
88
- # delimiter, so zero-or-more is equivalent and avoids polynomial
89
- # backtracking on the value portion.
90
- cell["style"] =
91
- cell["style"].gsub(/border-bottom:[^;]*;/, "border-bottom:0pt;")
92
- end
93
-
94
- def table_get_or_make_tfoot(table)
95
- tfoot = table.at(".//tfoot")
96
- if tfoot.nil?
97
- table.add_child("<tfoot></tfoot>")
98
- tfoot = table.at(".//tfoot")
99
- else
100
- tfoot.xpath(".//td | .//th").each { |td| remove_bottom_border(td) }
101
- end
102
- tfoot
103
- end
104
-
105
- def new_fullcolspan_row(table, tfoot)
106
- # how many columns in the table?
107
- cols = 0
108
- table.at(".//tr").xpath("./td | ./th").each do |td|
109
- cols += (td["colspan"] ? td["colspan"].to_i : 1)
110
- end
111
- table["class"].nil? or # = plain table
112
- s = "style='border-top:0pt;border-bottom:#{IsoDoc::Function::Table::SW} 1.5pt;'"
113
- tfoot.add_child("<tr><td colspan='#{cols}' #{s}/></tr>")
114
- tfoot.xpath(".//td").last
115
- end
116
-
117
- TABLENOTE_CSS = "div[@class = 'Note' or @class = 'BlockSource' " \
118
- "or @class = 'TableFootnote' or @class = 'figdl' or @class = 'key']"
119
- .freeze
120
-
121
- def table_note_cleanup(docxml)
122
- docxml.xpath("//table[dl or #{TABLENOTE_CSS}]").each do |t|
123
- tfoot = table_get_or_make_tfoot(t)
124
- insert_here = new_fullcolspan_row(t, tfoot)
125
- t.xpath("dl | p[@class = 'ListTitle'] | #{TABLENOTE_CSS}")
126
- .each do |d|
127
- d.parent = insert_here
128
- end
129
- end
130
- end
131
-
132
86
  def table_cleanup(docxml)
133
87
  table_footnote_cleanup(docxml)
134
- table_note_cleanup(docxml)
135
88
  docxml
136
89
  end
137
90
 
@@ -141,9 +94,10 @@ module IsoDoc
141
94
  # characters. Quoted alternatives listed first so `/` inside
142
95
  # attribute values (e.g. URLs in href="...") is consumed as part
143
96
  # of the quoted string, not rejected by [^>/].
97
+ # Includes Word HTML tags
144
98
  def empty_tags(html)
145
99
  void_elements = %w[area base br col embed hr img input link meta
146
- source track wbr]
100
+ source track wbr wrapblock]
147
101
  html.gsub(%r{<([\w:]+)((?>"[^"]*"|'[^']*'|[^>/])*)\s*/>}) do
148
102
  if void_elements.include?($1)
149
103
  $&
@@ -89,12 +89,26 @@ module IsoDoc
89
89
  @in_table = false
90
90
  end
91
91
 
92
+ def table_parse_tail_elems
93
+ ["./key", "./fmt-source", "./note",
94
+ "./fmt-footnote-container/fmt-fn-body"]
95
+ end
96
+
92
97
  def table_parse_tail(node, out)
93
- (dl = node.at(ns("./key"))) && parse(dl, out)
94
- node.xpath(ns("./fmt-source")).each { |n| parse(n, out) }
95
- node.xpath(ns("./note")).each { |n| parse(n, out) }
96
- node.xpath(ns("./fmt-footnote-container/fmt-fn-body"))
97
- .each { |n| parse(n, out) }
98
+ table_parse_tail?(node) or return
99
+ tfoot = table_get_or_make_tfoot(out.parent)
100
+ ins = new_fullcolspan_row(out.parent, tfoot)
101
+ b = Nokogiri::XML::Builder.with(ins)
102
+ table_parse_tail_elems.each do |k|
103
+ node.xpath(ns(k)).each { |n| parse(n, b) }
104
+ end
105
+ end
106
+
107
+ def table_parse_tail?(node)
108
+ table_parse_tail_elems.each do |k|
109
+ !node.xpath(ns(k)).empty? and return true
110
+ end
111
+ false
98
112
  end
99
113
 
100
114
  def table_parse_core(node, out)
@@ -139,16 +153,47 @@ module IsoDoc
139
153
  end
140
154
 
141
155
  def tr_parse(node, out, ord, totalrows, header)
142
- bordered = table_bordered?(node)
143
156
  out.tr(**attr_code(style: node["style"])) do |r|
144
157
  node.elements.each do |td|
145
- attrs = make_tr_attr(td, ord, totalrows - 1, header, bordered)
158
+ attrs = make_tr_attr(td, ord, totalrows - 1, header,
159
+ table_bordered?(node))
146
160
  r.send td.name, **attr_code(attrs) do |entry|
147
161
  td.children.each { |n| parse(n, entry) }
148
162
  end
149
163
  end
150
164
  end
151
165
  end
166
+
167
+ def remove_bottom_border(cell)
168
+ # [^;]* (not +): the preceding property name is the unambiguous
169
+ # delimiter, so zero-or-more is equivalent and avoids polynomial
170
+ # backtracking on the value portion.
171
+ cell["style"] &&=
172
+ cell["style"].gsub(/border-bottom:[^;]*;/, "border-bottom:0pt;")
173
+ end
174
+
175
+ def table_get_or_make_tfoot(table)
176
+ tfoot = table.at(".//tfoot")
177
+ if tfoot.nil?
178
+ table.add_child("<tfoot></tfoot>")
179
+ tfoot = table.at(".//tfoot")
180
+ else
181
+ tfoot.xpath(".//td | .//th").each { |td| remove_bottom_border(td) }
182
+ end
183
+ tfoot
184
+ end
185
+
186
+ def new_fullcolspan_row(table, tfoot)
187
+ # how many columns in the table?
188
+ cols = 0
189
+ table.at(".//tr").xpath("./td | ./th").each do |td|
190
+ cols += (td["colspan"] ? td["colspan"].to_i : 1)
191
+ end
192
+ table["class"].nil? or # = plain table
193
+ s = "style='border-top:0pt;border-bottom:#{SW} 1.5pt;'"
194
+ tfoot.add_child("<tr><td colspan='#{cols}' #{s}/></tr>")
195
+ tfoot.xpath(".//td").last
196
+ end
152
197
  end
153
198
  end
154
199
  end
@@ -116,7 +116,7 @@ module IsoDoc
116
116
  return "" unless draft
117
117
 
118
118
  draftinfo = " (#{@labels['draft_label']} <esc>#{draft}</esc>"
119
- draftinfo += ", #{revdate}" if revdate
119
+ draftinfo += ", #{revdate}" if revdate && revdate != draft
120
120
  draftinfo += ")"
121
121
  l10n(draftinfo, @lang, @script)
122
122
  end
@@ -126,8 +126,8 @@ module IsoDoc
126
126
  set(:edition_display,
127
127
  isoxml.at(ns("//bibdata/edition#{currlang}"))&.text)
128
128
  set(:docyear, isoxml.at(ns("//bibdata/copyright/from"))&.text)
129
- set(:draft, isoxml.at(ns("//bibdata/version/draft"))&.text)
130
- revdate = isoxml.at(ns("//bibdata/version/revision-date"))&.text
129
+ set(:draft, isoxml.at(ns("//bibdata/version"))&.text)
130
+ revdate = isoxml.at(ns("//bibdata/date[@type='updated']/on"))&.text
131
131
  set(:revdate, revdate)
132
132
  set(:revdate_monthyear, monthyr(revdate))
133
133
  set(:draftinfo,
@@ -42,7 +42,7 @@ module IsoDoc
42
42
 
43
43
  def bibdate(isoxml, _out)
44
44
  isoxml.xpath(ns("//bibdata/date")).each do |d|
45
- set("#{d['type'].tr('-', '_')}date".to_sym, Common::date_range(d))
45
+ set(:"#{d['type'].tr('-', '_')}date", Common::date_range(d))
46
46
  end
47
47
  end
48
48
  end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "canon"
4
+
5
+ # Guard against leading "<?xml ?>" processing instructions in HTML
6
+ # input strings passed to Canon's be_html_equivalent_to /
7
+ # be_html4_equivalent_to / be_html5_equivalent_to matchers.
8
+ #
9
+ # WHY: Nokogiri::HTML5.fragment parses a leading "<?xml ?>" as a bogus
10
+ # Nokogiri::XML::Comment at index 0 of the fragment. In Canon's
11
+ # verbose mode (used by the matchers) comments are intentionally not
12
+ # filtered, so the bogus comment shifts fragment child indices and
13
+ # causes Canon's diff report to blame elements at the tail of the
14
+ # document for an offence at the head — an "uninterpretable report"
15
+ # remote from the actual cause. Canon's maintainer has chosen not to
16
+ # normalise this at the input boundary (closed PR lutaml/canon#124);
17
+ # this guard is the local defence.
18
+ #
19
+ # WHEN: required for the side effect. Requiring this file installs a
20
+ # Module#prepend on Canon::RSpecMatchers::SerializationMatcher's
21
+ # matches? method that raises IsoDoc::SpecHelpers::CanonGuardError if
22
+ # either side of an HTML-format comparison begins with an XML PI.
23
+ #
24
+ # REUSE: downstream gems that build on isodoc's spec idioms (metanorma
25
+ # family, mn2pdf, etc.) can opt in by adding a single line to their
26
+ # own spec_helper:
27
+ #
28
+ # require "isodoc/spec_helpers/canon_html_input_guard"
29
+ #
30
+ # No further setup is needed — the module installs on require.
31
+
32
+ module IsoDoc
33
+ module SpecHelpers
34
+ class CanonGuardError < StandardError; end
35
+
36
+ # Prepended onto Canon::RSpecMatchers::SerializationMatcher to
37
+ # intercept matches? before Canon's own implementation runs.
38
+ module CanonHtmlInputGuard
39
+ ILLEGAL_HTML_PREFIX = /\A\s*<\?xml\b/i.freeze
40
+
41
+ def matches?(target)
42
+ if html_format? &&
43
+ (illegal_prefix?(@expected) || illegal_prefix?(target))
44
+ side = illegal_prefix?(@expected) ? "expected" : "received"
45
+ raise CanonGuardError, build_message(side)
46
+ end
47
+ super
48
+ end
49
+
50
+ private
51
+
52
+ def html_format?
53
+ %i[html html4 html5].include?(@format)
54
+ end
55
+
56
+ def illegal_prefix?(value)
57
+ value.is_a?(String) && value.match?(ILLEGAL_HTML_PREFIX)
58
+ end
59
+
60
+ def matcher_label
61
+ case @format
62
+ when :html4 then "be_html4_equivalent_to"
63
+ when :html5 then "be_html5_equivalent_to"
64
+ else "be_html_equivalent_to"
65
+ end
66
+ end
67
+
68
+ def build_message(side)
69
+ <<~MSG
70
+ #{matcher_label}: the #{side} side begins with an XML
71
+ processing instruction (<?xml ?>).
72
+
73
+ Nokogiri::HTML5.fragment parses this as a bogus comment node,
74
+ which shifts fragment child indices and causes Canon's diff
75
+ report to blame elements remote from the actual offending
76
+ node.
77
+
78
+ Strip the PI before comparing — e.g. use
79
+ Nokogiri::HTML(...).to_xhtml in place of
80
+ Nokogiri::XML(...).to_xml, or sub it away explicitly.
81
+
82
+ This guard is enforced by
83
+ isodoc/spec_helpers/canon_html_input_guard because Canon
84
+ does not surface this condition (see closed PR
85
+ lutaml/canon#124).
86
+ MSG
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ Canon::RSpecMatchers::SerializationMatcher
93
+ .prepend(IsoDoc::SpecHelpers::CanonHtmlInputGuard)
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "3.5.2".freeze
2
+ VERSION = "3.6.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isodoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.2
4
+ version: 3.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-27 00:00:00.000000000 Z
11
+ date: 2026-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.10.0
47
+ version: 1.11.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.10.0
54
+ version: 1.11.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mn2pdf
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,34 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.5.0
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '13.0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '13.0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: relaton-render
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: 1.1.0
89
+ version: 1.2.0
104
90
  type: :runtime
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: 1.1.0
96
+ version: 1.2.0
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: roman-numerals
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -178,188 +164,6 @@ dependencies:
178
164
  - - ">="
179
165
  - !ruby/object:Gem::Version
180
166
  version: '0'
181
- - !ruby/object:Gem::Dependency
182
- name: benchmark
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
- - !ruby/object:Gem::Dependency
196
- name: bigdecimal
197
- requirement: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - ">="
200
- - !ruby/object:Gem::Version
201
- version: '0'
202
- type: :development
203
- prerelease: false
204
- version_requirements: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - ">="
207
- - !ruby/object:Gem::Version
208
- version: '0'
209
- - !ruby/object:Gem::Dependency
210
- name: canon
211
- requirement: !ruby/object:Gem::Requirement
212
- requirements:
213
- - - '='
214
- - !ruby/object:Gem::Version
215
- version: 0.2.3
216
- type: :development
217
- prerelease: false
218
- version_requirements: !ruby/object:Gem::Requirement
219
- requirements:
220
- - - '='
221
- - !ruby/object:Gem::Version
222
- version: 0.2.3
223
- - !ruby/object:Gem::Dependency
224
- name: debug
225
- requirement: !ruby/object:Gem::Requirement
226
- requirements:
227
- - - ">="
228
- - !ruby/object:Gem::Version
229
- version: '0'
230
- type: :development
231
- prerelease: false
232
- version_requirements: !ruby/object:Gem::Requirement
233
- requirements:
234
- - - ">="
235
- - !ruby/object:Gem::Version
236
- version: '0'
237
- - !ruby/object:Gem::Dependency
238
- name: equivalent-xml
239
- requirement: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - "~>"
242
- - !ruby/object:Gem::Version
243
- version: '0.6'
244
- type: :development
245
- prerelease: false
246
- version_requirements: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - "~>"
249
- - !ruby/object:Gem::Version
250
- version: '0.6'
251
- - !ruby/object:Gem::Dependency
252
- name: guard
253
- requirement: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - "~>"
256
- - !ruby/object:Gem::Version
257
- version: '2.14'
258
- type: :development
259
- prerelease: false
260
- version_requirements: !ruby/object:Gem::Requirement
261
- requirements:
262
- - - "~>"
263
- - !ruby/object:Gem::Version
264
- version: '2.14'
265
- - !ruby/object:Gem::Dependency
266
- name: guard-rspec
267
- requirement: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - "~>"
270
- - !ruby/object:Gem::Version
271
- version: '4.7'
272
- type: :development
273
- prerelease: false
274
- version_requirements: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - "~>"
277
- - !ruby/object:Gem::Version
278
- version: '4.7'
279
- - !ruby/object:Gem::Dependency
280
- name: rspec
281
- requirement: !ruby/object:Gem::Requirement
282
- requirements:
283
- - - "~>"
284
- - !ruby/object:Gem::Version
285
- version: '3.6'
286
- type: :development
287
- prerelease: false
288
- version_requirements: !ruby/object:Gem::Requirement
289
- requirements:
290
- - - "~>"
291
- - !ruby/object:Gem::Version
292
- version: '3.6'
293
- - !ruby/object:Gem::Dependency
294
- name: rubocop
295
- requirement: !ruby/object:Gem::Requirement
296
- requirements:
297
- - - "~>"
298
- - !ruby/object:Gem::Version
299
- version: '1'
300
- type: :development
301
- prerelease: false
302
- version_requirements: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - "~>"
305
- - !ruby/object:Gem::Version
306
- version: '1'
307
- - !ruby/object:Gem::Dependency
308
- name: rubocop-performance
309
- requirement: !ruby/object:Gem::Requirement
310
- requirements:
311
- - - ">="
312
- - !ruby/object:Gem::Version
313
- version: '0'
314
- type: :development
315
- prerelease: false
316
- version_requirements: !ruby/object:Gem::Requirement
317
- requirements:
318
- - - ">="
319
- - !ruby/object:Gem::Version
320
- version: '0'
321
- - !ruby/object:Gem::Dependency
322
- name: sassc-embedded
323
- requirement: !ruby/object:Gem::Requirement
324
- requirements:
325
- - - "~>"
326
- - !ruby/object:Gem::Version
327
- version: '1'
328
- type: :development
329
- prerelease: false
330
- version_requirements: !ruby/object:Gem::Requirement
331
- requirements:
332
- - - "~>"
333
- - !ruby/object:Gem::Version
334
- version: '1'
335
- - !ruby/object:Gem::Dependency
336
- name: simplecov
337
- requirement: !ruby/object:Gem::Requirement
338
- requirements:
339
- - - "~>"
340
- - !ruby/object:Gem::Version
341
- version: '0.15'
342
- type: :development
343
- prerelease: false
344
- version_requirements: !ruby/object:Gem::Requirement
345
- requirements:
346
- - - "~>"
347
- - !ruby/object:Gem::Version
348
- version: '0.15'
349
- - !ruby/object:Gem::Dependency
350
- name: timecop
351
- requirement: !ruby/object:Gem::Requirement
352
- requirements:
353
- - - "~>"
354
- - !ruby/object:Gem::Version
355
- version: '0.9'
356
- type: :development
357
- prerelease: false
358
- version_requirements: !ruby/object:Gem::Requirement
359
- requirements:
360
- - - "~>"
361
- - !ruby/object:Gem::Version
362
- version: '0.9'
363
167
  description: |
364
168
  isodoc converts documents in the IsoDoc document model into
365
169
  Microsoft Word and HTML.
@@ -482,6 +286,7 @@ files:
482
286
  - lib/isodoc/presentation_function/xrefs.rb
483
287
  - lib/isodoc/presentation_xml_convert.rb
484
288
  - lib/isodoc/sassc_importer.rb
289
+ - lib/isodoc/spec_helpers/canon_html_input_guard.rb
485
290
  - lib/isodoc/version.rb
486
291
  - lib/isodoc/word_convert.rb
487
292
  - lib/isodoc/word_function.rb