class Minidown::ListGroupElement

Constants

IndentRegexp
StartWithBlankRegexp

Attributes

indent_level[RW]
lists[RW]

Public Instance Methods

parse() click to toggle source
# File lib/minidown/elements/list_group_element.rb, line 8
def parse
  nodes << self
  while line = unparsed_lines.shift
    #handle nested list
    if (line =~ UnorderListElement::NestRegexp && list_class = UnorderListElement) || (line =~ OrderListElement::NestRegexp && list_class = OrderListElement) 
      li, str = $1.size, $2
      if li > @indent_level
        list_class.new(doc, str, li).parse
        @lists.last.contents << nodes.pop
        next
      elsif li == @indent_level
        list_class.new(doc, str, li).parse
        child = nodes.pop
        if LineElement === nodes.last
          @lists.last.p_tag_content = child.lists.first.p_tag_content = true
        end
        if child.is_a?(ListGroupElement)
          nodes.push *child.children
          @lists.push *child.lists
        else
          @lists.last.contents << child
        end
        next
      else
        unparsed_lines.unshift line
        break
      end
    end
    
    doc.parse_line line
    child = nodes.pop
    case child
    when self.class
      if LineElement === nodes.last
        @lists.last.p_tag_content = child.lists.first.p_tag_content = true
      end
      nodes.push *child.children
      @lists.push *child.lists
      break
    when ParagraphElement
      contents = @lists.last.contents
      if line =~ StartWithBlankRegexp
        doc.parse_line $1
        node = nodes.pop
        if TextElement === node || ParagraphElement === node
          if TextElement === contents.last
            contents.push(contents.pop.paragraph)
          end
          node = node.paragraph if TextElement ===  node
        end
      else
        if @blank
          unparsed_lines.unshift line
          break
        end
        node = child.text
      end
      contents << node if node
    when LineElement
      next_line = unparsed_lines.first
      if next_line.nil? || next_line.empty? || StartWithBlankRegexp === next_line || self.class.const_get(:ListRegexp) === next_line
        child.display = false
        nodes << child
      else
        unparsed_lines.unshift line
        break
      end
    else
      @put_back << child if child
      break
    end
    @blank = (LineElement === child)
  end
  children_range = (nodes.index(self) + 1)..-1
  children.push *nodes[children_range]
  nodes[children_range] = []
  nodes.push *@put_back
end