isodoc 0.10.4 → 1.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.
@@ -3,16 +3,10 @@ module IsoDoc::Function
3
3
 
4
4
  def table_title_parse(node, out)
5
5
  name = node.at(ns("./name"))
6
- out.p **{ class: "TableTitle", align: "center" } do |p|
6
+ out.p **{ class: "TableTitle", style: "text-align:center;" } do |p|
7
7
  lbl = anchor(node['id'], :label, false)
8
8
  lbl.nil? or p << l10n("#{@table_lbl} #{lbl}")
9
9
  name and !lbl.nil? and p << l10n("&nbsp;&mdash; ")
10
- =begin
11
- get_anchors[node['id']][:label].nil? or
12
- p << l10n("#{@table_lbl} #{get_anchors[node['id']][:label]}")
13
- name and !get_anchors[node['id']][:label].nil? and
14
- p << l10n("&nbsp;&mdash; ")
15
- =end
16
10
  name and name.children.each { |n| parse(n, p) }
17
11
  end
18
12
  end
@@ -52,9 +46,7 @@ module IsoDoc::Function
52
46
  attr_code(
53
47
  id: node["id"],
54
48
  class: "MsoISOTable",
55
- border: 1,
56
- cellspacing: 0,
57
- cellpadding: 0,
49
+ style: "border-width:1px;border-spacing:0;",
58
50
  title: node["alt"]
59
51
  )
60
52
  end
@@ -81,20 +73,21 @@ module IsoDoc::Function
81
73
 
82
74
  def make_tr_attr(td, row, totalrows)
83
75
  style = td.name == "th" ? "font-weight:bold;" : ""
76
+ td["align"] and style += "text-align:#{td['align']};"
84
77
  rowmax = td["rowspan"] ? row + td["rowspan"].to_i - 1 : row
85
78
  style += <<~STYLE
86
79
  border-top:#{row.zero? ? "#{SW} 1.5pt;" : 'none;'}
87
80
  border-bottom:#{SW} #{rowmax == totalrows ? '1.5' : '1.0'}pt;
81
+ padding:0;
88
82
  STYLE
89
83
  { rowspan: td["rowspan"], colspan: td["colspan"],
90
- align: td["align"], style: style.gsub(/\n/, "") }
84
+ style: style.gsub(/\n/, "") }
91
85
  end
92
86
 
93
87
  def tr_parse(node, out, ord, totalrows, _header)
94
88
  out.tr do |r|
95
89
  node.elements.each do |td|
96
90
  attrs = make_tr_attr(td, ord, totalrows - 1)
97
- # i, node.elements.size - 1, header)
98
91
  r.send td.name, **attr_code(attrs) do |entry|
99
92
  td.children.each { |n| parse(n, entry) }
100
93
  end
@@ -42,7 +42,6 @@ module IsoDoc::Function
42
42
  # is inserted before this CSS.
43
43
  def define_head(html, filename, _dir)
44
44
  html.head do |head|
45
- #head.title { |t| t << filename }
46
45
  if @standardstylesheet
47
46
  head.style do |style|
48
47
  stylesheet = File.read(@standardstylesheet, encoding: "utf-8").
@@ -53,8 +52,11 @@ module IsoDoc::Function
53
52
  end
54
53
  end
55
54
 
55
+ def body_attr
56
+ { lang: "#{@lang}" }
57
+ end
58
+
56
59
  def make_body(xml, docxml)
57
- body_attr = { lang: "EN-US", link: "blue", vlink: "#954F72" }
58
60
  xml.body **body_attr do |body|
59
61
  make_body1(body, docxml)
60
62
  make_body2(body, docxml)
@@ -6,18 +6,22 @@ module IsoDoc::HtmlFunction
6
6
  end
7
7
 
8
8
  def comments(div)
9
+ =begin
9
10
  return if @comments.empty?
10
11
  div.div **{ style: "mso-element:comment-list" } do |div1|
11
12
  @comments.each { |fn| div1.parent << fn }
12
13
  end
14
+ =end
13
15
  end
14
16
 
15
17
  def review_note_parse(node, out)
18
+ =begin
16
19
  fn = @comments.length + 1
17
20
  make_comment_link(out, fn, node)
18
21
  @in_comment = true
19
22
  @comments << make_comment_text(node, fn)
20
23
  @in_comment = false
24
+ =end
21
25
  end
22
26
 
23
27
  def comment_link_attrs(fn, node)
@@ -51,9 +55,11 @@ module IsoDoc::HtmlFunction
51
55
  end
