coradoc-html 1.1.7 → 1.1.14

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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/lib/coradoc/html/config.rb +36 -12
  3. data/lib/coradoc/html/converter_base.rb +26 -68
  4. data/lib/coradoc/html/drop/annotation_drop.rb +31 -0
  5. data/lib/coradoc/html/drop/base.rb +72 -0
  6. data/lib/coradoc/html/drop/bibliography_drop.rb +15 -0
  7. data/lib/coradoc/html/drop/bibliography_entry_drop.rb +24 -0
  8. data/lib/coradoc/html/drop/block_drop.rb +69 -0
  9. data/lib/coradoc/html/drop/definition_item_drop.rb +36 -0
  10. data/lib/coradoc/html/drop/definition_list_drop.rb +15 -0
  11. data/lib/coradoc/html/drop/document_drop.rb +52 -0
  12. data/lib/coradoc/html/drop/drop_factory.rb +72 -0
  13. data/lib/coradoc/html/drop/footnote_drop.rb +24 -0
  14. data/lib/coradoc/html/drop/image_drop.rb +35 -0
  15. data/lib/coradoc/html/drop/inline_element_drop.rb +64 -0
  16. data/lib/coradoc/html/drop/list_block_drop.rb +23 -0
  17. data/lib/coradoc/html/drop/list_item_drop.rb +20 -0
  18. data/lib/coradoc/html/drop/table_cell_drop.rb +35 -0
  19. data/lib/coradoc/html/drop/table_drop.rb +15 -0
  20. data/lib/coradoc/html/drop/table_row_drop.rb +23 -0
  21. data/lib/coradoc/html/drop/term_drop.rb +24 -0
  22. data/lib/coradoc/html/drop/text_content_drop.rb +15 -0
  23. data/lib/coradoc/html/drop/toc_drop.rb +15 -0
  24. data/lib/coradoc/html/drop/toc_entry_drop.rb +32 -0
  25. data/lib/coradoc/html/drop.rb +18 -0
  26. data/lib/coradoc/html/escape.rb +29 -0
  27. data/lib/coradoc/html/input/cleaner.rb +4 -33
  28. data/lib/coradoc/html/input/config.rb +4 -3
  29. data/lib/coradoc/html/input/converters/a.rb +8 -19
  30. data/lib/coradoc/html/input/converters/aside.rb +4 -5
  31. data/lib/coradoc/html/input/converters/audio.rb +6 -35
  32. data/lib/coradoc/html/input/converters/base.rb +29 -27
  33. data/lib/coradoc/html/input/converters/blockquote.rb +4 -2
  34. data/lib/coradoc/html/input/converters/br.rb +4 -4
  35. data/lib/coradoc/html/input/converters/bypass.rb +68 -67
  36. data/lib/coradoc/html/input/converters/code.rb +7 -5
  37. data/lib/coradoc/html/input/converters/div.rb +4 -4
  38. data/lib/coradoc/html/input/converters/dl.rb +3 -25
  39. data/lib/coradoc/html/input/converters/drop.rb +13 -13
  40. data/lib/coradoc/html/input/converters/em.rb +5 -3
  41. data/lib/coradoc/html/input/converters/figure.rb +3 -26
  42. data/lib/coradoc/html/input/converters/h.rb +9 -11
  43. data/lib/coradoc/html/input/converters/head.rb +5 -4
  44. data/lib/coradoc/html/input/converters/hr.rb +4 -5
  45. data/lib/coradoc/html/input/converters/img.rb +4 -9
  46. data/lib/coradoc/html/input/converters/li.rb +3 -1
  47. data/lib/coradoc/html/input/converters/mark.rb +3 -1
  48. data/lib/coradoc/html/input/converters/markup.rb +4 -8
  49. data/lib/coradoc/html/input/converters/math.rb +7 -14
  50. data/lib/coradoc/html/input/converters/media_base.rb +50 -0
  51. data/lib/coradoc/html/input/converters/ol.rb +6 -8
  52. data/lib/coradoc/html/input/converters/p.rb +43 -34
  53. data/lib/coradoc/html/input/converters/pass_through.rb +2 -4
  54. data/lib/coradoc/html/input/converters/positional_formatting.rb +37 -0
  55. data/lib/coradoc/html/input/converters/pre.rb +3 -3
  56. data/lib/coradoc/html/input/converters/q.rb +6 -3
  57. data/lib/coradoc/html/input/converters/strong.rb +4 -2
  58. data/lib/coradoc/html/input/converters/sub.rb +5 -23
  59. data/lib/coradoc/html/input/converters/sup.rb +5 -23
  60. data/lib/coradoc/html/input/converters/table.rb +3 -1
  61. data/lib/coradoc/html/input/converters/td.rb +4 -30
  62. data/lib/coradoc/html/input/converters/text.rb +4 -3
  63. data/lib/coradoc/html/input/converters/tr.rb +3 -2
  64. data/lib/coradoc/html/input/converters/video.rb +12 -36
  65. data/lib/coradoc/html/input/converters.rb +55 -70
  66. data/lib/coradoc/html/input/html_converter.rb +2 -74
  67. data/lib/coradoc/html/input/plugin.rb +8 -57
  68. data/lib/coradoc/html/input/plugins/plateau.rb +4 -19
  69. data/lib/coradoc/html/input/postprocessor.rb +3 -9
  70. data/lib/coradoc/html/input.rb +26 -8
  71. data/lib/coradoc/html/layout_renderer.rb +163 -0
  72. data/lib/coradoc/html/output.rb +6 -12
  73. data/lib/coradoc/html/renderer.rb +86 -357
  74. data/lib/coradoc/html/section_numberable.rb +9 -0
  75. data/lib/coradoc/html/spa.rb +29 -270
  76. data/lib/coradoc/html/static.rb +29 -238
  77. data/lib/coradoc/html/template_caching.rb +31 -0
  78. data/lib/coradoc/html/template_config.rb +11 -70
  79. data/lib/coradoc/html/template_helpers.rb +39 -31
  80. data/lib/coradoc/html/template_locator.rb +17 -11
  81. data/lib/coradoc/html/theme.rb +1 -7
  82. data/lib/coradoc/html/title_text.rb +57 -0
  83. data/lib/coradoc/html/toc_builder.rb +112 -0
  84. data/lib/coradoc/html/toc_serializer.rb +31 -0
  85. data/lib/coradoc/html/transform/from_core_model.rb +13 -12
  86. data/lib/coradoc/html/transform/to_core_model.rb +10 -12
  87. data/lib/coradoc/html/version.rb +1 -1
  88. data/lib/coradoc/html.rb +41 -88
  89. metadata +38 -70
  90. data/lib/coradoc/html/base.rb +0 -157
  91. data/lib/coradoc/html/converters/admonition.rb +0 -180
  92. data/lib/coradoc/html/converters/attribute.rb +0 -68
  93. data/lib/coradoc/html/converters/attribute_reference.rb +0 -60
  94. data/lib/coradoc/html/converters/audio.rb +0 -165
  95. data/lib/coradoc/html/converters/base.rb +0 -615
  96. data/lib/coradoc/html/converters/bibliography.rb +0 -82
  97. data/lib/coradoc/html/converters/bibliography_entry.rb +0 -108
  98. data/lib/coradoc/html/converters/block_image.rb +0 -72
  99. data/lib/coradoc/html/converters/bold.rb +0 -34
  100. data/lib/coradoc/html/converters/break.rb +0 -32
  101. data/lib/coradoc/html/converters/comment_block.rb +0 -42
  102. data/lib/coradoc/html/converters/comment_line.rb +0 -54
  103. data/lib/coradoc/html/converters/cross_reference.rb +0 -59
  104. data/lib/coradoc/html/converters/document.rb +0 -108
  105. data/lib/coradoc/html/converters/example.rb +0 -114
  106. data/lib/coradoc/html/converters/highlight.rb +0 -34
  107. data/lib/coradoc/html/converters/include.rb +0 -68
  108. data/lib/coradoc/html/converters/inline_image.rb +0 -41
  109. data/lib/coradoc/html/converters/italic.rb +0 -34
  110. data/lib/coradoc/html/converters/line_break.rb +0 -31
  111. data/lib/coradoc/html/converters/link.rb +0 -46
  112. data/lib/coradoc/html/converters/list_item.rb +0 -75
  113. data/lib/coradoc/html/converters/listing.rb +0 -99
  114. data/lib/coradoc/html/converters/literal.rb +0 -102
  115. data/lib/coradoc/html/converters/monospace.rb +0 -34
  116. data/lib/coradoc/html/converters/open.rb +0 -78
  117. data/lib/coradoc/html/converters/ordered.rb +0 -53
  118. data/lib/coradoc/html/converters/paragraph.rb +0 -46
  119. data/lib/coradoc/html/converters/quote.rb +0 -113
  120. data/lib/coradoc/html/converters/reviewer_comment.rb +0 -74
  121. data/lib/coradoc/html/converters/reviewer_note.rb +0 -134
  122. data/lib/coradoc/html/converters/section.rb +0 -90
  123. data/lib/coradoc/html/converters/sidebar.rb +0 -113
  124. data/lib/coradoc/html/converters/source.rb +0 -137
  125. data/lib/coradoc/html/converters/source_code.rb +0 -16
  126. data/lib/coradoc/html/converters/span.rb +0 -61
  127. data/lib/coradoc/html/converters/strikethrough.rb +0 -34
  128. data/lib/coradoc/html/converters/subscript.rb +0 -34
  129. data/lib/coradoc/html/converters/superscript.rb +0 -34
  130. data/lib/coradoc/html/converters/table.rb +0 -85
  131. data/lib/coradoc/html/converters/table_cell.rb +0 -203
  132. data/lib/coradoc/html/converters/table_row.rb +0 -45
  133. data/lib/coradoc/html/converters/template_html_converter.rb +0 -105
  134. data/lib/coradoc/html/converters/term.rb +0 -58
  135. data/lib/coradoc/html/converters/text_element.rb +0 -44
  136. data/lib/coradoc/html/converters/underline.rb +0 -34
  137. data/lib/coradoc/html/converters/unordered.rb +0 -47
  138. data/lib/coradoc/html/converters/verse.rb +0 -105
  139. data/lib/coradoc/html/converters/video.rb +0 -179
  140. data/lib/coradoc/html/element_mapping.rb +0 -210
  141. data/lib/coradoc/html/entity.rb +0 -137
  142. data/lib/coradoc/html/input/converters/ignore.rb +0 -22
  143. data/lib/coradoc/html/input/converters/th.rb +0 -20
  144. data/lib/coradoc/html/theme/base.rb +0 -231
  145. data/lib/coradoc/html/theme/classic_renderer.rb +0 -390
  146. data/lib/coradoc/html/theme/modern/components/ui_components.rb +0 -344
  147. data/lib/coradoc/html/theme/modern/css_generator.rb +0 -311
  148. data/lib/coradoc/html/theme/modern/javascript_generator.rb +0 -314
  149. data/lib/coradoc/html/theme/modern/serializers/document_serializer.rb +0 -382
  150. data/lib/coradoc/html/theme/modern/tailwind_config_builder.rb +0 -164
  151. data/lib/coradoc/html/theme/modern/vue_template_generator.rb +0 -374
  152. data/lib/coradoc/html/theme/modern_renderer.rb +0 -250
  153. data/lib/coradoc/html/theme/registry.rb +0 -153
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+ require 'liquid'
5
+
6
+ module Coradoc
7
+ module Html
8
+ class LayoutRenderer
9
+ include TemplateCaching
10
+
11
+ LAYOUT_DIR = Pathname.new(File.join(File.dirname(__FILE__), 'templates', 'layouts'))
12
+
13
+ def initialize
14
+ @template_cache = {}
15
+ @dist_assets_cache = {}
16
+ end
17
+
18
+ def render_static(document, body_html, options)
19
+ layout_template = load_layout('default')
20
+ return build_static_fallback(document, body_html, options) unless layout_template
21
+
22
+ layout_template.render(build_static_layout_data(document, body_html, options)).strip
23
+ end
24
+
25
+ def render_spa(document, options, body_html, toc_data)
26
+ dist_dir = options[:dist_dir] || File.expand_path('../../../frontend/dist', __dir__)
27
+ assets = load_dist_assets(dist_dir)
28
+
29
+ content_data = build_spa_content_data(document, body_html, options, toc_data)
30
+ safe_json = Escape.safe_json(content_data)
31
+
32
+ layout_template = load_layout('spa')
33
+ if layout_template
34
+ layout_template.render(build_spa_layout_data(document, options, assets, safe_json)).strip
35
+ else
36
+ build_spa_fallback(document, options, assets, safe_json)
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def resolve_title(document)
43
+ TitleText.resolve(document&.title) || Config::DEFAULT_TITLE
44
+ end
45
+
46
+ def resolve_escaped_title(document)
47
+ TitleText.escape(document&.title) || Config::DEFAULT_TITLE
48
+ end
49
+
50
+ def resolve_lang(options)
51
+ options[:lang] || Config::DEFAULT_LANG
52
+ end
53
+
54
+ def build_static_layout_data(document, body_html, options)
55
+ {
56
+ 'lang' => resolve_lang(options),
57
+ 'title' => resolve_escaped_title(document),
58
+ 'author' => options[:author],
59
+ 'description' => options[:description],
60
+ 'generator_version' => Coradoc::VERSION.to_s,
61
+ 'body' => body_html,
62
+ 'custom_css' => options[:custom_css]
63
+ }
64
+ end
65
+
66
+ def build_static_fallback(document, body_html, options)
67
+ Nokogiri::HTML::Builder.new do |doc|
68
+ doc.html(lang: resolve_lang(options)) do
69
+ doc.head do
70
+ doc.meta(charset: 'UTF-8')
71
+ doc.meta(name: 'viewport', content: 'width=device-width, initial-scale=1.0')
72
+ doc.title resolve_title(document)
73
+ end
74
+ doc.body { doc << body_html }
75
+ end
76
+ end.to_html
77
+ end
78
+
79
+ def build_spa_content_data(document, body_html, options, toc_data)
80
+ {
81
+ mode: 'classic',
82
+ contentHtml: body_html,
83
+ toc: toc_data,
84
+ meta: build_spa_meta(document, options),
85
+ options: build_spa_options(options)
86
+ }
87
+ end
88
+
89
+ def build_spa_meta(document, options)
90
+ {
91
+ title: TitleText.resolve(document&.title) || Config::DEFAULT_TITLE,
92
+ author: options[:author],
93
+ date: options[:revdate],
94
+ generator: "Coradoc #{Coradoc::VERSION}"
95
+ }
96
+ end
97
+
98
+ def build_spa_options(options)
99
+ {
100
+ toc: options[:toc] ? true : false,
101
+ tocPlacement: (options[:toc_placement] || :auto).to_s,
102
+ sectnums: options[:section_numbers] == true,
103
+ themeToggle: options[:theme_toggle] != false,
104
+ readingProgress: options[:reading_progress] != false,
105
+ lang: resolve_lang(options)
106
+ }
107
+ end
108
+
109
+ def build_spa_layout_data(document, options, assets, safe_json)
110
+ {
111
+ 'lang' => resolve_lang(options),
112
+ 'title' => resolve_escaped_title(document),
113
+ 'author' => options[:author],
114
+ 'description' => options[:description],
115
+ 'generator_version' => Coradoc::VERSION.to_s,
116
+ 'css' => assets[:css],
117
+ 'js' => assets[:js],
118
+ 'data' => safe_json
119
+ }
120
+ end
121
+
122
+ def build_spa_fallback(document, options, assets, safe_json)
123
+ Nokogiri::HTML::Builder.new do |doc|
124
+ doc.html(lang: resolve_lang(options)) do
125
+ doc.head do
126
+ doc.meta(charset: 'UTF-8')
127
+ doc.meta(name: 'viewport', content: 'width=device-width, initial-scale=1.0')
128
+ doc.meta(name: 'generator', content: "Coradoc #{Coradoc::VERSION}")
129
+ doc.title resolve_title(document)
130
+ doc.style { doc.text assets[:css] } if assets[:css]
131
+ end
132
+ doc.body do
133
+ doc.div(id: 'coradoc-app')
134
+ doc.script { doc << "window.CORADOC_DATA = #{safe_json};" }
135
+ doc.script { doc << assets[:js] } if assets[:js]
136
+ end
137
+ end
138
+ end.to_html
139
+ end
140
+
141
+ def load_layout(name)
142
+ cache_key = "layout:#{name}"
143
+ path = LAYOUT_DIR.join("#{name}.liquid").to_s
144
+ load_template(cache: @template_cache, cache_key: cache_key, path: path)
145
+ end
146
+
147
+ def load_dist_assets(dist_dir)
148
+ @dist_assets_cache[dist_dir] ||= begin
149
+ unless File.directory?(dist_dir)
150
+ raise ArgumentError,
151
+ "Frontend dist directory not found: #{dist_dir}. " \
152
+ 'Build the frontend first: cd frontend && npm install && npm run build'
153
+ end
154
+
155
+ {
156
+ css: File.read(File.join(dist_dir, 'app.css')),
157
+ js: File.read(File.join(dist_dir, 'app.iife.js'))
158
+ }
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -16,18 +16,15 @@ module Coradoc
16
16
  # result = Coradoc::Output.process(document, format: :html_static)
