metanorma-standoc 2.2.0 → 2.2.1.1

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/metanorma/standoc/base.rb +12 -0
  3. data/lib/metanorma/standoc/blocks.rb +25 -15
  4. data/lib/metanorma/standoc/cleanup_biblio.rb +14 -8
  5. data/lib/metanorma/standoc/cleanup_reqt.rb +3 -136
  6. data/lib/metanorma/standoc/front.rb +6 -1
  7. data/lib/metanorma/standoc/front_contributor.rb +0 -10
  8. data/lib/metanorma/standoc/macros_inline.rb +1 -1
  9. data/lib/metanorma/standoc/reqt.rb +19 -75
  10. data/lib/metanorma/standoc/section.rb +35 -3
  11. data/lib/metanorma/standoc/utils.rb +9 -43
  12. data/lib/metanorma/standoc/validate.rb +1 -69
  13. data/lib/metanorma/standoc/validate_table.rb +91 -0
  14. data/lib/metanorma/standoc/version.rb +1 -1
  15. data/metanorma-standoc.gemspec +2 -2
  16. data/spec/metanorma/biblio_spec.rb +9 -9
  17. data/spec/metanorma/blocks_spec.rb +20 -266
  18. data/spec/metanorma/cleanup_blocks_spec.rb +0 -168
  19. data/spec/metanorma/macros_concept_spec.rb +1033 -0
  20. data/spec/metanorma/macros_spec.rb +1 -1031
  21. data/spec/metanorma/refs_spec.rb +0 -2
  22. data/spec/metanorma/reqt_spec.rb +130 -0
  23. data/spec/metanorma/section_spec.rb +5 -0
  24. data/spec/metanorma/validate_spec.rb +46 -6
  25. data/spec/vcr_cassettes/bsi16341.yml +80 -52
  26. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +94 -94
  27. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec1.yml +10 -10
  28. data/spec/vcr_cassettes/hide_refs.yml +74 -74
  29. data/spec/vcr_cassettes/isobib_get_123.yml +11 -11
  30. data/spec/vcr_cassettes/isobib_get_123_1.yml +22 -22
  31. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +30 -30
  32. data/spec/vcr_cassettes/isobib_get_123_2.yml +23 -23
  33. data/spec/vcr_cassettes/isobib_get_123_2001.yml +9 -9
  34. data/spec/vcr_cassettes/isobib_get_124.yml +10 -10
  35. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +30 -60
  36. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +45 -45
  37. data/spec/vcr_cassettes/std-link.yml +11 -11
  38. metadata +10 -7
@@ -1,5 +1,6 @@
1
1
  require "metanorma/standoc/utils"
2
2
  require_relative "./validate_section"
3
+ require_relative "./validate_table"
3
4
  require "nokogiri"
4
5
  require "jing"
5
6
  require "iev"
@@ -53,75 +54,6 @@ module Metanorma
53
54
  @fatalerror.empty? or clean_abort(@fatalerror.join("\n"), doc.to_xml)
54
55
  end
55
56
 
