metanorma-standoc 1.11.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +3 -31
  3. data/.gitignore +23 -0
  4. data/lib/asciidoctor/standoc/base.rb +2 -145
  5. data/lib/asciidoctor/standoc/blocks.rb +2 -238
  6. data/lib/asciidoctor/standoc/blocks_notes.rb +2 -100
  7. data/lib/asciidoctor/standoc/cleanup.rb +2 -208
  8. data/lib/asciidoctor/standoc/cleanup_amend.rb +2 -53
  9. data/lib/asciidoctor/standoc/cleanup_block.rb +2 -172
  10. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +2 -212
  11. data/lib/asciidoctor/standoc/cleanup_footnotes.rb +2 -108
  12. data/lib/asciidoctor/standoc/cleanup_image.rb +2 -69
  13. data/lib/asciidoctor/standoc/cleanup_inline.rb +2 -189
  14. data/lib/asciidoctor/standoc/cleanup_maths.rb +2 -221
  15. data/lib/asciidoctor/standoc/cleanup_ref.rb +2 -169
  16. data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +2 -103
  17. data/lib/asciidoctor/standoc/cleanup_reqt.rb +2 -110
  18. data/lib/asciidoctor/standoc/cleanup_section.rb +2 -184
  19. data/lib/asciidoctor/standoc/cleanup_section_names.rb +2 -91
  20. data/lib/asciidoctor/standoc/cleanup_symbols.rb +2 -47
  21. data/lib/asciidoctor/standoc/cleanup_table.rb +2 -67
  22. data/lib/asciidoctor/standoc/cleanup_terms.rb +2 -139
  23. data/lib/asciidoctor/standoc/cleanup_terms_designations.rb +2 -198
  24. data/lib/asciidoctor/standoc/cleanup_text.rb +2 -95
  25. data/lib/asciidoctor/standoc/cleanup_toc.rb +3 -0
  26. data/lib/asciidoctor/standoc/cleanup_xref.rb +2 -106
  27. data/lib/asciidoctor/standoc/converter.rb +2 -123
  28. data/lib/asciidoctor/standoc/datamodel/attributes_table_preprocessor.rb +2 -56
  29. data/lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb +2 -102
  30. data/lib/asciidoctor/standoc/datamodel/plantuml_renderer.rb +3 -404
  31. data/lib/asciidoctor/standoc/deprecated.rb +5 -0
  32. data/lib/asciidoctor/standoc/front.rb +2 -223
  33. data/lib/asciidoctor/standoc/front_contributor.rb +2 -191
  34. data/lib/asciidoctor/standoc/inline.rb +2 -231
  35. data/lib/asciidoctor/standoc/lists.rb +2 -119
  36. data/lib/asciidoctor/standoc/macros.rb +2 -203
  37. data/lib/asciidoctor/standoc/macros_form.rb +2 -62
  38. data/lib/asciidoctor/standoc/macros_note.rb +2 -44
  39. data/lib/asciidoctor/standoc/macros_plantuml.rb +2 -112
  40. data/lib/asciidoctor/standoc/macros_terms.rb +2 -180
  41. data/lib/asciidoctor/standoc/ref.rb +2 -251
  42. data/lib/asciidoctor/standoc/ref_sect.rb +2 -153
  43. data/lib/asciidoctor/standoc/ref_utility.rb +2 -0
  44. data/lib/asciidoctor/standoc/render.rb +2 -114
  45. data/lib/asciidoctor/standoc/reqt.rb +2 -89
  46. data/lib/asciidoctor/standoc/section.rb +2 -207
  47. data/lib/asciidoctor/standoc/table.rb +2 -84
  48. data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +2 -178
  49. data/lib/asciidoctor/standoc/terms.rb +2 -159
  50. data/lib/asciidoctor/standoc/utils.rb +2 -100
  51. data/lib/asciidoctor/standoc/validate.rb +2 -157
  52. data/lib/asciidoctor/standoc/validate_section.rb +2 -54
  53. data/lib/metanorma/standoc/base.rb +149 -0
  54. data/lib/{asciidoctor → metanorma}/standoc/basicdoc.rng +0 -0
  55. data/lib/{asciidoctor → metanorma}/standoc/biblio.rng +0 -0
  56. data/lib/metanorma/standoc/blocks.rb +239 -0
  57. data/lib/metanorma/standoc/blocks_notes.rb +101 -0
  58. data/lib/metanorma/standoc/cleanup.rb +146 -0
  59. data/lib/metanorma/standoc/cleanup_amend.rb +54 -0
  60. data/lib/metanorma/standoc/cleanup_block.rb +173 -0
  61. data/lib/metanorma/standoc/cleanup_boilerplate.rb +213 -0
  62. data/lib/metanorma/standoc/cleanup_footnotes.rb +109 -0
  63. data/lib/metanorma/standoc/cleanup_image.rb +70 -0
  64. data/lib/metanorma/standoc/cleanup_inline.rb +190 -0
  65. data/lib/metanorma/standoc/cleanup_maths.rb +222 -0
  66. data/lib/metanorma/standoc/cleanup_ref.rb +170 -0
  67. data/lib/metanorma/standoc/cleanup_ref_dl.rb +104 -0
  68. data/lib/metanorma/standoc/cleanup_reqt.rb +111 -0
  69. data/lib/metanorma/standoc/cleanup_section.rb +212 -0
  70. data/lib/metanorma/standoc/cleanup_section_names.rb +92 -0
  71. data/lib/metanorma/standoc/cleanup_symbols.rb +48 -0
  72. data/lib/metanorma/standoc/cleanup_table.rb +68 -0
  73. data/lib/metanorma/standoc/cleanup_terms.rb +140 -0
  74. data/lib/metanorma/standoc/cleanup_terms_designations.rb +199 -0
  75. data/lib/metanorma/standoc/cleanup_text.rb +96 -0
  76. data/lib/metanorma/standoc/cleanup_toc.rb +98 -0
  77. data/lib/metanorma/standoc/cleanup_xref.rb +107 -0
  78. data/lib/metanorma/standoc/converter.rb +124 -0
  79. data/lib/metanorma/standoc/datamodel/attributes_table_preprocessor.rb +57 -0
  80. data/lib/metanorma/standoc/datamodel/diagram_preprocessor.rb +103 -0
  81. data/lib/metanorma/standoc/datamodel/plantuml_renderer.rb +409 -0
  82. data/lib/metanorma/standoc/front.rb +224 -0
  83. data/lib/metanorma/standoc/front_contributor.rb +192 -0
  84. data/lib/metanorma/standoc/inline.rb +232 -0
  85. data/lib/{asciidoctor → metanorma}/standoc/isodoc.rng +29 -0
  86. data/lib/metanorma/standoc/lists.rb +120 -0
  87. data/lib/metanorma/standoc/macros.rb +204 -0
  88. data/lib/metanorma/standoc/macros_form.rb +63 -0
  89. data/lib/metanorma/standoc/macros_note.rb +45 -0
  90. data/lib/metanorma/standoc/macros_plantuml.rb +113 -0
  91. data/lib/metanorma/standoc/macros_terms.rb +181 -0
  92. data/lib/metanorma/standoc/ref.rb +243 -0
  93. data/lib/metanorma/standoc/ref_sect.rb +153 -0
  94. data/lib/{asciidoctor/standoc/ref_date_id.rb → metanorma/standoc/ref_utility.rb} +43 -5
  95. data/lib/metanorma/standoc/render.rb +115 -0
  96. data/lib/metanorma/standoc/reqt.rb +90 -0
  97. data/lib/{asciidoctor → metanorma}/standoc/reqt.rng +0 -0
  98. data/lib/metanorma/standoc/section.rb +209 -0
  99. data/lib/metanorma/standoc/table.rb +85 -0
  100. data/lib/metanorma/standoc/term_lookup_cleanup.rb +179 -0
  101. data/lib/metanorma/standoc/terms.rb +160 -0
  102. data/lib/metanorma/standoc/utils.rb +101 -0
  103. data/lib/metanorma/standoc/validate.rb +158 -0
  104. data/lib/metanorma/standoc/validate_section.rb +55 -0
  105. data/lib/metanorma/standoc/version.rb +1 -1
  106. data/lib/{asciidoctor → metanorma}/standoc/views/datamodel/model_representation.adoc.erb +0 -0
  107. data/lib/{asciidoctor → metanorma}/standoc/views/datamodel/plantuml_representation.adoc.erb +0 -0
  108. data/lib/metanorma-standoc.rb +1 -1
  109. data/metanorma-standoc.gemspec +1 -1
  110. data/spec/{asciidoctor → metanorma}/base_spec.rb +27 -10
  111. data/spec/{asciidoctor → metanorma}/blank_spec.rb +1 -1
  112. data/spec/{asciidoctor → metanorma}/blocks_spec.rb +1 -1
  113. data/spec/{asciidoctor → metanorma}/cleanup_blocks_spec.rb +1 -1
  114. data/spec/{asciidoctor → metanorma}/cleanup_sections_spec.rb +1 -1
  115. data/spec/{asciidoctor → metanorma}/cleanup_spec.rb +5 -5
  116. data/spec/{asciidoctor → metanorma}/cleanup_terms_spec.rb +2 -2
  117. data/spec/{asciidoctor → metanorma}/datamodel/attributes_table_preprocessor_spec.rb +1 -1
  118. data/spec/{asciidoctor → metanorma}/datamodel/diagram_preprocessor_spec.rb +1 -1
  119. data/spec/{asciidoctor → metanorma}/inline_spec.rb +1 -1
  120. data/spec/{asciidoctor → metanorma}/isobib_cache_spec.rb +1 -1
  121. data/spec/{asciidoctor → metanorma}/lists_spec.rb +1 -1
  122. data/spec/{asciidoctor → metanorma}/macros_json2text_spec.rb +0 -0
  123. data/spec/{asciidoctor → metanorma}/macros_plantuml_spec.rb +3 -3
  124. data/spec/{asciidoctor → metanorma}/macros_spec.rb +6 -6
  125. data/spec/{asciidoctor → metanorma}/macros_yaml2text_spec.rb +0 -0
  126. data/spec/metanorma/refs_dl_spec.rb +863 -0
  127. data/spec/{asciidoctor → metanorma}/refs_spec.rb +399 -25
  128. data/spec/{asciidoctor → metanorma}/section_spec.rb +42 -17
  129. data/spec/{asciidoctor → metanorma}/table_spec.rb +1 -1
  130. data/spec/{asciidoctor → metanorma}/validate_spec.rb +2 -2
  131. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +42 -42
  132. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec1.yml +11 -11
  133. data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
  134. data/spec/vcr_cassettes/isobib_get_123_1.yml +21 -21
  135. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +81 -81
  136. data/spec/vcr_cassettes/isobib_get_123_2001.yml +10 -10
  137. data/spec/vcr_cassettes/isobib_get_124.yml +11 -11
  138. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +13 -13
  139. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +46 -46
  140. metadata +82 -32
  141. data/spec/asciidoctor/refs_dl_spec.rb +0 -864
