isodoc 1.8.4 → 2.0.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: 3189a7f65994e9185f29009eb40bb6589c83f579996199d34c669b44883a6548
4
- data.tar.gz: 8462af8b54793cbc7dda2e98a2005a8ec11d4d17657a3fb63b3f2865950cf8c9
3
+ metadata.gz: 94378642fdbff3fdfd64fc15d3f502fd3ac966926d19b060c5b7bbd4b9f9e545
4
+ data.tar.gz: eeb1da05b0df09ea66cd55692f3d2f706991904216c5869025b9d936dc93cf12
5
5
  SHA512:
6
- metadata.gz: 4cd5b57e05c214e49e703f808799195e4b1d7b158a9e07fd4e728a369b8f1406d735eb7576e182abe28ba40529dc22a70db28f50e77f2548aed08ae0ff139d5c
7
- data.tar.gz: 12eb151374efdde8fd26302aeecdde46e25a7db4147f4bbf1dd54256f460f8ef5f29880bbaa170171abb5d451bf11b1d1b29ff24bbba15746d28249f5ec283f6
6
+ metadata.gz: b8164bf9d471f1b409ff4c0d933f69b9f834d340548caf3b441d7ca4584460b026420bb752903121561d573f8ddc618e5796d5e22dd09c1a9f3ca429cf567df5
7
+ data.tar.gz: 75a73a94378f4d0fe6187b343d84961265e60d1417d23c43c38b11c819190cba0838dd0a99ba21d7e49824add339f7a6007c42748f87130a7abd2ce35d14105b
@@ -10,34 +10,6 @@ on:
10
10
 
11
11
  jobs:
12
12
  rake:
13
- name: Test on Ruby ${{ matrix.ruby }} ${{ matrix.os }}
14
- runs-on: ${{ matrix.os }}
15
- continue-on-error: ${{ matrix.experimental }}
16
- strategy:
17
- fail-fast: false
18
- matrix:
19
- ruby: [ '3.0', '2.7', '2.6', '2.5' ]
20
- os: [ ubuntu-latest, windows-latest, macos-latest ]
21
- experimental: [ false ]
22
- steps:
23
- - uses: actions/checkout@master
24
-
25
- - uses: ruby/setup-ruby@v1
26
- with:
27
- ruby-version: ${{ matrix.ruby }}
28
- bundler-cache: true
29
-
30
- - uses: metanorma/metanorma-build-scripts/inkscape-setup-action@master
31
-
32
- - run: bundle exec rake
33
-
34
- tests-passed:
35
- needs: rake
36
- runs-on: ubuntu-latest
37
- steps:
38
- - uses: peter-evans/repository-dispatch@v1
39
- with:
40
- token: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
41
- repository: ${{ github.repository }}
42
- event-type: tests-passed
43
- client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
13
+ uses: metanorma/metanorma-build-scripts/.github/workflows/inkscape-rake.yml@main
14
+ secrets:
15
+ pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -14,27 +14,28 @@ module IsoDoc
14
14
  def nonstd_bibitem(list, bib, ordinal, biblio)
15
15
  list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
16
16
  ids = bibitem_ref_code(bib)
17
- identifiers = render_identifier(ids)
18
- if biblio then ref_entry_code(ref, ordinal, identifiers, ids)
17
+ idents = render_identifier(ids)
18
+ if biblio then ref_entry_code(ref, ordinal, idents, ids)
19
19
  else
20
- ref << (identifiers[0] || identifiers[1]).to_s
21
- ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
20
+ ref << (idents[:ordinal] || idents[:metanorma] || idents[:sdo]).to_s
21
+ ref << ", #{idents[sdo]}" if idents[:ordinal] && idents[:sdo]
22
22
  end
23
- ref << ", " unless biblio && !identifiers[1]
23
+ ref << ", " unless biblio && !idents[:sdo]
24
24
  reference_format(bib, ref)
25
25
  end
26
26
  end
27
27
 
28
28
  def std_bibitem_entry(list, bib, ordinal, biblio)
29
29
  list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
30
- identifiers = render_identifier(bibitem_ref_code(bib))
31
- if biblio then ref_entry_code(ref, ordinal, identifiers, nil)
30
+ idents = render_identifier(bibitem_ref_code(bib))
31
+ if biblio then ref_entry_code(ref, ordinal, idents, nil)
32
32
  else
