1#vim:ts=2 sw=2 noexpandtab: 2require 'rexml/child' 3require 'rexml/source' 4 5module REXML 6 # This class needs: 7 # * Documentation 8 # * Work! Not all types of attlists are intelligently parsed, so we just 9 # spew back out what we get in. This works, but it would be better if 10 # we formatted the output ourselves. 11 # 12 # AttlistDecls provide *just* enough support to allow namespace 13 # declarations. If you need some sort of generalized support, or have an 14 # interesting idea about how to map the hideous, terrible design of DTD 15 # AttlistDecls onto an intuitive Ruby interface, let me know. I'm desperate 16 # for anything to make DTDs more palateable. 17 class AttlistDecl < Child 18 include Enumerable 19 20 # What is this? Got me. 21 attr_reader :element_name 22 23 # Create an AttlistDecl, pulling the information from a Source. Notice 24 # that this isn't very convenient; to create an AttlistDecl, you basically 25 # have to format it yourself, and then have the initializer parse it. 26 # Sorry, but for the forseeable future, DTD support in REXML is pretty 27 # weak on convenience. Have I mentioned how much I hate DTDs? 28 def initialize(source) 29 super() 30 if (source.kind_of? Array) 31 @element_name, @pairs, @contents = *source 32 end 33 end 34 35 # Access the attlist attribute/value pairs. 36 # value = attlist_decl[ attribute_name ] 37 def [](key) 38 @pairs[key] 39 end 40 41 # Whether an attlist declaration includes the given attribute definition 42 # if attlist_decl.include? "xmlns:foobar" 43 def include?(key) 44 @pairs.keys.include? key 45 end 46 47 # Iterate over the key/value pairs: 48 # attlist_decl.each { |attribute_name, attribute_value| ... } 49 def each(&block) 50 @pairs.each(&block) 51 end 52 53 # Write out exactly what we got in. 54 def write out, indent=-1 55 out << @contents 56 end 57 58 def node_type 59 :attlistdecl 60 end 61 end 62end 63