class BookLab::SML::Rules::List

Constants

INDENT_PX

Public Class Methods

match?(node) click to toggle source
# File lib/booklab/sml/rules/list.rb, line 5
def self.match?(node)
  tag_name(node) == "list"
end
to_html(node, opts = {}) click to toggle source
# File lib/booklab/sml/rules/list.rb, line 11
def self.to_html(node, opts = {})
  renderer = opts[:renderer]
  attrs    = attributes(node)
  children = renderer.children_to_html(node)

  # Normal paragraph data
  text_align  = attrs[:align] || "left"
  indent      = attrs[:indent]
  text_indent = indent && indent[:firstline]
  indent_left = indent ? indent[:left] : 0

  # List style
  nid       = attrs[:nid]
  list_type = attrs[:type] || "bulleted"
  level     = attrs[:level] || 1
  num       = (attrs[:num] || 0) + 1

  style_attrs = style_for_attrs(attrs,
    "padding-left": "#{indent_left * INDENT_PX}px"
  )

  wrap_tag = list_type == "bulleted" ? "ul" : "ol"


  # <ul>
  #   <li>Bold text</li>
  #   <li>Important text
  #     <ul>
  #       <li>Emphasized text</li>
  #       <li>
  #         Small text
  #         <ul>
  #           <li>Subscript text</li>
  #         </ul>
  #       </li>
  #     </ul>
  #   </li>
  # </ul>

  # get prev attrs
  prev_name = tag_name(opts[:prev])
  next_name = tag_name(opts[:next])
  prev_level = attributes(opts[:prev])[:level]
  next_level = attributes(opts[:next])[:level]

  outs = []


  if prev_name != "list" || prev_level != level
    outs << %(<#{wrap_tag} data-level="#{level}">)
  end

  li_item = "<li>#{children}"

  if next_name == "list"
    if next_level < level
      (level - next_level + 1).times do
        li_item += "</li></#{wrap_tag}>"
      end
    elsif next_level == level
      li_item += "</li>"
    else
      li_item += "\n"
    end
  else
    (level - 1 + 1).times do
      li_item += "</li></#{wrap_tag}>"
    end
  end

  outs << li_item

  outs.join("\n")
end