Class: Markbridge::Renderers::Discourse::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/markbridge/renderers/discourse/renderer.rb

Overview

Renders AST to Discourse-flavored Markdown in-memory.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tag_library: nil, escaper: nil, html_escaper: nil, postprocessor: nil) ⇒ Renderer

Returns a new instance of Renderer.



10
11
12
13
14
15
16
17
# File 'lib/markbridge/renderers/discourse/renderer.rb', line 10

def initialize(tag_library: nil, escaper: nil, html_escaper: nil, postprocessor: nil)
  @tag_library = tag_library || TagLibrary.default
  @escaper = escaper || MarkdownEscaper.new
  @html_escaper = html_escaper || HtmlEscaper
  @postprocessor = postprocessor || Postprocessor::DEFAULT
  # @interface_cache is lazily initialized in #render's top-level
  # call and reset to nil after the call completes.
end

Instance Attribute Details

#postprocessorObject (readonly)

Returns the value of attribute postprocessor.



8
9
10
# File 'lib/markbridge/renderers/discourse/renderer.rb', line 8

def postprocessor
  @postprocessor
end

Instance Method Details

#render(node, context: RenderContext.new) ⇒ String

Render a node to Markdown

Parameters:

  • node (AST::Node)
  • context (RenderContext) (defaults to: RenderContext.new)

    rendering context with parent chain

Returns:

  • (String)


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/markbridge/renderers/discourse/renderer.rb', line 23

def render(node, context: RenderContext.new)
  root_call = @interface_cache.nil?
  @interface_cache = {} if root_call

  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

Parameters:

Returns:

  • (String)


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/markbridge/renderers/discourse/renderer.rb', line 51

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