metanorma-document 0.5.0 → 0.5.2.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +81 -0
  3. data/Rakefile +3 -7
  4. data/data/stylesheets/base/_dark.css +3 -3
  5. data/data/stylesheets/base/_print.css +1 -1
  6. data/data/stylesheets/components/term.css +4 -2
  7. data/data/themes/ogc.yaml +5 -0
  8. data/lib/metanorma/basic_document/ancillary_blocks/figure_block.rb +2 -2
  9. data/lib/metanorma/basic_document/multi_paragraph/admonition_block.rb +2 -2
  10. data/lib/metanorma/document/cli.rb +134 -0
  11. data/lib/metanorma/document/components/ancillary_blocks/figure_block.rb +5 -0
  12. data/lib/metanorma/document/components/ancillary_blocks/fmt_figure_element.rb +47 -0
  13. data/lib/metanorma/document/components/ancillary_blocks/formula_block.rb +2 -0
  14. data/lib/metanorma/document/components/ancillary_blocks/imagemap_element.rb +73 -0
  15. data/lib/metanorma/document/components/ancillary_blocks/literal_block.rb +2 -0
  16. data/lib/metanorma/document/components/ancillary_blocks/sourcecode_block.rb +2 -0
  17. data/lib/metanorma/document/components/ancillary_blocks/svg_target_element.rb +27 -0
  18. data/lib/metanorma/document/components/ancillary_blocks/svgmap_element.rb +28 -0
  19. data/lib/metanorma/document/components/ancillary_blocks.rb +4 -0
  20. data/lib/metanorma/document/components/bib_data/bibliographic_item.rb +4 -0
  21. data/lib/metanorma/document/components/blocks/fmt_provision.rb +25 -0
  22. data/lib/metanorma/document/components/blocks/note_block.rb +8 -0
  23. data/lib/metanorma/document/components/blocks/permission_model.rb +9 -0
  24. data/lib/metanorma/document/components/blocks/recommendation_model.rb +9 -0
  25. data/lib/metanorma/document/components/blocks/requirement_base.rb +12 -0
  26. data/lib/metanorma/document/components/blocks/requirement_import.rb +23 -0
  27. data/lib/metanorma/document/components/blocks/requirement_measurement_target.rb +23 -0
  28. data/lib/metanorma/document/components/blocks/requirement_model.rb +9 -0
  29. data/lib/metanorma/document/components/blocks/requirement_specification.rb +23 -0
  30. data/lib/metanorma/document/components/blocks/requirement_verification.rb +23 -0
  31. data/lib/metanorma/document/components/blocks.rb +8 -0
  32. data/lib/metanorma/document/components/data_types/formatted_string.rb +9 -0
  33. data/lib/metanorma/document/components/id_elements/image.rb +4 -0
  34. data/lib/metanorma/document/components/inline/columnbreak_element.rb +17 -0
  35. data/lib/metanorma/document/components/inline/concept_element.rb +18 -0
  36. data/lib/metanorma/document/components/inline/date_element.rb +29 -0
  37. data/lib/metanorma/document/components/inline/display_text_element.rb +2 -0
  38. data/lib/metanorma/document/components/inline/em_raw_element.rb +6 -7
  39. data/lib/metanorma/document/components/inline/eref_element.rb +48 -22
  40. data/lib/metanorma/document/components/inline/eref_stack.rb +23 -0
  41. data/lib/metanorma/document/components/inline/error_message.rb +28 -0
  42. data/lib/metanorma/document/components/inline/fmt_date_element.rb +28 -0
  43. data/lib/metanorma/document/components/inline/fmt_date_inline_element.rb +26 -0
  44. data/lib/metanorma/document/components/inline/fmt_eref_element.rb +25 -0
  45. data/lib/metanorma/document/components/inline/fmt_origin_element.rb +24 -0
  46. data/lib/metanorma/document/components/inline/fmt_preferred_element.rb +3 -0
  47. data/lib/metanorma/document/components/inline/fmt_source_element.rb +31 -0
  48. data/lib/metanorma/document/components/inline/fn_element.rb +11 -0
  49. data/lib/metanorma/document/components/inline/link_element.rb +8 -0
  50. data/lib/metanorma/document/components/inline/name_with_id_element.rb +2 -0
  51. data/lib/metanorma/document/components/inline/refterm_element.rb +21 -0
  52. data/lib/metanorma/document/components/inline/semx_element.rb +22 -0
  53. data/lib/metanorma/document/components/inline/sourcelocality_stack_element.rb +27 -0
  54. data/lib/metanorma/document/components/inline/span_element.rb +2 -0
  55. data/lib/metanorma/document/components/inline/stem_inline_element.rb +2 -0
  56. data/lib/metanorma/document/components/inline/strong_raw_element.rb +6 -9
  57. data/lib/metanorma/document/components/inline/sub_element.rb +2 -0
  58. data/lib/metanorma/document/components/inline/termref_element.rb +24 -0
  59. data/lib/metanorma/document/components/inline/title_with_annotation_element.rb +10 -31
  60. data/lib/metanorma/document/components/inline/variant_title_element.rb +2 -0
  61. data/lib/metanorma/document/components/inline/vocabulary.rb +36 -0
  62. data/lib/metanorma/document/components/inline.rb +23 -0
  63. data/lib/metanorma/document/components/lists/dd_element.rb +6 -1
  64. data/lib/metanorma/document/components/lists/definition.rb +2 -0
  65. data/lib/metanorma/document/components/lists/definition_list.rb +3 -0
  66. data/lib/metanorma/document/components/lists/dt_element.rb +3 -0
  67. data/lib/metanorma/document/components/lists/fmt_list_element.rb +73 -0
  68. data/lib/metanorma/document/components/lists/list_item.rb +3 -0
  69. data/lib/metanorma/document/components/lists/ordered_list.rb +4 -2
  70. data/lib/metanorma/document/components/lists/unordered_list.rb +2 -0
  71. data/lib/metanorma/document/components/lists.rb +2 -0
  72. data/lib/metanorma/document/components/multi_paragraph/quote_block.rb +16 -0
  73. data/lib/metanorma/document/components/multi_paragraph/review_block.rb +2 -2
  74. data/lib/metanorma/document/components/paragraphs/paragraph_block.rb +15 -0
  75. data/lib/metanorma/document/components/reference_elements/citation.rb +7 -0
  76. data/lib/metanorma/document/components/reference_elements/source_element.rb +4 -0
  77. data/lib/metanorma/document/components/semantic/node.rb +46 -0
  78. data/lib/metanorma/document/components/semantic.rb +11 -0
  79. data/lib/metanorma/document/components/tables/header_table_cell.rb +1 -0
  80. data/lib/metanorma/document/components/tables/table_cell.rb +70 -44
  81. data/lib/metanorma/document/components/tables/text_table_cell.rb +1 -0
  82. data/lib/metanorma/document/components/tables/text_table_row.rb +2 -0
  83. data/lib/metanorma/document/components/text_elements/ruby_annotation_element.rb +26 -0
  84. data/lib/metanorma/document/components/text_elements/ruby_element.rb +41 -6
  85. data/lib/metanorma/document/components/text_elements/ruby_pronunciation_element.rb +25 -0
  86. data/lib/metanorma/document/components/text_elements/strike_element.rb +3 -0
  87. data/lib/metanorma/document/components/text_elements/underline_element.rb +3 -0
  88. data/lib/metanorma/document/components/text_elements.rb +2 -0
  89. data/lib/metanorma/document/components.rb +1 -0
  90. data/lib/metanorma/document/grammar_vocabulary.rb +109 -0
  91. data/lib/metanorma/document/mirror_seed.rb +253 -0
  92. data/lib/metanorma/document/mko/collection.rb +168 -0
  93. data/lib/metanorma/document/mko/exporter.rb +17 -0
  94. data/lib/metanorma/document/mko/project.rb +1110 -0
  95. data/lib/metanorma/document/mko.rb +122 -0
  96. data/lib/metanorma/document/model_access.rb +44 -0
  97. data/lib/metanorma/document/native_models.rb +319 -0
  98. data/lib/metanorma/document/plain_text.rb +39 -0
  99. data/lib/metanorma/document/relaton/version_info.rb +4 -0
  100. data/lib/metanorma/document/version.rb +1 -1
  101. data/lib/metanorma/document.rb +19 -26
  102. data/lib/metanorma/{collection → document_collection}/directive.rb +1 -1
  103. data/lib/metanorma/{collection → document_collection}/doc_container.rb +6 -2
  104. data/lib/metanorma/{collection → document_collection}/entry.rb +2 -2
  105. data/lib/metanorma/{collection → document_collection}/root.rb +2 -2
  106. data/lib/metanorma/document_collection.rb +10 -0
  107. data/lib/metanorma/html/base_renderer.rb +105 -28
  108. data/lib/metanorma/html/component/footnote_collector.rb +21 -20
  109. data/lib/metanorma/html/concerns/metadata_extraction.rb +8 -3
  110. data/lib/metanorma/html/concerns/presentation_validation.rb +1 -2
  111. data/lib/metanorma/html/concerns/text_extraction.rb +154 -35
  112. data/lib/metanorma/html/concerns.rb +19 -0
  113. data/lib/metanorma/html/drops/admonition_drop.rb +1 -1
  114. data/lib/metanorma/html/drops/example_drop.rb +8 -1
  115. data/lib/metanorma/html/drops/footnote_drop.rb +1 -1
  116. data/lib/metanorma/html/drops/note_drop.rb +31 -4
  117. data/lib/metanorma/html/drops/sourcecode_drop.rb +22 -4
  118. data/lib/metanorma/html/generator.rb +11 -187
  119. data/lib/metanorma/html/renderer_delegation.rb +2 -2
  120. data/lib/metanorma/html/renderers/block_renderer.rb +246 -51
  121. data/lib/metanorma/html/renderers/inline_renderer.rb +144 -17
  122. data/lib/metanorma/html/renderers/section_renderer.rb +12 -2
  123. data/lib/metanorma/html/renderers/semantic_renderer.rb +487 -0
  124. data/lib/metanorma/html/renderers.rb +2 -0
  125. data/lib/metanorma/html/standard_renderer.rb +743 -81
  126. data/lib/metanorma/html/templates/_agency_cover.html.liquid +30 -0
  127. data/lib/metanorma/html/templates/_columnbreak.html.liquid +1 -0
  128. data/lib/metanorma/html/templates/_cover.html.liquid +3 -0
  129. data/lib/metanorma/html/templates/_example.html.liquid +1 -1
  130. data/lib/metanorma/html/templates/_main_content.html.liquid +1 -1
  131. data/lib/metanorma/html/templates/_note.html.liquid +1 -1
  132. data/lib/metanorma/html/templates/_paragraph.html.liquid +1 -1
  133. data/lib/metanorma/html/templates/_ruby.html.liquid +1 -0
  134. data/lib/metanorma/html/templates/_sourcecode.html.liquid +4 -3
  135. data/lib/metanorma/html/templates/_standard_cover.html.liquid +54 -3
  136. data/lib/metanorma/html/templates/_term_number.html.liquid +1 -1
  137. data/lib/metanorma/html.rb +30 -15
  138. data/tasks/flavors.rake +116 -0
  139. data/tasks/grammar.rake +28 -0
  140. data/tasks/roundtrip_samples.rake +48 -34
  141. metadata +121 -416
  142. data/frontend/dist/app.css +0 -1
  143. data/frontend/dist/app.iife.js +0 -24
  144. data/lib/metanorma/bipm_document/metadata/bipm_bib_data_extension_type.rb +0 -20
  145. data/lib/metanorma/bipm_document/metadata/bipm_bibliographic_item.rb +0 -17
  146. data/lib/metanorma/bipm_document/metadata/bipm_structured_identifier.rb +0 -21
  147. data/lib/metanorma/bipm_document/metadata/depiction_element.rb +0 -18
  148. data/lib/metanorma/bipm_document/metadata.rb +0 -15
  149. data/lib/metanorma/bipm_document/root.rb +0 -25
  150. data/lib/metanorma/bipm_document.rb +0 -8
  151. data/lib/metanorma/bsi_document/metadata/bsi_bib_data_extension_type.rb +0 -10
  152. data/lib/metanorma/bsi_document/metadata/bsi_bibliographic_item.rb +0 -15
  153. data/lib/metanorma/bsi_document/metadata.rb +0 -12
  154. data/lib/metanorma/bsi_document/root.rb +0 -29
  155. data/lib/metanorma/bsi_document/sections/bsi_annex_section.rb +0 -25
  156. data/lib/metanorma/bsi_document/sections/bsi_clause_section.rb +0 -25
  157. data/lib/metanorma/bsi_document/sections/bsi_sections.rb +0 -27
  158. data/lib/metanorma/bsi_document/sections.rb +0 -11
  159. data/lib/metanorma/bsi_document.rb +0 -11
  160. data/lib/metanorma/cc_document/metadata/cc_bib_data_extension_type.rb +0 -12
  161. data/lib/metanorma/cc_document/metadata/cc_bibliographic_item.rb +0 -17
  162. data/lib/metanorma/cc_document/metadata.rb +0 -11
  163. data/lib/metanorma/cc_document/root.rb +0 -25
  164. data/lib/metanorma/cc_document.rb +0 -8
  165. data/lib/metanorma/collection.rb +0 -10
  166. data/lib/metanorma/csa_document/root.rb +0 -27
  167. data/lib/metanorma/csa_document.rb +0 -9
  168. data/lib/metanorma/gb_document/metadata/gb_bib_data_extension_type.rb +0 -10
  169. data/lib/metanorma/gb_document/metadata/gb_bibliographic_item.rb +0 -15
  170. data/lib/metanorma/gb_document/metadata.rb +0 -12
  171. data/lib/metanorma/gb_document/root.rb +0 -29
  172. data/lib/metanorma/gb_document.rb +0 -10
  173. data/lib/metanorma/generic_document/root.rb +0 -31
  174. data/lib/metanorma/generic_document.rb +0 -7
  175. data/lib/metanorma/html/bipm_renderer.rb +0 -23
  176. data/lib/metanorma/html/cc_renderer.rb +0 -9
  177. data/lib/metanorma/html/csa_renderer.rb +0 -9
  178. data/lib/metanorma/html/flavor.rb +0 -50
  179. data/lib/metanorma/html/flavor_registry.rb +0 -49
  180. data/lib/metanorma/html/icc_renderer.rb +0 -10
  181. data/lib/metanorma/html/iec_renderer.rb +0 -9
  182. data/lib/metanorma/html/ieee_renderer.rb +0 -9
  183. data/lib/metanorma/html/ietf_renderer.rb +0 -9
  184. data/lib/metanorma/html/iho_renderer.rb +0 -9
  185. data/lib/metanorma/html/iso_renderer.rb +0 -535
  186. data/lib/metanorma/html/itu_renderer.rb +0 -9
  187. data/lib/metanorma/html/ogc_renderer.rb +0 -23
  188. data/lib/metanorma/html/pdfa_renderer.rb +0 -10
  189. data/lib/metanorma/html/ribose_renderer.rb +0 -9
  190. data/lib/metanorma/html/templates/_bipm_cover.html.liquid +0 -27
  191. data/lib/metanorma/html/templates/_iso_cover.html.liquid +0 -31
  192. data/lib/metanorma/html/templates/_iso_doc_title.html.liquid +0 -3
  193. data/lib/metanorma/iec_document/root.rb +0 -27
  194. data/lib/metanorma/iec_document.rb +0 -9
  195. data/lib/metanorma/ieee_document/metadata/ieee_bib_data_extension_type.rb +0 -18
  196. data/lib/metanorma/ieee_document/metadata/ieee_bibliographic_item.rb +0 -20
  197. data/lib/metanorma/ieee_document/metadata/ieee_structured_identifier.rb +0 -25
  198. data/lib/metanorma/ieee_document/metadata.rb +0 -14
  199. data/lib/metanorma/ieee_document/root.rb +0 -29
  200. data/lib/metanorma/ieee_document/sections/ieee_sections.rb +0 -31
  201. data/lib/metanorma/ieee_document/sections.rb +0 -9
  202. data/lib/metanorma/ieee_document.rb +0 -11
  203. data/lib/metanorma/ietf_document/metadata/ietf_bib_data_extension_type.rb +0 -31
  204. data/lib/metanorma/ietf_document/metadata/ietf_bibliographic_item.rb +0 -51
  205. data/lib/metanorma/ietf_document/metadata/ietf_editorial_group.rb +0 -17
  206. data/lib/metanorma/ietf_document/metadata/pi_settings.rb +0 -32
  207. data/lib/metanorma/ietf_document/metadata.rb +0 -16
  208. data/lib/metanorma/ietf_document/root.rb +0 -30
  209. data/lib/metanorma/ietf_document/sections/ietf_annex_section.rb +0 -26
  210. data/lib/metanorma/ietf_document/sections/ietf_clause_section.rb +0 -26
  211. data/lib/metanorma/ietf_document/sections/ietf_content_section.rb +0 -25
  212. data/lib/metanorma/ietf_document/sections/ietf_sections.rb +0 -35
  213. data/lib/metanorma/ietf_document/sections.rb +0 -12
  214. data/lib/metanorma/ietf_document.rb +0 -11
  215. data/lib/metanorma/iho_document/metadata/iho_bib_data_extension_type.rb +0 -23
  216. data/lib/metanorma/iho_document/metadata/iho_bibliographic_item.rb +0 -20
  217. data/lib/metanorma/iho_document/metadata/iho_editorial_group.rb +0 -19
  218. data/lib/metanorma/iho_document/metadata/iho_series.rb +0 -22
  219. data/lib/metanorma/iho_document/metadata/iho_sub_group.rb +0 -18
  220. data/lib/metanorma/iho_document/metadata.rb +0 -15
  221. data/lib/metanorma/iho_document/root.rb +0 -25
  222. data/lib/metanorma/iho_document.rb +0 -8
  223. data/lib/metanorma/iso_document/annotation_container.rb +0 -7
  224. data/lib/metanorma/iso_document/blocks/iso_admonition_block.rb +0 -27
  225. data/lib/metanorma/iso_document/blocks/iso_admonition_type.rb +0 -25
  226. data/lib/metanorma/iso_document/blocks.rb +0 -12
  227. data/lib/metanorma/iso_document/boilerplate.rb +0 -7
  228. data/lib/metanorma/iso_document/metadata/abstract_title.rb +0 -36
  229. data/lib/metanorma/iso_document/metadata/doc_identifier.rb +0 -26
  230. data/lib/metanorma/iso_document/metadata/doctype_element.rb +0 -20
  231. data/lib/metanorma/iso_document/metadata/ics.rb +0 -19
  232. data/lib/metanorma/iso_document/metadata/iec_document_category.rb +0 -23
  233. data/lib/metanorma/iso_document/metadata/iso_bib_data_extension_type.rb +0 -38
  234. data/lib/metanorma/iso_document/metadata/iso_bibliographic_item.rb +0 -103
  235. data/lib/metanorma/iso_document/metadata/iso_document_id.rb +0 -46
  236. data/lib/metanorma/iso_document/metadata/iso_document_stage_codes.rb +0 -26
  237. data/lib/metanorma/iso_document/metadata/iso_document_status.rb +0 -26
  238. data/lib/metanorma/iso_document/metadata/iso_document_substage_codes.rb +0 -26
  239. data/lib/metanorma/iso_document/metadata/iso_document_type.rb +0 -25
  240. data/lib/metanorma/iso_document/metadata/iso_localized_title.rb +0 -61
  241. data/lib/metanorma/iso_document/metadata/iso_project_group.rb +0 -32
  242. data/lib/metanorma/iso_document/metadata/iso_sub_group.rb +0 -38
  243. data/lib/metanorma/iso_document/metadata/language_element.rb +0 -18
  244. data/lib/metanorma/iso_document/metadata/metanorma_extension.rb +0 -9
  245. data/lib/metanorma/iso_document/metadata/project_number.rb +0 -22
  246. data/lib/metanorma/iso_document/metadata/script_element.rb +0 -18
  247. data/lib/metanorma/iso_document/metadata/stage_element.rb +0 -26
  248. data/lib/metanorma/iso_document/metadata/stagename_element.rb +0 -18
  249. data/lib/metanorma/iso_document/metadata/structured_identifier.rb +0 -16
  250. data/lib/metanorma/iso_document/metadata/title_amd.rb +0 -12
  251. data/lib/metanorma/iso_document/metadata/title_amendment_prefix.rb +0 -12
  252. data/lib/metanorma/iso_document/metadata/title_collection.rb +0 -47
  253. data/lib/metanorma/iso_document/metadata/title_full.rb +0 -12
  254. data/lib/metanorma/iso_document/metadata/title_intro.rb +0 -12
  255. data/lib/metanorma/iso_document/metadata/title_main.rb +0 -12
  256. data/lib/metanorma/iso_document/metadata/title_part.rb +0 -12
  257. data/lib/metanorma/iso_document/metadata/title_part_prefix.rb +0 -12
  258. data/lib/metanorma/iso_document/metadata.rb +0 -44
  259. data/lib/metanorma/iso_document/root.rb +0 -26
  260. data/lib/metanorma/iso_document/sections/colophon.rb +0 -3
  261. data/lib/metanorma/iso_document/sections/iso_abstract_section.rb +0 -15
  262. data/lib/metanorma/iso_document/sections/iso_amendment_clause.rb +0 -24
  263. data/lib/metanorma/iso_document/sections/iso_annex_section.rb +0 -50
  264. data/lib/metanorma/iso_document/sections/iso_clause_section.rb +0 -49
  265. data/lib/metanorma/iso_document/sections/iso_foreword_section.rb +0 -33
  266. data/lib/metanorma/iso_document/sections/iso_preface.rb +0 -51
  267. data/lib/metanorma/iso_document/sections/iso_sections.rb +0 -51
  268. data/lib/metanorma/iso_document/sections/iso_terms_section.rb +0 -76
  269. data/lib/metanorma/iso_document/sections.rb +0 -17
  270. data/lib/metanorma/iso_document/terms/iso_term.rb +0 -71
  271. data/lib/metanorma/iso_document/terms/iso_term_collection.rb +0 -20
  272. data/lib/metanorma/iso_document/terms/term_definition.rb +0 -30
  273. data/lib/metanorma/iso_document/terms/term_designation.rb +0 -44
  274. data/lib/metanorma/iso_document/terms/term_domain_element.rb +0 -18
  275. data/lib/metanorma/iso_document/terms/term_example.rb +0 -40
  276. data/lib/metanorma/iso_document/terms/term_expression.rb +0 -10
  277. data/lib/metanorma/iso_document/terms/term_note.rb +0 -42
  278. data/lib/metanorma/iso_document/terms/term_origin.rb +0 -4
  279. data/lib/metanorma/iso_document/terms/term_source.rb +0 -21
  280. data/lib/metanorma/iso_document/terms/verbal_definition.rb +0 -42
  281. data/lib/metanorma/iso_document/terms.rb +0 -21
  282. data/lib/metanorma/iso_document.rb +0 -15
  283. data/lib/metanorma/itu_document/metadata/itu_bib_data_extension_type.rb +0 -26
  284. data/lib/metanorma/itu_document/metadata/itu_bibliographic_item.rb +0 -21
  285. data/lib/metanorma/itu_document/metadata/itu_series.rb +0 -22
  286. data/lib/metanorma/itu_document/metadata/itu_structured_identifier.rb +0 -23
  287. data/lib/metanorma/itu_document/metadata/meeting_date.rb +0 -18
  288. data/lib/metanorma/itu_document/metadata/meeting_element.rb +0 -18
  289. data/lib/metanorma/itu_document/metadata/study_period.rb +0 -18
  290. data/lib/metanorma/itu_document/metadata.rb +0 -18
  291. data/lib/metanorma/itu_document/root.rb +0 -25
  292. data/lib/metanorma/itu_document.rb +0 -8
  293. data/lib/metanorma/jis_document/metadata/jis_bib_data_extension_type.rb +0 -10
  294. data/lib/metanorma/jis_document/metadata/jis_bibliographic_item.rb +0 -15
  295. data/lib/metanorma/jis_document/metadata.rb +0 -12
  296. data/lib/metanorma/jis_document/root.rb +0 -29
  297. data/lib/metanorma/jis_document/sections/jis_annex_section.rb +0 -20
  298. data/lib/metanorma/jis_document/sections.rb +0 -9
  299. data/lib/metanorma/jis_document.rb +0 -11
  300. data/lib/metanorma/m3d_document/metadata/m3d_bib_data_extension_type.rb +0 -10
  301. data/lib/metanorma/m3d_document/metadata/m3d_bibliographic_item.rb +0 -15
  302. data/lib/metanorma/m3d_document/metadata.rb +0 -12
  303. data/lib/metanorma/m3d_document/root.rb +0 -29
  304. data/lib/metanorma/m3d_document.rb +0 -10
  305. data/lib/metanorma/mirror/default_registry.rb +0 -191
  306. data/lib/metanorma/mirror/handler_registry.rb +0 -60
  307. data/lib/metanorma/mirror/handler_result.rb +0 -37
  308. data/lib/metanorma/mirror/handlers/admonition.rb +0 -18
  309. data/lib/metanorma/mirror/handlers/example.rb +0 -21
  310. data/lib/metanorma/mirror/handlers/figure.rb +0 -53
  311. data/lib/metanorma/mirror/handlers/formula.rb +0 -35
  312. data/lib/metanorma/mirror/handlers/inline/catalog.rb +0 -52
  313. data/lib/metanorma/mirror/handlers/inline/rich_html_renderer.rb +0 -158
  314. data/lib/metanorma/mirror/handlers/inline/text_extractor.rb +0 -116
  315. data/lib/metanorma/mirror/handlers/inline.rb +0 -226
  316. data/lib/metanorma/mirror/handlers/list.rb +0 -110
  317. data/lib/metanorma/mirror/handlers/note.rb +0 -26
  318. data/lib/metanorma/mirror/handlers/paragraph.rb +0 -19
  319. data/lib/metanorma/mirror/handlers/quote.rb +0 -16
  320. data/lib/metanorma/mirror/handlers/review.rb +0 -19
  321. data/lib/metanorma/mirror/handlers/section.rb +0 -149
  322. data/lib/metanorma/mirror/handlers/sourcecode.rb +0 -27
  323. data/lib/metanorma/mirror/handlers/structural.rb +0 -68
  324. data/lib/metanorma/mirror/handlers/table.rb +0 -81
  325. data/lib/metanorma/mirror/handlers/term.rb +0 -100
  326. data/lib/metanorma/mirror/handlers.rb +0 -60
  327. data/lib/metanorma/mirror/id_strategy/positional.rb +0 -166
  328. data/lib/metanorma/mirror/id_strategy/preserve.rb +0 -12
  329. data/lib/metanorma/mirror/id_strategy.rb +0 -34
  330. data/lib/metanorma/mirror/math_util.rb +0 -53
  331. data/lib/metanorma/mirror/metadata.rb +0 -37
  332. data/lib/metanorma/mirror/model/container.rb +0 -47
  333. data/lib/metanorma/mirror/model/factory.rb +0 -52
  334. data/lib/metanorma/mirror/model/guide.rb +0 -26
  335. data/lib/metanorma/mirror/model/leaf.rb +0 -17
  336. data/lib/metanorma/mirror/model/mark.rb +0 -53
  337. data/lib/metanorma/mirror/model/node.rb +0 -47
  338. data/lib/metanorma/mirror/model/soft_break.rb +0 -33
  339. data/lib/metanorma/mirror/model/text.rb +0 -34
  340. data/lib/metanorma/mirror/model.rb +0 -16
  341. data/lib/metanorma/mirror/output/builder.rb +0 -39
  342. data/lib/metanorma/mirror/output/formats/base_format.rb +0 -90
  343. data/lib/metanorma/mirror/output/formats/inline_format.rb +0 -142
  344. data/lib/metanorma/mirror/output/formats.rb +0 -53
  345. data/lib/metanorma/mirror/output/pipeline.rb +0 -93
  346. data/lib/metanorma/mirror/output/pipeline_context.rb +0 -22
  347. data/lib/metanorma/mirror/output.rb +0 -12
  348. data/lib/metanorma/mirror/rewriter.rb +0 -123
  349. data/lib/metanorma/mirror/safe_attr.rb +0 -16
  350. data/lib/metanorma/mirror/serialization/json_serializer.rb +0 -25
  351. data/lib/metanorma/mirror/serialization/yaml_serializer.rb +0 -20
  352. data/lib/metanorma/mirror/serialization.rb +0 -10
  353. data/lib/metanorma/mirror/transformer.rb +0 -110
  354. data/lib/metanorma/mirror.rb +0 -31
  355. data/lib/metanorma/nist_document/metadata/nist_bib_data_extension_type.rb +0 -10
  356. data/lib/metanorma/nist_document/metadata/nist_bibliographic_item.rb +0 -15
  357. data/lib/metanorma/nist_document/metadata.rb +0 -12
  358. data/lib/metanorma/nist_document/root.rb +0 -29
  359. data/lib/metanorma/nist_document/sections/errata.rb +0 -16
  360. data/lib/metanorma/nist_document/sections/errata_clause.rb +0 -20
  361. data/lib/metanorma/nist_document/sections/errata_row.rb +0 -22
  362. data/lib/metanorma/nist_document/sections/nist_preface.rb +0 -30
  363. data/lib/metanorma/nist_document/sections.rb +0 -12
  364. data/lib/metanorma/nist_document.rb +0 -11
  365. data/lib/metanorma/ogc_document/metadata/ogc_bib_data_extension_type.rb +0 -12
  366. data/lib/metanorma/ogc_document/metadata/ogc_bibliographic_item.rb +0 -19
  367. data/lib/metanorma/ogc_document/metadata.rb +0 -12
  368. data/lib/metanorma/ogc_document/root.rb +0 -25
  369. data/lib/metanorma/ogc_document.rb +0 -8
  370. data/lib/metanorma/plateau_document/metadata/plateau_bibliographic_item.rb +0 -13
  371. data/lib/metanorma/plateau_document/metadata.rb +0 -10
  372. data/lib/metanorma/plateau_document/root.rb +0 -29
  373. data/lib/metanorma/plateau_document.rb +0 -10
  374. data/lib/metanorma/registers/setup.rb +0 -166
  375. data/lib/metanorma/registers.rb +0 -7
  376. data/lib/metanorma/ribose_document/metadata/ribose_bib_data_extension_type.rb +0 -20
  377. data/lib/metanorma/ribose_document/metadata/ribose_bibliographic_item.rb +0 -18
  378. data/lib/metanorma/ribose_document/metadata.rb +0 -12
  379. data/lib/metanorma/ribose_document/root.rb +0 -26
  380. data/lib/metanorma/ribose_document.rb +0 -8
  381. data/lib/metanorma/standard_document/annotation_container.rb +0 -39
  382. data/lib/metanorma/standard_document/block_attributes.rb +0 -281
  383. data/lib/metanorma/standard_document/blocks/amend_block.rb +0 -50
  384. data/lib/metanorma/standard_document/blocks/amend_content_block.rb +0 -35
  385. data/lib/metanorma/standard_document/blocks/auto_number.rb +0 -20
  386. data/lib/metanorma/standard_document/blocks/block_source.rb +0 -22
  387. data/lib/metanorma/standard_document/blocks/change_type.rb +0 -21
  388. data/lib/metanorma/standard_document/blocks/element_name.rb +0 -22
  389. data/lib/metanorma/standard_document/blocks/form.rb +0 -38
  390. data/lib/metanorma/standard_document/blocks/image_map_area_type.rb +0 -24
  391. data/lib/metanorma/standard_document/blocks/image_map_area_type_type.rb +0 -21
  392. data/lib/metanorma/standard_document/blocks/image_map_block.rb +0 -32
  393. data/lib/metanorma/standard_document/blocks/image_map_coords.rb +0 -19
  394. data/lib/metanorma/standard_document/blocks/image_map_radius.rb +0 -19
  395. data/lib/metanorma/standard_document/blocks/multilingual_rendering_type.rb +0 -21
  396. data/lib/metanorma/standard_document/blocks/passthrough.rb +0 -3
  397. data/lib/metanorma/standard_document/blocks/requirement_model.rb +0 -20
  398. data/lib/metanorma/standard_document/blocks/source_origin_element.rb +0 -23
  399. data/lib/metanorma/standard_document/blocks/standard_admonition_block.rb +0 -32
  400. data/lib/metanorma/standard_document/blocks/standard_block.rb +0 -28
  401. data/lib/metanorma/standard_document/blocks/standard_block_no_notes.rb +0 -34
  402. data/lib/metanorma/standard_document/blocks/standard_example_block.rb +0 -30
  403. data/lib/metanorma/standard_document/blocks/standard_figure_block.rb +0 -32
  404. data/lib/metanorma/standard_document/blocks/standard_formula_block.rb +0 -30
  405. data/lib/metanorma/standard_document/blocks/standard_note_block.rb +0 -64
  406. data/lib/metanorma/standard_document/blocks/standard_paragraph_block.rb +0 -25
  407. data/lib/metanorma/standard_document/blocks/standard_quote_block.rb +0 -29
  408. data/lib/metanorma/standard_document/blocks/standard_sourcecode_block.rb +0 -32
  409. data/lib/metanorma/standard_document/blocks/standard_table_block.rb +0 -39
  410. data/lib/metanorma/standard_document/blocks/svg_map_block.rb +0 -23
  411. data/lib/metanorma/standard_document/blocks/svg_target_type.rb +0 -20
  412. data/lib/metanorma/standard_document/blocks/table_col.rb +0 -16
  413. data/lib/metanorma/standard_document/blocks/to_c.rb +0 -17
  414. data/lib/metanorma/standard_document/blocks.rb +0 -60
  415. data/lib/metanorma/standard_document/boilerplate.rb +0 -32
  416. data/lib/metanorma/standard_document/elements/add.rb +0 -3
  417. data/lib/metanorma/standard_document/elements/del.rb +0 -3
  418. data/lib/metanorma/standard_document/elements/form_input.rb +0 -27
  419. data/lib/metanorma/standard_document/elements/input.rb +0 -12
  420. data/lib/metanorma/standard_document/elements/input_type.rb +0 -27
  421. data/lib/metanorma/standard_document/elements/label.rb +0 -19
  422. data/lib/metanorma/standard_document/elements/option.rb +0 -27
  423. data/lib/metanorma/standard_document/elements/orientation_type.rb +0 -27
  424. data/lib/metanorma/standard_document/elements/select.rb +0 -32
  425. data/lib/metanorma/standard_document/elements/standard_page_break_element.rb +0 -22
  426. data/lib/metanorma/standard_document/elements/textarea.rb +0 -25
  427. data/lib/metanorma/standard_document/elements.rb +0 -20
  428. data/lib/metanorma/standard_document/lists/standard_definition.rb +0 -24
  429. data/lib/metanorma/standard_document/lists/standard_definition_list.rb +0 -30
  430. data/lib/metanorma/standard_document/lists/standard_definition_term.rb +0 -27
  431. data/lib/metanorma/standard_document/lists/standard_unordered_list.rb +0 -28
  432. data/lib/metanorma/standard_document/lists/unordered_checkable_list_item.rb +0 -26
  433. data/lib/metanorma/standard_document/lists.rb +0 -17
  434. data/lib/metanorma/standard_document/metadata/editorial_group_type.rb +0 -25
  435. data/lib/metanorma/standard_document/metadata/ics_type.rb +0 -26
  436. data/lib/metanorma/standard_document/metadata/metanorma_extension.rb +0 -26
  437. data/lib/metanorma/standard_document/metadata/presentation_metadata.rb +0 -107
  438. data/lib/metanorma/standard_document/metadata/semantic_metadata.rb +0 -18
  439. data/lib/metanorma/standard_document/metadata/standard_bib_data.rb +0 -25
  440. data/lib/metanorma/standard_document/metadata/standard_bib_data_extension_type.rb +0 -37
  441. data/lib/metanorma/standard_document/metadata/structured_identifier_type.rb +0 -48
  442. data/lib/metanorma/standard_document/metadata/technical_committee_type.rb +0 -27
  443. data/lib/metanorma/standard_document/metadata/unitsml/amount_of_substance.rb +0 -19
  444. data/lib/metanorma/standard_document/metadata/unitsml/base_quantity.rb +0 -34
  445. data/lib/metanorma/standard_document/metadata/unitsml/dimension.rb +0 -39
  446. data/lib/metanorma/standard_document/metadata/unitsml/dimension_set.rb +0 -19
  447. data/lib/metanorma/standard_document/metadata/unitsml/electric_current.rb +0 -19
  448. data/lib/metanorma/standard_document/metadata/unitsml/enumerated_root_unit.rb +0 -23
  449. data/lib/metanorma/standard_document/metadata/unitsml/length.rb +0 -19
  450. data/lib/metanorma/standard_document/metadata/unitsml/luminous_intensity.rb +0 -19
  451. data/lib/metanorma/standard_document/metadata/unitsml/mass.rb +0 -19
  452. data/lib/metanorma/standard_document/metadata/unitsml/namespace.rb +0 -17
  453. data/lib/metanorma/standard_document/metadata/unitsml/plane_angle.rb +0 -19
  454. data/lib/metanorma/standard_document/metadata/unitsml/prefix.rb +0 -30
  455. data/lib/metanorma/standard_document/metadata/unitsml/prefix_name.rb +0 -21
  456. data/lib/metanorma/standard_document/metadata/unitsml/prefix_set.rb +0 -19
  457. data/lib/metanorma/standard_document/metadata/unitsml/prefix_symbol.rb +0 -21
  458. data/lib/metanorma/standard_document/metadata/unitsml/quantity.rb +0 -28
  459. data/lib/metanorma/standard_document/metadata/unitsml/quantity_name.rb +0 -21
  460. data/lib/metanorma/standard_document/metadata/unitsml/quantity_set.rb +0 -19
  461. data/lib/metanorma/standard_document/metadata/unitsml/root_units.rb +0 -19
  462. data/lib/metanorma/standard_document/metadata/unitsml/thermodynamic_temperature.rb +0 -19
  463. data/lib/metanorma/standard_document/metadata/unitsml/time.rb +0 -19
  464. data/lib/metanorma/standard_document/metadata/unitsml/unit.rb +0 -32
  465. data/lib/metanorma/standard_document/metadata/unitsml/unit_name.rb +0 -21
  466. data/lib/metanorma/standard_document/metadata/unitsml/unit_set.rb +0 -19
  467. data/lib/metanorma/standard_document/metadata/unitsml/unit_symbol.rb +0 -36
  468. data/lib/metanorma/standard_document/metadata/unitsml/unit_system.rb +0 -23
  469. data/lib/metanorma/standard_document/metadata/unitsml/unitsml_root.rb +0 -28
  470. data/lib/metanorma/standard_document/metadata/unitsml.rb +0 -39
  471. data/lib/metanorma/standard_document/metadata.rb +0 -23
  472. data/lib/metanorma/standard_document/namespace.rb +0 -11
  473. data/lib/metanorma/standard_document/refs/reference_to_term.rb +0 -26
  474. data/lib/metanorma/standard_document/refs/reference_to_termbase.rb +0 -27
  475. data/lib/metanorma/standard_document/refs/standoc_locality_stack.rb +0 -24
  476. data/lib/metanorma/standard_document/refs/standoc_reference_to_citation_element.rb +0 -27
  477. data/lib/metanorma/standard_document/refs/standoc_reference_to_id_element.rb +0 -36
  478. data/lib/metanorma/standard_document/refs/xref_case_type.rb +0 -27
  479. data/lib/metanorma/standard_document/refs/xref_connective_type.rb +0 -27
  480. data/lib/metanorma/standard_document/refs/xref_target_type.rb +0 -25
  481. data/lib/metanorma/standard_document/refs.rb +0 -18
  482. data/lib/metanorma/standard_document/root.rb +0 -10
  483. data/lib/metanorma/standard_document/root_attributes.rb +0 -78
  484. data/lib/metanorma/standard_document/sections/abstract.rb +0 -19
  485. data/lib/metanorma/standard_document/sections/acknowledgements.rb +0 -19
  486. data/lib/metanorma/standard_document/sections/annex_section.rb +0 -69
  487. data/lib/metanorma/standard_document/sections/bibliography_section.rb +0 -20
  488. data/lib/metanorma/standard_document/sections/boilerplate_type.rb +0 -32
  489. data/lib/metanorma/standard_document/sections/clause_hierarchical_section.rb +0 -32
  490. data/lib/metanorma/standard_document/sections/clause_section.rb +0 -91
  491. data/lib/metanorma/standard_document/sections/colophon.rb +0 -16
  492. data/lib/metanorma/standard_document/sections/definition_section.rb +0 -72
  493. data/lib/metanorma/standard_document/sections/floating_section_title.rb +0 -23
  494. data/lib/metanorma/standard_document/sections/floating_title.rb +0 -27
  495. data/lib/metanorma/standard_document/sections/foreword.rb +0 -19
  496. data/lib/metanorma/standard_document/sections/introduction.rb +0 -20
  497. data/lib/metanorma/standard_document/sections/misc_container.rb +0 -31
  498. data/lib/metanorma/standard_document/sections/normative_type.rb +0 -29
  499. data/lib/metanorma/standard_document/sections/preface.rb +0 -36
  500. data/lib/metanorma/standard_document/sections/sections.rb +0 -47
  501. data/lib/metanorma/standard_document/sections/standard_content_section.rb +0 -41
  502. data/lib/metanorma/standard_document/sections/standard_hierarchical_section.rb +0 -30
  503. data/lib/metanorma/standard_document/sections/standard_references_section.rb +0 -74
  504. data/lib/metanorma/standard_document/sections/standard_section.rb +0 -39
  505. data/lib/metanorma/standard_document/sections/terms_section.rb +0 -61
  506. data/lib/metanorma/standard_document/sections.rb +0 -34
  507. data/lib/metanorma/standard_document/standard_document_type.rb +0 -15
  508. data/lib/metanorma/standard_document/terms/abbreviation_type.rb +0 -27
  509. data/lib/metanorma/standard_document/terms/concept.rb +0 -42
  510. data/lib/metanorma/standard_document/terms/definition_collection.rb +0 -24
  511. data/lib/metanorma/standard_document/terms/designation.rb +0 -31
  512. data/lib/metanorma/standard_document/terms/expression_designation.rb +0 -38
  513. data/lib/metanorma/standard_document/terms/expression_type.rb +0 -27
  514. data/lib/metanorma/standard_document/terms/grammar_gender.rb +0 -27
  515. data/lib/metanorma/standard_document/terms/grammar_info.rb +0 -36
  516. data/lib/metanorma/standard_document/terms/graphical_symbol_designation.rb +0 -25
  517. data/lib/metanorma/standard_document/terms/letter_symbol_designation.rb +0 -27
  518. data/lib/metanorma/standard_document/terms/non_verbal_representation.rb +0 -33
  519. data/lib/metanorma/standard_document/terms/related_term.rb +0 -31
  520. data/lib/metanorma/standard_document/terms/related_term_type.rb +0 -28
  521. data/lib/metanorma/standard_document/terms/term.rb +0 -66
  522. data/lib/metanorma/standard_document/terms/term_collection.rb +0 -24
  523. data/lib/metanorma/standard_document/terms/term_definition.rb +0 -29
  524. data/lib/metanorma/standard_document/terms/term_expression.rb +0 -20
  525. data/lib/metanorma/standard_document/terms/term_name_element.rb +0 -29
  526. data/lib/metanorma/standard_document/terms/term_source.rb +0 -29
  527. data/lib/metanorma/standard_document/terms/term_source_status.rb +0 -29
  528. data/lib/metanorma/standard_document/terms/term_source_type.rb +0 -21
  529. data/lib/metanorma/standard_document/terms/verbal_expression.rb +0 -35
  530. data/lib/metanorma/standard_document/terms.rb +0 -33
  531. data/lib/metanorma/standard_document.rb +0 -27
  532. data/lib/metanorma/un_document/blocks/un_admonition_block.rb +0 -86
  533. data/lib/metanorma/un_document/blocks.rb +0 -9
  534. data/lib/metanorma/un_document/metadata/un_bib_data_extension_type.rb +0 -10
  535. data/lib/metanorma/un_document/metadata/un_bibliographic_item.rb +0 -15
  536. data/lib/metanorma/un_document/metadata.rb +0 -12
  537. data/lib/metanorma/un_document/root.rb +0 -37
  538. data/lib/metanorma/un_document/sections/un_abstract_section.rb +0 -48
  539. data/lib/metanorma/un_document/sections/un_preface.rb +0 -40
  540. data/lib/metanorma/un_document/sections/un_sections.rb +0 -24
  541. data/lib/metanorma/un_document/sections.rb +0 -11
  542. data/lib/metanorma/un_document/un_text_element.rb +0 -116
  543. data/lib/metanorma/un_document.rb +0 -13
