metanorma-ietf 2.3.5 → 2.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7629e0ade5cff517d3fdf80296490da26a339654c338d7976d1b7f028aebb147
4
- data.tar.gz: 3add51632aeb8f9c1f06c96ca276e3bb947d129ce704c902eb918e998331914a
3
+ metadata.gz: e0bce55e3d73f441a77b94d2aa6f7f464e727b914dd8e8c6fa67dbf035122d63
4
+ data.tar.gz: 1eaa61e2a47f793b47653f76e8ff6a7fd53a8f7889a06b9e43e61132cb6b066d
5
5
  SHA512:
6
- metadata.gz: 3519faef8dccfc5c474c0d3e4b12401aad30e98f666c50939aa1abf8736c9dddca67129dd6c50bc2cad77ce9f4589469d6ab93943462866d61d49b17fb888a3b
7
- data.tar.gz: 490a7fddbb7c158c746445f3607b7fe5225b9e8d082b5e0f529c30b08c7db497bf0826872d904f4c95628e630b35d3048d4f4511602cc06fb3f8169dda5812f1
6
+ metadata.gz: c8f01b1753308bdb0d335a766fa4ed638a417a81433bb6f6b95a02518674d5eff55b3951db0717e748f7dc8dc3d0def3db27ddadb0f0a36105247f666747099b
7
+ data.tar.gz: af96278d659ea2949ad3aa2a435cdbe17017e171502fdea71cd5c332d13d7f7a2dade54361e8173aaf9b41e0614af7402fed6773d6f978e2388616f929108007
@@ -0,0 +1,99 @@
1
+ module Asciidoctor
2
+ module Ietf
3
+ class Converter < ::Asciidoctor::Standoc::Converter
4
+ def cleanup(xmldoc)
5
+ bcp14_cleanup(xmldoc)
6
+ abstract_cleanup(xmldoc)
7
+ super
8
+ rfc_anchor_cleanup(xmldoc)
9
+ cref_cleanup(xmldoc)
10
+ xmldoc
11
+ end
12
+
13
+ def abstract_cleanup(xmldoc)
14
+ xmldoc.xpath("//abstract[not(text())]").each do |x|
15
+ x.remove
16
+ warn "Empty abstract section removed"
17
+ end
18
+ end
19
+
20
+ def cref_cleanup(xmldoc)
21
+ xmldoc.xpath("//crefref").each do |r|
22
+ if c = xmldoc.at("//review[@id = '#{r.text}']")
23
+ r.replace(c.remove)
24
+ else
25
+ @log.add("Crossrefences", r,
26
+ "No matching review for cref:[#{r.text}]")
27
+ end
28
+ end
29
+ end
30
+
31
+ BCP_KEYWORDS = ["MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
32
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
33
+ "OPTIONAL"].freeze
34
+
35
+ def bcp14_cleanup(xmldoc)
36
+ return unless @bcp_bold
37
+
38
+ xmldoc.xpath("//strong").each do |s|
39
+ next unless BCP_KEYWORDS.include?(s.text)
40
+
41
+ s.name = "bcp14"
42
+ end
43
+ end
44
+
45
+ def rfc_anchor_cleanup(xmldoc)
46
+ map = xmldoc.xpath("//bibitem[docidentifier/@type = 'rfc-anchor']")
47
+ .each_with_object({}) do |b, m|
48
+ next if b.at("./ancestor::bibdata | ./ancestor::bibitem")
49
+
50
+ id = b.at("./docidentifier[@type = 'rfc-anchor']").text
51
+ m[b["id"]] = id
52
+ b["id"] = id
53
+ end
54
+ xmldoc.xpath("//eref | //origin").each do |x|
55
+ map[x["bibitemid"]] and x["bibitemid"] = map[x["bibitemid"]]
56
+ end
57
+ xmldoc
58
+ end
59
+
60
+ def smartquotes_cleanup(xmldoc)
61
+ xmldoc.traverse do |n|
62
+ next unless n.text?
63
+
64
+ n.replace(HTMLEntities.new.encode(
65
+ n.text.gsub(/\u2019|\u2018|\u201a|\u201b/, "'")
66
+ .gsub(/\u201c|\u201d|\u201e|\u201f/, '"'), :basic
67
+ ))
68
+ end
69
+ xmldoc
70
+ end
71
+
72
+ def xref_to_eref(xref)
73
+ super
74
+ xref.delete("format")
75
+ end
76
+
77
+ def xref_cleanup(xmldoc)
78
+ super
79
+ xmldoc.xpath("//xref").each do |x|
80
+ x.delete("displayFormat")
81
+ x.delete("relative")
82
+ end
83
+ end
84
+
85
+ def quotesource_cleanup(xmldoc)
86
+ xmldoc.xpath("//quote/source | //terms/source").each do |x|
87
+ if x["target"]&.match?(URI::DEFAULT_PARSER.make_regexp)
88
+ x["uri"] = x["target"]
89
+ x.delete("target")
90
+ else
91
+ xref_to_eref(x)
92
+ end
93
+ end
94
+ end
95
+
96
+ def section_names_refs_cleanup(xml); end
97
+ end
98
+ end
99
+ end
@@ -4,10 +4,16 @@ require "isodoc/ietf/rfc_convert"
4
4
  require_relative "./front"
