Class: MaRuKu::In::Markdown::SpanLevelParser::HTMLHelper

### Home Classes Methods

### In Files

- lib/maruku/input/html_helper.rb

### Parent

Object

### Methods

- ::new
- #eat_this
- #handle_tag
- #is_finished?
- #stuff_you_read

### Class/Module Index

Quicksearch

- MaRuKu
- MaRuKu::AttributeList
- MaRuKu::Errors
- MaRuKu::Exception
- MaRuKu::HTMLElement
- MaRuKu::HTMLFragment
- MaRuKu::Helpers
- MaRuKu::In
- MaRuKu::In::Markdown
- MaRuKu::In::Markdown::BlockLevelParser
- MaRuKu::In::Markdown::BlockLevelParser::BlockContext
- MaRuKu::In::Markdown::BlockLevelParser::LineSource
- MaRuKu::In::Markdown::SpanExtension
- MaRuKu::In::Markdown::SpanLevelParser
- MaRuKu::In::Markdown::SpanLevelParser::CharSourceDebug
- MaRuKu::In::Markdown::SpanLevelParser::CharSourceManual
- MaRuKu::In::Markdown::SpanLevelParser::CharSourceStrscan
- MaRuKu::In::Markdown::SpanLevelParser::HTMLHelper
- MaRuKu::In::Markdown::SpanLevelParser::SpanContext
- MaRuKu::MDDocument
- MaRuKu::MDElement
- MaRuKu::MDHTMLElement
- MaRuKu::MDLine
- MaRuKu::NokogiriHTMLFragment
- MaRuKu::Out
- MaRuKu::Out::EntityTable
- MaRuKu::Out::HTML
- MaRuKu::Out::HTML::HTMLElement
- MaRuKu::Out::Latex
- MaRuKu::Out::Latex::MDDocumentExtensions
- MaRuKu::Out::Markdown
- MaRuKu::REXMLHTMLFragment
- MaRuKu::Section
- MaRuKu::Strings
- Maruku
- Maruku::In
- Maruku::In::Markdown
- Maruku::In::Markdown::FencedCode
- Object
- String
- Textile2Signature

No matching classes.

# MaRuKu::In::Markdown::SpanLevelParser::HTMLHelper

This class helps me read and sanitize HTML blocks

### Constants

CData
CDataEnd
CommentEnd
CommentStart
EverythingElse
PartialTag
TO_SANITIZE
Tag

### Attributes

first_tag[R]
rest[R]
state[RW]

### Public Class Methods

new() click to toggle source

    # File lib/maruku/input/html_helper.rb, line 17
    def initialize
      @rest = ""
      @tag_stack = []
      @m = nil
      @already = ""
      self.state = :inside_element
    end

### Public Instance Methods

eat_this(line) click to toggle source

    # File lib/maruku/input/html_helper.rb, line 27
    def eat_this(line)
      @rest = line + @rest
      things_read = 0
      until @rest.empty?
        case self.state
        when :inside_comment
          if @m = CommentEnd.match(@rest)
            debug_state 'Comment End'
            # Workaround for https://bugs.ruby-lang.org/issues/9277 and another bug in 1.9.2 where even a
            # single dash in a comment will cause REXML to error.
            @already << @m.pre_match.gsub(/-(?![^\-])/, '- ') << @m.to_s
            @rest = @m.post_match
            self.state = :inside_element
          else
            @already << @rest.gsub(/-(?![^\-])/, '- ') # Workaround for https://bugs.ruby-lang.org/issues/9277
            @rest = ""
            self.state = :inside_comment
          end
        when :inside_element
          if @m = CommentStart.match(@rest)
            debug_state 'Comment'
            things_read += 1
            @already << @m.pre_match << @m.to_s
            @rest = @m.post_match
            self.state = :inside_comment
          elsif @m = Tag.match(@rest)
            debug_state 'Tag'
            things_read += 1
            self.state = :inside_element
            handle_tag
          elsif @m = CData.match(@rest)
            debug_state 'CDATA'
            @already << @m.pre_match
            close_script_style if script_style?
            @already << @m.to_s
            @rest = @m.post_match
            self.state = :inside_cdata
          elsif @m = PartialTag.match(@rest)
            debug_state 'PartialTag'
            @already << @m.pre_match
            @rest = @m.post_match
            @partial_tag = @m.to_s
            self.state = :inside_tag
          elsif @m = EverythingElse.match(@rest)
            debug_state 'EverythingElse'
            @already << @m.pre_match << @m.to_s
            @rest = @m.post_match
            self.state = :inside_element
          else
            error "Malformed HTML: not complete: #{@rest.inspect}"
          end
        when :inside_tag
          if @m = /^[^>]*>/.match(@rest)
            @partial_tag << @m.to_s
            @rest = @partial_tag + @m.post_match
            @partial_tag = nil
            self.state = :inside_element
            if @m = Tag.match(@rest)
              things_read += 1
              handle_tag
            end
          else
            @partial_tag << @rest
            @rest = ""
            self.state = :inside_tag
          end
        when :inside_cdata
          if @m = CDataEnd.match(@rest)
            self.state = :inside_element
            @already << @m.pre_match << @m.to_s
            @rest = @m.post_match
            start_script_style if script_style?
          else
            @already << @rest
            @rest = ""
            self.state = :inside_cdata
          end
        else
          raise "Bug bug: state = #{self.state.inspect}"
        end

        break if is_finished? && things_read > 0
      end
    end

handle_tag() click to toggle source

    # File lib/maruku/input/html_helper.rb, line 112
    def handle_tag
      @already << @m.pre_match
      @rest = @m.post_match

      is_closing = !!@m[1]
      tag = @m[2]
      @first_tag ||= tag
      attributes = @m[3].to_s

      is_single = false
      if attributes[-1, 1] == '/'
        attributes = attributes[0, attributes.size - 1]
        is_single = true
      end

      if TO_SANITIZE.include? tag
        attributes.strip!
        if attributes.size > 0
          @already << '<%s %s />' % [tag, attributes]
        else
          @already << '<%s />' % [tag]
        end
      elsif is_closing
        if @tag_stack.empty?
          error "Malformed: closing tag #{tag.inspect} in empty list"
        elsif @tag_stack.last != tag
          error "Malformed: tag <#{tag}> closes <#{@tag_stack.last}>"
        end

        close_script_style if script_style?

        @already << @m.to_s
        @tag_stack.pop
      else
        @already << @m.to_s
        @tag_stack.push(tag) unless is_single

        start_script_style if script_style?
      end
    end

is_finished?() click to toggle source

    # File lib/maruku/input/html_helper.rb, line 157
    def is_finished?
      self.state == :inside_element && @tag_stack.empty?
    end

stuff_you_read() click to toggle source

    # File lib/maruku/input/html_helper.rb, line 153
    def stuff_you_read
      @already
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.