metanorma-itu 1.0.13 → 1.0.18

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +8 -7
  3. data/.github/workflows/ubuntu.yml +12 -9
  4. data/.github/workflows/windows.yml +8 -8
  5. data/lib/asciidoctor/itu/biblio.rng +89 -32
  6. data/lib/asciidoctor/itu/cleanup.rb +80 -71
  7. data/lib/asciidoctor/itu/converter.rb +7 -11
  8. data/lib/asciidoctor/itu/front.rb +47 -18
  9. data/lib/asciidoctor/itu/isodoc.rng +475 -2
  10. data/lib/asciidoctor/itu/reqt.rng +23 -0
  11. data/lib/isodoc/itu/base_convert.rb +66 -16
  12. data/lib/isodoc/itu/html/_coverpage.scss +7 -3
  13. data/lib/isodoc/itu/html/header.html +8 -8
  14. data/lib/isodoc/itu/html/html_itu_titlepage.html +6 -7
  15. data/lib/isodoc/itu/html/htmlstyle.scss +9 -5
  16. data/lib/isodoc/itu/html/itu.scss +28 -1
  17. data/lib/isodoc/itu/html/scripts.html +14 -27
  18. data/lib/isodoc/itu/html/word_itu_intro.html +11 -1
  19. data/lib/isodoc/itu/html/word_itu_titlepage.html +3 -6
  20. data/lib/isodoc/itu/html/wordstyle.scss +6 -5
  21. data/lib/isodoc/itu/html_convert.rb +3 -3
  22. data/lib/isodoc/itu/i18n-en.yaml +2 -1
  23. data/lib/isodoc/itu/itu.recommendation-annex.xsl +3903 -0
  24. data/lib/isodoc/itu/itu.recommendation.xsl +3903 -0
  25. data/lib/isodoc/itu/itu.resolution.xsl +3903 -0
  26. data/lib/isodoc/itu/metadata.rb +16 -6
  27. data/lib/isodoc/itu/pdf_convert.rb +17 -44
  28. data/lib/isodoc/itu/ref.rb +48 -21
  29. data/lib/isodoc/itu/terms.rb +5 -6
  30. data/lib/isodoc/itu/word_convert.rb +10 -8
  31. data/lib/isodoc/itu/xref.rb +27 -16
  32. data/lib/metanorma/itu/processor.rb +8 -0
  33. data/lib/metanorma/itu/version.rb +1 -1
  34. data/metanorma-itu.gemspec +1 -1
  35. metadata +7 -5
  36. data/lib/isodoc/itu/html/scripts.pdf.html +0 -72
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9dd5351d92f3cb7d79552e4953b44f4468db9145c8edc8e7c044b50c7027ef5f
4
- data.tar.gz: d1eac96d771822fbd30f7b34afe1e62ad75d76d5377c7bc4449bbef3426dec73
3
+ metadata.gz: 3f73d7454cb02fbc95efe4d8deb62e8f19f01eba49a9cd73403f3948f5eec053
4
+ data.tar.gz: f87b4616dd0b0e48423efc44a5cc7115d1d4841f3aaf4ba1549f5dd0f02fe8fa
5
5
  SHA512:
6
- metadata.gz: c0781a46a8af37f88eaa80ea091bdde5926da2e9f94a8478b852860cf93a9e2a2c792861e3eb52301ffadbb457b30a6bd9a0281a45048c435eaa588cf141f8d7
7
- data.tar.gz: 508002933e801a0d77be589fae9146f7570b26cc156e05fba80effe2a07299e67acbe983c8109c48fea7a57da5a55cd7fa649b5cd0eb845c6c140f5cf4c49fe1
6
+ metadata.gz: 4483e1f5ba81d0677d38cb74c691104d4900653a896eda40d0d2abe5f60a2a14a764b02c1b3ebc31d0b1b43d2451f50e7df91d975b088cc435c9dac25835581f
7
+ data.tar.gz: cc0a4617299d46730aeede48cf50fba13dc0b65a649879af55199ecf37b941419100692c964cfeab8e63ce78f4f4845a8b38ad6c450ecff28fab05a398358207
@@ -6,15 +6,23 @@ on:
6
6
  push:
7
7
  branches: [ master ]
8
8
  pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/ubuntu.yml
11
+ - .github/workflows/windows.yml
9
12
 
