metanorma-bipm 1.0.3 → 1.1.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: 70abc01a43829c12c4870dc4072a2a5f919cd2a5a7d306e579b3fa619020f851
4
- data.tar.gz: 7ef810393fb2f5d107554fd45195f0297a3421d4deb0d314b6d9820456fbe93d
3
+ metadata.gz: a53880abd1573a497cf5de514c78f002e9ad698fb7f9899babde3840132af5ee
4
+ data.tar.gz: 47c1fbccab81b1614f8692c7605d77c25d16d7324a5113b2d615b560f3e2a136
5
5
  SHA512:
6
- metadata.gz: cd67915975f6dc2107e1868bc62bb6942ba9f1fe4f6dcee81d48334d45b2e02053513d51f3fe792e439f66387208ac33d288713513015761b1e27a5dbae24329
7
- data.tar.gz: ede610fd77af7ea69e3073e88fde59c0bd567699fbda50b51bfcb3fad47f4aad00a3bf1e59b4597fa9c2a0485e9ea69c1dcb5b5a7bf430794e78cbd1667a3dab
6
+ metadata.gz: 525c38fd4e67b10703a2811fd0f5b45958bd00eff0675b23ccc427d7a03d4755c059ace2209dd60c78823666cbf8af6cbf6015d16029dc6f68a088634fbac470
7
+ data.tar.gz: 9598204d734b04605900681eaf3da059e8f2a70002858156e9bfb23694e91b4114786d22824cf182696b3b53366bf92f7df97edefae21035c30d31427246fa72
@@ -4,7 +4,7 @@ name: rake
4
4
 
5
5
  on:
6
6
  push:
7
- branches: [ master, main ]
7
+ branches: [ master, main ]
8
8
  tags: [ v* ]
9
9
  pull_request:
10
10
 
@@ -16,50 +16,27 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: [ '2.6', '2.5', '2.4' ]
19
+ ruby: [ '2.7', '2.6', '2.5', '2.4' ]
20
20
  os: [ ubuntu-latest, windows-latest, macos-latest ]
21
21
  experimental: [ false ]
22
22
  include:
23
- - ruby: '2.7'
23
+ - ruby: '3.0'
24
24
  os: 'ubuntu-latest'
25
25
  experimental: true
26
- - ruby: '2.7'
26
+ - ruby: '3.0'
27
27
  os: 'windows-latest'
28
28
  experimental: true
29
- - ruby: '2.7'
29
+ - ruby: '3.0'
30
30
  os: 'macos-latest'
31
31
  experimental: true
32
32
  steps:
33
- - uses: actions/checkout@master
33
+ - uses: actions/checkout@v2
34
+ with:
35
+ submodules: true
34
36
 
35
37
  - uses: ruby/setup-ruby@v1
36
38
  with:
37
39
  ruby-version: ${{ matrix.ruby }}
38
-
39
- - if: matrix.os == 'macos-latest'
40
- run: brew install autoconf automake libtool
41
-
42
- - uses: actions/cache@v2
43
- with:
44
- path: vendor/bundle
45
- key: bundle-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
46
- restore-keys: bundle-${{ matrix.os }}-${{ matrix.ruby }}
47
-
48
- - run: bundle config set path 'vendor/bundle'
49
-
50
- - run: bundle install --jobs 4 --retry 3
40
+ bundler-cache: true
51
41
 
52
42
  - run: bundle exec rake
53
-
54
- tests-passed:
55
- needs: rake
56
- runs-on: ubuntu-latest
57
- steps:
58
- - name: Trigger tests passed event
59
- uses: Sibz/github-status-action@v1
60
- with:
61
- authToken: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
62
- context: 'tests-passed-successfully'
63
- description: 'Tests passed successfully'
64
- state: 'success'
65
- sha: ${{ github.event.pull_request.head.sha || github.sha }}
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ .rubocop-https--*
data/.rubocop.yml ADDED
@@ -0,0 +1,14 @@
1
+ # This project follows the Ribose OSS style guide.
2
+ # https://github.com/riboseinc/oss-guides
3
+ # All project-specific additions and overrides should be specified in this file.
4
+ inherit_from:
5
+ - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
6
+
7
+ # local repo-specific modifications
8
+
9
+ AllCops:
10
+ DisplayCopNames: false
11
+ StyleGuideCopsOnly: false
12
+ TargetRubyVersion: 2.4
13
+ Rails:
14
+ Enabled: true
@@ -124,7 +124,7 @@
124
124
  <value>application/tei+xml</value>