@@ -3,75 +3,266 @@
3
3
  module Metanorma
4
4
  module Html
5
5
  class StandardRenderer < BaseRenderer
6
- register_render Metanorma::StandardDocument::Root,
6
+ include Renderers::SemanticRenderer
7
+
8
+ register_render "Metanorma::Standoc::Document::Root",
7
9
  :render_standard_document
8
- register_render Metanorma::StandardDocument::Terms::Term, :render_term
9
- register_render Metanorma::StandardDocument::Sections::TermsSection,
10
+ register_render "Metanorma::Standoc::Document::Terms::Term", :render_term
11
+ register_render "Metanorma::Standoc::Document::Terms::TermSource",
12
+ :render_term_source
13
+ register_render "Metanorma::Standoc::Document::Terms::FmtDefinitionSemx",
14
+ :render_fmt_definition_semx
15
+ register_render "Metanorma::Standoc::Document::Sections::TermsSection",
10
16
  :render_terms_section
11
- register_render Metanorma::StandardDocument::Sections::StandardReferencesSection,
17
+ register_render "Metanorma::Document::Components::Blocks::RequirementModel",
18
+ :render_requirement
19
+ register_render "Metanorma::Document::Components::Blocks::RecommendationModel",
20
+ :render_requirement
21
+ register_render "Metanorma::Document::Components::Blocks::PermissionModel",
22
+ :render_requirement
23
+ register_render "Metanorma::Document::Components::Blocks::FmtProvision",
24
+ :render_reqt_component
25
+ register_render "Metanorma::Standoc::Document::Sections::StandardReferencesSection",
12
26
  :render_references_section