10
13
  jobs:
11
14
  test-macos:
12
15
  name: Test on Ruby ${{ matrix.ruby }} macOS
13
16
  runs-on: macos-latest
17
+ continue-on-error: ${{ matrix.experimental }}
14
18
  strategy:
15
19
  fail-fast: false
16
20
  matrix:
17
21
  ruby: [ '2.6', '2.5', '2.4' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
18
26
  steps:
19
27
  - uses: actions/checkout@master
20
28
  - name: Use Ruby
@@ -26,13 +34,6 @@ jobs:
26
34
  run: |
27
35
  sudo gem install bundler --force
28
36
  bundle install --jobs 4 --retry 3
29
- - name: Use Node
30
- uses: actions/setup-node@v1
31
- with:
32
- node-version: '8'
33
- - name: Install Puppeteer
34
- run: |
35
- npm install -g puppeteer
36
37
  - name: Run specs
37
38
  run: |
38
39
  bundle exec rake
@@ -5,16 +5,26 @@ name: ubuntu
5
5
  on:
6
6
  push:
7
7
  branches: [ master ]
8
+ tags:
9
+ - '*'
8
10
  pull_request:
11
+ paths-ignore:
12
+ - .github/workflows/macos.yml
13
+ - .github/workflows/windows.yml
9
14
 
10
15
  jobs:
11
16
  test-linux:
12
17
  name: Test on Ruby ${{ matrix.ruby }} Ubuntu
13
18
  runs-on: ubuntu-latest
19
+ continue-on-error: ${{ matrix.experimental }}
14
20
  strategy:
15
21
  fail-fast: false
16
22
  matrix:
17
23
  ruby: [ '2.6', '2.5', '2.4' ]
24
+ experimental: [false]
25
+ include:
26
+ - ruby: '2.7'
27
+ experimental: true
18
28
  steps:
19
29
  - uses: actions/checkout@master
20
30
  - name: Use Ruby
@@ -26,18 +36,11 @@ jobs:
26
36
  run: |
27
37
  gem install bundler
28
38
  bundle install --jobs 4 --retry 3
29
- - name: Use Node
30
- uses: actions/setup-node@v1
31
- with:
32
- node-version: '8'
33
- - name: Install Puppeteer
34
- run: |
35
- npm install -g puppeteer
36
39
  - name: Run specs
37
40
  run: |
38
41
  bundle exec rake
39
42
  - name: Trigger dependent repositories
40
- if: github.ref == 'refs/heads/master'
43
+ if: github.ref == 'refs/heads/master' && matrix.ruby == '2.6'
41
44
  env:
42
45
  GH_USERNAME: ${{ secrets.PAT_USERNAME }}
43
46
  GH_ACCESS_TOKEN: ${{ secrets.PAT_TOKEN }}
@@ -46,5 +49,5 @@ jobs:
46
49
  [[ -f ".github/workflows/dependent_repos.env" ]] && source .github/workflows/dependent_repos.env
47
50
  for repo in $DEPENDENT_REPOS
48
51
  do
49
- sh trigger-gh-actions.sh $ORGANISATION $repo $GH_USERNAME $GH_ACCESS_TOKEN $GITHUB_REPOSITORY
52
+ sh trigger-gh-actions.sh $ORGANISATION $repo $GH_USERNAME $GH_ACCESS_TOKEN $GITHUB_REPOSITORY "{ \"ref\": \"${GITHUB_REF}\" }"
50
53
  done
@@ -6,15 +6,23 @@ on:
6
6
  push:
7
7
  branches: [ master ]
8
8
  pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/macos.yml
11
+ - .github/workflows/ubuntu.yml
9
12
 
10
13
  jobs:
11
14
  test-windows:
12
15
  name: Test on Ruby ${{ matrix.ruby }} Windows
13
16
  runs-on: windows-latest
17
+ continue-on-error: ${{ matrix.experimental }}
14
18
  strategy:
15
19
  fail-fast: false
16
20
  matrix:
17
21
  ruby: [ '2.6', '2.5', '2.4' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
18
26
  steps:
19
27
  - uses: actions/checkout@master
20
28
  - name: Use Ruby
@@ -27,15 +35,7 @@ jobs:
27
35
  run: |
28
36
  gem install bundler
29
37
  bundle config --local path vendor/bundle
30
- bundle update
31
38
  bundle install --jobs 4 --retry 3
32
- - name: Use Node
33
- uses: actions/setup-node@v1
34
- with:
35
- node-version: '8'
36
- - name: Install Puppeteer
37
- run: |
38
- npm install -g puppeteer
39
39
  - name: Run specs
40
40
  run: |
41
41
  bundle exec rake
@@ -88,7 +88,7 @@
88
88
  <text/>
89
89
  </element>
90
90
  </define>
91
- <define name="LocalizedString">
91
+ <define name="LocalizedString1">
92
92
  <optional>
93
93
  <!-- multiple languages and scripts possible: comma delimit them if so -->
94
94
  <attribute name="language"/>
@@ -98,6 +98,16 @@
98
98
  </optional>
99
99
  <text/>
100
100
  </define>
101
+ <define name="LocalizedString">
102
+ <choice>
103
+ <ref name="LocalizedString1"/>
104
+ <oneOrMore>
105
+ <element name="variant">
106
+ <ref name="LocalizedString1"/>
107
+ </element>
108
+ </oneOrMore>
109
+ </choice>
110
+ </define>
101
111
  <!--
102
112
  Unlike UML, change type to format: type is overloaded
103
113
  Would be need if plain were default value and could omit the attribute
@@ -121,7 +131,7 @@
121
131
  </optional>
122
132
  <ref name="LocalizedStringOrXsAny"/>
123
133
  </define>
124
- <define name="LocalizedStringOrXsAny">
134
+ <define name="LocalizedStringOrXsAny1">
125
135
  <optional>
126
136
  <!-- multiple languages and scripts possible: comma delimit them if so -->
127
137
  <attribute name="language"/>
@@ -136,6 +146,16 @@
136
146
  </choice>
137
147
  </oneOrMore>
138
148
  </define>
149
+ <define name="LocalizedStringOrXsAny">
150
+ <choice>
151
+ <ref name="LocalizedStringOrXsAny1"/>
152
+ <oneOrMore>
153
+ <element name="variant">
154
+ <ref name="LocalizedStringOrXsAny1"/>
155
+ </element>
156
+ </oneOrMore>
157
+ </choice>
158
+ </define>
139
159
  <define name="contributor">
140
160
  <element name="contributor">
141
161
  <zeroOrMore>
@@ -512,7 +532,7 @@
512
532
  </define>
513
533
  <define name="LocalityType">
514
534
  <data type="string">
515
- <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|list|example|volume|issue|time|locality:[a-zA-Z0-9_]+</param>
535
+ <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|list|example|volume|issue|time|anchor|locality:[a-zA-Z0-9_]+</param>
516
536
  </data>
517
537
  </define>
518
538
  <define name="referenceFrom">
@@ -641,9 +661,9 @@
641
661
  <optional>
642
662
  <ref name="status"/>
643
663
  </optional>
644
- <optional>
664
+ <zeroOrMore>
645
665
  <ref name="copyright"/>
646
- </optional>
666
+ </zeroOrMore>
647
667
  <zeroOrMore>
648
668
  <ref name="docrelation"/>
649
669
  </zeroOrMore>
@@ -767,6 +787,8 @@
767
787
  <value>unchanged</value>
768
788
  <value>circulated</value>
769
789
  <value>adapted</value>
790
+ <value>vote-started</value>
791
+ <value>vote-ended</value>
770
792
  </choice>
771
793
  </define>
772
794
  <define name="bdate">
@@ -999,7 +1021,17 @@
999
1021
  <optional>
1000
1022
  <ref name="to"/>
1001
1023
  </optional>
1002
- <ref name="owner"/>
1024
+ <oneOrMore>
1025
+ <ref name="owner"/>
1026
+ </oneOrMore>
1027
+ <optional>
1028
+ <ref name="copyright_scope"/>
1029
+ </optional>
1030
+ </element>
1031
+ </define>
1032
+ <define name="copyright_scope">
1033
+ <element name="scope">
1034
+ <text/>
1003
1035
  </element>
1004
1036
  </define>
1005
1037
  <define name="from">
@@ -1019,38 +1051,63 @@
1019
1051
  </define>
1020
1052
  <define name="DocRelationType">
1021
1053
  <choice>
1022
- <value>obsoletes</value>
1023
- <value>obsoletedBy</value>
1024
- <value>supersedes</value>
1025
- <value>supersededBy</value>
1026
- <value>updates</value>
1027
- <value>updatedBy</value>
1028
- <value>complements</value>
1029
- <value>derivedFrom</value>
1030
- <value>translatedFrom</value>
1031
- <value>hasTranslation</value>
1032
- <value>adoptedFrom</value>
1033
- <value>equivalent</value>
1034
- <value>identical</value>
1035
- <value>nonequivalent</value>
1036
- <value>includedIn</value>
1037
1054
  <value>includes</value>
1038
- <value>instance</value>
1039
- <value>instanceOf</value>
1040
- <value>partOf</value>
1055
+ <value>includedIn</value>
1041
1056
  <value>hasPart</value>
1042
- <value>hasDraft</value>
1043
- <value>draftOf</value>
1057
+ <value>partOf</value>
1044
1058
  <value>merges</value>
1059
+ <value>mergedInto</value>
1045
1060
  <value>splits</value>
1046
- <value>amends</value>
1047
- <value>amendedBy</value>
1048
- <value>corrects</value>
1049
- <value>correctedBy</value>
1050
- <value>revises</value>
1051
- <value>revisedBy</value>
1061
+ <value>splitInto</value>
1062
+ <value>instance</value>
1063
+ <value>hasInstance</value>
1064
+ <value>exemplarOf</value>
1065
+ <value>hasExemplar</value>
1066
+ <value>manifestationOf</value>
1067
+ <value>hasManifestation</value>
1068
+ <value>reproductionOf</value>
1069
+ <value>hasReproduction</value>
1070
+ <value>reprintOf</value>
1071
+ <value>hasReprint</value>
1072
+ <value>expressionOf</value>
1073
+ <value>hasExpression</value>
1074
+ <value>translatedFrom</value>
1075
+ <value>hasTranslation</value>
1076
+ <value>arrangementOf</value>
1077
+ <value>hasArrangement</value>
1078
+ <value>abridgementOf</value>
1079
+ <value>hasAbridgement</value>
1080
+ <value>annotationOf</value>
1081
+ <value>hasAnnotation</value>
1082
+ <value>draftOf</value>
1083
+ <value>hasDraft</value>
1084
+ <value>editionOf</value>
1085
+ <value>hasEdition</value>
1086
+ <value>updates</value>
1087
+ <value>updatedBy</value>
1088
+ <value>derivedFrom</value>
1089
+ <value>derives</value>
1052
1090
  <value>describes</value>
1053
1091
  <value>describedBy</value>
1092
+ <value>catalogues</value>
1093
+ <value>cataloguedBy</value>
1094
+ <value>hasSuccessor</value>
1095
+ <value>successorOf</value>
1096
+ <value>adaptedFrom</value>
1097
+ <value>hasAdaptation</value>
1098
+ <value>adoptedFrom</value>
1099
+ <value>adoptedAs</value>
1100
+ <value>reviewOf</value>
1101
+ <value>hasReview</value>
1102
+ <value>commentaryOf</value>
1103
+ <value>hasCommentary</value>
1104
+ <value>related</value>
1105
+ <value>complements</value>
1106
+ <value>complementOf</value>
1107
+ <value>obsoletes</value>
1108
+ <value>obsoletedBy</value>
1109
+ <value>cited</value>
1110
+ <value>isCitedIn</value>
1054
1111
  </choice>
1055
1112
  </define>
1056
1113
  <define name="docrelation">
@@ -3,9 +3,6 @@ module Asciidoctor
3
3
  class Converter < Standoc::Converter
4
4
  def sections_cleanup(x)
5
5
  super
6
- x.xpath("//*[@inline-header]").each do |h|
7
- h.delete("inline-header")
8
- end
9
6
  insert_missing_sections(x) unless @no_insert_missing_sections
10
7
  end
11
8
 
@@ -43,9 +40,11 @@ module Asciidoctor
43
40
  x.at("./*/annex[last()] | ./*/sections").next =
44
41
  "<bibliography><sentinel/></bibliography>"
45
42
  ins = x.at("//bibliography").elements.first
46
- unless x.at("//bibliography/references/title[text() = 'References']")
47
- ins.previous = "<references><title>References</title><p>"\
48
- "#{@labels['clause_empty']}</p></references>"
43
+ unless x.at("//bibliography/references[@normative = 'true']")
44
+ #ins.previous = "<references normative='true'><title>References</title><p>"\
45
+ # "#{@labels['clause_empty']}</p></references>"
46
+ ins.previous = "<references normative='true'><title>References</title>"\
47
+ "</references>"
49
48
  end
50
49
  x&.at("//sentinel")&.remove
51
50
  end
@@ -62,7 +61,7 @@ module Asciidoctor
62
61
  ins = x.at("//sections/terms") ||
63
62
  x.at("//sections/clause[descendant::terms]")
64
63
  unless x.at("//sections//definitions")
65
- ins.next = "<definitions><title>Definitions</title><p>"\
64
+ ins.next = "<definitions><title>Abbreviations and acronyms</title><p>"\
66
65
  "#{@labels['clause_empty']}</p></definitions>"
67
66
  end
68
67
  end
@@ -71,44 +70,47 @@ module Asciidoctor
71
70
  ins = x.at("//sections//definitions") ||
72
71
  x.at("//sections/clause[descendant::definitions]")
73
72
  unless x.at("//sections/clause/title[text() = 'Conventions']")
74
- ins.next = "<clause><title>Conventions</title><p>"\
75
- "#{@labels['clause_empty']}</p></clause>"
76
- end
77
- end
73
+ ins.next = "<clause id='_#{UUIDTools::UUID.random_create}'>"\
74
+ "<title>Conventions</title><p>"\
75
+ "#{@labels['clause_empty']}</p></clause>"
76
+ end
77
+ end
78
78
 
79
- def cleanup(xmldoc)
80
- symbols_cleanup(xmldoc)
81
- super
82
- end
79
+ def cleanup(xmldoc)
80
+ symbols_cleanup(xmldoc)
81
+ super
82
+ obligations_cleanup(xmldoc)
83
+ xmldoc
84
+ end
83
85
 
84
- def smartquotes_cleanup(xmldoc)
85
- return super if @smartquotes
86
- xmldoc.traverse do |n|
86
+ def smartquotes_cleanup(xmldoc)
87
+ return super if @smartquotes
88
+ xmldoc.traverse do |n|
87
89
  next unless n.text?
88
90
  n.replace(HTMLEntities.new.encode(
89
91
  n.text.gsub(/\u2019|\u2018|\u201a|\u201b/, "'").
90
92
  gsub(/\u201c|\u201d|\u201e|\u201f/, '"'), :basic))
91
- end
92
- xmldoc
93
- end
93
+ end
94
+ xmldoc
95
+ end
94
96
 
95
- def termdef_cleanup(xmldoc)
96
- xmldoc.xpath("//term/preferred").each do |p|
97
+ def termdef_cleanup(xmldoc)
98
+ xmldoc.xpath("//term/preferred").each do |p|
97
99
  if ["terms defined elsewhere",
98
- "terms defined in this recommendation"].include? p.text.downcase
99
- p.name = "title"
100
- p.parent.name = "terms"
100
+ "terms defined in this recommendation"].include? p.text.downcase
101
+ p.name = "title"
102
+ p.parent.name = "terms"
103
+ end
104
+ end
105
+ super
101
106
  end
102
- end
103
- super
104
- end
105
107
 
106
- def termdef_boilerplate_cleanup(xmldoc)
107
- end
108
+ def termdef_boilerplate_cleanup(xmldoc)
109
+ end
108
110
 
109
- def symbols_cleanup(xmldoc)
110
- sym = xmldoc.at("//definitions/title")
111
- sym and sym&.next_element&.name == "dl" and
111
+ def symbols_cleanup(xmldoc)
112
+ sym = xmldoc.at("//definitions/title")
113
+ sym and sym&.next_element&.name == "dl" and
112
114
  sym.next = "<p>#{@symbols_boilerplate}</p>"
113
115
  end
114
116
 
@@ -116,48 +118,55 @@ module Asciidoctor
116
118
 
117
119
  def pub_class(bib)
118
120
  return 1 if bib.at("#{PUBLISHER}[abbreviation = 'ITU']")
119
- return 1 if bib.at("#{PUBLISHER}[name = 'International "\
120
- "Telecommunication Union']")
121
- return 2 if bib.at("#{PUBLISHER}[abbreviation = 'ISO']")
122
- return 2 if bib.at("#{PUBLISHER}[name = 'International Organization "\
123
- "for Standardization']")
124
- return 3 if bib.at("#{PUBLISHER}[abbreviation = 'IEC']")
125
- return 3 if bib.at("#{PUBLISHER}[name = 'International "\
126
- "Electrotechnical Commission']")
127
- return 4 if bib.at("./docidentifier[@type][not(@type = 'DOI' or "\
128
- "@type = 'metanorma' or @type = 'ISSN' or @type = "\
129
- "'ISBN')]")
130
- 5
131
- end
121
+ return 1 if bib.at("#{PUBLISHER}[name = 'International "\
122
+ "Telecommunication Union']")
123
+ return 2 if bib.at("#{PUBLISHER}[abbreviation = 'ISO']")
124
+ return 2 if bib.at("#{PUBLISHER}[name = 'International Organization "\
125
+ "for Standardization']")
126
+ return 3 if bib.at("#{PUBLISHER}[abbreviation = 'IEC']")
127
+ return 3 if bib.at("#{PUBLISHER}[name = 'International "\
128
+ "Electrotechnical Commission']")
129
+ return 4 if bib.at("./docidentifier[@type][not(@type = 'DOI' or "\
130
+ "@type = 'metanorma' or @type = 'ISSN' or @type = "\
131
+ "'ISBN')]")
132
+ 5
133
+ end
132
134
 
133
- def sort_biblio(bib)
134
- bib.sort do |a, b|
135
- sort_biblio_key(a) <=> sort_biblio_key(b)
135
+ def sort_biblio(bib)
136
+ bib.sort do |a, b|
137
+ sort_biblio_key(a) <=> sort_biblio_key(b)
138
+ end
136
139
  end
137
- end
138
140
 
139
- # sort by: doc class (ITU, ISO, IEC, other standard (not DOI &c), other
140
- # then standard class (docid class other than DOI &c)
141
- # then alphanumeric doc id (not DOI &c)
142
- # then title
143
- def sort_biblio_key(bib)
144
- pubclass = pub_class(bib)
145
- num = bib&.at("./docnumber")&.text
146
- id = bib&.at("./docidentifier[not(@type = 'DOI' or @type = "\
147
- "'metanorma' or @type = 'ISSN' or @type = 'ISBN')]")
148
- metaid = bib&.at("./docidentifier[@type = 'metanorma']")&.text
149
- abbrid = metaid unless /^\[\d+\]$/.match(metaid)
150
- type = id['type'] if id
151
- title = bib&.at("./title[@type = 'main']")&.text ||
152
- bib&.at("./title")&.text || bib&.at("./formattedref")&.text
153
- "#{pubclass} :: #{type} :: #{id&.text || metaid} :: #{title}"
154
- end
141
+ # sort by: doc class (ITU, ISO, IEC, other standard (not DOI &c), other
142
+ # then standard class (docid class other than DOI &c)
143
+ # then alphanumeric doc id (not DOI &c)
144
+ # then title
145
+ def sort_biblio_key(bib)
146
+ pubclass = pub_class(bib)
147
+ num = bib&.at("./docnumber")&.text
148
+ id = bib&.at("./docidentifier[not(@type = 'DOI' or @type = "\
149
+ "'metanorma' or @type = 'ISSN' or @type = 'ISBN')]")
150
+ metaid = bib&.at("./docidentifier[@type = 'metanorma']")&.text
151
+ abbrid = metaid unless /^\[\d+\]$/.match(metaid)
152
+ type = id['type'] if id
153
+ title = bib&.at("./title[@type = 'main']")&.text ||
154
+ bib&.at("./title")&.text || bib&.at("./formattedref")&.text
155
+ "#{pubclass} :: #{type} :: #{id&.text || metaid} :: #{title}"
156
+ end
157
+
158
+ def biblio_reorder(xmldoc)
159
+ xmldoc.xpath("//references").each do |r|
160
+ biblio_reorder1(r)
161
+ end
162
+ end
155
163
 
156
- def biblio_reorder(xmldoc)
157
- xmldoc.xpath("//references").each do |r|
158
- biblio_reorder1(r)
164
+ def normref_cleanup(xmldoc)
165
+ super
166
+ r = xmldoc.at(NORM_REF) || return
167
+ title = r.at("./title") and
168
+ title.content = "References"
159
169
  end
160
170
  end
161
171
  end
162
172
  end
163
- end