Class: Markbridge::Renderers::Discourse::Renderer
- Inherits:
-
Object
- Object
- Markbridge::Renderers::Discourse::Renderer
- Defined in:
- lib/markbridge/renderers/discourse/renderer.rb
Overview
Renders AST to Discourse-flavored Markdown in-memory.
Instance Method Summary collapse
-
#initialize(tag_library: nil, escaper: nil, html_escaper: nil) ⇒ Renderer
constructor
A new instance of Renderer.
-
#render(node, context: RenderContext.new) ⇒ String
Render a node to Markdown.
-
#render_children(node, context:) ⇒ String
Render all children of a node.
Constructor Details
#initialize(tag_library: nil, escaper: nil, html_escaper: nil) ⇒ Renderer
Returns a new instance of Renderer.
8 9 10 11 12 13 14 15 |
# File 'lib/markbridge/renderers/discourse/renderer.rb', line 8 def initialize(tag_library: nil, escaper: nil, html_escaper: nil) @tag_library = tag_library || TagLibrary.default @escaper = escaper || MarkdownEscaper.new @html_escaper = html_escaper || HtmlEscaper # @interface_cache is lazily initialized in #render's top-level # call and reset to nil after the call completes. No init # needed here — unset ivar returns nil under `.nil?` check. end |
Instance Method Details
#render(node, context: RenderContext.new) ⇒ String
Render a node to Markdown
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/markbridge/renderers/discourse/renderer.rb', line 21 def render(node, context: RenderContext.new) root_call = @interface_cache.nil? @interface_cache ||= {} tag = @tag_library[node.class] if tag interface = interface_for(context) return tag.render(node, interface) end case node when AST::Element # Document is an Element subclass render_children(node, context:) when AST::MarkdownText render_markdown_text(node, context) when AST::Text render_text(node, context) else "" end ensure @interface_cache = nil if root_call end |
#render_children(node, context:) ⇒ String
Render all children of a node
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/markbridge/renderers/discourse/renderer.rb', line 49 def render_children(node, context:) result = +"" node.children.each do |child| part = render(child, context:) next if part.empty? # Integer-byte check avoids allocating substrings for the # per-child adjacency probe. EMPHASIS_DELIMITER_BYTES.include? # over a 4-element Set is O(1). if !result.empty? && (last_byte = result.getbyte(-1)) == part.getbyte(0) && EMPHASIS_DELIMITER_BYTES.include?(last_byte) result << EMPHASIS_BOUNDARY end result << part end result end |