metanorma-standoc 1.4.4 → 1.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 841be88451455a61d53e89d5c557c57f1769372d878c5200826136dae8d62cfd
4
- data.tar.gz: b922c30fbd44544dda7ee63a4090d672030f2af570861b500dcd3e8f205497d3
3
+ metadata.gz: 76c3b117ea592275339f9ee8103f17645d9675f45635abfbc8e5333fc512af1c
4
+ data.tar.gz: a345b19a2657f356225f2087e17a7dba7bd4720389cf44487892d3f1e1bc5345
5
5
  SHA512:
6
- metadata.gz: cd2d8b314061fb9c108b6e7568ee9dc65ce81180e955961d593bcaf17081b0e8e7c3e22c8d132ce57c0f5c698869347ff35fd7b56b62d0d1ee34b6c8877a462c
7
- data.tar.gz: 7e501083f23311f0b8a8b22eeaf8ec2990d39bc442fe76882b9172bb9bfafc44d273f1485ae0a9117006ba508beff735857194fdf0a49d8eb80deaf902b3a433
6
+ metadata.gz: 630d1159cc78920d3bab3e73a2577b54d00bb966b0faa15166ff1af832656ab985e55f8fa830d40a2fbec96a8cf8555880f89f0e73d749dc73540e6cd8303469
7
+ data.tar.gz: f3c46604bb69f1e34eb8b2af182e198e99a6f2cae3bce808a9547e096b1852b4868c00a8522370a52c92ad5f263ab2f7e5ee348196fffbe1084ef1c666900080
@@ -5,6 +5,6 @@
5
5
  inherit_from:
6
6
  - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
7
7
  AllCops:
8
- TargetRubyVersion: 2.3
8
+ TargetRubyVersion: 2.6
9
9
  Rails:
10
10
  Enabled: true
@@ -111,9 +111,10 @@ module Asciidoctor
111
111
  @log = Asciidoctor::Standoc::Log.new
112
112
  init_bib_caches(node)
113
113
  init_iev_caches(node)
114
- lang = (node.attr("language") || "en")
115
- script = (node.attr("script") || "en")
116
- i18n_init(lang, script)
114
+ @lang = (node.attr("language") || "en")
115
+ @script = (node.attr("script") || "Latn")
116
+ @isodoc = isodoc(@lang, @script, node.attr("i18nyaml"))
117
+ @i18n = @isodoc.i18n
117
118
  end
118
119
 
119
120
  def default_fonts(node)
@@ -2,25 +2,25 @@ module Asciidoctor
2
2
  module Standoc
3
3
  module Cleanup
4
4
  def external_terms_boilerplate(sources)
