metanorma-bipm 0.0.3 → 1.0.2
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 +29 -8
- data/README.adoc +7 -138
- data/lib/asciidoctor/bipm/basicdoc.rng +50 -3
- data/lib/asciidoctor/bipm/bipm.rng +15 -3
- data/lib/asciidoctor/bipm/boilerplate-en.xml +2 -3
- data/lib/asciidoctor/bipm/boilerplate-fr.xml +3 -4
- data/lib/asciidoctor/bipm/converter.rb +49 -11
- data/lib/asciidoctor/bipm/isodoc.rng +61 -3
- data/lib/isodoc/bipm/base_convert.rb +58 -3
- data/lib/isodoc/bipm/bipm.brochure.xsl +2129 -657
- data/lib/isodoc/bipm/bipm.guide.xsl +7826 -0
- data/lib/isodoc/bipm/bipm.mise-en-pratique.xsl +7826 -0
- data/lib/isodoc/bipm/bipm.rapport.xsl +7826 -0
- data/lib/isodoc/bipm/html/html_bipm_titlepage.html +18 -3
- data/lib/isodoc/bipm/html/htmlstyle.css +50 -60
- data/lib/isodoc/bipm/html/htmlstyle.scss +52 -76
- data/lib/isodoc/bipm/html_convert.rb +17 -0
- data/lib/isodoc/bipm/i18n-en.yaml +8 -0
- data/lib/isodoc/bipm/i18n-fr.yaml +21 -4
- data/lib/isodoc/bipm/index.rb +136 -0
- data/lib/isodoc/bipm/metadata.rb +20 -8
- data/lib/isodoc/bipm/pdf_convert.rb +13 -2
- data/lib/isodoc/bipm/presentation_xml_convert.rb +20 -6
- data/lib/isodoc/bipm/xref.rb +34 -17
- data/lib/metanorma/bipm.rb +7 -0
- data/lib/metanorma/bipm/processor.rb +11 -0
- data/lib/metanorma/bipm/version.rb +1 -1
- data/metanorma-bipm.gemspec +1 -2
- data/metanorma.yml +9 -3
- metadata +8 -18
@@ -28,11 +28,17 @@
|
|
28
28
|
</div>
|
29
29
|
|
30
30
|
<div class="coverpage-title">
|
31
|
-
{% if appendixtitle %}
|
31
|
+
{% if appendixtitle or parttitle or subparttitle %}
|
32
32
|
<span class="title-third">{{ doctitle }}</span>
|
33
33
|
<span class="title-third">{{ docsubtitle }}</span><br/>
|
34
|
-
<span class="title-first">{
|
35
|
-
<span class="title-second">{
|
34
|
+
{% if partid %}<span class="title-first">{{ partid}}: {{ parttitle }}</span><br/>{% endif %}
|
35
|
+
{% if partid_alt %}<span class="title-second">{{ partid_alt}}: {{ partsubtitle }}</span>{% endif %}
|
36
|
+
{% if subparttitle %}<span class="title-first">{{ subparttitle }}</span><br/>{% endif %}
|
37
|
+
{% if subpartsubtitle %}<span class="title-second">{{ subpartsubtitle }}</span><br/>{% endif %}
|
38
|
+
{% if appendixid %}<span class="title-first">{{ appendixid}}: {{ appendixtitle }}</span><br/>{% endif %}
|
39
|
+
{% if appendixid_alt %}<span class="title-second">{{ appendixid_alt}}: {{ appendixsubtitle }}</span>{% endif %}
|
40
|
+
{% if annexid %}<span class="title-first">{{ annexid}}: {{ annextitle }}</span><br/>{% endif %}
|
41
|
+
{% if annexid_alt %}<span class="title-second">{{ annexid_alt}}: {{ annexsubtitle }}</span>{% endif %}
|
36
42
|
{% else %}
|
37
43
|
<span class="title-first">{{ doctitle }}</span><br/>
|
38
44
|
<span class="title-second">{{ docsubtitle }}</span>
|
@@ -61,6 +67,15 @@
|
|
61
67
|
<div class="coverpage-tc-name">
|
62
68
|
<span>{{ metadata_extensions["editorialgroup"]["committee_acronym"] }}{% if metadata_extensions["editorialgroup"]["committee_acronym"] and committee %}: {% endif %}{{ committee }}</span>
|
63
69
|
</div>
|
70
|
+
|
71
|
+
{% if authors %}
|
72
|
+
<div class="coverpage-tc-name">
|
73
|
+
{% for item in authors %}
|
74
|
+
<span>{{item}} {% if authors_affiliations[forloop.index0] %}({{ authors_affiliations[forloop.index0] }}){% endif %}{% if forloop.last == false %}, {% endif %}{% endfor %}.
|
75
|
+
</div>
|
76
|
+
{% endif %}
|
77
|
+
|
78
|
+
|
64
79
|
</div>
|
65
80
|
|
66
81
|
<div class="wrapper-top-bottom"></div>
|
@@ -213,7 +213,7 @@ body {
|
|
213
213
|
margin-left: auto;
|
214
214
|
margin-right: auto;
|
215
215
|
max-width: 100%;
|
216
|
-
font-size:
|
216
|
+
font-size: {{normalfontsize}};
|
217
217
|
font-weight: 300;
|
218
218
|
line-height: 1.4em;
|
219
219
|
color: #1d1d1d;
|
@@ -450,31 +450,6 @@ p.document-stage {
|
|
450
450
|
font-weight: 300;
|
451
451
|
height: 160px; }
|
452
452
|
|
453
|
-
#proposal-band p {
|
454
|
-
height: 150px; }
|
455
|
-
|
456
|
-
#standard-band,
|
457
|
-
#published-band {
|
458
|
-
background-color: #007864; }
|
459
|
-
|
460
|
-
#standard,
|
461
|
-
#published {
|
462
|
-
border-bottom: solid 3px #007864; }
|
463
|
-
|
464
|
-
#governance,
|
465
|
-
#policy-and-procedures {
|
466
|
-
border-bottom: solid 3px #750697; }
|
467
|
-
|
468
|
-
#governance-band,
|
469
|
-
#policy-and-procedures-band {
|
470
|
-
background-color: #750697; }
|
471
|
-
|
472
|
-
#guide {
|
473
|
-
border-bottom: solid 3px #48a0e7; }
|
474
|
-
|
475
|
-
#guide-band {
|
476
|
-
background-color: #48a0e7; }
|
477
|
-
|
478
453
|
.coverpage-maturity {
|
479
454
|
font-family: {{bodyfont}};
|
480
455
|
font-weight: 400;
|
@@ -482,38 +457,6 @@ p.document-stage {
|
|
482
457
|
margin: 0 0 2em 0;
|
483
458
|
text-transform: uppercase; }
|
484
459
|
|
485
|
-
#working-draft,
|
486
|
-
#proposal {
|
487
|
-
border-bottom: solid 3px #F7803C; }
|
488
|
-
|
489
|
-
#working-draft-band,
|
490
|
-
#proposal-band {
|
491
|
-
background-color: #F7803C; }
|
492
|
-
|
493
|
-
#committee-draft {
|
494
|
-
border-bottom: solid 3px #fd06fd; }
|
495
|
-
|
496
|
-
#committee-draft-band {
|
497
|
-
background-color: #fd06fd; }
|
498
|
-
|
499
|
-
#draft-standard {
|
500
|
-
border-bottom: solid 3px #fdf906; }
|
501
|
-
|
502
|
-
#draft-standard-band {
|
503
|
-
background-color: #fdf906; }
|
504
|
-
|
505
|
-
#standard {
|
506
|
-
border-bottom: solid 3px #007864; }
|
507
|
-
|
508
|
-
#standard-band {
|
509
|
-
background-color: #007864; }
|
510
|
-
|
511
|
-
#obsolete {
|
512
|
-
border-bottom: solid 3px #7e0d13; }
|
513
|
-
|
514
|
-
#obsolete-band {
|
515
|
-
background-color: #7e0d13; }
|
516
|
-
|
517
460
|
/*
|
518
461
|
3. TYPOGRAPHY
|
519
462
|
*/
|
@@ -612,6 +555,53 @@ ul li:first-child {
|
|
612
555
|
content: " ";
|
613
556
|
display: none; }
|
614
557
|
|
558
|
+
/* https://github.com/metanorma/metanorma-bipm/issues/47 */
|
559
|
+
ol[class="alphabet"] {
|
560
|
+
counter-reset: alphabet; }
|
561
|
+
|
562
|
+
ol[class="roman"] {
|
563
|
+
counter-reset: roman; }
|
564
|
+
|
565
|
+
ol[class="alphabet"] ol[class="alphabet"] {
|
566
|
+
counter-reset: none; }
|
567
|
+
|
568
|
+
ol[class="alphabet"] > li {
|
569
|
+
list-style: none;
|
570
|
+
position: relative; }
|
571
|
+
|
572
|
+
ol[class="alphabet"] ol[class="alphabet"] > li {
|
573
|
+
list-style: inherit; }
|
574
|
+
|
575
|
+
ol[class="alphabet"] > li:before {
|
576
|
+
counter-increment: alphabet;
|
577
|
+
content: counter(alphabet, lower-alpha) ") ";
|
578
|
+
position: absolute;
|
579
|
+
left: -1.4em; }
|
580
|
+
|
581
|
+
ol[class="alphabet"] ol[class="alphabet"] > li:before {
|
582
|
+
counter-increment: none;
|
583
|
+
content: initial; }
|
584
|
+
|
585
|
+
ol[class="roman"] ol[class="roman"] {
|
586
|
+
counter-reset: none; }
|
587
|
+
|
588
|
+
ol[class="roman"] > li {
|
589
|
+
list-style: none;
|
590
|
+
position: relative; }
|
591
|
+
|
592
|
+
ol[class="roman"] ol[class="roman"] > li {
|
593
|
+
list-style: inherit; }
|
594
|
+
|
595
|
+
ol[class="roman"] > li:before {
|
596
|
+
counter-increment: roman;
|
597
|
+
content: "(" counter(roman, lower-roman) ") ";
|
598
|
+
position: absolute;
|
599
|
+
left: -2.0em; }
|
600
|
+
|
601
|
+
ol[class="roman"] ol[class="roman"] > li:before {
|
602
|
+
counter-increment: none;
|
603
|
+
content: initial; }
|
604
|
+
|
615
605
|
/*
|
616
606
|
3.4 Rules
|
617
607
|
*/
|
@@ -635,7 +625,7 @@ p.Biblio, p.NormRef {
|
|
635
625
|
pre,
|
636
626
|
.pseudocode {
|
637
627
|
background-color: #f7f7f7;
|
638
|
-
font-size:
|
628
|
+
font-size: {{monospacefontsize}};
|
639
629
|
line-height: 1.6em;
|
640
630
|
padding: 1.5em;
|
641
631
|
margin: 2em 0 1em 0;
|
@@ -731,7 +721,7 @@ a.footnote-number {
|
|
731
721
|
font-size: 0.8em; }
|
732
722
|
|
733
723
|
.footnote {
|
734
|
-
font-size:
|
724
|
+
font-size: {{footnotefontsize}}; }
|
735
725
|
|
736
726
|
/*
|
737
727
|
3.11 Blockquotes
|
@@ -36,7 +36,7 @@ $docstage-colors-list: (
|
|
36
36
|
*/
|
37
37
|
|
38
38
|
body {
|
39
|
-
@include bodyStyle1(
|
39
|
+
@include bodyStyle1($normalfontsize, 1.4em, #1d1d1d, #ffffff, 300);
|
40
40
|
font-weight: 400;
|
41
41
|
|
42
42
|
pre * {
|
@@ -147,84 +147,10 @@ p.document-stage {
|
|
147
147
|
height: 160px;
|
148
148
|
}
|
149
149
|
|
150
|
-
#proposal-band p {
|
151
|
-
height: 150px;
|
152
|
-
}
|
153
|
-
|
154
|
-
#standard-band,
|
155
|
-
#published-band {
|
156
|
-
background-color: #007864;
|
157
|
-
}
|
158
|
-
|
159
|
-
#standard,
|
160
|
-
#published {
|
161
|
-
border-bottom: solid 3px #007864;
|
162
|
-
}
|
163
|
-
|
164
|
-
#governance,
|
165
|
-
#policy-and-procedures {
|
166
|
-
border-bottom: solid 3px #750697;
|
167
|
-
}
|
168
|
-
|
169
|
-
#governance-band,
|
170
|
-
#policy-and-procedures-band {
|
171
|
-
background-color: #750697;
|
172
|
-
}
|
173
|
-
|
174
|
-
#guide {
|
175
|
-
border-bottom: solid 3px #48a0e7;
|
176
|
-
}
|
177
|
-
|
178
|
-
#guide-band {
|
179
|
-
background-color: #48a0e7;
|
180
|
-
}
|
181
|
-
|
182
150
|
.coverpage-maturity {
|
183
151
|
@include coverpageStageBlock();
|
184
152
|
}
|
185
153
|
|
186
|
-
#working-draft,
|
187
|
-
#proposal {
|
188
|
-
border-bottom: solid 3px #F7803C;
|
189
|
-
}
|
190
|
-
|
191
|
-
#working-draft-band,
|
192
|
-
#proposal-band {
|
193
|
-
background-color: #F7803C;
|
194
|
-
}
|
195
|
-
|
196
|
-
#committee-draft {
|
197
|
-
border-bottom: solid 3px #fd06fd;
|
198
|
-
}
|
199
|
-
|
200
|
-
#committee-draft-band {
|
201
|
-
background-color: #fd06fd;
|
202
|
-
}
|
203
|
-
|
204
|
-
#draft-standard {
|
205
|
-
border-bottom: solid 3px #fdf906;
|
206
|
-
}
|
207
|
-
|
208
|
-
#draft-standard-band {
|
209
|
-
background-color: #fdf906;
|
210
|
-
}
|
211
|
-
|
212
|
-
#standard {
|
213
|
-
border-bottom: solid 3px #007864;
|
214
|
-
}
|
215
|
-
|
216
|
-
#standard-band {
|
217
|
-
background-color: #007864;
|
218
|
-
}
|
219
|
-
|
220
|
-
#obsolete {
|
221
|
-
border-bottom: solid 3px #7e0d13;
|
222
|
-
}
|
223
|
-
|
224
|
-
#obsolete-band {
|
225
|
-
background-color: #7e0d13;
|
226
|
-
}
|
227
|
-
|
228
154
|
/*
|
229
155
|
3. TYPOGRAPHY
|
230
156
|
*/
|
@@ -330,6 +256,56 @@ ul li:first-child {
|
|
330
256
|
display: none;
|
331
257
|
}
|
332
258
|
|
259
|
+
/* https://github.com/metanorma/metanorma-bipm/issues/47 */
|
260
|
+
|
261
|
+
ol[class="alphabet"] {
|
262
|
+
counter-reset: alphabet;
|
263
|
+
}
|
264
|
+
ol[class="roman"] {
|
265
|
+
counter-reset: roman;
|
266
|
+
}
|
267
|
+
ol[class="alphabet"] ol[class="alphabet"] {
|
268
|
+
counter-reset: none;
|
269
|
+
}
|
270
|
+
ol[class="alphabet"] > li {
|
271
|
+
list-style: none;
|
272
|
+
position: relative;
|
273
|
+
}
|
274
|
+
ol[class="alphabet"] ol[class="alphabet"] > li {
|
275
|
+
list-style: inherit;
|
276
|
+
}
|
277
|
+
ol[class="alphabet"] > li:before {
|
278
|
+
counter-increment: alphabet;
|
279
|
+
content: counter(alphabet, lower-alpha)") ";
|
280
|
+
position: absolute;
|
281
|
+
left: -1.4em;
|
282
|
+
}
|
283
|
+
ol[class="alphabet"] ol[class="alphabet"] > li:before {
|
284
|
+
counter-increment: none;
|
285
|
+
content: initial;
|
286
|
+
}
|
287
|
+
ol[class="roman"] ol[class="roman"] {
|
288
|
+
counter-reset: none;
|
289
|
+
}
|
290
|
+
ol[class="roman"] > li {
|
291
|
+
list-style: none;
|
292
|
+
position: relative;
|
293
|
+
}
|
294
|
+
ol[class="roman"] ol[class="roman"] > li {
|
295
|
+
list-style: inherit;
|
296
|
+
}
|
297
|
+
ol[class="roman"] > li:before {
|
298
|
+
counter-increment: roman;
|
299
|
+
content: "("counter(roman, lower-roman)") ";
|
300
|
+
position: absolute;
|
301
|
+
left: -2.0em;
|
302
|
+
}
|
303
|
+
ol[class="roman"] ol[class="roman"] > li:before {
|
304
|
+
counter-increment: none;
|
305
|
+
content: initial;
|
306
|
+
}
|
307
|
+
|
308
|
+
|
333
309
|
|
334
310
|
/*
|
335
311
|
3.4 Rules
|
@@ -425,7 +401,7 @@ a.footnote-number {
|
|
425
401
|
}
|
426
402
|
|
427
403
|
.footnote {
|
428
|
-
font-size:
|
404
|
+
font-size: $footnotefontsize;
|
429
405
|
}
|
430
406
|
|
431
407
|
|
@@ -22,6 +22,23 @@ module IsoDoc
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def counter_reset(node)
|
26
|
+
s = node["start"]
|
27
|
+
return nil unless s && !s.empty? && !s.to_i.zero?
|
28
|
+
"counter-reset: #{node['type']} #{s.to_i - 1};"
|
29
|
+
end
|
30
|
+
|
31
|
+
def ol_attrs(node)
|
32
|
+
klass, style = if node["type"] == "roman" &&
|
33
|
+
!node.at("./ancestor::xmlns:ol[@type = 'roman']") ||
|
34
|
+
node["type"] == "alphabet" &&
|
35
|
+
!node.at("./ancestor::xmlns:ol[@type = 'alphabet']")
|
36
|
+
[node["type"], counter_reset(node)]
|
37
|
+
end
|
38
|
+
super.merge(attr_code(type: ol_style((node["type"] || "arabic").to_sym),
|
39
|
+
start: node["start"]), style: style, class: klass)
|
40
|
+
end
|
41
|
+
|
25
42
|
include BaseConvert
|
26
43
|
include Init
|
27
44
|
end
|
@@ -1,5 +1,22 @@
|
|
1
1
|
annex: Annexe
|
2
|
+
appendix: Appendice
|
2
3
|
see: voir
|
4
|
+
see_also: voir aussi
|
5
|
+
clause: chapître
|
6
|
+
subclause: section
|
7
|
+
formula: équation
|
8
|
+
inequality: inégalité
|
9
|
+
bibliography: Références
|
10
|
+
note_xref: note
|
11
|
+
termnote: note % à l’article
|
12
|
+
list: liste
|
13
|
+
figure: figure
|
14
|
+
table: tableau
|
15
|
+
requirement: exigence
|
16
|
+
recommendation: recommandation
|
17
|
+
permission: autorisation
|
18
|
+
example_xref: exemple
|
19
|
+
index: Index
|
3
20
|
doctype_dict:
|
4
21
|
brochure: brochure
|
5
22
|
mise-en-pratique: mise-en-pratique
|
@@ -13,7 +30,7 @@ doctype_dict:
|
|
13
30
|
cipm-mra: cipm-mra
|
14
31
|
resolution: résolution
|
15
32
|
stage_dict:
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
33
|
+
draft-proposal: projet-de-proposition
|
34
|
+
draft-development: projet-de-développement
|
35
|
+
in-force: en-vigeur
|
36
|
+
retired: retiré
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require "twitter_cldr"
|
2
|
+
require "sterile"
|
3
|
+
|
4
|
+
module IsoDoc
|
5
|
+
module BIPM
|
6
|
+
class PresentationXMLConvert < IsoDoc::Generic::PresentationXMLConvert
|
7
|
+
def add_id
|
8
|
+
%(id="_#{UUIDTools::UUID.random_create}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def index(docxml)
|
12
|
+
return unless docxml.at(ns("//index"))
|
13
|
+
i = docxml.root.add_child "<clause type='index' #{add_id}><title>#{@i18n.index}</title></clause>"
|
14
|
+
index = sort_indexterms(docxml.xpath(ns("//index")), docxml.xpath(ns("//index-xref[@also = 'false']")),
|
15
|
+
docxml.xpath(ns("//index-xref[@also = 'true']")))
|
16
|
+
index1(docxml, i, index)
|
17
|
+
end
|
18
|
+
|
19
|
+
def index1(docxml, i, index)
|
20
|
+
index.keys.sort.each do |k|
|
21
|
+
c = i.first.add_child "<clause #{add_id}><title>#{k}</title><ul></ul></clause>"
|
22
|
+
words = index[k].keys.each_with_object({}) { |w, v| v[sortable(w).downcase] = w }
|
23
|
+
words.keys.localize(@lang.to_sym).sort.to_a.each do |w|
|
24
|
+
c.first.at(ns("./ul")).add_child index_entries(words, index[k], w)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@xrefs.bookmark_anchor_names(docxml.xpath(ns(@xrefs.sections_xpath)))
|
28
|
+
end
|
29
|
+
|
30
|
+
def sortable(s)
|
31
|
+
HTMLEntities.new.decode(Nokogiri::XML.fragment(s).text)
|
32
|
+
end
|
33
|
+
|
34
|
+
def index_entries_opt
|
35
|
+
{ xref_lbl: ", ", see_lbl: ", #{see_lbl}", also_lbl: ", #{also_lbl}" }
|
36
|
+
end
|
37
|
+
|
38
|
+
def index_entries(words, index, primary)
|
39
|
+
ret = index_entries_head(words[primary], index.dig(words[primary], nil, nil), index_entries_opt)
|
40
|
+
words2 = index[words[primary]]&.keys&.reject { |k| k.nil?}&.each_with_object({}) { |w, v| v[w.downcase] = w }
|
41
|
+
unless words2.empty?
|
42
|
+
ret += "<ul>"
|
43
|
+
words2.keys.localize(@lang.to_sym).sort.to_a.each do |w|
|
44
|
+
ret += index_entries2(words2, index[words[primary]], w)
|
45
|
+
end
|
46
|
+
ret += "</ul>"
|
47
|
+
end
|
48
|
+
ret + "</li>"
|
49
|
+
end
|
50
|
+
|
51
|
+
def index_entries2(words, index, secondary)
|
52
|
+
ret = index_entries_head(words[secondary], index.dig(words[secondary], nil), index_entries_opt)
|
53
|
+
words3 = index[words[secondary]]&.keys&.reject { |k| k.nil?}&.each_with_object({}) { |w, v| v[w.downcase] = w }
|
54
|
+
unless words3.empty?
|
55
|
+
ret += "<ul>"
|
56
|
+
words3.keys.localize(@lang.to_sym).sort.to_a.each do |w|
|
57
|
+
ret += (index_entries_head(words3[w], index[words[secondary]][words3[w]], index_entries_opt) + "</li>")
|
58
|
+
end
|
59
|
+
ret += "</ul>"
|
60
|
+
end
|
61
|
+
ret + "</li>"
|
62
|
+
end
|
63
|
+
|
64
|
+
def index_entries_head(head, entries, opt)
|
65
|
+
ret = "<li>#{head}"
|
66
|
+
xref = entries&.dig(:xref)&.join(", ")
|
67
|
+
see_sort = entries&.dig(:see)&.each_with_object({}) { |w, v| v[sortable(w).downcase] = w }
|
68
|
+
see = see_sort&.keys&.localize(@lang.to_sym)&.sort&.to_a&.map { |k| see_sort[k] }&.join(", ")
|
69
|
+
also_sort = entries&.dig(:also)&.each_with_object({}) { |w, v| v[sortable(w).downcase] = w }
|
70
|
+
also = also_sort&.keys&.localize(@lang.to_sym)&.sort&.to_a&.map { |k| also_sort[k] }&.join(", ")
|
71
|
+
ret += "#{opt[:xref_lbl]} #{xref}" if xref
|
72
|
+
ret += "#{opt[:see_lbl]} #{see}" if see
|
73
|
+
ret += "#{opt[:also_lbl]} #{also}" if also
|
74
|
+
ret
|
75
|
+
end
|
76
|
+
|
77
|
+
def see_lbl
|
78
|
+
@lang == "en" ? @i18n.see : "<em>#{@i18n.see}</em>"
|
79
|
+
end
|
80
|
+
|
81
|
+
def also_lbl
|
82
|
+
@lang == "en" ? @i18n.see_also : "<em>#{@i18n.see_also}</em>"
|
83
|
+
end
|
84
|
+
|
85
|
+
def sort_indexterms(terms, see, also)
|
86
|
+
index = extract_indexterms(terms)
|
87
|
+
index = extract_indexsee(index, see, :see)
|
88
|
+
index = extract_indexsee(index, also, :also)
|
89
|
+
index.keys.sort.each_with_object({}) do |k, v|
|
90
|
+
v[sortable(k)[0].upcase.transliterate] ||= {}
|
91
|
+
v[sortable(k)[0].upcase.transliterate][k] = index[k]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def extract_indexsee(v, terms, label)
|
96
|
+
terms.each_with_object(v) do |t, v|
|
97
|
+
term = t&.at(ns("./primary"))&.children&.to_xml
|
98
|
+
term2 = t&.at(ns("./secondary"))&.children&.to_xml
|
99
|
+
term3 = t&.at(ns("./tertiary"))&.children&.to_xml
|
100
|
+
v[term] ||= {}
|
101
|
+
v[term][term2] ||= {}
|
102
|
+
v[term][term2][term3] ||= {}
|
103
|
+
v[term][term2][term3][label] ||= []
|
104
|
+
v[term][term2][term3][label] << t&.at(ns("./target"))&.children&.to_xml
|
105
|
+
t.remove
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def xml_encode_attr(s)
|
110
|
+
HTMLEntities.new.encode(s, :basic, :hexadecimal).gsub(/\&#x([^;]+);/) { |x| "&#x#{$1.upcase};" }
|
111
|
+
end
|
112
|
+
|
113
|
+
# attributes are decoded into UTF-8, elements in extract_indexsee are still in entities
|
114
|
+
def extract_indexterms(terms)
|
115
|
+
terms.each_with_object({}) do |t, v|
|
116
|
+
term = t&.at(ns("./primary"))&.children&.to_xml
|
117
|
+
term2 = t&.at(ns("./secondary"))&.children&.to_xml
|
118
|
+
term3 = t&.at(ns("./tertiary"))&.children&.to_xml
|
119
|
+
index2bookmark(t)
|
120
|
+
v[term] ||= {}
|
121
|
+
v[term][term2] ||= {}
|
122
|
+
v[term][term2][term3] ||= {}
|
123
|
+
v[term][term2][term3][:xref] ||= []
|
124
|
+
to = t["to"] ? "to='#{t['to']}' " : ""
|
125
|
+
v[term][term2][term3][:xref] << "<xref target='#{t['id']}' #{to}pagenumber='true'/>"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def index2bookmark(t)
|
130
|
+
t.name = "bookmark"
|
131
|
+
t.children.each { |x| x.remove }
|
132
|
+
t["id"] = "_#{UUIDTools::UUID.random_create}"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|