isodoc 2.0.3 → 2.0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/isodoc/convert.rb +36 -18
- data/lib/isodoc/function/inline.rb +24 -13
- data/lib/isodoc/function/references.rb +1 -1
- data/lib/isodoc/i18n.rb +20 -7
- data/lib/isodoc/metadata_contributor.rb +1 -1
- data/lib/isodoc/presentation_function/bibdata.rb +26 -9
- data/lib/isodoc/presentation_function/image.rb +3 -4
- data/lib/isodoc/presentation_function/inline.rb +119 -76
- data/lib/isodoc/presentation_function/math.rb +1 -0
- data/lib/isodoc/presentation_function/xrefs.rb +100 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +11 -1
- data/lib/isodoc/word_function/postprocess.rb +4 -6
- data/lib/isodoc/word_function/postprocess_cover.rb +82 -1
- data/lib/isodoc/xref/xref_anchor.rb +1 -0
- data/lib/isodoc/xref/xref_gen.rb +2 -1
- data/lib/isodoc/xref/xref_sect_gen.rb +14 -8
- data/lib/isodoc/xslfo_convert.rb +19 -19
- data/lib/isodoc-yaml/i18n-ar.yaml +11 -0
- data/lib/isodoc-yaml/i18n-de.yaml +11 -0
- data/lib/isodoc-yaml/i18n-en.yaml +11 -0
- data/lib/isodoc-yaml/i18n-es.yaml +11 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +11 -0
- data/lib/isodoc-yaml/i18n-ru.yaml +11 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +11 -0
- data/spec/isodoc/blocks_spec.rb +13 -77
- data/spec/isodoc/inline_spec.rb +564 -22
- data/spec/isodoc/metadata_spec.rb +1 -1
- data/spec/isodoc/postproc_spec.rb +466 -2
- data/spec/isodoc/presentation_xml_spec.rb +139 -0
- data/spec/isodoc/ref_spec.rb +7 -7
- data/spec/isodoc/section_spec.rb +1 -2
- data/spec/isodoc/terms_spec.rb +8 -8
- data/spec/isodoc/xref_spec.rb +60 -1188
- data/spec/isodoc/xslfo_convert_spec.rb +12 -7
- metadata +3 -2
@@ -233,11 +233,21 @@ module IsoDoc
|
|
233
233
|
end
|
234
234
|
|
235
235
|
def suffix_url(url)
|
236
|
-
return url if %r{^https?://}.match?(url)
|
236
|
+
return url if url.nil? || %r{^https?://}.match?(url)
|
237
237
|
return url unless File.extname(url).empty?
|
238
238
|
|
239
239
|
url.sub(/#{File.extname(url)}$/, ".doc")
|
240
240
|
end
|
241
|
+
|
242
|
+
def info(isoxml, out)
|
243
|
+
@tocfigurestitle =
|
244
|
+
isoxml&.at(ns("//misc-container/toc[@type = 'figure']/title"))&.text
|
245
|
+
@toctablestitle =
|
246
|
+
isoxml&.at(ns("//misc-container/toc[@type = 'table']/title"))&.text
|
247
|
+
@tocrecommendationstitle = isoxml
|
248
|
+
&.at(ns("//misc-container/toc[@type = 'recommendation']/title"))&.text
|
249
|
+
super
|
250
|
+
end
|
241
251
|
end
|
242
252
|
end
|
243
253
|
end
|
@@ -165,9 +165,7 @@ module IsoDoc
|
|
165
165
|
xpath.each do |list|
|
166
166
|
(list.xpath(".//li") - list.xpath(".//ol//li | .//ul//li")).each do |l|
|
167
167
|
l.xpath("./p | ./div | ./table").each_with_index do |p, i|
|
168
|
-
|
169
|
-
|
170
|
-
p.wrap(%{<div class="ListContLevel#{lvl}"/>})
|
168
|
+
i.zero? or p.wrap(%{<div class="ListContLevel#{lvl}"/>})
|
171
169
|
end
|
172
170
|
list_add(l.xpath(".//ul") - l.xpath(".//ul//ul | .//ol//ul"),
|
173
171
|
lvl + 1)
|
@@ -212,10 +210,10 @@ module IsoDoc
|
|
212
210
|
def word_remove_pb_before_annex(docxml)
|
213
211
|
docxml.xpath("//div[p/br]").each do |d|
|
214
212
|
/^WordSection\d+_\d+$/.match(d["class"]) or next
|
215
|
-
d.elements[0].name == "p" && !d.elements[0].elements.empty? or next
|
216
|
-
d.elements[0].elements[0].name == "br" &&
|
213
|
+
(d.elements[0].name == "p" && !d.elements[0].elements.empty?) or next
|
214
|
+
(d.elements[0].elements[0].name == "br" &&
|
217
215
|
d.elements[0].elements[0]["style"] ==
|
218
|
-
"mso-special-character:line-break;page-break-before:always" or next
|
216
|
+
"mso-special-character:line-break;page-break-before:always") or next
|
219
217
|
d.elements[0].remove
|
220
218
|
end
|
221
219
|
end
|
@@ -24,7 +24,12 @@ module IsoDoc
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def insert_toc(intro, docxml, level)
|
27
|
-
|
27
|
+
toc = ""
|
28
|
+
toc += make_WordToC(docxml, level)
|
29
|
+
toc += make_TableWordToC(docxml)
|
30
|
+
toc += make_FigureWordToC(docxml)
|
31
|
+
toc += make_RecommendationWordToC(docxml)
|
32
|
+
intro.sub(/WORDTOC/, toc)
|
28
33
|
end
|
29
34
|
|
30
35
|
def word_toc_entry(toclevel, heading)
|
@@ -77,6 +82,82 @@ module IsoDoc
|
|
77
82
|
%{\\1#{word_toc_preface(level)}}) + WORD_TOC_SUFFIX1
|
78
83
|
end
|
79
84
|
|
85
|
+
WORD_TOC_RECOMMENDATION_PREFACE1 = <<~TOC.freeze
|
86
|
+
<span lang="EN-GB"><span
|
87
|
+
style='mso-element:field-begin'></span><span
|
88
|
+
style='mso-spacerun:yes'> </span>TOC
|
89
|
+
\\h \\z \\t "RecommendationTitle,RecommendationTestTitle,recommendationtitle,recommendationtesttitle"
|
90
|
+
<span style='mso-element:field-separator'></span></span>
|
91
|
+
TOC
|
92
|
+
|
93
|
+
WORD_TOC_TABLE_PREFACE1 = <<~TOC.freeze
|
94
|
+
<span lang="EN-GB"><span
|
95
|
+
style='mso-element:field-begin'></span><span
|
96
|
+
style='mso-spacerun:yes'> </span>TOC
|
97
|
+
\\h \\z \\t "TableTitle,tabletitle" <span
|
98
|
+
style='mso-element:field-separator'></span></span>
|
99
|
+
TOC
|
100
|
+
|
101
|
+
WORD_TOC_FIGURE_PREFACE1 = <<~TOC.freeze
|
102
|
+
<span lang="EN-GB"><span
|
103
|
+
style='mso-element:field-begin'></span><span
|
104
|
+
style='mso-spacerun:yes'> </span>TOC
|
105
|
+
\\h \\z \\t "FigureTitle,figuretitle" <span
|
106
|
+
style='mso-element:field-separator'></span></span>
|
107
|
+
TOC
|
108
|
+
|
109
|
+
def make_TableWordToC(docxml)
|
110
|
+
(docxml.at("//p[@class = 'TableTitle']") && @toctablestitle) or
|
111
|
+
return ""
|
112
|
+
toc = %{<p class="TOCTitle">#{@toctablestitle}</p>}
|
113
|
+
docxml.xpath("//p[@class = 'TableTitle']").each do |h|
|
114
|
+
toc += word_toc_entry(1, header_strip(h))
|
115
|
+
end
|
116
|
+
toc.sub(/(<p class="MsoToc1">)/,
|
117
|
+
%{\\1#{WORD_TOC_TABLE_PREFACE1}}) + WORD_TOC_SUFFIX1
|
118
|
+
end
|
119
|
+
|
120
|
+
def make_FigureWordToC(docxml)
|
121
|
+
(docxml.at("//p[@class = 'FigureTitle']") && @tocfigurestitle) or
|
122
|
+
return ""
|
123
|
+
toc = %{<p class="TOCTitle">#{@tocfigurestitle}</p>}
|
124
|
+
docxml.xpath("//p[@class = 'FigureTitle']").each do |h|
|
125
|
+
toc += word_toc_entry(1, header_strip(h))
|
126
|
+
end
|
127
|
+
toc.sub(/(<p class="MsoToc1">)/,
|
128
|
+
%{\\1#{WORD_TOC_FIGURE_PREFACE1}}) + WORD_TOC_SUFFIX1
|
129
|
+
end
|
130
|
+
|
131
|
+
def make_RecommendationWordToC(docxml)
|
132
|
+
(docxml.at("//p[@class = 'RecommendationTitle']") &&
|
133
|
+
@tocrecommendationstitle) or return ""
|
134
|
+
toc = %{<p class="TOCTitle">#{@tocrecommendationstitle}</p>}
|
135
|
+
docxml.xpath("//p[@class = 'RecommendationTitle' or @class = 'RecommendationTestTitle']").sort_by do |h|
|
136
|
+
recommmendation_sort_key(h.text)
|
137
|
+
end.each do |h|
|
138
|
+
toc += word_toc_entry(1, header_strip(h))
|
139
|
+
end
|
140
|
+
toc.sub(/(<p class="MsoToc1">)/,
|
141
|
+
%{\\1#{WORD_TOC_RECOMMENDATION_PREFACE1}}) + WORD_TOC_SUFFIX1
|
142
|
+
end
|
143
|
+
|
144
|
+
def recommmendation_sort_key(header)
|
145
|
+
m = /^([^0-9]+) (\d+)/.match(header) || /^([^:]+)/.match(header)
|
146
|
+
m ||= [header, nil]
|
147
|
+
ret = "#{recommmendation_sort_key1(m[1])}::"
|
148
|
+
m[2] and ret += ("%04d" % m[2].to_i).to_s
|
149
|
+
ret
|
150
|
+
end
|
151
|
+
|
152
|
+
def recommmendation_sort_key1(type)
|
153
|
+
case type&.downcase
|
154
|
+
when "requirement" then "04"
|
155
|
+
when "recommendation" then "05"
|
156
|
+
when "permission" then "06"
|
157
|
+
else type
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
80
161
|
def authority_cleanup1(docxml, klass)
|
81
162
|
dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
|
82
163
|
auth = docxml.at("//div[@id = 'boilerplate-#{klass}' "\
|
data/lib/isodoc/xref/xref_gen.rb
CHANGED
@@ -48,7 +48,8 @@ module IsoDoc
|
|
48
48
|
t.xpath(ns("./termnote")).reject { |n| blank?(n["id"]) }.each do |n|
|
49
49
|
c.increment(n)
|
50
50
|
@anchors[n["id"]] =
|
51
|
-
{ label: termnote_label(c.print), type: "termnote",
|
51
|
+
{ label: termnote_label(c.print), type: "termnote",
|
52
|
+
value: c.print, elem: @labels["termnote"],
|
52
53
|
xref: l10n("#{anchor(t['id'], :xref)}, "\
|
53
54
|
"#{@labels['note_xref']} #{c.print}") }
|
54
55
|
end
|
@@ -49,7 +49,7 @@ module IsoDoc
|
|
49
49
|
|
50
50
|
@anchors[clause["id"]] =
|
51
51
|
{ label: nil, level: 1, xref: preface_clause_name(clause),
|
52
|
-
type: "clause" }
|
52
|
+
type: "clause", elem: @labels["clause"] }
|
53
53
|
clause.xpath(ns(SUBCLAUSES)).each_with_index do |c, i|
|
54
54
|
preface_names1(c, c.at(ns("./title"))&.text,
|
55
55
|
"#{preface_clause_name(clause)}, #{i + 1}", 2)
|
@@ -58,8 +58,8 @@ module IsoDoc
|
|
58
58
|
|
59
59
|
def preface_names1(clause, title, parent_title, level)
|
60
60
|
label = title || parent_title
|
61
|
-
@anchors[clause["id"]] =
|
62
|
-
|
61
|
+
@anchors[clause["id"]] = { label: nil, level: level, xref: label,
|
62
|
+
type: "clause", elem: @labels["clause"] }
|
63
63
|
clause.xpath(ns(SUBCLAUSES)).each_with_index do |c, i|
|
64
64
|
preface_names1(c, c.at(ns("./title"))&.text, "#{label} #{i + 1}",
|
65
65
|
level + 1)
|
@@ -86,7 +86,7 @@ module IsoDoc
|
|
86
86
|
num.increment(clause)
|
87
87
|
@anchors[clause["id"]] =
|
88
88
|
{ label: num.print, xref: l10n("#{@labels['clause']} #{num.print}"),
|
89
|
-
level: lvl, type: "clause" }
|
89
|
+
level: lvl, type: "clause", elem: @labels["clause"] }
|
90
90
|
i = Counter.new
|
91
91
|
clause.xpath(ns(SUBCLAUSES)).each do |c|
|
92
92
|
section_names1(c, "#{num.print}.#{i.increment(c).print}", lvl + 1)
|
@@ -97,7 +97,7 @@ module IsoDoc
|
|
97
97
|
def section_names1(clause, num, level)
|
98
98
|
@anchors[clause["id"]] =
|
99
99
|
{ label: num, level: level, xref: l10n("#{@labels['clause']} #{num}"),
|
100
|
-
type: "clause" }
|
100
|
+
type: "clause", elem: @labels["clause"] }
|
101
101
|
i = Counter.new
|
102
102
|
clause.xpath(ns(SUBCLAUSES)).each do |c|
|
103
103
|
section_names1(c, "#{num}.#{i.increment(c).print}", level + 1)
|
@@ -121,10 +121,15 @@ module IsoDoc
|
|
121
121
|
a[0]
|
122
122
|
end
|
123
123
|
|
124
|
+
def annex_name_anchors(clause, num)
|
125
|
+
{ label: annex_name_lbl(clause, num),
|
126
|
+
elem: @labels["annex"],
|
127
|
+
type: "clause", value: num.to_s, level: 1,
|
128
|
+
xref: "#{@labels['annex']} #{num}" }
|
129
|
+
end
|
130
|
+
|
124
131
|
def annex_names(clause, num)
|
125
|
-
@anchors[clause["id"]] =
|
126
|
-
type: "clause", value: num.to_s, level: 1,
|
127
|
-
xref: "#{@labels['annex']} #{num}" }
|
132
|
+
@anchors[clause["id"]] = annex_name_anchors(clause, num)
|
128
133
|
if a = single_annex_special_section(clause)
|
129
134
|
annex_names1(a, num.to_s, 1)
|
130
135
|
else
|
@@ -138,6 +143,7 @@ module IsoDoc
|
|
138
143
|
|
139
144
|
def annex_names1(clause, num, level)
|
140
145
|
@anchors[clause["id"]] = { xref: "#{@labels['annex']} #{num}",
|
146
|
+
elem: @labels["annex"],
|
141
147
|
label: num, level: level, type: "clause" }
|
142
148
|
i = Counter.new
|
143
149
|
clause.xpath(ns(SUBCLAUSES)).each do |c|
|
data/lib/isodoc/xslfo_convert.rb
CHANGED
@@ -2,8 +2,21 @@ require "metanorma"
|
|
2
2
|
|
3
3
|
module IsoDoc
|
4
4
|
class XslfoPdfConvert < ::IsoDoc::Convert
|
5
|
-
MN2PDF_OPTIONS = :mn2pdf
|
5
|
+
# MN2PDF_OPTIONS = :mn2pdf
|
6
6
|
MN2PDF_FONT_MANIFEST = :font_manifest
|
7
|
+
MN2PDF_OPTIONS = { pdfencryptionlength: "--encryption-length",
|
8
|
+
pdfownerpassword: "--owner-password",
|
9
|
+
pdfuserpassword: "--user-password",
|
10
|
+
pdfallowprint: "--allow-print",
|
11
|
+
pdfallowcopycontent: "--allow-copy-content",
|
12
|
+
pdfalloweditcontent: "--allow-edit-content",
|
13
|
+
pdfalloweditannotations: "--allow-edit-annotations",
|
14
|
+
pdfallowfillinforms: "--allow-fill-in-forms",
|
15
|
+
pdfallowaccesscontent: "--allow-access-content",
|
16
|
+
pdfallowassembledocument: "--allow-assemble-document",
|
17
|
+
pdfallowprinthq: "--allow-print-hq",
|
18
|
+
pdfencryptmetadata: "--encrypt-metadata" }.freeze
|
19
|
+
MN2PDF_DEFAULT_ARGS = { "--syntax-highlight": nil }.freeze
|
7
20
|
|
8
21
|
def initialize(options)
|
9
22
|
@format = :pdf
|
@@ -13,22 +26,10 @@ module IsoDoc
|
|
13
26
|
end
|
14
27
|
|
15
28
|
def extract_cmd_options(options)
|
16
|
-
ret =
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
a = options[:pdfallowprint] and ret["--allow-print"] = a
|
21
|
-
a = options[:pdfallowcopycontent] and ret["--allow-copy-content"] = a
|
22
|
-
a = options[:pdfalloweditcontent] and ret["--allow-edit-content"] = a
|
23
|
-
a = options[:pdfalloweditannotations] and
|
24
|
-
ret["--allow-edit-annotations"] = a
|
25
|
-
a = options[:pdfallowfillinforms] and ret["--allow-fill-in-forms"] = a
|
26
|
-
a = options[:pdfallowaccesscontent] and
|
27
|
-
ret["--allow-access-content"] = a
|
28
|
-
a = options[:pdfallowassembledocument] and
|
29
|
-
ret["--allow-assemble-document"] = a
|
30
|
-
a = options[:pdfallowprinthq] and ret["--allow-print-hq"] = a
|
31
|
-
a = options[:pdfencryptmetadata] and ret["--encrypt-metadata"] = a
|
29
|
+
ret = MN2PDF_DEFAULT_ARGS.dup
|
30
|
+
MN2PDF_OPTIONS.each do |key, opt|
|
31
|
+
value = options[key] and ret[opt] = value
|
32
|
+
end
|
32
33
|
ret
|
33
34
|
end
|
34
35
|
|
@@ -42,8 +43,7 @@ module IsoDoc
|
|
42
43
|
|
43
44
|
def pdf_options(_docxml)
|
44
45
|
ret = {}
|
45
|
-
font_manifest = @options
|
46
|
-
MN2PDF_FONT_MANIFEST) and
|
46
|
+
font_manifest = @options[MN2PDF_FONT_MANIFEST] and
|
47
47
|
ret[MN2PDF_FONT_MANIFEST] = font_manifest
|
48
48
|
@aligncrosselements && !@aligncrosselements.empty? and
|
49
49
|
ret["--param align-cross-elements="] =
|
@@ -30,6 +30,14 @@ external_terms_boilerplate: |
|
|
30
30
|
internal_external_terms_boilerplate: |
|
31
31
|
<p>لأغراض هذه الوثيقة ،تنطبق المصطلحات والتعاريف الواردة في % وما يلي.</p>
|
32
32
|
term_defined_in: "[المصطلح المحدد في %]"
|
33
|
+
binary_and: "%1 و %2"
|
34
|
+
multiple_and: "%1, و %2"
|
35
|
+
binary_or: "%1 او %2"
|
36
|
+
multiple_or: "%1, او %2"
|
37
|
+
chain_and: "%1 و %2"
|
38
|
+
chain_or: "%1 او %2"
|
39
|
+
chain_from: "%1 %من 2"
|
40
|
+
chain_to: "من %1 إلى %2"
|
33
41
|
note: ملاحظة
|
34
42
|
note_xref: ملاحظة
|
35
43
|
termnote: ملاحظة % للقيد
|
@@ -55,6 +63,9 @@ deprecated: مهمل
|
|
55
63
|
source: مصدر
|
56
64
|
and: و
|
57
65
|
all_parts: كل الأجزاء
|
66
|
+
toc_figures: جدول الأرقام
|
67
|
+
toc_tables: جدول الجداول
|
68
|
+
toc_recommendations: جدول التوصيات
|
58
69
|
month_january: يناير
|
59
70
|
month_february: فبراير
|
60
71
|
month_march: مارس
|
@@ -32,6 +32,14 @@ external_terms_boilerplate: |
|
|
32
32
|
internal_external_terms_boilerplate: |
|
33
33
|
<p>Für die Zwecke dieses Dokuments gelten die in % und im Folgenden aufgeführten Begriffe und Definitionen.</p>
|
34
34
|
term_defined_in: "[Begriff definiert in %]"
|
35
|
+
binary_and: "%1 und %2"
|
36
|
+
multiple_and: "%1, und %2"
|
37
|
+
binary_or: "%1 oder %2"
|
38
|
+
multiple_or: "%1, oder %2"
|
39
|
+
chain_and: "%1 und %2"
|
40
|
+
chain_or: "%1 oder %2"
|
41
|
+
chain_from: "%1 von %2"
|
42
|
+
chain_to: "%1 bis %2"
|
35
43
|
note: HINWEIS
|
36
44
|
note_xref: Hinweis
|
37
45
|
termnote: Hinweis % zum Eintrag
|
@@ -57,6 +65,9 @@ deprecated: DEPRECATED
|
|
57
65
|
source: QUELLE
|
58
66
|
and: und
|
59
67
|
all_parts: Alle Teile
|
68
|
+
toc_figures: Abbildungsverzeichnis
|
69
|
+
toc_tables: Tabellenverzeichnis
|
70
|
+
toc_recommendations: Empfehlungenverzeichnis
|
60
71
|
month_january: Januar
|
61
72
|
month_february: Februar
|
62
73
|
month_march: März
|
@@ -38,6 +38,14 @@ internal_external_terms_boilerplate: |
|
|
38
38
|
<p>For the purposes of this document, the terms and definitions
|
39
39
|
given in % and the following apply.</p>
|
40
40
|
term_defined_in: "[term defined in %]"
|
41
|
+
binary_and: "%1 and %2"
|
42
|
+
multiple_and: "%1, and %2"
|
43
|
+
binary_or: "%1 or %2"
|
44
|
+
multiple_or: "%1, or %2"
|
45
|
+
chain_and: "%1 and %2"
|
46
|
+
chain_or: "%1 or %2"
|
47
|
+
chain_from: "%1 from %2"
|
48
|
+
chain_to: "%1 to %2"
|
41
49
|
note: NOTE
|
42
50
|
note_xref: Note
|
43
51
|
termnote: Note % to entry
|
@@ -63,6 +71,9 @@ deprecated: DEPRECATED
|
|
63
71
|
source: SOURCE
|
64
72
|
and: and
|
65
73
|
all_parts: All Parts
|
74
|
+
toc_figures: List of figures
|
75
|
+
toc_tables: List of tables
|
76
|
+
toc_recommendations: List of recommendations
|
66
77
|
month_january: January
|
67
78
|
month_february: February
|
68
79
|
month_march: March
|
@@ -34,6 +34,14 @@ external_terms_boilerplate: |
|
|
34
34
|
internal_external_terms_boilerplate: |
|
35
35
|
<p>Para los propósitos de este documento, se aplican los términos y definiciones dados en % y los siguientes.</p>
|
36
36
|
term_defined_in: "[término definido en %]"
|
37
|
+
binary_and: "%1 y %2"
|
38
|
+
multiple_and: "%1, y %2"
|
39
|
+
binary_or: "%1 o %2"
|
40
|
+
multiple_or: "%1, o %2"
|
41
|
+
chain_and: "%1 y %2"
|
42
|
+
chain_or: "%1 o %2"
|
43
|
+
chain_from: "%1 del %2"
|
44
|
+
chain_to: "%1 al %2"
|
37
45
|
note: NOTA
|
38
46
|
note_xref: Nota
|
39
47
|
termnote: Nota % a la entrada
|
@@ -59,6 +67,9 @@ deprecated: OBSOLETO
|
|
59
67
|
source: FUENTE
|
60
68
|
and: y
|
61
69
|
all_parts: Todas las partes
|
70
|
+
toc_figures: Table de figuras
|
71
|
+
toc_tables: Tabla de tablas
|
72
|
+
toc_recommendations: Tabla de recomendaciones
|
62
73
|
month_january: Enero
|
63
74
|
month_february: Febrero
|
64
75
|
month_march: Marzo
|
@@ -31,6 +31,14 @@ external_terms_boilerplate: |
|
|
31
31
|
internal_external_terms_boilerplate: |
|
32
32
|
<p>Pour les besoins du présent document, les termes et définitions de % ainsi que les suivants, s’appliquent.</p>
|
33
33
|
term_defined_in: "[terme défini dans %]"
|
34
|
+
binary_and: "%1 et %2"
|
35
|
+
multiple_and: "%1, et %2"
|
36
|
+
binary_or: "%1 ou %2"
|
37
|
+
multiple_or: "%1, ou %2"
|
38
|
+
chain_and: "%1 et %2"
|
39
|
+
chain_or: "%1 ou %2"
|
40
|
+
chain_from: "%1 de %2"
|
41
|
+
chain_to: "%1 à %2"
|
34
42
|
note: NOTE
|
35
43
|
note_xref: Note
|
36
44
|
termnote: Note % à l’article
|
@@ -56,6 +64,9 @@ deprecated: DÉCONSEILLÉ
|
|
56
64
|
source: SOURCE
|
57
65
|
and: et
|
58
66
|
all_parts: toutes les parties
|
67
|
+
toc_figures: Table des figures
|
68
|
+
toc_tables: Table des tableaux
|
69
|
+
toc_recommendations: Table de recommandations
|
59
70
|
month_january: Janvier
|
60
71
|
month_february: Février
|
61
72
|
month_march: Mars
|
@@ -37,6 +37,14 @@ internal_external_terms_boilerplate: |
|
|
37
37
|
<p>Для целей этого документа применяются
|
38
38
|
термины и определения, данные в % и следующие.</p>
|
39
39
|
term_defined_in: "[термин, определенный в %]"
|
40
|
+
binary_and: "%1 и %2"
|
41
|
+
multiple_and: "%1, и %2"
|
42
|
+
binary_or: "%1 или %2"
|
43
|
+
multiple_or: "%1, или %2"
|
44
|
+
chain_and: "%1 и %2"
|
45
|
+
chain_or: "%1 или %2"
|
46
|
+
chain_from: "%1 от %2"
|
47
|
+
chain_to: "%1 до %2"
|
40
48
|
note: ПРИМЕЧАНИЕ
|
41
49
|
note_xref: Примечание
|
42
50
|
termnote: Примечание % к определению
|
@@ -62,6 +70,9 @@ deprecated: НЕ РЕКОМЕНДУЕТСЯ
|
|
62
70
|
source: ИСТОЧНИК
|
63
71
|
and: и
|
64
72
|
all_parts: Все части
|
73
|
+
toc_figures: Таблица фигур
|
74
|
+
toc_tables: Таблица таблиц
|
75
|
+
toc_recommendations: Таблица рекомендаций
|
65
76
|
month_january: Январь
|
66
77
|
month_february: Февраль
|
67
78
|
month_march: Март
|
@@ -33,6 +33,14 @@ external_terms_boilerplate: |
|
|
33
33
|
internal_external_terms_boilerplate: |
|
34
34
|
<p>% 界定的以及下列术语和定义适用于本文件。</p>
|
35
35
|
term_defined_in: "〖术语于%中定义〗"
|
36
|
+
binary_and: "%1和%2"
|
37
|
+
multiple_and: "%1和%2"
|
38
|
+
binary_or: "%1或%2"
|
39
|
+
multiple_or: "%1或%2"
|
40
|
+
chain_and: "%1和%2"
|
41
|
+
chain_or: "%1或%2"
|
42
|
+
chain_from: "%1从%2"
|
43
|
+
chain_to: "%1到%2"
|
36
44
|
note: 注
|
37
45
|
note_xref: 注
|
38
46
|
termnote: 注%
|
@@ -58,6 +66,9 @@ deprecated: 被取代
|
|
58
66
|
source: 定义
|
59
67
|
and: 和
|
60
68
|
all_parts: 所有部分
|
69
|
+
toc_figures: 数字列表
|
70
|
+
toc_tables: 表列表
|
71
|
+
toc_recommendations: 建议清单
|
61
72
|
month_january: 一月
|
62
73
|
month_february: 二月
|
63
74
|
month_march: 三月
|
data/spec/isodoc/blocks_spec.rb
CHANGED
@@ -925,87 +925,23 @@ RSpec.describe IsoDoc do
|
|
925
925
|
.to receive(:inkscape_installed?)
|
926
926
|
|
927
927
|
input = <<~INPUT
|
928
|
-
|
929
|
-
<preface><foreword>
|
930
|
-
<figure id="figureA-1">
|
931
|
-
<image src="spec/assets/odf.svg" mimetype="image/svg+xml"/>
|
932
|
-
<image src="spec/assets/odf1.svg" mimetype="image/svg+xml"/>
|
933
|
-
<image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj4KICA8Y2lyY2xlIGZpbGw9IiMwMDkiIHI9IjQ1IiBjeD0iNTAiIGN5PSI1MCIvPgogIDxwYXRoIGQ9Ik0zMywyNkg3OEEzNywzNywwLDAsMSwzMyw4M1Y1N0g1OVY0M0gzM1oiIGZpbGw9IiNGRkYiLz4KPC9zdmc+Cg==" id="_d3731866-1a07-435a-a6c2-1acd41023a4e" mimetype="image/svg+xml" height="auto" width="auto"/>
|
934
|
-
</figure>
|
935
|
-
</foreword></preface>
|
936
|
-
</iso-standard>
|
937
|
-
INPUT
|
938
|
-
presxml = <<~OUTPUT
|
939
|
-
<iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
|
928
|
+
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
940
929
|
<preface>
|
941
|
-
<foreword
|
942
|
-
<figure id=
|
943
|
-
<
|
944
|
-
<image src=
|
945
|
-
|
946
|
-
</image>
|
947
|
-
<image src='spec/assets/odf1.svg' mimetype='image/svg+xml'/>
|
948
|
-
<image src='' id='_d3731866-1a07-435a-a6c2-1acd41023a4e' mimetype='image/svg+xml' height='auto' width='auto'>
|
949
|
-
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'>
|
950
|
-
<circle fill='#009' r='45' cx='50' cy='50'/>
|
951
|
-
<path d='M33,26H78A37,37,0,0,1,33,83V57H59V43H33Z' fill='#FFF'/>
|
952
|
-
</svg>
|
953
|
-
</image>
|
930
|
+
<foreword>
|
931
|
+
<figure id="figureA-1">
|
932
|
+
<image src="spec/assets/odf.svg" mimetype="image/svg+xml"/>
|
933
|
+
<image src="spec/assets/odf1.svg" mimetype="image/svg+xml"/>
|
934
|
+
<image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj4KICA8Y2lyY2xlIGZpbGw9IiMwMDkiIHI9IjQ1IiBjeD0iNTAiIGN5PSI1MCIvPgogIDxwYXRoIGQ9Ik0zMywyNkg3OEEzNywzNywwLDAsMSwzMyw4M1Y1N0g1OVY0M0gzM1oiIGZpbGw9IiNGRkYiLz4KPC9zdmc+Cg==" id="_d3731866-1a07-435a-a6c2-1acd41023a4e" mimetype="image/svg+xml" height="auto" width="auto"/>
|
954
935
|
</figure>
|
955
936
|
</foreword>
|
956
937
|
</preface>
|
957
938
|
</iso-standard>
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
</head>
|
965
|
-
<body lang='EN-US' link='blue' vlink='#954F72'>
|
966
|
-
<div class='WordSection1'>
|
967
|
-
<p> </p>
|
968
|
-
</div>
|
969
|
-
<p>
|
970
|
-
<br clear='all' class='section'/>
|
971
|
-
</p>
|
972
|
-
<div class='WordSection2'>
|
973
|
-
<p>
|
974
|
-
<br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
|
975
|
-
</p>
|
976
|
-
<div>
|
977
|
-
<h1 class='ForewordTitle'>Foreword</h1>
|
978
|
-
<div id='figureA-1' class='figure'>
|
979
|
-
<img src='spec/assets/odf.emf'/>
|
980
|
-
<img src='spec/assets/odf1.svg'/>
|
981
|
-
<img src='' height='auto' width='auto'/>
|
982
|
-
<p class='FigureTitle' style='text-align:center;'>Figure 1</p>
|
983
|
-
</div>
|
984
|
-
</div>
|
985
|
-
<p> </p>
|
986
|
-
</div>
|
987
|
-
<p>
|
988
|
-
<br clear='all' class='section'/>
|
989
|
-
</p>
|
990
|
-
<div class='WordSection3'>
|
991
|
-
<p class='zzSTDTitle1'/>
|
992
|
-
</div>
|
993
|
-
</body>
|
994
|
-
</html>
|
995
|
-
OUTPUT
|
996
|
-
expect(xmlpp(IsoDoc::PresentationXMLConvert.new({})
|
997
|
-
.convert("test", input, true)
|
998
|
-
.gsub(/</, "<")
|
999
|
-
.gsub(%r{data:application/x-msmetafile[^"']+},
|
1000
|
-
"data:application/x-msmetafile")))
|
1001
|
-
.to be_equivalent_to xmlpp(presxml
|
1002
|
-
.gsub(%r{data:application/x-msmetafile[^"']+},
|
1003
|
-
"data:application/x-msmetafile"))
|
1004
|
-
expect(xmlpp(strip_guid(IsoDoc::WordConvert.new({})
|
1005
|
-
.convert("test", presxml, true)
|
1006
|
-
.gsub(/['"][^'".]+(?<!odf1)(?<!odf)\.svg['"]/, "'_.svg'")
|
1007
|
-
.gsub(/mso-bookmark:_Ref\d+/, "mso-bookmark:_Ref"))))
|
1008
|
-
.to be_equivalent_to xmlpp(output)
|
939
|
+
INPUT
|
940
|
+
expect do
|
941
|
+
IsoDoc::PresentationXMLConvert.new({})
|
942
|
+
.convert("test", input, true)
|
943
|
+
end.to raise_error("Inkscape missing in PATH, unable" \
|
944
|
+
"to convert EMF to SVG. Aborting.")
|
1009
945
|
end
|
1010
946
|
end
|
1011
947
|
|
@@ -1593,7 +1529,7 @@ RSpec.describe IsoDoc do
|
|
1593
1529
|
|
1594
1530
|
|
1595
1531
|
<p id="_d4fd0a61-f300-4285-abe6-602707590e53">This International Standard gives the minimum specifications for rice (<i>Oryza sativa</i> L.) which is subject to international trade. It is applicable to the following types: husked rice and milled rice, parboiled or not, intended for direct human consumption. It is neither applicable to other products derived from rice, nor to waxy rice (glutinous rice).</p>
|
1596
|
-
<p class="QuoteAttribution">— ISO,
|
1532
|
+
<p class="QuoteAttribution">— ISO, ISO 7301:2011, Clause 1</p></div>
|
1597
1533
|
</div>
|
1598
1534
|
<p class="zzSTDTitle1"/>
|
1599
1535
|
</div>
|