13
- register_render Metanorma::StandardDocument::Sections::BibliographySection,
27
+ register_render "Metanorma::Standoc::Document::Sections::BibliographySection",
14
28
  :render_bibliography
15
- register_render Metanorma::StandardDocument::Sections::ClauseSection,
29
+ register_render "Metanorma::Standoc::Document::Sections::ClauseSection",
16
30
  :render_clause_section
17
- register_render Metanorma::StandardDocument::Sections::AnnexSection,
31
+ register_render "Metanorma::Standoc::Document::Sections::AnnexSection",
18
32
  :render_annex_section
19
- register_render Metanorma::StandardDocument::Sections::StandardSection,
33
+ register_render "Metanorma::Standoc::Document::Sections::StandardSection",
20
34
  :render_standard_section
21
- register_render Metanorma::StandardDocument::Sections::Abstract,
35
+ register_render "Metanorma::Standoc::Document::Sections::Abstract",
22
36
  :render_abstract_section
23
- register_render Metanorma::StandardDocument::Sections::Foreword,
37
+ register_render "Metanorma::Standoc::Document::Sections::Foreword",
24
38
  :render_foreword_section
25
- register_render Metanorma::StandardDocument::Sections::Introduction,
39
+ register_render "Metanorma::Standoc::Document::Sections::Introduction",
26
40
  :render_introduction_section