5
- IsoDoc::Function::I18n::l10n(
6
- @external_terms_boilerplate.gsub(/%/, sources || "???"),
5
+ @i18n.l10n(
6
+ @i18n.external_terms_boilerplate.gsub(/%/, sources || "???"),
7
7
  @lang, @script)
8
8
  end
9
9
 
10
10
  def internal_external_terms_boilerplate(sources)
11
- IsoDoc::Function::I18n::l10n(
12
- @internal_external_terms_boilerplate.gsub(/%/, sources || "??"),
11
+ @i18n.l10n(
12
+ @i18n.internal_external_terms_boilerplate.gsub(/%/, sources || "??"),
13
13
  @lang, @script)
14
14
  end
15
15
 
16
16
  def term_defs_boilerplate(div, source, term, preface, isodoc)
17
- div.next = @term_def_boilerplate
17
+ a = @i18n.term_def_boilerplate and div.next = a
18
18
  source.each do |s|
19
19
  @anchors[s["bibitemid"]] or
20
20
  @log.add("Crossreferences", nil, "term source #{s['bibitemid']} not referenced")
21
21
  end
22
22
  if source.empty? && term.nil?
23
- div.next = @no_terms_boilerplate
23
+ div.next = @i18n.no_terms_boilerplate
24
24
  else
25
25
  div.next = term_defs_boilerplate_cont(source, term, isodoc)
26
26
  end
@@ -30,7 +30,7 @@ module Asciidoctor
30
30
  sources = isodoc.sentence_join(src.map do |s|
31
31
  %{<eref bibitemid="#{s['bibitemid']}"/>}
32
32
  end)
33
- if src.empty? then @internal_terms_boilerplate
33
+ if src.empty? then @i18n.internal_terms_boilerplate
34
34
  elsif term.nil? then external_terms_boilerplate(sources)
35
35
  else
36
36
  internal_external_terms_boilerplate(sources)
@@ -42,7 +42,7 @@ module Asciidoctor
42
42
  ["reference", "bibitem"].include? e.name
43
43
  end
44
44
  f.at("./title").next =
45
- "<p>#{(refs.empty? ? @norm_empty_pref : @norm_with_refs_pref)}</p>"
45
+ "<p>#{(refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref)}</p>"
46
46
  end
47
47
 
48
48
  TERM_CLAUSE = "//sections/terms | "\
@@ -54,13 +54,9 @@ module Asciidoctor
54
54
  x = xmldoc.dup
55
55
  x.root.add_namespace(nil, self.class::XML_NAMESPACE)
56
56
  xml = Nokogiri::XML(x.to_xml)
57
- conv = html_converter(EmptyAttr.new)
58
- @lang = xmldoc&.at("//bibdata/language")&.text
59
- @script = xmldoc&.at("//bibdata/script")&.text
60
- conv.i18n_init(@lang, @script)
61
- conv.metadata_init(@lang, @script, conv.labels)
62
- conv.info(xml, nil)
63
- conv
57
+ @isodoc ||= isodoc(@lang, @script)
58
+ @isodoc.info(xml, nil)
59
+ @isodoc
64
60
  end
65
61
 
66
62
  def boilerplate_cleanup(xmldoc)
@@ -83,15 +79,6 @@ module Asciidoctor
83
79
  preface.previous = b
84
80
  end
85
81
 
86
- class EmptyAttr
87
- def attr(_x)
88
- nil
89
- end
90
- def attributes
91
- {}
92
- end
93
- end
94
-
95
82
  def boilerplate_file(xmldoc)
96
83
  File.join(@libdir, "boilerplate.xml")
97
84
  end
@@ -39,6 +39,7 @@ module Asciidoctor
39
39
  dupabstract.traverse { |n| n.remove_attribute("id") }
40
40
  dupabstract.remove_attribute("language")
41
41
  dupabstract.remove_attribute("script")
42
+ dupabstract&.at("./title")&.remove
42
43
  bibabstract.next = dupabstract
43
44
  end
44
45
  end
@@ -105,6 +106,7 @@ module Asciidoctor
105
106
  def sections_cleanup(x)
106
107
  sections_order_cleanup(x)
107
108
  sections_level_cleanup(x)
109
+ sections_names_cleanup(x)
108
110
  end
109
111
 
110
112
  def obligations_cleanup(x)
@@ -118,15 +120,15 @@ module Asciidoctor
118
120
  (s = x.at("//introduction")) && s["obligation"] = "informative"
119
121
  (s = x.at("//acknowledgements")) && s["obligation"] = "informative"
120
122
  x.xpath("//references").each { |r| r["obligation"] = "informative" }
121
- x.xpath("//preface//clause").each { |r| r["obligation"] = "informative" }
123
+ x.xpath("//preface//clause").each do |r|
124
+ r["obligation"] = "informative"
125
+ end
122
126
  end
123
127
 
124
128
  def obligations_cleanup_norm(x)
125
- (s = x.at("//clause[title = 'Scope']")) && s["obligation"] = "normative"
126
- (s = x.at("//clause[title = 'Symbols and Abbreviated Terms']")) &&
127
- s["obligation"] = "normative"
129
+ (s = x.at("//clause[@type = 'scope']")) && s["obligation"] = "normative"
128
130
  x.xpath("//terms").each { |r| r["obligation"] = "normative" }
129
- x.xpath("//symbols-abbrevs").each { |r| r["obligation"] = "normative" }
131
+ x.xpath("//definitions").each { |r| r["obligation"] = "normative" }
130
132
  end
131
133
 
132
134
  def obligations_cleanup_inherit(x)
@@ -149,6 +151,71 @@ module Asciidoctor
149
151
  ins.previous = x.remove
150
152
  end
151
153
  end
154
+
155
+ def get_or_make_title(node)
156
+ unless node.at("./title")
157
+ if node.children.empty?
158
+ node << "<title/>"
159
+ else
160
+ node.children.first.previous = "<title/>"
161
+ end
162
+ end
163
+ node.at("./title")
164
+ end
165
+
166
+ def replace_title(doc, xpath, text, first = false)
167
+ return unless text
168
+ doc.xpath(xpath).each_with_index do |node, i|
169
+ next if first && !i.zero?
170
+ title = get_or_make_title(node)
171
+ fn = title.xpath("./fn")
172
+ fn.each { |n| n.remove }
173
+ title.content = text
174
+ fn.each { |n| title << n }
175
+ end
176
+ end
177
+
178
+ def sections_names_cleanup(x)
179
+ replace_title(x, "//clause[@type = 'scope']", @i18n&.scope)
180
+ replace_title(x, "//preface//abstract", @i18n&.abstract)
181
+ replace_title(x, "//foreword", @i18n&.foreword)
182
+ replace_title(x, "//introduction", @i18n&.introduction)
183
+ replace_title(x, "//acknowledgements", @i18n&.acknowledgements)
184
+ section_names_refs_cleanup(x)
185
+ section_names_terms_cleanup(x)
186
+ end
187
+
188
+ def section_names_refs_cleanup(x)
189
+ replace_title(x, "//references[@normative = 'true']",
190
+ @i18n&.normref, true)
191
+ replace_title(x, "//references[@normative = 'false']",
192
+ @i18n&.bibliography, true)
193
+ end
194
+
195
+ NO_SYMABBR = "[.//definitions[not(@type)]]"
196
+ SYMABBR = "[.//definitions[@type = 'symbols']"\
197
+ "[@type = 'abbreviated_terms']]".freeze
198
+ SYMnoABBR = "[.//definitions[@type = 'symbols']"\
199
+ "[not(@type = 'abbreviated_terms')]]".freeze
200
+ ABBRnoSYM = "[.//definitions[not(@type = 'symbols')]"\
201
+ "[@type = 'abbreviated_terms']]".freeze
202
+
203
+ def section_names_terms_cleanup(x)
204
+ replace_title(x, "//definitions[@type = 'symbols']", @i18n&.symbols)
205
+ replace_title(x, "//definitions[@type = 'abbreviated_terms']", @i18n&.abbrev)
206
+ replace_title(x, "//definitions[not(@type)]", @i18n&.symbolsabbrev)
207
+ replace_title(x, "//terms#{SYMnoABBR} | //clause[.//terms]#{SYMnoABBR}",
208
+ @i18n&.termsdefsymbols, true)
209
+ replace_title(x, "//terms#{ABBRnoSYM} | //clause[.//terms]#{ABBRnoSYM}",
210
+ @i18n&.termsdefabbrev, true)
211
+ replace_title(x, "//terms#{SYMABBR} | //clause[.//terms]#{SYMABBR}",
212
+ @i18n&.termsdefsymbolsabbrev, true)
213
+ replace_title(x, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
214
+ @i18n&.termsdefsymbolsabbrev, true)
215
+ replace_title(
216
+ x, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
217
+ @i18n&.termsdef, true)
218
+ end
152
219
  end
153
220
  end
154
221
  end
@@ -76,6 +76,15 @@ module Asciidoctor
76
76
  end
77
77
  end
78
78
 
79
+ def termnote_example_cleanup(xmldoc)
80
+ xmldoc.xpath("//termnote[not(ancestor::term)]").each do |x|
81
+ x.name = "note"
82
+ end
83
+ xmldoc.xpath("//termexample[not(ancestor::term)]").each do |x|
84
+ x.name = "note"
85
+ end
86
+ end
87
+
79
88
  def termdef_cleanup(xmldoc)
80
89
  termdef_from_termbase(xmldoc)
81
90
  termdef_unnest_cleanup(xmldoc)
@@ -83,6 +92,7 @@ module Asciidoctor
83
92
  termdomain_cleanup(xmldoc)
84
93
  termdefinition_cleanup(xmldoc)
85
94
  termdomain1_cleanup(xmldoc)
95
+ termnote_example_cleanup(xmldoc)
86
96
  termdef_boilerplate_cleanup(xmldoc)
87
97
  termdef_subclause_cleanup(xmldoc)
88
98
  term_children_cleanup(xmldoc)
@@ -11,7 +11,6 @@ require "asciidoctor/standoc/table"
11
11
  require "asciidoctor/standoc/validate"
12
12
  require "asciidoctor/standoc/utils"
13
13
  require "asciidoctor/standoc/cleanup"
14
- require "asciidoctor/standoc/i18n"
15
14
  require "asciidoctor/standoc/reqt"
16
15
  require_relative "./macros.rb"
17
16
  require_relative "./log.rb"
@@ -48,7 +47,6 @@ module Asciidoctor
48
47
  include ::Asciidoctor::Standoc::Section
49
48
  include ::Asciidoctor::Standoc::Table
50
49
  include ::Asciidoctor::Standoc::Utils
51
- include ::Asciidoctor::Standoc::I18n
52
50
  include ::Asciidoctor::Standoc::Cleanup
53
51
  include ::Asciidoctor::Standoc::Validate
54
52
 
@@ -922,6 +922,9 @@
922
922
  <optional>
923
923
  <attribute name="script"/>
924
924
  </optional>
925
+ <optional>
926
+ <attribute name="type"/>
927
+ </optional>
925
928
  <optional>
926
929
  <attribute name="obligation">
927
930
  <choice>
@@ -961,9 +964,6 @@
961
964
  </define>
962
965
  <define name="content-subsection">
963
966
  <element name="clause">
964
- <optional>
965
- <attribute name="type"/>
966
- </optional>
967
967
  <ref name="Content-Section"/>
968
968
  </element>
969
969
  </define>
@@ -992,6 +992,9 @@
992
992
  </choice>
993
993
  </attribute>
994
994
  </optional>
995
+ <optional>
996
+ <attribute name="type"/>
997
+ </optional>
995
998
  <optional>
996
999
  <ref name="section-title"/>
997
1000
  </optional>
@@ -1011,9 +1014,6 @@
1011
1014
  </define>
1012
1015
  <define name="clause">
1013
1016
  <element name="clause">
1014
- <optional>
1015
- <attribute name="type"/>
1016
- </optional>
1017
1017
  <ref name="Clause-Section"/>
1018
1018
  </element>
1019
1019
  </define>
@@ -1042,6 +1042,9 @@
1042
1042
  </choice>
1043
1043
  </attribute>
1044
1044
  </optional>
1045
+ <optional>
1046
+ <attribute name="type"/>
1047
+ </optional>
1045
1048
  <optional>
1046
1049
  <ref name="section-title"/>
1047
1050
  </optional>
@@ -1180,6 +1183,9 @@
1180
1183
  <optional>
1181
1184
  <attribute name="script"/>
1182
1185
  </optional>
1186
+ <optional>
1187
+ <attribute name="type"/>
1188
+ </optional>
1183
1189
  <optional>
1184
1190
  <attribute name="obligation">
1185
1191
  <choice>
@@ -61,10 +61,10 @@ module Asciidoctor
61
61
  end
62
62
 
63
63
  def isorefrender1(t, m, yr, allp = "")
64
- t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
65
- docid(t, m[:usrlbl]) if m[:usrlbl]
66
- docid(t, id_and_year(m[:code], yr) + allp)
67
- docnumber(t, m[:code])
64
+ t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
65
+ docid(t, m[:usrlbl]) if m[:usrlbl]
66
+ docid(t, id_and_year(m[:code], yr) + allp)
67
+ docnumber(t, m[:code])
68
68
  end
69
69
 
70
70
  def isorefmatches(xml, m)
@@ -106,15 +106,16 @@ module Asciidoctor
106
106
 
107
107
  def isorefmatches3(xml, m)
108
108
  yr = norm_year(m[:year])
109
- hasyr = m.names.include?("year") && yr != "--"
110
- noyr = m.names.include?("year") && yr == "--"
111
- ref = fetch_ref xml, m[:code], hasyr ? yr : nil,
112
- all_parts: true, no_year: noyr, text: m[:text], usrlbl: m[:usrlbl]
109
+ #hasyr = m.names.include?("year") && yr != "--"
110
+ hasyr = !yr.nil? && yr != "--"
111
+ #noyr = m.names.include?("year") && yr == "--"
112
+ ref = fetch_ref xml, m[:code], hasyr ? yr : nil, all_parts: true,
113
+ no_year: yr == "--", text: m[:text], usrlbl: m[:usrlbl]
113
114
  return use_my_anchor(ref, m[:anchor]) if ref
114
115
 
115
116
  xml.bibitem(**attr_code(ref_attributes(m))) do |t|
116
117
  isorefrender1(t, m, yr, " (all parts)")
117
- conditional_date(t, m, noyr)
118
+ conditional_date(t, m, yr == "--")
118
119
  iso_publisher(t, m[:code])
119
120
  m.names.include?("fn") && m[:fn] and
120
121
  t.note(**plaintxt.merge(type: "ISO DATE")) { |p| p << "#{m[:fn]}" }
@@ -150,32 +151,30 @@ module Asciidoctor
150
151
  "https://www.metanorma.com/author/iso/topics/markup/#bibliographies".freeze
151
152
 
152
153
  def analyse_ref_nofetch(ret)
153
- if m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
154
- ret[:id] = m[:id]
155
- ret[:nofetch] = true
156
- end
154
+ return ret unless m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
155
+ ret[:id] = m[:id]
156
+ ret[:nofetch] = true
157
157
  ret
158
158
  end
159
-
159
+
160
160
  def analyse_ref_repo_path(ret)
161
- if m = /^(?<type>repo|path):\((?<key>[^,]+),(?<id>.+)\)$/.match(ret[:id])
162
- ret[:id] = m[:id]
163
- ret[:type] = m[:type]
164
- ret[:key] = m[:key]
165
- ret[:nofetch] = true
166
- end
167
- ret
161
+ return ret unless m =
162
+ /^(?<type>repo|path):\((?<key>[^,]+),(?<id>.+)\)$/.match(ret[:id])
163
+ ret[:id] = m[:id]
164
+ ret[:type] = m[:type]
165
+ ret[:key] = m[:key]
166
+ ret[:nofetch] = true
167
+ ret
168
168
  end
169
169
 
170
170
  def analyse_ref_numeric(ret)
171
- if /^\d+$/.match(ret[:id])
172
- ret[:numeric] = true
173
- end
171
+ return ret unless /^\d+$/.match(ret[:id])
172
+ ret[:numeric] = true
174
173
  ret
175
174
  end
176
175
 
177
176
  # ref id = (usrlbl)code[:-]year
178
- # code = nofetch(code) | (repo|path):(key,code) | \[? number \]? | identifier
177
+ # code = nofetch(code) | (repo|path):(key,code) | \[? number \]? | ident
179
178
  def analyse_ref_code(code)
180
179
  ret = {id: code}
181
180
  return ret if code.nil? || code.empty?
@@ -13,9 +13,13 @@ module Asciidoctor
13
13
  @term_def
14
14
  end
15
15
 
16
- def sectiontype(node, level = true)
17
- ret = node&.attr("heading")&.downcase ||
16
+ def sectiontype1(node)
17
+ node&.attr("heading")&.downcase ||
18
18
  node.title.gsub(/<[^>]+>/, "").downcase
19
+ end
20
+
21
+ def sectiontype(node, level = true)
22
+ ret = sectiontype1(node)
19
23
  ret1 = sectiontype_streamline(ret)
20
24
  return ret1 if "symbols and abbreviated terms" == ret1
21
25
  return nil unless !level || node.level == 1
@@ -61,16 +65,18 @@ module Asciidoctor
61
65
  case sectiontype(node)
62
66
  when "introduction" then introduction_parse(a, xml, node)
63
67
  when "foreword" then foreword_parse(a, xml, node)
68
+ when "scope" then scope_parse(a, xml, node)
64
69
  when "normative references" then norm_ref_parse(a, xml, node)
65
70
  when "terms and definitions"
66
71
  @term_def = true
67
72
  term_def_parse(a, xml, node, true)
68
73
  @term_def = false
69
74
  when "symbols and abbreviated terms"
70
- symbols_parse(a, xml, node)
75
+ symbols_parse(symbols_attrs(node, a), xml, node)
71
76
  when "acknowledgements"
72
77
  acknowledgements_parse(a, xml, node)
73
- when "bibliography" then bibliography_parse(a, xml, node)
78
+ when "bibliography"
79
+ bibliography_parse(a, xml, node)
74
80
  else
75
81
  if @term_def then term_def_subclause_parse(a, xml, node)
76
82
  elsif @definitions then symbols_parse(a, xml, node)
@@ -106,7 +112,7 @@ module Asciidoctor
106
112
  def preamble(node)
107
113
  noko do |xml|
108
114
  xml.foreword **attr_code(section_attributes(node)) do |xml_abstract|
109
- xml_abstract.title { |t| t << (node.blocks[0].title || "Foreword") }
115
+ xml_abstract.title { |t| t << (node.blocks[0].title || @i18n.foreword) }
110
116
  content = node.content
111
117
  xml_abstract << content
112
118
  end
@@ -119,6 +125,10 @@ module Asciidoctor
119
125
  end
120
126
  end
121
127
 
128
+ def scope_parse(attrs, xml, node)
129
+ clause_parse(attrs.merge(type: "scope"), xml, node)
130
+ end
131
+
122
132
  def clause_parse(attrs, xml, node)
123
133
  attrs["inline-header".to_sym] = node.option? "inline-header"
124
134
  attrs[:bibitem] = true if node.option? "bibitem"
@@ -145,6 +155,15 @@ module Asciidoctor
145
155
  @definitions = true
146
156
  end
147
157
 
158
+ def symbols_attrs(node, a)
159
+ case sectiontype1(node)
160
+ when "symbols" then a.merge(type: "symbols")
161
+ when "abbreviated terms", "abbreviations" then a.merge(type: "abbreviated_terms")
162
+ else
163
+ a
164
+ end
165
+ end
166
+
148
167
  def symbols_parse(attr, xml, node)
149
168
  node.role == "nonterm" and return nonterm_symbols_parse(attr, xml, node)
150
169
  xml.definitions **attr_code(attr) do |xml_section|
@@ -159,9 +178,6 @@ module Asciidoctor
159
178
  end
160
179
  end
161
180
 
162
- SYMBOLS_TITLES = ["symbols and abbreviated terms", "symbols",
163
- "abbreviated terms"].freeze
164
-
165
181
  def nonterm_term_def_subclause_parse(attrs, xml, node)
166
182
  @term_def = false
167
183
  clause_parse(attrs, xml, node)
@@ -190,23 +206,9 @@ module Asciidoctor
190
206
  end
191
207
  end
192
208
 
193
- def term_def_title(toplevel, node)
194
- return node.title unless toplevel
195
- sub = node.find_by(context: :section) do |s|
196
- SYMBOLS_TITLES.include? s.title.downcase
197
- end
198
- return "Terms and definitions" if sub.empty?
199
- sym = /symbol/i.match(node.title)
200
- abbrev = /abbreviat/i.match(node.title)
201
- sym && abbrev and return "Terms, definitions, symbols and abbreviated terms"
202
- sym and return "Terms, definitions and symbols"
203
- abbrev and return "Terms, definitions and abbreviated terms"
204
- "Terms, definitions, symbols and abbreviated terms"
205
- end
206
-
207
209
  def term_def_parse(attrs, xml, node, toplevel)
208
210
  xml.terms **attr_code(attrs) do |section|
209
- section.title { |t| t << term_def_title(toplevel, node) }
211
+ section.title { |t| t << node.title }
210
212
  (s = node.attr("source")) && s.split(/,/).each do |s1|
211
213
  section.termdocsource(nil, **attr_code(bibitemid: s1))
212
214
  end
@@ -216,7 +218,7 @@ module Asciidoctor
216
218
 
217
219
  def introduction_parse(attrs, xml, node)
218
220
  xml.introduction **attr_code(attrs) do |xml_section|
219
- xml_section.title { |t| t << "Introduction" }
221
+ xml_section.title { |t| t << @i18n.introduction }
220
222
  content = node.content
221
223
  xml_section << content
222
224
  end
@@ -232,7 +234,7 @@ module Asciidoctor
232
234
 
233
235
  def acknowledgements_parse(attrs, xml, node)
234
236
  xml.acknowledgements **attr_code(attrs) do |xml_section|
235
- xml_section.title { |t| t << node.title || "Acknowledgements" }
237
+ xml_section.title { |t| t << node.title || @i18n.acknowledgements }
236
238
  content = node.content
237
239
  xml_section << content
238
240
  end