isodoc 2.0.8.2 → 2.1.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/isodoc.gemspec +4 -2
- data/lib/isodoc/convert.rb +1 -1
- data/lib/isodoc/function/blocks.rb +0 -39
- data/lib/isodoc/function/blocks_example_note.rb +36 -1
- data/lib/isodoc/function/inline.rb +4 -0
- data/lib/isodoc/function/references.rb +2 -15
- data/lib/isodoc/function/section.rb +5 -0
- data/lib/isodoc/function/to_word_html.rb +7 -11
- data/lib/isodoc/html_function/postprocess.rb +16 -2
- data/lib/isodoc/metadata.rb +2 -1
- data/lib/isodoc/presentation_function/bibdata.rb +30 -4
- data/lib/isodoc/presentation_function/block.rb +13 -1
- data/lib/isodoc/presentation_function/section.rb +36 -0
- data/lib/isodoc/presentation_xml_convert.rb +7 -2
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/postprocess.rb +3 -4
- data/lib/isodoc/word_function/postprocess_cover.rb +14 -0
- data/lib/isodoc/word_function/table.rb +12 -10
- data/lib/isodoc/xref/xref_anchor.rb +1 -1
- data/lib/isodoc/xref/xref_counter.rb +4 -1
- data/lib/isodoc/xref/xref_gen_seq.rb +3 -3
- data/lib/isodoc/xref/xref_sect_gen.rb +34 -36
- data/lib/isodoc/xref.rb +19 -8
- data/lib/isodoc-yaml/i18n-ar.yaml +9 -0
- data/lib/isodoc-yaml/i18n-de.yaml +13 -0
- data/lib/isodoc-yaml/i18n-en.yaml +5 -0
- data/lib/isodoc-yaml/i18n-es.yaml +11 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +12 -1
- data/lib/isodoc-yaml/i18n-ru.yaml +13 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +5 -0
- data/lib/relaton/render/config.yml +4 -0
- data/lib/relaton/render/general.rb +35 -0
- data/spec/assets/i18n.yaml +6 -0
- data/spec/isodoc/blocks_spec.rb +249 -61
- data/spec/isodoc/i18n_spec.rb +266 -197
- data/spec/isodoc/inline_spec.rb +80 -106
- data/spec/isodoc/metadata_spec.rb +5 -3
- data/spec/isodoc/postproc_spec.rb +539 -397
- data/spec/isodoc/ref_spec.rb +52 -98
- data/spec/isodoc/section_spec.rb +4 -4
- data/spec/isodoc/xref_numbering_spec.rb +31 -0
- metadata +24 -8
@@ -2,14 +2,16 @@ module IsoDoc
|
|
2
2
|
module XrefGen
|
3
3
|
module Sections
|
4
4
|
def back_anchor_names(docxml)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
if @parse_settings.empty? || @parse_settings[:clauses]
|
6
|
+
i = Counter.new("@")
|
7
|
+
docxml.xpath(ns("//annex")).each do |c|
|
8
|
+
annex_names(c, i.increment(c).print)
|
9
|
+
end
|
10
|
+
docxml.xpath(ns(@klass.bibliography_xpath)).each do |b|
|
11
|
+
preface_names(b)
|
12
|
+
end
|
11
13
|
end
|
12
|
-
references(docxml)
|
14
|
+
references(docxml) if @parse_settings.empty? || @parse_settings[:refs]
|
13
15
|
end
|
14
16
|
|
15
17
|
def references(docxml)
|
@@ -19,21 +21,25 @@ module IsoDoc
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def initial_anchor_names(doc)
|
22
|
-
|
23
|
-
|
24
|
+
if @parse_settings.empty? || @parse_settings[:clauses]
|
25
|
+
doc.xpath(ns("//preface/*")).each do |c|
|
26
|
+
c.element? and preface_names(c)
|
27
|
+
end
|
28
|
+
# potentially overridden in middle_section_asset_names()
|
29
|
+
sequential_asset_names(doc.xpath(ns("//preface/*")))
|
30
|
+
n = Counter.new
|
31
|
+
n = section_names(doc.at(ns("//clause[@type = 'scope']")), n, 1)
|
32
|
+
n = section_names(doc.at(ns(@klass.norm_ref_xpath)), n, 1)
|
33
|
+
n = section_names(doc.at(ns("//sections/terms | "\
|
34
|
+
"//sections/clause[descendant::terms]")), n, 1)
|
35
|
+
n = section_names(doc.at(ns("//sections/definitions")), n, 1)
|
36
|
+
clause_names(doc, n)
|
37
|
+
end
|
38
|
+
if @parse_settings.empty?
|
39
|
+
middle_section_asset_names(doc)
|
40
|
+
termnote_anchor_names(doc)
|
41
|
+
termexample_anchor_names(doc)
|
24
42
|
end
|
25
|
-
# potentially overridden in middle_section_asset_names()
|
26
|
-
sequential_asset_names(doc.xpath(ns("//preface/*")))
|
27
|
-
n = Counter.new
|
28
|
-
n = section_names(doc.at(ns("//clause[@type = 'scope']")), n, 1)
|
29
|
-
n = section_names(doc.at(ns(@klass.norm_ref_xpath)), n, 1)
|
30
|
-
n = section_names(doc.at(ns("//sections/terms | "\
|
31
|
-
"//sections/clause[descendant::terms]")), n, 1)
|
32
|
-
n = section_names(doc.at(ns("//sections/definitions")), n, 1)
|
33
|
-
clause_names(doc, n)
|
34
|
-
middle_section_asset_names(doc)
|
35
|
-
termnote_anchor_names(doc)
|
36
|
-
termexample_anchor_names(doc)
|
37
43
|
end
|
38
44
|
|
39
45
|
def preface_clause_name(clause)
|
@@ -112,26 +118,18 @@ module IsoDoc
|
|
112
118
|
l10n("<strong>#{title} #{num}</strong><br/>#{obl}")
|
113
119
|
end
|
114
120
|
|
115
|
-
def single_annex_special_section(clause)
|
116
|
-
a = clause.xpath(ns("./references | ./terms | ./definitions"))
|
117
|
-
a.size == 1 or return nil
|
118
|
-
clause.xpath(ns("./clause | ./p | ./table | ./ol | ./ul | ./dl | "\
|
119
|
-
"./note | ./admonition | ./figure")).empty? or
|
120
|
-
return nil
|
121
|
-
a[0]
|
122
|
-
end
|
123
|
-
|
124
121
|
def annex_name_anchors(clause, num)
|
125
122
|
{ label: annex_name_lbl(clause, num),
|
126
|
-
elem: @labels["annex"],
|
127
|
-
|
123
|
+
elem: @labels["annex"], type: "clause",
|
124
|
+
subtype: "annex", value: num.to_s, level: 1,
|
128
125
|
xref: "#{@labels['annex']} #{num}" }
|
129
126
|
end
|
130
127
|
|
131
128
|
def annex_names(clause, num)
|
132
129
|
@anchors[clause["id"]] = annex_name_anchors(clause, num)
|
133
|
-
if
|
134
|
-
annex_names1(
|
130
|
+
if @klass.single_term_clause?(clause)
|
131
|
+
annex_names1(clause.at(ns("./references | ./terms | ./definitions")),
|
132
|
+
num.to_s, 1)
|
135
133
|
else
|
136
134
|
i = Counter.new
|
137
135
|
clause.xpath(ns(SUBCLAUSES)).each do |c|
|
@@ -143,8 +141,8 @@ module IsoDoc
|
|
143
141
|
|
144
142
|
def annex_names1(clause, num, level)
|
145
143
|
@anchors[clause["id"]] = { xref: "#{@labels['annex']} #{num}",
|
146
|
-
elem: @labels["annex"],
|
147
|
-
label: num, level: level,
|
144
|
+
elem: @labels["annex"], type: "clause",
|
145
|
+
label: num, level: level, subtype: "annex" }
|
148
146
|
i = Counter.new
|
149
147
|
clause.xpath(ns(SUBCLAUSES)).each do |c|
|
150
148
|
annex_names1(c, "#{num}.#{i.increment(c).print}", level + 1)
|
data/lib/isodoc/xref.rb
CHANGED
@@ -24,17 +24,25 @@ module IsoDoc
|
|
24
24
|
@i18n = i18n
|
25
25
|
@labels = @i18n.get
|
26
26
|
@klass.i18n = @i18n
|
27
|
+
@parse_settings = {}
|
27
28
|
end
|
28
29
|
|
29
30
|
def get
|
30
31
|
@anchors
|
31
32
|
end
|
32
33
|
|
34
|
+
# parse only the elements set, if any are set
|
35
|
+
# defined are: clause: true, refs: true
|
36
|
+
def parse_inclusions(options)
|
37
|
+
@parse_settings.merge!(options)
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
33
41
|
def anchor(ident, lbl, warning = true)
|
34
42
|
return nil if ident.nil? || ident.empty?
|
35
43
|
|
36
44
|
if warning && !@anchors[ident]
|
37
|
-
@seen ||=
|
45
|
+
@seen ||= SeenAnchor.instance
|
38
46
|
@seen.seen(ident) or warn "No label has been processed for ID #{ident}"
|
39
47
|
@seen.add(ident)
|
40
48
|
return "[#{ident}]"
|
@@ -44,16 +52,19 @@ module IsoDoc
|
|
44
52
|
|
45
53
|
# extract names for all anchors, xref and label
|
46
54
|
def parse(docxml)
|
47
|
-
amend_preprocess(docxml)
|
55
|
+
amend_preprocess(docxml) if @parse_settings.empty?
|
48
56
|
initial_anchor_names(docxml)
|
49
57
|
back_anchor_names(docxml)
|
50
58
|
# preempt clause notes with all other types of note (ISO default)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
59
|
+
if @parse_settings.empty?
|
60
|
+
note_anchor_names(docxml.xpath(ns("//table | //figure")))
|
61
|
+
note_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
62
|
+
example_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
63
|
+
list_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
64
|
+
deflist_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
65
|
+
bookmark_anchor_names(docxml)
|
66
|
+
end
|
67
|
+
@parse_settings = {}
|
57
68
|
end
|
58
69
|
|
59
70
|
def ns(xpath)
|
@@ -38,6 +38,10 @@ chain_and: "%1 و %2"
|
|
38
38
|
chain_or: "%1 او %2"
|
39
39
|
chain_from: "%1 %من 2"
|
40
40
|
chain_to: "من %1 إلى %2"
|
41
|
+
ordinal_keys: [gender]
|
42
|
+
SpelloutRules:
|
43
|
+
f: spellout-ordinal-feminine
|
44
|
+
m: spellout-ordinal-masculine
|
41
45
|
note: ملاحظة
|
42
46
|
note_xref: ملاحظة
|
43
47
|
termnote: ملاحظة % للقيد
|
@@ -63,6 +67,9 @@ deprecated: مهمل
|
|
63
67
|
source: مصدر
|
64
68
|
and: و
|
65
69
|
all_parts: كل الأجزاء
|
70
|
+
edition_ordinal: "الطبعة %Spellout"
|
71
|
+
edition: الطبعة
|
72
|
+
version: الإصدار
|
66
73
|
toc_figures: جدول الأرقام
|
67
74
|
toc_tables: جدول الجداول
|
68
75
|
toc_recommendations: جدول التوصيات
|
@@ -180,3 +187,5 @@ inflection:
|
|
180
187
|
صفحة:
|
181
188
|
sg: صفحة
|
182
189
|
pl: صفحات
|
190
|
+
الطبعة:
|
191
|
+
gender: f
|
@@ -40,6 +40,14 @@ chain_and: "%1 und %2"
|
|
40
40
|
chain_or: "%1 oder %2"
|
41
41
|
chain_from: "%1 von %2"
|
42
42
|
chain_to: "%1 bis %2"
|
43
|
+
ordinal_keys: [gender,number]
|
44
|
+
SpelloutRules:
|
45
|
+
m.sg: spellout-ordinal-r
|
46
|
+
f.sg: spellout-ordinal
|
47
|
+
n.sg: spellout-ordinal-s
|
48
|
+
m.pl: spellout-ordinal
|
49
|
+
f.pl: spellout-ordinal
|
50
|
+
n.pl: spellout-ordinal
|
43
51
|
note: HINWEIS
|
44
52
|
note_xref: Hinweis
|
45
53
|
termnote: Hinweis % zum Eintrag
|
@@ -65,6 +73,9 @@ deprecated: DEPRECATED
|
|
65
73
|
source: QUELLE
|
66
74
|
and: und
|
67
75
|
all_parts: Alle Teile
|
76
|
+
edition_ordinal: "%Spellout Auflage"
|
77
|
+
edition: Auflage
|
78
|
+
version: Version
|
68
79
|
toc_figures: Abbildungsverzeichnis
|
69
80
|
toc_tables: Tabellenverzeichnis
|
70
81
|
toc_recommendations: Empfehlungenverzeichnis
|
@@ -182,3 +193,5 @@ inflection:
|
|
182
193
|
Seite:
|
183
194
|
sg: Seite
|
184
195
|
pl: Seiten
|
196
|
+
Auflage:
|
197
|
+
gender: f
|
@@ -46,6 +46,8 @@ chain_and: "%1 and %2"
|
|
46
46
|
chain_or: "%1 or %2"
|
47
47
|
chain_from: "%1 from %2"
|
48
48
|
chain_to: "%1 to %2"
|
49
|
+
ordinal_keys: []
|
50
|
+
SpelloutRules: spellout-ordinal
|
49
51
|
note: NOTE
|
50
52
|
note_xref: Note
|
51
53
|
termnote: Note % to entry
|
@@ -71,6 +73,9 @@ deprecated: DEPRECATED
|
|
71
73
|
source: SOURCE
|
72
74
|
and: and
|
73
75
|
all_parts: All Parts
|
76
|
+
edition_ordinal: "%Spellout edition"
|
77
|
+
edition: edition
|
78
|
+
version: version
|
74
79
|
toc_figures: List of figures
|
75
80
|
toc_tables: List of tables
|
76
81
|
toc_recommendations: List of recommendations
|
@@ -42,6 +42,12 @@ chain_and: "%1 y %2"
|
|
42
42
|
chain_or: "%1 o %2"
|
43
43
|
chain_from: "%1 del %2"
|
44
44
|
chain_to: "%1 al %2"
|
45
|
+
ordinal_keys: [gender,number]
|
46
|
+
SpelloutRules:
|
47
|
+
m.sg: spellout-ordinal-masculine
|
48
|
+
f.sg: spellout-ordinal-feminine
|
49
|
+
m.pl: spellout-ordinal-masculine-plural
|
50
|
+
f.pl: spellout-ordinal-feminine-plural
|
45
51
|
note: NOTA
|
46
52
|
note_xref: Nota
|
47
53
|
termnote: Nota % a la entrada
|
@@ -67,6 +73,9 @@ deprecated: OBSOLETO
|
|
67
73
|
source: FUENTE
|
68
74
|
and: y
|
69
75
|
all_parts: Todas las partes
|
76
|
+
edition_ordinal: "%Spellout edición"
|
77
|
+
edition: edición
|
78
|
+
version: versión
|
70
79
|
toc_figures: Table de figuras
|
71
80
|
toc_tables: Tabla de tablas
|
72
81
|
toc_recommendations: Tabla de recomendaciones
|
@@ -184,3 +193,5 @@ inflection:
|
|
184
193
|
Página:
|
185
194
|
sg: Página
|
186
195
|
pl: Páginas
|
196
|
+
edición:
|
197
|
+
gender: f
|
@@ -39,6 +39,12 @@ chain_and: "%1 et %2"
|
|
39
39
|
chain_or: "%1 ou %2"
|
40
40
|
chain_from: "%1 de %2"
|
41
41
|
chain_to: "%1 à %2"
|
42
|
+
ordinal_keys: [gender,number]
|
43
|
+
SpelloutRules:
|
44
|
+
m.sg: spellout-ordinal-masculine
|
45
|
+
f.sg: spellout-ordinal-feminine
|
46
|
+
m.pl: spellout-ordinal-masculine-plural
|
47
|
+
f.pl: spellout-ordinal-feminine-plural
|
42
48
|
note: NOTE
|
43
49
|
note_xref: Note
|
44
50
|
termnote: Note % à l’article
|
@@ -62,8 +68,12 @@ norm_annex: normative
|
|
62
68
|
modified: modifié
|
63
69
|
deprecated: DÉCONSEILLÉ
|
64
70
|
source: SOURCE
|
71
|
+
edition: édition
|
72
|
+
version: version
|
65
73
|
and: et
|
66
74
|
all_parts: toutes les parties
|
75
|
+
edition_ordinal: "%Spellout édition"
|
76
|
+
edition: édition
|
67
77
|
toc_figures: Table des figures
|
68
78
|
toc_tables: Table des tableaux
|
69
79
|
toc_recommendations: Table de recommandations
|
@@ -181,4 +191,5 @@ inflection:
|
|
181
191
|
Page:
|
182
192
|
sg: Page
|
183
193
|
pl: Pages
|
184
|
-
|
194
|
+
édition:
|
195
|
+
gender: f
|
@@ -45,6 +45,14 @@ chain_and: "%1 и %2"
|
|
45
45
|
chain_or: "%1 или %2"
|
46
46
|
chain_from: "%1 от %2"
|
47
47
|
chain_to: "%1 до %2"
|
48
|
+
ordinal_keys: [gender,number]
|
49
|
+
SpelloutRules:
|
50
|
+
m.sg: spellout-ordinal-masculine
|
51
|
+
f.sg: spellout-ordinal-feminine
|
52
|
+
n.sg: spellout-ordinal-neuter
|
53
|
+
m.pl: spellout-ordinal-plural
|
54
|
+
f.pl: spellout-ordinal-plural
|
55
|
+
n.pl: spellout-ordinal-plural
|
48
56
|
note: ПРИМЕЧАНИЕ
|
49
57
|
note_xref: Примечание
|
50
58
|
termnote: Примечание % к определению
|
@@ -70,6 +78,9 @@ deprecated: НЕ РЕКОМЕНДУЕТСЯ
|
|
70
78
|
source: ИСТОЧНИК
|
71
79
|
and: и
|
72
80
|
all_parts: Все части
|
81
|
+
edition_ordinal: "%Spellout издание"
|
82
|
+
edition: издание
|
83
|
+
version: версия
|
73
84
|
toc_figures: Таблица фигур
|
74
85
|
toc_tables: Таблица таблиц
|
75
86
|
toc_recommendations: Таблица рекомендаций
|
@@ -187,3 +198,5 @@ inflection:
|
|
187
198
|
"Стр.":
|
188
199
|
sg: Стр.
|
189
200
|
pl: Стр.
|
201
|
+
издание:
|
202
|
+
gender: n
|
@@ -41,6 +41,8 @@ chain_and: "%1和%2"
|
|
41
41
|
chain_or: "%1或%2"
|
42
42
|
chain_from: "%1从%2"
|
43
43
|
chain_to: "%1到%2"
|
44
|
+
ordinal_keys: []
|
45
|
+
SpelloutRules: spellout-ordinal
|
44
46
|
note: 注
|
45
47
|
note_xref: 注
|
46
48
|
termnote: 注%
|
@@ -66,6 +68,9 @@ deprecated: 被取代
|
|
66
68
|
source: 定义
|
67
69
|
and: 和
|
68
70
|
all_parts: 所有部分
|
71
|
+
edition_ordinal: "第%Spellout版"
|
72
|
+
edition: 版
|
73
|
+
version: 版本
|
69
74
|
toc_figures: 数字列表
|
70
75
|
toc_tables: 表列表
|
71
76
|
toc_recommendations: 建议清单
|
@@ -0,0 +1,4 @@
|
|
1
|
+
template:
|
2
|
+
# skip standardidentifier, it is inserted in front of formattedref within metanorma
|
3
|
+
standard: "{{ creatornames }} ({{ role}}) . <em>{{ title }}</em> . {{ labels['in'] | capitalize }}:_{{ series_title }}. {{ medium | capitalize }}. {{ edition | capitalize_first }}. {{date}}. {{place}} : {%if creatornames == publisher %}{% else %}{{publisher}}{% endif %} . {{size}}. {{ extent }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
|
4
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "relaton-render"
|
2
|
+
|
3
|
+
module Relaton
|
4
|
+
module Render
|
5
|
+
module IsoDoc
|
6
|
+
class General < ::Relaton::Render::General
|
7
|
+
def config_loc
|
8
|
+
YAML.load_file(File.join(File.dirname(__FILE__), "config.yml"))
|
9
|
+
end
|
10
|
+
|
11
|
+
def read_config
|
12
|
+
super.deep_merge(config_loc)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ::Hash
|
20
|
+
def deep_merge(second)
|
21
|
+
merger = proc { |_, v1, v2|
|
22
|
+
if Hash === v1 && Hash === v2
|
23
|
+
v1.merge(v2, &merger)
|
24
|
+
elsif Array === v1 && Array === v2
|
25
|
+
v1 | v2
|
26
|
+
elsif [:undefined, nil,
|
27
|
+
:nil].include?(v2)
|
28
|
+
v1
|
29
|
+
else
|
30
|
+
v2
|
31
|
+
end
|
32
|
+
}
|
33
|
+
merge(second.to_h, &merger)
|
34
|
+
end
|
35
|
+
end
|