# class Kramdown::Parser::GFM

### Constants

ATX_HEADER_START
ESCAPED_CHARS_GFM
FENCED_CODEBLOCK_MATCH
FENCED_CODEBLOCK_START
NON_WORD_RE
PARAGRAPH_END_GFM
STRIKETHROUGH_DELIM
STRIKETHROUGH_MATCH

### Public Class Methods

new(source, options) click to toggle source
Calls superclass method Kramdown::Parser::Kramdown.new

    # File lib/kramdown/parser/gfm.rb, line 16
    def initialize(source, options)
      super
      @options[:auto_id_stripping] = true
      @id_counter = Hash.new(-1)

      @span_parsers.delete(:line_break) if @options[:hard_wrap]
      if @options[:gfm_quirks].include?(:paragraph_end)
        atx_header_parser = :atx_header_gfm_quirk
        @paragraph_end = self.class::PARAGRAPH_END_GFM
      else
        atx_header_parser = :atx_header_gfm
        @paragraph_end = self.class::PARAGRAPH_END
      end

      {:codeblock_fenced => :codeblock_fenced_gfm,
        :atx_header => atx_header_parser}.each do |current, replacement|
        i = @block_parsers.index(current)
        @block_parsers.delete(current)
        @block_parsers.insert(i, replacement)
      end

      i = @span_parsers.index(:escaped_chars)
      @span_parsers[i] = :escaped_chars_gfm if i
      @span_parsers << :strikethrough_gfm
    end

### Public Instance Methods

generate_gfm_header_id(text) click to toggle source

    # File lib/kramdown/parser/gfm.rb, line 104
    def generate_gfm_header_id(text)
      result = text.downcase
      result.gsub!(NON_WORD_RE, '')
      result.tr!(" \t", '-')
      @id_counter[result] += 1
      result << (@id_counter[result] > 0 ? "-#{@id_counter[result]}" : '')
      @options[:auto_id_prefix] + result
    end

paragraph_end() click to toggle source

    # File lib/kramdown/parser/gfm.rb, line 161
    def paragraph_end
      @paragraph_end
    end

parse() click to toggle source
Calls superclass method Kramdown::Parser::Kramdown#parse

    # File lib/kramdown/parser/gfm.rb, line 42
    def parse
      super
      update_elements(@root)
    end

parse_atx_header_gfm_quirk() click to toggle source

Copied from kramdown/parser/kramdown/header.rb, removed the first line

    # File lib/kramdown/parser/gfm.rb, line 118
    def parse_atx_header_gfm_quirk
      start_line_number = @src.current_line_number
      @src.check(ATX_HEADER_MATCH)
      level, text, id = @src[1], @src[2].to_s.strip, @src[3]
      return false if text.empty?

      @src.pos += @src.matched_size
      el = new_block_el(:header, nil, nil, :level => level.length, :raw_text => text, :location => start_line_number)
      add_text(text, el)
      el.attr['id'] = id if id
      @tree.children << el
      true
    end

parse_strikethrough_gfm() click to toggle source

    # File lib/kramdown/parser/gfm.rb, line 140
    def parse_strikethrough_gfm
      line_number = @src.current_line_number

      @src.pos += @src.matched_size
      el = Element.new(:html_element, 'del', {}, :category => :span, :line => line_number)
      @tree.children << el

      env = save_env
      reset_env(:src => Kramdown::Utils::StringScanner.new(@src.matched[2..-3], line_number),
                :text_type => :text)
      parse_spans(el)
      restore_env(env)

      el
    end

update_elements(element) click to toggle source

    # File lib/kramdown/parser/gfm.rb, line 47
    def update_elements(element)
      element.children.map! do |child|
        if child.type == :text && @options[:hard_wrap] && child.value =~ /\n/
          children = []
          lines = child.value.split(/\n/, -1)
          omit_trailing_br = (Kramdown::Element.category(element) == :block && element.children[-1] == child &&
                              lines[-1].empty?)
          lines.each_with_index do |line, index|
            new_element_options = { :location => child.options[:location] + index }

            children << Element.new(:text, (index > 0 ? "\n#{line}" : line), nil, new_element_options)
            children << Element.new(:br, nil, nil, new_element_options) if index < lines.size - 2 ||
              (index == lines.size - 2 && !omit_trailing_br)
          end
          children
        elsif child.type == :html_element
          child
        elsif child.type == :header && @options[:auto_ids] && !child.attr.has_key?('id')
          child.attr['id'] = generate_gfm_header_id(child.options[:raw_text])
          child
        else
          update_elements(child)
          child
        end
      end.flatten!
    end

update_raw_text(item) click to toggle source

Update the raw text for automatic ID generation.

    # File lib/kramdown/parser/gfm.rb, line 75
    def update_raw_text(item)
      raw_text = ''

      append_text = lambda do |child|
        if child.type == :text || child.type == :codespan || child.type ==:math
          raw_text << child.value
        elsif child.type == :entity
          raw_text << child.value.char
        elsif child.type == :smart_quote
          raw_text << ::Kramdown::Utils::Entities.entity(child.value.to_s).char
        elsif child.type == :typographic_sym
          if child.value == :laquo_space
            raw_text << "« "
          elsif child.value == :raquo_space
            raw_text << " »"
          else
            raw_text << ::Kramdown::Utils::Entities.entity(child.value.to_s).char
          end
        else
          child.children.each {|c| append_text.call(c)}
        end
      end

      append_text.call(item)
      item.options[:raw_text] = raw_text
    end