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 => '&', # ampersand
- 60 => '<', # left angle bracket
- 62 => '>' # 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 => '&', # ampersand
+ 60 => '<', # left angle bracket
+ 62 => '>' # 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