coradoc 1.1.8 → 2.0.12

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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -1
  3. data/Rakefile +3 -12
  4. data/exe/coradoc +21 -2
  5. data/lib/coradoc/cli.rb +185 -91
  6. data/lib/coradoc/configurable.rb +527 -0
  7. data/lib/coradoc/coradoc.rb +463 -0
  8. data/lib/coradoc/core_model/annotation_block.rb +57 -0
  9. data/lib/coradoc/core_model/base.rb +172 -0
  10. data/lib/coradoc/core_model/bibliography.rb +41 -0
  11. data/lib/coradoc/core_model/bibliography_entry.rb +48 -0
  12. data/lib/coradoc/core_model/block.rb +63 -0
  13. data/lib/coradoc/core_model/children_content.rb +53 -0
  14. data/lib/coradoc/core_model/comment_block.rb +10 -0
  15. data/lib/coradoc/core_model/definition_item.rb +46 -0
  16. data/lib/coradoc/core_model/definition_list.rb +28 -0
  17. data/lib/coradoc/core_model/element_attribute.rb +26 -0
  18. data/lib/coradoc/core_model/example_block.rb +10 -0
  19. data/lib/coradoc/core_model/footnote.rb +92 -0
  20. data/lib/coradoc/core_model/horizontal_rule_block.rb +10 -0
  21. data/lib/coradoc/core_model/id_generator.rb +16 -0
  22. data/lib/coradoc/core_model/image.rb +66 -0
  23. data/lib/coradoc/core_model/inline_element.rb +140 -0
  24. data/lib/coradoc/core_model/list_block.rb +135 -0
  25. data/lib/coradoc/core_model/list_item.rb +142 -0
  26. data/lib/coradoc/core_model/listing_block.rb +13 -0
  27. data/lib/coradoc/core_model/literal_block.rb +10 -0
  28. data/lib/coradoc/core_model/metadata.rb +79 -0
  29. data/lib/coradoc/core_model/open_block.rb +10 -0
  30. data/lib/coradoc/core_model/paragraph_block.rb +10 -0
  31. data/lib/coradoc/core_model/pass_block.rb +10 -0
  32. data/lib/coradoc/core_model/quote_block.rb +12 -0
  33. data/lib/coradoc/core_model/reviewer_block.rb +10 -0
  34. data/lib/coradoc/core_model/sidebar_block.rb +10 -0
  35. data/lib/coradoc/core_model/source_block.rb +10 -0
  36. data/lib/coradoc/core_model/structural_element.rb +94 -0
  37. data/lib/coradoc/core_model/table.rb +148 -0
  38. data/lib/coradoc/core_model/term.rb +53 -0
  39. data/lib/coradoc/core_model/text_content.rb +22 -0
  40. data/lib/coradoc/core_model/toc.rb +105 -0
  41. data/lib/coradoc/core_model/toc_generator.rb +151 -0
  42. data/lib/coradoc/core_model/verse_block.rb +12 -0
  43. data/lib/coradoc/core_model.rb +77 -0
  44. data/lib/coradoc/document_builder.rb +184 -0
  45. data/lib/coradoc/document_manipulator.rb +203 -0
  46. data/lib/coradoc/errors.rb +312 -0
  47. data/lib/coradoc/format_module.rb +49 -0
  48. data/lib/coradoc/hooks.rb +176 -0
  49. data/lib/coradoc/input.rb +17 -7
  50. data/lib/coradoc/logger.rb +54 -0
  51. data/lib/coradoc/output.rb +17 -6
  52. data/lib/coradoc/performance_regression.rb +109 -0
  53. data/lib/coradoc/processor_registry.rb +50 -0
  54. data/lib/coradoc/query.rb +455 -0
  55. data/lib/coradoc/registry.rb +156 -0
  56. data/lib/coradoc/serializer/registry.rb +150 -0
  57. data/lib/coradoc/transform.rb +11 -0
  58. data/lib/coradoc/validation.rb +646 -0
  59. data/lib/coradoc/version.rb +1 -1
  60. data/lib/coradoc/visitor.rb +283 -0
  61. data/lib/coradoc.rb +40 -19
  62. metadata +67 -277
  63. data/.editorconfig +0 -15
  64. data/.envrc +0 -1
  65. data/.irbrc +0 -1
  66. data/.pryrc.sample +0 -1
  67. data/.rubocop.yml +0 -14
  68. data/.rubocop_todo.yml +0 -179
  69. data/CHANGELOG.md +0 -9
  70. data/CODE_OF_CONDUCT.md +0 -84
  71. data/Dockerfile +0 -19
  72. data/Gemfile +0 -16
  73. data/LICENSE.txt +0 -21
  74. data/Makefile +0 -35
  75. data/README.Docker.adoc +0 -57
  76. data/README.adoc +0 -119
  77. data/coradoc.gemspec +0 -40
  78. data/docker-compose.yml +0 -14
  79. data/exe/reverse_adoc +0 -81
  80. data/exe/w2a +0 -60
  81. data/flake.lock +0 -114
  82. data/flake.nix +0 -135
  83. data/lib/coradoc/converter.rb +0 -144
  84. data/lib/coradoc/document.rb +0 -77
  85. data/lib/coradoc/element/admonition.rb +0 -18
  86. data/lib/coradoc/element/attribute.rb +0 -36
  87. data/lib/coradoc/element/attribute_list.rb +0 -138
  88. data/lib/coradoc/element/audio.rb +0 -33
  89. data/lib/coradoc/element/author.rb +0 -24
  90. data/lib/coradoc/element/base.rb +0 -92
  91. data/lib/coradoc/element/bibliography.rb +0 -24
  92. data/lib/coradoc/element/bibliography_entry.rb +0 -24
  93. data/lib/coradoc/element/block/core.rb +0 -76
  94. data/lib/coradoc/element/block/example.rb +0 -23
  95. data/lib/coradoc/element/block/listing.rb +0 -21
  96. data/lib/coradoc/element/block/literal.rb +0 -21
  97. data/lib/coradoc/element/block/open.rb +0 -22
  98. data/lib/coradoc/element/block/pass.rb +0 -21
  99. data/lib/coradoc/element/block/quote.rb +0 -19
  100. data/lib/coradoc/element/block/reviewer_comment.rb +0 -19
  101. data/lib/coradoc/element/block/side.rb +0 -19
  102. data/lib/coradoc/element/block/sourcecode.rb +0 -21
  103. data/lib/coradoc/element/block.rb +0 -17
  104. data/lib/coradoc/element/break.rb +0 -11
  105. data/lib/coradoc/element/comment_block.rb +0 -22
  106. data/lib/coradoc/element/comment_line.rb +0 -18
  107. data/lib/coradoc/element/document_attributes.rb +0 -33
  108. data/lib/coradoc/element/header.rb +0 -22
  109. data/lib/coradoc/element/image/block_image.rb +0 -32
  110. data/lib/coradoc/element/image/core.rb +0 -58
  111. data/lib/coradoc/element/image/inline_image.rb +0 -12
  112. data/lib/coradoc/element/image.rb +0 -10
  113. data/lib/coradoc/element/include.rb +0 -18
  114. data/lib/coradoc/element/inline/anchor.rb +0 -19
  115. data/lib/coradoc/element/inline/attribute_reference.rb +0 -19
  116. data/lib/coradoc/element/inline/bold.rb +0 -25
  117. data/lib/coradoc/element/inline/cross_reference.rb +0 -46
  118. data/lib/coradoc/element/inline/footnote.rb +0 -24
  119. data/lib/coradoc/element/inline/hard_line_break.rb +0 -11
  120. data/lib/coradoc/element/inline/highlight.rb +0 -25
  121. data/lib/coradoc/element/inline/italic.rb +0 -25
  122. data/lib/coradoc/element/inline/link.rb +0 -42
  123. data/lib/coradoc/element/inline/monospace.rb +0 -25
  124. data/lib/coradoc/element/inline/quotation.rb +0 -20
  125. data/lib/coradoc/element/inline/small.rb +0 -19
  126. data/lib/coradoc/element/inline/span.rb +0 -37
  127. data/lib/coradoc/element/inline/subscript.rb +0 -20
  128. data/lib/coradoc/element/inline/superscript.rb +0 -20
  129. data/lib/coradoc/element/inline/underline.rb +0 -19
  130. data/lib/coradoc/element/inline.rb +0 -23
  131. data/lib/coradoc/element/list/core.rb +0 -51
  132. data/lib/coradoc/element/list/definition.rb +0 -29
  133. data/lib/coradoc/element/list/ordered.rb +0 -17
  134. data/lib/coradoc/element/list/unordered.rb +0 -17
  135. data/lib/coradoc/element/list.rb +0 -13
  136. data/lib/coradoc/element/list_item.rb +0 -98
  137. data/lib/coradoc/element/list_item_definition.rb +0 -32
  138. data/lib/coradoc/element/paragraph.rb +0 -37
  139. data/lib/coradoc/element/revision.rb +0 -27
  140. data/lib/coradoc/element/section.rb +0 -62
  141. data/lib/coradoc/element/table.rb +0 -91
  142. data/lib/coradoc/element/tag.rb +0 -19
  143. data/lib/coradoc/element/term.rb +0 -22
  144. data/lib/coradoc/element/text_element.rb +0 -92
  145. data/lib/coradoc/element/title.rb +0 -62
  146. data/lib/coradoc/element/video.rb +0 -50
  147. data/lib/coradoc/generator.rb +0 -19
  148. data/lib/coradoc/input/adoc.rb +0 -30
  149. data/lib/coradoc/input/docx.rb +0 -64
  150. data/lib/coradoc/input/html/LICENSE.txt +0 -25
  151. data/lib/coradoc/input/html/README.adoc +0 -308
  152. data/lib/coradoc/input/html/cleaner.rb +0 -142
  153. data/lib/coradoc/input/html/config.rb +0 -77
  154. data/lib/coradoc/input/html/converters/a.rb +0 -52
  155. data/lib/coradoc/input/html/converters/aside.rb +0 -16
  156. data/lib/coradoc/input/html/converters/audio.rb +0 -29
  157. data/lib/coradoc/input/html/converters/base.rb +0 -108
  158. data/lib/coradoc/input/html/converters/blockquote.rb +0 -22
  159. data/lib/coradoc/input/html/converters/br.rb +0 -15
  160. data/lib/coradoc/input/html/converters/bypass.rb +0 -81
  161. data/lib/coradoc/input/html/converters/code.rb +0 -23
  162. data/lib/coradoc/input/html/converters/div.rb +0 -19
  163. data/lib/coradoc/input/html/converters/dl.rb +0 -62
  164. data/lib/coradoc/input/html/converters/drop.rb +0 -26
  165. data/lib/coradoc/input/html/converters/em.rb +0 -21
  166. data/lib/coradoc/input/html/converters/figure.rb +0 -25
  167. data/lib/coradoc/input/html/converters/h.rb +0 -42
  168. data/lib/coradoc/input/html/converters/head.rb +0 -23
  169. data/lib/coradoc/input/html/converters/hr.rb +0 -15
  170. data/lib/coradoc/input/html/converters/ignore.rb +0 -20
  171. data/lib/coradoc/input/html/converters/img.rb +0 -110
  172. data/lib/coradoc/input/html/converters/li.rb +0 -17
  173. data/lib/coradoc/input/html/converters/mark.rb +0 -19
  174. data/lib/coradoc/input/html/converters/markup.rb +0 -31
  175. data/lib/coradoc/input/html/converters/math.rb +0 -38
  176. data/lib/coradoc/input/html/converters/ol.rb +0 -65
  177. data/lib/coradoc/input/html/converters/p.rb +0 -23
  178. data/lib/coradoc/input/html/converters/pass_through.rb +0 -17
  179. data/lib/coradoc/input/html/converters/pre.rb +0 -55
  180. data/lib/coradoc/input/html/converters/q.rb +0 -16
  181. data/lib/coradoc/input/html/converters/strong.rb +0 -20
  182. data/lib/coradoc/input/html/converters/sub.rb +0 -22
  183. data/lib/coradoc/input/html/converters/sup.rb +0 -22
  184. data/lib/coradoc/input/html/converters/table.rb +0 -319
  185. data/lib/coradoc/input/html/converters/td.rb +0 -81
  186. data/lib/coradoc/input/html/converters/text.rb +0 -32
  187. data/lib/coradoc/input/html/converters/th.rb +0 -18
  188. data/lib/coradoc/input/html/converters/tr.rb +0 -22
  189. data/lib/coradoc/input/html/converters/video.rb +0 -29
  190. data/lib/coradoc/input/html/converters.rb +0 -59
  191. data/lib/coradoc/input/html/errors.rb +0 -14
  192. data/lib/coradoc/input/html/html_converter.rb +0 -168
  193. data/lib/coradoc/input/html/plugin.rb +0 -131
  194. data/lib/coradoc/input/html/plugins/plateau.rb +0 -213
  195. data/lib/coradoc/input/html/postprocessor.rb +0 -220
  196. data/lib/coradoc/input/html.rb +0 -61
  197. data/lib/coradoc/legacy_parser.rb +0 -200
  198. data/lib/coradoc/oscal.rb +0 -99
  199. data/lib/coradoc/output/adoc.rb +0 -19
  200. data/lib/coradoc/output/coradoc_tree_debug.rb +0 -21
  201. data/lib/coradoc/parser/asciidoc/admonition.rb +0 -24
  202. data/lib/coradoc/parser/asciidoc/attribute_list.rb +0 -89
  203. data/lib/coradoc/parser/asciidoc/base.rb +0 -87
  204. data/lib/coradoc/parser/asciidoc/bibliography.rb +0 -29
  205. data/lib/coradoc/parser/asciidoc/block.rb +0 -94
  206. data/lib/coradoc/parser/asciidoc/citation.rb +0 -30
  207. data/lib/coradoc/parser/asciidoc/content.rb +0 -64
  208. data/lib/coradoc/parser/asciidoc/document_attributes.rb +0 -25
  209. data/lib/coradoc/parser/asciidoc/header.rb +0 -29
  210. data/lib/coradoc/parser/asciidoc/inline.rb +0 -195
  211. data/lib/coradoc/parser/asciidoc/list.rb +0 -115
  212. data/lib/coradoc/parser/asciidoc/paragraph.rb +0 -54
  213. data/lib/coradoc/parser/asciidoc/section.rb +0 -61
  214. data/lib/coradoc/parser/asciidoc/table.rb +0 -32
  215. data/lib/coradoc/parser/asciidoc/term.rb +0 -41
  216. data/lib/coradoc/parser/asciidoc/text.rb +0 -158
  217. data/lib/coradoc/parser/base.rb +0 -40
  218. data/lib/coradoc/parser.rb +0 -11
  219. data/lib/coradoc/reverse_adoc.rb +0 -18
  220. data/lib/coradoc/transformer.rb +0 -476
  221. data/lib/coradoc/util.rb +0 -12
  222. data/lib/reverse_adoc.rb +0 -20
  223. data/utils/inspect_asciidoc.rb +0 -29
  224. data/utils/parser_analyzer.rb +0 -66
  225. data/utils/round_trip.rb +0 -53