33
- ref << (identifiers[0] || identifiers[1]).to_s
34
- ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
33
+ ref << (idents[:ordinal] || idents[:metanorma] || idents[:sdo]).to_s
34
+ ref << ", #{idents[:sdo]}" if (idents[:ordinal] ||
35
+ idents[:metanorma]) && idents[:sdo]
35
36
  end
36
37
  date_note_process(bib, ref)
37
- ref << ", " unless biblio && !identifiers[1]
38
+ ref << ", " unless biblio && !idents[:sdo]
38
39
  reference_format(bib, ref)
39
40
  end
40
41
  end
@@ -42,13 +43,15 @@ module IsoDoc
42
43
  # if ids is just a number, only use that ([1] Non-Standard)
43
44
  # else, use both ordinal, as prefix, and ids
44
45
  def ref_entry_code(ref, ordinal, ids, _id)
45
- prefix_bracketed_ref(ref, ids[0] || "[#{ordinal}]")
46
- ids[1] and ref << (ids[1]).to_s
46
+ prefix_bracketed_ref(ref, ids[:ordinal] || ids[:metanorma] ||
47
+ "[#{ordinal}]")
48
+ ids[:sdo] and ref << (ids[:sdo]).to_s
47
49
  end
48
50
 
49
51
  def pref_ref_code(bib)
50
52
  bib.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
51
- "or @type = 'ISSN' or @type = 'ISBN' or "\
53
+ "or @type = 'metanorma-ordinal' or "\
54
+ "@type = 'ISSN' or @type = 'ISBN' or "\
52
55
  "@type = 'rfc-anchor')]"))
53
56
  end
54
57
 
@@ -58,11 +61,12 @@ module IsoDoc
58
61
  id1 = pref_ref_code(bib)
59
62
  id2 = bib.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
60
63
  "@type = 'ISBN']"))
61
- return [id, id1, id2] if id || id1 || id2
64
+ id3 = bib.at(ns("./docidentifier[@type = 'metanorma-ordinal']"))
65
+ return [id, id1, id2, id3] if id || id1 || id2 || id3
62
66
 
63
67
  id = Nokogiri::XML::Node.new("docidentifier", bib.document)
64
68
  id << "(NO ID)"
65
- [nil, id, nil]
69
+ [nil, id, nil, nil]
66
70
  end
67
71
 
68
72
  def bracket_if_num(num)
@@ -74,10 +78,15 @@ module IsoDoc
74
78
  num
75
79
  end
76
80
 
81
+ def unbracket(ident)
82
+ ident&.text&.sub(/^\[/, "")&.sub(/\]$/, "")
83
+ end
84
+
77
85
  def render_identifier(ident)
78
- [bracket_if_num(ident[0]),
79
- ident[1].nil? ? nil : ident[1].text.sub(/^\[/, "").sub(/\]$/, ""),
80
- ident[2].nil? ? nil : ident[2].text.sub(/^\[/, "").sub(/\]$/, "")]
86
+ { metanorma: bracket_if_num(ident[0]),
87
+ sdo: unbracket(ident[1]),
88
+ doi: unbracket(ident[2]),
89
+ ordinal: bracket_if_num(ident[3]) }
81
90
  end
82
91
 
83
92
  def docid_prefix(prefix, docid)
@@ -133,7 +142,7 @@ module IsoDoc
133
142
  end
134
143
  end
135
144
 
136
- def is_standard(bib)
145
+ def standard?(bib)
137
146
  ret = false
138
147
  drop = %w(metanorma DOI ISSN ISBN)
139
148
  bib.xpath(ns("./docidentifier")).each do |id|
@@ -151,7 +160,7 @@ module IsoDoc
151
160
  next if implicit_reference(b)
152
161
 
153
162
  i += 1
154
- if is_standard(b) then std_bibitem_entry(div, b, i, biblio)
163
+ if standard?(b) then std_bibitem_entry(div, b, i, biblio)
155
164
  else nonstd_bibitem(div, b, i, biblio)
156
165
  end
157
166
  else
@@ -166,7 +175,7 @@ module IsoDoc
166
175
  end