125
125
  <value>text/x-asciidoc</value>
126
126
  <value>text/markdown</value>
127
- <value>application/x-isodoc+xml</value>
127
+ <value>application/x-metanorma+xml</value>
128
128
  <text/>
129
129
  </choice>
130
130
  </attribute>
@@ -452,6 +452,7 @@
452
452
  <attribute name="type">
453
453
  <choice>
454
454
  <value>isni</value>
455
+ <value>orcid</value>
455
456
  <value>uri</value>
456
457
  </choice>
457
458
  </attribute>
@@ -461,10 +462,7 @@
461
462
  <define name="org-identifier">
462
463
  <element name="identifier">
463
464
  <attribute name="type">
464
- <choice>
465
- <value>orcid</value>
466
- <value>uri</value>
467
- </choice>
465
+ <data type="string" datatypeLibrary=""/>
468
466
  </attribute>
469
467
  <text/>
470
468
  </element>
@@ -1106,7 +1104,7 @@
1106
1104
  <value>complementOf</value>
1107
1105
  <value>obsoletes</value>
1108
1106
  <value>obsoletedBy</value>
1109
- <value>cited</value>
1107
+ <value>cites</value>
1110
1108
  <value>isCitedIn</value>
1111
1109
  </choice>
1112
1110
  </define>
@@ -340,6 +340,9 @@
340
340
  <zeroOrMore>
341
341
  <ref name="termdocsource"/>
342
342
  </zeroOrMore>
343
+ <optional>
344
+ <ref name="misccontainer"/>
345
+ </optional>
343
346
  <optional>
344
347
  <ref name="boilerplate"/>
345
348
  </optional>
@@ -355,6 +358,9 @@
355
358
  <optional>
356
359
  <ref name="bibliography"/>
357
360
  </optional>
361
+ <zeroOrMore>
362
+ <ref name="indexsect"/>
363
+ </zeroOrMore>
358
364
  </element>
359
365
  </define>
360
366
  </grammar>
@@ -1,5 +1,5 @@
1
1
  require "asciidoctor/standoc/converter"
2
- require 'asciidoctor/generic/converter'
2
+ require "asciidoctor/generic/converter"
3
3
 
4
4
  module Asciidoctor
5
5
  module BIPM
@@ -19,20 +19,26 @@ module Asciidoctor
19
19
  end
20
20
 
21
21
  def org_abbrev
22
- { org_name_long => configuration.organization_name_short }
22
+ { org_name_long => configuration.organization_name_short }
23
23
  end
24
24
 
25
25
  def metadata_committee(node, xml)
26
26
  return unless node.attr("committee-en") || node.attr("committee-fr")
27
+
27
28
  xml.editorialgroup do |a|
28
29
  metadata_committee1(node, a)
29
- metadata_committee2(node, a)
30
+ i = 2
31
+ while node.attr("committee-en_#{i}") || node.attr("committee-fr_#{i}")
32
+ metadata_committee2(node, a, i)
33
+ i += 1
34
+ end
30
35
  metadata_workgroup(node, a)
31
36
  end
32
37
  end
33
38
 
34
- def metadata_committee1(node, a)
35
- a.committee **attr_code(acronym: node.attr("committee-acronym")) do |c|
39
+ def metadata_committee1(node, xml)
40
+ xml.committee **attr_code(acronym:
41
+ node.attr("committee-acronym")) do |c|
36
42
  e = node.attr("committee-en") and
37
43
  c.variant e, language: "en", script: "Latn"
38
44
  e = node.attr("committee-fr") and
@@ -40,24 +46,25 @@ module Asciidoctor
40
46
  end
41
47
  end
42
48
 
43
- def metadata_committee2(node, a)
44
- i = 2
45
- while node.attr("committee-en_#{i}") || node.attr("committee-fr_#{i}") do
46
- a.committee **attr_code(acronym: node.attr("committee-acronym_#{i}")) do |c|
47
- e = node.attr("committee-en_#{i}") and c.variant e, language: "en", script: "Latn"
48
- e = node.attr("committee-fr_#{i}") and c.variant e, language: "fr", script: "Latn"
49
+ def metadata_committee2(node, xml, num)
50
+ xml.committee **attr_code(acronym:
51
+ node.attr("committee-acronym_#{num}")) do |c|
52
+ %w(en fr).each do |lg|
53
+ e = node.attr("committee-#{lg}_#{num}") and
54
+ c.variant e, language: lg, script: "Latn"
49
55
  end