@@ -1,181 +1,3 @@
1
- require "csv"
1
+ require "asciidoctor/standoc/deprecated"
2
+ require "metanorma/standoc/macros_terms"
2
3
 
3
- module Asciidoctor
4
- module Standoc
5
- class PreferredTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
6
- use_dsl
7
- named :preferred
8
- parse_content_as :text
9
- using_format :short
10
-
11
- def process(parent, _target, attrs)
12
- out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
13
- %{<preferred><expression><name>#{out}</name></expression></preferred>}
14
- end
15
- end
16
-
17
- class AltTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
18
- use_dsl
19
- named :alt
20
- parse_content_as :text
21
- using_format :short
22
-
23
- def process(parent, _target, attrs)
24
- out = Asciidoctor::Inline.new(parent, :quoted,
25
- attrs["text"]).convert
26
- %{<admitted><expression><name>#{out}</name></expression></admitted>}
27
- end
28
- end
29
-
30
- class DeprecatedTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
31
- use_dsl
32
- named :deprecated
33
- parse_content_as :text
34
- using_format :short
35
-
36
- def process(parent, _target, attrs)
37
- out = Asciidoctor::Inline.new(parent, :quoted,
38
- attrs["text"]).convert
39
- %{<deprecates><expression><name>#{out}</name></expression></deprecates>}
40
- end
41
- end
42
-
43
- class DomainTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
44
- use_dsl
45
- named :domain
46
- parse_content_as :text
47
- using_format :short
48
-
49
- def process(parent, _target, attrs)
50
- out = Asciidoctor::Inline.new(parent, :quoted,
51
- attrs["text"]).convert
52
- %{<domain>#{out}</domain>}
53
- end
54
- end
55
-
56
- class TermRefInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
57
- use_dsl
58
- named :term
59
- name_positional_attributes "name", "termxref"
60
- using_format :short
61
-
62
- def process(_parent, _target, attrs)
63
- termref = attrs["termxref"] || attrs["name"]
64
- "<concept type='term'><termxref>#{attrs['name']}</termxref>"\
65
- "<renderterm>#{termref}</renderterm><xrefrender/></concept>"
66
- end
67
- end
68
-
69
- class SymbolRefInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
70
- use_dsl
71
- named :symbol
72
- name_positional_attributes "name", "termxref"
73
- using_format :short
74
-
75
- def process(_parent, _target, attrs)
76
- termref = attrs["termxref"] || attrs["name"]
77
- "<concept type='symbol'><termxref>#{attrs['name']}</termxref>"\
78
- "<renderterm>#{termref}</renderterm><xrefrender/></concept>"
79
- end
80
- end
81
-
82
- # Possibilities:
83
- # {{<<id>>, term}}
84
- # {{<<id>>, term, text}}
85
- # {{<<termbase:id>>, term}}
86
- # {{<<termbase:id>>, term, text}}
87
- # {{term}} equivalent to term:[term]
88
- # {{term, text}} equivalent to term:[term, text]
89
- # text may optionally be followed by crossreference-rendering, options=""
90
- class ConceptInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
91
- use_dsl
92
- named :concept
93
- match /\{\{(?<content>|.*?[^\\])\}\}/
94
- using_format :short
95
-
96
- def preprocess_attrs(target)
97
- m = /^(?<id>&lt;&lt;.+?&gt;&gt;)?(?<rest>.*)$/.match(target)
98
- ret = { id: m[:id]&.sub(/^&lt;&lt;/, "")&.sub(/&gt;&gt;$/, "") }
99
- if m2 = /^(?<rest>.*?)(?<opt>,opt(ion)?s=.+)$/
100
- .match(m[:rest].sub(/^,/, ""))
101
- ret[:opt] = CSV.parse_line(m2[:opt].sub(/^,opt(ion)?s=/, "")
102
- .sub(/^"(.+)"$/, "\\1").sub(/^'(.+)'$/, "\\1"))
103
- begin
104
- attrs = CSV.parse_line(m2[:rest]) || []
105
- rescue StandardError
106
- raise "error processing #{m2[:rest]} as CSV"
107
- end
108
- else
109
- begin
110
- attrs = CSV.parse_line(m[:rest].sub(/^,/, "")) || []
111
- rescue StandardError
112
- raise "error processing #{m[:rest]} as CSV"
113
- end
114
- end
115
- ret.merge(term: attrs[0], word: attrs[1] || attrs[0],
116
- render: attrs[2])
117
- end
118
-
119
- def generate_attrs(opts)
120
- ret = ""
121
- opts.include?("noital") and ret += " ital='false'"
122
- opts.include?("noref") and ret += " ref='false'"
123
- opts.include?("ital") and ret += " ital='true'"
124
- opts.include?("ref") and ret += " ref='true'"
125
- opts.include?("nolinkmention") and ret += " linkmention='false'"
126
- opts.include?("linkmention") and ret += " linkmention='true'"
127
- opts.include?("nolinkref") and ret += " linkref='false'"
128
- opts.include?("linkref") and ret += " linkref='true'"
129
- ret
130
- end
131
-
132
- def process(parent, target, _attrs)
133
- attrs = preprocess_attrs(target)
134
- term = Asciidoctor::Inline.new(parent, :quoted,
135
- attrs[:term]).convert
136
- word = Asciidoctor::Inline.new(parent, :quoted,
137
- attrs[:word]).convert
138
- xref = Asciidoctor::Inline.new(parent, :quoted,
139
- attrs[:render]).convert
140
- opt = generate_attrs(attrs[:opt] || [])
141
- if attrs[:id] then "<concept#{opt} key='#{attrs[:id]}'><refterm>"\
142
- "#{term}</refterm><renderterm>#{word}</renderterm>"\
143
- "<xrefrender>#{xref}</xrefrender></concept>"
144
- else "<concept#{opt}><termxref>#{term}</termxref><renderterm>"\
145
- "#{word}</renderterm><xrefrender>#{xref}</xrefrender></concept>"
146
- end
147
- rescue StandardError => e
148
- raise("processing {{#{target}}}: #{e.message}")
149
- end
150
- end
151
-
152
- # Possibilities:
153
- # related:relation[<<id>>, term]
154
- # related:relation[<<termbase:id>>, term]
155
- # related:relation[term] equivalent to a crossreference to term:[term]
156
- class RelatedTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
157
- use_dsl
158
- named :related
159
- parse_content_as :text
160
-
161
- def preprocess_attrs(target)
162
- m = /^(?<id>&lt;&lt;.+?&gt;&gt;, ?)?(?<rest>.*)$/.match(target)
163
- { id: m[:id]&.sub(/^&lt;&lt;/, "")&.sub(/&gt;&gt;, ?$/, ""),
164
- term: m[:rest] }
165
- end
166
-
167
- def process(parent, target, attrs)
168
- out = preprocess_attrs(attrs["text"])
169
- term = Asciidoctor::Inline.new(parent, :quoted,
170
- out[:term]).convert
171
- if out[:id] then "<related type='#{target}' key='#{out[:id]}'>"\
172
- "<refterm>#{term}</refterm></related>"
173
- else "<related type='#{target}'><termxref>#{term}</termxref>"\
174
- "<xrefrender>#{term}</xrefrender></related>"
175
- end
176
- rescue StandardError => e
177
- raise("processing related:#{target}[#{attrs['text']}]: #{e.message}")
178
- end
179
- end
180
- end
181
- end
@@ -1,251 +1,2 @@
1
- require_relative "ref_date_id"
2
-
3
- module Asciidoctor
4
- module Standoc
5
- module Refs
6
- def iso_publisher(bib, code)
7
- code.sub(/ .*$/, "").split("/").each do |abbrev|
8
- bib.contributor do |c|
9
- c.role **{ type: "publisher" }
10
- c.organization do |org|
11
- organization(org, abbrev, true)
12
- end
13
- end
14
- end
15
- end
16
-
17
- def plaintxt
18
- { format: "text/plain" }
19
- end
20
-
21
- def ref_attributes(match)
22
- { id: match[:anchor], type: "standard" }
23
- end
24
-
25
- def isorefrender1(bib, match, year, allp = "")
26
- bib.title(**plaintxt) { |i| i << ref_normalise(match[:text]) }
27
- docid(bib, match[:usrlbl]) if match[:usrlbl]
28
- docid(bib, id_and_year(match[:code], year) + allp)
29
- docnumber(bib, match[:code])
30
- end
31
-
32
- def isorefmatchescode(match)
33
- yr = norm_year(match[:year])
34
- { code: match[:code], year: yr, match: match,
35
- title: match[:text], usrlbl: match[:usrlbl],
36
- lang: (@lang || :all) }
37
- end
38
-
39
- def isorefmatchesout(item, xml)
40
- if item[:doc] then use_retrieved_relaton(item, xml)
41
- else
42
- xml.bibitem **attr_code(ref_attributes(item[:ref][:match])) do |t|
43
- isorefrender1(t, item[:ref][:match], item[:ref][:year])
44
- item[:ref][:year] and t.date **{ type: "published" } do |d|
45
- set_date_range(d, item[:ref][:year])
46
- end
47
- iso_publisher(t, item[:ref][:match][:code])
48
- end
49
- end
50
- end
51
-
52
- def isorefmatches2code(match)
53
- { code: match[:code], no_year: true,
54
- note: match[:fn], year: nil, match: match,
55
- title: match[:text], usrlbl: match[:usrlbl],
56
- lang: (@lang || :all) }
57
- end
58
-
59
- def isorefmatches2out(item, xml)
60
- if item[:doc] then use_retrieved_relaton(item, xml)
61
- else isorefmatches2_1(xml, item[:ref][:match])
62
- end
63
- end
64
-
65
- def isorefmatches2_1(xml, match)
66
- xml.bibitem **attr_code(ref_attributes(match)) do |t|
67
- isorefrender1(t, match, "--")
68
- t.date **{ type: "published" } do |d|
69
- d.on "--"
70
- end
71
- iso_publisher(t, match[:code])
72
- unless match[:fn].nil?
73
- t.note(**plaintxt.merge(type: "Unpublished-Status")) do |p|
74
- p << (match[:fn]).to_s
75
- end
76
- end
77
- end
78
- end
79
-
80
- def isorefmatches3code(match)
81
- yr = norm_year(match[:year])
82
- hasyr = !yr.nil? && yr != "--"
83
- { code: match[:code], match: match, yr: yr, hasyr: hasyr,
84
- year: hasyr ? yr : nil,
85
- all_parts: true, no_year: yr == "--",
86
- text: match[:text], usrlbl: match[:usrlbl],
87
- lang: (@lang || :all) }
88
- end
89
-
90
- def isorefmatches3out(item, xml)
91
- if item[:doc] then use_retrieved_relaton(item, xml)
92
- else
93
- isorefmatches3_1(xml, item[:ref][:match], item[:ref][:yr],
94
- item[:ref][:hasyr], item[:doc])
95
- end
96
- end
97
-
98
- def isorefmatches3_1(xml, match, yr, _hasyr, _ref)
99
- xml.bibitem(**attr_code(ref_attributes(match))) do |t|
100
- isorefrender1(t, match, yr, " (all parts)")
101
- conditional_date(t, match, yr == "--")
102
- iso_publisher(t, match[:code])
103
- if match.names.include?("fn") && match[:fn]
104
- t.note(**plaintxt.merge(type: "Unpublished-Status")) do |p|
105
- p << (match[:fn]).to_s
106
- end
107
- end
108
- t.extent **{ type: "part" } do |e|
109
- e.referenceFrom "all"
110
- end
111
- end
112
- end
113
-
114
- def refitem_render1(match, code, bib)
115
- if code[:type] == "path"
116
- bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), **{ type: "URI" }
117
- bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), **{ type: "citation" }
118
- end
119
- docid(bib, match[:usrlbl]) if match[:usrlbl]
120
- docid(bib, /^\d+$/.match?(code[:id]) ? "[#{code[:id]}]" : code[:id])
121
- code[:type] == "repo" and
122
- bib.docidentifier code[:key], **{ type: "repository" }
123
- end
124
-
125
- def refitem_render(xml, match, code)
126
- xml.bibitem **attr_code(id: match[:anchor]) do |t|
127
- t.formattedref **{ format: "application/x-isodoc+xml" } do |i|
128
- i << ref_normalise_no_format(match[:text])
129
- end
130
- refitem_render1(match, code, t)
131
- docnumber(t, code[:id]) unless /^\d+$|^\(.+\)$/.match?(code[:id])
132
- end
133
- end
134
-
135
- MALFORMED_REF = "no anchor on reference, markup may be malformed: see "\
136
- "https://www.metanorma.com/author/topics/document-format/bibliography/ , "\
137
- "https://www.metanorma.com/author/iso/topics/markup/#bibliographies".freeze
138
-
139
- # TODO: alternative where only title is available
140
- def refitemcode(item, node)
141
- m = NON_ISO_REF.match(item) and return refitem1code(item, m)
142
- @log.add("AsciiDoc Input", node, "#{MALFORMED_REF}: #{item}")
143
- {}
144
- end
145
-
146
- def refitem1code(_item, match)
147
- code = analyse_ref_code(match[:code])
148
- if (code[:id] && code[:numeric]) || code[:nofetch]
149
- { code: nil, match: match, analyse_code: code }
150
- else
151
- { code: code[:id], analyse_code: code,
152
- year: match.names.include?("year") ? match[:year] : nil,
153
- title: match[:text], match: match,
154
- usrlbl: match[:usrlbl], lang: (@lang || :all) }
155
- end
156
- end
157
-
158
- def refitemout(item, xml)
159
- return nil if item[:ref][:match].nil?
160
-
161
- item[:doc] or return refitem_render(xml, item[:ref][:match],
162
- item[:ref][:analyse_code])
163
- use_retrieved_relaton(item, xml)
164
- end
165
-
166
- def ref_normalise(ref)
167
- ref.gsub(/&amp;amp;/, "&amp;").gsub(%r{^<em>(.*)</em>}, "\\1")
168
- end
169
-
170
- def ref_normalise_no_format(ref)
171
- ref.gsub(/&amp;amp;/, "&amp;")
172
- end
173
-
174
- ISO_REF =
175
- %r{^<ref\sid="(?<anchor>[^"]+)">
176
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+|IEV)
177
- (:(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm.freeze
178
-
179
- ISO_REF_NO_YEAR =
180
- %r{^<ref\sid="(?<anchor>[^"]+)">
181
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+):
182
- (--|&\#821[12];)\]</ref>,?\s*
183
- (<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>)?,?\s?(?<text>.*)$}xm
184
- .freeze
185
-
186
- ISO_REF_ALL_PARTS =
187
- %r{^<ref\sid="(?<anchor>[^"]+)">
188
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9]+)
189
- (:(?<year>--|&\#821[12];|[0-9][0-9-]+))?\s
190
- \(all\sparts\)\]</ref>,?\s*
191
- (<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>,?\s?)?(?<text>.*)$}xm.freeze
192
-
193
- NON_ISO_REF = %r{^<ref\sid="(?<anchor>[^"]+)">
194
- \[(?<usrlbl>\([^)]+\))?(?<code>[^\]]+?)
195
- ([:-](?<year>(19|20)[0-9][0-9][0-9-]*))?\]</ref>,?\s*(?<text>.*)$}xm
196
- .freeze
197
-
198
- def reference1_matches(item)
199
- matched = ISO_REF.match item
200
- matched2 = ISO_REF_NO_YEAR.match item
201
- matched3 = ISO_REF_ALL_PARTS.match item
202
- [matched, matched2, matched3]
203
- end
204
-
205
- def reference1code(item, node)
206
- matched, matched2, matched3 = reference1_matches(item)
207
- if matched3.nil? && matched2.nil? && matched.nil?
208
- refitemcode(item, node).merge(process: 0)
209
- elsif !matched.nil? then isorefmatchescode(matched).merge(process: 1)
210
- elsif !matched2.nil? then isorefmatches2code(matched2).merge(process: 2)
211
- elsif !matched3.nil? then isorefmatches3code(matched3).merge(process: 3)
212
- end
213
- end
214
-
215
- def reference1out(item, xml)
216
- case item[:ref][:process]
217
- when 0 then refitemout(item, xml)
218
- when 1 then isorefmatchesout(item, xml)
219
- when 2 then isorefmatches2out(item, xml)
220
- when 3 then isorefmatches3out(item, xml)
221
- end
222
- end
223
-
224
- def reference_preproc(node)
225
- refs = node.items.each_with_object([]) do |b, m|
226
- m << reference1code(b.text, node)
227
- end
228
- results = refs.each_with_index.with_object(Queue.new) do |(ref, i), res|
229
- fetch_ref_async(ref.merge(ord: i), i, res)
230
- end
231
- [refs, results]
232
- end
233
-
234
- def reference(node)
235
- refs, results = reference_preproc(node)
236
- noko do |xml|
237
- ret = refs.each.with_object([]) do |_, m|
238
- ref, i, doc = results.pop
239
- m[i.to_i] = { ref: ref }
240
- if doc.is_a?(RelatonBib::RequestError)
241
- @log.add("Bibliography", nil, "Could not retrieve #{ref[:code]}: "\
242
- "no access to online site")
243
- else m[i.to_i][:doc] = doc
244
- end
245
- end
246
- ret.each { |b| reference1out(b, xml) }
247
- end.join
248
- end
249
- end
250
- end
251
- end
1
+ require "asciidoctor/standoc/deprecated"
2
+ require "metanorma/standoc/ref"
@@ -1,153 +1,2 @@
1
- module Asciidoctor
2
- module Standoc
3
- module Section
4
- def in_biblio?
5
- @biblio
6
- end
7
-
8
- def in_norm_ref?
9
- @norm_ref
10
- end
11
-
12
- def bibliography_parse(attrs, xml, node)
13
- x = biblio_prep(attrs, xml, node) and return x
14
- @biblio = true
15
- attrs = attrs.merge(normative: node.attr("normative") || false)
16
- xml.references **attr_code(attrs) do |xml_section|
17
- xml_section.title { |t| t << node.title }
18
- xml_section << node.content
19
- end
20
- @biblio = false
21
- end
22
-
23
- def bibitem_parse(attrs, xml, node)
24
- norm_ref = @norm_ref
25
- biblio = @biblio
26
- @biblio = false
27
- @norm_ref = false
28
- ret = clause_parse(attrs, xml, node)
29
- @biblio = biblio
30
- @norm_ref = norm_ref
31
- ret
32
- end
33
-
34
- def norm_ref_parse(attrs, xml, node)
35
- x = biblio_prep(attrs, xml, node) and return x
36
- @norm_ref = true
37
- attrs = attrs.merge(normative: node.attr("normative") || true)
38
- xml.references **attr_code(attrs) do |xml_section|
39
- xml_section.title { |t| t << node.title }
40
- xml_section << node.content
41
- end
42
- @norm_ref = false
43
- end
44
-
45
- def biblio_prep(attrs, xml, node)
46
- if node.option? "bibitem"
47
- bibitem_parse(attrs, xml, node)
48
- else
49
- node.attr("style") == "bibliography" or
50
- @log.add("AsciiDoc Input", node,
51
- "Section not marked up as [bibliography]!")
52
- nil
53
- end
54
- end
55
-
56
- def global_ievcache_name
57
- "#{Dir.home}/.iev/cache"
58
- end
59
-
60
- def local_ievcache_name(cachename)
61
- return nil if cachename.nil?
62
-
63
- cachename += "_iev" unless cachename.empty?
64
- cachename = "iev" if cachename.empty?
65
- "#{cachename}/cache"
66
- end
67
-
68
- def fetch_ref(xml, code, year, **opts)
69
- return nil if opts[:no_year]
70
-
71
- code = code.sub(/^\([^)]+\)/, "")
72
- hit = @bibdb&.fetch(code, year, opts)
73
- return nil if hit.nil?
74
-
75
- xml.parent.add_child(smart_render_xml(hit, code, opts))
76
- xml
77
- rescue RelatonBib::RequestError
78
- @log.add("Bibliography", nil, "Could not retrieve #{code}: "\
79
- "no access to online site")
80
- nil
81
- end
82
-
83
- def fetch_ref_async(ref, idx, res)
84
- if ref[:code].nil? || ref[:no_year] || @bibdb.nil?
85
- res << [ref, idx, nil]
86
- else
87
- @bibdb.fetch_async(ref[:code], ref[:year], ref) do |doc|
88
- res << [ref, idx, doc]
89
- end
90
- end
91
- end
92
-
93
- def emend_biblio(xml, code, title, usrlbl)
94
- unless xml.at("/bibitem/docidentifier[not(@type = 'DOI')][text()]")
95
- @log.add("Bibliography", nil,
96
- "ERROR: No document identifier retrieved for #{code}")
97
- xml.root << "<docidentifier>#{code}</docidentifier>"
98
- end
99
- unless xml.at("/bibitem/title[text()]")
100
- @log.add("Bibliography", nil,
101
- "ERROR: No title retrieved for #{code}")
102
- xml.root << "<title>#{title || '(MISSING TITLE)'}</title>"
103
- end
104
- usrlbl and xml.at("/bibitem/docidentifier").next =
105
- "<docidentifier type='metanorma'>#{mn_code(usrlbl)}</docidentifier>"
106
- end
107
-
108
- def smart_render_xml(xml, code, opts)
109
- xml.respond_to? :to_xml or return nil
110
- xml = Nokogiri::XML(xml.to_xml(lang: opts[:lang]))
111
- emend_biblio(xml, code, opts[:title], opts[:usrlbl])
112
- xml.xpath("//date").each { |d| Metanorma::Utils::endash_date(d) }
113
- xml.traverse do |n|
114
- n.text? and n.replace(Metanorma::Utils::smartformat(n.text))
115
- end
116
- xml.to_xml.sub(/<\?[^>]+>/, "")
117
- end
118
-
119
- def use_retrieved_relaton(item, xml)
120
- xml.parent.add_child(smart_render_xml(item[:doc], item[:ref][:code],
121
- item[:ref]))
122
- use_my_anchor(xml, item[:ref][:match][:anchor])
123
- end
124
-
125
- def init_bib_caches(node)
126
- return if @no_isobib
127
-
128
- global = !@no_isobib_cache && !node.attr("local-cache-only")
129
- local = node.attr("local-cache") || node.attr("local-cache-only")
130
- local = nil if @no_isobib_cache
131
- @bibdb = Relaton::DbCache.init_bib_caches(
132
- local_cache: local,
133
- flush_caches: node.attr("flush-caches"),
134
- global_cache: global,
135
- )
136
- end
137
-
138
- def init_iev_caches(node)
139
- unless @no_isobib_cache || @no_isobib
140
- node.attr("local-cache-only") or
141
- @iev_globalname = global_ievcache_name
142
- @iev_localname = local_ievcache_name(node.attr("local-cache") ||
143
- node.attr("local-cache-only"))
144
- if node.attr("flush-caches")
145
- FileUtils.rm_f @iev_globalname unless @iev_globalname.nil?
146
- FileUtils.rm_f @iev_localname unless @iev_localname.nil?
147
- end
148
- end
149
- # @iev = Iev::Db.new(globalname, localname) unless @no_isobib
150
- end
151
- end
152
- end
153
- end
1
+ require "asciidoctor/standoc/deprecated"
2
+ require "metanorma/standoc/ref_sect"
@@ -0,0 +1,2 @@
1
+ require "asciidoctor/standoc/deprecated"
2
+ require "metanorma/standoc/ref_utility"