isodoc 1.2.6 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +69 -0
- data/README.adoc +1 -3
- data/isodoc.gemspec +2 -1
- data/lib/isodoc-yaml/i18n-en.yaml +56 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +64 -7
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
- data/lib/isodoc/base_style/all.css +4 -0
- data/lib/isodoc/base_style/blocks.scss +2 -2
- data/lib/isodoc/base_style/reset.css +4 -0
- data/lib/isodoc/base_style/reset.scss +5 -0
- data/lib/isodoc/base_style/typography.scss +1 -1
- data/lib/isodoc/convert.rb +13 -98
- data/lib/isodoc/css.rb +95 -0
- data/lib/isodoc/function/inline.rb +0 -33
- data/lib/isodoc/function/inline_simple.rb +4 -1
- data/lib/isodoc/function/lists.rb +2 -1
- data/lib/isodoc/function/references.rb +8 -13
- data/lib/isodoc/function/section.rb +1 -1
- data/lib/isodoc/function/table.rb +10 -0
- data/lib/isodoc/function/to_word_html.rb +2 -2
- data/lib/isodoc/gem_tasks.rb +4 -0
- data/lib/isodoc/html_function/html.rb +1 -0
- data/lib/isodoc/html_function/mathvariant_to_plain.rb +82 -0
- data/lib/isodoc/html_function/postprocess.rb +41 -20
- data/lib/isodoc/i18n.rb +15 -2
- data/lib/isodoc/metadata.rb +28 -109
- data/lib/isodoc/metadata_contributor.rb +91 -0
- data/lib/isodoc/metadata_date.rb +6 -0
- data/lib/isodoc/presentation_function/bibdata.rb +79 -7
- data/lib/isodoc/presentation_function/block.rb +14 -9
- data/lib/isodoc/presentation_function/inline.rb +126 -22
- data/lib/isodoc/presentation_function/section.rb +9 -0
- data/lib/isodoc/presentation_xml_convert.rb +5 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_convert.rb +0 -20
- data/lib/isodoc/word_function/body.rb +12 -0
- data/lib/isodoc/word_function/postprocess.rb +38 -80
- data/lib/isodoc/word_function/postprocess_cover.rb +55 -0
- data/lib/isodoc/word_function/table.rb +10 -0
- data/lib/isodoc/xref.rb +1 -0
- data/lib/isodoc/xref/xref_counter.rb +20 -9
- data/lib/isodoc/xref/xref_gen.rb +20 -2
- data/lib/isodoc/xref/xref_sect_gen.rb +1 -1
- data/spec/assets/html.scss +14 -0
- data/spec/assets/i18n.yaml +17 -9
- data/spec/isodoc/blocks_spec.rb +89 -241
- data/spec/isodoc/cleanup_spec.rb +0 -1
- data/spec/isodoc/footnotes_spec.rb +4 -5
- data/spec/isodoc/i18n_spec.rb +73 -38
- data/spec/isodoc/inline_spec.rb +177 -199
- data/spec/isodoc/lists_spec.rb +1 -1
- data/spec/isodoc/metadata_spec.rb +50 -7
- data/spec/isodoc/postproc_spec.rb +472 -11
- data/spec/isodoc/presentation_xml_spec.rb +584 -1
- data/spec/isodoc/ref_spec.rb +327 -12
- data/spec/isodoc/table_spec.rb +28 -0
- data/spec/isodoc/xref_spec.rb +162 -17
- data/spec/spec_helper.rb +2 -0
- metadata +22 -7
- data/.github/workflows/macos.yml +0 -42
- data/.github/workflows/ubuntu.yml +0 -62
- data/.github/workflows/windows.yml +0 -44
@@ -75,5 +75,60 @@ module IsoDoc::WordFunction
|
|
75
75
|
toc.sub(/(<p class="MsoToc1">)/,
|
76
76
|
%{\\1#{word_toc_preface(level)}}) + WORD_TOC_SUFFIX1
|
77
77
|
end
|
78
|
+
|
79
|
+
def authority_cleanup1(docxml, klass)
|
80
|
+
dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
|
81
|
+
auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or @class = 'boilerplate-#{klass}']")
|
82
|
+
auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each { |h| h.remove }
|
83
|
+
auth&.xpath(".//h1 | .//h2")&.each do |h|
|
84
|
+
h.name = "p"
|
85
|
+
h["class"] = "TitlePageSubhead"
|
86
|
+
end
|
87
|
+
dest and auth and dest.replace(auth.remove)
|
88
|
+
end
|
89
|
+
|
90
|
+
def authority_cleanup(docxml)
|
91
|
+
%w(copyright license legal feedback).each do |t|
|
92
|
+
authority_cleanup1(docxml, t)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def generate_header(filename, _dir)
|
97
|
+
return nil unless @header
|
98
|
+
template = IsoDoc::Common.liquid(File.read(@header, encoding: "UTF-8"))
|
99
|
+
meta = @meta.get.merge(@labels || {}).merge(@meta.labels || {})
|
100
|
+
meta[:filename] = filename
|
101
|
+
params = meta.map { |k, v| [k.to_s, v] }.to_h
|
102
|
+
Tempfile.open(%w(header html), :encoding => "utf-8") do |f|
|
103
|
+
f.write(template.render(params))
|
104
|
+
f
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def word_section_breaks(docxml)
|
109
|
+
@landscapestyle = ""
|
110
|
+
word_section_breaks1(docxml, "WordSection2")
|
111
|
+
word_section_breaks1(docxml, "WordSection3")
|
112
|
+
word_remove_pb_before_annex(docxml)
|
113
|
+
docxml.xpath("//br[@orientation]").each { |br| br.delete("orientation") }
|
114
|
+
end
|
115
|
+
|
116
|
+
def word_section_breaks1(docxml, sect)
|
117
|
+
docxml.xpath("//div[@class = '#{sect}']//br[@orientation]").reverse.
|
118
|
+
each_with_index do |br, i|
|
119
|
+
@landscapestyle += "\ndiv.#{sect}_#{i} {page:#{sect}#{br["orientation"] == "landscape" ? "L" : "P"};}\n"
|
120
|
+
split_at_section_break(docxml, sect, br, i)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def split_at_section_break(docxml, sect, br, i)
|
125
|
+
move = br.parent.xpath("following::node()") &
|
126
|
+
br.document.xpath("//div[@class = '#{sect}']//*")
|
127
|
+
ins = docxml.at("//div[@class = '#{sect}']").after("<div class='#{sect}_#{i}'/>").next_element
|
128
|
+
move.each do |m|
|
129
|
+
next if m.at("./ancestor::div[@class = '#{sect}_#{i}']")
|
130
|
+
ins << m.remove
|
131
|
+
end
|
132
|
+
end
|
78
133
|
end
|
79
134
|
end
|
@@ -43,11 +43,21 @@ module IsoDoc::WordFunction
|
|
43
43
|
}))
|
44
44
|
end
|
45
45
|
|
46
|
+
def colgroup(node, t)
|
47
|
+
colgroup = node.at(ns("./colgroup")) or return
|
48
|
+
t.colgroup do |cg|
|
49
|
+
colgroup.xpath(ns("./col")).each do |c|
|
50
|
+
cg.col **{ width: c["width"] }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
46
55
|
def table_parse(node, out)
|
47
56
|
@in_table = true
|
48
57
|
table_title_parse(node, out)
|
49
58
|
out.div **{ align: "center", class: "table_container" } do |div|
|
50
59
|
div.table **table_attrs(node) do |t|
|
60
|
+
colgroup(node, t)
|
51
61
|
thead_parse(node, t)
|
52
62
|
tbody_parse(node, t)
|
53
63
|
tfoot_parse(node, t)
|
data/lib/isodoc/xref.rb
CHANGED
@@ -49,6 +49,7 @@ module IsoDoc
|
|
49
49
|
note_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
50
50
|
example_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
51
51
|
list_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
52
|
+
bookmark_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
52
53
|
end
|
53
54
|
|
54
55
|
def ns(xpath)
|
@@ -2,8 +2,8 @@ require "roman-numerals"
|
|
2
2
|
|
3
3
|
module IsoDoc::XrefGen
|
4
4
|
class Counter
|
5
|
-
def initialize
|
6
|
-
@num =
|
5
|
+
def initialize(num = 0)
|
6
|
+
@num = num
|
7
7
|
@letter = ""
|
8
8
|
@subseq = ""
|
9
9
|
@letter_override = nil
|
@@ -76,13 +76,24 @@ module IsoDoc::XrefGen
|
|
76
76
|
"#{@base}#{@number_override || @num}#{@letter_override || @letter}"
|
77
77
|
end
|
78
78
|
|
79
|
-
def
|
80
|
-
return
|
81
|
-
return
|
82
|
-
return
|
83
|
-
return
|
84
|
-
return
|
85
|
-
return
|
79
|
+
def ol_type(list, depth)
|
80
|
+
return list["type"].to_sym if list["type"]
|
81
|
+
return :arabic if [2, 7].include? depth
|
82
|
+
return :alphabet if [1, 6].include? depth
|
83
|
+
return :alphabet_upper if [4, 9].include? depth
|
84
|
+
return :roman if [3, 8].include? depth
|
85
|
+
return :roman_upper if [5, 10].include? depth
|
86
|
+
return :arabic
|
87
|
+
end
|
88
|
+
|
89
|
+
def listlabel(list, depth)
|
90
|
+
case ol_type(list, depth)
|
91
|
+
when :arabic then @num.to_s
|
92
|
+
when :alphabet then (96 + @num).chr.to_s
|
93
|
+
when :alphabet_upper then (64 + @num).chr.to_s
|
94
|
+
when :roman then RomanNumerals.to_roman(@num).downcase
|
95
|
+
when :roman_upper then RomanNumerals.to_roman(@num).upcase
|
96
|
+
end
|
86
97
|
end
|
87
98
|
end
|
88
99
|
end
|
data/lib/isodoc/xref/xref_gen.rb
CHANGED
@@ -66,6 +66,10 @@ module IsoDoc::XrefGen
|
|
66
66
|
"//sections/clause | //sections/definitions | "\
|
67
67
|
"//bibliography/references | //bibliography/clause".freeze
|
68
68
|
|
69
|
+
def sections_xpath
|
70
|
+
SECTIONS_XPATH
|
71
|
+
end
|
72
|
+
|
69
73
|
CHILD_NOTES_XPATH =
|
70
74
|
"./*[not(self::xmlns:clause) and not(self::xmlns:appendix) and "\
|
71
75
|
"not(self::xmlns:terms) and not(self::xmlns:definitions)]//xmlns:note | "\
|
@@ -123,9 +127,9 @@ module IsoDoc::XrefGen
|
|
123
127
|
end
|
124
128
|
|
125
129
|
def list_item_anchor_names(list, list_anchor, depth, prev_label, refer_list)
|
126
|
-
c = Counter.new
|
130
|
+
c = Counter.new(list["start"] ? list["start"].to_i - 1 : 0)
|
127
131
|
list.xpath(ns("./li")).each do |li|
|
128
|
-
label = c.increment(li).listlabel(depth)
|
132
|
+
label = c.increment(li).listlabel(list, depth)
|
129
133
|
label = "#{prev_label}.#{label}" unless prev_label.empty?
|
130
134
|
label = "#{list_anchor[:xref]} #{label}" if refer_list
|
131
135
|
li["id"] and @anchors[li["id"]] =
|
@@ -136,5 +140,19 @@ module IsoDoc::XrefGen
|
|
136
140
|
end
|
137
141
|
end
|
138
142
|
end
|
143
|
+
|
144
|
+
def bookmark_anchor_names(sections)
|
145
|
+
sections.each do |s|
|
146
|
+
notes = s.xpath(ns(".//bookmark")) - s.xpath(ns(".//clause//bookmark")) -
|
147
|
+
s.xpath(ns(".//appendix//bookmark"))
|
148
|
+
notes.each do |n|
|
149
|
+
next if n["id"].nil? || n["id"].empty?
|
150
|
+
@anchors[n["id"]] = {
|
151
|
+
type: "bookmark", label: nil, value: nil,
|
152
|
+
xref: @anchors[s["id"]][:xref] }
|
153
|
+
end
|
154
|
+
bookmark_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
|
155
|
+
end
|
156
|
+
end
|
139
157
|
end
|
140
158
|
end
|
@@ -68,7 +68,7 @@ module IsoDoc::XrefGen
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def clause_names(docxml, sect_num)
|
71
|
-
docxml.xpath(ns(@klass.middle_clause)).each_with_index do |c, i|
|
71
|
+
docxml.xpath(ns(@klass.middle_clause(docxml))).each_with_index do |c, i|
|
72
72
|
section_names(c, (i + sect_num), 1)
|
73
73
|
end
|
74
74
|
end
|
data/spec/assets/html.scss
CHANGED
@@ -3,4 +3,18 @@
|
|
3
3
|
|
4
4
|
p {
|
5
5
|
font-family: $bodyfont;
|
6
|
+
font-size: $normalfontsize;
|
7
|
+
}
|
8
|
+
code {
|
9
|
+
font-family: $monospacefont;
|
10
|
+
font-size: $monospacefontsize;
|
11
|
+
}
|
12
|
+
aside {
|
13
|
+
font-size: $footnotefontsize;
|
14
|
+
}
|
15
|
+
h1 {
|
16
|
+
font-family: $headerfont;
|
17
|
+
}
|
18
|
+
p.note {
|
19
|
+
font-size: $smallerfontsize;
|
6
20
|
}
|
data/spec/assets/i18n.yaml
CHANGED
@@ -1,25 +1,33 @@
|
|
1
|
-
foreword:
|
1
|
+
foreword: Antaŭparolo
|
2
2
|
introduction: Enkonduko
|
3
|
-
clause:
|
4
|
-
table:
|
3
|
+
clause: klaŭzo
|
4
|
+
table: tabelo
|
5
5
|
source: SOURCE
|
6
6
|
modified: modified
|
7
7
|
scope: Amplekso
|
8
8
|
symbols: Simboloj kai mallongigitaj terminoj
|
9
9
|
annex: Aldono
|
10
|
-
normref: Normaj
|
10
|
+
normref: Normaj citaĵoj
|
11
11
|
bibliography: Bibliografio
|
12
12
|
inform_annex: informa
|
13
|
-
all_parts:
|
13
|
+
all_parts: ĉiuj partoj
|
14
|
+
norm_annex: normative
|
15
|
+
note: NOTO
|
14
16
|
locality: {
|
15
17
|
table: Tabelo
|
16
|
-
|
18
|
+
}
|
17
19
|
doctype_dict: {
|
18
|
-
brochure:
|
19
|
-
|
20
|
+
brochure: broŝuro,
|
21
|
+
conference proceedings: konferencaktoj
|
22
|
+
}
|
20
23
|
stage_dict: {
|
21
24
|
published: publikigita
|
22
25
|
}
|
23
26
|
substage_dict: {
|
24
27
|
withdrawn: fortirita
|
25
|
-
|
28
|
+
}
|
29
|
+
array:
|
30
|
+
- elem1
|
31
|
+
- elem2
|
32
|
+
- {elem3: elem4, elem5: elem6}
|
33
|
+
void:
|
data/spec/isodoc/blocks_spec.rb
CHANGED
@@ -87,32 +87,18 @@ RSpec.describe IsoDoc do
|
|
87
87
|
<standard-document xmlns="https://www.metanorma.org/ns/standoc" type="presentation">
|
88
88
|
<bibdata type="standard">
|
89
89
|
<title language="en" format="text/plain">Document title</title>
|
90
|
-
<language>en</language>
|
91
|
-
<script>Latn</script>
|
90
|
+
<language current="true">en</language>
|
91
|
+
<script current="true">Latn</script>
|
92
92
|
<status>
|
93
|
-
<stage>published</stage>
|
93
|
+
<stage language="">published</stage>
|
94
94
|
</status>
|
95
95
|
<copyright>
|
96
96
|
<from>2020</from>
|
97
97
|
</copyright>
|
98
98
|
<ext>
|
99
|
-
<doctype>article</doctype>
|
99
|
+
<doctype language="">article</doctype>
|
100
100
|
</ext>
|
101
101
|
</bibdata>
|
102
|
-
<local_bibdata type='standard'>
|
103
|
-
<title language='en' format='text/plain'>Document title</title>
|
104
|
-
<language>en</language>
|
105
|
-
<script>Latn</script>
|
106
|
-
<status>
|
107
|
-
<stage>published</stage>
|
108
|
-
</status>
|
109
|
-
<copyright>
|
110
|
-
<from>2020</from>
|
111
|
-
</copyright>
|
112
|
-
<ext>
|
113
|
-
<doctype>article</doctype>
|
114
|
-
</ext>
|
115
|
-
</local_bibdata>
|
116
102
|
<sections>
|
117
103
|
<clause id="A" inline-header="false" obligation="normative">
|
118
104
|
<title depth="1">1.<tab/>Change Clause</title>
|
@@ -248,7 +234,7 @@ RSpec.describe IsoDoc do
|
|
248
234
|
</body>
|
249
235
|
</html>
|
250
236
|
OUTPUT
|
251
|
-
expect(xmlpp(IsoDoc::PresentationXMLConvert.new({}).convert("test", input, true))).to be_equivalent_to xmlpp(presxml)
|
237
|
+
expect(xmlpp(IsoDoc::PresentationXMLConvert.new({}).convert("test", input, true)).sub(%r{<localized-strings>.*</localized-strings>}m, "")).to be_equivalent_to xmlpp(presxml)
|
252
238
|
expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
|
253
239
|
end
|
254
240
|
|
@@ -548,7 +534,7 @@ INPUT
|
|
548
534
|
<div>
|
549
535
|
<h1 class='ForewordTitle'>Foreword</h1>
|
550
536
|
<p id='A'>
|
551
|
-
ABC
|
537
|
+
ABC
|
552
538
|
<div id='B' class='Note'>
|
553
539
|
<p>
|
554
540
|
<span class='note_label'>NOTE 1</span>
|
@@ -1469,6 +1455,7 @@ end
|
|
1469
1455
|
<div id='_be9158af-7e93-4ee2-90c5-26d31c181934' style='page-break-after: avoid;page-break-inside: avoid;'><div class='formula'>
|
1470
1456
|
<p>
|
1471
1457
|
<span class='stem'>(#(r = 1 %)#)</span>
|
1458
|
+
<span style='mso-tab-count:1'>  </span>
|
1472
1459
|
</p>
|
1473
1460
|
</div>
|
1474
1461
|
<p>where</p>
|
@@ -2240,8 +2227,8 @@ end
|
|
2240
2227
|
OUTPUT
|
2241
2228
|
end
|
2242
2229
|
|
2243
|
-
it "processes requirements in French
|
2244
|
-
|
2230
|
+
it "processes requirements in French" do
|
2231
|
+
input = <<~INPUT
|
2245
2232
|
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
2246
2233
|
<bibdata>
|
2247
2234
|
<language>fr</language>
|
@@ -2295,133 +2282,63 @@ end
|
|
2295
2282
|
</foreword></preface>
|
2296
2283
|
</iso-standard>
|
2297
2284
|
INPUT
|
2298
|
-
|
2299
|
-
|
2300
|
-
|
2301
|
-
<
|
2302
|
-
<
|
2303
|
-
|
2304
|
-
|
2305
|
-
|
2306
|
-
|
2307
|
-
</
|
2308
|
-
<
|
2309
|
-
|
2310
|
-
|
2311
|
-
|
2312
|
-
|
2313
|
-
|
2314
|
-
|
2315
|
-
|
2316
|
-
|
2317
|
-
|
2318
|
-
|
2319
|
-
|
2320
|
-
|
2321
|
-
|
2322
|
-
|
2323
|
-
|
2324
|
-
<
|
2325
|
-
|
2326
|
-
|
2327
|
-
|
2328
|
-
|
2329
|
-
|
2330
|
-
|
2331
|
-
|
2332
|
-
|
2333
|
-
|
2334
|
-
|
2335
|
-
|
2336
|
-
|
2337
|
-
|
2338
|
-
|
2339
|
-
|
2340
|
-
|
2341
|
-
|
2342
|
-
|
2343
|
-
|
2344
|
-
|
2345
|
-
|
2346
|
-
|
2347
|
-
|
2348
|
-
|
2349
|
-
|
2350
|
-
|
2351
|
-
|
2352
|
-
success-response) end
|
2353
|
-
</sourcecode>
|
2354
|
-
</verification>
|
2355
|
-
<import exclude='true'>
|
2356
|
-
<sourcecode id='_'>success-response()</sourcecode>
|
2357
|
-
</import>
|
2358
|
-
</requirement>
|
2359
|
-
</foreword>
|
2360
|
-
</preface>
|
2361
|
-
</iso-standard>
|
2285
|
+
|
2286
|
+
presxml = <<~OUTPUT
|
2287
|
+
<iso-standard xmlns="http://riboseinc.com/isoxml" type="presentation">
|
2288
|
+
<bibdata>
|
2289
|
+
<language current="true">fr</language>
|
2290
|
+
<script current="true">Latn</script>
|
2291
|
+
</bibdata>
|
2292
|
+
<preface><foreword>
|
2293
|
+
<requirement id="A" unnumbered="true"><name>Exigence</name>
|
2294
|
+
<title>A New Requirement</title>
|
2295
|
+
<label>/ogc/recommendation/wfs/2</label>
|
2296
|
+
<inherit>/ss/584/2015/level/1</inherit>
|
2297
|
+
<subject>user</subject>
|
2298
|
+
<description>
|
2299
|
+
<p id="_">I recommend <em>this</em>.</p>
|
2300
|
+
</description>
|
2301
|
+
<specification exclude="true" type="tabular">
|
2302
|
+
<p id="_">This is the object of the recommendation:</p>
|
2303
|
+
<table id="_">
|
2304
|
+
<tbody>
|
2305
|
+
<tr>
|
2306
|
+
<td style="text-align:left;">Object</td>
|
2307
|
+
<td style="text-align:left;">Value</td>
|
2308
|
+
</tr>
|
2309
|
+
<tr>
|
2310
|
+
<td style="text-align:left;">Mission</td>
|
2311
|
+
<td style="text-align:left;">Accomplished</td>
|
2312
|
+
</tr>
|
2313
|
+
</tbody>
|
2314
|
+
</table>
|
2315
|
+
</specification>
|
2316
|
+
<description>
|
2317
|
+
<p id="_">As for the measurement targets,</p>
|
2318
|
+
</description>
|
2319
|
+
<measurement-target exclude="false">
|
2320
|
+
<p id="_">The measurement target shall be measured as:</p>
|
2321
|
+
<formula id="B"><name>1</name>
|
2322
|
+
<stem type="AsciiMath">r/1 = 0</stem>
|
2323
|
+
</formula>
|
2324
|
+
</measurement-target>
|
2325
|
+
<verification exclude="false">
|
2326
|
+
<p id="_">The following code will be run for verification:</p>
|
2327
|
+
<sourcecode id="_">CoreRoot(success): HttpResponse
|
2328
|
+
if (success)
|
2329
|
+
recommendation(label: success-response)
|
2330
|
+
end
|
2331
|
+
</sourcecode>
|
2332
|
+
</verification>
|
2333
|
+
<import exclude="true">
|
2334
|
+
<sourcecode id="_">success-response()</sourcecode>
|
2335
|
+
</import>
|
2336
|
+
</requirement>
|
2337
|
+
</foreword></preface>
|
2338
|
+
</iso-standard>
|
2362
2339
|
OUTPUT
|
2363
|
-
end
|
2364
2340
|
|
2365
|
-
|
2366
|
-
expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
2367
|
-
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
2368
|
-
<bibdata>
|
2369
|
-
<language>fr</language>
|
2370
|
-
<script>Latn</script>
|
2371
|
-
</bibdata>
|
2372
|
-
<local_bibdata>
|
2373
|
-
<language>fr</language>
|
2374
|
-
<script>Latn</script>
|
2375
|
-
</local_bibdata>
|
2376
|
-
<preface><foreword>
|
2377
|
-
<requirement id="A" unnumbered="true">
|
2378
|
-
<name>Exigence</name>
|
2379
|
-
<title>A New Requirement</title>
|
2380
|
-
<label>/ogc/recommendation/wfs/2</label>
|
2381
|
-
<inherit>/ss/584/2015/level/1</inherit>
|
2382
|
-
<subject>user</subject>
|
2383
|
-
<description>
|
2384
|
-
<p id="_">I recommend <em>this</em>.</p>
|
2385
|
-
</description>
|
2386
|
-
<specification exclude="true" type="tabular">
|
2387
|
-
<p id="_">This is the object of the recommendation:</p>
|
2388
|
-
<table id="_">
|
2389
|
-
<tbody>
|
2390
|
-
<tr>
|
2391
|
-
<td style="text-align:left;">Object</td>
|
2392
|
-
<td style="text-align:left;">Value</td>
|
2393
|
-
</tr>
|
2394
|
-
<tr>
|
2395
|
-
<td style="text-align:left;">Mission</td>
|
2396
|
-
<td style="text-align:left;">Accomplished</td>
|
2397
|
-
</tr>
|
2398
|
-
</tbody>
|
2399
|
-
</table>
|
2400
|
-
</specification>
|
2401
|
-
<description>
|
2402
|
-
<p id="_">As for the measurement targets,</p>
|
2403
|
-
</description>
|
2404
|
-
<measurement-target exclude="false">
|
2405
|
-
<p id="_">The measurement target shall be measured as:</p>
|
2406
|
-
<formula id="B">
|
2407
|
-
<stem type="AsciiMath">r/1 = 0</stem>
|
2408
|
-
</formula>
|
2409
|
-
</measurement-target>
|
2410
|
-
<verification exclude="false">
|
2411
|
-
<p id="_">The following code will be run for verification:</p>
|
2412
|
-
<sourcecode id="_">CoreRoot(success): HttpResponse
|
2413
|
-
if (success)
|
2414
|
-
recommendation(label: success-response)
|
2415
|
-
end
|
2416
|
-
</sourcecode>
|
2417
|
-
</verification>
|
2418
|
-
<import exclude="true">
|
2419
|
-
<sourcecode id="_">success-response()</sourcecode>
|
2420
|
-
</import>
|
2421
|
-
</requirement>
|
2422
|
-
</foreword></preface>
|
2423
|
-
</iso-standard>
|
2424
|
-
INPUT
|
2341
|
+
html = <<~OUTPUT
|
2425
2342
|
#{HTML_HDR.gsub(/"en"/, '"fr"')}
|
2426
2343
|
<br/>
|
2427
2344
|
<div>
|
@@ -2454,6 +2371,7 @@ end
|
|
2454
2371
|
<div id='B'><div class='formula'>
|
2455
2372
|
<p>
|
2456
2373
|
<span class='stem'>(#(r/1 = 0)#)</span>
|
2374
|
+
  (1)
|
2457
2375
|
</p>
|
2458
2376
|
</div>
|
2459
2377
|
</div>
|
@@ -2463,14 +2381,12 @@ end
|
|
2463
2381
|
<pre id='_' class='prettyprint '>
|
2464
2382
|
CoreRoot(success): HttpResponse
|
2465
2383
|
<br/>
|
2466
|
-
 
|
2384
|
+
  if (success)
|
2467
2385
|
<br/>
|
2468
|
-
 
|
2469
|
-
success-response)
|
2386
|
+
  recommendation(label: success-response)
