Class: Slamdown::Conversion::Rendering::Escaper
- Inherits:
-
Object
- Object
- Slamdown::Conversion::Rendering::Escaper
- Defined in:
- lib/slamdown/conversion/rendering/escaper.rb
Overview
Escapes generated Markdown contextually so source text cannot become unintended block or inline syntax when reparsed.
Constant Summary collapse
- INLINE_PUNCTUATION =
/[*_\[\]`|]/.freeze
- SPACE_OR_CONTROL =
/[\x00-\x20]/.freeze
Instance Method Summary collapse
- #destination(value, escape_ampersand: true) ⇒ Object
- #label(value) ⇒ Object
- #text(value, line_start: false, escape_definition_marker: false) ⇒ Object
- #title(value, escape_ampersand: true) ⇒ Object
Instance Method Details
#destination(value, escape_ampersand: true) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/slamdown/conversion/rendering/escaper.rb', line 23 def destination(value, escape_ampersand: true) value.to_s.each_char.map do |character| if SPACE_OR_CONTROL.match(character) || ["<", ">"].include?(character) character.bytes.map { |byte| "%%%02X" % byte }.join elsif character == "&" && escape_ampersand "&" elsif ["\\", "(", ")"].include?(character) "\\#{character}" else character end end.join end |
#label(value) ⇒ Object
19 20 21 |
# File 'lib/slamdown/conversion/rendering/escaper.rb', line 19 def label(value) text(value.to_s.gsub(/[\r\n]+/, " ")) end |
#text(value, line_start: false, escape_definition_marker: false) ⇒ Object
12 13 14 15 16 17 |
# File 'lib/slamdown/conversion/rendering/escaper.rb', line 12 def text(value, line_start: false, escape_definition_marker: false) result = value.to_s.gsub("\\", "\\\\").gsub("<", "<").gsub(">", ">") result = result.gsub(INLINE_PUNCTUATION) { |character| "\\#{character}" } result = result.gsub(/\{(?=:)/, "\\{") line_start ? escape_block_start(result, escape_definition_marker) : result end |
#title(value, escape_ampersand: true) ⇒ Object
37 38 39 40 41 |
# File 'lib/slamdown/conversion/rendering/escaper.rb', line 37 def title(value, escape_ampersand: true) result = value.to_s.gsub(/[\r\n]+/, " ").gsub("\\", "\\\\") result = result.gsub("&", "&") if escape_ampersand result.gsub("<", "\\<").gsub('"', '\\"') end |