lib/chef/mixin/xml_escape.rb in chef-0.9.8 vs lib/chef/mixin/xml_escape.rb in chef-0.9.10.rc.0

- old
+ new

@@ -44,71 +44,97 @@ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +require 'chef/log' +begin + require 'fast_xs' +rescue LoadError + Chef::Log.info "The fast_xs gem is not installed, slower pure ruby XML escaping will be used." +end + class Chef module Mixin module XMLEscape - extend self - CP1252 = { - 128 => 8364, # euro sign - 130 => 8218, # single low-9 quotation mark - 131 => 402, # latin small letter f with hook - 132 => 8222, # double low-9 quotation mark - 133 => 8230, # horizontal ellipsis - 134 => 8224, # dagger - 135 => 8225, # double dagger - 136 => 710, # modifier letter circumflex accent - 137 => 8240, # per mille sign - 138 => 352, # latin capital letter s with caron - 139 => 8249, # single left-pointing angle quotation mark - 140 => 338, # latin capital ligature oe - 142 => 381, # latin capital letter z with caron - 145 => 8216, # left single quotation mark - 146 => 8217, # right single quotation mark - 147 => 8220, # left double quotation mark - 148 => 8221, # right double quotation mark - 149 => 8226, # bullet - 150 => 8211, # en dash - 151 => 8212, # em dash - 152 => 732, # small tilde - 153 => 8482, # trade mark sign - 154 => 353, # latin small letter s with caron - 155 => 8250, # single right-pointing angle quotation mark - 156 => 339, # latin small ligature oe - 158 => 382, # latin small letter z with caron - 159 => 376 # latin capital letter y with diaeresis - } + module PureRuby + extend self - # http://www.w3.org/TR/REC-xml/#dt-chardata - PREDEFINED = { - 38 => '&amp;', # ampersand - 60 => '&lt;', # left angle bracket - 62 => '&gt;' # right angle bracket - } + CP1252 = { + 128 => 8364, # euro sign + 130 => 8218, # single low-9 quotation mark + 131 => 402, # latin small letter f with hook + 132 => 8222, # double low-9 quotation mark + 133 => 8230, # horizontal ellipsis + 134 => 8224, # dagger + 135 => 8225, # double dagger + 136 => 710, # modifier letter circumflex accent + 137 => 8240, # per mille sign + 138 => 352, # latin capital letter s with caron + 139 => 8249, # single left-pointing angle quotation mark + 140 => 338, # latin capital ligature oe + 142 => 381, # latin capital letter z with caron + 145 => 8216, # left single quotation mark + 146 => 8217, # right single quotation mark + 147 => 8220, # left double quotation mark + 148 => 8221, # right double quotation mark + 149 => 8226, # bullet + 150 => 8211, # en dash + 151 => 8212, # em dash + 152 => 732, # small tilde + 153 => 8482, # trade mark sign + 154 => 353, # latin small letter s with caron + 155 => 8250, # single right-pointing angle quotation mark + 156 => 339, # latin small ligature oe + 158 => 382, # latin small letter z with caron + 159 => 376 # latin capital letter y with diaeresis + } - # http://www.w3.org/TR/REC-xml/#charsets - VALID = [[0x9, 0xA, 0xD], (0x20..0xD7FF), - (0xE000..0xFFFD), (0x10000..0x10FFFF)] + # http://www.w3.org/TR/REC-xml/#dt-chardata + PREDEFINED = { + 38 => '&amp;', # ampersand + 60 => '&lt;', # left angle bracket + 62 => '&gt;' # right angle bracket + } - def xml_escape(unescaped_str) - begin - unescaped_str.unpack("U*").map {|char| xml_escape_char!(char)}.join - rescue - unescaped_str.unpack("C*").map {|char| xml_escape_char!(char)}.join + # http://www.w3.org/TR/REC-xml/#charsets + VALID = [[0x9, 0xA, 0xD], (0x20..0xD7FF), + (0xE000..0xFFFD), (0x10000..0x10FFFF)] + + def xml_escape(unescaped_str) + begin + unescaped_str.unpack("U*").map {|char| xml_escape_char!(char)}.join + rescue + unescaped_str.unpack("C*").map {|char| xml_escape_char!(char)}.join + end end + + private + + def xml_escape_char!(char) + char = CP1252[char] || char + char = 42 unless VALID.detect {|range| range.include? char} + char = PREDEFINED[char] || (char<128 ? char.chr : "&##{char};") + end end + + module FastXS + extend self - private + def xml_escape(string) + string.fast_xs + end - def xml_escape_char!(char) - char = CP1252[char] || char - char = 42 unless VALID.detect {|range| range.include? char} - char = PREDEFINED[char] || (char<128 ? char.chr : "&##{char};") end + if "strings".respond_to?(:fast_xs) + include FastXS + extend FastXS + else + include PureRuby + extend PureRuby + end end end end