|
2470
2387
|
<br/>
|
2471
|
-
 
|
2388
|
+
  end
|
2472
2389
|
<br/>
|
2473
|
-
   
|
2474
2390
|
</pre>
|
2475
2391
|
</div>
|
2476
2392
|
</div>
|
@@ -2480,6 +2396,8 @@ end
|
|
2480
2396
|
</body>
|
2481
2397
|
</html>
|
2482
2398
|
OUTPUT
|
2399
|
+
expect(xmlpp(IsoDoc::PresentationXMLConvert.new({}).convert("test", input, true)).sub(%r{<localized-strings>.*</localized-strings>}m, "")).to be_equivalent_to xmlpp(presxml)
|
2400
|
+
expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
|
2483
2401
|
end
|
2484
2402
|
|
2485
2403
|
it "processes recommendation (Presentation XML)" do
|
@@ -2686,8 +2604,8 @@ end
|
|
2686
2604
|
OUTPUT
|
2687
2605
|
end
|
2688
2606
|
|
2689
|
-
it "processes pseudocode
|
2690
|
-
|
2607
|
+
it "processes pseudocode" do
|
2608
|
+
input = <<~INPUT
|
2691
2609
|
<itu-standard xmlns="http://riboseinc.com/isoxml">
|
2692
2610
|
<bibdata>
|
2693
2611
|
<language>en</language>
|
@@ -2698,65 +2616,22 @@ end
|
|
2698
2616
|
<p id="_"> <em>C</em></p></figure>
|
2699
2617
|
</preface></itu-standard>
|
2700
2618
|
INPUT
|
2701
|
-
|
2702
|
-
|
2703
|
-
|
2704
|
-
|
2705
|
-
|
2706
|
-
|
2707
|
-
|
2708
|
-
</
|
2709
|
-
|
2710
|
-
|
2711
|
-
|
2712
|
-
|
2713
|
-
|
2714
|
-
  