27
- register_render Metanorma::StandardDocument::Sections::FloatingTitle,
41
+ register_render "Metanorma::Standoc::Document::Sections::Preface",
42
+ :render_preface
43
+ register_render "Metanorma::Standoc::Document::Sections::Sections",
44
+ :render_standard_section
45
+ register_render "Metanorma::Standoc::Document::Sections::ContentSection",
46
+ :render_standard_section
47
+ register_render "Metanorma::Standoc::Document::Sections::DefinitionSection",
48
+ :render_standard_section
49
+ register_render "Metanorma::Standoc::Document::Sections::FloatingTitle",
28
50
  :render_floating_title
29
- register_render Metanorma::StandardDocument::Blocks::AmendBlock,
51
+ register_render "Metanorma::Standoc::Document::Blocks::AmendBlock",
30
52
  :render_amend_block
53
+ register_render "Metanorma::Standoc::Document::Sections::Colophon",
54
+ :render_colophon
55
+ register_render "Metanorma::Standoc::Document::Blocks::ToC",
56
+ :render_toc
31
57
 
32
58
  def render_standard_document(doc, **_opts)
33
59
  cover = render_coverpage(doc)
60
+ cover += render_boilerplate(doc) if doc.respond_to?(:boilerplate) &&
61
+ doc.boilerplate
34
62
 