5
5
  require_relative "./blocks"
6
6
  require_relative "./validate"
7
+ require_relative "./cleanup"
8
+ require_relative "./macros"
7
9
 
8
10
  module Asciidoctor
9
11
  module Ietf
10
12
  class Converter < ::Asciidoctor::Standoc::Converter
13
+ Asciidoctor::Extensions.register do
14
+ inline_macro Asciidoctor::Ietf::InlineCrefMacro
15
+ end
16
+
11
17
  XML_ROOT_TAG = "ietf-standard".freeze
12
18
  XML_NAMESPACE = "https://www.metanorma.org/ns/ietf".freeze
13
19
 
@@ -22,13 +28,13 @@ module Asciidoctor
22
28
  @draft = node.attributes.has_key?("draft")
23
29
  @workgroups = cache_workgroup(node)
24
30
  @bcp_bold = !node.attr?("no-rfc-bold-bcp14")
25
- @xinclude = node.attr?("use-xinclude")
31
+ @xinclude = node.attr?("use-xinclude")
26
32
  super
27
33
  end
28
34
 
29
35
  def outputs(node, ret)
30
- File.open(@filename + ".xml", "w:UTF-8") { |f| f.write(ret) }
31
- rfc_converter(node).convert(@filename + ".xml")
36
+ File.open("#{@filename}.xml", "w:UTF-8") { |f| f.write(ret) }
37
+ rfc_converter(node).convert("#{@filename}.xml")
32
38
  end
33
39
 
34
40
  def doctype(node)
@@ -63,12 +69,12 @@ module Asciidoctor
63
69
  f, c = xref_text(node)
64
70
  f1, c = eref_text(node) if f.nil?
65
71
  t, rel = xref_rel(node)
72
+ attrs = { target: t, type: "inline", displayFormat: f1, format: f,
73
+ relative: rel }
66
74
  noko do |xml|
67
- xml.xref **attr_code(target: t, type: "inline",
68
- displayFormat: f1, format: f,
69
- relative: rel ) do |x|
70
- x << c
71
- end
75
+ xml.xref **attr_code(attrs) do |x|
76
+ x << c
77
+ end
72
78
  end.join
73
79
  end
74
80
 
@@ -112,69 +118,7 @@ module Asciidoctor
112
118
  [t, rel]
113
119
  end
114
120
 