|
2715
|
-
<strong>A</strong>
|
2716
|
-
<br/>
|
2717
|
-
        
|
2718
|
-
<smallcap>B</smallcap>
|
2719
|
-
</p>
|
2720
|
-
<p id='_'>
|
2721
|
-
  
|
2722
|
-
<em>C</em>
|
2723
|
-
</p>
|
2724
|
-
</figure>
|
2725
|
-
</foreword>
|
2726
|
-
</preface>
|
2727
|
-
</itu-standard>
|
2619
|
+
|
2620
|
+
presxml = <<~OUTPUT
|
2621
|
+
<itu-standard xmlns="http://riboseinc.com/isoxml" type="presentation">
|
2622
|
+
<bibdata>
|
2623
|
+
<language current="true">en</language>
|
2624
|
+
</bibdata>
|
2625
|
+
<preface><foreword>
|
2626
|
+
<figure id="_" class="pseudocode" keep-with-next="true" keep-lines-together="true"><name>Figure 1 — Label</name><p id="_">  <strong>A</strong><br/>
|
2627
|
+
        <smallcap>B</smallcap></p>
|
2628
|
+
<p id="_">  <em>C</em></p></figure>
|
2629
|
+
</foreword></preface>
|
2630
|
+
</itu-standard>
|
2631
|
+
|
2728
2632
|
OUTPUT
|
2729
|
-
end
|
2730
2633
|
|
2731
|
-
|
2732
|
-
expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
2733
|
-
<itu-standard xmlns='http://riboseinc.com/isoxml'>
|
2734
|
-
<bibdata>
|
2735
|
-
<language>en</language>
|
2736
|
-
</bibdata>
|
2737
|
-
<local_bibdata>
|
2738
|
-
<language>en</language>
|
2739
|
-
</local_bibdata>
|
2740
|
-
<preface>
|
2741
|
-
<foreword>
|
2742
|
-
<figure id='_' class='pseudocode' keep-with-next='true' keep-lines-together='true'>
|
2743
|
-
<name>Figure 1 — Label</name>
|
2744
|
-
<p id='_'>
|
2745
|
-
  
