metanorma-document 0.2.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.
Files changed (682) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/rake.yml +21 -0
  3. data/.github/workflows/release.yml +25 -0
  4. data/.github/workflows/roundtrip-samples.yml +132 -0
  5. data/.gitignore +19 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +22 -0
  8. data/.rubocop_todo.yml +166 -0
  9. data/CHANGELOG.md +21 -0
  10. data/Gemfile +26 -0
  11. data/LICENSE.txt +25 -0
  12. data/README.adoc +176 -0
  13. data/Rakefile +14 -0
  14. data/bin/console +15 -0
  15. data/bin/setup +8 -0
  16. data/data/javascripts/components/mn-code-copy.js +36 -0
  17. data/data/javascripts/components/mn-glossary.js +103 -0
  18. data/data/javascripts/components/mn-index-panel.js +33 -0
  19. data/data/javascripts/components/mn-lightbox.js +18 -0
  20. data/data/javascripts/components/mn-search.js +212 -0
  21. data/data/javascripts/components/mn-shortcuts.js +83 -0
  22. data/data/javascripts/components/mn-stem-dropdown.js +42 -0
  23. data/data/javascripts/components/mn-toc.js +182 -0
  24. data/data/javascripts/core/mn-navigation.js +84 -0
  25. data/data/javascripts/core/mn-reader.js +38 -0
  26. data/data/javascripts/core/mn-reveal.js +36 -0
  27. data/data/javascripts/core/mn-scroll.js +87 -0
  28. data/data/javascripts/core/mn-theme.js +140 -0
  29. data/data/javascripts/search.js +203 -0
  30. data/data/logos/bipm-logo.svg +1 -0
  31. data/data/logos/iec-logo.svg +1 -0
  32. data/data/logos/iho-logo.svg +555 -0
  33. data/data/logos/iso-logo.svg +1 -0
  34. data/data/logos/itu-logo.svg +1 -0
  35. data/data/logos/metanorma-logo.svg +41 -0
  36. data/data/logos/ogc-logo.svg +1 -0
  37. data/data/logos/pdfa-logo.svg +95 -0
  38. data/data/stylesheets/base/_dark.css +193 -0
  39. data/data/stylesheets/base/_layout.css +112 -0
  40. data/data/stylesheets/base/_print.css +46 -0
  41. data/data/stylesheets/base/_reset.css +55 -0
  42. data/data/stylesheets/base/_transitions.css +77 -0
  43. data/data/stylesheets/base/_typography.css +89 -0
  44. data/data/stylesheets/components/admonition.css +19 -0
  45. data/data/stylesheets/components/bibliography.css +18 -0
  46. data/data/stylesheets/components/cover.css +205 -0
  47. data/data/stylesheets/components/example.css +20 -0
  48. data/data/stylesheets/components/figure.css +30 -0
  49. data/data/stylesheets/components/footer.css +24 -0
  50. data/data/stylesheets/components/footnote.css +41 -0
  51. data/data/stylesheets/components/formula.css +25 -0
  52. data/data/stylesheets/components/glossary.css +61 -0
  53. data/data/stylesheets/components/header.css +149 -0
  54. data/data/stylesheets/components/index.css +118 -0
  55. data/data/stylesheets/components/inline.css +88 -0
  56. data/data/stylesheets/components/note.css +24 -0
  57. data/data/stylesheets/components/progress.css +40 -0
  58. data/data/stylesheets/components/search.css +45 -0
  59. data/data/stylesheets/components/section.css +26 -0
  60. data/data/stylesheets/components/shortcuts.css +71 -0
  61. data/data/stylesheets/components/sourcecode.css +30 -0
  62. data/data/stylesheets/components/table.css +57 -0
  63. data/data/stylesheets/components/term.css +45 -0
  64. data/data/stylesheets/components/toc.css +162 -0
  65. data/lib/data/dist/iso_document/frontend/assets/index-mwzbzmnK.js +22 -0
  66. data/lib/data/dist/iso_document/frontend/assets/index-pGvKTNid.css +1 -0
  67. data/lib/data/dist/iso_document/frontend/assets/iso-red.svg +53 -0
  68. data/lib/data/dist/iso_document/frontend/index.html +13 -0
  69. data/lib/metanorma/basic_document/ancillary_blocks/example_block.rb +58 -0
  70. data/lib/metanorma/basic_document/ancillary_blocks/figure_block.rb +64 -0
  71. data/lib/metanorma/basic_document/ancillary_blocks/formula_block.rb +38 -0
  72. data/lib/metanorma/basic_document/ancillary_blocks/literal_block.rb +26 -0
  73. data/lib/metanorma/basic_document/ancillary_blocks/sourcecode_block.rb +57 -0
  74. data/lib/metanorma/basic_document/ancillary_blocks/subfigure.rb +18 -0
  75. data/lib/metanorma/basic_document/ancillary_blocks.rb +15 -0
  76. data/lib/metanorma/basic_document/bib_data/bib_data.rb +18 -0
  77. data/lib/metanorma/basic_document/bib_data/bib_data_extension_type.rb +17 -0
  78. data/lib/metanorma/basic_document/bib_data/bibliographic_item.rb +93 -0
  79. data/lib/metanorma/basic_document/bib_data/document_type.rb +21 -0
  80. data/lib/metanorma/basic_document/bib_data.rb +14 -0
  81. data/lib/metanorma/basic_document/blocks/basic_block.rb +13 -0
  82. data/lib/metanorma/basic_document/blocks/basic_block_no_notes.rb +21 -0
  83. data/lib/metanorma/basic_document/blocks/note_block.rb +13 -0
  84. data/lib/metanorma/basic_document/blocks.rb +32 -0
  85. data/lib/metanorma/basic_document/change/attribute_change_action.rb +19 -0
  86. data/lib/metanorma/basic_document/change/attribute_modify.rb +19 -0
  87. data/lib/metanorma/basic_document/change/change.rb +25 -0
  88. data/lib/metanorma/basic_document/change/change_set.rb +20 -0
  89. data/lib/metanorma/basic_document/change/content_action.rb +21 -0
  90. data/lib/metanorma/basic_document/change/content_change.rb +17 -0
  91. data/lib/metanorma/basic_document/change/content_change_action.rb +28 -0
  92. data/lib/metanorma/basic_document/change/content_modify.rb +18 -0
  93. data/lib/metanorma/basic_document/change/node_change.rb +16 -0
  94. data/lib/metanorma/basic_document/change/node_delete.rb +17 -0
  95. data/lib/metanorma/basic_document/change/node_insert.rb +18 -0
  96. data/lib/metanorma/basic_document/change/node_move.rb +20 -0
  97. data/lib/metanorma/basic_document/change/unique_identifier.rb +17 -0
  98. data/lib/metanorma/basic_document/change.rb +23 -0
  99. data/lib/metanorma/basic_document/contrib_metadata/contribution_element_metadata.rb +22 -0
  100. data/lib/metanorma/basic_document/contrib_metadata/hash.rb +19 -0
  101. data/lib/metanorma/basic_document/contrib_metadata/integrity_value.rb +15 -0
  102. data/lib/metanorma/basic_document/contrib_metadata/iso10118_oid.rb +17 -0
  103. data/lib/metanorma/basic_document/contrib_metadata/iso14888_oid.rb +17 -0
  104. data/lib/metanorma/basic_document/contrib_metadata/signature.rb +21 -0
  105. data/lib/metanorma/basic_document/contrib_metadata.rb +16 -0
  106. data/lib/metanorma/basic_document/data_types/formatted_string.rb +17 -0
  107. data/lib/metanorma/basic_document/data_types/iso15924_code.rb +17 -0
  108. data/lib/metanorma/basic_document/data_types/iso3166_code.rb +17 -0
  109. data/lib/metanorma/basic_document/data_types/iso639_code.rb +17 -0
  110. data/lib/metanorma/basic_document/data_types/iso8601_date_time.rb +17 -0
  111. data/lib/metanorma/basic_document/data_types/localized_string.rb +23 -0
  112. data/lib/metanorma/basic_document/data_types/string_format.rb +22 -0
  113. data/lib/metanorma/basic_document/data_types/uri.rb +17 -0
  114. data/lib/metanorma/basic_document/data_types.rb +16 -0
  115. data/lib/metanorma/basic_document/empty_elements/basic_element.rb +18 -0
  116. data/lib/metanorma/basic_document/empty_elements/horizontal_rule_element.rb +14 -0
  117. data/lib/metanorma/basic_document/empty_elements/index_element.rb +24 -0
  118. data/lib/metanorma/basic_document/empty_elements/line_break_element.rb +14 -0
  119. data/lib/metanorma/basic_document/empty_elements/page_break_element.rb +15 -0
  120. data/lib/metanorma/basic_document/empty_elements.rb +16 -0
  121. data/lib/metanorma/basic_document/id_elements/alt_source.rb +21 -0
  122. data/lib/metanorma/basic_document/id_elements/audio.rb +18 -0
  123. data/lib/metanorma/basic_document/id_elements/bookmark.rb +17 -0
  124. data/lib/metanorma/basic_document/id_elements/id_element.rb +19 -0
  125. data/lib/metanorma/basic_document/id_elements/image.rb +19 -0
  126. data/lib/metanorma/basic_document/id_elements/media.rb +39 -0
  127. data/lib/metanorma/basic_document/id_elements/media_type.rb +17 -0
  128. data/lib/metanorma/basic_document/id_elements/video.rb +22 -0
  129. data/lib/metanorma/basic_document/id_elements.rb +16 -0
  130. data/lib/metanorma/basic_document/lists/definition.rb +21 -0
  131. data/lib/metanorma/basic_document/lists/definition_list.rb +18 -0
  132. data/lib/metanorma/basic_document/lists/list.rb +17 -0
  133. data/lib/metanorma/basic_document/lists/ordered_list.rb +19 -0
  134. data/lib/metanorma/basic_document/lists/ordered_list_type.rb +21 -0
  135. data/lib/metanorma/basic_document/lists/unordered_list.rb +14 -0
  136. data/lib/metanorma/basic_document/lists.rb +14 -0
  137. data/lib/metanorma/basic_document/multi_paragraph/admonition_block.rb +36 -0
  138. data/lib/metanorma/basic_document/multi_paragraph/admonition_type.rb +21 -0
  139. data/lib/metanorma/basic_document/multi_paragraph/paragraphs_block.rb +19 -0
  140. data/lib/metanorma/basic_document/multi_paragraph/quote_block.rb +26 -0
  141. data/lib/metanorma/basic_document/multi_paragraph/review_block.rb +32 -0
  142. data/lib/metanorma/basic_document/multi_paragraph.rb +16 -0
  143. data/lib/metanorma/basic_document/paragraphs/paragraph_block.rb +26 -0
  144. data/lib/metanorma/basic_document/paragraphs/paragraph_with_footnote.rb +21 -0
  145. data/lib/metanorma/basic_document/paragraphs/text_alignment.rb +21 -0
  146. data/lib/metanorma/basic_document/paragraphs.rb +12 -0
  147. data/lib/metanorma/basic_document/reference_elements/callout.rb +21 -0
  148. data/lib/metanorma/basic_document/reference_elements/citation.rb +25 -0
  149. data/lib/metanorma/basic_document/reference_elements/footnote.rb +17 -0
  150. data/lib/metanorma/basic_document/reference_elements/index_xref_element.rb +25 -0
  151. data/lib/metanorma/basic_document/reference_elements/reference_element.rb +22 -0
  152. data/lib/metanorma/basic_document/reference_elements/reference_format.rb +21 -0
  153. data/lib/metanorma/basic_document/reference_elements/reference_to_citation_element.rb +20 -0
  154. data/lib/metanorma/basic_document/reference_elements/reference_to_id_element.rb +17 -0
  155. data/lib/metanorma/basic_document/reference_elements/reference_to_id_with_paragraph_element.rb +19 -0
  156. data/lib/metanorma/basic_document/reference_elements/reference_to_link_element.rb +17 -0
  157. data/lib/metanorma/basic_document/reference_elements.rb +25 -0
  158. data/lib/metanorma/basic_document/sections/basic_section.rb +38 -0
  159. data/lib/metanorma/basic_document/sections/content_section.rb +18 -0
  160. data/lib/metanorma/basic_document/sections/hierarchical_section.rb +18 -0
  161. data/lib/metanorma/basic_document/sections/references_section.rb +19 -0
  162. data/lib/metanorma/basic_document/sections.rb +14 -0
  163. data/lib/metanorma/basic_document/tables/paragraph_table_cell.rb +18 -0
  164. data/lib/metanorma/basic_document/tables/table_block.rb +37 -0
  165. data/lib/metanorma/basic_document/tables/table_cell.rb +23 -0
  166. data/lib/metanorma/basic_document/tables/text_alignment.rb +21 -0
  167. data/lib/metanorma/basic_document/tables/text_table_cell.rb +18 -0
  168. data/lib/metanorma/basic_document/tables/text_table_row.rb +21 -0
  169. data/lib/metanorma/basic_document/tables/vertical_alignment.rb +21 -0
  170. data/lib/metanorma/basic_document/tables.rb +16 -0
  171. data/lib/metanorma/basic_document/text_elements/asciiml.rb +17 -0
  172. data/lib/metanorma/basic_document/text_elements/emphasis_element.rb +14 -0
  173. data/lib/metanorma/basic_document/text_elements/keyword_element.rb +14 -0
  174. data/lib/metanorma/basic_document/text_elements/latex.rb +17 -0
  175. data/lib/metanorma/basic_document/text_elements/mathml.rb +17 -0
  176. data/lib/metanorma/basic_document/text_elements/monospace_element.rb +14 -0
  177. data/lib/metanorma/basic_document/text_elements/ruby_element.rb +21 -0
  178. data/lib/metanorma/basic_document/text_elements/small_caps_element.rb +14 -0
  179. data/lib/metanorma/basic_document/text_elements/stem_element.rb +19 -0
  180. data/lib/metanorma/basic_document/text_elements/stem_type.rb +17 -0
  181. data/lib/metanorma/basic_document/text_elements/stem_value.rb +17 -0
  182. data/lib/metanorma/basic_document/text_elements/strike_element.rb +14 -0
  183. data/lib/metanorma/basic_document/text_elements/strong_element.rb +14 -0
  184. data/lib/metanorma/basic_document/text_elements/subscript_element.rb +14 -0
  185. data/lib/metanorma/basic_document/text_elements/superscript_element.rb +14 -0
  186. data/lib/metanorma/basic_document/text_elements/text_element.rb +18 -0
  187. data/lib/metanorma/basic_document/text_elements/text_element_type.rb +20 -0
  188. data/lib/metanorma/basic_document/text_elements/underline_element.rb +13 -0
  189. data/lib/metanorma/basic_document/text_elements.rb +33 -0
  190. data/lib/metanorma/basic_document.rb +23 -0
  191. data/lib/metanorma/bipm_document/metadata/bipm_bib_data_extension_type.rb +20 -0
  192. data/lib/metanorma/bipm_document/metadata/bipm_bibliographic_item.rb +31 -0
  193. data/lib/metanorma/bipm_document/metadata/bipm_structured_identifier.rb +21 -0
  194. data/lib/metanorma/bipm_document/metadata.rb +15 -0
  195. data/lib/metanorma/bipm_document/root.rb +65 -0
  196. data/lib/metanorma/bipm_document.rb +10 -0
  197. data/lib/metanorma/cc_document/metadata/cc_bib_data_extension_type.rb +12 -0
  198. data/lib/metanorma/cc_document/metadata/cc_bibliographic_item.rb +17 -0
  199. data/lib/metanorma/cc_document/metadata.rb +11 -0
  200. data/lib/metanorma/cc_document/root.rb +65 -0
  201. data/lib/metanorma/cc_document.rb +10 -0
  202. data/lib/metanorma/collection/directive.rb +18 -0
  203. data/lib/metanorma/collection/doc_container.rb +18 -0
  204. data/lib/metanorma/collection/entry.rb +33 -0
  205. data/lib/metanorma/collection/root.rb +31 -0
  206. data/lib/metanorma/collection.rb +12 -0
  207. data/lib/metanorma/document/components/ancillary_blocks/example_block.rb +124 -0
  208. data/lib/metanorma/document/components/ancillary_blocks/figure_block.rb +113 -0
  209. data/lib/metanorma/document/components/ancillary_blocks/formula_block.rb +85 -0
  210. data/lib/metanorma/document/components/ancillary_blocks/key_element.rb +26 -0
  211. data/lib/metanorma/document/components/ancillary_blocks/literal_block.rb +32 -0
  212. data/lib/metanorma/document/components/ancillary_blocks/sourcecode_block.rb +123 -0
  213. data/lib/metanorma/document/components/ancillary_blocks/subfigure.rb +41 -0
  214. data/lib/metanorma/document/components/ancillary_blocks.rb +18 -0
  215. data/lib/metanorma/document/components/bib_data/bib_data.rb +67 -0
  216. data/lib/metanorma/document/components/bib_data/bib_data_extension_type.rb +19 -0
  217. data/lib/metanorma/document/components/bib_data/bibliographic_item.rb +107 -0
  218. data/lib/metanorma/document/components/bib_data/document_type.rb +23 -0
  219. data/lib/metanorma/document/components/bib_data.rb +15 -0
  220. data/lib/metanorma/document/components/blocks/basic_block.rb +19 -0
  221. data/lib/metanorma/document/components/blocks/basic_block_no_notes.rb +22 -0
  222. data/lib/metanorma/document/components/blocks/note_block.rb +79 -0
  223. data/lib/metanorma/document/components/blocks.rb +13 -0
  224. data/lib/metanorma/document/components/change/attribute_change_action.rb +21 -0
  225. data/lib/metanorma/document/components/change/attribute_modify.rb +20 -0
  226. data/lib/metanorma/document/components/change/change.rb +27 -0
  227. data/lib/metanorma/document/components/change/change_set.rb +21 -0
  228. data/lib/metanorma/document/components/change/content_action.rb +23 -0
  229. data/lib/metanorma/document/components/change/content_change.rb +19 -0
  230. data/lib/metanorma/document/components/change/content_change_action.rb +30 -0
  231. data/lib/metanorma/document/components/change/content_modify.rb +19 -0
  232. data/lib/metanorma/document/components/change/node_change.rb +18 -0
  233. data/lib/metanorma/document/components/change/node_delete.rb +19 -0
  234. data/lib/metanorma/document/components/change/node_insert.rb +20 -0
  235. data/lib/metanorma/document/components/change/node_move.rb +22 -0
  236. data/lib/metanorma/document/components/change/unique_identifier.rb +19 -0
  237. data/lib/metanorma/document/components/change.rb +24 -0
  238. data/lib/metanorma/document/components/contrib_metadata/contribution_element_metadata.rb +23 -0
  239. data/lib/metanorma/document/components/contrib_metadata/hash.rb +21 -0
  240. data/lib/metanorma/document/components/contrib_metadata/integrity_value.rb +17 -0
  241. data/lib/metanorma/document/components/contrib_metadata/iso10118_oid.rb +19 -0
  242. data/lib/metanorma/document/components/contrib_metadata/iso14888_oid.rb +19 -0
  243. data/lib/metanorma/document/components/contrib_metadata/signature.rb +23 -0
  244. data/lib/metanorma/document/components/contrib_metadata.rb +17 -0
  245. data/lib/metanorma/document/components/data_types/formatted_string.rb +95 -0
  246. data/lib/metanorma/document/components/data_types/iso15924_code.rb +19 -0
  247. data/lib/metanorma/document/components/data_types/iso3166_code.rb +19 -0
  248. data/lib/metanorma/document/components/data_types/iso639_code.rb +19 -0
  249. data/lib/metanorma/document/components/data_types/iso8601_date_time.rb +19 -0
  250. data/lib/metanorma/document/components/data_types/localized_string.rb +29 -0
  251. data/lib/metanorma/document/components/data_types/string_format.rb +24 -0
  252. data/lib/metanorma/document/components/data_types/uri.rb +19 -0
  253. data/lib/metanorma/document/components/data_types.rb +18 -0
  254. data/lib/metanorma/document/components/empty_elements/basic_element.rb +20 -0
  255. data/lib/metanorma/document/components/empty_elements/horizontal_rule_element.rb +16 -0
  256. data/lib/metanorma/document/components/empty_elements/index_element.rb +26 -0
  257. data/lib/metanorma/document/components/empty_elements/line_break_element.rb +16 -0
  258. data/lib/metanorma/document/components/empty_elements/page_break_element.rb +20 -0
  259. data/lib/metanorma/document/components/empty_elements.rb +18 -0
  260. data/lib/metanorma/document/components/id_elements/alt_source.rb +23 -0
  261. data/lib/metanorma/document/components/id_elements/audio.rb +19 -0
  262. data/lib/metanorma/document/components/id_elements/bookmark.rb +24 -0
  263. data/lib/metanorma/document/components/id_elements/id_element.rb +21 -0
  264. data/lib/metanorma/document/components/id_elements/image.rb +23 -0
  265. data/lib/metanorma/document/components/id_elements/media.rb +41 -0
  266. data/lib/metanorma/document/components/id_elements/media_type.rb +19 -0
  267. data/lib/metanorma/document/components/id_elements/video.rb +23 -0
  268. data/lib/metanorma/document/components/id_elements.rb +18 -0
  269. data/lib/metanorma/document/components/inline/asciimath_element.rb +16 -0
  270. data/lib/metanorma/document/components/inline/attribution_element.rb +17 -0
  271. data/lib/metanorma/document/components/inline/bcp14_element.rb +16 -0
  272. data/lib/metanorma/document/components/inline/biblio_tag_element.rb +23 -0
  273. data/lib/metanorma/document/components/inline/br_element.rb +13 -0
  274. data/lib/metanorma/document/components/inline/comma_element.rb +13 -0
  275. data/lib/metanorma/document/components/inline/concept_element.rb +22 -0
  276. data/lib/metanorma/document/components/inline/display_text_element.rb +37 -0
  277. data/lib/metanorma/document/components/inline/em_raw_element.rb +23 -0
  278. data/lib/metanorma/document/components/inline/enum_comma_element.rb +13 -0
  279. data/lib/metanorma/document/components/inline/eref_element.rb +35 -0
  280. data/lib/metanorma/document/components/inline/fmt_admitted_element.rb +17 -0
  281. data/lib/metanorma/document/components/inline/fmt_annotation_body_element.rb +38 -0
  282. data/lib/metanorma/document/components/inline/fmt_annotation_end_element.rb +26 -0
  283. data/lib/metanorma/document/components/inline/fmt_annotation_start_element.rb +26 -0
  284. data/lib/metanorma/document/components/inline/fmt_concept_element.rb +23 -0
  285. data/lib/metanorma/document/components/inline/fmt_definition_element.rb +18 -0
  286. data/lib/metanorma/document/components/inline/fmt_fn_body_element.rb +22 -0
  287. data/lib/metanorma/document/components/inline/fmt_fn_label_element.rb +23 -0
  288. data/lib/metanorma/document/components/inline/fmt_footnote_container_element.rb +16 -0
  289. data/lib/metanorma/document/components/inline/fmt_identifier_element.rb +16 -0
  290. data/lib/metanorma/document/components/inline/fmt_name_element.rb +23 -0
  291. data/lib/metanorma/document/components/inline/fmt_preferred_element.rb +17 -0
  292. data/lib/metanorma/document/components/inline/fmt_sourcecode_element.rb +29 -0
  293. data/lib/metanorma/document/components/inline/fmt_stem_element.rb +18 -0
  294. data/lib/metanorma/document/components/inline/fmt_termsource_element.rb +20 -0
  295. data/lib/metanorma/document/components/inline/fmt_title_element.rb +29 -0
  296. data/lib/metanorma/document/components/inline/fmt_xref_element.rb +25 -0
  297. data/lib/metanorma/document/components/inline/fmt_xref_label_element.rb +23 -0
  298. data/lib/metanorma/document/components/inline/fn_element.rb +31 -0
  299. data/lib/metanorma/document/components/inline/link_element.rb +27 -0
  300. data/lib/metanorma/document/components/inline/localized_string_element.rb +31 -0
  301. data/lib/metanorma/document/components/inline/localized_strings_element.rb +16 -0
  302. data/lib/metanorma/document/components/inline/math_element.rb +16 -0
  303. data/lib/metanorma/document/components/inline/name_with_id_element.rb +20 -0
  304. data/lib/metanorma/document/components/inline/semx_child_element.rb +25 -0
  305. data/lib/metanorma/document/components/inline/semx_element.rb +117 -0
  306. data/lib/metanorma/document/components/inline/small_cap_element.rb +16 -0
  307. data/lib/metanorma/document/components/inline/span_element.rb +37 -0
  308. data/lib/metanorma/document/components/inline/stem_inline_element.rb +24 -0
  309. data/lib/metanorma/document/components/inline/strong_raw_element.rb +25 -0
  310. data/lib/metanorma/document/components/inline/sub_element.rb +15 -0
  311. data/lib/metanorma/document/components/inline/sup_element.rb +26 -0
  312. data/lib/metanorma/document/components/inline/tab_element.rb +13 -0
  313. data/lib/metanorma/document/components/inline/title_with_annotation_element.rb +51 -0
  314. data/lib/metanorma/document/components/inline/tt_element.rb +20 -0
  315. data/lib/metanorma/document/components/inline/variant_title_element.rb +27 -0
  316. data/lib/metanorma/document/components/inline/xref_element.rb +24 -0
  317. data/lib/metanorma/document/components/inline.rb +100 -0
  318. data/lib/metanorma/document/components/lists/dd_element.rb +58 -0
  319. data/lib/metanorma/document/components/lists/definition.rb +32 -0
  320. data/lib/metanorma/document/components/lists/definition_list.rb +44 -0
  321. data/lib/metanorma/document/components/lists/dt_element.rb +71 -0
  322. data/lib/metanorma/document/components/lists/list.rb +25 -0
  323. data/lib/metanorma/document/components/lists/list_item.rb +102 -0
  324. data/lib/metanorma/document/components/lists/ordered_list.rb +42 -0
  325. data/lib/metanorma/document/components/lists/ordered_list_type.rb +23 -0
  326. data/lib/metanorma/document/components/lists/unordered_list.rb +34 -0
  327. data/lib/metanorma/document/components/lists.rb +19 -0
  328. data/lib/metanorma/document/components/multi_paragraph/admonition_block.rb +62 -0
  329. data/lib/metanorma/document/components/multi_paragraph/admonition_type.rb +23 -0
  330. data/lib/metanorma/document/components/multi_paragraph/paragraphs_block.rb +21 -0
  331. data/lib/metanorma/document/components/multi_paragraph/quote_block.rb +74 -0
  332. data/lib/metanorma/document/components/multi_paragraph/review_block.rb +34 -0
  333. data/lib/metanorma/document/components/multi_paragraph.rb +15 -0
  334. data/lib/metanorma/document/components/paragraphs/paragraph_block.rb +155 -0
  335. data/lib/metanorma/document/components/paragraphs/paragraph_with_footnote.rb +24 -0
  336. data/lib/metanorma/document/components/paragraphs/text_alignment.rb +23 -0
  337. data/lib/metanorma/document/components/paragraphs.rb +14 -0
  338. data/lib/metanorma/document/components/reference_elements/callout.rb +25 -0
  339. data/lib/metanorma/document/components/reference_elements/citation.rb +38 -0
  340. data/lib/metanorma/document/components/reference_elements/footnote.rb +19 -0
  341. data/lib/metanorma/document/components/reference_elements/index_xref_element.rb +27 -0
  342. data/lib/metanorma/document/components/reference_elements/reference_element.rb +24 -0
  343. data/lib/metanorma/document/components/reference_elements/reference_format.rb +23 -0
  344. data/lib/metanorma/document/components/reference_elements/reference_to_citation_element.rb +33 -0
  345. data/lib/metanorma/document/components/reference_elements/reference_to_id_element.rb +19 -0
  346. data/lib/metanorma/document/components/reference_elements/reference_to_id_with_paragraph_element.rb +21 -0
  347. data/lib/metanorma/document/components/reference_elements/reference_to_link_element.rb +19 -0
  348. data/lib/metanorma/document/components/reference_elements.rb +27 -0
  349. data/lib/metanorma/document/components/sections/basic_section.rb +37 -0
  350. data/lib/metanorma/document/components/sections/content_section.rb +20 -0
  351. data/lib/metanorma/document/components/sections/hierarchical_section.rb +19 -0
  352. data/lib/metanorma/document/components/sections/references_section.rb +25 -0
  353. data/lib/metanorma/document/components/sections.rb +15 -0
  354. data/lib/metanorma/document/components/tables/header_table_cell.rb +17 -0
  355. data/lib/metanorma/document/components/tables/paragraph_table_cell.rb +20 -0
  356. data/lib/metanorma/document/components/tables/table_block.rb +99 -0
  357. data/lib/metanorma/document/components/tables/table_cell.rb +139 -0
  358. data/lib/metanorma/document/components/tables/table_section.rb +42 -0
  359. data/lib/metanorma/document/components/tables/text_alignment.rb +23 -0
  360. data/lib/metanorma/document/components/tables/text_table_cell.rb +17 -0
  361. data/lib/metanorma/document/components/tables/text_table_row.rb +30 -0
  362. data/lib/metanorma/document/components/tables/vertical_alignment.rb +23 -0
  363. data/lib/metanorma/document/components/tables.rb +22 -0
  364. data/lib/metanorma/document/components/text_elements/asciiml.rb +19 -0
  365. data/lib/metanorma/document/components/text_elements/emphasis_element.rb +16 -0
  366. data/lib/metanorma/document/components/text_elements/keyword_element.rb +16 -0
  367. data/lib/metanorma/document/components/text_elements/latex.rb +19 -0
  368. data/lib/metanorma/document/components/text_elements/latexmath_element.rb +19 -0
  369. data/lib/metanorma/document/components/text_elements/monospace_element.rb +16 -0
  370. data/lib/metanorma/document/components/text_elements/ruby_element.rb +23 -0
  371. data/lib/metanorma/document/components/text_elements/small_caps_element.rb +16 -0
  372. data/lib/metanorma/document/components/text_elements/stem_element.rb +34 -0
  373. data/lib/metanorma/document/components/text_elements/stem_type.rb +23 -0
  374. data/lib/metanorma/document/components/text_elements/stem_value.rb +19 -0
  375. data/lib/metanorma/document/components/text_elements/strike_element.rb +33 -0
  376. data/lib/metanorma/document/components/text_elements/strong_element.rb +16 -0
  377. data/lib/metanorma/document/components/text_elements/subscript_element.rb +16 -0
  378. data/lib/metanorma/document/components/text_elements/superscript_element.rb +16 -0
  379. data/lib/metanorma/document/components/text_elements/text_element.rb +20 -0
  380. data/lib/metanorma/document/components/text_elements/text_element_type.rb +21 -0
  381. data/lib/metanorma/document/components/text_elements/underline_element.rb +33 -0
  382. data/lib/metanorma/document/components/text_elements.rb +31 -0
  383. data/lib/metanorma/document/components.rb +27 -0
  384. data/lib/metanorma/document/data_types.rb +11 -0
  385. data/lib/metanorma/document/relaton/address.rb +39 -0
  386. data/lib/metanorma/document/relaton/affiliation.rb +22 -0
  387. data/lib/metanorma/document/relaton/bib_item_locality.rb +21 -0
  388. data/lib/metanorma/document/relaton/bib_item_size.rb +19 -0
  389. data/lib/metanorma/document/relaton/bib_item_size_type.rb +21 -0
  390. data/lib/metanorma/document/relaton/bib_item_type.rb +25 -0
  391. data/lib/metanorma/document/relaton/bibliographic_date.rb +27 -0
  392. data/lib/metanorma/document/relaton/bibliographic_date_type.rb +22 -0
  393. data/lib/metanorma/document/relaton/contact_method.rb +22 -0
  394. data/lib/metanorma/document/relaton/contribution_info.rb +21 -0
  395. data/lib/metanorma/document/relaton/contributor.rb +15 -0
  396. data/lib/metanorma/document/relaton/contributor_role.rb +23 -0
  397. data/lib/metanorma/document/relaton/copyright_association.rb +32 -0
  398. data/lib/metanorma/document/relaton/date_time.rb +19 -0
  399. data/lib/metanorma/document/relaton/document_identifier.rb +25 -0
  400. data/lib/metanorma/document/relaton/document_relation.rb +26 -0
  401. data/lib/metanorma/document/relaton/document_relation_type.rb +31 -0
  402. data/lib/metanorma/document/relaton/document_status.rb +26 -0
  403. data/lib/metanorma/document/relaton/edition.rb +21 -0
  404. data/lib/metanorma/document/relaton/full_name.rb +34 -0
  405. data/lib/metanorma/document/relaton/iso4217_code.rb +17 -0
  406. data/lib/metanorma/document/relaton/iso8601_date.rb +17 -0
  407. data/lib/metanorma/document/relaton/keyword_type.rb +23 -0
  408. data/lib/metanorma/document/relaton/locality_stack.rb +19 -0
  409. data/lib/metanorma/document/relaton/localized_name.rb +22 -0
  410. data/lib/metanorma/document/relaton/medium_type.rb +26 -0
  411. data/lib/metanorma/document/relaton/org_identifier.rb +20 -0
  412. data/lib/metanorma/document/relaton/org_subdivision.rb +28 -0
  413. data/lib/metanorma/document/relaton/org_subdivision_identifier.rb +20 -0
  414. data/lib/metanorma/document/relaton/organization.rb +48 -0
  415. data/lib/metanorma/document/relaton/person.rb +28 -0
  416. data/lib/metanorma/document/relaton/person_identifier.rb +18 -0
  417. data/lib/metanorma/document/relaton/personal_identifier_type.rb +21 -0
  418. data/lib/metanorma/document/relaton/phone.rb +18 -0
  419. data/lib/metanorma/document/relaton/place_type.rb +36 -0
  420. data/lib/metanorma/document/relaton/price_type.rb +18 -0
  421. data/lib/metanorma/document/relaton/region_type.rb +20 -0
  422. data/lib/metanorma/document/relaton/relaton_collection.rb +25 -0
  423. data/lib/metanorma/document/relaton/series_type.rb +36 -0
  424. data/lib/metanorma/document/relaton/series_type_type.rb +21 -0
  425. data/lib/metanorma/document/relaton/specific_locality_type.rb +25 -0
  426. data/lib/metanorma/document/relaton/title_type.rb +21 -0
  427. data/lib/metanorma/document/relaton/typed_note.rb +25 -0
  428. data/lib/metanorma/document/relaton/typed_title_string.rb +50 -0
  429. data/lib/metanorma/document/relaton/typed_uri.rb +18 -0
  430. data/lib/metanorma/document/relaton/validity_type.rb +22 -0
  431. data/lib/metanorma/document/relaton/variant_full_name.rb +18 -0
  432. data/lib/metanorma/document/relaton/variant_org_name.rb +18 -0
  433. data/lib/metanorma/document/relaton/version_info.rb +19 -0
  434. data/lib/metanorma/document/relaton/vocab_id_type.rb +22 -0
  435. data/lib/metanorma/document/relaton.rb +64 -0
  436. data/lib/metanorma/document/root.rb +14 -0
  437. data/lib/metanorma/document/version.rb +8 -0
  438. data/lib/metanorma/document.rb +54 -0
  439. data/lib/metanorma/html/asset_pipeline.rb +100 -0
  440. data/lib/metanorma/html/base_renderer.rb +1610 -0
  441. data/lib/metanorma/html/bipm_renderer.rb +145 -0
  442. data/lib/metanorma/html/cc_renderer.rb +55 -0
  443. data/lib/metanorma/html/component/base.rb +63 -0
  444. data/lib/metanorma/html/component/footnote_collector.rb +57 -0
  445. data/lib/metanorma/html/component/index_section.rb +74 -0
  446. data/lib/metanorma/html/component/index_term_collector.rb +100 -0
  447. data/lib/metanorma/html/component.rb +12 -0
  448. data/lib/metanorma/html/component_registry.rb +37 -0
  449. data/lib/metanorma/html/drops/footnote_drop.rb +26 -0
  450. data/lib/metanorma/html/drops.rb +9 -0
  451. data/lib/metanorma/html/generator.rb +114 -0
  452. data/lib/metanorma/html/icc_renderer.rb +49 -0
  453. data/lib/metanorma/html/iec_renderer.rb +54 -0
  454. data/lib/metanorma/html/ieee_renderer.rb +55 -0
  455. data/lib/metanorma/html/ietf_renderer.rb +58 -0
  456. data/lib/metanorma/html/iho_renderer.rb +56 -0
  457. data/lib/metanorma/html/iso_renderer.rb +821 -0
  458. data/lib/metanorma/html/itu_renderer.rb +55 -0
  459. data/lib/metanorma/html/ogc_renderer.rb +86 -0
  460. data/lib/metanorma/html/oiml_renderer.rb +55 -0
  461. data/lib/metanorma/html/pdfa_renderer.rb +51 -0
  462. data/lib/metanorma/html/ribose_renderer.rb +55 -0
  463. data/lib/metanorma/html/standard_renderer.rb +535 -0
  464. data/lib/metanorma/html/templates/_cover.html.liquid +11 -0
  465. data/lib/metanorma/html/templates/_doc_title.html.liquid +3 -0
  466. data/lib/metanorma/html/templates/_footer.html.liquid +8 -0
  467. data/lib/metanorma/html/templates/_footnotes.html.liquid +11 -0
  468. data/lib/metanorma/html/templates/_header.html.liquid +65 -0
  469. data/lib/metanorma/html/templates/_iso_cover.html.liquid +31 -0
  470. data/lib/metanorma/html/templates/_iso_doc_title.html.liquid +3 -0
  471. data/lib/metanorma/html/templates/document.html.liquid +40 -0
  472. data/lib/metanorma/html/theme.rb +196 -0
  473. data/lib/metanorma/html/whitespace_patch.rb +47 -0
  474. data/lib/metanorma/html.rb +29 -0
  475. data/lib/metanorma/iec_document/root.rb +66 -0
  476. data/lib/metanorma/iec_document.rb +10 -0
  477. data/lib/metanorma/ieee_document/metadata/ieee_bib_data_extension_type.rb +18 -0
  478. data/lib/metanorma/ieee_document/metadata/ieee_bibliographic_item.rb +20 -0
  479. data/lib/metanorma/ieee_document/metadata/ieee_structured_identifier.rb +25 -0
  480. data/lib/metanorma/ieee_document/metadata.rb +14 -0
  481. data/lib/metanorma/ieee_document/root.rb +65 -0
  482. data/lib/metanorma/ieee_document.rb +11 -0
  483. data/lib/metanorma/ietf_document/metadata/ietf_bib_data_extension_type.rb +58 -0
  484. data/lib/metanorma/ietf_document/metadata/ietf_bibliographic_item.rb +53 -0
  485. data/lib/metanorma/ietf_document/metadata/ietf_editorial_group.rb +17 -0
  486. data/lib/metanorma/ietf_document/metadata.rb +14 -0
  487. data/lib/metanorma/ietf_document/root.rb +66 -0
  488. data/lib/metanorma/ietf_document/sections.rb +31 -0
  489. data/lib/metanorma/ietf_document.rb +10 -0
  490. data/lib/metanorma/iho_document/metadata/iho_bib_data_extension_type.rb +25 -0
  491. data/lib/metanorma/iho_document/metadata/iho_bibliographic_item.rb +20 -0
  492. data/lib/metanorma/iho_document/metadata/iho_editorial_group.rb +19 -0
  493. data/lib/metanorma/iho_document/metadata/iho_series.rb +22 -0
  494. data/lib/metanorma/iho_document/metadata/iho_sub_group.rb +18 -0
  495. data/lib/metanorma/iho_document/metadata.rb +15 -0
  496. data/lib/metanorma/iho_document/root.rb +65 -0
  497. data/lib/metanorma/iho_document.rb +11 -0
  498. data/lib/metanorma/iso_document/annotation_container.rb +16 -0
  499. data/lib/metanorma/iso_document/blocks/iso_admonition_block.rb +27 -0
  500. data/lib/metanorma/iso_document/blocks/iso_admonition_type.rb +25 -0
  501. data/lib/metanorma/iso_document/blocks.rb +12 -0
  502. data/lib/metanorma/iso_document/boilerplate.rb +17 -0
  503. data/lib/metanorma/iso_document/metadata/abstract_title.rb +36 -0
  504. data/lib/metanorma/iso_document/metadata/doc_identifier.rb +26 -0
  505. data/lib/metanorma/iso_document/metadata/ics.rb +19 -0
  506. data/lib/metanorma/iso_document/metadata/iec_document_category.rb +23 -0
  507. data/lib/metanorma/iso_document/metadata/iso_bib_data_extension_type.rb +86 -0
  508. data/lib/metanorma/iso_document/metadata/iso_bibliographic_item.rb +175 -0
  509. data/lib/metanorma/iso_document/metadata/iso_document_id.rb +46 -0
  510. data/lib/metanorma/iso_document/metadata/iso_document_stage_codes.rb +26 -0
  511. data/lib/metanorma/iso_document/metadata/iso_document_status.rb +56 -0
  512. data/lib/metanorma/iso_document/metadata/iso_document_substage_codes.rb +26 -0
  513. data/lib/metanorma/iso_document/metadata/iso_document_type.rb +25 -0
  514. data/lib/metanorma/iso_document/metadata/iso_localized_title.rb +57 -0
  515. data/lib/metanorma/iso_document/metadata/iso_project_group.rb +32 -0
  516. data/lib/metanorma/iso_document/metadata/iso_sub_group.rb +38 -0
  517. data/lib/metanorma/iso_document/metadata/metanorma_extension.rb +20 -0
  518. data/lib/metanorma/iso_document/metadata/structured_identifier.rb +33 -0
  519. data/lib/metanorma/iso_document/metadata/title_amd.rb +12 -0
  520. data/lib/metanorma/iso_document/metadata/title_amendment_prefix.rb +12 -0
  521. data/lib/metanorma/iso_document/metadata/title_collection.rb +46 -0
  522. data/lib/metanorma/iso_document/metadata/title_full.rb +12 -0
  523. data/lib/metanorma/iso_document/metadata/title_intro.rb +12 -0
  524. data/lib/metanorma/iso_document/metadata/title_main.rb +12 -0
  525. data/lib/metanorma/iso_document/metadata/title_part.rb +12 -0
  526. data/lib/metanorma/iso_document/metadata/title_part_prefix.rb +12 -0
  527. data/lib/metanorma/iso_document/metadata.rb +39 -0
  528. data/lib/metanorma/iso_document/raw_paragraph.rb +23 -0
  529. data/lib/metanorma/iso_document/root.rb +92 -0
  530. data/lib/metanorma/iso_document/sections/colophon.rb +18 -0
  531. data/lib/metanorma/iso_document/sections/iso_abstract_section.rb +15 -0
  532. data/lib/metanorma/iso_document/sections/iso_amendment_clause.rb +24 -0
  533. data/lib/metanorma/iso_document/sections/iso_annex_section.rb +172 -0
  534. data/lib/metanorma/iso_document/sections/iso_clause_section.rb +206 -0
  535. data/lib/metanorma/iso_document/sections/iso_foreword_section.rb +118 -0
  536. data/lib/metanorma/iso_document/sections/iso_preface.rb +43 -0
  537. data/lib/metanorma/iso_document/sections/iso_sections.rb +61 -0
  538. data/lib/metanorma/iso_document/sections/iso_terms_section.rb +88 -0
  539. data/lib/metanorma/iso_document/sections.rb +17 -0
  540. data/lib/metanorma/iso_document/terms/iso_term.rb +84 -0
  541. data/lib/metanorma/iso_document/terms/iso_term_collection.rb +20 -0
  542. data/lib/metanorma/iso_document/terms/term_definition.rb +30 -0
  543. data/lib/metanorma/iso_document/terms/term_designation.rb +44 -0
  544. data/lib/metanorma/iso_document/terms/term_example.rb +39 -0
  545. data/lib/metanorma/iso_document/terms/term_expression.rb +55 -0
  546. data/lib/metanorma/iso_document/terms/term_note.rb +41 -0
  547. data/lib/metanorma/iso_document/terms/term_origin.rb +26 -0
  548. data/lib/metanorma/iso_document/terms/term_source.rb +49 -0
  549. data/lib/metanorma/iso_document/terms/verbal_definition.rb +41 -0
  550. data/lib/metanorma/iso_document/terms.rb +20 -0
  551. data/lib/metanorma/iso_document.rb +16 -0
  552. data/lib/metanorma/itu_document/metadata/itu_bib_data_extension_type.rb +63 -0
  553. data/lib/metanorma/itu_document/metadata/itu_bibliographic_item.rb +21 -0
  554. data/lib/metanorma/itu_document/metadata/itu_series.rb +22 -0
  555. data/lib/metanorma/itu_document/metadata/itu_structured_identifier.rb +23 -0
  556. data/lib/metanorma/itu_document/metadata.rb +19 -0
  557. data/lib/metanorma/itu_document/root.rb +65 -0
  558. data/lib/metanorma/itu_document.rb +10 -0
  559. data/lib/metanorma/ogc_document/metadata/ogc_bib_data_extension_type.rb +12 -0
  560. data/lib/metanorma/ogc_document/metadata/ogc_bibliographic_item.rb +19 -0
  561. data/lib/metanorma/ogc_document/metadata.rb +12 -0
  562. data/lib/metanorma/ogc_document/root.rb +65 -0
  563. data/lib/metanorma/ogc_document.rb +10 -0
  564. data/lib/metanorma/oiml_document/root.rb +66 -0
  565. data/lib/metanorma/oiml_document.rb +10 -0
  566. data/lib/metanorma/ribose_document/metadata/ribose_bib_data_extension_type.rb +20 -0
  567. data/lib/metanorma/ribose_document/metadata/ribose_bibliographic_item.rb +18 -0
  568. data/lib/metanorma/ribose_document/metadata.rb +12 -0
  569. data/lib/metanorma/ribose_document/root.rb +68 -0
  570. data/lib/metanorma/ribose_document.rb +10 -0
  571. data/lib/metanorma/standard_document/blocks/amend_block.rb +50 -0
  572. data/lib/metanorma/standard_document/blocks/amend_content_block.rb +17 -0
  573. data/lib/metanorma/standard_document/blocks/auto_number.rb +20 -0
  574. data/lib/metanorma/standard_document/blocks/block_source.rb +45 -0
  575. data/lib/metanorma/standard_document/blocks/change_type.rb +21 -0
  576. data/lib/metanorma/standard_document/blocks/element_name.rb +22 -0
  577. data/lib/metanorma/standard_document/blocks/form.rb +38 -0
  578. data/lib/metanorma/standard_document/blocks/image_map_area_type.rb +24 -0
  579. data/lib/metanorma/standard_document/blocks/image_map_area_type_type.rb +21 -0
  580. data/lib/metanorma/standard_document/blocks/image_map_block.rb +32 -0
  581. data/lib/metanorma/standard_document/blocks/image_map_coords.rb +19 -0
  582. data/lib/metanorma/standard_document/blocks/image_map_radius.rb +19 -0
  583. data/lib/metanorma/standard_document/blocks/multilingual_rendering_type.rb +21 -0
  584. data/lib/metanorma/standard_document/blocks/passthrough.rb +20 -0
  585. data/lib/metanorma/standard_document/blocks/requirement_model.rb +165 -0
  586. data/lib/metanorma/standard_document/blocks/standard_admonition_block.rb +32 -0
  587. data/lib/metanorma/standard_document/blocks/standard_block.rb +28 -0
  588. data/lib/metanorma/standard_document/blocks/standard_block_no_notes.rb +34 -0
  589. data/lib/metanorma/standard_document/blocks/standard_example_block.rb +30 -0
  590. data/lib/metanorma/standard_document/blocks/standard_figure_block.rb +32 -0
  591. data/lib/metanorma/standard_document/blocks/standard_formula_block.rb +30 -0
  592. data/lib/metanorma/standard_document/blocks/standard_note_block.rb +64 -0
  593. data/lib/metanorma/standard_document/blocks/standard_paragraph_block.rb +25 -0
  594. data/lib/metanorma/standard_document/blocks/standard_quote_block.rb +29 -0
  595. data/lib/metanorma/standard_document/blocks/standard_sourcecode_block.rb +32 -0
  596. data/lib/metanorma/standard_document/blocks/standard_table_block.rb +39 -0
  597. data/lib/metanorma/standard_document/blocks/svg_map_block.rb +23 -0
  598. data/lib/metanorma/standard_document/blocks/svg_target_type.rb +20 -0
  599. data/lib/metanorma/standard_document/blocks/table_col.rb +16 -0
  600. data/lib/metanorma/standard_document/blocks/to_c.rb +17 -0
  601. data/lib/metanorma/standard_document/blocks.rb +60 -0
  602. data/lib/metanorma/standard_document/elements/add.rb +19 -0
  603. data/lib/metanorma/standard_document/elements/del.rb +19 -0
  604. data/lib/metanorma/standard_document/elements/form_input.rb +27 -0
  605. data/lib/metanorma/standard_document/elements/input.rb +33 -0
  606. data/lib/metanorma/standard_document/elements/input_type.rb +27 -0
  607. data/lib/metanorma/standard_document/elements/label.rb +19 -0
  608. data/lib/metanorma/standard_document/elements/option.rb +27 -0
  609. data/lib/metanorma/standard_document/elements/orientation_type.rb +27 -0
  610. data/lib/metanorma/standard_document/elements/select.rb +32 -0
  611. data/lib/metanorma/standard_document/elements/standard_page_break_element.rb +22 -0
  612. data/lib/metanorma/standard_document/elements/textarea.rb +25 -0
  613. data/lib/metanorma/standard_document/elements.rb +20 -0
  614. data/lib/metanorma/standard_document/lists/standard_definition.rb +24 -0
  615. data/lib/metanorma/standard_document/lists/standard_definition_list.rb +30 -0
  616. data/lib/metanorma/standard_document/lists/standard_definition_term.rb +27 -0
  617. data/lib/metanorma/standard_document/lists/standard_unordered_list.rb +28 -0
  618. data/lib/metanorma/standard_document/lists/unordered_checkable_list_item.rb +26 -0
  619. data/lib/metanorma/standard_document/lists.rb +17 -0
  620. data/lib/metanorma/standard_document/metadata/editorial_group_type.rb +25 -0
  621. data/lib/metanorma/standard_document/metadata/ics_type.rb +26 -0
  622. data/lib/metanorma/standard_document/metadata/standard_bib_data.rb +25 -0
  623. data/lib/metanorma/standard_document/metadata/standard_bib_data_extension_type.rb +37 -0
  624. data/lib/metanorma/standard_document/metadata/structured_identifier_type.rb +48 -0
  625. data/lib/metanorma/standard_document/metadata/technical_committee_type.rb +27 -0
  626. data/lib/metanorma/standard_document/metadata.rb +17 -0
  627. data/lib/metanorma/standard_document/namespace.rb +11 -0
  628. data/lib/metanorma/standard_document/refs/reference_to_term.rb +25 -0
  629. data/lib/metanorma/standard_document/refs/reference_to_termbase.rb +27 -0
  630. data/lib/metanorma/standard_document/refs/standoc_locality_stack.rb +24 -0
  631. data/lib/metanorma/standard_document/refs/standoc_reference_to_citation_element.rb +27 -0
  632. data/lib/metanorma/standard_document/refs/standoc_reference_to_id_element.rb +36 -0
  633. data/lib/metanorma/standard_document/refs/xref_case_type.rb +27 -0
  634. data/lib/metanorma/standard_document/refs/xref_connective_type.rb +27 -0
  635. data/lib/metanorma/standard_document/refs/xref_target_type.rb +25 -0
  636. data/lib/metanorma/standard_document/refs.rb +18 -0
  637. data/lib/metanorma/standard_document/root.rb +10 -0
  638. data/lib/metanorma/standard_document/sections/abstract.rb +21 -0
  639. data/lib/metanorma/standard_document/sections/acknowledgements.rb +21 -0
  640. data/lib/metanorma/standard_document/sections/annex_section.rb +32 -0
  641. data/lib/metanorma/standard_document/sections/bibliography_section.rb +21 -0
  642. data/lib/metanorma/standard_document/sections/boilerplate_type.rb +32 -0
  643. data/lib/metanorma/standard_document/sections/clause_hierarchical_section.rb +32 -0
  644. data/lib/metanorma/standard_document/sections/clause_section.rb +29 -0
  645. data/lib/metanorma/standard_document/sections/definition_section.rb +75 -0
  646. data/lib/metanorma/standard_document/sections/floating_title.rb +27 -0
  647. data/lib/metanorma/standard_document/sections/foreword.rb +21 -0
  648. data/lib/metanorma/standard_document/sections/introduction.rb +23 -0
  649. data/lib/metanorma/standard_document/sections/misc_container.rb +26 -0
  650. data/lib/metanorma/standard_document/sections/normative_type.rb +29 -0
  651. data/lib/metanorma/standard_document/sections/standard_content_section.rb +27 -0
  652. data/lib/metanorma/standard_document/sections/standard_hierarchical_section.rb +30 -0
  653. data/lib/metanorma/standard_document/sections/standard_references_section.rb +74 -0
  654. data/lib/metanorma/standard_document/sections/standard_section.rb +39 -0
  655. data/lib/metanorma/standard_document/sections/terms_section.rb +29 -0
  656. data/lib/metanorma/standard_document/sections.rb +30 -0
  657. data/lib/metanorma/standard_document/standard_document_type.rb +15 -0
  658. data/lib/metanorma/standard_document/terms/abbreviation_type.rb +27 -0
  659. data/lib/metanorma/standard_document/terms/concept.rb +42 -0
  660. data/lib/metanorma/standard_document/terms/definition_collection.rb +24 -0
  661. data/lib/metanorma/standard_document/terms/designation.rb +31 -0
  662. data/lib/metanorma/standard_document/terms/expression_designation.rb +38 -0
  663. data/lib/metanorma/standard_document/terms/expression_type.rb +27 -0
  664. data/lib/metanorma/standard_document/terms/grammar_gender.rb +27 -0
  665. data/lib/metanorma/standard_document/terms/grammar_info.rb +36 -0
  666. data/lib/metanorma/standard_document/terms/graphical_symbol_designation.rb +25 -0
  667. data/lib/metanorma/standard_document/terms/letter_symbol_designation.rb +27 -0
  668. data/lib/metanorma/standard_document/terms/non_verbal_representation.rb +33 -0
  669. data/lib/metanorma/standard_document/terms/related_term.rb +31 -0
  670. data/lib/metanorma/standard_document/terms/related_term_type.rb +28 -0
  671. data/lib/metanorma/standard_document/terms/term.rb +66 -0
  672. data/lib/metanorma/standard_document/terms/term_collection.rb +24 -0
  673. data/lib/metanorma/standard_document/terms/term_definition.rb +29 -0
  674. data/lib/metanorma/standard_document/terms/term_source.rb +29 -0
  675. data/lib/metanorma/standard_document/terms/term_source_status.rb +29 -0
  676. data/lib/metanorma/standard_document/terms/term_source_type.rb +21 -0
  677. data/lib/metanorma/standard_document/terms/verbal_expression.rb +35 -0
  678. data/lib/metanorma/standard_document/terms.rb +31 -0
  679. data/lib/metanorma/standard_document.rb +19 -0
  680. data/metanorma-document.gemspec +35 -0
  681. data/tasks/roundtrip_samples.rake +535 -0
  682. metadata +743 -0