52
56
 
53
57
  def comment_cleanup(docxml)
58
+ =begin
54
59
  move_comment_link_to_from(docxml)
55
60
  reorder_comments_by_comment_link(docxml)
56
61
  embed_comment_in_comment_list(docxml)
62
+ =end
57
63
  end
58
64
 
59
65
  COMMENT_IN_COMMENT_LIST =
@@ -44,12 +44,14 @@ module IsoDoc::HtmlFunction
44
44
  def toHTML(result, filename)
45
45
  result = (from_xhtml(html_cleanup(to_xhtml(result))))
46
46
  result = populate_template(result, :html)
47
- #result = script_cdata(from_xhtml(move_images(to_xhtml(result))))
48
47
  result = from_xhtml(move_images(to_xhtml(result)))
49
- result = script_cdata(inject_script(result))
50
- File.open("#{filename}.html", "w:UTF-8") do |f|
51
- f.write(result)
52
- end
48
+ result = html5(script_cdata(inject_script(result)))
49
+ File.open("#{filename}.html", "w:UTF-8") { |f| f.write(result) }
50
+ end
51
+
52
+ def html5(doc)
53
+ doc.sub(%r{<!DOCTYPE html [^>]+>}, "<!DOCTYPE html>").
54
+ sub(%r{<\?xml[^>]+>}, "")
53
55
  end
54
56
 
55
57
  def html_cleanup(x)
@@ -63,9 +65,7 @@ module IsoDoc::HtmlFunction
63
65
  MATHJAX = <<~"MATHJAX".freeze
64
66
  <script type="text/x-mathjax-config">
65
67
  MathJax.Hub.Config({
66
- asciimath2jax: {
67
- delimiters: [['OPEN', 'CLOSE']]
68
- }
68
+ asciimath2jax: { delimiters: [['OPEN', 'CLOSE']] }
69
69
  });
70
70
  </script>
71
71
  <script src="#{MATHJAX_ADDR}?config=AM_HTMLorMML" async="async"></script>
@@ -91,15 +91,6 @@ module IsoDoc::HtmlFunction
91
91
  HEAD
92
92
  end
93
93
 
94
- def toclevel
95
- <<~HEAD.freeze
96
- function toclevel() { var i; var text = "";
97
- for(i = 1; i <= #{@htmlToClevels}; i++) {
98
- if (i > 1) { text += ","; } text += "h" + i + ":not(:empty):not(.TermNum)"; }
99
- return text;}
100
- HEAD
101
- end
102
-
103
94
  def html_head()
104
95
  <<~HEAD.freeze
105
96
  <title>{{ doctitle }}</title>
@@ -155,12 +146,10 @@ module IsoDoc::HtmlFunction
155
146
 
156
147
  def sourcecode_parse(node, out)
157
148
  name = node.at(ns("./name"))
158
- out.pre **attr_code(id: node["id"],
159
- class: "prettyprint #{sourcecodelang(node&.at(ns('./@lang'))&.value)}") do |div|
149
+ class1 = "prettyprint #{sourcecodelang(node&.at(ns('./@lang'))&.value)}"
150
+ out.pre **attr_code(id: node["id"], class: class1) do |div|
160
151
  @sourcecode = true
161
- node.children.each do |n|
162
- parse(n, div) unless n.name == "name"
163
- end
152
+ node.children.each { |n| parse(n, div) unless n.name == "name" }
164
153
  @sourcecode = false
165
154
  sourcecode_name_parse(node, div, name) if name
166
155
  end
@@ -171,10 +160,6 @@ module IsoDoc::HtmlFunction
171
160
  html_intro(docxml) if @htmlintropage
172
161
  docxml.at("//body") << mathjax(@openmathdelim, @closemathdelim)
173
162
  docxml.at("//body") << sourcecode_highlighter
174
- #if @scripts
175
- # scripts = File.read(@scripts, encoding: "UTF-8")
176
- # a = docxml.at("//body").add_child docxml.create_cdata(scripts)
177
- #end
178
163
  html_main(docxml)
179
164
  docxml
180
165
  end
@@ -186,17 +171,15 @@ module IsoDoc::HtmlFunction
186
171
  end
187
172
 
188
173
  def html_cover(docxml)
189
- cover = File.read(@htmlcoverpage, encoding: "UTF-8")
190
- coverxml = to_xhtml_fragment(cover)
174
+ doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8"))
191
175
  d = docxml.at('//div[@class="title-section"]')
