metanorma-document 0.2.9 → 0.3.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 (394) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +72 -81
  3. data/CLAUDE.md +26 -0
  4. data/README.adoc +144 -0
  5. data/Rakefile +14 -2
  6. data/TODO.finalize/01-split-multi-class-files.md +8 -0
  7. data/TODO.finalize/02-remove-data-dist-iso-document-frontend.md +6 -0
  8. data/TODO.finalize/03-align-frontend-iife-and-gha-build.md +11 -0
  9. data/TODO.finalize/04-theme-per-flavor-config-driven.md +9 -0
  10. data/TODO.finalize/05-migrate-all-html-to-liquid.md +16 -0
  11. data/TODO.finalize/06-integrate-pubid-library.md +16 -0
  12. data/TODO.finalize/07-replace-relaton-models-with-relaton-bib.md +39 -0
  13. data/TODO.finalize/08-refactor-renderer-architecture.md +25 -0
  14. data/TODO.finalize/09-eliminate-code-smells.md +14 -0
  15. data/TODO.finalize/10-comprehensive-spec-coverage.md +24 -0
  16. data/TODO.finalize/11-config-driven-flavor-metadata.md +20 -0
  17. data/TODO.finalize/12-add-frozen-string-literal.md +6 -0
  18. data/TODO.finalize/13-extract-composition-from-god-class.md +96 -0
  19. data/TODO.finalize/14-config-driven-section-ordering.md +31 -0
  20. data/TODO.finalize/15-theme-directories-per-flavor.md +46 -0
  21. data/TODO.finalize/16-theme-lutaml-model-schema.md +44 -0
  22. data/data/javascripts/components/mn-footnotes.js +68 -0
  23. data/data/javascripts/components/mn-lightbox.js +18 -2
  24. data/data/javascripts/components/mn-shortcuts.js +2 -0
  25. data/data/javascripts/core/mn-navigation.js +8 -0
  26. data/data/javascripts/core/mn-theme.js +9 -9
  27. data/data/logos/oiml-logo-full-dark.svg +1 -0
  28. data/data/logos/oiml-logo-full-light.svg +1 -0
  29. data/data/logos/oiml-logo-icon-dark.svg +1 -0
  30. data/data/logos/oiml-logo-icon-light.svg +1 -0
  31. data/data/logos/oiml-logo.svg +1 -0
  32. data/data/logos/pdfa-logo.svg +31 -94
  33. data/data/stylesheets/base/_layout.css +3 -0
  34. data/data/stylesheets/base/_reset.css +3 -3
  35. data/data/stylesheets/base/_typography.css +0 -5
  36. data/data/stylesheets/components/bibliography.css +3 -3
  37. data/data/stylesheets/components/cover.css +3 -1
  38. data/data/stylesheets/components/figure.css +13 -1
  39. data/data/stylesheets/components/footnote.css +65 -5
  40. data/data/stylesheets/components/formula.css +44 -0
  41. data/data/stylesheets/components/header.css +17 -2
  42. data/data/stylesheets/components/inline.css +1 -1
  43. data/data/stylesheets/components/table.css +15 -2
  44. data/data/stylesheets/components/term.css +0 -1
  45. data/data/themes/bipm.yaml +60 -0
  46. data/data/themes/cc.yaml +43 -0
  47. data/data/themes/icc.yaml +39 -0
  48. data/data/themes/iec.yaml +44 -0
  49. data/data/themes/ieee.yaml +43 -0
  50. data/data/themes/ietf.yaml +45 -0
  51. data/data/themes/iho.yaml +46 -0
  52. data/data/themes/iso.yaml +40 -0
  53. data/data/themes/itu.yaml +45 -0
  54. data/data/themes/ogc.yaml +51 -0
  55. data/data/themes/oiml.yaml +56 -0
  56. data/data/themes/pdfa.yaml +44 -0
  57. data/data/themes/ribose.yaml +43 -0
  58. data/exe/metanorma-document +11 -0
  59. data/frontend/e2e/sample-html.test.ts +256 -0
  60. data/frontend/index.html +12 -0
  61. data/frontend/package-lock.json +4725 -0
  62. data/frontend/package.json +32 -0
  63. data/frontend/postcss.config.js +6 -0
  64. data/frontend/src/App.vue +79 -0
  65. data/frontend/src/app.ts +21 -0
  66. data/frontend/src/components/AppSidebar.vue +77 -0
  67. data/frontend/src/components/DocumentReader.vue +180 -0
  68. data/frontend/src/components/MirrorRenderer.vue +23 -0
  69. data/frontend/src/components/ReadingProgressBar.vue +29 -0
  70. data/frontend/src/components/TextRenderer.vue +131 -0
  71. data/frontend/src/components/TocItem.vue +57 -0
  72. data/frontend/src/components/TopBar.vue +49 -0
  73. data/frontend/src/components/__tests__/MirrorRenderer.test.ts +178 -0
  74. data/frontend/src/components/blocks/AdmonitionBlock.vue +74 -0
  75. data/frontend/src/components/blocks/ClauseBlock.vue +53 -0
  76. data/frontend/src/components/blocks/ExampleBlock.vue +21 -0
  77. data/frontend/src/components/blocks/FallbackBlock.vue +18 -0
  78. data/frontend/src/components/blocks/FigureBlock.vue +26 -0
  79. data/frontend/src/components/blocks/FootnotesBlock.vue +25 -0
  80. data/frontend/src/components/blocks/ListBlocks.vue +62 -0
  81. data/frontend/src/components/blocks/NoteBlock.vue +21 -0
  82. data/frontend/src/components/blocks/ParagraphBlock.vue +25 -0
  83. data/frontend/src/components/blocks/QuoteBlock.vue +25 -0
  84. data/frontend/src/components/blocks/ReviewBlock.vue +39 -0
  85. data/frontend/src/components/blocks/SourcecodeBlock.vue +52 -0
  86. data/frontend/src/components/blocks/TableBlock.vue +48 -0
  87. data/frontend/src/components/blocks/index.ts +36 -0
  88. data/frontend/src/stores/__tests__/documentStore.fixture.test.ts +272 -0
  89. data/frontend/src/stores/__tests__/documentStore.test.ts +143 -0
  90. data/frontend/src/stores/__tests__/ebookStore.test.ts +145 -0
  91. data/frontend/src/stores/__tests__/uiStore.test.ts +42 -0
  92. data/frontend/src/stores/documentStore.ts +153 -0
  93. data/frontend/src/stores/ebookStore.ts +179 -0
  94. data/frontend/src/stores/uiStore.ts +32 -0
  95. data/frontend/src/styles.css +156 -0
  96. data/frontend/src/types/__tests__/rendering-contract.test.ts +172 -0
  97. data/frontend/src/types/rendering-contract.ts +209 -0
  98. data/frontend/src/utils/__tests__/typeMetadata.test.ts +102 -0
  99. data/frontend/src/utils/typeMetadata.ts +121 -0
  100. data/frontend/tailwind.config.js +18 -0
  101. data/frontend/test/fixtures/iso-document.json +271 -0
  102. data/frontend/tmp/debug_e2e.cjs +46 -0
  103. data/frontend/tsconfig.json +25 -0
  104. data/frontend/tsconfig.node.json +11 -0
  105. data/frontend/vite.config.ts +37 -0
  106. data/frontend/vitest.e2e.config.ts +9 -0
  107. data/lib/metanorma/bipm_document/metadata/bipm_bibliographic_item.rb +0 -14
  108. data/lib/metanorma/bipm_document/metadata/depiction_element.rb +18 -0
  109. data/lib/metanorma/bipm_document/metadata.rb +1 -1
  110. data/lib/metanorma/document/cli.rb +116 -0
  111. data/lib/metanorma/document/components/ancillary_blocks/callout_annotation.rb +27 -0
  112. data/lib/metanorma/document/components/ancillary_blocks/sourcecode_block.rb +0 -65
  113. data/lib/metanorma/document/components/ancillary_blocks/sourcecode_body.rb +18 -0
  114. data/lib/metanorma/document/components/ancillary_blocks.rb +4 -0
  115. data/lib/metanorma/document/components/bib_data/bib_data.rb +7 -0
  116. data/lib/metanorma/document/components/blocks/classification_value.rb +21 -0
  117. data/lib/metanorma/document/components/blocks/permission_model.rb +28 -0
  118. data/lib/metanorma/document/components/blocks/recommendation_model.rb +28 -0
  119. data/lib/metanorma/document/components/blocks/requirement_base.rb +30 -0
  120. data/lib/metanorma/document/components/blocks/requirement_classification.rb +20 -0
  121. data/lib/metanorma/document/components/blocks/requirement_description.rb +43 -0
  122. data/lib/metanorma/document/components/blocks/requirement_inherit.rb +24 -0
  123. data/lib/metanorma/document/components/blocks/requirement_model.rb +0 -131
  124. data/lib/metanorma/document/components/blocks.rb +8 -7
  125. data/lib/metanorma/document/components/id_elements/image.rb +2 -0
  126. data/lib/metanorma/document/components/inline/asciimath_element.rb +2 -0
  127. data/lib/metanorma/document/components/inline/attribution_element.rb +2 -0
  128. data/lib/metanorma/document/components/inline/bcp14_element.rb +2 -0
  129. data/lib/metanorma/document/components/inline/biblio_tag_element.rb +2 -0
  130. data/lib/metanorma/document/components/inline/br_element.rb +2 -0
  131. data/lib/metanorma/document/components/inline/comma_element.rb +2 -0
  132. data/lib/metanorma/document/components/inline/concept_element.rb +2 -0
  133. data/lib/metanorma/document/components/inline/display_text_element.rb +2 -0
  134. data/lib/metanorma/document/components/inline/em_raw_element.rb +2 -0
  135. data/lib/metanorma/document/components/inline/enum_comma_element.rb +2 -0
  136. data/lib/metanorma/document/components/inline/eref_element.rb +2 -0
  137. data/lib/metanorma/document/components/inline/fmt_admitted_element.rb +4 -0
  138. data/lib/metanorma/document/components/inline/fmt_annotation_body_element.rb +4 -0
  139. data/lib/metanorma/document/components/inline/fmt_annotation_end_element.rb +4 -0
  140. data/lib/metanorma/document/components/inline/fmt_annotation_start_element.rb +4 -0
  141. data/lib/metanorma/document/components/inline/fmt_concept_element.rb +4 -0
  142. data/lib/metanorma/document/components/inline/fmt_definition_element.rb +4 -0
  143. data/lib/metanorma/document/components/inline/fmt_fn_body_element.rb +4 -0
  144. data/lib/metanorma/document/components/inline/fmt_fn_label_element.rb +4 -0
  145. data/lib/metanorma/document/components/inline/fmt_footnote_container_element.rb +4 -0
  146. data/lib/metanorma/document/components/inline/fmt_identifier_element.rb +4 -0
  147. data/lib/metanorma/document/components/inline/fmt_name_element.rb +4 -0
  148. data/lib/metanorma/document/components/inline/fmt_preferred_element.rb +4 -0
  149. data/lib/metanorma/document/components/inline/fmt_sourcecode_element.rb +4 -0
  150. data/lib/metanorma/document/components/inline/fmt_stem_element.rb +10 -0
  151. data/lib/metanorma/document/components/inline/fmt_termsource_element.rb +4 -0
  152. data/lib/metanorma/document/components/inline/fmt_title_element.rb +4 -0
  153. data/lib/metanorma/document/components/inline/fmt_xref_element.rb +4 -0
  154. data/lib/metanorma/document/components/inline/fmt_xref_label_element.rb +4 -0
  155. data/lib/metanorma/document/components/inline/fn_element.rb +2 -0
  156. data/lib/metanorma/document/components/inline/link_element.rb +2 -0
  157. data/lib/metanorma/document/components/inline/localized_string_element.rb +2 -0
  158. data/lib/metanorma/document/components/inline/localized_strings_element.rb +2 -0
  159. data/lib/metanorma/document/components/inline/location_element.rb +24 -0
  160. data/lib/metanorma/document/components/inline/math_element.rb +2 -0
  161. data/lib/metanorma/document/components/inline/name_with_id_element.rb +4 -0
  162. data/lib/metanorma/document/components/inline/rendered_display.rb +23 -0
  163. data/lib/metanorma/document/components/inline/rendered_math_element.rb +21 -0
  164. data/lib/metanorma/document/components/inline/semantic_content.rb +51 -0
  165. data/lib/metanorma/document/components/inline/semantic_math_element.rb +20 -0
  166. data/lib/metanorma/document/components/inline/semx_child_element.rb +2 -0
  167. data/lib/metanorma/document/components/inline/semx_element.rb +12 -1
  168. data/lib/metanorma/document/components/inline/small_cap_element.rb +2 -0
  169. data/lib/metanorma/document/components/inline/span_element.rb +10 -15
  170. data/lib/metanorma/document/components/inline/stem_inline_element.rb +7 -1
  171. data/lib/metanorma/document/components/inline/strong_raw_element.rb +2 -0
  172. data/lib/metanorma/document/components/inline/sub_element.rb +2 -0
  173. data/lib/metanorma/document/components/inline/sup_element.rb +2 -0
  174. data/lib/metanorma/document/components/inline/tab_element.rb +2 -0
  175. data/lib/metanorma/document/components/inline/title_with_annotation_element.rb +4 -0
  176. data/lib/metanorma/document/components/inline/tt_element.rb +2 -0
  177. data/lib/metanorma/document/components/inline/variant_title_element.rb +2 -0
  178. data/lib/metanorma/document/components/inline/vocabulary.rb +184 -0
  179. data/lib/metanorma/document/components/inline/xref_element.rb +10 -0
  180. data/lib/metanorma/document/components/inline.rb +12 -0
  181. data/lib/metanorma/document/components/multi_paragraph/quote_author_element.rb +20 -0
  182. data/lib/metanorma/document/components/multi_paragraph/quote_block.rb +0 -29
  183. data/lib/metanorma/document/components/multi_paragraph.rb +2 -0
  184. data/lib/metanorma/document/components/reference_elements/source_element.rb +0 -31
  185. data/lib/metanorma/document/components/reference_elements/source_modification.rb +21 -0
  186. data/lib/metanorma/document/components/reference_elements/source_origin.rb +28 -0
  187. data/lib/metanorma/document/components/reference_elements.rb +2 -2
  188. data/lib/metanorma/document/components/tables/col_element.rb +18 -0
  189. data/lib/metanorma/document/components/tables/col_group_element.rb +18 -0
  190. data/lib/metanorma/document/components/tables/table_block.rb +0 -22
  191. data/lib/metanorma/document/components/tables/table_body_section.rb +16 -0
  192. data/lib/metanorma/document/components/tables/table_foot_section.rb +16 -0
  193. data/lib/metanorma/document/components/tables/table_head_section.rb +16 -0
  194. data/lib/metanorma/document/components/tables/table_section.rb +0 -25
  195. data/lib/metanorma/document/components/tables.rb +5 -3
  196. data/lib/metanorma/document/relaton/address.rb +0 -27
  197. data/lib/metanorma/document/relaton/bib_item_locality.rb +3 -12
  198. data/lib/metanorma/document/relaton/copyright_association.rb +0 -10
  199. data/lib/metanorma/document/relaton/copyright_owner.rb +16 -0
  200. data/lib/metanorma/document/relaton/edition.rb +4 -7
  201. data/lib/metanorma/document/relaton/formatted_address.rb +29 -0
  202. data/lib/metanorma/document/relaton/logo_element.rb +18 -0
  203. data/lib/metanorma/document/relaton/organization.rb +0 -14
  204. data/lib/metanorma/document/relaton/phone.rb +3 -9
  205. data/lib/metanorma/document/relaton/place_type.rb +0 -13
  206. data/lib/metanorma/document/relaton/price_type.rb +3 -9
  207. data/lib/metanorma/document/relaton/region_element.rb +18 -0
  208. data/lib/metanorma/document/relaton.rb +6 -1
  209. data/lib/metanorma/document/version.rb +1 -1
  210. data/lib/metanorma/document.rb +2 -0
  211. data/lib/metanorma/html/asset_pipeline.rb +1 -0
  212. data/lib/metanorma/html/base_renderer.rb +284 -1057
  213. data/lib/metanorma/html/bipm_renderer.rb +15 -144
  214. data/lib/metanorma/html/cc_renderer.rb +1 -45
  215. data/lib/metanorma/html/component/base.rb +2 -14
  216. data/lib/metanorma/html/component/index_section.rb +41 -43
  217. data/lib/metanorma/html/drops/admonition_drop.rb +1 -4
  218. data/lib/metanorma/html/drops/biblio_entry_drop.rb +50 -0
  219. data/lib/metanorma/html/drops/block_element_drop.rb +7 -2
  220. data/lib/metanorma/html/drops/example_drop.rb +1 -4
  221. data/lib/metanorma/html/drops/figure_drop.rb +31 -22
  222. data/lib/metanorma/html/drops/footnote_drop.rb +1 -1
  223. data/lib/metanorma/html/drops/formula_drop.rb +45 -16
  224. data/lib/metanorma/html/drops/note_drop.rb +9 -7
  225. data/lib/metanorma/html/drops/sourcecode_drop.rb +12 -5
  226. data/lib/metanorma/html/drops.rb +2 -0
  227. data/lib/metanorma/html/flavor.rb +45 -0
  228. data/lib/metanorma/html/flavor_registry.rb +49 -0
  229. data/lib/metanorma/html/generator.rb +108 -31
  230. data/lib/metanorma/html/icc_renderer.rb +0 -39
  231. data/lib/metanorma/html/iec_renderer.rb +1 -44
  232. data/lib/metanorma/html/ieee_renderer.rb +1 -45
  233. data/lib/metanorma/html/ietf_renderer.rb +1 -48
  234. data/lib/metanorma/html/iho_renderer.rb +1 -46
  235. data/lib/metanorma/html/iso_renderer.rb +290 -343
  236. data/lib/metanorma/html/itu_renderer.rb +1 -45
  237. data/lib/metanorma/html/ogc_renderer.rb +15 -76
  238. data/lib/metanorma/html/oiml_renderer.rb +18 -38
  239. data/lib/metanorma/html/pdfa_renderer.rb +0 -39
  240. data/lib/metanorma/html/renderer_delegation.rb +21 -0
  241. data/lib/metanorma/html/renderers/block_renderer.rb +372 -0
  242. data/lib/metanorma/html/renderers/element_order_traversal.rb +34 -0
  243. data/lib/metanorma/html/renderers/inline_renderer.rb +642 -0
  244. data/lib/metanorma/html/renderers/pubid_renderer.rb +47 -0
  245. data/lib/metanorma/html/renderers/section_renderer.rb +193 -0
  246. data/lib/metanorma/html/renderers.rb +10 -0
  247. data/lib/metanorma/html/ribose_renderer.rb +1 -45
  248. data/lib/metanorma/html/standard_renderer.rb +344 -230
  249. data/lib/metanorma/html/templates/_audio.html.liquid +1 -0
  250. data/lib/metanorma/html/templates/_biblio_entry.html.liquid +1 -0
  251. data/lib/metanorma/html/templates/_bipm_cover.html.liquid +27 -0
  252. data/lib/metanorma/html/templates/_boilerplate.html.liquid +1 -0
  253. data/lib/metanorma/html/templates/_bookmark.html.liquid +1 -0
  254. data/lib/metanorma/html/templates/_br.html.liquid +1 -0
  255. data/lib/metanorma/html/templates/_definition_list.html.liquid +6 -0
  256. data/lib/metanorma/html/templates/_element.html.liquid +1 -0
  257. data/lib/metanorma/html/templates/_fn_marker.html.liquid +1 -0
  258. data/lib/metanorma/html/templates/_footnotes.html.liquid +6 -6
  259. data/lib/metanorma/html/templates/_formula.html.liquid +1 -1
  260. data/lib/metanorma/html/templates/_header.html.liquid +1 -1
  261. data/lib/metanorma/html/templates/_heading.html.liquid +1 -0
  262. data/lib/metanorma/html/templates/_image.html.liquid +1 -0
  263. data/lib/metanorma/html/templates/_inline_span.html.liquid +1 -0
  264. data/lib/metanorma/html/templates/_iso_cover.html.liquid +1 -1
  265. data/lib/metanorma/html/templates/_link.html.liquid +1 -0
  266. data/lib/metanorma/html/templates/_list.html.liquid +3 -0
  267. data/lib/metanorma/html/templates/_list_item.html.liquid +1 -0
  268. data/lib/metanorma/html/templates/_main_content.html.liquid +1 -0
  269. data/lib/metanorma/html/templates/_math_container.html.liquid +1 -0
  270. data/lib/metanorma/html/templates/_paragraph.html.liquid +1 -0
  271. data/lib/metanorma/html/templates/_prefatory_section.html.liquid +1 -0
  272. data/lib/metanorma/html/templates/_pubid_identifier.html.liquid +1 -0
  273. data/lib/metanorma/html/templates/_quote.html.liquid +4 -0
  274. data/lib/metanorma/html/templates/_ref_date.html.liquid +1 -0
  275. data/lib/metanorma/html/templates/_ref_title.html.liquid +1 -0
  276. data/lib/metanorma/html/templates/_section.html.liquid +5 -0
  277. data/lib/metanorma/html/templates/_standard_cover.html.liquid +31 -0
  278. data/lib/metanorma/html/templates/_standard_doc_title.html.liquid +3 -0
  279. data/lib/metanorma/html/templates/_stem_span.html.liquid +1 -0
  280. data/lib/metanorma/html/templates/_table.html.liquid +9 -0
  281. data/lib/metanorma/html/templates/_term_domain.html.liquid +1 -0
  282. data/lib/metanorma/html/templates/_term_example.html.liquid +1 -0
  283. data/lib/metanorma/html/templates/_term_note.html.liquid +1 -0
  284. data/lib/metanorma/html/templates/_term_number.html.liquid +1 -0
  285. data/lib/metanorma/html/templates/_term_source.html.liquid +1 -0
  286. data/lib/metanorma/html/templates/_term_text_note.html.liquid +1 -0
  287. data/lib/metanorma/html/templates/_video.html.liquid +1 -0
  288. data/lib/metanorma/html/templates/_wrapped_preface.html.liquid +1 -0
  289. data/lib/metanorma/html/templates/document.html.liquid +4 -0
  290. data/lib/metanorma/html/theme.rb +180 -107
  291. data/lib/metanorma/html.rb +16 -0
  292. data/lib/metanorma/ietf_document/metadata/ietf_bib_data_extension_type.rb +0 -25
  293. data/lib/metanorma/ietf_document/metadata/pi_settings.rb +32 -0
  294. data/lib/metanorma/ietf_document/metadata.rb +2 -0
  295. data/lib/metanorma/iso_document/metadata/doctype_element.rb +20 -0
  296. data/lib/metanorma/iso_document/metadata/iso_bib_data_extension_type.rb +0 -48
  297. data/lib/metanorma/iso_document/metadata/iso_bibliographic_item.rb +0 -72
  298. data/lib/metanorma/iso_document/metadata/iso_document_status.rb +0 -30
  299. data/lib/metanorma/iso_document/metadata/iso_localized_title.rb +4 -1
  300. data/lib/metanorma/iso_document/metadata/language_element.rb +18 -0
  301. data/lib/metanorma/iso_document/metadata/project_number.rb +22 -0
  302. data/lib/metanorma/iso_document/metadata/script_element.rb +18 -0
  303. data/lib/metanorma/iso_document/metadata/stage_element.rb +26 -0
  304. data/lib/metanorma/iso_document/metadata/stagename_element.rb +18 -0
  305. data/lib/metanorma/iso_document/metadata/structured_identifier.rb +0 -17
  306. data/lib/metanorma/iso_document/metadata/title_collection.rb +1 -0
  307. data/lib/metanorma/iso_document/metadata.rb +9 -4
  308. data/lib/metanorma/iso_document/terms/iso_term.rb +0 -13
  309. data/lib/metanorma/iso_document/terms/term_domain_element.rb +18 -0
  310. data/lib/metanorma/iso_document/terms.rb +1 -0
  311. data/lib/metanorma/itu_document/metadata/itu_bib_data_extension_type.rb +0 -37
  312. data/lib/metanorma/itu_document/metadata/meeting_date.rb +18 -0
  313. data/lib/metanorma/itu_document/metadata/meeting_element.rb +18 -0
  314. data/lib/metanorma/itu_document/metadata/study_period.rb +18 -0
  315. data/lib/metanorma/itu_document/metadata.rb +3 -4
  316. data/lib/metanorma/mirror/default_registry.rb +170 -0
  317. data/lib/metanorma/mirror/handler_registry.rb +60 -0
  318. data/lib/metanorma/mirror/handler_result.rb +37 -0
  319. data/lib/metanorma/mirror/handlers/admonition.rb +18 -0
  320. data/lib/metanorma/mirror/handlers/example.rb +21 -0
  321. data/lib/metanorma/mirror/handlers/figure.rb +53 -0
  322. data/lib/metanorma/mirror/handlers/formula.rb +35 -0
  323. data/lib/metanorma/mirror/handlers/inline/catalog.rb +57 -0
  324. data/lib/metanorma/mirror/handlers/inline/rich_html_renderer.rb +159 -0
  325. data/lib/metanorma/mirror/handlers/inline/text_extractor.rb +116 -0
  326. data/lib/metanorma/mirror/handlers/inline.rb +226 -0
  327. data/lib/metanorma/mirror/handlers/list.rb +110 -0
  328. data/lib/metanorma/mirror/handlers/note.rb +26 -0
  329. data/lib/metanorma/mirror/handlers/paragraph.rb +19 -0
  330. data/lib/metanorma/mirror/handlers/quote.rb +16 -0
  331. data/lib/metanorma/mirror/handlers/review.rb +19 -0
  332. data/lib/metanorma/mirror/handlers/section.rb +149 -0
  333. data/lib/metanorma/mirror/handlers/sourcecode.rb +27 -0
  334. data/lib/metanorma/mirror/handlers/structural.rb +68 -0
  335. data/lib/metanorma/mirror/handlers/table.rb +81 -0
  336. data/lib/metanorma/mirror/handlers/term.rb +100 -0
  337. data/lib/metanorma/mirror/handlers.rb +60 -0
  338. data/lib/metanorma/mirror/id_strategy/positional.rb +166 -0
  339. data/lib/metanorma/mirror/id_strategy/preserve.rb +12 -0
  340. data/lib/metanorma/mirror/id_strategy.rb +34 -0
  341. data/lib/metanorma/mirror/math_util.rb +53 -0
  342. data/lib/metanorma/mirror/metadata.rb +37 -0
  343. data/lib/metanorma/mirror/model/container.rb +47 -0
  344. data/lib/metanorma/mirror/model/factory.rb +52 -0
  345. data/lib/metanorma/mirror/model/guide.rb +25 -0
  346. data/lib/metanorma/mirror/model/leaf.rb +17 -0
  347. data/lib/metanorma/mirror/model/mark.rb +53 -0
  348. data/lib/metanorma/mirror/model/node.rb +47 -0
  349. data/lib/metanorma/mirror/model/soft_break.rb +33 -0
  350. data/lib/metanorma/mirror/model/text.rb +34 -0
  351. data/lib/metanorma/mirror/model.rb +16 -0
  352. data/lib/metanorma/mirror/output/builder.rb +39 -0
  353. data/lib/metanorma/mirror/output/formats/base_format.rb +90 -0
  354. data/lib/metanorma/mirror/output/formats/inline_format.rb +81 -0
  355. data/lib/metanorma/mirror/output/formats.rb +53 -0
  356. data/lib/metanorma/mirror/output/html_renderer.rb +95 -0
  357. data/lib/metanorma/mirror/output/html_renderers/block_renderers.rb +178 -0
  358. data/lib/metanorma/mirror/output/html_renderers/inline_renderer.rb +61 -0
  359. data/lib/metanorma/mirror/output/html_renderers/list_renderers.rb +96 -0
  360. data/lib/metanorma/mirror/output/html_renderers/mark_renderers.rb +41 -0
  361. data/lib/metanorma/mirror/output/html_renderers/section_renderers.rb +129 -0
  362. data/lib/metanorma/mirror/output/html_renderers/structural_renderers.rb +80 -0
  363. data/lib/metanorma/mirror/output/html_renderers/table_renderers.rb +87 -0
  364. data/lib/metanorma/mirror/output/html_renderers.rb +76 -0
  365. data/lib/metanorma/mirror/output/pipeline.rb +92 -0
  366. data/lib/metanorma/mirror/output/pipeline_context.rb +22 -0
  367. data/lib/metanorma/mirror/output.rb +14 -0
  368. data/lib/metanorma/mirror/rewriter.rb +121 -0
  369. data/lib/metanorma/mirror/safe_attr.rb +16 -0
  370. data/lib/metanorma/mirror/serialization/json_serializer.rb +25 -0
  371. data/lib/metanorma/mirror/serialization/yaml_serializer.rb +20 -0
  372. data/lib/metanorma/mirror/serialization.rb +10 -0
  373. data/lib/metanorma/mirror/transformer.rb +110 -0
  374. data/lib/metanorma/mirror.rb +31 -0
  375. data/lib/metanorma/standard_document/annotation.rb +37 -0
  376. data/lib/metanorma/standard_document/block_attributes.rb +15 -2
  377. data/lib/metanorma/standard_document/blocks/block_source.rb +0 -23
  378. data/lib/metanorma/standard_document/blocks/source_origin_element.rb +23 -0
  379. data/lib/metanorma/standard_document/blocks.rb +1 -1
  380. data/lib/metanorma/standard_document/terms/term_expression.rb +0 -31
  381. data/lib/metanorma/standard_document/terms/term_name_element.rb +29 -0
  382. data/lib/metanorma/standard_document/terms.rb +1 -0
  383. data/script/render_both.rb +18 -0
  384. metadata +272 -13
  385. data/.github/workflows/rake.yml +0 -21
  386. data/.github/workflows/release.yml +0 -25
  387. data/.github/workflows/roundtrip-samples.yml +0 -132
  388. data/.gitignore +0 -19
  389. data/.rspec +0 -3
  390. data/.rubocop.yml +0 -22
  391. data/Gemfile +0 -28
  392. data/bin/console +0 -15
  393. data/bin/setup +0 -8
  394. data/metanorma-document.gemspec +0 -35