50
- i += 1
51
56
  end
52
57
  end
53
58
 
54
- def metadata_workgroup(node, a)
55
- a.workgroup node.attr("workgroup"),
56
- **attr_code(acronym: node.attr("workgroup-acronym"))
59
+ def metadata_workgroup(node, xml)
60
+ xml.workgroup(node.attr("workgroup"),
61
+ **attr_code(acronym: node.attr("workgroup-acronym")))
57
62
  i = 2
58
- while node.attr("workgroup_#{i}") do
59
- a.workgroup node.attr("workgroup_#{i}"),
63
+ while node.attr("workgroup_#{i}")
64
+ xml.workgroup(
65
+ node.attr("workgroup_#{i}"),
60
66
  **attr_code(acronym: node.attr("workgroup-acronym_#{i}"))
67
+ )
61
68
  i += 1
62
69
  end
63
70
  end
@@ -76,13 +83,15 @@ module Asciidoctor
76
83
  draft = node.attr("supersedes-draft#{suffix}")
77
84
  edition = node.attr("supersedes-edition#{suffix}")
78
85
  return false unless d || draft || edition
86
+
79
87
  relation_supersedes_self1(xml, d, edition, draft)
80
88
  end
81
89
 
82
- def relation_supersedes_self1(xml, d, edition, draft)
90
+ def relation_supersedes_self1(xml, date, edition, draft)
83
91
  xml.relation **{ type: "supersedes" } do |r|
84
92
  r.bibitem do |b|
85
- d and b.date d, **{ type: edition ? "published" : "circulated" }
93
+ date and b.date(date,
94
+ **{ type: edition ? "published" : "circulated" })
86
95
  edition and b.edition edition
87
96
  draft and b.version do |v|
88
97
  v.draft draft
@@ -91,13 +100,13 @@ module Asciidoctor
91
100
  end
92
101
  end
93
102
 
94
- def personal_role(node, c, suffix)
103
+ def personal_role(node, xml, suffix)
95
104
  role = node.attr("role#{suffix}") || "author"
96
105
  unless %w(author editor).include?(role.downcase)
97
106
  desc = role
98
107
  role = "editor"
99
108
  end
100
- c.role desc, **{ type: role.downcase }
109
+ xml.role desc, **{ type: role.downcase }
101
110
  end
102
111
 
103
112
  def title(node, xml)
@@ -106,7 +115,7 @@ module Asciidoctor
106
115
  xml.title **attr_code(at.merge(type: "main")) do |t1|
107
116
  t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-#{lang}"))
108
117
  end
109
- %w(cover appendix annex part subpart).each do |w|
118
+ %w(cover appendix annex part subpart provenance).each do |w|
110
119
  typed_title(node, xml, lang, w)
111
120
  end
112
121
  end
@@ -115,6 +124,7 @@ module Asciidoctor
115
124
  def typed_title(node, xml, lang, type)
116
125
  at = { language: lang, format: "text/plain" }
117
126
  return unless title = node.attr("title-#{type}-#{lang}")
127
+
118
128
  xml.title **attr_code(at.merge(type: type)) do |t1|
119
129
  t1 << Metanorma::Utils::asciidoc_sub(title)
120
130
  end
@@ -122,7 +132,7 @@ module Asciidoctor
122
132
 
123
133
  def sectiontype_streamline(ret)
124
134
  case ret
125
- when "introduction" then "clause"
135
+ when "introduction" then @jcgm ? "introduction" : "clause"
126
136
  else
127
137
  super
128
138
  end
@@ -130,13 +140,13 @@ module Asciidoctor
130
140
 
131
141
  def inline_anchor_xref_attrs(node)
132
142
  flags = %w(pagenumber nosee nopage).each_with_object({}) do |w, m|
