isodoc 1.6.4 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.rubocop.yml +1 -1
  4. data/isodoc.gemspec +2 -1
  5. data/lib/isodoc-yaml/i18n-ar.yaml +19 -25
  6. data/lib/isodoc-yaml/i18n-de.yaml +1 -0
  7. data/lib/isodoc-yaml/i18n-en.yaml +2 -0
  8. data/lib/isodoc-yaml/i18n-es.yaml +1 -0
  9. data/lib/isodoc-yaml/i18n-fr.yaml +2 -0
  10. data/lib/isodoc-yaml/i18n-ru.yaml +1 -0
  11. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +2 -0
  12. data/lib/isodoc/convert.rb +4 -2
  13. data/lib/isodoc/function/blocks.rb +6 -5
  14. data/lib/isodoc/function/references.rb +33 -52
  15. data/lib/isodoc/function/section.rb +0 -1
  16. data/lib/isodoc/function/table.rb +21 -22
  17. data/lib/isodoc/function/terms.rb +6 -7
  18. data/lib/isodoc/gem_tasks.rb +8 -9
  19. data/lib/isodoc/html_convert.rb +5 -1
  20. data/lib/isodoc/html_function/comments.rb +12 -12
  21. data/lib/isodoc/html_function/html.rb +2 -2
  22. data/lib/isodoc/html_function/postprocess.rb +195 -185
  23. data/lib/isodoc/html_function/sectionsplit.rb +244 -0
  24. data/lib/isodoc/metadata.rb +22 -20
  25. data/lib/isodoc/metadata_contributor.rb +31 -28
  26. data/lib/isodoc/presentation_function/bibdata.rb +7 -0
  27. data/lib/isodoc/presentation_function/block.rb +7 -4
  28. data/lib/isodoc/presentation_function/inline.rb +7 -12
  29. data/lib/isodoc/presentation_function/section.rb +38 -1
  30. data/lib/isodoc/presentation_xml_convert.rb +2 -0
  31. data/lib/isodoc/version.rb +1 -1
  32. data/lib/isodoc/xref.rb +10 -7
  33. data/lib/isodoc/xref/xref_anchor.rb +45 -44
  34. data/lib/isodoc/xref/xref_counter.rb +113 -103
  35. data/lib/isodoc/xref/xref_gen.rb +39 -11
  36. data/spec/isodoc/blocks_spec.rb +184 -447
  37. data/spec/isodoc/cleanup_spec.rb +40 -42
  38. data/spec/isodoc/i18n_spec.rb +694 -821
  39. data/spec/isodoc/inline_spec.rb +197 -208
  40. data/spec/isodoc/metadata_spec.rb +384 -379
  41. data/spec/isodoc/postproc_spec.rb +121 -30
  42. data/spec/isodoc/presentation_xml_spec.rb +4 -4
  43. data/spec/isodoc/ref_spec.rb +5 -5
  44. data/spec/isodoc/section_spec.rb +216 -199
  45. data/spec/isodoc/sectionsplit_spec.rb +190 -0
  46. data/spec/isodoc/table_spec.rb +41 -42
  47. data/spec/isodoc/terms_spec.rb +1 -1
  48. data/spec/isodoc/xref_spec.rb +684 -1020
  49. metadata +19 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c36b5db70dc3eb379ad1f903a8707b7c9403474e55f0fe99b9218536d0651c9a
4
- data.tar.gz: 33e3a3e805b97042ac336754d43c47162e0d3e8851649514c20e4d5ede0301c0
3
+ metadata.gz: e07a78782a0c09a2c70525f1d7d4b8f5d34ea8d731c3dbc5860b7386250c1e56
4
+ data.tar.gz: bb3ddf0e119c8cf4b4d25c70ba381dba043020c132edd13fc4934bb08871594e
5
5
  SHA512:
6
- metadata.gz: 7ec36b6afb9cdb96291f75a78740d5cd555d898fa9bce309904a7ac54408c8ad90f2f4dcb5fe5e97aeb08526f6659d317a42537466801f9abbc4735b8fa23a39
7
- data.tar.gz: ffb1143efd27cf641cc9b336b9ff538bb6c6c5153cdc351f0e9edb8f4c7f029793267b47caa5682e9ce886ac9e30ea7c0601d1b91eca88a62f92ccb675294fc5
6
+ metadata.gz: ba808db07e817492e8ceb891771ec1df67f8d4dfab34896eb2eca9accd45ccf110745a5844276e52f1f20c6542cf1d33fdaad816ea3ce0ff264465bd4f4c8d4c
7
+ data.tar.gz: 0124e13883ab5d0c5f0561c62b924920ae0d73bc4980024f77336a4aed919d175c0f51a464e3574f910ea77ba15bccbf0d86c7e14707a6f4b7bf038ff7f1d80a
@@ -16,7 +16,7 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: [ '3.0', '2.7', '2.6', '2.5', '2.4' ]
19
+ ruby: [ '3.0', '2.7', '2.6', '2.5' ]
20
20
  os: [ ubuntu-latest, windows-latest, macos-latest ]
21
21
  experimental: [ false ]
22
22
  steps:
data/.rubocop.yml CHANGED
@@ -7,4 +7,4 @@ inherit_from:
7
7
  # ...
8
8
 
9
9
  AllCops:
10
- TargetRubyVersion: 2.4
10
+ TargetRubyVersion: 2.5
data/isodoc.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ["lib"]
27
27
  spec.files = `git ls-files`.split("\n")
28
28
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
29
- spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
29
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
30
30
 
31
31
  spec.add_dependency "asciimath"
32
32
  spec.add_dependency "html2doc", "~> 1.1.1"
@@ -50,5 +50,6 @@ Gem::Specification.new do |spec|
50
50
  spec.add_development_dependency "rubocop", "~> 1.5.2"
51
51
  spec.add_development_dependency "sassc", "~> 2.4.0"
52
52
  spec.add_development_dependency "simplecov", "~> 0.15"
53
+ spec.add_development_dependency "metanorma-iso"
53
54
  spec.add_development_dependency "timecop", "~> 0.9"
54
55
  end
@@ -18,29 +18,23 @@ clause: فقرة
18
18
  annex: ملحق
19
19
  appendix: تذييل
20
20
  no_terms_boilerplate: |
21
- <p>No terms and definitions are listed in this document.</p>
21
+ <p>لم يتم سرد أي مصطلحات وتعريفات في هذا المستند.</p>
22
22
  internal_terms_boilerplate: |
23
- <p>For the purposes of this document,
24
- the following terms and definitions apply.</p>
23
+ <p>لأغراض هذا المستند، تنطبق المصطلحات والتعريفات التالية.</p>
25
24
  norm_with_refs_pref:
26
- The following documents are referred to in the text in such a way
27
- that some or all of their content constitutes requirements of this
28
- document. For dated references, only the edition cited applies.
29
- For undated references, the latest edition of the referenced
30
- document (including any amendments) applies.
25
+ تتم الإشارة إلى المستندات التالية في النص بحيث يشكل بعض أو كل محتوياتها متطلبات هذا المستند. للحصول على مراجع مؤرخة، تطبق النسخة المشار إليها فقط. بالنسبة للمراجع غير المؤرخة ، تنطبق أحدث طبعة من الوثيقة المشار إليها (بما في ذلك أي تعديلات).
31
26
  norm_empty_pref:
32
- There are no normative references in this document.
27
+ لا توجد مراجع معيارية في هذه الوثيقة.
33
28
  external_terms_boilerplate: |
34
- <p>For the purposes of this document,
35
- the terms and definitions given in % apply.</p>
29
+ <p> لأغراض هذا المستند ، تنطبق المصطلحات والتعريفات الواردة في%. </ p>
36
30
  internal_external_terms_boilerplate: |
37
- <p>For the purposes of this document, the terms and definitions
38
- given in % and the following apply.</p>
39
- term_defined_in: "[term defined in %]"
31
+ <p>لأغراض هذه الوثيقة ،تنطبق المصطلحات والتعاريف الواردة في % وما يلي.</p>
32
+ term_defined_in: "[المصطلح المحدد في %]"
40
33
  note: ملاحظة
