Sha256: 9219b80f07fa1134b59e74f3e376d5e04d6a48764a968b9c8feeca7526441435
Contents?: true
Size: 1.64 KB
Versions: 23
Compression:
Stored size: 1.64 KB
Contents
# frozen_string_literal: true module Asciidoctor module PDF module Sanitizer XMLSpecialChars = { '<' => '<', '>' => '>', '&' => '&', } XMLSpecialCharsRx = /(?:#{XMLSpecialChars.keys.join '|'})/ InverseXMLSpecialChars = XMLSpecialChars.invert InverseXMLSpecialCharsRx = /[#{InverseXMLSpecialChars.keys.join}]/ (BuiltInNamedEntities = { 'amp' => '&', 'apos' => ?', 'gt' => '>', 'lt' => '<', 'nbsp' => ' ', 'quot' => '"', }).default = '?' SanitizeXMLRx = /<[^>]+>/ CharRefRx = /&(?:amp;)?(?:([a-z][a-z]+\d{0,2})|#(?:(\d\d\d{0,4})|x(\h\h\h{0,3})));/ UnescapedAmpersandRx = /&(?!(?:[a-z][a-z]+\d{0,2}|#(?:\d\d\d{0,4}|x\h\h\h{0,3}));)/ # Strip leading, trailing and repeating whitespace, remove XML tags and # resolve all entities in the specified string. # # FIXME: move to a module so we can mix it in elsewhere # FIXME: add option to control escaping entities, or a filter mechanism in general def sanitize string string = string.gsub SanitizeXMLRx, '' if string.include? '<' string = string.gsub(CharRefRx) { $1 ? BuiltInNamedEntities[$1] : ([$2 ? $2.to_i : ($3.to_i 16)].pack 'U1') } if string.include? '&' string.strip.tr_s ' ', ' ' end def escape_xml string string.gsub InverseXMLSpecialCharsRx, InverseXMLSpecialChars end def escape_amp string string.gsub UnescapedAmpersandRx, '&' end def encode_quotes string (string.include? '"') ? (string.gsub '"', '"') : string end end end end
Version data entries
23 entries across 23 versions & 1 rubygems