56
- def table_validate(doc)
57
- doc.xpath("//table[colgroup]").each do |t|
58
- maxrowcols_validate(t, t.xpath("./colgroup/col").size)
59
- end
60
- doc.xpath("//table[.//*[@colspan] | .//*[@rowspan]]").each do |t|
61
- maxrowcols_validate(t, max_td_count(t))
62
- end
63
- end
64
-
65
- def max_td_count(table)
66
- max = 0
67
- table.xpath("./tr").each do |tr|
68
- n = tr.xpath("./td | ./th").size
69
- max < n and max = n
70
- end
71
- max
72
- end
73
-
74
- def maxrowcols_validate(table, maxcols)
75
- cells2d = table.xpath("./*/tr").each_with_object([]) { |_r, m| m << {} }
76
- table.xpath("./*/tr").each_with_index do |tr, r|
77
- curr = 0
78
- tr.xpath("./td | ./th").each do |td|
79
- curr = maxcols_validate1(td, r, curr, cells2d, maxcols)
80
- end
81
- end
82
- maxrows_validate(table, cells2d)
83
- end
84
-
85
- # code doesn't actually do anything, since Asciidoctor refuses to generate
86
- # table with inconsistent column count
87
- def maxcols_validate1(tcell, row, curr, cells2d, maxcols)
88
- rs = tcell&.attr("rowspan")&.to_i || 1
89
- cs = tcell&.attr("colspan")&.to_i || 1
90
- curr = table_tracker_update(cells2d, row, curr, rs, cs)
91
- maxcols_check(curr + cs - 1, maxcols, tcell)
92
- curr + cs
93
- end
94
-
95
- def table_tracker_update(cells2d, row, curr, rowspan, colspan)
96
- cells2d[row] ||= {}
97
- while cells2d[row][curr]
98
- curr += 1
99
- end
100
- (row..(row + rowspan - 1)).each do |y2|
101
- cells2d[y2] ||= {}
102
- (curr..(curr + colspan - 1)).each { |x2| cells2d[y2][x2] = 1 }
103
- end
104
- curr
105
- end
106
-
107
- def maxrows_validate(table, cells2d)
108
- if cells2d.any? { |x| x.size != cells2d.first.size }
109
- @log.add("Table", table,
110
- "Table rows in table are inconsistent: check rowspan")
111
- @fatalerror << "Table rows in table are inconsistent: check rowspan"
112
- end
113
- end
114
-
115
- # if maxcols or maxrows negative, do not check them
116
- def maxcols_check(col, maxcols, tcell)
117
- if maxcols.positive? && col > maxcols
118
- @log.add("Table", tcell, "Table exceeds maximum number of columns "\
119
- "defined (#{maxcols})")
120
- @fatalerror << "Table exceeds maximum number of columns defined "\
121
- "(#{maxcols})"
122
- end
123
- end
124
-
125
57
  def norm_ref_validate(doc)
126
58
  found = false
127
59
  doc.xpath("//references[@normative = 'true']/bibitem").each do |b|
@@ -0,0 +1,91 @@
1
+ module Metanorma
2
+ module Standoc
3
+ module Validate
4
+ def table_validate(doc)
5
+ doc.xpath("//table[colgroup]").each do |t|
6
+ maxrowcols_validate(t, t.xpath("./colgroup/col").size)
7
+ end
8
+ doc.xpath("//table[.//*[@colspan] | .//*[@rowspan]]").each do |t|
9
+ maxrowcols_validate(t, max_td_count(t), mode: "row_cols")
10
+ end
11
+ doc.xpath("//table[.//*[@rowspan]]").each do |t|
12
+ maxrowcols_validate(t, max_td_count(t), mode: "thead_row")
13
+ end
14
+ end
15
+
16
+ def max_td_count(table)
17
+ max = 0
18
+ table.xpath("./tr").each do |tr|
19
+ n = tr.xpath("./td | ./th").size
20
+ max < n and max = n
21
+ end
22
+ max
23
+ end
24
+
25
+ def maxrowcols_validate(table, maxcols, mode: "row_cols")
26
+ case mode
27
+ when "row_cols"
28
+ maxrowcols_validate0(table, maxcols, "*", mode)
29
+ when "thead_row"
30
+ %w{thead tbody tfoot}.each do |w|
31
+ maxrowcols_validate0(table, maxcols, w, mode)
32
+ end
33
+ end
34
+ end
35
+
36
+ def maxrowcols_validate0(table, maxcols, tablechild, mode)
37
+ cells2d = table.xpath("./#{tablechild}/tr")
38
+ .each_with_object([]) { |_r, m| m << {} }
39
+ table.xpath("./#{tablechild}/tr").each_with_index do |tr, r|
40
+ curr = 0
41
+ tr.xpath("./td | ./th").each do |td|
42
+ curr = maxcols_validate1(td, r, curr, cells2d, maxcols, mode)
43
+ end
44
+ end
45
+ maxrows_validate(table, cells2d, tablechild, mode)
46
+ end
47
+
48
+ # code doesn't actually do anything, since Asciidoctor refuses to generate
49
+ # table with inconsistent column count
50
+ def maxcols_validate1(tcell, row, curr, cells2d, maxcols, mode)
51
+ rs = tcell&.attr("rowspan")&.to_i || 1
52
+ cs = tcell&.attr("colspan")&.to_i || 1
53
+ curr = table_tracker_update(cells2d, row, curr, rs, cs)
54
+ maxcols_check(curr + cs - 1, maxcols, tcell) if mode == "row_cols"
55
+ curr + cs
56
+ end
57
+
58
+ def table_tracker_update(cells2d, row, curr, rowspan, colspan)
59
+ cells2d[row] ||= {}
60
+ while cells2d[row][curr]
61
+ curr += 1
62
+ end
63
+ (row..(row + rowspan - 1)).each do |y2|
64
+ cells2d[y2] ||= {}
65
+ (curr..(curr + colspan - 1)).each { |x2| cells2d[y2][x2] = 1 }
66
+ end
67
+ curr
68
+ end
69
+
70
+ def maxrows_validate(table, cells2d, tablechild, mode)
71
+ err = "are inconsistent"
72
+ mode == "thead_row" and err = "cannot go outside #{tablechild}"
73
+ err = "Table rows in table #{err}: check rowspan"
74
+ if cells2d.any? { |x| x.size != cells2d.first.size }
75
+ @log.add("Table", table, err)
76
+ @fatalerror << err
77
+ end
78
+ end
79
+
80
+ # if maxcols or maxrows negative, do not check them
81
+ def maxcols_check(col, maxcols, tcell)
82
+ if maxcols.positive? && col > maxcols
83
+ @log.add("Table", tcell, "Table exceeds maximum number of columns "\
84
+ "defined (#{maxcols})")
85
+ @fatalerror << "Table exceeds maximum number of columns defined "\
86
+ "(#{maxcols})"
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.2.0".freeze
22
+ VERSION = "2.2.1.1".freeze
23
23
  end
