Class: MaRuKu::In::Markdown::SpanLevelParser::HTMLHelper
- Inherits:
-
Object
- Object
- MaRuKu::In::Markdown::SpanLevelParser::HTMLHelper
- Defined in:
- lib/maruku/input/html_helper.rb
Overview
This class helps me read and sanitize HTML blocks
Constant Summary collapse
- Tag =
%r{^<(/)?(\w+)\s*([^>]*?)>}m
- PartialTag =
%r{^<.*}m
- CData =
%r{^\s*<!\[CDATA\[}m
- CDataEnd =
%r{\]\]>}m
- EverythingElse =
%r{^[^<]+}m
- CommentStart =
%r{^<!--}x
- CommentEnd =
%r{-->}
- TO_SANITIZE =
['img', 'hr', 'br']
Instance Attribute Summary collapse
-
#first_tag ⇒ Object
readonly
Returns the value of attribute first_tag.
-
#rest ⇒ Object
readonly
Returns the value of attribute rest.
-
#state ⇒ Object
:inside_element, :inside_tag, :inside_comment, :inside_cdata.
Instance Method Summary collapse
- #eat_this(line) ⇒ Object
- #handle_tag ⇒ Object
-
#initialize ⇒ HTMLHelper
constructor
A new instance of HTMLHelper.
- #is_finished? ⇒ Boolean
- #stuff_you_read ⇒ Object
Constructor Details
#initialize ⇒ HTMLHelper
Returns a new instance of HTMLHelper.
17 18 19 20 21 22 23 |
# File 'lib/maruku/input/html_helper.rb', line 17 def initialize @rest = "" @tag_stack = [] @m = nil @already = "" self.state = :inside_element end |
Instance Attribute Details
#first_tag ⇒ Object (readonly)
Returns the value of attribute first_tag.
15 16 17 |
# File 'lib/maruku/input/html_helper.rb', line 15 def first_tag @first_tag end |
#rest ⇒ Object (readonly)
Returns the value of attribute rest.
15 16 17 |
# File 'lib/maruku/input/html_helper.rb', line 15 def rest @rest end |
#state ⇒ Object
:inside_element, :inside_tag, :inside_comment, :inside_cdata
25 26 27 |
# File 'lib/maruku/input/html_helper.rb', line 25 def state @state end |
Instance Method Details
#eat_this(line) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# 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 ⇒ Object
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# 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? ⇒ Boolean
157 158 159 |
# File 'lib/maruku/input/html_helper.rb', line 157 def is_finished? self.state == :inside_element && @tag_stack.empty? end |
#stuff_you_read ⇒ Object
153 154 155 |
# File 'lib/maruku/input/html_helper.rb', line 153 def stuff_you_read @already end |