35
- content_parts = []
36
- content_parts << (render(doc.preface) || "") if doc.preface
37
- content_parts << (render_doc_title(doc) || "")
38
- content_parts << (render(doc.sections) || "") if doc.sections
39
- doc.annex&.each { |annex| content_parts << (render(annex) || "") }
40
- content_parts << (render(doc.bibliography) || "") if doc.bibliography
63
+ cover + render_liquid("_main_content.html.liquid",
64
+ { "content" => main_sections_html(doc) })
65
+ end
66
+
67
+ def main_sections_html(doc)
68
+ parts = []
69
+ parts << (render(doc.preface) || "") if doc.preface
70
+ parts << (render_doc_title(doc) || "")
71
+ parts << (render(doc.sections) || "") if doc.sections
72
+ doc.annex&.each { |annex| parts << (render(annex) || "") }
73
+ parts << (render(doc.bibliography) || "") if doc.bibliography
74
+ parts << (render(doc.colophon) || "") if doc.respond_to?(:colophon) &&
75
+ doc.colophon
41
76
 
42
77
  unless @index_term_collector.empty?
43
78
  index_component = Component::IndexSection.new(self)
44
- content_parts << (index_component.render(@index_term_collector) || "")
79
+ parts << (index_component.render(@index_term_collector) || "")
45
80
  end
46
81
 
47
- content_parts << (render(doc.indexsect) || "") if doc.indexsect
48
- content_parts << (render_footnotes_section || "")
49
-
50
- cover + render_liquid("_main_content.html.liquid", {
51
- "content" => content_parts.join,
52
- })
82
+ parts << (render(doc.indexsect) || "") if doc.indexsect
83
+ parts << (render_semantic_annexes(doc) || "")
84
+ parts << (render_footnotes_section || "")
85
+ parts.join
53
86
  end
54
87
 
55
88
  def render_coverpage(doc)
56
89
  bibdata = doc.bibdata
57
90
  return "" unless bibdata
58
91
 
59
- cover_id = nil
60
- bibdata.doc_identifier&.each do |di|
61
- next unless safe_attr(di, :type) == "iso-reference"
62
-
63
- id = extract_text_value(di)
64
- next if id.to_s.empty?
65
-
66
- cover_id = id
67
- break
68
- end
92
+ cover_id = extract_primary_doc_id
69
93
 
70
94
  title_text = extract_display_title(bibdata)
71
95
 
