isodoc 1.5.1 → 1.6.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 +1 -1
- data/.rubocop.yml +6 -2
- data/Gemfile +2 -2
- data/isodoc.gemspec +11 -11
- data/lib/isodoc/base_style/all.css +7 -0
- data/lib/isodoc/base_style/metanorma_word.css +7 -0
- data/lib/isodoc/base_style/metanorma_word.scss +8 -0
- data/lib/isodoc/base_style/reset.css +7 -0
- data/lib/isodoc/base_style/reset.scss +9 -0
- data/lib/isodoc/base_style/scripts.html +187 -0
- data/lib/isodoc/class_utils.rb +6 -5
- data/lib/isodoc/convert.rb +28 -15
- data/lib/isodoc/css.rb +14 -4
- data/lib/isodoc/function/blocks.rb +4 -0
- data/lib/isodoc/function/inline.rb +31 -10
- data/lib/isodoc/function/references.rb +1 -1
- data/lib/isodoc/function/to_word_html.rb +19 -8
- data/lib/isodoc/function/utils.rb +1 -0
- data/lib/isodoc/html_function/postprocess.rb +8 -5
- data/lib/isodoc/pdf_convert.rb +1 -3
- data/lib/isodoc/presentation_function/block.rb +11 -5
- data/lib/isodoc/presentation_function/inline.rb +42 -38
- data/lib/isodoc/presentation_function/section.rb +1 -1
- data/lib/isodoc/presentation_xml_convert.rb +1 -1
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/inline.rb +6 -0
- data/lib/isodoc/word_function/postprocess.rb +16 -6
- data/lib/isodoc/xref.rb +1 -1
- data/lib/isodoc/xref/xref_gen.rb +16 -15
- data/lib/isodoc/xslfo_convert.rb +36 -25
- data/spec/assets/html_override.css +1 -0
- data/spec/assets/word_override.css +1 -0
- data/spec/isodoc/blocks_spec.rb +87 -0
- data/spec/isodoc/footnotes_spec.rb +1 -16
- data/spec/isodoc/inline_spec.rb +38 -1
- data/spec/isodoc/postproc_spec.rb +42 -14
- data/spec/isodoc/presentation_xml_spec.rb +345 -338
- data/spec/isodoc/section_spec.rb +910 -902
- data/spec/isodoc/table_spec.rb +566 -556
- data/spec/isodoc/terms_spec.rb +252 -256
- data/spec/isodoc/xref_spec.rb +2990 -2987
- data/spec/isodoc/xslfo_convert_spec.rb +39 -0
- data/spec/spec_helper.rb +30 -29
- metadata +71 -69
- data/.rubocop.ribose.yml +0 -65
- data/.rubocop.tb.yml +0 -650
data/lib/isodoc/version.rb
CHANGED
@@ -22,6 +22,12 @@ module IsoDoc::WordFunction
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def svg_parse(node, out)
|
26
|
+
svg = Base64.strict_encode64(node.to_xml)
|
27
|
+
r = node.replace("<img src='data:image/svg+xml;base64,#{svg}' mimetype='image/svg+xml'/>").first
|
28
|
+
image_parse(r, out, nil)
|
29
|
+
end
|
30
|
+
|
25
31
|
def imgsrc(node)
|
26
32
|
ret = svg_to_emf(node) and return ret
|
27
33
|
return node["src"] unless %r{^data:}.match node["src"]
|
@@ -37,17 +37,27 @@ xmlns:m="http://schemas.microsoft.com/office/2004/12/omml">
|
|
37
37
|
|
38
38
|
def toWord(result, filename, dir, header)
|
39
39
|
result = from_xhtml(word_cleanup(to_xhtml(result)))
|
40
|
-
|
41
|
-
@wordstylesheet&.open
|
42
|
-
@wordstylesheet&.write(@landscapestyle)
|
43
|
-
@wordstylesheet&.close
|
44
|
-
end
|
40
|
+
@wordstylesheet = wordstylesheet_update
|
45
41
|
Html2Doc.process(result, filename: filename, stylesheet: @wordstylesheet&.path,
|
46
42
|
header_file: header&.path, dir: dir,
|
47
43
|
asciimathdelims: [@openmathdelim, @closemathdelim],
|
48
44
|
liststyles: { ul: @ulstyle, ol: @olstyle })
|
49
45
|
header&.unlink
|
50
|
-
@wordstylesheet&.unlink
|
46
|
+
@wordstylesheet&.unlink if @wordstylesheet&.is_a?(Tempfile)
|
47
|
+
end
|
48
|
+
|
49
|
+
def wordstylesheet_update()
|
50
|
+
return if @wordstylesheet.nil?
|
51
|
+
f = File.open(@wordstylesheet.path, "a")
|
52
|
+
@landscapestyle.empty? or f.write(@landscapestyle)
|
53
|
+
if @wordstylesheet_override && @wordstylesheet
|
54
|
+
f.write(@wordstylesheet_override.read)
|
55
|
+
@wordstylesheet_override.close
|
56
|
+
elsif @wordstylesheet_override && !@wordstylesheet
|
57
|
+
@wordstylesheet = @wordstylesheet_override
|
58
|
+
end
|
59
|
+
f.close
|
60
|
+
@wordstylesheet
|
51
61
|
end
|
52
62
|
|
53
63
|
def word_admonition_images(docxml)
|
data/lib/isodoc/xref.rb
CHANGED
@@ -49,7 +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
|
52
|
+
bookmark_anchor_names(docxml)
|
53
53
|
end
|
54
54
|
|
55
55
|
def ns(xpath)
|
data/lib/isodoc/xref/xref_gen.rb
CHANGED
@@ -94,16 +94,17 @@ module IsoDoc::XrefGen
|
|
94
94
|
"not(self::xmlns:terms) and not(self::xmlns:definitions)]//"\
|
95
95
|
"xmlns:example | ./xmlns:example".freeze
|
96
96
|
|
97
|
-
CHILD_SECTIONS = "./clause | ./appendix | ./terms | ./definitions |
|
97
|
+
CHILD_SECTIONS = "./clause | ./appendix | ./terms | ./definitions | "\
|
98
|
+
"./references"
|
98
99
|
|
99
100
|
def example_anchor_names(sections)
|
100
101
|
sections.each do |s|
|
101
102
|
notes = s.xpath(CHILD_EXAMPLES_XPATH)
|
102
103
|
c = Counter.new
|
103
104
|
notes.each do |n|
|
104
|
-
next if @anchors[n["id"]]
|
105
|
-
|
106
|
-
|
105
|
+
next if @anchors[n["id"]] || n["id"].nil? || n["id"].empty?
|
106
|
+
idx = notes.size == 1 && !n["number"] ? "" :
|
107
|
+
" #{c.increment(n).print}"
|
107
108
|
@anchors[n["id"]] = anchor_struct(idx, n, @labels["example_xref"],
|
108
109
|
"example", n["unnumbered"])
|
109
110
|
end
|
@@ -119,7 +120,8 @@ module IsoDoc::XrefGen
|
|
119
120
|
notes.each do |n|
|
120
121
|
next if n["id"].nil? || n["id"].empty?
|
121
122
|
idx = notes.size == 1 && !n["number"] ? "" : " #{c.increment(n).print}"
|
122
|
-
@anchors[n["id"]] = anchor_struct(idx, n, @labels["list"], "list",
|
123
|
+
@anchors[n["id"]] = anchor_struct(idx, n, @labels["list"], "list",
|
124
|
+
false)
|
123
125
|
list_item_anchor_names(n, @anchors[n["id"]], 1, "", notes.size != 1)
|
124
126
|
end
|
125
127
|
list_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
|
@@ -141,17 +143,16 @@ module IsoDoc::XrefGen
|
|
141
143
|
end
|
142
144
|
end
|
143
145
|
|
144
|
-
def bookmark_anchor_names(
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
next
|
150
|
-
|
151
|
-
type: "bookmark", label: nil, value: nil,
|
152
|
-
xref: @anchors[s["id"]][:xref] }
|
146
|
+
def bookmark_anchor_names(docxml)
|
147
|
+
docxml.xpath(ns(".//bookmark")).each do |n|
|
148
|
+
next if n["id"].nil? || n["id"].empty?
|
149
|
+
parent = nil
|
150
|
+
n.ancestors.each do |a|
|
151
|
+
next unless a["id"] && parent = @anchors.dig(a["id"], :xref)
|
152
|
+
break
|
153
153
|
end
|
154
|
-
|
154
|
+
@anchors[n["id"]] = { type: "bookmark", label: nil, value: nil,
|
155
|
+
xref: parent || "???" }
|
155
156
|
end
|
156
157
|
end
|
157
158
|
end
|
data/lib/isodoc/xslfo_convert.rb
CHANGED
@@ -2,50 +2,61 @@ require "metanorma"
|
|
2
2
|
|
3
3
|
module IsoDoc
|
4
4
|
class XslfoPdfConvert < ::IsoDoc::Convert
|
5
|
+
MN2PDF_OPTIONS = :mn2pdf
|
6
|
+
MN2PDF_FONT_MANIFEST = :font_manifest_file
|
5
7
|
|
6
8
|
def initialize(options)
|
9
|
+
@format = :pdf
|
10
|
+
@suffix = "pdf"
|
7
11
|
super
|
8
|
-
@maxwidth = 500
|
9
|
-
@maxheight = 800
|
10
12
|
end
|
11
13
|
|
12
14
|
def tmpimagedir_suffix
|
13
15
|
"_pdfimages"
|
14
16
|
end
|
15
17
|
|
16
|
-
def
|
17
|
-
@format = :pdf
|
18
|
-
@suffix = "pdf"
|
19
|
-
super
|
20
|
-
end
|
21
|
-
|
22
|
-
def pdf_stylesheet(docxml)
|
18
|
+
def pdf_stylesheet(_docxml)
|
23
19
|
nil
|
24
20
|
end
|
25
21
|
|
26
|
-
def pdf_options(
|
27
|
-
|
22
|
+
def pdf_options(_docxml)
|
23
|
+
if font_manifest_file = @options.dig(MN2PDF_OPTIONS,
|
24
|
+
MN2PDF_FONT_MANIFEST)
|
25
|
+
"--font-manifest #{font_manifest_file}"
|
26
|
+
else
|
27
|
+
""
|
28
|
+
end
|
28
29
|
end
|
29
30
|
|
30
|
-
def convert(input_filename, file = nil, debug = false,
|
31
|
+
def convert(input_filename, file = nil, debug = false,
|
32
|
+
output_filename = nil)
|
31
33
|
file = File.read(input_filename, encoding: "utf-8") if file.nil?
|
32
|
-
docxml, filename
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
input_filename, docxml, filename = input_xml_path(input_filename,
|
35
|
+
file, debug)
|
36
|
+
::Metanorma::Output::XslfoPdf.new.convert(
|
37
|
+
input_filename,
|
38
|
+
output_filename || "#{filename}.#{@suffix}",
|
39
|
+
File.join(@libdir, pdf_stylesheet(docxml)),
|
40
|
+
pdf_options(docxml)
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def xref_parse(node, out)
|
45
|
+
out.a(**{ "href": target_pdf(node) }) { |l| l << get_linkend(node) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def input_xml_path(input_filename, xml_file, debug)
|
49
|
+
docxml, filename, dir = convert_init(xml_file, input_filename, debug)
|
50
|
+
unless /\.xml$/.match?(input_filename)
|
51
|
+
input_filename = Tempfile.open([filename, ".xml"],
|
52
|
+
encoding: "utf-8") do |f|
|
53
|
+
f.write xml_file
|
36
54
|
f.path
|
37
55
|
end
|
56
|
+
end
|
38
57
|
FileUtils.rm_rf dir
|
39
|
-
::Metanorma::Output::XslfoPdf.new.convert(input_filename,
|
40
|
-
output_filename || "#{filename}.#{@suffix}",
|
41
|
-
File.join(@libdir, pdf_stylesheet(docxml)),
|
42
|
-
pdf_options(docxml))
|
43
|
-
end
|
44
58
|
|
45
|
-
|
46
|
-
target = /#/.match(node["target"]) ? node["target"].sub(/#/, ".pdf#") :
|
47
|
-
"##{node["target"]}"
|
48
|
-
out.a(**{ "href": target }) { |l| l << get_linkend(node) }
|
59
|
+
[input_filename, docxml, filename]
|
49
60
|
end
|
50
61
|
end
|
51
62
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
/* html-override */
|
@@ -0,0 +1 @@
|
|
1
|
+
/* word-override */
|
data/spec/isodoc/blocks_spec.rb
CHANGED
@@ -768,6 +768,93 @@ B</pre>
|
|
768
768
|
expect(xmlpp(strip_guid(IsoDoc::WordConvert.new({}).convert("test", presxml, true).gsub(/['"][^'".]+\.(gif|xml)['"]/, "'_.\\1'").gsub(/mso-bookmark:_Ref\d+/, "mso-bookmark:_Ref")))).to be_equivalent_to xmlpp(word)
|
769
769
|
end
|
770
770
|
|
771
|
+
it "processes SVG" do
|
772
|
+
input = <<~INPUT
|
773
|
+
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
774
|
+
<preface><foreword>
|
775
|
+
<figure id="figureA-1">
|
776
|
+
<image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj4KICA8Y2lyY2xlIGZpbGw9IiMwMDkiIHI9IjQ1IiBjeD0iNTAiIGN5PSI1MCIvPgogIDxwYXRoIGQ9Ik0zMywyNkg3OEEzNywzNywwLDAsMSwzMyw4M1Y1N0g1OVY0M0gzM1oiIGZpbGw9IiNGRkYiLz4KPC9zdmc+Cg==" id="_d3731866-1a07-435a-a6c2-1acd41023a4e" mimetype="image/svg+xml" height="auto" width="auto"/>
|
777
|
+
</figure>
|
778
|
+
</foreword></preface>
|
779
|
+
</iso-standard>
|
780
|
+
INPUT
|
781
|
+
|
782
|
+
presxml = <<~OUTPUT
|
783
|
+
<iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
|
784
|
+
<preface>
|
785
|
+
<foreword>
|
786
|
+
<figure id='figureA-1'>
|
787
|
+
<name>Figure 1</name>
|
788
|
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'>
|
789
|
+
<circle fill='#009' r='45' cx='50' cy='50'/>
|
790
|
+
<path d='M33,26H78A37,37,0,0,1,33,83V57H59V43H33Z' fill='#FFF'/>
|
791
|
+
</svg>
|
792
|
+
</figure>
|
793
|
+
</foreword>
|
794
|
+
</preface>
|
795
|
+
</iso-standard>
|
796
|
+
OUTPUT
|
797
|
+
|
798
|
+
html = <<~HTML
|
799
|
+
#{HTML_HDR}
|
800
|
+
<br/>
|
801
|
+
<div>
|
802
|
+
<h1 class='ForewordTitle'>Foreword</h1>
|
803
|
+
<div id='figureA-1' class='figure'>
|
804
|
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'>
|
805
|
+
<circle fill='#009' r='45' cx='50' cy='50'/>
|
806
|
+
<path d='M33,26H78A37,37,0,0,1,33,83V57H59V43H33Z' fill='#FFF'/>
|
807
|
+
</svg>
|
808
|
+
<p class='FigureTitle' style='text-align:center;'>Figure 1</p>
|
809
|
+
</div>
|
810
|
+
</div>
|
811
|
+
<p class='zzSTDTitle1'/>
|
812
|
+
</div>
|
813
|
+
</body>
|
814
|
+
</html>
|
815
|
+
HTML
|
816
|
+
|
817
|
+
doc = <<~DOC
|
818
|
+
<html xmlns:epub='http://www.idpf.org/2007/ops' lang='en'>
|
819
|
+
<head>
|
820
|
+
<style>
|
821
|
+
</style>
|
822
|
+
</head>
|
823
|
+
<body lang='EN-US' link='blue' vlink='#954F72'>
|
824
|
+
<div class='WordSection1'>
|
825
|
+
<p> </p>
|
826
|
+
</div>
|
827
|
+
<p>
|
828
|
+
<br clear='all' class='section'/>
|
829
|
+
</p>
|
830
|
+
<div class='WordSection2'>
|
831
|
+
<p>
|
832
|
+
<br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
|
833
|
+
</p>
|
834
|
+
<div>
|
835
|
+
<h1 class='ForewordTitle'>Foreword</h1>
|
836
|
+
<div id='figureA-1' class='figure'>
|
837
|
+
<img src='_.emf'/>
|
838
|
+
<p class='FigureTitle' style='text-align:center;'>Figure 1</p>
|
839
|
+
</div>
|
840
|
+
</div>
|
841
|
+
<p> </p>
|
842
|
+
</div>
|
843
|
+
<p>
|
844
|
+
<br clear='all' class='section'/>
|
845
|
+
</p>
|
846
|
+
<div class='WordSection3'>
|
847
|
+
<p class='zzSTDTitle1'/>
|
848
|
+
</div>
|
849
|
+
</body>
|
850
|
+
</html>
|
851
|
+
DOC
|
852
|
+
|
853
|
+
expect(xmlpp(IsoDoc::PresentationXMLConvert.new({}).convert("test", input, true).gsub(/\</, "<"))).to be_equivalent_to xmlpp(presxml)
|
854
|
+
expect(xmlpp(strip_guid(IsoDoc::HtmlConvert.new({}).convert("test", presxml, true)))).to be_equivalent_to xmlpp(html)
|
855
|
+
expect(xmlpp(strip_guid(IsoDoc::WordConvert.new({}).convert("test", presxml, true).gsub(/['"][^'".]+(?<!odf1)(?<!odf)\.emf['"]/, "'_.emf'").gsub(/['"][^'".]+\.(gif|xml)['"]/, "'_.\\1'")))).to be_equivalent_to xmlpp(doc)
|
856
|
+
end
|
857
|
+
|
771
858
|
it "converts SVG (Word)" do
|
772
859
|
FileUtils.rm_rf "spec/assets/odf1.emf"
|
773
860
|
expect(xmlpp(strip_guid(IsoDoc::WordConvert.new({}).convert("test", <<~"INPUT", true).gsub(/['"][^'".]+(?<!odf1)(?<!odf)\.emf['"]/, "'_.emf'").gsub(/['"][^'".]+\.(gif|xml)['"]/, "'_.\\1'").gsub(/mso-bookmark:_Ref\d+/, "mso-bookmark:_Ref")))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
@@ -155,17 +155,8 @@ RSpec.describe IsoDoc do
|
|
155
155
|
</preface>
|
156
156
|
</iso-standard>
|
157
157
|
INPUT
|
158
|
-
html = File.read("test.html").sub(/^.*<
|
158
|
+
html = File.read("test.html").sub(/^.*<main/m, "<main").sub(%r{</main>.*$}m, "</main>")
|
159
159
|
expect(xmlpp(html)).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
160
|
-
<body lang="en" xml:lang="en">
|
161
|
-
<div class="title-section">
|
162
|
-
<p> </p>
|
163
|
-
</div>
|
164
|
-
<br />
|
165
|
-
<div class="prefatory-section">
|
166
|
-
<p> </p>
|
167
|
-
</div>
|
168
|
-
<br />
|
169
160
|
<main class="main-section"><button onclick="topFunction()" id="myBtn" title="Go to top">Top</button>
|
170
161
|
<br />
|
171
162
|
<div>
|
@@ -180,12 +171,6 @@ RSpec.describe IsoDoc do
|
|
180
171
|
</div>
|
181
172
|
<p class="zzSTDTitle1"></p>
|
182
173
|
</main>
|
183
|
-
<script type='text/x-mathjax-config'>
|
184
|
-
MathJax.Hub.Config({ "HTML-CSS": { preferredFont: "STIX" }, asciimath2jax:
|
185
|
-
{ delimiters: [['(#(', ')#)']] } });
|
186
|
-
</script>
|
187
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=MML_HTMLorMML-full" async="async"></script>
|
188
|
-
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script></body>
|
189
174
|
OUTPUT
|
190
175
|
end
|
191
176
|
|
data/spec/isodoc/inline_spec.rb
CHANGED
@@ -124,7 +124,10 @@ OUTPUT
|
|
124
124
|
<preface><foreword>
|
125
125
|
<p><index primary="A" secondary="B" tertiary="C"/></p>
|
126
126
|
</foreword></preface>
|
127
|
-
<sections
|
127
|
+
<sections/>
|
128
|
+
<indexsect>
|
129
|
+
<title>Index</title>
|
130
|
+
</indexsect>
|
128
131
|
</iso-standard>
|
129
132
|
INPUT
|
130
133
|
<iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
|
@@ -587,6 +590,8 @@ OUTPUT
|
|
587
590
|
<eref type="inline" bibitemid="ISO712" citeas="ISO 712">A</eref>
|
588
591
|
<eref type="inline" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality></eref>
|
589
592
|
<eref type="inline" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality><locality type="clause"><referenceFrom>1</referenceFrom></locality></eref>
|
593
|
+
<eref type="inline" droploc="true" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality><locality type="clause"><referenceFrom>1</referenceFrom></locality></eref>
|
594
|
+
<eref type="inline" case="lowercase" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality><locality type="clause"><referenceFrom>1</referenceFrom></locality></eref>
|
590
595
|
</p>
|
591
596
|
</foreword></preface>
|
592
597
|
<bibliography><references id="_normative_references" obligation="informative" normative="true"><title>Normative References</title>
|
@@ -623,6 +628,8 @@ OUTPUT
|
|
623
628
|
<eref type="inline" bibitemid="ISO712" citeas="ISO 712">A</eref>
|
624
629
|
<eref type="inline" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality>ISO 712</eref>
|
625
630
|
<eref type="inline" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality><locality type="clause"><referenceFrom>1</referenceFrom></locality>ISO 712, Clause 1</eref>
|
631
|
+
<eref type="inline" droploc="true" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality><locality type="clause"><referenceFrom>1</referenceFrom></locality>ISO 712, 1</eref>
|
632
|
+
<eref type="inline" case="lowercase" bibitemid="ISO712"><locality type="anchor"><referenceFrom>1</referenceFrom></locality><locality type="clause"><referenceFrom>1</referenceFrom></locality>ISO 712, clause 1</eref>
|
626
633
|
</p>
|
627
634
|
</foreword></preface>
|
628
635
|
<bibliography><references id="_normative_references" obligation="informative" normative="true"><title depth='1'>1.<tab/>Normative References</title>
|
@@ -662,6 +669,8 @@ html = <<~OUTPUT
|
|
662
669
|
<a href="#ISO712">A</a>
|
663
670
|
<a href='#ISO712'>ISO 712</a>
|
664
671
|
<a href='#ISO712'>ISO 712, Clause 1</a>
|
672
|
+
<a href='#ISO712'>ISO 712, 1</a>
|
673
|
+
<a href='#ISO712'>ISO 712, clause 1</a>
|
665
674
|
</p>
|
666
675
|
</div>
|
667
676
|
<p class="zzSTDTitle1"/>
|
@@ -1014,4 +1023,32 @@ INPUT
|
|
1014
1023
|
OUTPUT
|
1015
1024
|
end
|
1016
1025
|
|
1026
|
+
it "processes add, del" do
|
1027
|
+
expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", <<~"INPUT", true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
1028
|
+
<itu-standard xmlns="https://www.calconnect.org/standards/itu">
|
1029
|
+
<preface><foreword id="A">
|
1030
|
+
<add>ABC <xref target="A"></add> <del><strong>B</strong></del>
|
1031
|
+
</foreword></preface>
|
1032
|
+
</itu-standard>
|
1033
|
+
INPUT
|
1034
|
+
#{HTML_HDR}
|
1035
|
+
<br/>
|
1036
|
+
<div id='A'>
|
1037
|
+
<h1 class='ForewordTitle'>Foreword</h1>
|
1038
|
+
<span class='addition'>
|
1039
|
+
ABC
|
1040
|
+
<a href='#A'/>
|
1041
|
+
<span class='deletion'>
|
1042
|
+
<b>B</b>
|
1043
|
+
</span>
|
1044
|
+
</span>
|
1045
|
+
</div>
|
1046
|
+
<p class='zzSTDTitle1'/>
|
1047
|
+
</div>
|
1048
|
+
</body>
|
1049
|
+
</html>
|
1050
|
+
OUTPUT
|
1051
|
+
end
|
1052
|
+
|
1053
|
+
|
1017
1054
|
end
|
@@ -27,6 +27,27 @@ RSpec.describe IsoDoc do
|
|
27
27
|
expect(html).to match(/delimiters: \[\['\(#\(', '\)#\)'\]\]/)
|
28
28
|
end
|
29
29
|
|
30
|
+
it "generates file in a remote directory" do
|
31
|
+
FileUtils.rm_f "spec/assets/test.doc"
|
32
|
+
FileUtils.rm_f "spec/assets/test.html"
|
33
|
+
IsoDoc::HtmlConvert.new({wordstylesheet: "word.css", htmlstylesheet: "html.scss", filename: "test"}).convert("spec/assets/test", <<~"INPUT", false)
|
34
|
+
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
35
|
+
<bibdata>
|
36
|
+
<title language="en">test</title>
|
37
|
+
</bibdata>
|
38
|
+
<preface><foreword>
|
39
|
+
<note>
|
40
|
+
<p id="_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f">These results are based on a study carried out on three different types of kernel.</p>
|
41
|
+
</note>
|
42
|
+
</foreword></preface>
|
43
|
+
</iso-standard>
|
44
|
+
INPUT
|
45
|
+
expect(File.exist?("spec/assets/test.html")).to be true
|
46
|
+
html = File.read("spec/assets/test.html")
|
47
|
+
expect(html).to match(%r{<title>test</title>})
|
48
|
+
expect(html).to match(/another empty stylesheet/)
|
49
|
+
end
|
50
|
+
|
30
51
|
it "ignores Liquid markup in the document body" do
|
31
52
|
FileUtils.rm_f "test.doc"
|
32
53
|
FileUtils.rm_f "test.html"
|
@@ -83,6 +104,7 @@ expect(File.exist?("test.doc")).to be true
|
|
83
104
|
expect(html).not_to match(/another empty stylesheet/)
|
84
105
|
expect(html).to match(%r{cdnjs\.cloudflare\.com/ajax/libs/mathjax/})
|
85
106
|
expect(html).to match(/delimiters: \[\['\(#\(', '\)#\)'\]\]/)
|
107
|
+
expect(html).not_to match(/html-override/)
|
86
108
|
end
|
87
109
|
|
88
110
|
it "generates Word output docs with null configuration" do
|
@@ -101,22 +123,25 @@ expect(File.exist?("test.doc")).to be true
|
|
101
123
|
word = File.read("test.doc")
|
102
124
|
expect(word).to match(/one empty stylesheet/)
|
103
125
|
expect(word).to match(/div\.table_container/)
|
126
|
+
expect(word).not_to match(/word-override/)
|
104
127
|
end
|
105
128
|
|
106
129
|
it "generates HTML output docs with null configuration from file" do
|
107
130
|
FileUtils.rm_f "spec/assets/iso.doc"
|
108
131
|
FileUtils.rm_f "spec/assets/iso.html"
|
109
|
-
IsoDoc::HtmlConvert.new({wordstylesheet: "
|
132
|
+
IsoDoc::HtmlConvert.new({wordstylesheet: "word.css", htmlstylesheet: "html.scss"}).convert("spec/assets/iso.xml", nil, false)
|
110
133
|
expect(File.exist?("spec/assets/iso.html")).to be true
|
111
134
|
html = File.read("spec/assets/iso.html")
|
112
135
|
expect(html).to match(/another empty stylesheet/)
|
113
136
|
expect(html).to match(%r{https://use.fontawesome.com})
|
114
137
|
expect(html).to match(%r{libs/jquery})
|
138
|
+
expect(html).to include "$('#toggle')"
|
139
|
+
expect(html).not_to match(/CDATA/)
|
115
140
|
end
|
116
141
|
|
117
142
|
it "generates Headless HTML output docs with null configuration from file" do
|
118
143
|
FileUtils.rm_f "spec/assets/iso.html"
|
119
|
-
IsoDoc::HeadlessHtmlConvert.new({wordstylesheet: "
|
144
|
+
IsoDoc::HeadlessHtmlConvert.new({wordstylesheet: "word.css", htmlstylesheet: "html.scss"}).convert("spec/assets/iso.xml", nil, false)
|
120
145
|
expect(File.exist?("spec/assets/iso.headless.html")).to be true
|
121
146
|
html = File.read("spec/assets/iso.headless.html")
|
122
147
|
expect(html).not_to match(/another empty stylesheet/)
|
@@ -130,7 +155,7 @@ expect(File.exist?("test.doc")).to be true
|
|
130
155
|
|
131
156
|
it "generates Word output docs with null configuration from file" do
|
132
157
|
FileUtils.rm_f "spec/assets/iso.doc"
|
133
|
-
IsoDoc::WordConvert.new({wordstylesheet: "
|
158
|
+
IsoDoc::WordConvert.new({wordstylesheet: "word.css", htmlstylesheet: "html.scss"}).convert("spec/assets/iso.xml", nil, false)
|
134
159
|
expect(File.exist?("spec/assets/iso.doc")).to be true
|
135
160
|
word = File.read("spec/assets/iso.doc")
|
136
161
|
expect(word).to match(/one empty stylesheet/)
|
@@ -139,7 +164,7 @@ expect(File.exist?("test.doc")).to be true
|
|
139
164
|
it "generates HTML output docs with complete configuration" do
|
140
165
|
FileUtils.rm_f "test.doc"
|
141
166
|
FileUtils.rm_f "test.html"
|
142
|
-
IsoDoc::HtmlConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", htmlstylesheet: "spec/assets/html.scss", htmlcoverpage: "spec/assets/htmlcover.html", htmlintropage: "spec/assets/htmlintro.html", scripts: "spec/assets/scripts.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
|
167
|
+
IsoDoc::HtmlConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", htmlstylesheet: "spec/assets/html.scss", htmlstylesheet_override: "spec/assets/html_override.css", htmlcoverpage: "spec/assets/htmlcover.html", htmlintropage: "spec/assets/htmlintro.html", scripts: "spec/assets/scripts.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
|
143
168
|
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
144
169
|
<preface><foreword>
|
145
170
|
<note>
|
@@ -162,6 +187,7 @@ expect(File.exist?("test.doc")).to be true
|
|
162
187
|
expect(html).to match(/This is > a script/)
|
163
188
|
expect(html).not_to match(/CDATA/)
|
164
189
|
expect(html).to match(%r{Antaŭparolo</h1>})
|
190
|
+
expect(html).to match(%r{html-override})
|
165
191
|
end
|
166
192
|
|
167
193
|
it "generates HTML output docs with default fonts" do
|
@@ -195,7 +221,7 @@ expect(File.exist?("test.doc")).to be true
|
|
195
221
|
it "generates Word output docs with complete configuration" do
|
196
222
|
FileUtils.rm_f "test.doc"
|
197
223
|
FileUtils.rm_f "test.html"
|
198
|
-
IsoDoc::WordConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", wordstylesheet: "spec/assets/html.scss", standardstylesheet: "spec/assets/std.css", header: "spec/assets/header.html", wordcoverpage: "spec/assets/wordcover.html", wordintropage: "spec/assets/wordintro.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
|
224
|
+
IsoDoc::WordConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", wordstylesheet: "spec/assets/html.scss", wordstylesheet_override: "spec/assets/word_override.css", standardstylesheet: "spec/assets/std.css", header: "spec/assets/header.html", wordcoverpage: "spec/assets/wordcover.html", wordintropage: "spec/assets/wordintro.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
|
199
225
|
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
200
226
|
<preface><foreword>
|
201
227
|
<note>
|
@@ -214,11 +240,11 @@ expect(File.exist?("test.doc")).to be true
|
|
214
240
|
expect(word).to match(/p\.note \{[^}]*?font-size: 28pt/m)
|
215
241
|
expect(word).to match(/aside \{[^}]*?font-size: 27pt/m)
|
216
242
|
expect(word).to match(/a third empty stylesheet/)
|
217
|
-
|
218
|
-
expect(word).to match(/test_files\/header.html/)
|
243
|
+
expect(word).to match(/Content-Disposition: inline; filename="filelist.xml"/)
|
219
244
|
expect(word).to match(/an empty word cover page/)
|
220
245
|
expect(word).to match(/an empty word intro page/)
|
221
246
|
expect(word).to match(%r{Antaŭparolo</h1>})
|
247
|
+
expect(word).to match(%r{word-override})
|
222
248
|
end
|
223
249
|
|
224
250
|
it "generates Word output docs with default fonts" do
|
@@ -244,7 +270,7 @@ expect(File.exist?("test.doc")).to be true
|
|
244
270
|
expect(word).to match(/aside \{[^}]*?font-size: 9pt/m)
|
245
271
|
expect(word).to match(/a third empty stylesheet/)
|
246
272
|
#expect(word).to match(/<title>test<\/title>/)
|
247
|
-
expect(word).to match(/
|
273
|
+
expect(word).to match(/Content-Disposition: inline; filename="filelist.xml"/)
|
248
274
|
expect(word).to match(/an empty word cover page/)
|
249
275
|
expect(word).to match(/an empty word intro page/)
|
250
276
|
expect(word).to match(%r{Antaŭparolo</h1>})
|
@@ -335,10 +361,12 @@ expect(File.exist?("test.doc")).to be true
|
|
335
361
|
</bibdata>
|
336
362
|
</iso-standard>
|
337
363
|
INPUT
|
338
|
-
word = File.read("test.doc")
|
339
|
-
sub(
|
364
|
+
word = File.read("test.doc")
|
365
|
+
.sub(%r{^.*Content-ID: <header.html>}m, "Content-ID: <header.html>")
|
366
|
+
.sub(/------=_NextPart.*$/m, "")
|
340
367
|
expect(word).to be_equivalent_to <<~"OUTPUT"
|
341
|
-
Content-
|
368
|
+
Content-ID: <header.html>
|
369
|
+
Content-Disposition: inline; filename="header.html"
|
342
370
|
Content-Transfer-Encoding: base64
|
343
371
|
Content-Type: text/html charset="utf-8"
|
344
372
|
Ci8qIGFuIGVtcHR5IGhlYWRlciAqLwoKU1RBUlQgRE9DIElEOiAKICAgICAgICAgICAxMDAwCiAg
|
@@ -352,7 +380,7 @@ ICAgICAgIDogRU5EIERPQyBJRAoKRklMRU5BTUU6IHRlc3QKCg==
|
|
352
380
|
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
353
381
|
<sections>
|
354
382
|
<clause id="A" inline-header="false" obligation="normative"><title>Clause 4</title><clause id="N" inline-header="false" obligation="normative">
|
355
|
-
<title>Introduction<bookmark id="Q"/> to this<fn reference="1">
|
383
|
+
<title>Introduction<bookmark id="Q"/> to this <image src="spec/assets/rice_image1.png" id="_" mimetype="image/png"/> <fn reference="1">
|
356
384
|
<p id="_ff27c067-2785-4551-96cf-0a73530ff1e6">Formerly denoted as 15 % (m/m).</p>
|
357
385
|
</fn></title>
|
358
386
|
</clause>
|
@@ -822,7 +850,7 @@ TOCLEVEL
|
|
822
850
|
it "moves images in HTML, using relative file location" do
|
823
851
|
FileUtils.rm_f "spec/test.html"
|
824
852
|
FileUtils.rm_rf "spec/test_htmlimages"
|
825
|
-
IsoDoc::HtmlConvert.new({wordstylesheet: "
|
853
|
+
IsoDoc::HtmlConvert.new({wordstylesheet: "assets/word.css", htmlstylesheet: "assets/html.scss"}).convert("spec/test", <<~"INPUT", false)
|
826
854
|
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
827
855
|
<preface><foreword>
|
828
856
|
<figure id="_">
|
@@ -891,7 +919,7 @@ TOCLEVEL
|
|
891
919
|
it "encodes images in HTML as data URIs, using relative file location" do
|
892
920
|
FileUtils.rm_f "spec/test.html"
|
893
921
|
FileUtils.rm_rf "spec/test_htmlimages"
|
894
|
-
IsoDoc::HtmlConvert.new({htmlstylesheet: "
|
922
|
+
IsoDoc::HtmlConvert.new({htmlstylesheet: "assets/html.scss", datauriimage: true}).convert("spec/test", <<~"INPUT", false)
|
895
923
|
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
896
924
|
<preface><foreword>
|
897
925
|
<figure id="_">
|