A
Andrew S. Townley
Hi Ara,
I'm sure you're sick of me by now, but I've added processing instruction
support to tagz. It may not suit your style, but I've tried to keep it
in the spirit of the library.
excalibur$ diff
-u /var/lib/gems/1.8/gems/tagz-5.0.0/lib/tagz.rb /tmp/tagz.rb
--- /var/lib/gems/1.8/gems/tagz-5.0.0/lib/tagz.rb 2009-03-24
11:58:05.000000000 +0000
+++ /tmp/tagz.rb 2009-03-27 18:01:11.000000000 +0000
@@ -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?
@@ -68,6 +48,13 @@
tagz.concat "</#{ tag }>"
end
+ # processing instruction
+ #
+ def tagz_? name, *argv, &block
+ attributes, content = process_attributes *argv, &block
+ tagz.concat "<?#{ name }#{ attributes }?>"
+ end
+
# access tagz doc and enclose tagz operations
#
def tagz document = nil, &block
@@ -94,6 +81,8 @@
def method_missing m, *a, &b
strategy =
case m.to_s
+ when %r/^(.*[^?])_\?$/o
+ rocessing_instruction
when %r/^(.*[^_])_(!)?$/o
pen_tag
when %r/^_([^_].*)$/o
@@ -119,6 +108,9 @@
m, bang = $1, $2
b ||= lambda{} if bang
tagz{ tagz__(m, *a, &b) }
+ when rocessing_instruction
+ m = $1
+ tagz{ tagz_?(m, *a, &b) }
when :close_tag
m = $1
tagz{ __tagz(m, *a, &b) }
@@ -135,6 +127,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)
excalibur$ cat c.rb
require 'tagz'
include Tagz.globally
doc =
Tagz {
xml_?version => "1.0")
mypi_?arg1 => "foo")
tagz_?("xml-stylesheet", :href => "classic.xsl", :type =>
"text/xml")
test_!
}
puts doc
excalibur$ ruby c.rb
<?xml version="1.0"?><?mypi arg1="foo"?><?xml-stylesheet type="text/xml"
href="classic.xsl"?><test/>
I'm sure you're sick of me by now, but I've added processing instruction
support to tagz. It may not suit your style, but I've tried to keep it
in the spirit of the library.
excalibur$ diff
-u /var/lib/gems/1.8/gems/tagz-5.0.0/lib/tagz.rb /tmp/tagz.rb
--- /var/lib/gems/1.8/gems/tagz-5.0.0/lib/tagz.rb 2009-03-24
11:58:05.000000000 +0000
+++ /tmp/tagz.rb 2009-03-27 18:01:11.000000000 +0000
@@ -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?
@@ -68,6 +48,13 @@
tagz.concat "</#{ tag }>"
end
+ # processing instruction
+ #
+ def tagz_? name, *argv, &block
+ attributes, content = process_attributes *argv, &block
+ tagz.concat "<?#{ name }#{ attributes }?>"
+ end
+
# access tagz doc and enclose tagz operations
#
def tagz document = nil, &block
@@ -94,6 +81,8 @@
def method_missing m, *a, &b
strategy =
case m.to_s
+ when %r/^(.*[^?])_\?$/o
+ rocessing_instruction
when %r/^(.*[^_])_(!)?$/o
pen_tag
when %r/^_([^_].*)$/o
@@ -119,6 +108,9 @@
m, bang = $1, $2
b ||= lambda{} if bang
tagz{ tagz__(m, *a, &b) }
+ when rocessing_instruction
+ m = $1
+ tagz{ tagz_?(m, *a, &b) }
when :close_tag
m = $1
tagz{ __tagz(m, *a, &b) }
@@ -135,6 +127,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)
excalibur$ cat c.rb
require 'tagz'
include Tagz.globally
doc =
Tagz {
xml_?version => "1.0")
mypi_?arg1 => "foo")
tagz_?("xml-stylesheet", :href => "classic.xsl", :type =>
"text/xml")
test_!
}
puts doc
excalibur$ ruby c.rb
<?xml version="1.0"?><?mypi arg1="foo"?><?xml-stylesheet type="text/xml"
href="classic.xsl"?><test/>