133
- if /#{w}%/.match(node.text)
143
+ if /#{w}%/.match?(node.text)
134
144
  node.text = node.text.sub(/#{w}%/, "")
135
145
  m[w] = true
136
146
  end
137
147
  end
138
148
  ret = super
139
- flags.keys.each { |k| ret[k.to_sym] = true }
149
+ flags.each_key { |k| ret[k.to_sym] = true }
140
150
  ret
141
151
  end
142
152
 
@@ -154,9 +164,6 @@ module Asciidoctor
154
164
  super.merge(attr_code(start: node.attr("start")))
155
165
  end
156
166
 
157
- def section_names_terms_cleanup(x)
158
- end
159
-
160
167
  def committee_validate(xml)
161
168
  committees = Array(configuration&.committees) || return
162
169
  committees.empty? and return
@@ -173,21 +180,44 @@ module Asciidoctor
173
180
  end
174
181
 
175
182
  def boilerplate_file(xmldoc)
176
- return super unless xmldoc&.at("//bibdata/ext/editorialgroup/committee/@acronym")&.value == "JCGM"
177
- baselocation("lib/asciidoctor/bipm/boilerplate-jcgm-en.xml")
183
+ return super unless @jcgm
184
+
185
+ File.join(File.dirname(__FILE__), "boilerplate-jcgm-en.xml")
186
+ end
187
+
188
+ def sections_cleanup(xml)
189
+ super
190
+ jcgm_untitled_sections_cleanup(xml) if @jcgm
191
+ end
192
+
193
+ def jcgm_untitled_sections_cleanup(xml)
194
+ xml.xpath("//clause//clause | //annex//clause").each do |c|
195
+ next if !c&.at("./title")&.text&.empty?
196
+
197
+ c["inline-header"] = true
198
+ end
178
199
  end
179
200
 
201
+ def section_names_terms_cleanup(xml); end
202
+
203
+ def section_names_refs_cleanup(xml); end
204
+
180
205
  def mathml_mi_italics
181
206
  { uppergreek: false, upperroman: false,
182
207
  lowergreek: false, lowerroman: true }
183
208
  end
184
209
 
210
+ def document(node)
211
+ @jcgm = node.attr("committee-acronym") == "JCGM"
212
+ super
213
+ end
214
+
185
215
  def outputs(node, ret)
186
- File.open(@filename + ".xml", "w:UTF-8") { |f| f.write(ret) }
187
- presentation_xml_converter(node).convert(@filename + ".xml")
188
- html_converter(node).convert(@filename + ".presentation.xml",
216
+ File.open("#{@filename}.xml", "w:UTF-8") { |f| f.write(ret) }
217
+ presentation_xml_converter(node).convert("#{@filename}.xml")
218
+ html_converter(node).convert("#{@filename}.presentation.xml",
189
219
  nil, false, "#{@filename}.html")
190
- pdf_converter(node)&.convert(@filename + ".presentation.xml",
220
+ pdf_converter(node)&.convert("#{@filename}.presentation.xml",
191
221
  nil, false, "#{@filename}.pdf")
192
222
  end
193
223
 
@@ -201,6 +231,7 @@ module Asciidoctor
201
231
 
202
232
  def pdf_converter(node)
203
233
  return nil if node.attr("no-pdf")
234
+
204
235
  IsoDoc::BIPM::PdfConvert.new(doc_extract_attributes(node))
205
236
  end
206
237
  end
@@ -86,6 +86,35 @@
86
86
  <text/>
87
87
  </element>
88
88
  </define>
89
+ <define name="erefType">
90
+ <optional>
91
+ <attribute name="normative">
92
+ <data type="boolean"/>
93
+ </attribute>
94
+ </optional>
95
+ <attribute name="citeas"/>
96
+ <attribute name="type">
97
+ <ref name="ReferenceFormat"/>
98
+ </attribute>
99
+ <optional>
100
+ <attribute name="alt"/>
101
+ </optional>
102
+ <optional>
103
+ <attribute name="case">
104
+ <choice>
105
+ <value>capital</value>
106
+ <value>lowercase</value>
107
+ </choice>
108
+ </attribute>
109
+ </optional>
110
+ <optional>
111
+ <attribute name="droploc">
112
+ <data type="boolean"/>
113
+ </attribute>
114
+ </optional>
115
+ <ref name="CitationType"/>
116
+ <text/>
117
+ </define>
89
118
  <define name="ul">
90
119
  <element name="ul">
91
120
  <attribute name="id">
@@ -102,7 +131,7 @@
102
131
  </attribute>
103
132
  </optional>
104
133
  <oneOrMore>
105
- <ref name="li"/>
134
+ <ref name="ul_li"/>
106
135
  </oneOrMore>
107
136
  <zeroOrMore>
108
137
  <ref name="note"/>
@@ -775,6 +804,78 @@
775
804
  <ref name="paragraph"/>
776
805
  </element>
777
806
  </define>
807
+ <define name="em">
808
+ <element name="em">
809
+ <zeroOrMore>
810
+ <choice>
811
+ <ref name="PureTextElement"/>
812
+ <ref name="stem"/>
813
+ <ref name="index"/>
814
+ </choice>
815
+ </zeroOrMore>
816
+ </element>
817
+ </define>
818
+ <define name="strong">
819
+ <element name="strong">
820
+ <zeroOrMore>
821
+ <choice>
822
+ <ref name="PureTextElement"/>
823
+ <ref name="stem"/>
824
+ <ref name="index"/>
825
+ </choice>
826
+ </zeroOrMore>
827
+ </element>
828
+ </define>
829
+ <define name="tt">
830
+ <element name="tt">
831
+ <zeroOrMore>
832
+ <choice>
833
+ <ref name="PureTextElement"/>
834
+ <ref name="index"/>
835
+ </choice>
836
+ </zeroOrMore>
837
+ </element>
838
+ </define>
839
+ <define name="keyword">
840
+ <element name="keyword">
841
+ <zeroOrMore>
842
+ <choice>
843
+ <ref name="PureTextElement"/>
844
+ <ref name="index"/>
845
+ </choice>
846
+ </zeroOrMore>
847
+ </element>
848
+ </define>
849
+ <define name="strike">
850
+ <element name="strike">
851
+ <zeroOrMore>
852
+ <choice>
853
+ <ref name="PureTextElement"/>
854
+ <ref name="index"/>
855
+ </choice>
856
+ </zeroOrMore>
857
+ </element>
858
+ </define>
859
+ <define name="underline">
860
+ <element name="underline">
861
+ <zeroOrMore>
862
+ <choice>
863
+ <ref name="PureTextElement"/>
864
+ <ref name="index"/>
865
+ </choice>
866
+ </zeroOrMore>
867
+ </element>
868
+ </define>
869
+ <define name="smallcap">
870
+ <element name="smallcap">
871
+ <zeroOrMore>
872
+ <choice>
873
+ <ref name="PureTextElement"/>
874
+ <ref name="index"/>
875
+ </choice>
876
+ </zeroOrMore>
877
+ </element>
878
+ </define>
778
879
  </include>
779
880
  <!-- end overrides -->
780
881
  <define name="colgroup">
@@ -793,7 +894,35 @@
793
894
  <value>internal</value>
794
895
  </define>
795
896
  <define name="TextElement" combine="choice">
796
- <ref name="concept"/>
897
+ <choice>
898
+ <ref name="concept"/>
899
+ <ref name="add"/>
900
+ <ref name="del"/>
901
+ </choice>
902
+ </define>
903
+ <define name="add">
904
+ <element name="add">
905
+ <choice>
906
+ <ref name="PureTextElement"/>
907
+ <ref name="eref"/>
908
+ <ref name="stem"/>
909
+ <ref name="keyword"/>
910
+ <ref name="xref"/>
911
+ <ref name="hyperlink"/>
912
+ </choice>
913
+ </element>
914
+ </define>
915
+ <define name="del">
916
+ <element name="del">
917
+ <choice>
918
+ <ref name="PureTextElement"/>
919
+ <ref name="eref"/>
920
+ <ref name="stem"/>
921
+ <ref name="keyword"/>
922
+ <ref name="xref"/>
923
+ <ref name="hyperlink"/>
924
+ </choice>
925
+ </element>
797
926
  </define>
798
927
  <define name="concept">
799
928
  <element name="concept">
@@ -812,6 +941,8 @@
812
941
  <ref name="requirement"/>
813
942
  <ref name="recommendation"/>
814
943
  <ref name="permission"/>
944
+ <ref name="imagemap"/>
945
+ <ref name="svgmap"/>
815
946
  </choice>
816
947
  </define>
817
948
  <define name="bibliography">
@@ -917,6 +1048,9 @@
917
1048
  </choice>
918
1049
  </attribute>
919
1050
  <ref name="bibdata"/>
1051
+ <optional>
1052
+ <ref name="misccontainer"/>
1053
+ </optional>
920
1054
  <optional>
921
1055
  <ref name="boilerplate"/>
922
1056
  </optional>
@@ -927,11 +1061,21 @@
927
1061
  <zeroOrMore>
928
1062
  <ref name="annex"/>
929
1063
  </zeroOrMore>
1064
+ <optional>
1065
+ <ref name="bibliography"/>
1066
+ </optional>
930
1067
  <zeroOrMore>
931
- <ref name="references"/>
1068
+ <ref name="indexsect"/>
932
1069
  </zeroOrMore>
933
1070
  </element>
934
1071
  </define>
1072
+ <define name="misccontainer">
1073
+ <element name="misc-container">
1074
+ <oneOrMore>
1075
+ <ref name="AnyElement"/>
1076
+ </oneOrMore>
1077
+ </element>
1078
+ </define>
935
1079
  <define name="preface">
936
1080
  <element name="preface">
937
1081
  <oneOrMore>
@@ -955,6 +1099,11 @@
955
1099
  <ref name="Content-Section"/>
956
1100
  </element>
957
1101
  </define>
1102
+ <define name="indexsect">
1103
+ <element name="indexsect">
1104
+ <ref name="Content-Section"/>
1105
+ </element>
1106
+ </define>
958
1107
  <define name="boilerplate">
959
1108
  <element name="boilerplate">
960
1109
  <optional>
@@ -1635,4 +1784,87 @@
1635
1784
  <text/>
1636
1785
  </element>
1637
1786
  </define>
1787
+ <define name="imagemap">
1788
+ <element name="imagemap">
1789
+ <ref name="figure"/>
1790
+ <zeroOrMore>
1791
+ <element name="area">
1792
+ <attribute name="type">
1793
+ <choice>
1794
+ <value>rect</value>
1795
+ <value>circle</value>
1796
+ <value>ellipse</value>
1797
+ <value>poly</value>
1798
+ </choice>
1799
+ </attribute>
1800
+ <choice>
1801
+ <ref name="xref"/>
1802
+ <ref name="hyperlink"/>
1803
+ <ref name="eref"/>
1804
+ </choice>
1805
+ <oneOrMore>
1806
+ <element name="coords">
1807
+ <attribute name="x">
1808
+ <data type="float"/>
1809
+ </attribute>
1810
+ <attribute name="y">
1811
+ <data type="float"/>
1812
+ </attribute>
1813
+ </element>
1814
+ </oneOrMore>
1815
+ <optional>
1816
+ <element name="radius">
1817
+ <attribute name="x">
1818
+ <data type="float"/>
1819
+ </attribute>
1820
+ <optional>
1821
+ <attribute name="y">
1822
+ <data type="float"/>
1823
+ </attribute>
1824
+ </optional>
1825
+ </element>
1826
+ </optional>
1827
+ </element>
1828
+ </zeroOrMore>
1829
+ </element>
1830
+ </define>
1831
+ <define name="svgmap">
1832
+ <element name="svgmap">
1833
+ <ref name="figure"/>
1834
+ <zeroOrMore>
1835
+ <element name="target">
1836
+ <attribute name="href">
1837
+ <data type="anyURI"/>
1838
+ </attribute>
1839
+ <choice>
1840
+ <ref name="xref"/>
1841
+ <ref name="hyperlink"/>
1842
+ <ref name="eref"/>
1843
+ </choice>
1844
+ </element>
1845
+ </zeroOrMore>
1846
+ </element>
1847
+ </define>
1848
+ <define name="ul_li">
1849
+ <element name="li">
1850
+ <optional>
1851
+ <attribute name="id">
1852
+ <data type="ID"/>
1853
+ </attribute>
1854
+ </optional>
1855
+ <optional>
1856
+ <attribute name="uncheckedcheckbox">
1857
+ <data type="boolean"/>
1858
+ </attribute>
1859
+ </optional>
1860
+ <optional>
1861
+ <attribute name="checkedcheckbox">
1862
+ <data type="boolean"/>
1863
+ </attribute>
1864
+ </optional>
1865
+ <oneOrMore>
1866
+ <ref name="BasicBlock"/>
1867
+ </oneOrMore>
1868
+ </element>
1869
+ </define>
1638
1870
  </grammar>