@@ -8,15 +8,17 @@ module Metanorma
8
8
  id = renderer.safe_attr(note, :id)
9
9
  label = renderer.extract_block_label(note, "NOTE")
10
10
 
11
- content_html = renderer.capture_output do
12
- if note.content && !note.content.empty?
13
- note.content.each { |para| renderer.render_paragraph(para) }
14
- else
15
- renderer.render_mixed_inline(note)
11
+ content_parts = []
12
+ if note.content && !note.content.empty?
13
+ note.content.each do |para|
14
+ content_parts << (renderer.render_paragraph(para) || "")
16
15
  end
17
- renderer.render_block_children(note,
18
- children: BaseRenderer::NOTE_CHILDREN)
16
+ else
17
+ inline = renderer.render_mixed_inline(note)
18
+ content_parts << inline if inline
19
19
  end
20
+ content_parts << (renderer.render_note_children(note) || "")
21
+ content_html = content_parts.join
20
22
 
21
23
  new(
22
24
  id: id,
@@ -6,20 +6,27 @@ module Metanorma
6
6
  class SourcecodeDrop < BlockElementDrop
7
7
  attr_reader :lang, :name_html, :code_html
8
8
 
9
+ def initialize(id: nil, lang: nil, name_html: nil, code_html: nil,
10
+ css_class: nil)
11
+ @id = id
12
+ @lang = lang
13
+ @name_html = name_html
14
+ @code_html = code_html
15
+ @css_class = css_class
16
+ end
17
+
9
18
  def self.from_model(sc, renderer:)
10
19
  id = renderer.safe_attr(sc, :id)
11
20
  lang = renderer.safe_attr(sc, :lang)
12
21
 
13
22
  name_html = if sc.name
14
- renderer.capture_output do
15
- renderer.render_inline_element(sc.name)
16
- end
23
+ renderer.render_inline_element(sc.name)
17
24
  end
18
25
 
19
26
  code_text = if sc.body&.content
20
- sc.body.content
27
+ Array(sc.body.content).join
21
28
  elsif sc.content
22
- sc.content
29
+ Array(sc.content).join
23
30
  else
24
31
  ""
25
32
  end
@@ -14,6 +14,8 @@ module Metanorma
14
14
  autoload :TocEntryDrop, "metanorma/html/drops/toc_entry_drop"
15
15
  autoload :FigureListEntryDrop,
16
16
  "metanorma/html/drops/figure_list_entry_drop"
17
+ autoload :BiblioEntryDrop,
18
+ "metanorma/html/drops/biblio_entry_drop"
17
19
  end
18
20
  end
19
21
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metanorma
4
+ module Html
5
+ # A flavor ties together the four concepts that identify a Metanorma
6
+ # document variant:
7
+ # - a symbolic name (used for theme loading, CSS class names)
8
+ # - a model class (the typed root class for the flavor)
9
+ # - a renderer class (the HTML renderer that handles the flavor)
10
+ # - an optional Pubid module (for parsing identifiers like ISO/IEC/etc.)
11
+ #
12
+ # Flavor centralizes flavor identity so BaseRenderer, PubidRenderer,
13
+ # and Generator all read from the same source of truth. Adding a new
14
+ # flavor is one Flavor entry in the registry, not three coordinated
15
+ # edits across three files.
16
+ class Flavor
17
+ attr_reader :name, :model_class, :renderer_class, :pubid_module
18
+
19
+ def initialize(name:, model_class:, renderer_class:, pubid_module: nil)
20
+ @name = name
21
+ @model_class = model_class
22
+ @renderer_class = renderer_class
23
+ @pubid_module = pubid_module
24
+ end
25
+
26
+ # Match by ancestry: a document whose class is the flavor's model
27
+ # class, or any descendant of it, belongs to this flavor. Walks
28
+ # parent classes via is_a? to support subclassing.
29
+ def matches?(document_class)
30
+ return false unless document_class.is_a?(Class)
31
+
32
+ # `<=` returns nil for unrelated classes; coerce to boolean.
33
+ !!(document_class <= model_class)
34
+ end
35
+
36
+ def pubid_module_const
37
+ return nil unless pubid_module
38
+
39
+ Object.const_get(pubid_module.to_s)
40
+ rescue NameError
41
+ nil
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metanorma
4
+ module Html
5
+ # Registry of known flavors. Queried by:
6
+ # - Generator — to pick the renderer for a document
7
+ # - BaseRenderer — to resolve flavor_name for theme loading
8
+ # - PubidRenderer — to resolve the Pubid module
9
+ #
10
+ # Single source of truth for flavor identity. Adding a flavor is
11
+ # one Flavor entry via #register.
12
+ class FlavorRegistry
13
+ include Enumerable
14
+
15
+ def initialize
16
+ @flavors = []
17
+ end
18
+
19
+ def register(flavor)
20
+ @flavors << flavor
21
+ self
22
+ end
23
+
24
+ def each(&)
25
+ @flavors.each(&)
26
+ end
27
+
28
+ # Returns the most-specific Flavor whose model_class matches the
29
+ # given document class (by ancestry). Most-specific = registered
30
+ # last. We scan in reverse so general flavors (registered first)
31
+ # only match if no more specific flavor does.
32
+ def find_for(document_class)
33
+ @flavors.reverse_each.find { |f| f.matches?(document_class) }
34
+ end
35
+
36
+ def name_for(document_class)
37
+ find_for(document_class)&.name
38
+ end
39
+
40
+ def renderer_for(document_class)
41
+ find_for(document_class)&.renderer_class
42
+ end
43
+
44
+ def pubid_module_for(document_class)
45
+ find_for(document_class)&.pubid_module_const
46
+ end
47
+ end
48
+ end
49
+ end
@@ -3,39 +3,39 @@
3
3
  module Metanorma
4
4
  module Html
5
5
  class Generator
6
- @renderers = []
7
6
  @tastes = []
8
7
  @setup = false
9
8
 
10
9
  class << self
11
- def register(model_class, renderer_class)
12
- @renderers << [model_class, renderer_class]
10
+ # Returns the full FlavorRegistry built from setup!. Read-only
11
+ # access for BaseRenderer, PubidRenderer, and any consumer that
12
+ # needs flavor identity.
13
+ def flavors
14
+ setup! unless @setup
15
+ @flavors
13
16
  end
14
17
 
15
- # Register a taste: same document model, different renderer based on publisher.
16
- # When the document's first author publisher abbreviation matches,
17
- # the taste renderer takes precedence over the model-based renderer.
18
+ # Register a taste: same document model, different renderer based
19
+ # on publisher. When the document's first author publisher
20
+ # abbreviation matches, the taste renderer takes precedence over
21
+ # the model-based renderer.
18
22
  def register_taste(model_class, publisher_abbrev, renderer_class)
19
23
  @tastes << [model_class, publisher_abbrev, renderer_class]
20
24
  end
21
25
 
22
- def generate(document, **_options)
26
+ def generate(document, **)
23
27
  setup! unless @setup
24
- renderer_for(document).new.generate_full_document(document)
28
+ renderer_for(document).new.generate_full_document(document, **)
25
29
  end
26
30
 
27
31
  def renderer_for(document)
28
32
  setup! unless @setup
29
33
 
30
- # Check tastes first (publisher-based dispatch)
31
34
  taste_renderer = find_taste(document)
32
35
  return taste_renderer if taste_renderer
33
36
 
34
- # Fall back to model-based dispatch (most specific last)
35
- @renderers.reverse_each do |model_class, renderer_class|
36
- return renderer_class if document.is_a?(model_class)
37
- end
38
- BaseRenderer
37
+ flavor = @flavors.find_for(document.class)
38
+ flavor&.renderer_class || BaseRenderer
39
39
  end
40
40
 
41
41
  private
@@ -79,6 +79,7 @@ module Metanorma
79
79
  return if @setup
80
80
 
81
81
  @setup = true
82
+ @flavors = build_flavor_registry
82
83
 
83
84
  # Trigger autoloads by referencing constants
84
85
  BaseRenderer
@@ -97,27 +98,103 @@ module Metanorma
97
98
  PdfaRenderer
98
99
  RiboseRenderer
99
100
 
100
- # Register renderers (most general first, most specific last)
101
- register Metanorma::Document::Root, BaseRenderer
102
- register Metanorma::StandardDocument::Root, StandardRenderer
103
- register Metanorma::IsoDocument::Root, IsoRenderer
104
- register Metanorma::BipmDocument::Root, BipmRenderer
105
- register Metanorma::CcDocument::Root, CcRenderer
106
- register Metanorma::IecDocument::Root, IecRenderer
107
- register Metanorma::IeeeDocument::Root, IeeeRenderer
108
- register Metanorma::IetfDocument::Root, IetfRenderer
109
- register Metanorma::IhoDocument::Root, IhoRenderer
110
- register Metanorma::ItuDocument::Root, ItuRenderer
111
- register Metanorma::OgcDocument::Root, OgcRenderer
112
- register Metanorma::OimlDocument::Root, OimlRenderer
113
- register Metanorma::RiboseDocument::Root, RiboseRenderer
114
-
115
101
  # Register tastes (publisher-based dispatch within same model)
116
- register_taste Metanorma::IsoDocument::Root, "ICC",
117
- IccRenderer
102
+ register_taste Metanorma::IsoDocument::Root, "ICC", IccRenderer
118
103
  register_taste Metanorma::RiboseDocument::Root, "PDF Association",
119
104
  PdfaRenderer
120
105
  end
106
+
107
+ # Single source of truth for flavor identity. Each Flavor ties
108
+ # together the model class, the renderer, the symbolic name, and
109
+ # (if applicable) the Pubid module. Adding a new flavor = one
110
+ # entry here.
111
+ def build_flavor_registry
112
+ FlavorRegistry.new.tap do |registry|
113
+ registry.register(Flavor.new(
114
+ name: nil,
115
+ model_class: Metanorma::Document::Root,
116
+ renderer_class: BaseRenderer,
117
+ ))
118
+ registry.register(Flavor.new(
119
+ name: nil,
120
+ model_class: Metanorma::StandardDocument::Root,
121
+ renderer_class: StandardRenderer,
122
+ ))
123
+ registry.register(Flavor.new(
124
+ name: :iso,
125
+ model_class: Metanorma::IsoDocument::Root,
126
+ renderer_class: IsoRenderer,
127
+ pubid_module: :"Pubid::Iso",
128
+ ))
129
+ registry.register(Flavor.new(
130
+ name: :bipm,
131
+ model_class: Metanorma::BipmDocument::Root,
132
+ renderer_class: BipmRenderer,
133
+ ))
134
+ registry.register(Flavor.new(
135
+ name: :cc,
136
+ model_class: Metanorma::CcDocument::Root,
137
+ renderer_class: CcRenderer,
138
+ ))
139
+ registry.register(Flavor.new(
140
+ name: :iec,
141
+ model_class: Metanorma::IecDocument::Root,
142
+ renderer_class: IecRenderer,
143
+ pubid_module: :"Pubid::Iec",
144
+ ))
145
+ registry.register(Flavor.new(
146
+ name: :ieee,
147
+ model_class: Metanorma::IeeeDocument::Root,
148
+ renderer_class: IeeeRenderer,
149
+ pubid_module: :"Pubid::Ieee",
150
+ ))
151
+ registry.register(Flavor.new(
152
+ name: :ietf,
153
+ model_class: Metanorma::IetfDocument::Root,
154
+ renderer_class: IetfRenderer,
155
+ ))
156
+ registry.register(Flavor.new(
157
+ name: :iho,
158
+ model_class: Metanorma::IhoDocument::Root,
159
+ renderer_class: IhoRenderer,
160
+ pubid_module: :"Pubid::Iho",
161
+ ))
162
+ registry.register(Flavor.new(
163
+ name: :itu,
164
+ model_class: Metanorma::ItuDocument::Root,
165
+ renderer_class: ItuRenderer,
166
+ pubid_module: :"Pubid::Ithu",
167
+ ))
168
+ registry.register(Flavor.new(
169
+ name: :ogc,
170
+ model_class: Metanorma::OgcDocument::Root,
171
+ renderer_class: OgcRenderer,
172
+ ))
173
+ registry.register(Flavor.new(
174
+ name: :oiml,
175
+ model_class: Metanorma::OimlDocument::Root,
176
+ renderer_class: OimlRenderer,
177
+ pubid_module: :"Pubid::Oiml",
178
+ ))
179
+ registry.register(Flavor.new(
180
+ name: :pdfa,
181
+ model_class: Metanorma::RiboseDocument::Root,
182
+ renderer_class: PdfaRenderer,
183
+ ))
184
+ registry.register(Flavor.new(
185
+ name: :ribose,
186
+ model_class: Metanorma::RiboseDocument::Root,
187
+ renderer_class: RiboseRenderer,
188
+ ))
189
+ end
190
+ end
191
+
192
+ def safe_attr(node, attr_name)
193
+ return nil unless node.is_a?(Lutaml::Model::Serializable)
194
+ return nil unless node.class.attributes.key?(attr_name)
195
+
196
+ node.public_send(attr_name)
197
+ end
121
198
  end
122
199
  end
123
200
  end
@@ -5,45 +5,6 @@ module Metanorma
5
5
  # Renders ICC (International Color Consortium) taste documents to HTML.
6
6
  # ICC brand: color management — dark charcoal + steel blue + warm gray
7
7
  class IccRenderer < IsoRenderer
8
- def flavor_publishers(_doc_id)
9
- ["ICC"]
10
- end
11
-
12
- def flavor_publisher_name
13
- "ICC"
14
- end
15
-
16
- def publisher_logo_map
17
- {}
18
- end
19
-
20
- def theme
21
- @theme ||= Theme.new.tap do |t|
22
- t.primary = "#3a3f47"
23
- t.accent = "#4a90c4"
24
- t.accent_deep = "#3a78a8"
25
- t.gradient = "linear-gradient(135deg, #2a2e34 0%, #3a3f47 50%, #4a5464 100%)"
26
- t.primary_light = "#eef0f2"
27
- t.accent_light = "#e4eef6"
28
- t.warm = "#c4956a"
29
- t.warm_light = "#faf3ec"
30
- t.header_background = "linear-gradient(135deg, #2a2e34 0%, #3a3f47 40%, #4a5464 100%)"
31
- t.cover_background = "linear-gradient(175deg, #1e2126 0%, #2a2e34 25%, #3a3f47 55%, #4a5464 85%, #4a90c4 100%)"
32
- t.cover_before_bg = "background: radial-gradient(ellipse at 30% 20%, rgba(74,144,196,0.15) 0%, transparent 50%), radial-gradient(ellipse at 70% 80%, rgba(196,149,106,0.1) 0%, transparent 40%)"
33
- t.cover_after_bg = "height: 3px; background: linear-gradient(90deg, transparent, #4a90c4, #c4956a, transparent)"
34
- t.progress_bar_color = "#4a90c4"
35
- t.note_border = "#4a90c4"
36
- t.note_bg = "#e4eef6"
37
- t.note_color = "#4a90c4"
38
- t.example_border = "#3a3f47"
39
- t.example_bg = "#eef0f2"
40
- t.example_color = "#3a3f47"
41
- t.admonition_border = "#c4956a"
42
- t.admonition_color = "#c4956a"
43
- t.footer_border_color = "#4a90c4"
44
- t.cover_separator_color = "rgba(74,144,196,0.25)"
45
- end
46
- end
47
8
  end
48
9
  end
49
10
  end
@@ -2,51 +2,8 @@
2
2
 
3
3
  module Metanorma
4
4
  module Html
5
- # IEC brand: #0061a9 blue from logo
6
5
  class IecRenderer < IsoRenderer
7
- def flavor_publishers(_doc_id)
8
- ["IEC"]
9
- end
10
-
11
- def flavor_publisher_name
12
- "IEC"
13
- end
14
-
15
- def publisher_logo_map
16
- { "IEC" => "iec-logo.svg" }
17
- end
18
-
19
- def theme
20
- @theme ||= Theme.new.tap do |t|
21
- t.font_body = '"Crimson Pro", "Georgia", "Times New Roman", serif'
22
- t.font_sans = '"IBM Plex Sans", "Helvetica Neue", Arial, sans-serif'
23
- t.font_mono = '"IBM Plex Mono", "Fira Code", monospace'
24
- t.font_url = "https://fonts.googleapis.com/css2?family=Crimson+Pro:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap"
25
- t.primary = "#004a83"
26
- t.accent = "#0061a9"
27
- t.accent_deep = "#004a83"
28
- t.gradient = "linear-gradient(135deg, #00305a 0%, #004a83 50%, #0061a9 100%)"
29
- t.primary_light = "#ebf3f9"
30
- t.accent_light = "#d9ecf7"
31
- t.warm = "#d4a017"
32
- t.warm_light = "#fdf6e8"
33
- t.header_background = "linear-gradient(135deg, #00305a 0%, #004a83 40%, #0061a9 100%)"
34
- t.cover_background = "linear-gradient(175deg, #001f3d 0%, #00305a 25%, #004a83 55%, #0061a9 85%, #3391c4 100%)"
35
- t.cover_before_bg = "background: radial-gradient(ellipse at 20% 10%, rgba(0,97,169,0.2) 0%, transparent 50%), radial-gradient(ellipse at 80% 90%, rgba(212,160,23,0.1) 0%, transparent 40%)"
36
- t.cover_after_bg = "height: 3px; background: linear-gradient(90deg, transparent, #0061a9, #d4a017, transparent)"
37
- t.progress_bar_color = "#0061a9"
38
- t.note_border = "#0061a9"
39
- t.note_bg = "#d9ecf7"
40
- t.note_color = "#0061a9"
41
- t.example_border = "#004a83"
42
- t.example_bg = "#ebf3f9"
43
- t.example_color = "#004a83"
44
- t.admonition_border = "#d4a017"
45
- t.admonition_color = "#b8860b"
46
- t.footer_border_color = "#0061a9"
47
- t.cover_separator_color = "rgba(0,97,169,0.25)"
48
- end
49
- end
6
+ register_render Metanorma::IecDocument::Root, :render_document
50
7
  end
51
8
  end
52
9
  end
@@ -2,52 +2,8 @@
2
2
 
3
3
  module Metanorma
4
4
  module Html
5
- # Renders IeeeDocument components to HTML.
6
- # Extends IsoRenderer with IEEE branding.
7
5
  class IeeeRenderer < IsoRenderer
8
- def flavor_publishers(_doc_id)
9
- ["IEEE"]
10
- end
11
-
12
- def flavor_publisher_name
13
- "IEEE"
14
- end
15
-
16
- def publisher_logo_map
17
- {}
18
- end
19
-
20
- def theme
21
- @theme ||= Theme.new.tap do |t|
22
- t.font_body = '"Source Serif 4", "Georgia", serif'
23
- t.font_sans = '"IBM Plex Sans", "Helvetica Neue", Arial, sans-serif'
24
- t.font_mono = '"IBM Plex Mono", "Fira Code", monospace'
25
- t.font_url = "https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,300..700;1,8..60,300..700&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap"
26
- t.primary = "#006699"
27
- t.accent = "#0099cc"
28
- t.accent_deep = "#007ab3"
29
- t.gradient = "linear-gradient(135deg, #003d5c 0%, #006699 50%, #0099cc 100%)"
30
- t.primary_light = "#edf5fa"
31
- t.accent_light = "#e0f2fc"
32
- t.warm = "#c9982e"
33
- t.warm_light = "#fdf8ec"
34
- t.header_background = "linear-gradient(135deg, #003d5c 0%, #006699 50%, #0099cc 100%)"
35
- t.cover_background = "linear-gradient(175deg, #002640 0%, #003d5c 30%, #006699 65%, #0099cc 100%)"
36
- t.cover_before_bg = "background: radial-gradient(ellipse at 25% 15%, rgba(0,153,204,0.2) 0%, transparent 50%), radial-gradient(ellipse at 75% 85%, rgba(201,152,46,0.15) 0%, transparent 40%)"
37
- t.cover_after_bg = "height: 3px; background: linear-gradient(90deg, transparent, #c9982e, transparent)"
38
- t.progress_bar_color = "#0099cc"
39
- t.note_border = "#0099cc"
40
- t.note_bg = "#e0f2fc"
41
- t.note_color = "#0099cc"
42
- t.example_border = "#006699"
43
- t.example_bg = "#edf5fa"
44
- t.example_color = "#006699"
45
- t.admonition_border = "#c9982e"
46
- t.admonition_color = "#c9982e"
47
- t.footer_border_color = "#0099cc"
48
- t.cover_separator_color = "rgba(0,153,204,0.25)"
49
- end
50
- end
6
+ register_render Metanorma::IeeeDocument::Root, :render_document
51
7
  end
52
8
  end
53
9
  end
@@ -2,55 +2,8 @@
2
2
 
3
3
  module Metanorma
4
4
  module Html
5
- # Renders IetfDocument components to HTML.
6
- # Extends IsoRenderer with IETF/RFC branding.
7
5
  class IetfRenderer < IsoRenderer
8
- def flavor_publishers(_doc_id)
9
- ["IETF"]
10
- end
11
-
12
- def flavor_publisher_name
13
- "IETF"
14
- end
15
-
16
- def publisher_logo_map
17
- {}
18
- end
19
-
20
- def theme
21
- @theme ||= Theme.new.tap do |t|
22
- t.primary = "#333"
23
- t.accent = "#c44536"
24
- t.accent_deep = "#a3362b"
25
- t.gradient = "linear-gradient(135deg, #1a1a1a 0%, #333 50%, #4d4d4d 100%)"
26
- t.primary_light = "#f5f5f5"
27
- t.accent_light = "#fdf0ee"
28
- t.warm = "#c9982e"
29
- t.warm_light = "#fdf8ec"
30
- t.font_body = '"Roboto Slab", "Georgia", serif'
31
- t.font_sans = '"Inter", "Helvetica Neue", Arial, sans-serif'
32
- t.font_mono = '"JetBrains Mono", "Fira Code", monospace'
33
- t.font_url = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Roboto+Slab:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
34
- t.header_background = "linear-gradient(135deg, #1a1a1a 0%, #333 50%, #4d4d4d 100%)"
35
- t.cover_background = "linear-gradient(175deg, #0d0d0d 0%, #1a1a1a 30%, #333 65%, #4d4d4d 100%)"
36
- t.cover_before_bg = "background: radial-gradient(ellipse at 30% 20%, rgba(196,69,54,0.15) 0%, transparent 50%), radial-gradient(ellipse at 70% 80%, rgba(77,77,77,0.2) 0%, transparent 40%)"
37
- t.cover_after_bg = "height: 2px; background: linear-gradient(90deg, transparent, #c44536, transparent)"
38
- t.progress_bar_color = "#c44536"
39
- t.note_border = "#c44536"
40
- t.note_bg = "#fdf0ee"
41
- t.note_color = "#c44536"
42
- t.example_border = "#333"
43
- t.example_bg = "#f5f5f5"
44
- t.example_color = "#333"
45
- t.admonition_border = "#c9982e"
46
- t.admonition_color = "#c9982e"
47
- t.footer_border_color = "#c44536"
48
- t.cover_separator_color = "rgba(196,69,54,0.25)"
49
- t.extra_css = <<~CSS
50
- .sourcecode pre { background: #1a1a1a; border-color: #333; color: #e0e0e0; }
51
- CSS
52
- end
53
- end
6
+ register_render Metanorma::IetfDocument::Root, :render_document
54
7
  end
55
8
  end
56
9
  end
@@ -2,53 +2,8 @@
2
2
 
3
3
  module Metanorma
4
4
  module Html
5
- # IHO brand: #00AAA9 teal + #05164D navy + #FEDC5B gold from logo
6
5
  class IhoRenderer < IsoRenderer
7
- def flavor_publishers(_doc_id)
8
- ["IHO"]
9
- end
10
-
11
- def flavor_publisher_name
12
- "IHO"
13
- end
14
-
15
- def publisher_logo_map
16
- { "IHO" => "iho-logo.svg" }
17
- end
18
-
19
- def theme
20
- @theme ||= Theme.new.tap do |t|
21
- t.primary = "#05164D"
22
- t.accent = "#00AAA9"
23
- t.accent_deep = "#008887"
24
- t.gradient = "linear-gradient(135deg, #03103a 0%, #05164D 50%, #00AAA9 100%)"
25
- t.primary_light = "#eaf5f5"
26
- t.accent_light = "#e0f7f6"
27
- t.warm = "#FEDC5B"
28
- t.warm_light = "#fff9e6"
29
- t.sidebar_bg = "#f0f5f8"
30
- t.font_body = '"Source Serif 4", "Georgia", serif'
31
- t.font_sans = '"Source Sans 3", "Helvetica Neue", Arial, sans-serif'
32
- t.font_mono = '"Source Code Pro", "Menlo", monospace'
33
- t.font_url = "https://fonts.googleapis.com/css2?family=Source+Sans+3:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Source+Serif+4:ital,wght@0,400;0,500;0,600;1,400&family=Source+Code+Pro:wght@400;500&display=swap"
34
- t.header_background = "linear-gradient(135deg, #03103a 0%, #05164D 40%, #00AAA9 100%)"
35
- t.cover_background = "linear-gradient(175deg, #020a20 0%, #03103a 25%, #05164D 55%, #008887 85%, #00AAA9 100%)"
36
- t.cover_before_bg = "background: radial-gradient(ellipse at 30% 20%, rgba(0,170,169,0.2) 0%, transparent 50%), radial-gradient(ellipse at 70% 80%, rgba(254,220,91,0.1) 0%, transparent 40%)"
37
- t.cover_after_bg = "height: 4px; background: linear-gradient(90deg, #00AAA9, #05164D, #FEDC5B, #00AAA9)"
38
- t.progress_bar_color = "#00AAA9"
39
- t.note_border = "#00AAA9"
40
- t.note_bg = "#e0f7f6"
41
- t.note_color = "#00AAA9"
42
- t.example_border = "#05164D"
43
- t.example_bg = "#eaf5f5"
44
- t.example_color = "#008887"
45
- t.admonition_border = "#FEDC5B"
46
- t.admonition_bg = "#fff9e6"
47
- t.admonition_color = "#b8860b"
48
- t.footer_border_color = "#00AAA9"
49
- t.cover_separator_color = "rgba(0,170,169,0.3)"
50
- end
51
- end
6
+ register_render Metanorma::IhoDocument::Root, :render_document
52
7
  end
53
8
  end
54
9
  end