24
24
  end
@@ -36,8 +36,8 @@ Gem::Specification.new do |spec|
36
36
  spec.add_dependency "concurrent-ruby"
37
37
  spec.add_dependency "latexmath"
38
38
  spec.add_dependency "mathml2asciimath"
39
- spec.add_dependency "metanorma-utils", "~> 1.2.8"
40
- spec.add_dependency "relaton-cli", "~> 1.12.0"
39
+ spec.add_dependency "mn-requirements", "~> 0.0.1"
40
+ spec.add_dependency "relaton-cli", "~> 1.13.0"
41
41
  spec.add_dependency "relaton-iev", "~> 1.1.0"
42
42
  spec.add_dependency "unicode2latex", "~> 0.0.1"
43
43
 
@@ -235,7 +235,7 @@ RSpec.describe Metanorma::Standoc do
235
235
  person::
236
236
  name:::
237
237
  language:::: en
238
- initial:::: A.
238
+ formatted_initials:::: A.
239
239
  surname:::: Bierman
240
240
  affiliation:::
241
241
  +
@@ -377,8 +377,8 @@ RSpec.describe Metanorma::Standoc do
377
377
  <role type="author"/>
378
378
  <person>
379
379
  <name>
380
- <initial language="en">A.</initial>
381
- <surname language="en">Bierman</surname>
380
+ <formatted-initials>A.</formatted-initials>
381
+ <surname>Bierman</surname>
382
382
  </name>
383
383
  <affiliation>
384
384
  <description language="en" script="Latn">Affiliation description</description>
@@ -590,7 +590,7 @@ RSpec.describe Metanorma::Standoc do
590
590
  contributor.role:: publisher
591
591
  contributor::
592
592
  contributor.person.name.language:: en
593
- contributor.person.name.initial:: A.
593
+ contributor.person.name.formatted_initials:: A.
594
594
  contributor.person.name.surname:: Bierman
595
595
  contributor.person.affiliation.organization.name:: IETF
596
596
  contributor.person.affiliation.organization.abbreviation:: IETF
@@ -706,8 +706,8 @@ RSpec.describe Metanorma::Standoc do
706
706
  <role type="author"/>
707
707
  <person>
708
708
  <name>
709
- <initial language="en">A.</initial>
710
- <surname language="en">Bierman</surname>
709
+ <formatted-initials>A.</formatted-initials>
710
+ <surname>Bierman</surname>
711
711
  </name>
712
712
  <affiliation>
713
713
  <description language="en" script="Latn">Affiliation description</description>
@@ -896,7 +896,7 @@ RSpec.describe Metanorma::Standoc do
896
896
  [bibliography]
897
897
  === Normative References
898
898
 