167
176
 
168
177
  def norm_ref(isoxml, out, num)
169
- f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true" or
178
+ (f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true") or
170
179
  return num
171
180
  out.div do |div|
172
181
  num = num + 1
@@ -186,7 +195,7 @@ module IsoDoc
186
195
  end
187
196
 
188
197
  def bibliography(isoxml, out)
189
- f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or
198
+ (f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true") or
190
199
  return
191
200
  page_break(out)
192
201
  out.div do |div|
@@ -76,7 +76,12 @@ module IsoDoc
76
76
  end
77
77
  end
78
78
 
79
- def variant_title(_node, _out); end
79
+ def variant_title(node, out)
80
+ out.p **attr_code(style: "display:none;",
81
+ class: "variant-title-#{node['type']}") do |p|
82
+ node.children.each { |c| parse(c, p) }
83
+ end
84
+ end
80
85
  end
81
86
  end
82
87
  end
@@ -129,6 +129,7 @@ module IsoDoc
129
129
 
130
130
  def header_strip(hdr)
131
131
  h1 = to_xhtml_fragment(hdr.to_s.gsub(%r{<br\s*/>}, " ")
132
+ .gsub(%r{</?p(\s[^>]+)?>}, "")
132
133
  .gsub(/<\/?h[123456][^>]*>/, "").gsub(/<\/?b[^>]*>/, "").dup)
133
134
  h1.traverse do |x|
134
135
  if x.name == "span" && /mso-tab-count/.match(x["style"])
@@ -122,8 +122,10 @@ module IsoDoc
122
122
  end
123
123
 
124
124
  def html_toc_entry(level, header)
125
+ content = header.at("./following-sibling::p"\
126
+ "[@class = 'variant-title-toc']") || header
125
127
  %(<li class="#{level}"><a href="##{header['id']}">\
126
- #{header_strip(header)}</a></li>)
128
+ #{header_strip(content)}</a></li>)
127
129
  end
128
130
 
129
131
  def toclevel_classes
@@ -144,7 +146,7 @@ module IsoDoc
144
146
  idx = docxml.at("//div[@id = 'toc']") or return docxml
145
147
  toc = "<ul>"
146
148
  path = toclevel_classes.map do |l|
147
- "//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')][text()]"
149
+ "//main//#{l}#{toc_exclude_class}"
148
150
  end
149
151
  docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
150
152
  h["id"] ||= "toc#{tocidx}"
@@ -154,6 +156,11 @@ module IsoDoc
154
156
  docxml
155
157
  end
156
158
 
159
+ def toc_exclude_class
160
+ "[not(@class = 'TermNum')][not(@class = 'noTOC')]"\
161
+ "[string-length(normalize-space(.))>0]"
162
+ end
163
+
157
164
  # presupposes that the image source is local
158
165
  def move_images(docxml)
159
166
  FileUtils.rm_rf tmpimagedir
@@ -10,12 +10,6 @@ module IsoDoc
10
10
  "</localized-strings>"
11
11
  end
12
12
 
13
- def docid_prefixes(docxml)
14
- docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
15
- i.children = @xrefs.klass.docid_prefix(i["type"], i.text)
16
- end
17
- end
18
-
19
13
  def address_precompose(bib)
20
14
  bib.xpath(ns("//bibdata//address")).each do |b|
21
15
  next if b.at(ns("./formattedAddress"))
@@ -29,9 +29,9 @@ module IsoDoc
29
29
  end
30
30
 
31
31
  def floattitle1(elem)
32
- level = @xrefs.anchor(elem["id"], :level, false) || "1"
33
- elem.xpath(ns("./p[@type = 'floating-title']")).each do |p|
34
- p["depth"] = level.to_i + 1
32
+ elem.xpath(ns(".//floating-title")).each do |p|
33
+ p.name = "p"
34
+ p["type"] = "floating-title"
35
35
  end
36
36
  end
37
37
 
@@ -60,7 +60,29 @@ module IsoDoc
60
60
  prefix_name(elem, "", "#{lbl}#{clausedelim}", "name")
61
61
  end
62
62
 
63
- def references(docxml); end
63
+ def references(docxml)
64
+ bibliography_bibitem_number(docxml)
65
+ end
66
+
67
+ def bibliography_bibitem_number_skip(bibitem)
68
+ @xrefs.klass.implicit_reference(bibitem) ||
69
+ bibitem.at(ns(".//docidentifier[@type = 'metanorma']")) ||
70
+ bibitem.at(ns(".//docidentifier[@type = 'metanorma-ordinal']"))
71
+ # || @xrefs.klass.standard?(bibitem)
72
+ end
73
+
74
+ def bibliography_bibitem_number(docxml)
75
+ i = 0
76
+ docxml.xpath(ns("//references[@normative = 'false']/bibitem")).each do |b|
77
+ next if bibliography_bibitem_number_skip(b)
78
+
79
+ i += 1
80
+ id = b.at(ns(".//docidentifier"))
81
+ id.previous =
82
+ "<docidentifier type='metanorma-ordinal'>[#{i}]</docidentifier>"
83
+ end
84
+ @xrefs.references docxml
85
+ end
64
86
 
65
87
  def docid_prefixes(docxml)
66
88
  docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
@@ -102,9 +124,7 @@ module IsoDoc
102
124
  display_order_xpath(docxml, "//indexsect", i)
103
125
  end
104
126
 
105
- def clausetitle(docxml)
106
- docxml.xpath(ns("//variant-title[@type = 'toc']")).each(&:remove)
107
- end
127
+ def clausetitle(docxml); end
108
128
 
109
129
  def toc(docxml)
110
130
  docxml.xpath(ns("//toc//xref[text()]")).each do |x|
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "1.8.4".freeze
2
+ VERSION = "2.0.0".freeze
3
3
  end
@@ -9,6 +9,10 @@ module IsoDoc
9
9
  docxml.xpath(ns(@klass.bibliography_xpath)).each do |b|
10
10
  preface_names(b)
11
11
  end
12
+ references(docxml)
13
+ end
14
+
15
+ def references(docxml)
12
16
  docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |ref|
13
17
  reference_names(ref)
14
18
  end
@@ -148,11 +152,11 @@ module IsoDoc
148
152
  "xmlns:name = 'International Electrotechnical Commission']".freeze
149
153
 
150
154
  def reference_names(ref)
151
- # isopub = ref.at(ns(ISO_PUBLISHER_XPATH))
152
155
  ids = @klass.bibitem_ref_code(ref)
153
156
  identifiers = @klass.render_identifier(ids)
154
- # date = ref.at(ns("./date[@type = 'published']"))
155
- reference = @klass.docid_l10n(identifiers[0] || identifiers[1])
157
+ reference = @klass
158
+ .docid_l10n(identifiers[:metanorma] || identifiers[:sdo] ||
159
+ identifiers[:ordinal] || identifiers[:doi])
156
160
  @anchors[ref["id"]] = { xref: reference }
157
161
  end
158
162
  end
@@ -1752,7 +1752,7 @@ RSpec.describe IsoDoc do
1752
1752
  </foreword></preface>
1753
1753
  <bibliography><references id="_bibliography" obligation="informative" normative="false" displayorder='2'>
1754
1754
  <title depth='1'>Bibliography</title>
1755
- <bibitem id="rfc2616" type="standard"> <fetched>2020-03-27</fetched> <title format="text/plain" language="en" script="Latn">Hypertext Transfer Protocol — HTTP/1.1</title> <uri type="xml">https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2616.xml</uri> <uri type="src">https://www.rfc-editor.org/info/rfc2616</uri> <docidentifier type="IETF">IETF RFC 2616</docidentifier> <docidentifier type="rfc-anchor">RFC2616</docidentifier> <docidentifier type="DOI">DOI 10.17487/RFC2616</docidentifier> <date type="published"> <on>1999-06</on> </date> <contributor> <role type="author"/> <person> <name> <completename language="en">R. Fielding</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">J. Gettys</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">J. Mogul</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">H. Frystyk</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">L. Masinter</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">P. Leach</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">T. Berners-Lee</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <language>en</language> <script>Latn</script> <abstract format="text/plain" language="en" script="Latn">HTTP has been in use by the World-Wide Web global information initiative since 1990. This specification defines the protocol referred to as “HTTP/1.1”, and is an update to RFC 2068. [STANDARDS-TRACK]</abstract> <series type="main"> <title format="text/plain" language="en" script="Latn">RFC</title> <number>2616</number> </series> <place>Fremont, CA</place></bibitem>
1755
+ <bibitem id="rfc2616" type="standard"> <fetched>2020-03-27</fetched> <title format="text/plain" language="en" script="Latn">Hypertext Transfer Protocol — HTTP/1.1</title> <uri type="xml">https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2616.xml</uri> <uri type="src">https://www.rfc-editor.org/info/rfc2616</uri> <docidentifier type='metanorma-ordinal'>[1]</docidentifier> <docidentifier type="IETF">IETF RFC 2616</docidentifier> <docidentifier type="rfc-anchor">RFC2616</docidentifier> <docidentifier type="DOI">DOI 10.17487/RFC2616</docidentifier> <date type="published"> <on>1999-06</on> </date> <contributor> <role type="author"/> <person> <name> <completename language="en">R. Fielding</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">J. Gettys</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">J. Mogul</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">H. Frystyk</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">L. Masinter</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">P. Leach</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <contributor> <role type="author"/> <person> <name> <completename language="en">T. Berners-Lee</completename> </name> <affiliation> <organization> <name>IETF</name> <abbreviation>IETF</abbreviation> </organization> </affiliation> </person> </contributor> <language>en</language> <script>Latn</script> <abstract format="text/plain" language="en" script="Latn">HTTP has been in use by the World-Wide Web global information initiative since 1990. This specification defines the protocol referred to as “HTTP/1.1”, and is an update to RFC 2068. [STANDARDS-TRACK]</abstract> <series type="main"> <title format="text/plain" language="en" script="Latn">RFC</title> <number>2616</number> </series> <place>Fremont, CA</place></bibitem>
1756
1756
  </references></bibliography>
1757
1757
  </iso-standard>
1758
1758
  OUTPUT
@@ -2518,6 +2518,7 @@ RSpec.describe IsoDoc do
2518
2518
  <bibliography>
2519
2519
  <references hidden='true' normative='false' displayorder="1">
2520
2520
  <bibitem id='express_action_schema' type='internal'>
2521
+ <docidentifier type='metanorma-ordinal'>[1]</docidentifier>
2521
2522
  <docidentifier type='repository'>express/action_schema</docidentifier>
2522
2523
  </bibitem>
2523
2524
  </references>
@@ -474,6 +474,33 @@ RSpec.describe IsoDoc do
474
474
  OUTPUT
475
475
  end
476
476
 
477
+ =begin
478
+ it "populates HTML ToC" do
479
+ FileUtils.rm_f "test.doc"
480
+ FileUtils.rm_f "test.html"
481
+ IsoDoc::HtmlConvert.new({ htmltoclevels: 3 })
482
+ .convert("test", <<~"INPUT", false)
483
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
484
+ <preface><foreword><title>Foreword</title>
485
+ <variant-title type="toc">FORVORT</variant-title>
486
+ </foreword></preface>
487
+ <sections>
488
+ <clause><title>First Clause</title>
489
+ <clause><title>First Subclause</title>
490
+ <variant-title type="toc">SUBCLOZ</variant-title>
491
+ </clause>
492
+ </clause>
493
+ </sections>
494
+ </iso-standard>
495
+ INPUT
496
+ html = Nokogiri::XML(File.read("test.html")).
497
+ at("//div[@id = 'toc']")
498
+ expect(xmlpp(html)).to be_equivalent_to xmlpp(<<~OUTPUT)
499
+ HAJSHJAS
500
+ OUTPUT
501
+ end
502
+ =end
503
+
477
504
  it "populates Word ToC" do
478
505
  FileUtils.rm_f "test.doc"
479
506
  IsoDoc::WordConvert.new(
@@ -495,6 +522,7 @@ RSpec.describe IsoDoc do
495
522
  </fn></p>
496
523
  <clause id="P" inline-header="false" obligation="normative">
497
524
  <title>Clause 4.2.1</title>
525
+ <variant-title type="toc">SUBCLOZ</variant-title>
498
526
  </clause>
499
527
  </clause></clause>
500
528
  </sections>