@@ -1,81 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- module Converters
5
- class Td < Base
6
- def to_coradoc(node, state = {})
7
- # convert(node, state)
8
- id = node["id"]
9
- colrowattr = colrow(node["colspan"], node["rowspan"])
10
- alignattr = alignstyle(node)
11
- style = cellstyle(node)
12
-
13
- singlepara = node.elements.size == 1 && node.elements.first.name == "p"
14
- state[:tdsinglepara] = singlepara if singlepara
15
-
16
- adoccell = node.at(".//ul | .//ol | .//pre | .//blockquote | .//br | .//hr | .//img[@src]") ||
17
- node.at(".//p") && !singlepara
18
-
19
- style = "a" if adoccell
20
- content = treat_children_coradoc(node, state)
21
- options = {}.tap do |hash|
22
- hash[:id] = id
23
- hash[:colrowattr] = colrowattr
24
- hash[:alignattr] = alignattr
25
- hash[:style] = style
26
- hash[:content] = content
27
- end
28
-
29
- Coradoc::Element::Table::Cell.new(options)
30
- end
31
-
32
- def cellstyle(_node)
33
- ""
34
- end
35
-
36
- def colrow(colspan, rowspan)
37
- if colspan && rowspan && colspan != "1" && rowspan != "1"
38
- "#{colspan}.#{rowspan}+"
39
- elsif colspan && colspan != "1"
40
- "#{colspan}+"
41
- elsif rowspan && rowspan != "1"
42
- ".#{rowspan}+"
43
- else
44
- ""
45
- end
46
- end
47
-
48
- def alignstyle(node)
49
- align = node["align"]
50
- valign = node["valign"]
51
- a = case align
52
- when "left" then "<"
53
- when "center" then "^"
54
- when "right" then ">"
55
- else
56
- ""
57
- end
58
- v = case valign
59
- when "top" then "<"
60
- when "middle" then "^"
61
- when "bottom" then ">"
62
- else
63
- ""
64
- end
65
- if align && valign
66
- "#{a}.#{v}"
67
- elsif align
68
- a
69
- elsif valign
70
- ".#{v}"
71
- else
72
- ""
73
- end
74
- end
75
- end
76
-
77
- register :td, Td.new
78
- end
79
- end
80
- end
81
- end
@@ -1,32 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- module Converters
5
- class Text < Base
6
- def to_coradoc(node, state = {})
7
- return treat_empty(node, state) if node.text.strip.empty?
8
-
9
- Coradoc::Element::TextElement.new(node.text, html_cleanup: true)
10
- end
11
-
12
- private
13
-
14
- def treat_empty(node, state)
15
- parent = node.parent.name.to_sym
16
- if %i[ol ul].include?(parent) # Otherwise the identation is broken
17
- ""
18
- elsif state[:tdsinglepara]
19
- ""
20
- elsif node.text == " " # Regular whitespace text node
21
- " "
22
- else
23
- ""
24
- end
25
- end
26
- end
27
-
28
- register :text, Text.new
29
- end
30
- end
31
- end
32
- end
@@ -1,18 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- module Converters
5
- class Th < Td
6
- def cellstyle(node)
7
- # this is the header row
8
- return "" if node.parent.previous_element.nil?
9
-
10
- "h"
11
- end
12
- end
13
-
14
- register :th, Th.new
15
- end
16
- end
17
- end
18
- end
@@ -1,22 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- module Converters
5
- class Tr < Base
6
- def to_coradoc(node, state = {})
7
- content = treat_children_coradoc(node, state)
8
- header = table_header_row?(node)
9
- Coradoc::Element::Table::Row.new(content, header)
10
- end
11
-
12
- def table_header_row?(node)
13
- # node.element_children.all? {|child| child.name.to_sym == :th}
14
- node.previous_element.nil?
15
- end
16
- end
17
-
18
- register :tr, Tr.new
19
- end
20
- end
21
- end
22
- end
@@ -1,29 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- module Converters
5
- class Video < Base
6
- def to_coradoc(node, _state = {})
7
- src = node["src"]
8
- id = node["id"]
9
- title = extract_title(node)
10
- attributes = Coradoc::Element::AttributeList.new
11
- options = options(node)
12
- attributes.add_named("options", options) if options.any?
13
- Coradoc::Element::Video.new(title, id: id, src: src,
14
- attributes: attributes)
15
- end
16
-
17
- def options(node)
18
- autoplay = node["autoplay"]
19
- loop_attr = node["loop"]
20
- controls = node["controls"]
21
- [autoplay, loop_attr, controls].compact
22
- end
23
- end
24
-
25
- register :video, Video.new
26
- end
27
- end
28
- end
29
- end
@@ -1,59 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- module Converters
5
- def self.register(tag_name, converter)
6
- @@converters ||= {}
7
- @@converters[tag_name.to_sym] = converter
8
- end
9
-
10
- def self.unregister(tag_name)
11
- @@converters.delete(tag_name.to_sym)
12
- end
13
-
14
- def self.lookup(tag_name)
15
- converter = @@converters[tag_name.to_sym] || default_converter(tag_name)
16
- converter = converter.new if converter.respond_to? :new
17
- converter
18
- end
19
-
20
- # Note: process won't run plugin hooks
21
- def self.process(node, state)
22
- node = node.to_a if node.is_a? Nokogiri::XML::NodeSet
23
- return node.map { |i| process(i, state) }.join if node.is_a? Array
24
-
25
- lookup(node.name).convert(node, state)
26
- end
27
-
28
- def self.process_coradoc(node, state)
29
- node = node.to_a if node.is_a? Nokogiri::XML::NodeSet
30
- return node.map { |i| process_coradoc(i, state) } if node.is_a? Array
31
-
32
- plugins = state[:plugin_instances] || {}
33
- process = proc { lookup(node.name).to_coradoc(node, state) }
34
- plugins.each do |i|
35
- prev_process = process
36
- process = proc { i.html_tree_run_hooks(node, state, &prev_process) }
37
- end
38
- process.(node, state)
39
- end
40
-
41
- def self.default_converter(tag_name)
42
- case Coradoc::Input::Html.config.unknown_tags.to_sym
43
- when :pass_through
44
- Coradoc::Input::Html::Converters::PassThrough.new
45
- when :drop
46
- Coradoc::Input::Html::Converters::Drop.new
47
- when :bypass
48
- Coradoc::Input::Html::Converters::Bypass.new
49
- when :raise
50
- raise UnknownTagError, "unknown tag: #{tag_name}"
51
- else
52
- raise InvalidConfigurationError,
53
- "unknown value #{Coradoc::Input::Html.config.unknown_tags.inspect} for Coradoc::Input::HTML.config.unknown_tags"
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,14 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- class Error < StandardError
5
- end
6
-
7
- class UnknownTagError < Error
8
- end
9
-
10
- class InvalidConfigurationError < Error
11
- end
12
- end
13
- end
14
- end
@@ -1,168 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "converters/markup"
4
- require_relative "converters/a"
5
- require_relative "converters/aside"
6
- require_relative "converters/audio"
7
- require_relative "converters/blockquote"
8
- require_relative "converters/br"
9
- require_relative "converters/bypass"
10
- require_relative "converters/code"
11
- require_relative "converters/div"
12
- require_relative "converters/dl"
13
- require_relative "converters/drop"
14
- require_relative "converters/em"
15
- require_relative "converters/figure"
16
- require_relative "converters/h"
17
- require_relative "converters/head"
18
- require_relative "converters/hr"
19
- require_relative "converters/ignore"
20
- require_relative "converters/img"
21
- require_relative "converters/mark"
22
- require_relative "converters/li"
23
- require_relative "converters/ol"
24
- require_relative "converters/p"
25
- require_relative "converters/pass_through"
26
- require_relative "converters/pre"
27
- require_relative "converters/q"
28
- require_relative "converters/strong"
29
- require_relative "converters/sup"
30
- require_relative "converters/sub"
31
- require_relative "converters/table"
32
- require_relative "converters/td"
33
- require_relative "converters/th"
34
- require_relative "converters/text"
35
- require_relative "converters/tr"
36
- require_relative "converters/video"
37
- require_relative "converters/math"
38
-
39
- module Coradoc
40
- module Input
41
- module Html
42
- class HtmlConverter
43
- def self.to_coradoc(input, options = {})
44
- Input::Html.config.with(options) do
45
- plugin_instances = prepare_plugin_instances(options)
46
-
47
- root = track_time "Loading input HTML document" do
48
- case input
49
- when String
50
- Nokogiri::HTML(input).root
51
- when Nokogiri::XML::Document
52
- input.root
53
- when Nokogiri::XML::Node
54
- input
55
- end
56
- end
57
-
58
- return "" unless root
59
-
60
- plugin_instances.each do |plugin|
61
- plugin.html_tree = root
62
- if plugin.respond_to?(:preprocess_html_tree)
63
- track_time "Preprocessing document with #{plugin.name} plugin" do
64
- plugin.preprocess_html_tree
65
- end
66
- end
67
- root = plugin.html_tree
68
- end
69
-
70
- coradoc = track_time "Converting input document tree to Coradoc tree" do
71
- Converters.process_coradoc(root,
72
- plugin_instances: plugin_instances)
73
- end
74
-
75
- coradoc = track_time "Post-process Coradoc tree" do
76
- Postprocessor.process(coradoc)
77
- end
78
-
79
- plugin_instances.each do |plugin|
80
- if plugin.respond_to?(:postprocess_coradoc_tree)
81
- plugin.coradoc_tree = coradoc
82
- track_time "Postprocessing Coradoc tree with #{plugin.name} plugin" do
83
- plugin.postprocess_coradoc_tree
84
- end
85
- coradoc = plugin.coradoc_tree
86
- end
87
- end
88
-
89
- options[:plugin_instances] = plugin_instances unless options.frozen?
90
-
91
- coradoc
92
- end
93
- end
94
-
95
- def self.convert(input, options = {})
96
- Input::Html.config.with(options) do
97
- prepare_plugin_instances(options)
98
-
99
- coradoc = to_coradoc(input, options)
100
-
101
- if coradoc.is_a?(Hash)
102
- coradoc.to_h do |file, tree|
103
- track_time "Converting file #{file || 'main'}" do
104
- [file,
105
- convert_single_coradoc_to_adoc(file, tree, options)]
106
- end
107
- end
108
- else
109
- convert_single_coradoc_to_adoc(nil, coradoc, options)
110
- end
111
- end
112
- end
113
-
114
- def self.convert_single_coradoc_to_adoc(_file, coradoc, options)
115
- prepare_plugin_instances(options)
116
-
117
- result = track_time "Converting Coradoc tree into Asciidoc" do
118
- Coradoc::Generator.gen_adoc(coradoc)
119
- end
120
- cleanup_result(result, options)
121
- end
122
-
123
- def self.cleanup_result(result, options)
124
- Input::Html.config.with(options) do
125
- plugin_instances = prepare_plugin_instances(options)
126
-
127
- result = track_time "Cleaning up the result" do
128
- Input::Html.cleaner.tidy(result)
129
- end
130
- plugin_instances.each do |plugin|
131
- if plugin.respond_to?(:postprocess_asciidoc_string)
132
- plugin.asciidoc_string = result
133
- track_time "Postprocessing AsciiDoc string with #{plugin.name} plugin" do
134
- plugin.postprocess_asciidoc_string
135
- end
136
- result = plugin.asciidoc_string
137
- end
138
- end
139
-
140
- result
141
- end
142
- end
143
-
144
- def self.prepare_plugin_instances(options)
145
- options[:plugin_instances] || Coradoc::Input::Html.config.plugins.map(&:new)
146
- end
147
-
148
- @track_time_indentation = 0
149
- def self.track_time(task)
150
- if Input::Html.config.track_time
151
- warn " " * @track_time_indentation +
152
- "* #{task} is starting..."
153
- @track_time_indentation += 1
154
- t0 = Time.now
155
- ret = yield
156
- time_elapsed = Time.now - t0
157
- @track_time_indentation -= 1
158
- warn " " * @track_time_indentation +
159
- "* #{task} took #{time_elapsed.round(3)} seconds"
160
- ret
161
- else
162
- yield
163
- end
164
- end
165
- end
166
- end
167
- end
168
- end
@@ -1,131 +0,0 @@
1
- module Coradoc
2
- module Input
3
- module Html
4
- class Plugin
5
- #### Plugin system general
6
-
7
- # Allow building plugins with a shorthand syntax:
8
- # plugin = Coradoc::Input::Html::Plugin.new do
9
- # def name = "Test"
10
- # end
11
-
12
- def self.new(&)
13
- if self == Plugin
14
- Class.new(Plugin, &)
15
- else
16
- super
17
- end
18
- end
19
-
20
- def initialize
21
- @html_tree_hooks_pre = {}
22
- @html_tree_hooks_post = {}
23
- end
24
-
25
- # define name to name a Plugin
26
- def name
27
- self.class.name
28
- end
29
-
30
- #### HTML Tree functionalities
31
-
32
- attr_accessor :html_tree, :coradoc_tree, :asciidoc_string
33
-
34
- def html_tree_change_tag_name_by_css(css, new_name)
35
- html_tree.css(css).each do |e|
36
- e.name = new_name
37
- end
38
- end
39
-
40
- def html_tree_change_properties_by_css(css, properties)
41
- html_tree.css(css).each do |e|
42
- properties.each do |k, v|
43
- e[k.to_s] = v
44
- end
45
- end
46
- end
47
-
48
- def html_tree_remove_by_css(css)
49
- html_tree.css(css).each(&:remove)
50
- end
51
-
52
- def html_tree_replace_with_children_by_css(css)
53
- html_tree.css(css).each do |e|
54
- e.replace(e.children)
55
- end
56
- end
57
-
58
- def html_tree_process_to_coradoc(tree, state = {})
59
- Coradoc::Input::Html::Converters.process_coradoc(tree, state)
60
- end
61
-
62
- def html_tree_process_to_adoc(tree, state = {})
63
- Coradoc::Input::Html::Converters.process(tree, state)
64
- end
65
-
66
- def html_tree_preview
67
- Tempfile.open(%w"coradoc .html") do |i|
68
- i << html_tree.to_html
69
- system "chromium-browser", "--no-sandbox", i.path
70
- end
71
- end
72
-
73
- # define preprocess_html_tree to process HTML trees
74
-
75
- # Creates a hook to be called instead of converting an element
76
- # to a Coradoc node.
77
- #
78
- # proc |html_node, state|
79
- # coradoc_node
80
- # end
81
- def html_tree_add_hook_pre(element, &block)
82
- @html_tree_hooks_pre[element] = block
83
- end
84
-
85
- def html_tree_add_hook_pre_by_css(css, &block)
86
- html_tree.css(css).each do |e|
87
- html_tree_add_hook_pre(e, &block)
88
- end
89
- end
90
-
91
- # Creates a hook to be called after converting an element
92
- # to a Coradoc node.
93
- #
94
- # proc |html_node, coradoc_node, state|
95
- # coradoc_node
96
- # end
97
- def html_tree_add_hook_post(element, &block)
98
- @html_tree_hooks_post[element] = block
99
- end
100
-
101
- def html_tree_add_hook_post_by_css(css, &block)
102
- html_tree.css(css).each do |e|
103
- html_tree_add_hook_post(e, &block)
104
- end
105
- end
106
-
107
- def html_tree_run_hooks(node, state, &_block)
108
- hook_pre = @html_tree_hooks_pre[node]
109
- hook_post = @html_tree_hooks_post[node]
110
-
111
- coradoc = hook_pre.(node, state) if hook_pre
112
- coradoc ||= yield node, state
113
-
114
- if hook_post
115
- coradoc = hook_post.(node, coradoc, state)
116
- end
117
-
118
- coradoc
119
- end
120
-
121
- #### Coradoc tree functionalities
122
-
123
- # define postprocess_coradoc_tree to change coradoc tree
124
-
125
- #### AsciiDoc string functionalities
126
-
127
- # define postprocess_asciidoc_string to change the coradoc string
128
- end
129
- end
130
- end
131
- end