Class: Slamdown::Conversion::Rendering::Escaper

Inherits:
Object
  • Object
show all
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

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
			"&amp;"
		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("<", "&lt;").gsub(">", "&gt;")
	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("&", "&amp;") if escape_ampersand
	result.gsub("<", "\\<").gsub('"', '\\"')
end