isodoc 1.5.1 → 1.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 +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="_">
|