17
17
  #
18
18
  class HtmlStatic
19
+ extend Coradoc::Html::FormatDetection
20
+
19
21
  class << self
20
- # Processor identifier for registration
21
- # @return [Symbol] the processor ID
22
22
  def processor_id
23
23
  :html_static
24
24
  end
25
25
 
26
- # Check if this processor matches a given filename
27
- # @param filename [String] the filename to check
28
- # @return [Boolean] true if this processor handles the file type
29
26
  def processor_match?(filename)
30
- %w[.html .htm].any? { |ext| filename.downcase.end_with?(ext) }
27
+ html_extension?(filename)
31
28
  end
32
29
 
33
30
  # Process documents to static HTML
@@ -56,18 +53,15 @@ module Coradoc
56
53
  # result = Coradoc::Output.process(document, format: :html_spa)
57
54
  #
58
55
  class HtmlSpa
56
+ extend Coradoc::Html::FormatDetection
57
+
59
58
  class << self
60
- # Processor identifier for registration
61
- # @return [Symbol] the processor ID
62
59
  def processor_id
63
60
  :html_spa
64
61
  end
65
62
 
66
- # Check if this processor matches a given filename
67
- # @param filename [String] the filename to check
68
- # @return [Boolean] true if this processor handles the file type
69
63
  def processor_match?(filename)
70
- %w[.html .htm].any? { |ext| filename.downcase.end_with?(ext) }
64
+ html_extension?(filename)
71
65
  end
72
66
 
73
67
  # Process documents to SPA HTML