|
2746
|
-
<strong>A</strong>
|
2747
|
-
<br/>
|
2748
|
-
        
|
2749
|
-
<smallcap>B</smallcap>
|
2750
|
-
</p>
|
2751
|
-
<p id='_'>
|
2752
|
-
  
|
2753
|
-
<em>C</em>
|
2754
|
-
</p>
|
2755
|
-
</figure>
|
2756
|
-
</foreword>
|
2757
|
-
</preface>
|
2758
|
-
</itu-standard>
|
2759
|
-
INPUT
|
2634
|
+
html = <<~OUTPUT
|
2760
2635
|
#{HTML_HDR}
|
2761
2636
|
<br/>
|
2762
2637
|
<div>
|
@@ -2770,38 +2645,11 @@ INPUT
|
|
2770
2645
|
</body>
|
2771
2646
|
</html>
|
2772
2647
|
OUTPUT
|
2773
|
-
end
|
2774
2648
|
|
2775
|
-
it "processes pseudocode (Word)" do
|
2776
2649
|
FileUtils.rm_f "test.doc"
|
2777
|
-
IsoDoc::
|
2778
|
-
|
2779
|
-
|
2780
|
-
<language>en</language>
|
2781
|
-
</bibdata>
|
2782
|
-
<local_bibdata>
|
2783
|
-
<language>en</language>
|
2784
|
-
</local_bibdata>
|
2785
|
-
<preface>
|
2786
|
-
<foreword>
|
2787
|
-
<figure id='_' class='pseudocode' keep-with-next='true' keep-lines-together='true'>
|
2788
|
-
<name>Figure 1 — Label</name>
|
2789
|
-
<p id='_'>
|
2790
|
-
  