899
- * [[[A, B]]], s:surname[Wozniak], s:initials[S.] & s:givenname[Steve] s:surname[Jobs]. s:pubyear[1996]. s:title[_Work_]. In s:surname.editor[Gates], s:initials.editor[W. H], Collected Essays. s:docid.ISO[ISO 1234]. s:pubplace[Geneva]: s:publisher[International Standardization Organization]. s:uri.citation[http://www.example.com]. s:type[inbook]
899
+ * [[[A, B]]], span:surname[Wozniak], span:initials[S.] & span:givenname[Steve] span:surname[Jobs]. span:pubyear[1996]. span:title[_Work_]. In span:surname.editor[Gates], span:initials.editor[W. H], Collected Essays. span:docid.ISO[ISO 1234]. span:pubplace[Geneva]: span:publisher[International Standardization Organization]. span:uri.citation[http://www.example.com]. span:type[inbook]
900
900
  INPUT
901
901
  output = <<~OUTPUT
902
902
  #{BLANK_HDR}
@@ -933,7 +933,7 @@ RSpec.describe Metanorma::Standoc do
933
933
  <role type='author'/>
934
934
  <person>
935
935
  <name>
936
- <initial>S.</initial>
936
+ <formatted-initials>S.</formatted-initials>
937
937
  <surname>Wozniak</surname>
938
938
  </name>
939
939
  </person>
@@ -951,7 +951,7 @@ RSpec.describe Metanorma::Standoc do
951
951
  <role type='editor'/>
952
952
  <person>
953
953
  <name>
954
- <initial>W. H</initial>
954
+ <formatted-initials>W. H</formatted-initials>
955
955
  <surname>Gates</surname>
956
956
  </name>
957
957
  </person>
@@ -456,16 +456,16 @@ RSpec.describe Metanorma::Standoc do
456
456
  ====
457
457
  INPUT
458
458
  output = <<~OUTPUT
459
- #{BLANK_HDR}
460
- <sections>
461
- <clause id='_' inline-header='false' obligation='normative'>
462
- <title>Clause</title>
463
- <termnote id='_'>
464
- <p id='_'>XYZ</p>
465
- </termnote>
466
- </clause>
467
- </sections>
468
- </standard-document>
459
+ #{BLANK_HDR}
460
+ <sections>
461
+ <clause id='_' inline-header='false' obligation='normative'>
462
+ <title>Clause</title>
463
+ <termnote id='_'>
464
+ <p id='_'>XYZ</p>
465
+ </termnote>
466
+ </clause>
467
+ </sections>
468
+ </standard-document>
469
469
  OUTPUT
470
470
  expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
471
471
  .to be_equivalent_to xmlpp(output)
@@ -764,16 +764,16 @@ RSpec.describe Metanorma::Standoc do
764
764
  ====
765
765
  INPUT
766
766
  output = <<~OUTPUT
767
- #{BLANK_HDR}
768
- <sections>
769
- <clause id='_' inline-header='false' obligation='normative'>
770
- <title>Clause</title>
771
- <termexample id='_'>
772
- <p id='_'>XYZ</p>
773
- </termexample>
774
- </clause>
775
- </sections>
776
- </standard-document>
767
+ #{BLANK_HDR}
768
+ <sections>
769
+ <clause id='_' inline-header='false' obligation='normative'>
770
+ <title>Clause</title>
771
+ <termexample id='_'>
772
+ <p id='_'>XYZ</p>
773
+ </termexample>
774
+ </clause>
775
+ </sections>
776
+ </standard-document>
777
777
  OUTPUT
778
778
  expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
779
779
  .to be_equivalent_to xmlpp(output)
@@ -1616,252 +1616,6 @@ RSpec.describe Metanorma::Standoc do
1616
1616
  .to be_equivalent_to xmlpp(output)
1617
1617
  end
1618
1618
 
1619
- it "processes recommendation" do
1620
- input = <<~"INPUT"
1621
- #{ASCIIDOC_BLANK_HDR}
1622
- [.recommendation,identifier="/ogc/recommendation/wfs/2",subject="user;developer, implementer",inherit="/ss/584/2015/level/1; /ss/584/2015/level/2",options="unnumbered",type=verification,model=ogc,tag=X,multilingual-rendering=common]
1623
- ====
1624
- I recommend this
1625
- ====
1626
- INPUT
1627
- output = <<~"OUTPUT"
1628
- #{BLANK_HDR}
1629
- <sections>
1630
- <recommendation id="_" unnumbered="true" type="verification" model="ogc" tag='X' multilingual-rendering='common'>
1631
- <identifier>/ogc/recommendation/wfs/2</identifier>
1632
- <subject>user</subject>
1633
- <subject>developer, implementer</subject>
1634
- <inherit>/ss/584/2015/level/1</inherit>
1635
- <inherit>/ss/584/2015/level/2</inherit>
1636
- <description><p id="_">I recommend this</p>
1637
- </description>
1638
- </recommendation>
1639
- </sections>
1640
- </standard-document>
1641
- OUTPUT
1642
-
1643
- expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1644
- .to be_equivalent_to xmlpp(output)
1645
- end
1646
-
1647
- it "processes requirement" do
1648
- input = <<~"INPUT"
1649
- #{ASCIIDOC_BLANK_HDR}
1650
- [[ABC]]
1651
- [.requirement,subsequence="A",inherit="/ss/584/2015/level/1 &amp; /ss/584/2015/level/2",number=3,keep-with-next=true,keep-lines-together=true,tag=X,multilingual-rendering=common]
1652
- .Title
1653
- ====
1654
- I recommend this
1655
-
1656
- . http://www.example.com[]
1657
- . <<ABC>>
1658
- ====
1659
- INPUT
1660
- output = <<~OUTPUT
1661
- #{BLANK_HDR}
1662
- <sections>
1663
- <requirement id="ABC" subsequence="A" number="3" keep-with-next="true" keep-lines-together="true" tag='X' multilingual-rendering='common'>
1664
- <title>Title</title>
1665
- <inherit>/ss/584/2015/level/1 &amp; /ss/584/2015/level/2</inherit>
1666
- <description><p id="_">I recommend this</p>
1667
- <ol id='_' type='arabic'>
1668
- <li>
1669
- <p id='_'>
1670
- <link target='http://www.example.com'/>
1671
- </p>
1672
- </li>
1673
- <li>
1674
- <p id='_'>
1675
- <xref target='ABC'/>
1676
- </p>
1677
- </li>
1678
- </ol>
1679
- </description>
1680
- </requirement>
1681
- </sections>
1682
- </standard-document>
1683
- OUTPUT
1684
-
1685
- expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1686
- .to be_equivalent_to xmlpp(output)
1687
- end
1688
-
1689
- it "processes permission" do
1690
- input = <<~"INPUT"
1691
- #{ASCIIDOC_BLANK_HDR}
1692
-
1693
- [[ABC]]
1694
- [.permission,tag=X,multilingual-rendering=common]
1695
- ====
1696
- I recommend this
1697
- ====
1698
- INPUT
1699
- output = <<~"OUTPUT"
1700
- #{BLANK_HDR}
1701
- <sections>
1702
- <permission id="ABC" tag='X' multilingual-rendering='common'>
1703
- <description><p id="_">I recommend this</p></description>
1704
- </permission>
1705
- </sections>
1706
- </standard-document>
1707
- OUTPUT
1708
-
1709
- expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1710
- .to be_equivalent_to xmlpp(output)
1711
- end
1712
-
1713
- it "processes nested permissions" do
1714
- input = <<~"INPUT"
1715
- #{ASCIIDOC_BLANK_HDR}
1716
- [.permission]
1717
- ====
1718
- I permit this
1719
-
1720
- =====
1721
- Example 2
1722
- =====
1723
-
1724
- [.permission]
1725
- =====
1726
- I also permit this
1727
-
1728
- . List
1729
- . List
1730
- =====
1731
-
1732
- [requirement,type="general",identifier="/req/core/quantities-uom"]
1733
- ======
1734
- ======
1735
- ====
1736
- INPUT
1737
- output = <<~"OUTPUT"
1738
- #{BLANK_HDR}
1739
- <sections>
1740
- <permission id="_"><description><p id="_">I permit this</p>
1741
- <example id="_">
1742
- <p id="_">Example 2</p>
1743
- </example></description>
1744
- <permission id="_">
1745
- <description><p id="_">I also permit this</p>
1746
- <ol id='_' type='arabic'>
1747
- <li>
1748
- <p id='_'>List</p>
1749
- </li>
1750
- <li>
1751
- <p id='_'>List</p>
1752
- </li>
1753
- </ol>
1754
- </description>
1755
- </permission>
1756
- <requirement id='_' type='general'>
1757
- <identifier>/req/core/quantities-uom</identifier>
1758
- </requirement>
1759
- </permission>
1760
- </sections>
1761
- </standard-document>
1762
- OUTPUT
1763
-
1764
- expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1765
- .to be_equivalent_to xmlpp(output)
1766
- end
1767
-
1768
- it "processes recommendation with internal markup of structure" do
1769
- input = <<~"INPUT"
1770
- #{ASCIIDOC_BLANK_HDR}
1771
-
1772
- [[ABC]]
1773
- [.recommendation,identifier="/ogc/recommendation/wfs/2",subject="user",classification="control-class:Technical;priority:P0;family:System &amp; Communications Protection,System and Communications Protocols",obligation="permission,recommendation",filename="reqt1.rq"]
1774
- ====
1775
- I recommend _this_.
1776
-
1777
- [.specification,type="tabular",keep-with-next=true,keep-lines-together=true]
1778
- --
1779
- This is the object of the recommendation:
1780
- |===
1781
- |Object |Value
1782
- |Mission | Accomplished
1783
- |===
1784
- --
1785
-
1786
- As for the measurement targets,
1787
-
1788
- [.measurement-target]
1789
- --
1790
- The measurement target shall be measured as:
1791
- [stem]
1792
- ++++
1793
- r/1 = 0
1794
- ++++
1795
- --
1796
-
1797
- [.verification]
1798
- --
1799
- The following code will be run for verification:
1800
-
1801
- [source,CoreRoot]
1802
- ----
1803
- CoreRoot(success): HttpResponse
1804
- if (success)
1805
- recommendation(label: success-response)
1806
- end
1807
- ----
1808
- --
1809
-
1810
- [.import%exclude]
1811
- --
1812
- [source,CoreRoot]
1813
- ----
1814
- success-response()
1815
- ----
1816
- --
1817
-
1818
- [.component]
1819
- --
1820
- Hello
1821
- --
1822
-
1823
- [.component,class=condition]
1824
- --
1825
- If this be thus
1826
- --
1827
- ====
1828
- INPUT
1829
- output = <<~"OUTPUT"
1830
- #{BLANK_HDR}
1831
- <sections>
1832
- <recommendation id="ABC" obligation="permission,recommendation" filename="reqt1.rq"><identifier>/ogc/recommendation/wfs/2</identifier><subject>user</subject>
1833
- <classification><tag>control-class</tag><value>Technical</value></classification><classification><tag>priority</tag><value>P0</value></classification><classification><tag>family</tag><value>System &amp; Communications Protection</value></classification><classification><tag>family</tag><value>System and Communications Protocols</value></classification>
1834
- <description><p id="_">I recommend <em>this</em>.</p>
1835
- </description><specification exclude="false" type="tabular" keep-with-next="true" keep-lines-together="true"><p id="_">This is the object of the recommendation:</p><table id="_"> <tbody> <tr> <td valign="top" align="left">Object</td> <td valign="top" align="left">Value</td> </tr> <tr> <td valign="top" align="left">Mission</td> <td valign="top" align="left">Accomplished</td> </tr> </tbody></table></specification><description>
1836
- <p id="_">As for the measurement targets,</p>
1837
- </description><measurement-target exclude="false"><p id="_">The measurement target shall be measured as:</p><formula id="_"> <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mfrac>
1838
- <mrow>
1839
- <mi>r</mi>
1840
- </mrow>
1841
- <mrow>
1842
- <mn>1</mn>
1843
- </mrow>
1844
- </mfrac><mo>=</mo><mn>0</mn></math></stem></formula></measurement-target>
1845
- <verification exclude="false"><p id="_">The following code will be run for verification:</p><sourcecode lang="CoreRoot" id="_">CoreRoot(success): HttpResponse
1846
- if (success)
1847
- recommendation(label: success-response)
1848
- end</sourcecode></verification>
1849
- <import exclude="true"> <sourcecode lang="CoreRoot" id="_">success-response()</sourcecode></import>
1850
- <component exclude='false' class='component'>
1851
- <p id='_'>Hello</p>
1852
- </component>
1853
- <component exclude='false' class='condition'>
1854
- <p id='_'>If this be thus</p>
1855
- </component>
1856
- </recommendation>
1857
- </sections>
1858
- </standard-document>
1859
- OUTPUT
1860
-
1861
- expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1862
- .to be_equivalent_to xmlpp(output)
1863
- end
1864
-
1865
1619
  it "processes delete change clauses" do
1866
1620
  input = <<~"INPUT"
1867
1621
  #{ASCIIDOC_BLANK_HDR}