41
34
  note_xref: ملاحظة
42
- termnote: Note % to entry
35
+ termnote: ملاحظة % للقيد
43
36
  list: قائمة
37
+ deflist: قائمة تعريف
44
38
  figure: شكل
45
39
  formula: معادلة
46
40
  inequality: عدم مساواة
@@ -48,16 +42,16 @@ table: جدول
48
42
  requirement: مطلب
49
43
  recommendation: توصية
50
44
  permission: إذن
51
- key: Key
45
+ key: مفتاح
52
46
  example: مثال
53
47
  example_xref: مثال
54
48
  where: حيث
55
49
  wholeoftext: كامل النص
56
- draft_label: draft
57
- inform_annex: informative
58
- norm_annex: normative
50
+ draft_label: مسودة
51
+ inform_annex: إخباري
52
+ norm_annex: مقياسي
59
53
  modified: معدلة
60
- deprecated: DEPRECATED
54
+ deprecated: مهمل
61
55
  source: مصدر
62
56
  and: و
63
57
  all_parts: كل الأجزاء
@@ -78,8 +72,8 @@ subject: موضوع
78
72
  inherits: يرث
79
73
  admonition:
80
74
  danger: خطر
81
- warning: Warning
82
- caution: Caution
75
+ warning: تحذير
76
+ caution: حذر
83
77
  important: مهم
84
78
  safety precautions: احتياطات السلامة
85
79
  locality:
@@ -108,9 +102,9 @@ inflection:
108
102
  ملاحظة:
109
103
  sg: ملاحظة
110
104
  pl: ملاحظات
111
- "Note % to entry":
112
- sg: Note % to entry
113
- pl: Notes % to entry
105
+ "ملاحظة % للقيد":
106
+ sg: ملاحظة % للقيد
107
+ pl: ملاحظات % للقيد
114
108
  قائمة:
115
109
  sg: قائمة
116
110
  pl: قوائم
@@ -36,6 +36,7 @@ note: HINWEIS
36
36
  note_xref: Hinweis
37
37
  termnote: Hinweis % zum Eintrag
38
38
  list: Liste
39
+ deflist: Definitionsliste
39
40
  figure: Abbildung
40
41
  formula: Formel
41
42
  inequality: Formel
@@ -14,6 +14,7 @@ termsdefsymbols: Terms, definitions and symbols
14
14
  termsdefabbrev: Terms, definitions and abbreviated terms
15
15
  normref: Normative references
16
16
  bibliography: Bibliography
17
+ preface: Preface
17
18
  clause: Clause
18
19
  annex: Annex
19
20
  appendix: Appendix
@@ -41,6 +42,7 @@ note: NOTE
41
42
  note_xref: Note
42
43
  termnote: Note % to entry
43
44
  list: List
45
+ deflist: Definition List
44
46
  figure: Figure
45
47
  formula: Formula
46
48
  inequality: Formula
@@ -38,6 +38,7 @@ note: NOTA
38
38
  note_xref: Nota
39
39
  termnote: Nota % a la entrada
40
40
  list: Lista
41
+ deflist: Lista de definiciones
41
42
  figure: Figura
42
43
  formula: Fórmula
43
44
  inequality: Fórmula
@@ -14,6 +14,7 @@ termsdefsymbols: Terms, définitions et symboles
14
14
  termsdefabbrev: Terms, définitions et termes abrégés
15
15
  normref: Références normatives
16
16
  bibliography: Bibliographie
17
+ preface: Préface
17
18
  clause: Article
18
19
  annex: Annexe
19
20
  appendix: Appendice
@@ -37,6 +38,7 @@ figure: Figure
37
38
  formula: Formule
38
39
  inequality: Formule
39
40
  list: Liste
41
+ deflist: Liste de définitions
40
42
  table: Tableau
41
43
  requirement: Exigence
42
44
  recommendation: Recommandation
