From: "Andrew S. Townley" Date: 2009-03-29T19:48:33+09:00 Subject: [PATCH] tagz-5.0.1 -- processing instruction support Hi Ara, I was actually working on another machine where I had to install tagz. I noticed this morning when I was trying to do a line-by-line comparison, that this machine had 5.0.1 instead of 5.0.0. It appears that the behavior is fixed by the change between 5.0.0 and 5.0.1. Given this, I've re-patched 5.0.1 with the PI support (if anyone else cares), and included it below. $ ruby a.rb hello worldhello world Cheers, ast $ diff -u /usr/lib/ruby/gems/1.8/gems/tagz-5.0.1/lib/tagz.rb tagz-local.rb --- /usr/lib/ruby/gems/1.8/gems/tagz-5.0.1/lib/tagz.rb 2009-03-28 04:08:17.000000000 +0000 +++ tagz-local.rb 2009-03-28 08:57:43.000000000 +0000 @@ -5,7 +5,7 @@ Tagz::VERSION = [ Tagz::VERSION_MAJOR = 5, Tagz::VERSION_MINOR = 0, - Tagz::VERSION_TEENY = 1 + Tagz::VERSION_TEENY = 0 ].join('.') def Tagz.version() Tagz::VERSION end end @@ -15,27 +15,7 @@ # open_tag # def tagz__ name, *argv, &block - options = argv.last.is_a?(Hash) ? argv.pop : {} - content = argv - - unless options.empty? - attributes = ' ' << - options.map do |key, value| - key = XChar.escape key.to_s - value = XChar.escape value.to_s - if value =~ %r/"/ - raise ArgumentError, value if value =~ %r/'/ - value = "'#{ value }'" - else - raise ArgumentError, value if value =~ %r/"/ - value = "\"#{ value }\"" - end - [key, value].join('=') - end.join(' ') - else - attributes = '' - end - + attributes, content = process_attributes *argv, &block tagz.concat "<#{ name }#{ attributes }>" if content.empty? @@ -53,7 +33,6 @@ tagz << value.to_s unless(tagz.size > size) tagz.concat "" end - end else tagz << content.join @@ -74,6 +53,13 @@ tagz.concat "" end + # processing instruction + # + def tagz_? name, *argv, &block + attributes, content = process_attributes *argv, &block + tagz.concat "" + end + # access tagz doc and enclose tagz operations # def tagz document = nil, &block @@ -100,6 +86,8 @@ def method_missing m, *a, &b strategy = case m.to_s + when %r/^(.*[^?])_\?$/o + :processing_instruction when %r/^(.*[^_])_(!)?$/o :open_tag when %r/^_([^_].*)$/o @@ -125,6 +113,9 @@ m, bang = $1, $2 b ||= lambda{} if bang tagz{ tagz__(m, *a, &b) } + when :processing_instruction + m = $1 + tagz{ tagz_?(m, *a, &b) } when :close_tag m = $1 tagz{ __tagz(m, *a, &b) } @@ -141,6 +132,33 @@ end end + def process_attributes *argv, &block + options = argv.last.is_a?(Hash) ? argv.pop : {} + content = argv + + attributes = nil + + unless options.empty? + attributes = ' ' << + options.map do |key, value| + key = XChar.escape key.to_s + value = XChar.escape value.to_s + if value =~ %r/"/ + raise ArgumentError, value if value =~ %r/'/ + value = "'#{ value }'" + else + raise ArgumentError, value if value =~ %r/"/ + value = "\"#{ value }\"" + end + [key, value].join('=') + end.join(' ') + else + attributes = '' + end + + [ attributes, content ] + end + class Document < ::String def Document.for other Document === other ? other : Document.new(other.to_s) -- Andrew S. Townley http://atownley.org