class Slacken::RenderElement

Internal: Representing a tree structure of a document and

responsible for rendering the structure to string.

Attributes

attrs[R]
children[R]
renderer[R]
type[R]

Public Class Methods

new(type, children = [], attrs = {}) click to toggle source
# File lib/slacken/render_element.rb, line 7
def initialize(type, children = [], attrs = {})
  @type = NodeType.create(type)
  @attrs = attrs
  @children = children
end

Public Instance Methods

child() click to toggle source
# File lib/slacken/render_element.rb, line 13
def child
  children.first
end
render() click to toggle source
# File lib/slacken/render_element.rb, line 17
def render
  case type.name
  when :text
    attrs[:content]
  when :emoji
    deco "#{attrs[:content]}"
  when :checkbox
    deco (attrs[:checked] ? '[x]' : '[ ]')
  when :b, :strong
    deco "*#{inner.to_s.strip}*"
  when :i, :em
    deco "_#{inner.to_s.strip}_"
  when :iframe, :a
    deco SlackUrl.link_tag(inner, attrs[:href])
  when :img
    deco SlackUrl.link_tag(inner, attrs[:src])
  when :pre
    deco "```#{inner}```"
  when :blockquote
    insert_head(inner.to_s, '> ')
  when :code
    deco "`#{inner}`"
  when :br
    "\n"
  when :hr
    '-----------'
  when :li, :dd
    # Item mark is appended by the parent list tag.
    inner
  when :ol, :ul, :dl
    itemize
  when :indent
    insert_head(inner.to_s)
  when /h\d/
    "*#{inner.to_s.strip}*"
  else
    inner
  end
end
to_s() click to toggle source
# File lib/slacken/render_element.rb, line 57
def to_s
  render.to_s
end

Private Instance Methods

deco(str) click to toggle source
# File lib/slacken/render_element.rb, line 89
def deco(str)
  Rendering.decorate(str)
end
grouping(children_strs) click to toggle source
# File lib/slacken/render_element.rb, line 75
def grouping(children_strs)
  if type.inline?
    Rendering::Inlines.new(children_strs)
  elsif type.member_of?(:ul, :ol, :dl, :li, :dd, :dt)
    Rendering::Listings.new(children_strs)
  elsif type.block?
    Rendering::Paragraphs.new(children_strs)
  end
end
inner() click to toggle source
# File lib/slacken/render_element.rb, line 71
def inner
  grouping(children.map(&:render))
end
insert_head(str, head = ' ' * 4) click to toggle source
# File lib/slacken/render_element.rb, line 85
def insert_head(str, head = ' ' * 4)
  str.gsub(/^/, head)
end
itemize() click to toggle source
# File lib/slacken/render_element.rb, line 63
def itemize
  children_strs = children.map.with_index(1) do |child, idx|
    mark = type.member_of?(:ol) ? "#{idx}. " : '• '
    "#{mark}#{child}"
  end
  grouping(children_strs)
end