@@ -41,6 +41,7 @@ note: ПРИМЕЧАНИЕ
41
41
  note_xref: Примечание
42
42
  termnote: Примечание % к определению
43
43
  list: Список
44
+ deflist: Список определений
44
45
  figure: Рисунок
45
46
  formula: Формула
46
47
  inequality: Формула
@@ -14,6 +14,7 @@ termsdefsymbols: 术语、定义、符号和代号
14
14
  termsdefabbrev: 术语、定义、符号和缩略语
15
15
  normref: 规范性引用文件
16
16
  bibliography: 参考文献
17
+ preface: 序言
17
18
  clause: 条
18
19
  annex: 附件
19
20
  appendix: 附录
@@ -39,6 +40,7 @@ figure: 图
39
40
  formula: 公式
40
41
  inequality: 公式
41
42
  list: 列项
43
+ deflist: 定义列表
42
44
  table: 表
43
45
  requirement: 要求
44
46
  recommendation: 建议
@@ -37,6 +37,7 @@ module IsoDoc
37
37
  # datauriimage: Encode images in HTML output as data URIs
38
38
  # break_up_urls_in_tables: whether to insert spaces in URLs in tables
39
39
  # every 40-odd chars
40
+ # sectionsplit: split up HTML output on sections
40
41
  # bare: do not insert any prefatory material (coverpage, boilerplate)
41
42
  def initialize(options)
42
43
  @libdir ||= File.dirname(__FILE__) # rubocop:disable Lint/DisjunctiveAssignmentInConstructor
@@ -73,6 +74,7 @@ module IsoDoc
73
74
  @datauriimage = options[:datauriimage]
74
75
  @suppressheadingnumbers = options[:suppressheadingnumbers]
75
76
  @break_up_urls_in_tables = options[:break_up_urls_in_tables] == "true"
77
+ @sectionsplit = options[:sectionsplit] == "true"
76
78
  @bare = options[:bare]
77
79
  @termdomain = ""
78
80
  @termexample = false
@@ -143,7 +145,7 @@ module IsoDoc
143
145
  end
144
146
 
145
147
  def convert_init(file, input_filename, debug)
146
- docxml = Nokogiri::XML(file)
148
+ docxml = Nokogiri::XML(file) { |config| config.huge }
147
149
  filename, dir = init_file(input_filename, debug)
148
150
  docxml.root.default_namespace = ""
149
151
  lang = docxml&.at(ns("//bibdata/language"))&.text and @lang = lang
@@ -154,7 +156,7 @@ module IsoDoc
154
156
  [docxml, filename, dir]
155
157
  end
156
158
 