|
2791
|
-
<strong>A</strong>
|
2792
|
-
<br/>
|
2793
|
-
        
|
2794
|
-
<smallcap>B</smallcap>
|
2795
|
-
</p>
|
2796
|
-
<p id='_'>
|
2797
|
-
  
|
2798
|
-
<em>C</em>
|
2799
|
-
</p>
|
2800
|
-
</figure>
|
2801
|
-
</foreword>
|
2802
|
-
</preface>
|
2803
|
-
</itu-standard>
|
2804
|
-
INPUT
|
2650
|
+
expect(xmlpp(IsoDoc::PresentationXMLConvert.new({}).convert("test", input, true)).sub(%r{<localized-strings>.*</localized-strings>}m, "")).to be_equivalent_to xmlpp(presxml)
|
2651
|
+
expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
|
2652
|
+
IsoDoc::WordConvert.new({}).convert("test", presxml, false)
|
2805
2653
|
expect(xmlpp( File.read("test.doc").gsub(%r{^.*<h1 class="ForewordTitle">Foreword</h1>}m, "").gsub(%r{</div>.*}m, "</div>"))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
2806
2654
|
<div class="pseudocode" style='page-break-after: avoid;page-break-inside: avoid;'><a name="_" id="_"></a><p class="pseudocode"><a name="_" id="_"></a>  <b>A</b><br/>
|
2807
2655
|
        <span style="font-variant:small-caps;">B</span></p>
|