192
- d.children.first.add_previous_sibling coverxml.to_xml(encoding: "US-ASCII")
176
+ d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
193
177
  end
194
178
 
195
179
  def html_intro(docxml)
196
- intro = File.read(@htmlintropage, encoding: "UTF-8")
197
- introxml = to_xhtml_fragment(intro)
180
+ doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8"))
198
181
  d = docxml.at('//div[@class="prefatory-section"]')
199
- d.children.first.add_previous_sibling introxml.to_xml(encoding: "US-ASCII")
182
+ d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
200
183
  end
201
184
 
202
185
  def htmlstylesheet
@@ -210,11 +193,14 @@ module IsoDoc::HtmlFunction
210
193
  return docxml unless @htmlstylesheet
211
194
  title = docxml.at("//*[local-name() = 'head']/*[local-name() = 'title']")
212
195
  head = docxml.at("//*[local-name() = 'head']")
196
+ =begin
213
197
  css = htmlstylesheet
214
198
  if title.nil? then head.children.first.add_previous_sibling css
215
199
  else
216
200
  title.add_next_sibling css
217
201
  end
202
+ =end
203
+ head << htmlstylesheet
218
204
  docxml
219
205
  end
220
206
 
@@ -293,21 +279,33 @@ module IsoDoc::HtmlFunction
293
279
  end
294
280
 
295
281
  def html_toc_entry(level, header)