157
- def convert(input_filename, file = nil, debug = false,
159
+ def convert(input_filename, file = nil, debug = false,
158
160
  output_filename = nil)
159
161
  file = File.read(input_filename, encoding: "utf-8") if file.nil?
160
162
  @openmathdelim, @closemathdelim = extract_delims(file)
@@ -14,10 +14,11 @@ module IsoDoc::Function
14
14
  end
15
15
  end
16
16
 
17
- def figure_name_parse(node, div, name)
18
- return if name.nil?
17
+ def figure_name_parse(_node, div, name)
18
+ return if name.nil?
19
+
19
20
  div.p **{ class: "FigureTitle", style: "text-align:center;" } do |p|
20
- name.children.each { |n| parse(n, div) }
21
+ name.children.each { |n| parse(n, p) }
21
22
  end
22
23
  end
23
24
 
@@ -61,7 +62,7 @@ module IsoDoc::Function
61
62
  end
62
63
 
63
64
  def sourcecode_name_parse(node, div, name)
64
- return if name.nil?
65
+ return if name.nil?
65
66
 
66
67
  div.p **{ class: "SourceTitle", style: "text-align:center;" } do |p|
67
68
  name.children.each { |n| parse(n, p) }
@@ -224,7 +225,7 @@ module IsoDoc::Function
224
225
  end
225
226
 
226
227
  def svg_parse(node, out)
227
- out << node.to_xml
228
+ out.parent.add_child(node)
228
229
  end
229
230
  end
230
231
  end
@@ -10,9 +10,9 @@ module IsoDoc::Function
10
10
  end
11
11
 
12
12
  # TODO generate formatted ref if not present
13
- def nonstd_bibitem(list, b, ordinal, biblio)
14
- list.p **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
15
- ids = bibitem_ref_code(b)
13
+ def nonstd_bibitem(list, bib, ordinal, biblio)
14
+ list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
15
+ ids = bibitem_ref_code(bib)
16
16
  identifiers = render_identifier(ids)
17
17
  if biblio then ref_entry_code(ref, ordinal, identifiers, ids)
18
18
  else
@@ -20,21 +20,21 @@ module IsoDoc::Function
20
20
  ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
21
21
  end
22
22
  ref << ", " unless biblio && !identifiers[1]
23
- reference_format(b, ref)
23
+ reference_format(bib, ref)
24
24
  end
25
25
  end
26
26
 
27
- def std_bibitem_entry(list, b, ordinal, biblio)
28
- list.p **attr_code(iso_bibitem_entry_attrs(b, biblio)) do |ref|
29
- identifiers = render_identifier(bibitem_ref_code(b))
27
+ def std_bibitem_entry(list, bib, ordinal, biblio)
28
+ list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
29
+ identifiers = render_identifier(bibitem_ref_code(bib))
30
30
  if biblio then ref_entry_code(ref, ordinal, identifiers, nil)
31
31
  else
32
32
  ref << (identifiers[0] || identifiers[1]).to_s
33
33
  ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
34
34
  end
35
- date_note_process(b, ref)
35
+ date_note_process(bib, ref)
36
36
  ref << ", " unless biblio && !identifiers[1]
37
- reference_format(b, ref)
37
+ reference_format(bib, ref)
38
38
  end
39
39
  end
40
40
 
@@ -45,20 +45,20 @@ module IsoDoc::Function
45
45
  t[1] and r << (t[1]).to_s
46
46
  end
47
47
 
48
- def pref_ref_code(b)
49
- b.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
48
+ def pref_ref_code(bib)
49
+ bib.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
50
50
  "or @type = 'ISSN' or @type = 'ISBN' or @type = 'rfc-anchor')]"))
51
51
  end
52
52
 
53
53
  # returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers
54
- def bibitem_ref_code(b)
55
- id = b.at(ns("./docidentifier[@type = 'metanorma']"))
56
- id1 = pref_ref_code(b)
57
- id2 = b.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
54
+ def bibitem_ref_code(bib)
55
+ id = bib.at(ns("./docidentifier[@type = 'metanorma']"))
56
+ id1 = pref_ref_code(bib)
57
+ id2 = bib.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
58
58
  "@type = 'ISBN']"))
59
59
  return [id, id1, id2] if id || id1 || id2
60
60
 
61
- id = Nokogiri::XML::Node.new("docidentifier", b.document)
61
+ id = Nokogiri::XML::Node.new("docidentifier", bib.document)
62
62
  id << "(NO ID)"
63
63
  [nil, id, nil]
64
64
  end
@@ -72,20 +72,10 @@ module IsoDoc::Function
72
72
  num
73
73
  end
74
74
 
75
- def render_identifier(id)
76
- [
77
- bracket_if_num(id[0]),
78
- if id[1].nil?
79
- nil
80
- else
81
- docid_prefix(id[1]["type"], id[1].text.sub(/^\[/, "").sub(/\]$/, ""))
82
- end,
83
- if id[2].nil?
84
- nil
85
- else
86
- docid_prefix(id[2]["type"], id[2].text.sub(/^\[/, "").sub(/\]$/, ""))
87
- end,
88
- ]
75
+ def render_identifier(ident)
76
+ [bracket_if_num(ident[0]),
77
+ ident[1].nil? ? nil : ident[1].text.sub(/^\[/, "").sub(/\]$/, ""),
78
+ ident[2].nil? ? nil : ident[2].text.sub(/^\[/, "").sub(/\]$/, "")]
89
79
  end