115
- def cleanup(xmldoc)
116
- bcp14_cleanup(xmldoc)
117
- abstract_cleanup(xmldoc)
118
- super
119
- rfc_anchor_cleanup(xmldoc)
120
- end
121
-
122
- BCP_KEYWORDS = ["MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
123
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"].freeze
124
-
125
- def abstract_cleanup(xmldoc)
126
- xmldoc.xpath("//abstract[not(text())]").each do |x|
127
- x.remove
128
- warn "Empty abstract section removed"
129
- end
130
- end
131
-
132
- def bcp14_cleanup(xmldoc)
133
- return unless @bcp_bold
134
- xmldoc.xpath("//strong").each do |s|
135
- next unless BCP_KEYWORDS.include?(s.text)
136
- s.name = "bcp14"
137
- end
138
- end
139
-
140
- def rfc_anchor_cleanup(xmldoc)
141
- map = {}
142
- xmldoc.xpath("//bibitem[docidentifier/@type = 'rfc-anchor']").each do |b|
143
- next if b.at("./ancestor::bibdata")
144
- map[b["id"]] = b.at("./docidentifier[@type = 'rfc-anchor']").text
145
- b["id"] = b.at("./docidentifier[@type = 'rfc-anchor']").text
146
- end
147
- xmldoc.xpath("//eref | //origin").each do |x|
148
- map[x["bibitemid"]] and x["bibitemid"] = map[x["bibitemid"]]
149
- end
150
- xmldoc
151
- end
152
-
153
- def smartquotes_cleanup(xmldoc)
154
- xmldoc.traverse do |n|
155
- next unless n.text?
156
- n.replace(HTMLEntities.new.encode(
157
- n.text.gsub(/\u2019|\u2018|\u201a|\u201b/, "'").
158
- gsub(/\u201c|\u201d|\u201e|\u201f/, '"'), :basic))
159
- end
160
- xmldoc
161
- end
162
-
163
- def xref_to_eref(x)
164
- super
165
- x.delete("format")
166
- end
167
-
168
- def xref_cleanup(xmldoc)
169
- super
170
- xmldoc.xpath("//xref").each do |x|
171
- x.delete("displayFormat")
172
- x.delete("relative")
173
- end
174
- end
175
-
176
- def norm_ref_preface(f)
177
- end
121
+ def norm_ref_preface(sect); end
178
122
 
179
123
  def clause_parse(attrs, xml, node)
180
124
  attrs[:numbered] = node.attr("numbered")
@@ -194,34 +138,24 @@ module Asciidoctor
194
138
  clause_parse(attrs, xml, node)
195
139
  end
196
140
 
197
- def quotesource_cleanup(xmldoc)
198
- xmldoc.xpath("//quote/source | //terms/source").each do |x|
199
- if x["target"] =~ URI::DEFAULT_PARSER.make_regexp
200
- x["uri"] = x["target"]
201
- x.delete("target")
202
- else
203
- xref_to_eref(x)
204
- end
205
- end
206
- end
207
-
208
141
  def inline_indexterm(node)
209
142
  noko do |xml|
210
143
  node.type == :visible and xml << node.text.sub(/^primary:(?=\S)/, "")
211
144
  terms = (node.attr("terms") || [node.text]).map { |x| xml_encode(x) }
212
- if /^primary:\S/.match(terms[0])
145
+ if /^primary:\S/.match?(terms[0])
213
146
  terms[0].sub!(/^primary:/, "")
214
147
  has_primary = true
215
148
  end
216
- xml.index **attr_code(primary: has_primary) do |i|
217
- i.primary { |x| x << terms[0] }
218
- a = terms.dig(1) and i.secondary { |x| x << a }
219
- a = terms.dig(2) and i.tertiary { |x| x << a }
220
- end
149
+ inline_indexterm1(has_primary, terms, xml)
221
150
  end.join
222
151
  end
223
152
 
224
- def section_names_refs_cleanup(x)
153
+ def inline_indexterm1(has_primary, terms, xml)
154
+ xml.index **attr_code(primary: has_primary) do |i|
155
+ i.primary { |x| x << terms[0] }
156
+ a = terms[1] and i.secondary { |x| x << a }
157
+ a = terms[2] and i.tertiary { |x| x << a }
158
+ end
225
159
  end
226
160
 
227
161
  def html_extract_attributes(node)
@@ -119,7 +119,7 @@ module Asciidoctor
119
119
  strict: node.attr("strict"),
120
120
  compact: node.attr("compact"),
121
121
  subcompact: node.attr("subcompact"),
122
- toc: node.attr("toc-include") == "false" ? "no" : "yes",
122
+ tocinclude: node.attr("toc-include") == "false" ? "no" : "yes",
123
123
  tocdepth: node.attr("toc-depth"),
124
124
  symrefs: node.attr("sym-refs"),
125
125
  sortrefs: node.attr("sort-refs"),
@@ -602,7 +602,10 @@
602
602
  </define>
603
603
  </include>
604
604
  <define name="TextElement" combine="choice">
605
- <ref name="bcp14"/>
605
+ <choice>
606
+ <ref name="bcp14"/>
607
+ <ref name="review"/>
608
+ </choice>
606
609
  </define>
607
610
  <define name="bcp14">
608
611
  <element name="bcp14">
@@ -842,7 +845,7 @@
842
845
  </element>
843
846
  </optional>
844
847
  <optional>
845
- <element name="toc">
848
+ <element name="tocinclude">
846
849
  <text/>
847
850
  </element>
848
851
  </optional>
@@ -32,6 +32,18 @@
32
32
  <ref name="DocumentType"/>
33
33
  </element>
34
34
  </define>
35
+ <define name="section-title">
36
+ <element name="title">
37
+ <zeroOrMore>
38
+ <ref name="TextElement"/>
39
+ </zeroOrMore>
40
+ </element>
41
+ <zeroOrMore>
42
+ <element name="variant-title">
43
+ <ref name="TypedTitleString"/>
44
+ </element>
45
+ </zeroOrMore>
46
+ </define>
35
47
  <define name="hyperlink">
36
48
  <element name="link">
37
49
  <attribute name="target">
@@ -158,15 +170,17 @@
158
170
  <data type="boolean"/>
159
171
  </attribute>
160
172
  </optional>
161
- <attribute name="type">
162
- <choice>
163
- <value>roman</value>
164
- <value>alphabet</value>
165
- <value>arabic</value>
166
- <value>roman_upper</value>
167
- <value>alphabet_upper</value>
168
- </choice>
169
- </attribute>
173
+ <optional>
174
+ <attribute name="type">
175
+ <choice>
176
+ <value>roman</value>
177
+ <value>alphabet</value>
178
+ <value>arabic</value>
179
+ <value>roman_upper</value>
180
+ <value>alphabet_upper</value>
181
+ </choice>
182
+ </attribute>
183
+ </optional>
170
184
  <oneOrMore>
171
185
  <ref name="li"/>
172
186
  </oneOrMore>
@@ -204,6 +218,18 @@
204
218
  </zeroOrMore>
205
219
  </element>
206
220
  </define>
221
+ <define name="dt">
222
+ <element name="dt">
223
+ <optional>
224
+ <attribute name="id">
225
+ <data type="ID"/>
226
+ </attribute>
227
+ </optional>
228
+ <zeroOrMore>
229
+ <ref name="TextElement"/>
230
+ </zeroOrMore>
231
+ </element>
232
+ </define>
207
233
  <define name="example">
208
234
  <element name="example">
209
235
  <attribute name="id">
@@ -899,7 +925,7 @@
899
925
  </include>
900
926
  <!-- end overrides -->
901
927
  <define name="docsubtype">
902
- <element name="docsubtype">
928
+ <element name="subdoctype">
903
929
  <ref name="DocumentSubtype"/>
904
930
  </element>
905
931
  </define>
@@ -954,6 +980,26 @@
954
980
  </define>
955
981
  <define name="concept">
956
982
  <element name="concept">
983
+ <optional>
984
+ <attribute name="ital">
985
+ <data type="boolean"/>
986
+ </attribute>
987
+ </optional>
988
+ <optional>
989
+ <attribute name="ref">
990
+ <data type="boolean"/>
991
+ </attribute>
992
+ </optional>
993
+ <optional>
994
+ <attribute name="linkmention">
995
+ <data type="boolean"/>
996
+ </attribute>
997
+ </optional>
998
+ <optional>
999
+ <attribute name="linkref">
1000
+ <data type="boolean"/>
1001
+ </attribute>
1002
+ </optional>
957
1003
  <optional>
958
1004
  <element name="refterm">
959
1005
  <zeroOrMore>
@@ -989,8 +1035,23 @@
989
1035
  <ref name="imagemap"/>
990
1036
  <ref name="svgmap"/>
991
1037
  <ref name="inputform"/>
1038
+ <ref name="toc"/>
1039
+ <ref name="passthrough"/>
992
1040
  </choice>
993
1041
  </define>
1042
+ <define name="toc">
1043
+ <element name="toc">
1044
+ <ref name="ul"/>
1045
+ </element>
1046
+ </define>
1047
+ <define name="passthrough">
1048
+ <element name="passthrough">
1049
+ <optional>
1050
+ <attribute name="formats"/>
1051
+ </optional>
1052
+ <text/>
1053
+ </element>
1054
+ </define>
994
1055
  <define name="inputform">
995
1056
  <element name="form">
996
1057
  <attribute name="id">
@@ -998,6 +1059,9 @@
998
1059
  </attribute>
999
1060
  <attribute name="name"/>
1000
1061
  <attribute name="action"/>
1062
+ <optional>
1063
+ <attribute name="class"/>
1064
+ </optional>
1001
1065
  <zeroOrMore>
1002
1066
  <choice>
1003
1067
  <ref name="TextElement"/>
@@ -1229,6 +1293,12 @@
1229
1293
  <optional>
1230
1294
  <attribute name="type"/>
1231
1295
  </optional>
1296
+ <optional>
1297
+ <attribute name="identifier"/>
1298
+ </optional>
1299
+ <optional>
1300
+ <attribute name="prefix"/>
1301
+ </optional>
1232
1302
  <text/>
1233
1303
  </define>
1234
1304
  <define name="ics">
@@ -1490,26 +1560,26 @@
1490
1560
  <optional>
1491
1561
  <ref name="section-title"/>
1492
1562
  </optional>
1493
- <group>
1563
+ <choice>
1494
1564
  <choice>
1495
1565
  <group>
1496
- <zeroOrMore>
1566
+ <oneOrMore>
1497
1567
  <ref name="BasicBlock"/>
1498
- </zeroOrMore>
1568
+ </oneOrMore>
1499
1569
  <zeroOrMore>
1500
1570
  <ref name="note"/>
1501
1571
  </zeroOrMore>
1502
1572
  </group>
1503
1573
  <ref name="amend"/>
1504
1574
  </choice>
1505
- <zeroOrMore>
1575
+ <oneOrMore>
1506
1576
  <choice>
1507
1577
  <ref name="clause-subsection"/>
1508
1578
  <ref name="terms"/>
1509
1579
  <ref name="definitions"/>
1510
1580
  </choice>
1511
- </zeroOrMore>
1512
- </group>
1581
+ </oneOrMore>
1582
+ </choice>
1513
1583
  </define>
1514
1584
  <define name="Annex-Section">
1515
1585
  <optional>
@@ -1649,7 +1719,9 @@
1649
1719
  <zeroOrMore>
1650
1720
  <ref name="termgrammar"/>
1651
1721
  </zeroOrMore>
1652
- <ref name="definition"/>
1722
+ <oneOrMore>
1723
+ <ref name="termdefinition"/>
1724
+ </oneOrMore>
1653
1725
  <zeroOrMore>
1654
1726
  <ref name="termnote"/>
1655
1727
  </zeroOrMore>
@@ -1712,7 +1784,7 @@
1712
1784
  </oneOrMore>
1713
1785
  </element>
1714
1786
  </define>
1715
- <define name="definition">
1787
+ <define name="termdefinition">
1716
1788
  <element name="definition">
1717
1789
  <oneOrMore>
1718
1790
  <choice>
@@ -1721,6 +1793,9 @@
1721
1793
  <ref name="formula"/>
1722
1794
  </choice>
1723
1795
  </oneOrMore>
1796
+ <zeroOrMore>
1797
+ <ref name="termsource"/>
1798
+ </zeroOrMore>
1724
1799
  </element>
1725
1800
  </define>
1726
1801
  <define name="termnote">
@@ -0,0 +1,17 @@
1
+ require "asciidoctor/extensions"
2
+
3
+ module Asciidoctor
4
+ module Ietf
5
+ class InlineCrefMacro < Asciidoctor::Extensions::InlineMacroProcessor
6
+ use_dsl
7
+ named :cref
8
+ parse_content_as :text
9
+ using_format :short
10
+
11
+ def process(parent, _target, attrs)
12
+ out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
13
+ %{<crefref>#{out}</crefref>}
14
+ end
15
+ end
16
+ end
17
+ end
@@ -64,9 +64,9 @@
64
64
  <optional>
65
65
  <ref name="label"/>
66
66
  </optional>
67
- <optional>
67
+ <zeroOrMore>
68
68
  <ref name="subject"/>
69
- </optional>
69
+ </zeroOrMore>
70
70
  <zeroOrMore>
71
71
  <ref name="reqinherit"/>
72
72
  </zeroOrMore>
@@ -80,6 +80,7 @@
80
80
  <ref name="verification"/>
81
81
  <ref name="import"/>
82
82
  <ref name="description"/>
83
+ <ref name="component"/>
83
84
  </choice>
84
85
  </zeroOrMore>
85
86
  <optional>
@@ -105,12 +106,16 @@
105
106
  </define>
106
107
  <define name="subject">
107
108
  <element name="subject">
108
- <text/>
109
+ <oneOrMore>
110
+ <ref name="TextElement"/>
111
+ </oneOrMore>
109
112
  </element>
110
113
  </define>
111
114
  <define name="reqinherit">
112
115
  <element name="inherit">
113
- <text/>
116
+ <oneOrMore>
117
+ <ref name="TextElement"/>
118
+ </oneOrMore>
114
119
  </element>
115
120
  </define>
116
121
  <define name="measurementtarget">
@@ -138,6 +143,12 @@
138
143
  <ref name="RequirementSubpart"/>
139
144
  </element>
140
145
  </define>
146
+ <define name="component">
147
+ <element name="component">
148
+ <attribute name="class"/>
149
+ <ref name="RequirementSubpart"/>
150
+ </element>
151
+ </define>
141
152
  <define name="reqt_references">
142
153
  <element name="references">
143
154
  <oneOrMore>
@@ -1,4 +1,4 @@
1
- require "open-uri"
1
+ require "metanorma/ietf/data/workgroups"
2
2
 
3
3
  module Asciidoctor
4
4
  module Ietf
@@ -34,59 +34,8 @@ module Asciidoctor
34
34
  File.join(File.dirname(__FILE__), "ietf.rng"))
35
35
  end
36
36
 
37
- def wgcache_name
38
- "#{Dir.home}/.metanorma-ietf-workgroup-cache.json"
39
- end
40
-
41
- def open_wg_cache(node)
42
- node.attr("flush-caches") == "true" and
43
- FileUtils.rm wgcache_name, force: true
44
- wg = []
45
- if Pathname.new(wgcache_name).file?
46
- begin
47
- File.open(wgcache_name, "r") { |f| wg = JSON.parse(f.read) }
48
- rescue Exception => e
49
- warn "Cache #{wgcache_name} is invalid, drop it"
50
- end
51
- end
52
- [wg, wgcache_name]
53
- end
54
-
55
- def cache_workgroup_ietf(wg, _b)
56
- warn "Reading workgroups from https://tools.ietf.org/wg/..."
57
- URI.open("https://tools.ietf.org/wg/") do |f|
58
- f.each_line do |l|
59
- l.scan(%r{<td width="50%" style='padding: 0 1ex'>([^<]+)</td>}) do |w|
60
- wg << w[0].gsub(/\s+$/, "").gsub(/ Working Group$/, "")
61
- end
62
- end
63
- end
64
- wg
65
- end
66
-
67
- def cache_workgroup_irtf(wg, _b)
68
- warn "Reading workgroups from https://irtf.org/groups..."
69
- URI.open("https://irtf.org/groups", ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE) do |f|
70
- f.each_line do |l|
71
- l.scan(%r{<a title="([^"]+) Research Group"[^>]+>([^<]+)<}) do |w|
72
- wg << w[0].gsub(/\s+$/, "")
73
- wg << w[1].gsub(/\s+$/, "") # abbrev
74
- end
75
- end
76
- end
77
- wg
78
- end
79
-
80
- def cache_workgroup(node)
81
- wg, wgcache_name = open_wg_cache(node)
82
- if wg.empty?
83
- File.open(wgcache_name, "w") do |b|
84
- wg = cache_workgroup_ietf(wg, b)
85
- wg = cache_workgroup_irtf(wg, b)
86
- b << wg.to_json
87
- end
88
- end
89
- wg
37
+ def cache_workgroup(_node)
38
+ Metanorma::Ietf::Data::WORKGROUPS
90
39
  end
91
40
  end
92
41
  end