72
96
  render_liquid("_cover.html.liquid", {
73
97
  "doc_id" => cover_id,
74
98
  "title" => title_text,
99
+ "stage_html" => cover_stage_html(bibdata),
100
+ "tc_html" => cover_tc_html(bibdata),
101
+ "dates_html" => cover_dates_html(bibdata),
102
+ })
103
+ end
104
+
105
+ def cover_tc_html(bibdata)
106
+ name = cover_tc_name(bibdata)
107
+ return nil unless name
108
+
109
+ render_liquid("_element.html.liquid", "tag" => "div",
110
+ "extra_attrs" => %( class="coverpage-tc-name"),
111
+ "content" => %(<span>#{escape_html(name)}</span>))
112
+ end
113
+
114
+ # The native covers open with type and maturity bands ("IHO
115
+ # Regulation", "Published 2017-06"); derive both from bibdata.
116
+ # The committee subdivision name renders as the cover tc-name
117
+ # ("hssc"); value-only extraction — the contributor graph is
118
+ # self-referential under to_s/inspect.
119
+ def cover_tc_name(bibdata)
120
+ if bibdata.respond_to?(:subdivision_text_for)
121
+ name = begin
122
+ bibdata.subdivision_text_for("committee", :name)
123
+ rescue StandardError
124
+ nil
125
+ end
126
+ return name if name.is_a?(String) && !name.empty?
127
+ end
128
+
129
+ Array(safe_attr(bibdata, :contributor)).each do |c|
130
+ roles = Array(safe_attr(c, :role))
131
+ author = roles.any? { |r| r.is_a?(String) ? r == "author" : safe_attr(r, :type) == "author" }
132
+ next unless author
133
+
134
+ org = safe_attr(c, :organization)
135
+ Array(safe_attr(org, :subdivision)).each do |sub|
136
+ name = safe_attr(sub, :name)
137
+ name = cover_date_text(name) unless name.is_a?(String)
138
+ return name if name && !name.empty?
139
+ end
140
+ end
141
+ nil
142
+ end
143
+
144
+ def cover_stage_html(bibdata)
145
+ bands = []
146
+ if (doctype = cover_doctype_label(bibdata))
147
+ bands << %(<span class="coverpage-stage" id="#{escape_html(cover_doctype_id(bibdata))}">#{escape_html(doctype)}</span>)
148
+ end
149
+ status = safe_attr(bibdata, :status)
150
+ # status.stage is an Array of mixed-content StageElement;
151
+ # extract the text value (stringifying can hit self-reference).
152
+ stage_el = Array(safe_attr(status, :stage)).first
153
+ stage = if stage_el.nil?
154
+ nil
155
+ elsif stage_el.is_a?(String)
156
+ stage_el
157
+ elsif stage_el.respond_to?(:value)
158
+ Array(stage_el.value).join.strip
159
+ end
160
+ stage = nil if stage.respond_to?(:empty?) && stage.empty?
161
+ if stage
162
+ label = { "in-force" => "Published" }.fetch(stage, stage.capitalize)
163
+ pub = Array(safe_attr(bibdata, :date)).find do |d|
164
+ safe_attr(d, :type) == "published"
165
+ end
166
+ # The native maturity band reads <on> only; when absent it
167
+ # prints the literal placeholder XXX.
168
+ on = cover_date_text(pub && safe_attr(pub, :on))
169
+ text = on ? "#{label} #{on}" : "#{label} XXX"
170
+ bands << %(<p><span class="coverpage-maturity" id="#{escape_html(stage)}">#{escape_html(text)}</span></p>)
171
+ end
172
+ return nil if bands.empty?
173
+
174
+ render_liquid("_element.html.liquid", "tag" => "div",
175
+ "extra_attrs" => %( class="coverpage-stage-block"),
176
+ "content" => bands.join)
177
+ end
178
+
179
+ def cover_doctype_label(bibdata)
180
+ dt = cover_doctype_value(bibdata)
181
+ return nil unless dt
182
+
183
+ pretty = cover_date_text(dt) || dt.to_s
184
+ pretty = pretty.split("-").map(&:capitalize).join(" ")
185
+ prefix = cover_publisher_prefix(bibdata)
186
+ prefix ? "#{prefix} #{pretty}" : pretty
187
+ end
188
+
189
+ def cover_doctype_id(bibdata)
190
+ cover_date_text(cover_doctype_value(bibdata))&.downcase
191
+ end
192
+
193
+ # doctype lives either on the bibdata or its flavor extension.
194
+ def cover_doctype_value(bibdata)
195
+ Array(safe_attr(bibdata, :doctype)).first ||
196
+ Array(safe_attr(safe_attr(bibdata, :ext), :doctype)).first
197
+ end
198
+
199
+ # bibdata dates are Relaton value objects; pull the text out.
200
+ def cover_date_text(value)
201
+ return nil if value.nil?
202
+ return value if value.is_a?(String)
203
+ return Array(value.value).join.strip if value.respond_to?(:value)
204
+
205
+ # Relaton DateTime maps <on>YYYY-MM</on> to content.
206
+ return value.content if value.respond_to?(:content) && value.content.is_a?(String)
207
+ return value.text if value.respond_to?(:text) && value.text.is_a?(String)
208
+
209
+ nil
210
+ end
211
+
212
+ # Publisher abbreviation (preferred) or name from the bibdata
213
+ # contributor graph, value-only extraction: to_s/inspect on lutaml
214
+ # collections recurses into self-referential model graphs.
215
+
216
+ # The committee subdivision name renders as the cover tc-name
217
+ # ("hssc"); value-only extraction — the contributor graph is
218
+ # self-referential under to_s/inspect.
219
+
220
+ # doctype lives either on the bibdata or its flavor extension.
221
+
222
+ # bibdata dates are Relaton value objects; pull the text out.
223
+
224
+ # The contributor graph is self-referential under lutaml-model;
225
+ # walking it for the publisher organization loops forever. The
226
+ # flavor theme already carries the publisher name.
227
+ def cover_publisher_prefix(_bibdata)
228
+ name = theme.respond_to?(:publisher_name) ? theme.publisher_name : nil
229
+ name.is_a?(String) && !name.empty? ? name : nil
230
+ end
231
+
232
+ # Document dates (issue/implementation/...) as a cover band.
233
+ def cover_dates_html(bibdata)
234
+ items = Array(safe_attr(bibdata, :date)).filter_map do |d|
235
+ type = cover_date_text(safe_attr(d, :type)) || safe_attr(d, :type)
236
+ on = cover_date_text(safe_attr(d, :on)) || cover_date_text(safe_attr(d, :from))
237
+ next unless type && on
238
+
239
+ %(<span class="coverpage-date date-#{escape_html(type)}">#{escape_html(type.capitalize)}: #{escape_html(on)}</span>)
240
+ end
241
+ return nil if items.empty?
242
+
243
+ render_liquid("_element.html.liquid", "tag" => "div",
244
+ "extra_attrs" => %( class="coverpage-dates"),
245
+ "content" => items.join)
246
+ end
247
+
248
+ # The document <boilerplate> front-matter block (copyright,
249
+ # licence, legal and feedback statements): part of the native
250
+ # cover matter, rendered right after the title cover.
251
+ def render_boilerplate(doc)
252
+ boilerplate = doc.boilerplate
253
+ parts = []
254
+ %i[copyright_statement license_statement legal_statement
255
+ feedback_statement clause paragraphs quote_blocks].each do |grouping|
256
+ Array(boilerplate.public_send(grouping)).each do |child|
257
+ parts << (render(child, level: 1) || "")
258
+ end
259
+ end
260
+ render_liquid("_element.html.liquid", {
261
+ "tag" => "div",
262
+ "extra_attrs" => element_attrs(
263
+ class: "document-boilerplate",
264
+ ),
265
+ "content" => parts.join,
75
266
  })
76
267
  end
77
268
 
@@ -97,10 +288,19 @@ module Metanorma
97
288
  else
98
289
  render_standard_title(section, level) || ""
99
290
  end
100
- parts << (render_standard_section_blocks(section, level) || "")
101
- parts << (render_subsections(section, level) || "") if with_subsections
102
- if with_terms
103
- section.terms&.each { |term| parts << (render_term(term) || "") }
291
+ if section.respond_to?(:element_order) && Array(section.element_order).any?
292
+ # Document order (element_order) preserves interleaved blocks —
293
+ # paragraphs between figures, notes between lists — which the
294
+ # attribute-grouping path below cannot express.
295
+ parts << (render_ordered_content(section, level) || "")
296
+ else
297
+ parts << (render_standard_section_blocks(section, level) || "")
298
+ parts << (render_subsections(section, level) || "") if with_subsections
299
+ if with_terms
300
+ section.terms&.each { |term| parts << (render_term(term, level: level + 1) || "") }
301
+ end
302
+ parts << (render_section_groupings(section, level,
303
+ skip_terms: with_terms) || "")
104
304
  end
105
305
  render_liquid("_element.html.liquid", {
106
306
  "tag" => "div",
@@ -109,6 +309,22 @@ module Metanorma
109
309
  })
110
310
  end
111
311
 
312
+ # Clause-embedded terms/definitions/references groupings are not
313
+ # `clause` children, so render_subsections skips them and their
314
+ # content would be lost. Render each grouping's children through
315
+ # the normal dispatch (DefinitionSection, ReferenceSection, Term).
316
+ def render_section_groupings(section, level, skip_terms: false)
317
+ parts = []
318
+ %i[terms definitions references].each do |grouping|
319
+ next if skip_terms && grouping == :terms
320
+
321
+ Array(safe_attr(section, grouping)).each do |child|
322
+ parts << (render(child, level: level + 1) || "")
323
+ end
324
+ end
325
+ parts.join
326
+ end
327
+
112
328
  def render_clause_section(section, level: 1, **)
113
329
  render_section(section, level: level, with_subsections: true)
114
330
  end
@@ -121,6 +337,143 @@ module Metanorma
121
337
  render_section(section, level: level)
122
338
  end
123
339
 
340
+ # Requirement / recommendation / permission blocks: the requirements
341
+ # table — label row, then one row per populated component
342
+ # (subject, statement, specification, etc.). Component children
343
+ # (p/ol/ul/...) render through the regular dispatch.
344
+ REQ_COMPONENTS = {
345
+ description: "Description",
346
+ specification: "Statement",
347
+ measurement_target: "Measurement target",
348
+ verification: "Verification",
349
+ inherit: "Inheritance",
350
+ import: "Imported",
351
+ }.freeze
352
+
353
+ def render_requirement(req, **_opts)
354
+ parts = []
355
+ label = req.respond_to?(:fmt_name) && req.fmt_name ? render(req.fmt_name) : reqt_label(req)
356
+ parts << %(<div class="reqt"><p class="reqt-label">#{escape_html(label.to_s)}</p>)
357
+
358
+ if req.respond_to?(:fmt_provision) && req.fmt_provision
359
+ parts << requirement_fmt_provision_html(req)
360
+ else
361
+ parts << requirement_component_rows(req)
362
+ parts << requirement_classification_row(req)
363
+ end
364
+
365
+ parts << %(</div>)
366
+ parts.join
367
+ end
368
+
369
+ # Presentation-layer formatted provision: the requirement's own
370
+ # rendered table — when present it carries the full content.
371
+ def requirement_fmt_provision_html(req)
372
+ provision = render(req.fmt_provision) || ""
373
+
374
+ # Nested requirements (tests inside conformance classes) are
375
+ # not part of the formatted table — render them after it.
376
+ nested = %i[requirement recommendation permission].flat_map do |attr|
377
+ next [] unless req.respond_to?(attr)
378
+
379
+ Array(req.send(attr)).map { |child| render(child) || "" }
380
+ end
381
+
382
+ "#{provision}#{nested.join}"
383
+ end
384
+
385
+ def requirement_component_rows(req)
386
+ REQ_COMPONENTS.filter_map do |attr, row_label|
387
+ value = req.respond_to?(attr) ? req.send(attr) : nil
388
+ next if value.nil? || (value.respond_to?(:empty?) && value.empty?)
389
+
390
+ cells = Array(value).filter_map { |component| render_reqt_component(component) }.join
391
+ next if cells.empty?
392
+
393
+ %(<div class="reqt-row"><span class="reqt-key">#{row_label}:</span> #{cells}</div>)
394
+ end.join
395
+ end
396
+
397
+ def requirement_classification_row(req)
398
+ return "" unless req.respond_to?(:classification) && req.classification&.any?
399
+
400
+ cls = req.classification.filter_map do |c|
401
+ next unless c.respond_to?(:value)
402
+
403
+ "#{c.tag if c.respond_to?(:tag)} #{c.value}".strip
404
+ end.reject(&:empty?).join("; ")
405
+ return "" if cls.empty?
406
+
407
+ %(<div class="reqt-row"><span class="reqt-key">Classification:</span> #{escape_html(cls)}</div>)
408
+ end
409
+
410
+ # Requirement labels come from mn-requirements' i18n vocabulary
411
+ # (the same strings the native isodoc pipeline renders), selected
412
+ # by the requirement's type attribute.
413
+ def reqt_labels
414
+ @reqt_labels ||= begin
415
+ require "isodoc-i18n"
416
+ gem_path = Gem.loaded_specs["mn-requirements"]&.full_gem_path
417
+ gem_path && require(File.join(gem_path, "lib/isodoc/i18n"))
418
+ i18n = IsoDoc::MnRequirementsI18n.new(document_language, nil)
419
+ req = Hash(i18n.get["requirements"])
420
+ # vocabulary nests under default: and modspec: — merge them
421
+ Hash(req["default"]).merge(Hash(req["modspec"]))
422
+ rescue StandardError
423
+ {}
424
+ end
425
+ end
426
+
427
+ def document_language
428
+ lang = respond_to?(:language) ? language : nil
429
+ lang.to_s.empty? ? "en" : lang.to_s
430
+ rescue StandardError
431
+ "en"
432
+ end
433
+
434
+ def reqt_label(req)
435
+ type = req.respond_to?(:type) ? req.type.to_s : ""
436
+ base = reqt_labels[type] ||
437
+ reqt_labels[req.class.name.split("::").last.to_s.delete_suffix("Model").downcase] ||
438
+ req.class.name.split("::").last.to_s.delete_suffix("Model").capitalize
439
+ ident = req.identifier.to_s if req.respond_to?(:identifier)
440
+ ident && ident.empty? ? base : "#{base} #{ident}"
441
+ end
442
+
443
+ def render_reqt_component(component, **_opts)
444
+ return "" if component.nil? || component.is_a?(String)
445
+
446
+ component.class.attributes.each_key.filter_map do |attr|
447
+ value = begin
448
+ component.send(attr)
449
+ rescue StandardError
450
+ next
451
+ end
452
+ if value.is_a?(Array)
453
+ value.map { |v| v.is_a?(String) ? v : render(v) }.join
454
+ elsif !value.nil? && !value.is_a?(String)
455
+ render(value)
456
+ end
457
+ end.join
458
+ end
459
+
460
+ # fmt-xref-label: the cross-reference label text ("Requirement
461
+ # A.14-1", "Clause 3") carried ahead of blocks in mixed content.
462
+ def render_fmt_xref_label(element, **_opts)
463
+ parts = []
464
+ if element.respond_to?(:text) && element.text
465
+ parts << Array(element.text).join
466
+ end
467
+ if element.respond_to?(:semx)
468
+ Array(element.semx).each { |s| parts << render(s) }
469
+ end
470
+ if element.respond_to?(:span)
471
+ Array(element.span).each { |s| parts << render(s) }
472
+ end
473
+ joined = parts.join
474
+ joined.empty? ? "" : %(<span class="fmt-xref-label">#{joined}</span>)
475
+ end
476
+
124
477
  def render_terms_section(section, level: 1, **)
125
478
  render_section(section, level: level, with_terms: true)
126
479
  end
@@ -148,12 +501,86 @@ module Metanorma
148
501
  })
149
502
  end
150
503
 
151
- def render_amend_block(amend, **_opts)
152
- attrs = element_attrs(id: safe_attr(amend, :id))
153
- content = render_mixed_inline(amend)
504
+ # Amend block (machine-readable change): the description paragraphs
505
+ # render bare, the new content blocks render inside a single
506
+ # Quote AmendNewcontent wrapper — matching native isodoc output.
507
+ def render_amend_block(amend, **opts)
508
+ parts = Array(safe_attr(amend, :description)).map do |desc|
509
+ render_amend_content(desc, **opts)
510
+ end
511
+ new_contents = Array(safe_attr(amend, :new_content))
512
+ if new_contents.any?
513
+ inner = new_contents.map { |nc| render_amend_content(nc, **opts) }.join
514
+ attrs = element_attrs(id: safe_attr(amend, :id),
515
+ class: "Quote AmendNewcontent")
516
+ parts << render_liquid("_element.html.liquid", {
517
+ "tag" => "div",
518
+ "extra_attrs" => attrs,
519
+ "content" => inner,
520
+ })
521
+ end
522
+ parts.join
523
+ end
524
+
525
+ def render_amend_content(content, **opts)
526
+ parts = []
527
+ %i[paragraphs note ol ul dl figure clause].each do |attr|
528
+ Array(safe_attr(content, attr)).each do |child|
529
+ parts << (render_amend_child(child, **opts) || "")
530
+ end
531
+ end
532
+ parts.join
533
+ end
534
+
535
+ def render_amend_child(child, **)
536
+ if child.is_a?(Metanorma::Standoc::Document::Sections::ClauseSection)
537
+ render_amend_clause(child, **)
538
+ else
539
+ render(child, **)
540
+ end
541
+ end
542
+
543
+ # An annex introduced by an amendment carries its identity in
544
+ # number/obligation attributes rather than a formatted title:
545
+ # native isodoc renders the Annex label, the obligation and the
546
+ # title as one heading paragraph.
547
+ def render_amend_clause(clause, level: 1, **)
548
+ return render(clause, level: level, **) unless safe_attr(clause, :type) == "annex"
549
+
550
+ heading = +""
551
+ number = safe_attr(clause, :number)
552
+ heading << "<b>Annex #{escape_html(number)}</b><br />" if number
553
+ obligation = safe_attr(clause, :obligation)
554
+ if obligation
555
+ heading << %(<span class="obligation">(#{escape_html(obligation)})</span><br />)
556
+ end
557
+ title = safe_attr(clause, :fmt_title) || safe_attr(clause, :title)
558
+ heading << render_mixed_inline(title).to_s if title
559
+
560
+ body = Array(clause.blocks).filter_map do |node|
561
+ next if is_title_element?(node, clause)
562
+
563
+ render(node, level: level + 1)
564
+ end.join
565
+ attrs = element_attrs(id: safe_attr(clause, :id))
154
566
  render_liquid("_element.html.liquid", {
155
567
  "tag" => "div",
156
568
  "extra_attrs" => attrs,
569
+ "content" => %(<p class="h1">#{heading}</p>#{body}),
570
+ })
571
+ end
572
+
573
+ # Authored table-of-contents blocks (clause type="toc"): a list of
574
+ # cross-references rendered as a toc div, mirroring the native
575
+ # isodoc layout.
576
+ def render_toc(toc, **_opts)
577
+ list = safe_attr(toc, :list)
578
+ content = Array(list).filter_map do |ul|
579
+ render_unordered_list(ul)
580
+ end.join
581
+ render_liquid("_element.html.liquid", {
582
+ "tag" => "div",
583
+ "extra_attrs" => element_attrs(class: "toc"),
157
584
  "content" => content,
158
585
  })
159
586
  end
@@ -164,19 +591,25 @@ module Metanorma
164
591
  # (StandardDocument::Terms::Term) and presentation-aware models with
165
592
  # fmt-* attributes (IsoDocument::Terms::IsoTerm): safe_attr returns nil
166
593
  # for attributes a model does not declare, so the fmt-* branches are
167
- # skipped automatically on semantic-only models.
168
- def render_term(term, **_opts)
594
+ # skipped automatically on semantic-only models. +level+ is the term's
595
+ # TermNum heading level (section level + 1, per isodoc's term_header).
596
+ def render_term(term, level: 2, **_opts)
169
597
  attrs = element_attrs(id: safe_attr(term, :id), **term_data_attrs(term))
170
598
  fmt_definition = safe_attr(term, :fmt_definition)
171
599
 
172
600
  parts = []
173
- parts << (render_term_number(term) || "")
601
+ parts << (render_term_number(term, level: level) || "")
174
602
  parts << render_term_designations(term, :fmt_preferred, :preferred,
175
603
  "preferred")
176
604
  parts << render_term_designations(term, :fmt_admitted, :admitted,
177
605
  "admitted")
178
606
  parts << render_term_designations(term, :fmt_deprecates, :deprecates,
179
607
  "deprecated")
608
+ # IEEE-style metadata definition list (figdl), rendered before the
609
+ # definition like the native term entry.
610
+ Array(safe_attr(term, :dl)).each do |list|
611
+ parts << (render_definition_list(list) || "")
612
+ end
180
613
  parts << (render_term_domain(term, fmt_definition) || "")
181
614
  parts << render_term_definitions(term, fmt_definition)
182
615
  parts << render_term_note_parts(term)
@@ -185,7 +618,7 @@ module Metanorma
185
618
  safe_attr(term, :admonition)&.each do |admonition|
186
619
  parts << (render_admonition(admonition) || "")
187
620
  end
188
- safe_attr(term, :term)&.each { |sub| parts << (render_term(sub) || "") }
621
+ safe_attr(term, :term)&.each { |sub| parts << (render_term(sub, level: level + 1) || "") }
189
622
  render_liquid("_element.html.liquid", {
190
623
  "tag" => "div",
191
624
  "extra_attrs" => attrs,
@@ -206,11 +639,15 @@ module Metanorma
206
639
  data_attrs
207
640
  end
208
641
 
209
- def render_term_number(term)
642
+ # The term number renders as a TermNum HEADING one level below the
643
+ # enclosing section heading (isodoc term_header postprocess: p.TermNum
644
+ # becomes h(parent+1), so top-level terms get h2, nested terms h3+).
645
+ def render_term_number(term, level: 2)
210
646
  fmt_name = safe_attr(term, :fmt_name)
211
647
  term_number = safe_attr(term, :term_number)
212
648
  if fmt_name
213
649
  render_liquid("_term_number.html.liquid", {
650
+ "level" => [level, 6].min,
214
651
  "content" => render_inline_element(fmt_name),
215
652
  })
216
653
  elsif term_number
@@ -220,6 +657,7 @@ module Metanorma
220
657
  extract_text_value(term_number)
221
658
  end
222
659
  render_liquid("_term_number.html.liquid", {
660
+ "level" => [level, 6].min,
223
661
  "content" => escape_html(number_text),
224
662
  })
225
663
  end
@@ -270,6 +708,30 @@ module Metanorma
270
708
  parts.join
271
709
  end
272
710
 
711
+ # The <semx> wrapper inside <fmt-definition> carries the definition's
712
+ # block content one level down (standoc FmtDefinitionSemx); render
713
+ # its children in document order.
714
+ def render_fmt_definition_semx(semx, **_opts)
715
+ parts = []
716
+ walk_ordered(semx) do |type, obj|
717
+ next unless type == :element
718
+
719
+ parts << case obj
720
+ when Metanorma::Document::Components::Paragraphs::ParagraphBlock
721
+ render_paragraph(obj)
722
+ when Metanorma::Standoc::Document::Terms::TermNote
723
+ render_term_note(obj)
724
+ when Metanorma::Document::Components::Lists::DefinitionList
725
+ render_definition_list(obj)
726
+ when Metanorma::Document::Components::Lists::OrderedList
727
+ render_ordered_list(obj)
728
+ when Metanorma::Document::Components::Lists::UnorderedList
729
+ render_unordered_list(obj)
730
+ end
731
+ end
732
+ parts.compact.join
733
+ end
734
+
273
735
  def render_term_note_parts(term)
274
736
  notes = safe_attr(term, :termnote) || Array(safe_attr(term, :note))
275
737
  parts = []
@@ -338,17 +800,62 @@ module Metanorma
338
800
  })
339
801
  end
340
802
  else
341
- term.source&.each { |src| parts << (render_term_source(src) || "") }
342
- safe_attr(term, :termsource)&.each do |source|
343
- parts << (render_term_source_element(source) || "")
803
+ # When the fmt-definition flow already carries the source inline
804
+ # (IEEE-style "(adapted from …)" inside the definition), the
805
+ # semantic [SOURCE: …] line would be a duplicate the native
806
+ # titlepage never emits.
807
+ unless fmt_definition_carries_source?(term)
808
+ term.source&.each { |src| parts << (render_term_source(src) || "") }
809
+ safe_attr(term, :termsource)&.each do |source|
810
+ parts << (render_term_source_element(source) || "")
811
+ end
344
812
  end
345
813
  end
346
814
  parts.join
347
815
  end
348
816
 
817
+ SEMX_SOURCE_SEARCH_ATTRS = %i[semx p span strong em sup sub xref eref
818
+ origin fmt_xref fmt_eref fmt_origin].freeze
819
+
820
+ def fmt_definition_carries_source?(term)
821
+ fmt_def = safe_attr(term, :fmt_definition)
822
+ return false unless fmt_def
823
+
824
+ candidates = Array(fmt_def.semx)
825
+ candidates << fmt_def if fmt_def.is_a?(Lutaml::Model::Serializable) &&
826
+ !fmt_def.is_a?(Metanorma::Document::Components::Inline::SemxElement)
827
+ candidates.any? { |n| semx_tree_has_source?(n) }
828
+ end
829
+
830
+ def semx_tree_has_source?(node, seen = nil)
831
+ return false unless node.is_a?(Lutaml::Model::Serializable)
832
+
833
+ # semx trees may be self-referential (fmt wrappers pointing back
834
+ # at their own definition); guard the walk with an identity set.
835
+ seen ||= {}.compare_by_identity
836
+ return false if seen[node]
837
+
838
+ seen[node] = true
839
+ return true if node.is_a?(Metanorma::Document::Components::Inline::SemxElement) &&
840
+ node.element_attr.to_s == "source"
841
+
842
+ SEMX_SOURCE_SEARCH_ATTRS.each do |attr|
843
+ next unless node.respond_to?(attr)
844
+
845
+ Array(node.public_send(attr)).each do |child|
846
+ return true if semx_tree_has_source?(child, seen)
847
+ end
848
+ end
849
+ false
850
+ end
851
+
349
852
  def extract_term_name(term)
350
853
  fmt_pref = safe_attr(term, :fmt_preferred)
351
- if fmt_pref && !fmt_pref.empty?
854
+ if fmt_pref.is_a?(String) && !fmt_pref.empty?
855
+ return fmt_pref
856
+ end
857
+
858
+ if fmt_pref.is_a?(Array) && !fmt_pref.empty?
352
859
  fp = fmt_pref.first
353
860
  if fp.p && !fp.p.empty?
354
861
  return extract_plain_text(fp.p.first)
@@ -374,10 +881,12 @@ module Metanorma
374
881
  end
375
882
 
376
883
  def render_term_designation(designation, _type)
377
- name = extract_designation_name(designation)
378
- return nil unless name
884
+ name_element = designation_name_element(designation)
885
+ return nil unless name_element
379
886
 
380
- inner = escape_html(name)
887
+ inner = Array(name_element).map do |n|
888
+ n.is_a?(String) ? escape_html(n) : render_mixed_inline(n)
889
+ end.join
381
890
  dfn = render_liquid("_element.html.liquid",
382
891
  { "tag" => "dfn", "extra_attrs" => "",
383
892
  "content" => inner })
@@ -391,25 +900,62 @@ module Metanorma
391
900
  })
392
901
  end
393
902
 
903
+ # The raw name element(s) of a designation — String or
904
+ # mixed-content name elements (e.g. TermNameElement) — for rich
905
+ # inline rendering by the caller.
906
+ def designation_name_element(designation)
907
+ if designation.is_a?(Metanorma::Standoc::Document::Terms::Designation) && designation.expression
908
+ expr = designation.expression
909
+ if expr.is_a?(Metanorma::Standoc::Document::Terms::TermExpression) && expr.name
910
+ expr.name
911
+ end
912
+ elsif designation.is_a?(Metanorma::Standoc::Document::Terms::TermExpression)
913
+ designation.name
914
+ elsif designation.is_a?(Metanorma::Standoc::Document::Terms::Designation)
915
+ designation
916
+ end
917
+ end
918
+
394
919
  def extract_designation_name(designation)
395
- if designation.is_a?(Metanorma::StandardDocument::Terms::Designation) && designation.expression
920
+ if designation.is_a?(Metanorma::Standoc::Document::Terms::Designation) && designation.expression
396
921
  expr = designation.expression
397
- if expr.is_a?(Metanorma::StandardDocument::Terms::TermExpression) && expr.name
398
- Array(expr.name).join
922
+ if expr.is_a?(Metanorma::Standoc::Document::Terms::TermExpression) && expr.name
923
+ join_designation_names(expr.name)
399
924
  end
400
- elsif designation.is_a?(Metanorma::StandardDocument::Terms::TermExpression) && designation.name
401
- Array(designation.name).join
925
+ elsif designation.is_a?(Metanorma::Standoc::Document::Terms::TermExpression) && designation.name
926
+ join_designation_names(designation.name)
402
927
  else
403
928
  extract_text_value(designation)
404
929
  end
405
930
  end
406
931
 
932
+ # Designation names may be plain strings or mixed-content name
933
+ # elements (e.g. TermNameElement); stringify through the text
934
+ # extractors instead of Object#to_s.
935
+ def join_designation_names(names)
936
+ Array(names).map do |n|
937
+ next n if n.is_a?(String)
938
+
939
+ extract_plain_text(n) || extract_text_value(n) || ""
940
+ end.join
941
+ end
942
+
407
943
  def render_term_definition(definition)
408
944
  return nil unless definition
409
- return nil unless definition.is_a?(Metanorma::StandardDocument::Terms::TermDefinition)
945
+ return nil unless definition.is_a?(Metanorma::Standoc::Document::Terms::TermDefinition)
410
946
 
411
947
  ve = definition.verbalexpression
412
- return nil unless ve
948
+ unless ve
949
+ # Legacy presentation XML states the definition's blocks
950
+ # directly under <definition>: render them in document order.
951
+ legacy = collect_ordered_children(definition)
952
+ return legacy.empty? ? nil : legacy.filter_map { |child| render(child) }.join
953
+ end
954
+
955
+ walked = collect_ordered_children(ve)
956
+ unless walked.empty?
957
+ return walked.filter_map { |child| render(child) }.join
958
+ end
413
959
 
414
960
  parts = []
415
961
  ve.paragraph&.each { |para| parts << (render_paragraph(para) || "") }
@@ -462,7 +1008,7 @@ module Metanorma
462
1008
  })
463
1009
  end
464
1010
 
465
- def render_term_source(source)
1011
+ def render_term_source(source, **_opts)
466
1012
  return nil unless source
467
1013
 
468
1014
  parts = []
@@ -475,24 +1021,30 @@ module Metanorma
475
1021
  citeas = safe_attr(origin, :citeas)
476
1022
  bibitemid = safe_attr(origin, :bibitemid)
477
1023
 
478
- parts << if citeas && !citeas.to_s.empty?
479
- if bibitemid && !bibitemid.to_s.empty?
480
- render_liquid("_link.html.liquid", {
481
- "attrs" => element_attrs(
482
- href: "##{escape_html(bibitemid.to_s)}", class: "bibref",
483
- ),
484
- "content" => escape_html(citeas.to_s),
485
- })
486
- else
487
- escape_html(citeas.to_s)
488
- end
1024
+ # isodoc shows the origin's own text when the source states it
1025
+ # (<origin citeas="ISO 19101">ISO 19101-1:2014</origin>),
1026
+ # falling back to the citeas anchor.
1027
+ display = Array(safe_attr(origin, :content)).join.strip
1028
+ display = citeas.to_s if display.empty? && citeas && !citeas.to_s.empty?
1029
+ parts << if !display.empty? && bibitemid && !bibitemid.to_s.empty?
1030
+ render_liquid("_link.html.liquid", {
1031
+ "attrs" => element_attrs(
1032
+ href: "##{escape_html(bibitemid.to_s)}", class: "bibref",
1033
+ ),
1034
+ "content" => escape_html(display),
1035
+ })
1036
+ elsif !display.empty?
1037
+ escape_html(display)
489
1038
  else
490
1039
  render_mixed_inline(origin) || ""
491
1040
  end
492
1041
 
493
1042
  modification = safe_attr(source, :modification)
494
- if modification && !modification.to_s.empty?
495
- parts << ", modified — #{escape_html(modification.to_s)}"
1043
+ if modification
1044
+ mod_content = Array(safe_attr(modification, :p)).map do |para|
1045
+ render_mixed_inline(para) || ""
1046
+ end.join
1047
+ parts << ", modified — #{mod_content}" unless mod_content.strip.empty?
496
1048
  end
497
1049
  else
498
1050
  parts << (render_mixed_inline(source) || "")
@@ -515,6 +1067,16 @@ module Metanorma
515
1067
 
516
1068
  # --- Bibliography / References ---
517
1069
 
1070
+ # The document <colophon> (e.g. the BIPM "Document Control" and
1071
+ # "Revision History" clauses): trailing display clauses rendered
1072
+ # like any other clause content.
1073
+ def render_colophon(colophon, **_opts)
1074
+ parts = Array(colophon.clause).filter_map do |clause|
1075
+ render(clause)
1076
+ end
1077
+ parts.join
1078
+ end
1079
+
518
1080
  def render_bibliography(bib, level: 1, **_opts)
519
1081
  parts = []
520
1082
  bib.references&.each do |ref|
@@ -536,6 +1098,12 @@ module Metanorma
536
1098
  default_class: is_normative ? "" : "section-sub") || "")
537
1099
  section.p&.each { |para| parts << (render_paragraph(para) || "") }
538
1100
  section.note&.each { |note| parts << (render_paragraph(note) || "") }
1101
+ Array(safe_attr(section, :ol)).each do |list|
1102
+ parts << (render_ordered_list(list) || "")
1103
+ end
1104
+ Array(safe_attr(section, :ul)).each do |list|
1105
+ parts << (render_unordered_list(list) || "")
1106
+ end
539
1107
  section.references&.each_with_index do |bibitem, i|
540
1108
  parts << (render_bibitem(bibitem, i + 1,
541
1109
  normative: is_normative) || "")
@@ -631,11 +1199,16 @@ module Metanorma
631
1199
 
632
1200
  def render_bibitem_content(item)
633
1201
  parts = []
634
- if item.formatted_ref
635
- parts << (render_mixed_inline(item.formatted_ref) || "")
1202
+ if (fr = item.formatted_ref)
1203
+ frs = fr.is_a?(Array) ? fr : [fr]
1204
+ frs.each do |f|
1205
+ parts << (render_mixed_inline(f) || "")
1206
+ end
636
1207
  return parts.join
637
1208
  end
638
1209
 
1210
+ parts << (bibitem_author_prefix(item) || "")
1211
+
639
1212
  rendered_pubid = render_pubid_identifier(item)
640
1213
  unless rendered_pubid
641
1214
  render_docidentifier_fallback_into(parts, item)
@@ -666,16 +1239,90 @@ module Metanorma
666
1239
  })
667
1240
  end
668
1241
  end
1242
+
1243
+ parts << (bibitem_publisher_statement(item) || "")
1244
+ parts << (bibitem_uri_statement(item) || "")
669
1245
  parts.join
670
1246
  end
671
1247
 
1248
+ # isodoc reference layout: authors lead the entry ("A. Phillips,
1249
+ # M. Davis: ") ahead of the document identifier. Author entities
1250
+ # are persons (completename) or organizations (name).
1251
+ def bibitem_author_prefix(item)
1252
+ names = Array(item.contributor).filter_map do |contributor|
1253
+ next unless Array(contributor.role).any? { |r| safe_attr(r, :type) == "author" }
1254
+
1255
+ if contributor.person
1256
+ Array(contributor.person.name&.completename).map do |name|
1257
+ extract_text_value(name).to_s
1258
+ end.join
1259
+ elsif contributor.organization
1260
+ Array(contributor.organization.name).map do |name|
1261
+ extract_text_value(name).to_s
1262
+ end.join(", ")
1263
+ end
1264
+ end.map(&:strip).reject(&:empty?)
1265
+ return nil if names.empty?
1266
+
1267
+ render_liquid("_inline_span.html.liquid", {
1268
+ "attrs" => " class=\"ref-authors\"",
1269
+ "content" => "#{escape_html(names.join(', '))}: ",
1270
+ })
1271
+ end
1272
+
1273
+ # Publisher, place and publication year close the entry
1274
+ # ("Open Geospatial Consortium , Geneva (2004).").
1275
+ def bibitem_publisher_statement(item)
1276
+ publishers = Array(item.contributor).filter_map do |contributor|
1277
+ next unless Array(contributor.role).any? { |r| safe_attr(r, :type) == "publisher" }
1278
+ next unless contributor.organization
1279
+
1280
+ Array(contributor.organization.name).map do |name|
1281
+ extract_text_value(name).to_s
1282
+ end.join(", ").strip
1283
+ end.reject(&:empty?)
1284
+
1285
+ places = Array(item.place).map do |place|
1286
+ extract_text_value(place).to_s
1287
+ end.map(&:strip).reject(&:empty?)
1288
+
1289
+ segments = publishers + places
1290
+ return nil if segments.empty?
1291
+
1292
+ year = Array(item.date).filter_map do |date|
1293
+ next unless safe_attr(date, :type) == "published"
1294
+
1295
+ date_on = date.is_a?(Metanorma::Document::Relaton::BibliographicDate) ? date.on : nil
1296
+ value = extract_text_value(date_on || safe_attr(date, :text)).to_s
1297
+ value[/\d{4}/]
1298
+ end.first
1299
+
1300
+ closing = year ? " (#{escape_html(year)})." : "."
1301
+ render_liquid("_inline_span.html.liquid", {
1302
+ "attrs" => " class=\"ref-publisher\"",
1303
+ "content" => "#{escape_html(segments.join(', '))}#{closing} ",
1304
+ })
1305
+ end
1306
+
1307
+ # The reference's canonical URI is visible text in isodoc output,
1308
+ # not only an href on the identifier anchor.
1309
+ def bibitem_uri_statement(item)
1310
+ url = bibitem_url(item)
1311
+ return nil unless url
1312
+
1313
+ render_liquid("_inline_span.html.liquid", {
1314
+ "attrs" => " class=\"ref-uri\"",
1315
+ "content" => escape_html(url),
1316
+ })
1317
+ end
1318
+
672
1319
  def render_pubid_identifier(item)
673
1320
  return nil unless item.docidentifier && !item.docidentifier.empty?
674
1321
 
675
1322
  docids = Array(item.docidentifier)
676
1323
  primary = docids.find do |di|
677
1324
  val = extract_text_value(di).to_s
678
- val.match?(/\A\[?\d+\]?\z/) ? false : !val.match?(/\A(?:iso-reference|URN)\s/)
1325
+ val.match?(/\A\[?\d+\]?\z/) ? false : !val.match?(/\A(?:URN|[a-z]+-reference)\s/)
679
1326
  end
680
1327
  return nil unless primary
681
1328
 
@@ -694,7 +1341,7 @@ module Metanorma
694
1341
  docids = Array(item.docidentifier)
695
1342
  primary = docids.find do |di|
696
1343
  val = extract_text_value(di).to_s
697
- val.match?(/\A\[?\d+\]?\z/) ? false : !val.match?(/\A(?:iso-reference|URN)\s/)
1344
+ val.match?(/\A\[?\d+\]?\z/) ? false : !val.match?(/\A(?:URN|[a-z]+-reference)\s/)
698
1345
  end
699
1346
  return unless primary
700
1347
 
@@ -765,7 +1412,8 @@ module Metanorma
765
1412
  end
766
1413
 
767
1414
  %i[tables figures formulas examples notes admonitions sourcecode_blocks
768
- quote_blocks].each do |attr|
1415
+ quote_blocks requirement recommendation permission
1416
+ term_sources].each do |attr|
769
1417
  values = safe_attr(section, attr)
770
1418
  if values
771
1419
  Array(values).each do |v|
@@ -797,6 +1445,20 @@ module Metanorma
797
1445
 
798
1446
  "Note to entry"
799
1447
  end
1448
+
1449
+ # Semantic notes (e.g. inside amendment newcontent) carry their
1450
+ # number as the number attribute, with no fmt-name or autonum.
1451
+ def extract_block_label(block, default)
1452
+ label = super
1453
+ return label unless label == default
1454
+
1455
+ number = safe_attr(block, :number)
1456
+ if number && !number.to_s.empty?
1457
+ "#{default} #{number}"
1458
+ else
1459
+ label
1460
+ end
1461
+ end
800
1462
  end
801
1463
  end
802
1464
  end