296
- %(<li class="h#{level}"><a href="##{header['id']}">#{header_strip(header)}</a></li>)
282
+ %(<li class="#{level}"><a href="##{header['id']}">\
283
+ #{header_strip(header)}</a></li>)
297
284
  end
298
285
 
286
+ def toclevel_classes
287
+ (1..@htmlToClevels).inject([]) { |m, i| m << "h#{i}" }
288
+ end
289
+
290
+ def toclevel
291
+ ret = toclevel_classes.map { |l| "#{l}:not(:empty):not(.TermNum):not(.noTOC)" }
292
+ <<~HEAD.freeze
293
+ function toclevel() { return "#{ret.join(',')}";}
294
+ HEAD
295
+ end
296
+
297
+ # needs to be same output as toclevel
299
298
  def html_toc(docxml)
300
- =begin
301
299
  idx = docxml.at("//div[@id = 'toc']") or return docxml
302
300
  toc = "<ul>"
303
- tocidx = 0
304
- docxml.xpath("//main//h1 | //main//h2[not(@class = 'TermNum')]").each do |h|
301
+ path = toclevel_classes.map do |l|
302
+ "//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')][not(text())]"
303
+ end
304
+ docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
305
305
  h["id"] ||= "toc#{tocidx}"
306
- toc += html_toc_entry(h.name == "h1" ? 1 : 2, h)
307
- tocidx += 1
306
+ toc += html_toc_entry(h.name, h)
308
307
  end
309
308
  idx.children = "#{toc}</ul>"
310
- =end
311
309
  docxml
312
310
  end
313
311
  end
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "0.10.4".freeze
2
+ VERSION = "1.0.0".freeze
3
3
  end
@@ -13,6 +13,10 @@ module IsoDoc::WordFunction
13
13
  end
14
14
  end
15
15
 
16
+ def body_attr
17
+ { lang: "EN-US", link: "blue", vlink: "#954F72" }
18
+ end
19
+
16
20
  def make_body1(body, _docxml)
17
21
  FileUtils.rm_rf tmpimagedir
18
22
  FileUtils.mkdir tmpimagedir
@@ -235,12 +239,12 @@ module IsoDoc::WordFunction
235
239
 
236
240
 
237
241
  def make_table_attr(node)
238
- {
242
+ super.merge({
239
243
  style: "mso-table-lspace:15.0cm;margin-left:423.0pt;"\
240
244
  "mso-table-rspace:15.0cm;margin-right:423.0pt;mso-table-bspace:14.2pt;"\
241
245
  "mso-table-anchor-vertical:paragraph;mso-table-anchor-horizontal:column;"\
242
- "mso-table-overlap:never;"
243
- }.merge(super)
246
+ "mso-table-overlap:never;border-spacing:0;border-width:1px;"
247
+ })
244
248
  end
245
249
 
246
250
  def table_parse(node, out)
@@ -60,6 +60,7 @@ xmlns:m="http://schemas.microsoft.com/office/2004/12/omml">
60
60
  word_table_separator(docxml)
61
61
  word_admonition_images(docxml)
62
62
  word_list_continuations(docxml)
63
+ word_example_cleanup(docxml)
63
64
  docxml
64
65
  end
65
66
 
@@ -96,6 +97,12 @@ xmlns:m="http://schemas.microsoft.com/office/2004/12/omml">
96
97
  def word_annex_cleanup(docxml)
97
98
  end
98
99
 
100
+ def word_example_cleanup(docxml)
101
+ docxml.xpath("//div[@class = 'example']//p[not(@class)]").each do |p|
102
+ p["class"] = "example"
103
+ end
104
+ end
105
+
99
106
  def word_preface(docxml)
100
107
  word_cover(docxml) if @wordcoverpage
101
108
  word_intro(docxml, @wordToClevels) if @wordintropage
@@ -263,16 +263,16 @@ B</pre>
263
263
  <p id="_">The time <span class="stem">(#(t_90)#)</span> was estimated to be 18,2 min for this example.</p>
264
264
  </div></aside>
265
265
  <p><b>Key</b></p><dl><dt><p>A</p></dt><dd><p>B</p></dd></dl>
266
- <p class="FigureTitle" align="center">Figure 1&#160;&#8212; Split-it-right <i>sample</i> divider</p></div>
266
+ <p class="FigureTitle" style="text-align:center;">Figure 1&#160;&#8212; Split-it-right <i>sample</i> divider</p></div>
267
267
  <div class="figure" id="figure-B">
268
268
  <pre>A &lt;
269
269
  B</pre>
270
- <p class="FigureTitle" align="center">Figure 2</p>
270
+ <p class="FigureTitle" style="text-align:center;">Figure 2</p>
271
271
  </div>
272
272
  <div class="figure" id="figure-C">
273
273
  <pre>A &lt;
274
274
  B</pre>
275
- <p class="FigureTitle" align="center"/>
275
+ <p class="FigureTitle" style="text-align:center;"/>
276
276
  </div>
277
277
  </div>
278
278
  <p class="zzSTDTitle1"/>
@@ -326,11 +326,11 @@ B</pre>
326
326
  <p id="_">The time <span class="stem">(#(t_90)#)</span> was estimated to be 18,2 min for this example.</p>
327
327
  </div></aside>
328
328
  <p><b>Key</b></p><table class="dl"><tr><td valign="top" align="left"><p align="left" style="margin-left:0pt;text-align:left;">A</p></td><td valign="top"><p>B</p></td></tr></table>
329
- <p class="FigureTitle" align="center">Figure 1&#160;&#8212; Split-it-right sample divider</p></div>
329
+ <p class="FigureTitle" style="text-align:center;">Figure 1&#160;&#8212; Split-it-right sample divider</p></div>
330
330
  <div class="figure" id="figure-B">
331
331
  <pre>A &lt;
332
332
  B</pre>
333
- <p class="FigureTitle" align="center">Figure 2</p>
333
+ <p class="FigureTitle" style="text-align:center;">Figure 2</p>
334
334
  </div>
335
335
  </div>
336
336
  <p>&#160;</p>
@@ -426,7 +426,7 @@ B</pre>
426
426
  <br/>
427
427
  <div>
428
428
  <h1 class="ForewordTitle">Foreword</h1>
429
- <pre id="samplecode" class="prettyprint lang-rb"><br/>&#160;&#160;&#160; <br/>&#160; puts x<br/><p class="SourceTitle" align="center">Ruby <i>code</i></p></pre>
429
+ <pre id="samplecode" class="prettyprint lang-rb"><br/>&#160;&#160;&#160; <br/>&#160; puts x<br/><p class="SourceTitle" style="text-align:center;">Ruby <i>code</i></p></pre>
430
430
  </div>
431
431
  <p class="zzSTDTitle1"/>
432
432
  </div>
@@ -461,7 +461,7 @@ B</pre>
461
461
  </p>
462
462
  <div>
463
463
  <h1 class="ForewordTitle">Foreword</h1>
464
- <p id="samplecode" class="Sourcecode"><br/>&#160;&#160;&#160; <br/>&#160; puts x<br/><p class="SourceTitle" align="center">Ruby <i>code</i></p></p>
464
+ <p id="samplecode" class="Sourcecode"><br/>&#160;&#160;&#160; <br/>&#160; puts x<br/><p class="SourceTitle" style="text-align:center;">Ruby <i>code</i></p></p>
465
465
  </div>
466
466
  <p>&#160;</p>
467
467
  </div>
@@ -491,7 +491,7 @@ B</pre>
491
491
  <br/>
492
492
  <div>
493
493
  <h1 class="ForewordTitle">Foreword</h1>
494
- <pre id="samplecode" class="prettyprint "><br/>&#160;&#160;&#160; <br/>&#160; &lt;xml&gt;<br/><p class="SourceTitle" align="center">XML code</p></pre>
494
+ <pre id="samplecode" class="prettyprint "><br/>&#160;&#160;&#160; <br/>&#160; &lt;xml&gt;<br/><p class="SourceTitle" style="text-align:center;">XML code</p></pre>
495
495
  </div>
496
496
  <p class="zzSTDTitle1"/>
497
497
  </div>
@@ -508,7 +508,7 @@ B</pre>
508
508
  %w{a b c}.each do |x|
509
509
  puts x <callout target="B">2</callout>
510
510
  end<annotation id="A">
511
- <p id="_">This is one callout</p>
511
+ <p id="_">This is <em>one</em> callout</p>
512
512
  </annotation><annotation id="B">
513
513
  <p id="_">This is another callout</p>
514
514
  </annotation></sourcecode>
@@ -519,11 +519,7 @@ B</pre>
519
519
  <br/>
520
520
  <div>
521
521
  <h1 class="ForewordTitle">Foreword</h1>
522
- <pre id="_" class="prettyprint ">puts "Hello, world." &lt;1&gt;<br/>&#160;&#160; %w{a b c}.each do |x|<br/>&#160;&#160;&#160;&#160; puts x &lt;2&gt;<br/>&#160;&#160; end<span class="zzMoveToFollowing">&lt;1&gt; </span>
523
- <p class="Sourcecode" id="_">This is one callout</p>
524
- <span class="zzMoveToFollowing">&lt;2&gt; </span>
525
- <p class="Sourcecode" id="_">This is another callout</p>
526
- </pre>
522
+ <pre id="_" class="prettyprint ">puts "Hello, world." &lt;1&gt;<br/>&#160;&#160; %w{a b c}.each do |x|<br/>&#160;&#160;&#160;&#160; puts x &lt;2&gt;<br/>&#160;&#160; end<br/><br/>&lt;1&gt; This is one callout<br/>&lt;2&gt; This is another callout</pre>
527
523
  </div>
528
524
  <p class="zzSTDTitle1"/>
529
525
  </div>
@@ -546,7 +542,7 @@ B</pre>
546
542
  <br/>
547
543
  <div>
548
544
  <h1 class="ForewordTitle">Foreword</h1>
549
- <div class="Admonition"><p class="AdmonitionTitle" align="center">CAUTION</p>
545
+ <div class="Admonition"><p class="AdmonitionTitle" style="text-align:center;">CAUTION</p>
550
546
  <p id="_e94663cc-2473-4ccc-9a72-983a74d989f2">Only use paddy or parboiled rice for the determination of husked rice yield.</p>
551
547
  </div>
552
548
  </div>
@@ -572,7 +568,7 @@ B</pre>
572
568
  <br/>
573
569
  <div>
574
570
  <h1 class="ForewordTitle">Foreword</h1>
575
- <div class="Admonition"><p class="AdmonitionTitle" align="center">Title</p>
571
+ <div class="Admonition"><p class="AdmonitionTitle" style="text-align:center;">Title</p>
576
572
  <p id="_e94663cc-2473-4ccc-9a72-983a74d989f2">Only use paddy or parboiled rice for the determination of husked rice yield.</p>
577
573
  </div>
578
574
  </div>
@@ -645,11 +641,11 @@ World</p>
645
641
  <br/>
646
642
  <div>
647
643
  <h1 class="ForewordTitle">Foreword</h1>
648
- <p id="_08bfe952-d57f-4150-9c95-5d52098cc2a8" align="left" style="text-align:left">Vache Equipment<br/>
644
+ <p id="_08bfe952-d57f-4150-9c95-5d52098cc2a8" style="text-align:left;">Vache Equipment<br/>
649
645
  Fictitious<br/>
650
646
  World
651
647
  </p>
652
- <p style="text-align:justify">Justify</p>
648
+ <p style="text-align:justify;">Justify</p>
653
649
  </div>
654
650
  <p class="zzSTDTitle1"/>
655
651
  </div>
@@ -773,12 +769,12 @@ World</p>
773
769
  <table id="_">
774
770
  <tbody>
775
771
  <tr>
776
- <td align="left">Object</td>
777
- <td align="left">Value</td>
772
+ <td style="text-align:left;">Object</td>
773
+ <td style="text-align:left;">Value</td>
778
774
  </tr>
779
775
  <tr>
780
- <td align="left">Mission</td>
781
- <td align="left">Accomplished</td>
776
+ <td style="text-align:left;">Mission</td>
777
+ <td style="text-align:left;">Accomplished</td>
782
778
  </tr>
783
779
  </tbody>
784
780
  </table>
@@ -812,6 +808,7 @@ World</p>
812
808
  <div>
813
809
  <h1 class="ForewordTitle">Foreword</h1>
814
810
  <div class="permission"><p class="AdmonitionTitle">Permission 1:<br/>/ogc/recommendation/wfs/2</p>
811
+ <p><i>Subject: user<br/>Control-class: Technical<br/>Priority: P0<br/>Family: System and Communications Protection<br/>Family: System and Communications Protocols</i></p>
815
812
 
816
813
  <div class="requirement-inherit">/ss/584/2015/level/1</div>
817
814
  <div class="requirement-description">
@@ -858,12 +855,12 @@ World</p>
858
855
  <table id="_">
859
856
  <tbody>
860
857
  <tr>
861
- <td align="left">Object</td>
862
- <td align="left">Value</td>
858
+ <td style="text-align:left;">Object</td>
859
+ <td style="text-align:left;">Value</td>
863
860
  </tr>
864
861
  <tr>
865
- <td align="left">Mission</td>
866
- <td align="left">Accomplished</td>
862
+ <td style="text-align:left;">Mission</td>
863
+ <td style="text-align:left;">Accomplished</td>
867
864
  </tr>
868
865
  </tbody>
869
866
  </table>
@@ -896,7 +893,7 @@ World</p>
896
893
  <br/>
897
894
  <div>
898
895
  <h1 class="ForewordTitle">Foreword</h1>
899
- <div class="require"><p class="AdmonitionTitle">Requirement:<br/>/ogc/recommendation/wfs/2. A New Requirement</p>
896
+ <div class="require"><p class="AdmonitionTitle">Requirement:<br/>/ogc/recommendation/wfs/2. A New Requirement</p><p><i>Subject: user</i></p>
900
897
 
901
898
  <div class="requirement-inherit">/ss/584/2015/level/1</div>
902
899
  <div class="requirement-description">
@@ -930,9 +927,11 @@ World</p>
930
927
  expect(IsoDoc::HtmlConvert.new({}).convert("test", <<~"INPUT", true)).to be_equivalent_to <<~"OUTPUT"
931
928
  <iso-standard xmlns="http://riboseinc.com/isoxml">
932
929
  <preface><foreword>
933
- <recommendation id="_">
930
+ <recommendation id="_" obligation="shall,could">
934
931
  <label>/ogc/recommendation/wfs/2</label>
935
932
  <inherit>/ss/584/2015/level/1</inherit>
933
+ <classification><tag>type</tag><value>text</value></classification>
934
+ <classification><tag>language</tag><value>BASIC</value></classification>
936
935
  <subject>user</subject>
937
936
  <description>
938
937
  <p id="_">I recommend <em>this</em>.</p>
@@ -942,12 +941,12 @@ World</p>
942
941
  <table id="_">
943
942
  <tbody>
944
943
  <tr>
945
- <td align="left">Object</td>
946
- <td align="left">Value</td>
944
+ <td style="text-align:left;">Object</td>
945
+ <td style="text-align:left;">Value</td>
947
946
  </tr>
948
947
  <tr>
949
- <td align="left">Mission</td>
950
- <td align="left">Accomplished</td>
948
+ <td style="text-align:left;">Mission</td>
949
+ <td style="text-align:left;">Accomplished</td>
951
950
  </tr>
952
951
  </tbody>
953
952
  </table>
@@ -980,8 +979,7 @@ World</p>
980
979
  <br/>
981
980
  <div>
982
981
  <h1 class="ForewordTitle">Foreword</h1>
983
- <div class="recommend"><p class="AdmonitionTitle">Recommendation 1:<br/>/ogc/recommendation/wfs/2</p>
984
-
982
+ <div class="recommend"><p class="AdmonitionTitle">Recommendation 1:<br/>/ogc/recommendation/wfs/2</p><p><i>Obligation: shall,could<br/>Subject: user<br/>Type: text<br/>Language: BASIC</i></p>
985
983
  <div class="requirement-inherit">/ss/584/2015/level/1</div>
986
984
  <div class="requirement-description">
987
985
  <p id="_">I recommend <i>this</i>.</p>