@@ -0,0 +1,821 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "stringio"
4
+
5
+ module Metanorma
6
+ module Html
7
+ # Renders IsoDocument components to HTML.
8
+ # Extends StandardRenderer with ISO-specific cover page, boilerplate,
9
+ # foreword, introduction, annex formatting, and ISO term entries.
10
+ class IsoRenderer < StandardRenderer
11
+ class << self
12
+ def doc_types
13
+ @doc_types ||= []
14
+ if superclass <= IsoRenderer && superclass != IsoRenderer
15
+ superclass.doc_types + @doc_types
16
+ else
17
+ @doc_types.dup
18
+ end
19
+ end
20
+
21
+ def registers_doc_type(klass)
22
+ @doc_types ||= []
23
+ @doc_types << klass
24
+ end
25
+ end
26
+
27
+ # --- Public hooks for flavor customization ---
28
+
29
+ def flavor_publishers(_doc_id)
30
+ ["ISO"]
31
+ end
32
+
33
+ def flavor_publisher_name
34
+ "ISO"
35
+ end
36
+
37
+ def publisher_logo_map
38
+ { "ISO" => "iso-logo.svg" }
39
+ end
40
+
41
+ # ISO brand: #e3000f red from logo
42
+ def theme
43
+ @theme ||= Theme.new.tap do |t|
44
+ t.primary = "#b3000c"
45
+ t.accent = "#e3000f"
46
+ t.accent_deep = "#b3000c"
47
+ t.gradient = "linear-gradient(135deg, #8a0009 0%, #b3000c 50%, #e3000f 100%)"
48
+ t.primary_light = "#fef0f1"
49
+ t.accent_light = "#fde8ea"
50
+ t.warm = "#1a1a1a"
51
+ t.warm_light = "#f5f5f5"
52
+ t.header_background = "linear-gradient(135deg, #8a0009 0%, #b3000c 40%, #e3000f 100%)"
53
+ t.cover_background = "linear-gradient(175deg, #5a0006 0%, #8a0009 25%, #b3000c 50%, #e3000f 80%, #ff4d4d 100%)"
54
+ t.cover_before_bg = "background: radial-gradient(ellipse at 25% 20%, rgba(255,77,77,0.15) 0%, transparent 50%), radial-gradient(ellipse at 75% 80%, rgba(26,26,26,0.1) 0%, transparent 40%)"
55
+ t.cover_after_bg = "height: 3px; background: linear-gradient(90deg, transparent, #e3000f, #1a1a1a, transparent)"
56
+ t.progress_bar_color = "#e3000f"
57
+ t.note_border = "#e3000f"
58
+ t.note_bg = "#fde8ea"
59
+ t.note_color = "#e3000f"
60
+ t.example_border = "#b3000c"
61
+ t.example_bg = "#fef0f1"
62
+ t.example_color = "#b3000c"
63
+ t.admonition_border = "#1a1a1a"
64
+ t.admonition_color = "#1a1a1a"
65
+ t.footer_border_color = "#e3000f"
66
+ t.cover_separator_color = "rgba(227,0,15,0.25)"
67
+ end
68
+ end
69
+
70
+ def render(node, **opts)
71
+ case node
72
+ when Metanorma::IsoDocument::Root
73
+ render_document(node, **opts)
74
+ when Metanorma::IsoDocument::Sections::IsoPreface
75
+ render_preface(node, **opts)
76
+ when Metanorma::IsoDocument::Sections::IsoSections
77
+ render_sections(node, **opts)
78
+ when Metanorma::IsoDocument::Sections::IsoClauseSection
79
+ render_clause(node, **opts)
80
+ when Metanorma::IsoDocument::Sections::IsoAnnexSection
81
+ render_annex(node, **opts)
82
+ when Metanorma::IsoDocument::Sections::IsoTermsSection
83
+ render_terms_section(node, **opts)
84
+ when Metanorma::IsoDocument::Sections::IsoForewordSection
85
+ render_foreword(node, **opts)
86
+ when Metanorma::IsoDocument::Sections::IsoAbstractSection
87
+ render_abstract(node, **opts)
88
+ when Metanorma::IsoDocument::Terms::IsoTerm
89
+ render_term(node, **opts)
90
+ when Metanorma::IsoDocument::Terms::TermNote
91
+ render_term_note(node, **opts)
92
+ when Metanorma::IsoDocument::Terms::TermExample
93
+ render_term_example(node, **opts)
94
+ when Metanorma::IsoDocument::Boilerplate
95
+ render_boilerplate(node, **opts)
96
+ else
97
+ super
98
+ end
99
+ end
100
+
101
+ def render_inline_element(element)
102
+ case element
103
+ when Metanorma::IsoDocument::Terms::TermOrigin
104
+ render_term_origin(element)
105
+ else
106
+ super
107
+ end
108
+ end
109
+
110
+ def render_term_origin(element)
111
+ text = extract_text_value(element)
112
+ return unless text
113
+
114
+ @output << "<span class=\"term-source\">#{escape_html(text)}</span>"
115
+ end
116
+
117
+ def extract_display_title(bibdata)
118
+ titles = bibdata.titles
119
+ return nil unless titles
120
+
121
+ en_title = bibdata.title_for("en")
122
+ result = en_title&.to_s
123
+ return result if result && !result.empty?
124
+
125
+ if titles.is_a?(Metanorma::IsoDocument::Metadata::TitleCollection) && !titles.items.empty?
126
+ raw = titles.items.find { |t| t.language == "en" } || titles.items.first
127
+ return raw.value.to_s if raw&.value
128
+ end
129
+ nil
130
+ end
131
+
132
+ # Format doc identifier with publisher prefix (e.g. "OGC 00-027").
133
+ def formatted_doc_id(bibdata)
134
+ identifiers = bibdata.doc_identifier
135
+ return nil unless identifiers && !identifiers.empty?
136
+
137
+ raw_id = extract_text_value(identifiers.first).to_s.strip
138
+ return nil if raw_id.empty?
139
+
140
+ pub = flavor_publisher_name
141
+ if pub && !raw_id.start_with?(pub)
142
+ "#{pub} #{raw_id}"
143
+ else
144
+ raw_id
145
+ end
146
+ end
147
+
148
+ # Extract English stage text, deduplicating duplicate language variants.
149
+ def extract_stage(bibdata)
150
+ return nil unless bibdata.status && bibdata.status.stage
151
+
152
+ stages = Array(bibdata.status.stage)
153
+ return nil if stages.empty?
154
+
155
+ # Prefer English-language stage
156
+ en_stage = stages.find { |s|
157
+ lang = safe_attr(s, :language)
158
+ lang == "en" if lang
159
+ }
160
+ return Array(en_stage.value).join.strip if en_stage && en_stage.value
161
+
162
+ # Fallback: first non-empty, deduplicated
163
+ seen = Set.new
164
+ stage_text = stages.filter_map { |s|
165
+ val = Array(s.value).join.strip
166
+ down = val.downcase
167
+ next if seen.include?(down)
168
+ seen << down
169
+ val.empty? ? nil : val
170
+ }.compact.join(" ")
171
+ stage_text.empty? ? nil : stage_text
172
+ end
173
+
174
+ # Extract document type from ext.doctype.
175
+ def extract_doctype(bibdata)
176
+ return nil unless bibdata.respond_to?(:ext)
177
+ ext = bibdata.ext
178
+ return nil unless ext
179
+
180
+ doctypes = ext.doctype
181
+ return nil unless doctypes && !doctypes.empty?
182
+
183
+ # Prefer English-language doctype
184
+ en_dt = doctypes.find { |d|
185
+ lang = safe_attr(d, :language)
186
+ lang == "en" if lang
187
+ }
188
+ return en_dt.value.to_s if en_dt && en_dt.value
189
+
190
+ # Fallback: first doctype
191
+ dt = doctypes.first
192
+ val = dt&.value.to_s
193
+ val.strip.empty? ? nil : val
194
+ end
195
+
196
+ private
197
+
198
+ # --- Top-level document rendering ---
199
+
200
+ def render_document(doc, **_opts)
201
+ render_coverpage(doc)
202
+ render_boilerplate_section(doc)
203
+
204
+ @output << "<main class=\"main-section\">"
205
+
206
+ # Preface sections
207
+ render(doc.preface) if doc.preface
208
+
209
+ # Document title line
210
+ render_doc_title(doc)
211
+
212
+ # Collect ALL top-level content (sections + normative refs + annexes + bibliography)
213
+ # and render in displayorder for correct document order.
214
+ all_items = collect_document_children(doc)
215
+
216
+ all_items.each do |node|
217
+ next if node.is_a?(String)
218
+ next if is_title_element?(node, doc.sections)
219
+ next if is_doc_title_paragraph?(node)
220
+ render(node)
221
+ end
222
+
223
+ render_footnotes_section
224
+
225
+ @output << "</main>"
226
+ end
227
+
228
+ # --- Cover page ---
229
+
230
+ def render_coverpage(doc)
231
+ bibdata = doc.bibdata
232
+ return unless bibdata
233
+
234
+ logos = publisher_logos_html(doc) || []
235
+ doc_id = formatted_doc_id(bibdata)
236
+
237
+ pub_date = nil
238
+ bibdata.date&.each do |date|
239
+ date_type = extract_text_value(safe_attr(date, :type_attr) || safe_attr(date, :type))
240
+ date_val = extract_text_value(date.is_a?(Metanorma::Document::Relaton::BibliographicDate) ? date.on : safe_attr(date, :text))
241
+ if date_type == "published" && date_val
242
+ pub_date = date_val
243
+ end
244
+ end
245
+
246
+ doctype = extract_doctype(bibdata)
247
+
248
+ title_text = nil
249
+ if bibdata.titles
250
+ en_title = bibdata.title_for("en")
251
+ title_text = en_title.to_s if en_title
252
+ end
253
+
254
+ stage_text = extract_stage(bibdata)
255
+
256
+ @output << render_liquid("_iso_cover.html.liquid", {
257
+ "publisher_logos" => logos,
258
+ "doc_id" => doc_id,
259
+ "pub_date" => pub_date,
260
+ "doctype" => doctype,
261
+ "title" => title_text,
262
+ "stage" => stage_text,
263
+ })
264
+ end
265
+
266
+ def render_doc_title(doc)
267
+ bibdata = doc.bibdata
268
+ return unless bibdata
269
+
270
+ titles = bibdata.titles
271
+ return unless titles
272
+
273
+ en_title = bibdata.title_for("en")
274
+ return unless en_title
275
+
276
+ @output << render_liquid("_iso_doc_title.html.liquid", {
277
+ "title" => en_title.to_s,
278
+ })
279
+ end
280
+
281
+ def render_boilerplate_section(doc)
282
+ return unless doc.boilerplate
283
+
284
+ @output << "<div class=\"prefatory-section\">"
285
+ render(doc.boilerplate)
286
+ @output << "</div><hr class=\"cover-separator\" />"
287
+ end
288
+
289
+ def render_preface(preface, **_opts)
290
+ render(preface.foreword) if preface.foreword
291
+ render(preface.introduction) if preface.introduction
292
+ render(preface.abstract) if preface.abstract
293
+ preface.clause&.each { |cl| render(cl, level: 1) }
294
+ render(preface.acknowledgements) if preface.acknowledgements
295
+ render(preface.executivesummary) if preface.executivesummary
296
+ end
297
+
298
+ def render_foreword(fw, level: 1, **_opts)
299
+ attrs = element_attrs(id: safe_attr(fw, :id))
300
+ tag("div", attrs) do
301
+ title = safe_attr(fw, :fmt_title) || safe_attr(fw, :title)
302
+ if title
303
+ fw_id = safe_attr(fw, :id)
304
+ title_text = extract_plain_text(title)
305
+ register_toc_entry(id: fw_id, level: level, text: title_text)
306
+ @output << "<h1 class=\"ForewordTitle\">"
307
+ render_mixed_inline(title)
308
+ @output << "</h1>"
309
+ end
310
+ render_ordered_content(fw)
311
+ end
312
+ end
313
+
314
+ def render_abstract(section, level: 1, **_opts)
315
+ attrs = element_attrs(id: safe_attr(section, :id))
316
+ tag("div", attrs) do
317
+ title = safe_attr(section, :fmt_title) || safe_attr(section, :title)
318
+ if title
319
+ sec_id = safe_attr(section, :id)
320
+ title_text = extract_plain_text(title)
321
+ register_toc_entry(id: sec_id, level: level, text: title_text)
322
+ @output << "<h1 class=\"IntroTitle\">"
323
+ render_mixed_inline(title)
324
+ @output << "</h1>"
325
+ end
326
+ render_ordered_content(section)
327
+ end
328
+ end
329
+
330
+ # --- Main sections rendering ---
331
+
332
+ def render_sections(sections, **_opts)
333
+ # Collect ALL section-level children (from mixed content AND typed attributes)
334
+ # then sort by displayorder for correct document order.
335
+ children = collect_ordered_children(sections)
336
+ children.each do |node|
337
+ next if node.is_a?(String)
338
+ next if is_title_element?(node, sections)
339
+
340
+ render(node, level: 1)
341
+ end
342
+ end
343
+
344
+ # --- Clause rendering ---
345
+
346
+ def render_clause(clause, level: 1, **_opts)
347
+ attrs = element_attrs(id: safe_attr(clause, :id), class: safe_attr(clause, :class_attr))
348
+ tag("div", attrs) do
349
+ render_title(clause, level)
350
+ render_ordered_content(clause, level)
351
+ end
352
+ end
353
+
354
+ # --- Annex rendering ---
355
+
356
+ def render_annex(annex, level: 1, **_opts)
357
+ attrs = element_attrs(id: safe_attr(annex, :id), class: "Section3")
358
+ tag("div", attrs) do
359
+ render_annex_title(annex, level)
360
+ render_ordered_content(annex, level)
361
+ end
362
+ end
363
+
364
+ def render_annex_title(annex, level)
365
+ title_element = safe_attr(annex, :fmt_title) || safe_attr(annex, :title)
366
+ return unless title_element
367
+
368
+ annex_id = safe_attr(annex, :id)
369
+ title_text = extract_plain_text(title_element)
370
+ register_toc_entry(id: annex_id, level: level, text: title_text)
371
+
372
+ h = "h#{[[level, 6].min, 1].max}"
373
+ @output << "<#{h} class=\"Annex\">"
374
+ render_mixed_inline(title_element)
375
+ @output << "</#{h}>"
376
+ end
377
+
378
+ # --- Terms section rendering ---
379
+
380
+ def render_terms_section(terms, level: 1, **_opts)
381
+ attrs = element_attrs(id: safe_attr(terms, :id))
382
+ tag("div", attrs) do
383
+ render_title(terms, level)
384
+ render_ordered_content(terms, level)
385
+ end
386
+ end
387
+
388
+ # --- ISO Term rendering ---
389
+
390
+ def render_term(term, **_opts)
391
+ term_name = extract_term_name(term)
392
+ term_def = extract_term_definition(term)
393
+ data_attrs = {}
394
+ data_attrs["data-term-name"] = term_name if term_name && !term_name.empty?
395
+ data_attrs["data-term-definition"] = term_def if term_def && !term_def.empty?
396
+ attrs = element_attrs(id: safe_attr(term, :id), **data_attrs)
397
+ tag("div", attrs) do
398
+ # In presentation mode, use fmt_* elements
399
+ if term.fmt_name
400
+ # Render term number (e.g. "3.1")
401
+ @output << "<p class=\"TermNum\">"
402
+ render_inline_element(term.fmt_name)
403
+ @output << "</p>"
404
+ elsif term.term_number
405
+ tn = term.term_number
406
+ tn_text = if tn.is_a?(String)
407
+ tn
408
+ else
409
+ extract_text_value(tn)
410
+ end
411
+ @output << "<p class=\"TermNum\">#{escape_html(tn_text)}</p>"
412
+ end
413
+
414
+ # Preferred designations — use fmt-preferred if available
415
+ if term.fmt_preferred && !term.fmt_preferred.empty?
416
+ term.fmt_preferred.each { |fp| fp.p&.each { |para| render_paragraph(para) } }
417
+ elsif term.preferred && !term.preferred.empty?
418
+ term.preferred&.each { |designation| render_term_designation(designation, "preferred") }
419
+ end
420
+
421
+ # Admitted designations — use fmt-admitted if available
422
+ if term.fmt_admitted && !term.fmt_admitted.empty?
423
+ term.fmt_admitted.each { |fa| fa.p&.each { |para| render_paragraph(para) } }
424
+ elsif term.admitted && !term.admitted.empty?
425
+ term.admitted&.each { |designation| render_term_designation(designation, "admitted") }
426
+ end
427
+
428
+ # Deprecated designations — use fmt-deprecates if available
429
+ if term.fmt_deprecates
430
+ term.fmt_deprecates.p&.each { |para| render_paragraph(para) }
431
+ elsif term.deprecates && !term.deprecates.empty?
432
+ term.deprecates&.each { |designation| render_term_designation(designation, "deprecated") }
433
+ end
434
+
435
+ # Domain — only render separately when fmt-definition is absent
436
+ # (fmt-definition already includes domain text in its content)
437
+ if term.domain && !term.fmt_definition
438
+ domain_text = safe_attr(term.domain, :text)
439
+ @output << "<p class=\"domain\">&lt;#{escape_html(domain_text)}&gt;</p>" if domain_text
440
+ end
441
+
442
+ # Definition — use fmt-definition if available
443
+ if term.fmt_definition
444
+ render_ordered_content(term.fmt_definition)
445
+ else
446
+ # Definition paragraphs
447
+ term.p&.each { |para| render_paragraph(para) }
448
+ # Structured definitions
449
+ term.definition&.each { |defn| render_term_definition(defn) }
450
+ end
451
+
452
+ # Term notes
453
+ term.termnote&.each { |note| render_term_note(note) }
454
+
455
+ # Term examples
456
+ term.termexample&.each { |ex| render_term_example(ex) }
457
+
458
+ # Source references — use fmt-termsource if available
459
+ if term.fmt_termsource && !term.fmt_termsource.empty?
460
+ term.fmt_termsource.each do |fts|
461
+ @output << "<p class=\"source\">"
462
+ render_mixed_inline(fts)
463
+ @output << "</p>"
464
+ end
465
+ else
466
+ term.source&.each { |src| render_term_source(src) }
467
+ term.termsource&.each { |src| render_term_source_element(src) }
468
+ end
469
+
470
+ # Admonitions
471
+ term.admonition&.each { |adm| render_admonition(adm) }
472
+
473
+ # Nested terms
474
+ term.term&.each { |sub| render_term(sub) }
475
+ end
476
+ end
477
+
478
+ def extract_term_name(term)
479
+ if term.fmt_preferred && !term.fmt_preferred.empty?
480
+ fp = term.fmt_preferred.first
481
+ if fp.p && !fp.p.empty?
482
+ return extract_plain_text(fp.p.first)
483
+ end
484
+ end
485
+ if term.preferred && !term.preferred.empty?
486
+ return extract_designation_name(term.preferred.first).to_s
487
+ end
488
+ safe_attr(term, :id).to_s.sub(/\Aterm-/, "")
489
+ end
490
+
491
+ def extract_term_definition(term)
492
+ if term.fmt_definition
493
+ rendered = capture_output { render_ordered_content(term.fmt_definition) }
494
+ return strip_html(rendered).gsub(/\s+/, " ").strip
495
+ end
496
+ if term.p && !term.p.empty?
497
+ rendered = capture_output { term.p.each { |para| render_paragraph(para) } }
498
+ return strip_html(rendered).gsub(/\s+/, " ").strip
499
+ end
500
+ nil
501
+ end
502
+
503
+ def strip_html(html)
504
+ html.gsub(/<[^>]+>/, "").gsub("&lt;", "<").gsub("&gt;", ">")
505
+ .gsub("&amp;", "&").gsub("&nbsp;", " ")
506
+ end
507
+
508
+ def render_term_designation(designation, type)
509
+ css_class = type == "deprecated" ? "DeprecatedTerms" : "Terms"
510
+ @output << "<p class=\"#{css_class}\" style=\"text-align:left;\">"
511
+ @output << "<del>" if type == "deprecated"
512
+ @output << "<b><dfn>"
513
+
514
+ name = extract_designation_name(designation)
515
+ if name
516
+ @output << escape_html(name)
517
+ else
518
+ # Fallback: render mixed content (e.g. <strong> element)
519
+ render_mixed_inline(designation)
520
+ end
521
+
522
+ @output << "</dfn></b>"
523
+ @output << "</del>" if type == "deprecated"
524
+ @output << "</p>"
525
+ end
526
+
527
+ def extract_designation_name(designation)
528
+ # Try expression.name first (TermNameElement objects with text)
529
+ expr = designation.expression
530
+ if expr.is_a?(Metanorma::IsoDocument::Terms::TermExpression) && expr.name
531
+ names = Array(expr.name)
532
+ text = names.map { |n| extract_name_text(n) }.join
533
+ return text unless text.strip.empty?
534
+ end
535
+
536
+ # Try text attribute from mixed content
537
+ texts = safe_attr(designation, :text)
538
+ if texts
539
+ joined = texts.is_a?(Array) ? texts.join : texts.to_s
540
+ return joined unless joined.strip.empty?
541
+ end
542
+
543
+ nil
544
+ end
545
+
546
+ def extract_name_text(name_el)
547
+ return name_el.to_s unless name_el.is_a?(Lutaml::Model::Serializable)
548
+
549
+ texts = safe_attr(name_el, :text)
550
+ if texts
551
+ joined = texts.is_a?(Array) ? texts.join : texts.to_s
552
+ return joined unless joined.strip.empty?
553
+ end
554
+
555
+ ""
556
+ end
557
+
558
+ def render_term_definition(definition)
559
+ return unless definition
560
+
561
+ rendered = false
562
+
563
+ # Try verbal_definition first (ISO semantic format)
564
+ vd = definition.verbal_definition
565
+ if vd
566
+ vd.p&.each { |para| render_paragraph(para) }
567
+ vd.ul&.each { |ul| render_unordered_list(ul) }
568
+ vd.ol&.each { |ol| render_ordered_list(ol) }
569
+ rendered = true
570
+ end
571
+
572
+ # Try direct p (presentation XML format where <p> is inside <definition>)
573
+ p_children = safe_attr(definition, :p)
574
+ if !rendered && p_children && !p_children.empty?
575
+ p_children.each { |para| render_paragraph(para) }
576
+ rendered = true
577
+ end
578
+
579
+ # Fallback: render via element_order
580
+ unless rendered
581
+ render_ordered_content(definition)
582
+ end
583
+ end
584
+
585
+ def render_term_note(note)
586
+ attrs = element_attrs(id: safe_attr(note, :id), class: "Note")
587
+ tag("div", attrs) do
588
+ label = extract_termnote_label(note)
589
+ @output << "<p><span class=\"termnote_label\">#{escape_html(label)}: </span>"
590
+ note.p&.each { |para| render_mixed_inline(para) }
591
+ @output << "</p>"
592
+ note.ul&.each { |ul| render_unordered_list(ul) }
593
+ note.ol&.each { |ol| render_ordered_list(ol) }
594
+ note.dl&.then { |dl| render_definition_list(dl) }
595
+ end
596
+ end
597
+
598
+ def render_term_example(example)
599
+ attrs = element_attrs(id: safe_attr(example, :id), class: "example")
600
+ tag("div", attrs) do
601
+ label = extract_block_label(example, "EXAMPLE")
602
+ @output << "<p><span class=\"example_label\">#{escape_html(label)}</span>&nbsp;"
603
+ example.p&.each { |para| render_mixed_inline(para) }
604
+ @output << "</p>"
605
+ example.ul&.each { |ul| render_unordered_list(ul) }
606
+ example.ol&.each { |ol| render_ordered_list(ol) }
607
+ example.dl&.then { |dl| render_definition_list(dl) }
608
+ end
609
+ end
610
+
611
+ # --- Boilerplate rendering ---
612
+
613
+ def render_boilerplate(boilerplate, **_opts)
614
+ return unless boilerplate
615
+
616
+ content = boilerplate.content
617
+ return unless content
618
+
619
+ @output << "<div class=\"boilerplate-copyright\">"
620
+
621
+ raw = content.to_s
622
+ clean = convert_boilerplate_links(raw)
623
+ .gsub(/<fmt-title[^>]*>.*?<\/fmt-title>/m, "")
624
+ .gsub(/<semx[^>]*>.*?<\/semx>/m, "")
625
+ .gsub(/<title[^>]*>.*?<\/title>/m, "")
626
+ .gsub(/<fmt-xref-label[^>]*>.*?<\/fmt-xref-label>/m, "")
627
+ .gsub(/<variant-title[^>]*>.*?<\/variant-title>/m, "")
628
+ .gsub(/<\/?(?:copyright-statement|clause)[^>]*>/, "")
629
+
630
+ @output << clean.strip
631
+
632
+ @output << "</div>"
633
+ end
634
+
635
+ def convert_boilerplate_links(raw)
636
+ doc = Nokogiri::XML.fragment(raw)
637
+ doc.css("link").each do |link|
638
+ target = link["target"] || link["href"]
639
+ next_sib = link.next_sibling
640
+ while next_sib.is_a?(Nokogiri::XML::Text) && next_sib.text.strip.empty?
641
+ next_sib = next_sib.next_sibling
642
+ end
643
+
644
+ display_text = if next_sib && next_sib.element? && next_sib.name == "semx"
645
+ fmt_link = next_sib.at_css("fmt-link")
646
+ if fmt_link
647
+ fmt_target = fmt_link["target"] || fmt_link["href"] || target
648
+ display_text = fmt_target.to_s.sub(/\Amailto:/, "")
649
+ next_sib.remove
650
+ display_text
651
+ end
652
+ end
653
+
654
+ display_text ||= target.to_s.sub(/\Amailto:/, "")
655
+ a_tag = Nokogiri::HTML::DocumentFragment.parse(
656
+ "<a href=\"#{CGI.escapeHTML(target.to_s)}\">#{CGI.escapeHTML(display_text)}</a>"
657
+ )
658
+ link.replace(a_tag)
659
+ end
660
+ doc.inner_html
661
+ end
662
+
663
+ # --- Helpers ---
664
+
665
+ def render_title(section, level)
666
+ title_element = safe_attr(section, :fmt_title) || safe_attr(section, :title)
667
+ return unless title_element
668
+
669
+ section_id = safe_attr(section, :id)
670
+ title_text = extract_plain_text(title_element)
671
+ register_toc_entry(id: section_id, level: level, text: title_text)
672
+
673
+ h = "h#{[[level, 6].min, 1].max}"
674
+ @output << "<#{h}>"
675
+ render_mixed_inline(title_element)
676
+ @output << "</#{h}>"
677
+ end
678
+
679
+ # Collect all renderable children from a section, sorted by displayorder.
680
+ # Uses element_order directly because each_mixed_content returns early
681
+ # when the model class doesn't declare mixed_content (mixed? is false).
682
+ def collect_ordered_children(section)
683
+ children = gather_element_order_children(section)
684
+
685
+ # Also gather typed attributes that may not appear in element_order
686
+ %i[terms definitions].each do |attr|
687
+ val = safe_attr(section, attr)
688
+ next if val.nil?
689
+ Array(val).each do |v|
690
+ children << v unless children.include?(v)
691
+ end
692
+ end
693
+
694
+ # Sort by displayorder (non-nil first, then nil at end)
695
+ children.reject!(&:nil?)
696
+ children.sort_by do |node|
697
+ order = node.displayorder rescue nil
698
+ order &&= order.to_i
699
+ order || Float::INFINITY
700
+ end
701
+ end
702
+
703
+ def render_ordered_content(section, level = 1)
704
+ children = collect_ordered_children(section)
705
+ children.each do |node|
706
+ next if node.is_a?(String)
707
+ next if is_title_element?(node, section)
708
+
709
+ render(node, level: level + 1)
710
+ end
711
+ end
712
+
713
+ private
714
+
715
+ # Filter document title paragraphs that are rendered by render_doc_title
716
+ def is_doc_title_paragraph?(node)
717
+ return false unless node.respond_to?(:class_attr)
718
+ ["zzSTDTitle1", "zzSTDTitle2"].include?(node.class_attr)
719
+ end
720
+
721
+ # Collect all document-level children (sections, normative refs, annexes,
722
+ # bibliography) sorted by displayorder for correct document order.
723
+ def collect_document_children(doc)
724
+ items = []
725
+
726
+ # Main sections children (clauses, terms, etc.)
727
+ if doc.sections
728
+ items.concat(gather_element_order_children(doc.sections))
729
+ # Also add typed attributes that may not be in element_order
730
+ %i[terms definitions].each do |attr|
731
+ val = safe_attr(doc.sections, attr)
732
+ next if val.nil?
733
+ Array(val).each { |v| items << v unless items.include?(v) }
734
+ end
735
+ end
736
+
737
+ # Normative references from bibliography (may have displayorder)
738
+ if doc.bibliography && doc.bibliography.references
739
+ doc.bibliography.references.each { |r| items << r }
740
+ end
741
+
742
+ # Annexes
743
+ doc.annex&.each { |a| items << a }
744
+
745
+ # Non-normative bibliography (no displayorder = goes at end)
746
+ if doc.bibliography && doc.bibliography.references
747
+ # Already included above; filter normative vs non-normative below
748
+ end
749
+
750
+ items.compact!
751
+ items.sort_by do |node|
752
+ order = node.displayorder rescue nil
753
+ order &&= order.to_i
754
+ order || Float::INFINITY
755
+ end
756
+ end
757
+
758
+ # Iterate element_order directly, bypassing each_mixed_content which
759
+ # requires mixed?/ordered? to be true (many section models aren't).
760
+ def gather_element_order_children(node)
761
+ children = []
762
+ return children unless node.is_a?(Lutaml::Model::Serializable)
763
+ return children unless node.element_order && !node.element_order.empty?
764
+
765
+ xml_mapping = node.class.mappings_for(:xml, node.lutaml_register)
766
+ return children unless xml_mapping
767
+
768
+ element_to_attr = {}
769
+ xml_mapping.mapping_elements_hash.each_value do |rule_or_array|
770
+ Array(rule_or_array).each do |rule|
771
+ element_to_attr[rule.name] = rule.to
772
+ element_to_attr[rule.name.to_s] = rule.to if rule.name.is_a?(Symbol)
773
+ end
774
+ end
775
+
776
+ indices = Hash.new(0)
777
+
778
+ node.element_order.each do |el|
779
+ if el.text?
780
+ children << el.text_content if el.text_content
781
+ elsif el.element?
782
+ attr_name = element_to_attr[el.name]
783
+ next unless attr_name
784
+
785
+ coll = node.send(attr_name)
786
+ obj = if coll.is_a?(Array)
787
+ idx = indices[attr_name]
788
+ indices[attr_name] += 1
789
+ coll[idx]
790
+ else
791
+ coll
792
+ end
793
+ children << obj if obj
794
+ end
795
+ end
796
+
797
+ children
798
+ end
799
+
800
+ def publisher_logos_html(doc)
801
+ publishers = flavor_publishers(extract_primary_doc_id)
802
+ logo_map = publisher_logo_map
803
+ return [] if publishers.empty? && logo_map.empty?
804
+
805
+ display_pubs = publishers.empty? ? logo_map.keys : publishers
806
+ display_pubs.filter_map do |pub|
807
+ filename = logo_map[pub]
808
+ next unless filename
809
+
810
+ svg = load_logo_svg(filename, height: 48)
811
+ next unless svg
812
+
813
+ # White fill for dark cover background
814
+ svg = svg.gsub(/fill:#00b1ff/, "fill:white") if pub == "OGC"
815
+ svg = svg.gsub(/fill:#e3000f/, "fill:white") if pub == "ISO"
816
+ svg
817
+ end
818
+ end
819
+ end
820
+ end
821
+ end