metanorma-rsd 1.0.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 +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +17 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.adoc +173 -0
- data/Rakefile +6 -0
- data/asciidoctor-rsd.gemspec.old +46 -0
- data/bin/console +14 -0
- data/bin/rspec +18 -0
- data/bin/setup +8 -0
- data/lib/asciidoctor-rsd.rb +11 -0
- data/lib/asciidoctor/rsd.rb +9 -0
- data/lib/asciidoctor/rsd/biblio.rng +836 -0
- data/lib/asciidoctor/rsd/converter.rb +197 -0
- data/lib/asciidoctor/rsd/isodoc.rng +1059 -0
- data/lib/asciidoctor/rsd/isostandard.rng +1001 -0
- data/lib/asciidoctor/rsd/pdf.js +31 -0
- data/lib/asciidoctor/rsd/rsd.rng +212 -0
- data/lib/asciidoctor/rsd/version.rb +5 -0
- data/lib/isodoc/rsd/html/header.html +184 -0
- data/lib/isodoc/rsd/html/html_rsd_intro.html +8 -0
- data/lib/isodoc/rsd/html/html_rsd_titlepage.html +106 -0
- data/lib/isodoc/rsd/html/htmlstyle.scss +1028 -0
- data/lib/isodoc/rsd/html/logo.svg +1 -0
- data/lib/isodoc/rsd/html/rsd.scss +564 -0
- data/lib/isodoc/rsd/html/scripts.html +82 -0
- data/lib/isodoc/rsd/html/word_rsd_intro.html +72 -0
- data/lib/isodoc/rsd/html/word_rsd_titlepage.html +75 -0
- data/lib/isodoc/rsd/html/wordstyle.scss +1096 -0
- data/lib/isodoc/rsd/html_convert.rb +199 -0
- data/lib/isodoc/rsd/metadata.rb +85 -0
- data/lib/isodoc/rsd/pdf_convert.rb +197 -0
- data/lib/isodoc/rsd/word_convert.rb +157 -0
- data/lib/metanorma/rsd.rb +7 -0
- data/lib/metanorma/rsd/processor.rb +43 -0
- data/metanorma-rsd.gemspec +47 -0
- metadata +310 -0
@@ -0,0 +1,199 @@
|
|
1
|
+
require "isodoc"
|
2
|
+
require_relative "metadata"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
module IsoDoc
|
6
|
+
module Rsd
|
7
|
+
|
8
|
+
# A {Converter} implementation that generates HTML output, and a document
|
9
|
+
# schema encapsulation of the document for validation
|
10
|
+
#
|
11
|
+
class HtmlConvert < IsoDoc::HtmlConvert
|
12
|
+
def initialize(options)
|
13
|
+
@libdir = File.dirname(__FILE__)
|
14
|
+
super
|
15
|
+
#system "cp #{html_doc_path('logo.svg')} logo.svg"
|
16
|
+
FileUtils.cp html_doc_path('logo.svg'), "logo.svg"
|
17
|
+
@files_to_delete << "logo.svg"
|
18
|
+
end
|
19
|
+
|
20
|
+
def default_fonts(options)
|
21
|
+
{
|
22
|
+
bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' : '"Overpass",sans-serif'),
|
23
|
+
headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' : '"Overpass",sans-serif'),
|
24
|
+
monospacefont: '"Space Mono",monospace'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def default_file_locations(_options)
|
29
|
+
{
|
30
|
+
htmlstylesheet: html_doc_path("htmlstyle.scss"),
|
31
|
+
htmlcoverpage: html_doc_path("html_rsd_titlepage.html"),
|
32
|
+
htmlintropage: html_doc_path("html_rsd_intro.html"),
|
33
|
+
scripts: html_doc_path("scripts.html"),
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def metadata_init(lang, script, labels)
|
38
|
+
@meta = Metadata.new(lang, script, labels)
|
39
|
+
end
|
40
|
+
|
41
|
+
def html_head
|
42
|
+
<<~HEAD.freeze
|
43
|
+
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
44
|
+
|
45
|
+
<!--TOC script import-->
|
46
|
+
<script type="text/javascript" src="https://cdn.rawgit.com/jgallen23/toc/0.3.2/dist/toc.min.js"></script>
|
47
|
+
|
48
|
+
<!--Google fonts-->
|
49
|
+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i|Space+Mono:400,700" rel="stylesheet">
|
50
|
+
<link href="https://fonts.googleapis.com/css?family=Overpass:300,300i,600,900" rel="stylesheet">
|
51
|
+
<!--Font awesome import for the link icon-->
|
52
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/solid.css" integrity="sha384-v2Tw72dyUXeU3y4aM2Y0tBJQkGfplr39mxZqlTBDUZAb9BGoC40+rdFCG0m10lXk" crossorigin="anonymous">
|
53
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/fontawesome.css" integrity="sha384-q3jl8XQu1OpdLgGFvNRnPdj5VIlCvgsDQTQB6owSOHWlAurxul7f+JpUOVdAiJ5P" crossorigin="anonymous">
|
54
|
+
<style class="anchorjs"></style>
|
55
|
+
HEAD
|
56
|
+
end
|
57
|
+
|
58
|
+
def make_body(xml, docxml)
|
59
|
+
body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72", "xml:lang": "EN-US", class: "container" }
|
60
|
+
xml.body **body_attr do |body|
|
61
|
+
make_body1(body, docxml)
|
62
|
+
make_body2(body, docxml)
|
63
|
+
make_body3(body, docxml)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def html_toc(docxml)
|
68
|
+
docxml
|
69
|
+
end
|
70
|
+
|
71
|
+
def annex_name(annex, name, div)
|
72
|
+
div.h1 **{ class: "Annex" } do |t|
|
73
|
+
t << "#{get_anchors[annex['id']][:label]} "
|
74
|
+
t << "<b>#{name.text}</b>"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def annex_name_lbl(clause, num)
|
79
|
+
obl = l10n("(#{@inform_annex_lbl})")
|
80
|
+
obl = l10n("(#{@norm_annex_lbl})") if clause["obligation"] == "normative"
|
81
|
+
l10n("<b>#{@annex_lbl} #{num}</b> #{obl}")
|
82
|
+
end
|
83
|
+
|
84
|
+
def pre_parse(node, out)
|
85
|
+
out.pre node.text # content.gsub(/</, "<").gsub(/>/, ">")
|
86
|
+
end
|
87
|
+
|
88
|
+
def term_defs_boilerplate(div, source, term, preface)
|
89
|
+
if source.empty? && term.nil?
|
90
|
+
div << @no_terms_boilerplate
|
91
|
+
else
|
92
|
+
div << term_defs_boilerplate_cont(source, term)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def i18n_init(lang, script)
|
97
|
+
super
|
98
|
+
@annex_lbl = "Appendix"
|
99
|
+
end
|
100
|
+
|
101
|
+
def error_parse(node, out)
|
102
|
+
# catch elements not defined in ISO
|
103
|
+
case node.name
|
104
|
+
when "pre"
|
105
|
+
pre_parse(node, out)
|
106
|
+
when "keyword"
|
107
|
+
out.span node.text, **{ class: "keyword" }
|
108
|
+
else
|
109
|
+
super
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def fileloc(loc)
|
114
|
+
File.join(File.dirname(__FILE__), loc)
|
115
|
+
end
|
116
|
+
|
117
|
+
def cleanup(docxml)
|
118
|
+
super
|
119
|
+
term_cleanup(docxml)
|
120
|
+
end
|
121
|
+
|
122
|
+
def term_cleanup(docxml)
|
123
|
+
docxml.xpath("//p[@class = 'Terms']").each do |d|
|
124
|
+
h2 = d.at("./preceding-sibling::*[@class = 'TermNum'][1]")
|
125
|
+
h2.add_child(" ")
|
126
|
+
h2.add_child(d.remove)
|
127
|
+
end
|
128
|
+
docxml
|
129
|
+
end
|
130
|
+
|
131
|
+
def info(isoxml, out)
|
132
|
+
@meta.security isoxml, out
|
133
|
+
super
|
134
|
+
end
|
135
|
+
|
136
|
+
def annex_name(annex, name, div)
|
137
|
+
div.h1 **{ class: "Annex" } do |t|
|
138
|
+
t << "#{get_anchors[annex['id']][:label]} "
|
139
|
+
t << "<b>#{name.text}</b>"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def annex_name_lbl(clause, num)
|
144
|
+
obl = l10n("(#{@inform_annex_lbl})")
|
145
|
+
obl = l10n("(#{@norm_annex_lbl})") if clause["obligation"] == "normative"
|
146
|
+
l10n("<b>#{@annex_lbl} #{num}</b> #{obl}")
|
147
|
+
end
|
148
|
+
|
149
|
+
def pre_parse(node, out)
|
150
|
+
out.pre node.text # content.gsub(/</, "<").gsub(/>/, ">")
|
151
|
+
end
|
152
|
+
|
153
|
+
def term_defs_boilerplate(div, source, term, preface)
|
154
|
+
if source.empty? && term.nil?
|
155
|
+
div << @no_terms_boilerplate
|
156
|
+
else
|
157
|
+
div << term_defs_boilerplate_cont(source, term)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def i18n_init(lang, script)
|
162
|
+
super
|
163
|
+
@annex_lbl = "Appendix"
|
164
|
+
end
|
165
|
+
|
166
|
+
def error_parse(node, out)
|
167
|
+
# catch elements not defined in ISO
|
168
|
+
case node.name
|
169
|
+
when "pre"
|
170
|
+
pre_parse(node, out)
|
171
|
+
when "keyword"
|
172
|
+
out.span node.text, **{ class: "keyword" }
|
173
|
+
else
|
174
|
+
super
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def fileloc(loc)
|
179
|
+
File.join(File.dirname(__FILE__), loc)
|
180
|
+
end
|
181
|
+
|
182
|
+
def cleanup(docxml)
|
183
|
+
super
|
184
|
+
term_cleanup(docxml)
|
185
|
+
end
|
186
|
+
|
187
|
+
def term_cleanup(docxml)
|
188
|
+
docxml.xpath("//p[@class = 'Terms']").each do |d|
|
189
|
+
h2 = d.at("./preceding-sibling::*[@class = 'TermNum'][1]")
|
190
|
+
h2.add_child(" ")
|
191
|
+
h2.add_child(d.remove)
|
192
|
+
end
|
193
|
+
docxml
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require "isodoc"
|
2
|
+
|
3
|
+
module IsoDoc
|
4
|
+
module Rsd
|
5
|
+
|
6
|
+
class Metadata < IsoDoc::Metadata
|
7
|
+
def initialize(lang, script, labels)
|
8
|
+
super
|
9
|
+
set(:status, "XXX")
|
10
|
+
end
|
11
|
+
|
12
|
+
def title(isoxml, _out)
|
13
|
+
main = isoxml&.at(ns("//title[@language='en']"))&.text
|
14
|
+
set(:doctitle, main)
|
15
|
+
end
|
16
|
+
|
17
|
+
def subtitle(_isoxml, _out)
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def author(isoxml, _out)
|
22
|
+
tc = isoxml.at(ns("//editorialgroup/committee"))
|
23
|
+
set(:tc, tc.text) if tc
|
24
|
+
end
|
25
|
+
|
26
|
+
def docid(isoxml, _out)
|
27
|
+
docnumber = isoxml.at(ns("//bibdata/docidentifier"))
|
28
|
+
docstatus = isoxml.at(ns("//bibdata/status"))
|
29
|
+
dn = docnumber&.text
|
30
|
+
if docstatus
|
31
|
+
set(:status, status_print(docstatus.text))
|
32
|
+
abbr = status_abbr(docstatus.text)
|
33
|
+
dn = "#{dn}(#{abbr})" unless abbr.empty?
|
34
|
+
end
|
35
|
+
set(:docnumber, dn)
|
36
|
+
end
|
37
|
+
|
38
|
+
def status_print(status)
|
39
|
+
status.split(/-/).map{ |w| w.capitalize }.join(" ")
|
40
|
+
end
|
41
|
+
|
42
|
+
def status_abbr(status)
|
43
|
+
case status
|
44
|
+
when "working-draft" then "wd"
|
45
|
+
when "committee-draft" then "cd"
|
46
|
+
when "draft-standard" then "d"
|
47
|
+
else
|
48
|
+
""
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def version(isoxml, _out)
|
53
|
+
super
|
54
|
+
revdate = get[:revdate]
|
55
|
+
set(:revdate_monthyear, monthyr(revdate))
|
56
|
+
end
|
57
|
+
|
58
|
+
MONTHS = {
|
59
|
+
"01": "January",
|
60
|
+
"02": "February",
|
61
|
+
"03": "March",
|
62
|
+
"04": "April",
|
63
|
+
"05": "May",
|
64
|
+
"06": "June",
|
65
|
+
"07": "July",
|
66
|
+
"08": "August",
|
67
|
+
"09": "September",
|
68
|
+
"10": "October",
|
69
|
+
"11": "November",
|
70
|
+
"12": "December",
|
71
|
+
}.freeze
|
72
|
+
|
73
|
+
def monthyr(isodate)
|
74
|
+
m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)/.match isodate
|
75
|
+
return isodate unless m && m[:yr] && m[:mo]
|
76
|
+
return "#{MONTHS[m[:mo].to_sym]} #{m[:yr]}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def security(isoxml, _out)
|
80
|
+
security = isoxml.at(ns("//bibdata/security")) || return
|
81
|
+
set(:security, security.text)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
require "isodoc"
|
2
|
+
require_relative "metadata"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
module IsoDoc
|
6
|
+
module Rsd
|
7
|
+
# A {Converter} implementation that generates PDF HTML output, and a
|
8
|
+
# document schema encapsulation of the document for validation
|
9
|
+
class PdfConvert < IsoDoc::PdfConvert
|
10
|
+
def initialize(options)
|
11
|
+
@libdir = File.dirname(__FILE__)
|
12
|
+
super
|
13
|
+
#system "cp #{html_doc_path('logo.svg')} logo.svg"
|
14
|
+
FileUtils.cp html_doc_path('logo.svg'), "logo.svg"
|
15
|
+
@files_to_delete << "logo.svg"
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_fonts(options)
|
19
|
+
{
|
20
|
+
bodyfont: (options[:script] == "Hans" ? '"SimSun",serif' : '"Overpass",sans-serif'),
|
21
|
+
headerfont: (options[:script] == "Hans" ? '"SimHei",sans-serif' : '"Overpass",sans-serif'),
|
22
|
+
monospacefont: '"Space Mono",monospace'
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def default_file_locations(options)
|
27
|
+
{
|
28
|
+
htmlstylesheet: html_doc_path("htmlstyle.scss"),
|
29
|
+
htmlcoverpage: html_doc_path("html_rsd_titlepage.html"),
|
30
|
+
htmlintropage: html_doc_path("html_rsd_intro.html"),
|
31
|
+
scripts: html_doc_path("scripts.html"),
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def metadata_init(lang, script, labels)
|
36
|
+
@meta = Metadata.new(lang, script, labels)
|
37
|
+
end
|
38
|
+
|
39
|
+
def html_head()
|
40
|
+
<<~HEAD.freeze
|
41
|
+
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
42
|
+
|
43
|
+
<!--TOC script import-->
|
44
|
+
<script type="text/javascript" src="https://cdn.rawgit.com/jgallen23/toc/0.3.2/dist/toc.min.js"></script>
|
45
|
+
|
46
|
+
<!--Google fonts-->
|
47
|
+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i|Space+Mono:400,700" rel="stylesheet">
|
48
|
+
<link href="https://fonts.googleapis.com/css?family=Overpass:300,300i,600,900" rel="stylesheet">
|
49
|
+
<!--Font awesome import for the link icon-->
|
50
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/solid.css" integrity="sha384-v2Tw72dyUXeU3y4aM2Y0tBJQkGfplr39mxZqlTBDUZAb9BGoC40+rdFCG0m10lXk" crossorigin="anonymous">
|
51
|
+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/fontawesome.css" integrity="sha384-q3jl8XQu1OpdLgGFvNRnPdj5VIlCvgsDQTQB6owSOHWlAurxul7f+JpUOVdAiJ5P" crossorigin="anonymous">
|
52
|
+
<style class="anchorjs"></style>
|
53
|
+
HEAD
|
54
|
+
end
|
55
|
+
|
56
|
+
def make_body(xml, docxml)
|
57
|
+
body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72", "xml:lang": "EN-US", class: "container" }
|
58
|
+
xml.body **body_attr do |body|
|
59
|
+
make_body1(body, docxml)
|
60
|
+
make_body2(body, docxml)
|
61
|
+
make_body3(body, docxml)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def html_toc(docxml)
|
66
|
+
docxml
|
67
|
+
end
|
68
|
+
|
69
|
+
def annex_name(annex, name, div)
|
70
|
+
div.h1 **{ class: "Annex" } do |t|
|
71
|
+
t << "#{get_anchors[annex['id']][:label]} "
|
72
|
+
t << "<b>#{name.text}</b>"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def annex_name_lbl(clause, num)
|
77
|
+
obl = l10n("(#{@inform_annex_lbl})")
|
78
|
+
obl = l10n("(#{@norm_annex_lbl})") if clause["obligation"] == "normative"
|
79
|
+
l10n("<b>#{@annex_lbl} #{num}</b> #{obl}")
|
80
|
+
end
|
81
|
+
|
82
|
+
def pre_parse(node, out)
|
83
|
+
out.pre node.text # content.gsub(/</, "<").gsub(/>/, ">")
|
84
|
+
end
|
85
|
+
|
86
|
+
def term_defs_boilerplate(div, source, term, preface)
|
87
|
+
if source.empty? && term.nil?
|
88
|
+
div << @no_terms_boilerplate
|
89
|
+
else
|
90
|
+
div << term_defs_boilerplate_cont(source, term)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def i18n_init(lang, script)
|
95
|
+
super
|
96
|
+
@annex_lbl = "Appendix"
|
97
|
+
end
|
98
|
+
|
99
|
+
def error_parse(node, out)
|
100
|
+
# catch elements not defined in ISO
|
101
|
+
case node.name
|
102
|
+
when "pre"
|
103
|
+
pre_parse(node, out)
|
104
|
+
when "keyword"
|
105
|
+
out.span node.text, **{ class: "keyword" }
|
106
|
+
else
|
107
|
+
super
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def fileloc(loc)
|
112
|
+
File.join(File.dirname(__FILE__), loc)
|
113
|
+
end
|
114
|
+
|
115
|
+
def cleanup(docxml)
|
116
|
+
super
|
117
|
+
term_cleanup(docxml)
|
118
|
+
end
|
119
|
+
|
120
|
+
def term_cleanup(docxml)
|
121
|
+
docxml.xpath("//p[@class = 'Terms']").each do |d|
|
122
|
+
h2 = d.at("./preceding-sibling::*[@class = 'TermNum'][1]")
|
123
|
+
h2.add_child(" ")
|
124
|
+
h2.add_child(d.remove)
|
125
|
+
end
|
126
|
+
docxml
|
127
|
+
end
|
128
|
+
|
129
|
+
def info(isoxml, out)
|
130
|
+
@meta.security isoxml, out
|
131
|
+
super
|
132
|
+
end
|
133
|
+
|
134
|
+
def annex_name(annex, name, div)
|
135
|
+
div.h1 **{ class: "Annex" } do |t|
|
136
|
+
t << "#{get_anchors[annex['id']][:label]} "
|
137
|
+
t << "<b>#{name.text}</b>"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def annex_name_lbl(clause, num)
|
142
|
+
obl = l10n("(#{@inform_annex_lbl})")
|
143
|
+
obl = l10n("(#{@norm_annex_lbl})") if clause["obligation"] == "normative"
|
144
|
+
l10n("<b>#{@annex_lbl} #{num}</b> #{obl}")
|
145
|
+
end
|
146
|
+
|
147
|
+
def pre_parse(node, out)
|
148
|
+
out.pre node.text # content.gsub(/</, "<").gsub(/>/, ">")
|
149
|
+
end
|
150
|
+
|
151
|
+
def term_defs_boilerplate(div, source, term, preface)
|
152
|
+
if source.empty? && term.nil?
|
153
|
+
div << @no_terms_boilerplate
|
154
|
+
else
|
155
|
+
div << term_defs_boilerplate_cont(source, term)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def i18n_init(lang, script)
|
160
|
+
super
|
161
|
+
@annex_lbl = "Appendix"
|
162
|
+
end
|
163
|
+
|
164
|
+
def error_parse(node, out)
|
165
|
+
# catch elements not defined in ISO
|
166
|
+
case node.name
|
167
|
+
when "pre"
|
168
|
+
pre_parse(node, out)
|
169
|
+
when "keyword"
|
170
|
+
out.span node.text, **{ class: "keyword" }
|
171
|
+
else
|
172
|
+
super
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def fileloc(loc)
|
177
|
+
File.join(File.dirname(__FILE__), loc)
|
178
|
+
end
|
179
|
+
|
180
|
+
def cleanup(docxml)
|
181
|
+
super
|
182
|
+
term_cleanup(docxml)
|
183
|
+
end
|
184
|
+
|
185
|
+
def term_cleanup(docxml)
|
186
|
+
docxml.xpath("//p[@class = 'Terms']").each do |d|
|
187
|
+
h2 = d.at("./preceding-sibling::*[@class = 'TermNum'][1]")
|
188
|
+
h2.add_child(" ")
|
189
|
+
h2.add_child(d.remove)
|
190
|
+
end
|
191
|
+
docxml
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|