metanorma-standoc 1.3.20 → 1.3.21
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/asciidoctor/standoc/base.rb +8 -3
- data/lib/asciidoctor/standoc/cleanup_block.rb +15 -0
- data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +5 -2
- data/lib/asciidoctor/standoc/cleanup_footnotes.rb +1 -1
- data/lib/asciidoctor/standoc/cleanup_inline.rb +4 -2
- data/lib/asciidoctor/standoc/cleanup_ref.rb +26 -4
- data/lib/asciidoctor/standoc/converter.rb +1 -1
- data/lib/asciidoctor/standoc/isodoc.rng +5 -0
- data/lib/asciidoctor/standoc/lists.rb +20 -2
- data/lib/asciidoctor/standoc/log.rb +50 -0
- data/lib/asciidoctor/standoc/macros.rb +12 -0
- data/lib/asciidoctor/standoc/ref.rb +42 -18
- data/lib/asciidoctor/standoc/section.rb +2 -1
- data/lib/asciidoctor/standoc/table.rb +3 -1
- data/lib/asciidoctor/standoc/utils.rb +10 -51
- data/lib/asciidoctor/standoc/validate.rb +16 -3
- data/lib/asciidoctor/standoc/validate_section.rb +5 -4
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +1 -2
- data/spec/asciidoctor-standoc/cleanup_spec.rb +164 -2
- data/spec/asciidoctor-standoc/lists_spec.rb +49 -36
- data/spec/asciidoctor-standoc/macros_spec.rb +29 -6
- data/spec/asciidoctor-standoc/table_spec.rb +2 -2
- data/spec/asciidoctor-standoc/validate_spec.rb +52 -11
- metadata +5 -18
@@ -7,7 +7,9 @@ module Asciidoctor
|
|
7
7
|
unnumbered: node.option?("unnumbered") ? "true" : nil,
|
8
8
|
subsequence: node.attr("subsequence"),
|
9
9
|
alt: node.attr("alt"),
|
10
|
-
summary: node.attr("summary")
|
10
|
+
summary: node.attr("summary"),
|
11
|
+
width: node.attr("width"),
|
12
|
+
}
|
11
13
|
end
|
12
14
|
|
13
15
|
def table(node)
|
@@ -30,27 +30,17 @@ module Asciidoctor
|
|
30
30
|
docfile.nil? ? './' : Pathname.new(docfile).parent.to_s + '/'
|
31
31
|
end
|
32
32
|
|
33
|
-
def current_location(n)
|
34
|
-
return "Line #{n.lineno}" if n.respond_to?(:lineno) &&
|
35
|
-
!n.lineno.nil? && !n.lineno.empty?
|
36
|
-
return "Line #{n.line}" if n.respond_to?(:line) &&
|
37
|
-
!n.line.nil?
|
38
|
-
return "ID #{n.id}" if n.respond_to?(:id) && !n.id.nil?
|
39
|
-
while !n.nil? &&
|
40
|
-
(!n.respond_to?(:level) || n.level.positive?) &&
|
41
|
-
(!n.respond_to?(:context) || n.context != :section)
|
42
|
-
n = n.parent
|
43
|
-
return "Section: #{n.title}" if n&.respond_to?(:context) &&
|
44
|
-
n&.context == :section
|
45
|
-
end
|
46
|
-
"??"
|
47
|
-
end
|
48
|
-
|
49
33
|
def smartformat(n)
|
50
34
|
n.gsub(/ --? /, " — ").
|
51
35
|
gsub(/--/, "—").smart_format.gsub(/</, "<").gsub(/>/, ">")
|
52
36
|
end
|
53
37
|
|
38
|
+
def endash_date(elem)
|
39
|
+
elem.traverse do |n|
|
40
|
+
n.text? and n.replace(n.text.gsub(/\s+--?\s+/, "–").gsub(/--/, "–"))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
54
44
|
# Set hash value using keys path
|
55
45
|
# mod from https://stackoverflow.com/a/42425884
|
56
46
|
def set_nested_value(hash, keys, new_val)
|
@@ -76,40 +66,7 @@ module Asciidoctor
|
|
76
66
|
end
|
77
67
|
end
|
78
68
|
|
79
|
-
|
80
|
-
code.sub(/^\(/, "[").sub(/\).*$/, "]").sub(/^nofetch\((.+)\)$/, "\\1")
|
81
|
-
end
|
82
|
-
|
83
|
-
def emend_biblio(xml, code, title, usrlbl)
|
84
|
-
unless xml.at("/bibitem/docidentifier[not(@type = 'DOI')][text()]")
|
85
|
-
warn "ERROR: No document identifier retrieved for #{code}"
|
86
|
-
xml.root << "<docidentifier>#{code}</docidentifier>"
|
87
|
-
end
|
88
|
-
unless xml.at("/bibitem/title[text()]")
|
89
|
-
warn "ERROR: No title retrieved for #{code}"
|
90
|
-
xml.root << "<title>#{title || "(MISSING TITLE)"}</title>"
|
91
|
-
end
|
92
|
-
usrlbl and xml.at("/bibitem/docidentifier").next =
|
93
|
-
"<docidentifier type='metanorma'>#{mn_code(usrlbl)}</docidentifier>"
|
94
|
-
end
|
95
|
-
|
96
|
-
def endash_date(elem)
|
97
|
-
elem.traverse do |n|
|
98
|
-
n.text? and n.replace(n.text.gsub(/\s+--?\s+/, "–").gsub(/--/, "–"))
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def smart_render_xml(x, code, title, usrlbl)
|
103
|
-
xstr = x.to_xml if x.respond_to? :to_xml
|
104
|
-
xml = Nokogiri::XML(xstr)
|
105
|
-
emend_biblio(xml, code, title, usrlbl)
|
106
|
-
xml.xpath("//date").each { |d| endash_date(d) }
|
107
|
-
xml.traverse do |n|
|
108
|
-
n.text? and n.replace(smartformat(n.text))
|
109
|
-
end
|
110
|
-
xml.to_xml.sub(/<\?[^>]+>/, "")
|
111
|
-
end
|
112
|
-
|
69
|
+
=begin
|
113
70
|
def warning(node, msg, text)
|
114
71
|
return if @novalid
|
115
72
|
warntext = "asciidoctor: WARNING"\
|
@@ -117,6 +74,7 @@ module Asciidoctor
|
|
117
74
|
warntext += ": #{text}" if text
|
118
75
|
warn warntext
|
119
76
|
end
|
77
|
+
=end
|
120
78
|
|
121
79
|
def flatten_rawtext_lines(node, result)
|
122
80
|
node.lines.each do |x|
|
@@ -222,7 +180,8 @@ module Asciidoctor
|
|
222
180
|
type
|
223
181
|
end
|
224
182
|
|
225
|
-
SUBCLAUSE_XPATH = "//clause[not(parent::sections)]"
|
183
|
+
SUBCLAUSE_XPATH = "//clause[not(parent::sections)]"\
|
184
|
+
"[not(ancestor::boilerplate)]".freeze
|
226
185
|
end
|
227
186
|
end
|
228
187
|
end
|
@@ -25,24 +25,37 @@ module Asciidoctor
|
|
25
25
|
@iev = init_iev or return
|
26
26
|
iev = @iev.fetch(locality, xmldoc&.at("//language")&.text || "en") or next
|
27
27
|
pref.include?(iev.downcase) or
|
28
|
-
warn %(Term "#{pref[0]}" does not match IEV #{locality} "#{iev}")
|
28
|
+
#warn %(Term "#{pref[0]}" does not match IEV #{locality} "#{iev}")
|
29
|
+
@log.add("Bibliography", t, %(Term "#{pref[0]}" does not match IEV #{locality} "#{iev}"))
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
33
|
def content_validate(doc)
|
33
34
|
section_validate(doc)
|
35
|
+
repeat_id_validate(doc.root)
|
34
36
|
iev_validate(doc.root)
|
35
37
|
end
|
36
38
|
|
39
|
+
def repeat_id_validate(doc)
|
40
|
+
ids = {}
|
41
|
+
doc.xpath("//*[@id]").each do |x|
|
42
|
+
if ids[x["id"]]
|
43
|
+
@log.add("Anchors", x, "Anchor #{x['id']} has already been used at line #{ids[x['id']]}")
|
44
|
+
else
|
45
|
+
ids[x["id"]] = x.line
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
37
50
|
def schema_validate(doc, schema)
|
38
51
|
Tempfile.open(["tmp", ".xml"], :encoding => 'UTF-8') do |f|
|
39
52
|
begin
|
40
53
|
f.write(doc.to_xml)
|
41
54
|
f.close
|
42
55
|
errors = Jing.new(schema).validate(f.path)
|
43
|
-
warn "Valid!" if errors.none?
|
56
|
+
warn "Syntax Valid!" if errors.none?
|
44
57
|
errors.each do |error|
|
45
|
-
|
58
|
+
@log.add("Syntax", "XML Line #{"%06d" % error[:line]}:#{error[:column]}", error[:message])
|
46
59
|
end
|
47
60
|
rescue Jing::Error => e
|
48
61
|
abort "Jing failed with error: #{e}"
|
@@ -14,16 +14,17 @@ module Asciidoctor
|
|
14
14
|
callouts = x.elements.select { |e| e.name == "callout" }
|
15
15
|
annotations = x.elements.select { |e| e.name == "annotation" }
|
16
16
|
if callouts.size != annotations.size
|
17
|
-
warn "#{x['id']}: mismatch of callouts and annotations"
|
17
|
+
#warn "#{x['id']}: mismatch of callouts and annotations"
|
18
|
+
@log.add("Asciidoctor Input", x, "mismatch of callouts and annotations")
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
23
|
def style_warning(node, msg, text = nil)
|
23
|
-
|
24
|
-
w = "ISO style: WARNING (#{Utils::current_location(node)}): #{msg}"
|
24
|
+
w = msg
|
25
25
|
w += ": #{text}" if text
|
26
|
-
warn w
|
26
|
+
#warn w
|
27
|
+
@log.add("Style Warning", node, w)
|
27
28
|
end
|
28
29
|
|
29
30
|
def asset_title_style(root)
|
data/metanorma-standoc.gemspec
CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
|
29
29
|
spec.add_dependency "asciidoctor", "~> 2.0.0"
|
30
30
|
spec.add_dependency "ruby-jing"
|
31
|
-
spec.add_dependency "isodoc", "~> 1.0.
|
31
|
+
spec.add_dependency "isodoc", "~> 1.0.20"
|
32
32
|
spec.add_dependency "iev", "~> 0.2.1"
|
33
33
|
spec.add_dependency "relaton", "~> 0.10.0"
|
34
34
|
spec.add_dependency "relaton-iev", "~> 0.1.0"
|
@@ -47,7 +47,6 @@ Gem::Specification.new do |spec|
|
|
47
47
|
spec.add_development_dependency "rubocop", "= 0.54.0"
|
48
48
|
spec.add_development_dependency "simplecov", "~> 0.15"
|
49
49
|
spec.add_development_dependency "timecop", "~> 0.9"
|
50
|
-
spec.add_development_dependency "metanorma", "~> 0.3.0"
|
51
50
|
spec.add_development_dependency "vcr", "~> 5.0.0"
|
52
51
|
spec.add_development_dependency "webmock"
|
53
52
|
#spec.add_development_dependency "relaton-iec"
|
@@ -449,7 +449,7 @@ RSpec.describe Asciidoctor::Standoc do
|
|
449
449
|
OUTPUT
|
450
450
|
end
|
451
451
|
|
452
|
-
it "removes extraneous material from Normative References" do
|
452
|
+
it "removes initial extraneous material from Normative References" do
|
453
453
|
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
454
454
|
#{ASCIIDOC_BLANK_HDR}
|
455
455
|
[bibliography]
|
@@ -458,6 +458,8 @@ RSpec.describe Asciidoctor::Standoc do
|
|
458
458
|
This is extraneous information
|
459
459
|
|
460
460
|
* [[[iso216,ISO 216]]], _Reference_
|
461
|
+
|
462
|
+
This is also extraneous information
|
461
463
|
INPUT
|
462
464
|
#{BLANK_HDR}
|
463
465
|
<sections></sections>
|
@@ -473,12 +475,85 @@ RSpec.describe Asciidoctor::Standoc do
|
|
473
475
|
</organization>
|
474
476
|
</contributor>
|
475
477
|
</bibitem>
|
478
|
+
<p id='_'>This is also extraneous information</p>
|
476
479
|
</references>
|
477
480
|
</bibliography>
|
478
481
|
</standard-document>
|
479
482
|
OUTPUT
|
480
483
|
end
|
481
484
|
|
485
|
+
it "sorts references with their notes in Bibliography" do
|
486
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
487
|
+
#{ASCIIDOC_BLANK_HDR}
|
488
|
+
[bibliography]
|
489
|
+
== Bibliography
|
490
|
+
|
491
|
+
This is extraneous information
|
492
|
+
|
493
|
+
* [[[iso216,ISO 216]]], _Reference_
|
494
|
+
|
495
|
+
NOTE: ABC
|
496
|
+
|
497
|
+
NOTE: DEF
|
498
|
+
|
499
|
+
This is further extraneous information
|
500
|
+
|
501
|
+
NOTE: GHI
|
502
|
+
|
503
|
+
* [[[iso216,ISO 215]]], _Reference_
|
504
|
+
|
505
|
+
NOTE: JKL
|
506
|
+
|
507
|
+
This is also extraneous information
|
508
|
+
INPUT
|
509
|
+
#{BLANK_HDR}
|
510
|
+
<sections> </sections>
|
511
|
+
<bibliography>
|
512
|
+
<references id='_' obligation='informative'>
|
513
|
+
<title>Bibliography</title>
|
514
|
+
<p id='_'>This is extraneous information</p>
|
515
|
+
<bibitem id='iso216' type='standard'>
|
516
|
+
<title format='text/plain'>Reference</title>
|
517
|
+
<docidentifier>ISO 216</docidentifier>
|
518
|
+
<contributor>
|
519
|
+
<role type='publisher'/>
|
520
|
+
<organization>
|
521
|
+
<name>ISO</name>
|
522
|
+
</organization>
|
523
|
+
</contributor>
|
524
|
+
</bibitem>
|
525
|
+
<note id='_'>
|
526
|
+
<p id='_'>ABC</p>
|
527
|
+
</note>
|
528
|
+
<note id='_'>
|
529
|
+
<p id='_'>DEF</p>
|
530
|
+
</note>
|
531
|
+
<bibitem id='iso216' type='standard'>
|
532
|
+
<title format='text/plain'>Reference</title>
|
533
|
+
<docidentifier>ISO 215</docidentifier>
|
534
|
+
<contributor>
|
535
|
+
<role type='publisher'/>
|
536
|
+
<organization>
|
537
|
+
<name>ISO</name>
|
538
|
+
</organization>
|
539
|
+
</contributor>
|
540
|
+
</bibitem>
|
541
|
+
<note id='_'>
|
542
|
+
<p id='_'>JKL</p>
|
543
|
+
</note>
|
544
|
+
<p id='_'>
|
545
|
+
This is further extraneous information
|
546
|
+
<note id='_'>
|
547
|
+
<p id='_'>GHI</p>
|
548
|
+
</note>
|
549
|
+
</p>
|
550
|
+
<p id='_'>This is also extraneous information</p>
|
551
|
+
</references>
|
552
|
+
</bibliography>
|
553
|
+
</standard-document>
|
554
|
+
OUTPUT
|
555
|
+
end
|
556
|
+
|
482
557
|
it "inserts IDs into paragraphs" do
|
483
558
|
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
484
559
|
#{ASCIIDOC_BLANK_HDR}
|
@@ -689,6 +764,7 @@ RSpec.describe Asciidoctor::Standoc do
|
|
689
764
|
it "moves footnotes inside figures" do
|
690
765
|
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
691
766
|
#{ASCIIDOC_BLANK_HDR}
|
767
|
+
.Figuretitle.footnote:[xyz]
|
692
768
|
image::spec/examples/rice_images/rice_image1.png[]
|
693
769
|
|
694
770
|
footnote:[This is a footnote to a figure]
|
@@ -699,6 +775,12 @@ RSpec.describe Asciidoctor::Standoc do
|
|
699
775
|
INPUT
|
700
776
|
#{BLANK_HDR}
|
701
777
|
<sections><figure id="_">
|
778
|
+
<name>
|
779
|
+
Figuretitle.
|
780
|
+
<fn reference='1'>
|
781
|
+
<p id='_'>xyz</p>
|
782
|
+
</fn>
|
783
|
+
</name>
|
702
784
|
<image src="spec/examples/rice_images/rice_image1.png" id="_" mimetype="image/png" height="auto" width="auto"/>
|
703
785
|
<fn reference="a">
|
704
786
|
<p id="_">This is a footnote to a figure</p>
|
@@ -707,7 +789,7 @@ RSpec.describe Asciidoctor::Standoc do
|
|
707
789
|
</fn></figure>
|
708
790
|
<p id='_'>
|
709
791
|
A
|
710
|
-
<fn reference='
|
792
|
+
<fn reference='2'>
|
711
793
|
<p id='_'>This is a third footnote</p>
|
712
794
|
</fn>
|
713
795
|
</p>
|
@@ -1579,6 +1661,86 @@ it "sorts symbols lists" do
|
|
1579
1661
|
OUTPUT
|
1580
1662
|
end
|
1581
1663
|
|
1664
|
+
it "moves inherit macros to correct location" do
|
1665
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
1666
|
+
#{ASCIIDOC_BLANK_HDR}
|
1667
|
+
|
1668
|
+
== Clause
|
1669
|
+
|
1670
|
+
[.requirement,subsequence="A",inherit="/ss/584/2015/level/1 & /ss/584/2015/level/2"]
|
1671
|
+
.Title
|
1672
|
+
====
|
1673
|
+
inherit:[A]
|
1674
|
+
inherit:[B]
|
1675
|
+
I recommend this
|
1676
|
+
====
|
1677
|
+
|
1678
|
+
[.requirement,subsequence="A",classification="X:Y"]
|
1679
|
+
.Title
|
1680
|
+
====
|
1681
|
+
inherit:[A]
|
1682
|
+
I recommend this
|
1683
|
+
====
|
1684
|
+
|
1685
|
+
[.requirement,subsequence="A"]
|
1686
|
+
.Title
|
1687
|
+
====
|
1688
|
+
inherit:[A]
|
1689
|
+
I recommend this
|
1690
|
+
====
|
1691
|
+
|
1692
|
+
[.requirement,subsequence="A"]
|
1693
|
+
.Title
|
1694
|
+
====
|
1695
|
+
inherit:[A]
|
1696
|
+
====
|
1697
|
+
|
1698
|
+
|
1699
|
+
INPUT
|
1700
|
+
#{BLANK_HDR}
|
1701
|
+
<sections>
|
1702
|
+
<clause id='_' inline-header='false' obligation='normative'>
|
1703
|
+
<title>Clause</title>
|
1704
|
+
<requirement id='_' subsequence='A'>
|
1705
|
+
<title>Title</title>
|
1706
|
+
<inherit>/ss/584/2015/level/1 & /ss/584/2015/level/2</inherit>
|
1707
|
+
<inherit>A</inherit>
|
1708
|
+
<inherit>B</inherit>
|
1709
|
+
<description>
|
1710
|
+
<p id='_'> I recommend this</p>
|
1711
|
+
</description>
|
1712
|
+
</requirement>
|
1713
|
+
<requirement id='_' subsequence='A'>
|
1714
|
+
<title>Title</title>
|
1715
|
+
<inherit>A</inherit>
|
1716
|
+
<classification>
|
1717
|
+
<tag>X</tag>
|
1718
|
+
<value>Y</value>
|
1719
|
+
</classification>
|
1720
|
+
<description>
|
1721
|
+
<p id='_'> I recommend this</p>
|
1722
|
+
</description>
|
1723
|
+
</requirement>
|
1724
|
+
<requirement id='_' subsequence='A'>
|
1725
|
+
<title>Title</title>
|
1726
|
+
<inherit>A</inherit>
|
1727
|
+
<description>
|
1728
|
+
<p id='_'> I recommend this</p>
|
1729
|
+
</description>
|
1730
|
+
</requirement>
|
1731
|
+
<requirement id='_' subsequence='A'>
|
1732
|
+
<title>Title</title>
|
1733
|
+
<inherit>A</inherit>
|
1734
|
+
<description>
|
1735
|
+
<p id='_'> </p>
|
1736
|
+
</description>
|
1737
|
+
</requirement>
|
1738
|
+
</clause>
|
1739
|
+
</sections>
|
1740
|
+
</standard-document>
|
1741
|
+
OUTPUT
|
1742
|
+
end
|
1743
|
+
|
1582
1744
|
|
1583
1745
|
private
|
1584
1746
|
|
@@ -8,6 +8,10 @@ RSpec.describe Asciidoctor::Standoc do
|
|
8
8
|
* List 2
|
9
9
|
* List 3
|
10
10
|
|
11
|
+
* [*] checked
|
12
|
+
* [x] also checked
|
13
|
+
* [ ] not checked
|
14
|
+
|
11
15
|
. List A
|
12
16
|
. List B
|
13
17
|
. List C
|
@@ -17,42 +21,51 @@ RSpec.describe Asciidoctor::Standoc do
|
|
17
21
|
|
18
22
|
INPUT
|
19
23
|
expect(xmlpp(strip_guid(output))).to be_equivalent_to xmlpp(<<~"OUTPUT")
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
24
|
+
#{BLANK_HDR}
|
25
|
+
<sections>
|
26
|
+
<ul id='_'>
|
27
|
+
<li>
|
28
|
+
<p id='_'>List 1</p>
|
29
|
+
</li>
|
30
|
+
<li>
|
31
|
+
<p id='_'>List 2</p>
|
32
|
+
</li>
|
33
|
+
<li>
|
34
|
+
<p id='_'>List 3</p>
|
35
|
+
</li>
|
36
|
+
<li uncheckedcheckbox='false' checkedcheckbox='true'>
|
37
|
+
<p id='_'>checked</p>
|
38
|
+
</li>
|
39
|
+
<li uncheckedcheckbox='false' checkedcheckbox='true'>
|
40
|
+
<p id='_'>also checked</p>
|
41
|
+
</li>
|
42
|
+
<li uncheckedcheckbox='true' checkedcheckbox='false'>
|
43
|
+
<p id='_'>not checked</p>
|
44
|
+
<ol id='_' type='arabic'>
|
45
|
+
<li>
|
46
|
+
<p id='_'>List A</p>
|
47
|
+
</li>
|
48
|
+
<li>
|
49
|
+
<p id='_'>List B</p>
|
50
|
+
</li>
|
51
|
+
<li>
|
52
|
+
<p id='_'>List C</p>
|
53
|
+
<dl id='_'>
|
54
|
+
<dt>List D</dt>
|
55
|
+
<dd>
|
56
|
+
<p id='_'>List E</p>
|
57
|
+
</dd>
|
58
|
+
<dt>List F</dt>
|
59
|
+
<dd>
|
60
|
+
<p id='_'>List G</p>
|
61
|
+
</dd>
|
62
|
+
</dl>
|
63
|
+
</li>
|
64
|
+
</ol>
|
65
|
+
</li>
|
66
|
+
</ul>
|
67
|
+
</sections>
|
68
|
+
</standard-document>
|
56
69
|
OUTPUT
|
57
70
|
end
|
58
71
|
|