90
80
 
91
81
  def docid_prefix(prefix, docid)
@@ -97,19 +87,20 @@ module IsoDoc::Function
97
87
  def omit_docid_prefix(prefix)
98
88
  return true if prefix.nil? || prefix.empty?
99
89
 
100
- %w(ISO IEC IEV ITU W3C csd metanorma rfc-anchor).include? prefix
90
+ %w(ISO IEC IEV ITU W3C csd metanorma repository rfc-anchor)
91
+ .include? prefix
101
92
  end
102
93
 
103
- def date_note_process(b, ref)
104
- date_note = b.at(ns("./note[@type = 'Unpublished-Status']"))
94
+ def date_note_process(bib, ref)
95
+ date_note = bib.at(ns("./note[@type = 'Unpublished-Status']"))
105
96
  return if date_note.nil?
106
97
 
107
98
  date_note.children.first.replace("<p>#{date_note.content}</p>")
108
99
  footnote_parse(date_note, ref)
109
100
  end
110
101
 
111
- def iso_bibitem_entry_attrs(b, biblio)
112
- { id: b["id"], class: biblio ? "Biblio" : "NormRef" }
102
+ def iso_bibitem_entry_attrs(bib, biblio)
103
+ { id: bib["id"], class: biblio ? "Biblio" : "NormRef" }
113
104
  end
114
105
 
115
106
  def iso_title(bib)
@@ -130,22 +121,21 @@ module IsoDoc::Function
130
121
  insert_tab(ref, 1)
131
122
  end
132
123
 
133
- def reference_format(bib, r)
124
+ def reference_format(bib, out)
134
125
  if ftitle = bib.at(ns("./formattedref"))
135
- ftitle&.children&.each { |n| parse(n, r) }
126
+ ftitle&.children&.each { |n| parse(n, out) }
136
127
  else
137
- title = iso_title(bib)
138
- r.i do |i|
139
- title&.children&.each { |n| parse(n, i) }
128
+ out.i do |i|
129
+ iso_title(bib)&.children&.each { |n| parse(n, i) }
140
130
  end
141
131
  end
142
132
  end
143
133
 
144
134
  def is_standard(bib)
145
135
  ret = false
136
+ drop = %w(metanorma DOI ISSN ISBN)
146
137
  bib.xpath(ns("./docidentifier")).each do |id|
147
- next if id["type"].nil? ||
148
- %w(metanorma DOI ISSN ISBN).include?(id["type"])
138
+ next if id["type"].nil? || drop.include?(id["type"])
149
139
 
150
140
  ret = true
151
141
  end
@@ -180,8 +170,7 @@ module IsoDoc::Function
180
170
  clause_name(num, f.at(ns("./title")), div, nil)
181
171
  if f.name == "clause"
182
172
  f.elements.each { |e| parse(e, div) unless e.name == "title" }
183
- else
184
- biblio_list(f, div, false)
173
+ else biblio_list(f, div, false)
185
174
  end
186
175
  end
187
176
  num
@@ -212,13 +201,5 @@ module IsoDoc::Function
212
201
  biblio_list(node, div, true)
213
202
  end
214
203
  end
215
-
216
- def format_ref(ref, prefix, _isopub, _date, _allparts)
217
- ref = docid_prefix(prefix, ref)
218
- return "[#{ref}]" if ref && /^\d+$/.match(ref) && !prefix &&
219
- !/^\[.*\]$/.match(ref)
220
-
221
- ref
222
- end
223
204
  end
224
205
  end
@@ -165,7 +165,6 @@ module IsoDoc::Function
165
165
  out.div **attr_code(id: f["id"]) do |s|
166
166
  clause_name(nil, f.at(ns("./title")) || @i18n.foreword, s,
167
167
  { class: "ForewordTitle" })
168
- # s.h1(**{ class: "ForewordTitle" }) { |h1| h1 << @i18n.foreword }
169
168
  f.elements.each { |e| parse(e, s) unless e.name == "title" }
170
169
  end
171
170
  end