Class | Plist::StreamParser |
In: |
lib/facter/util/plist/parser.rb
|
Parent: | Object |
TEXT | = | /([^<]+)/ |
XMLDECL_PATTERN | = | /<\?xml\s+(.*?)\?>*/um |
DOCTYPE_PATTERN | = | /\s*<!DOCTYPE\s+(.*?)(\[|>)/um |
COMMENT_START | = | /\A<!--/u |
COMMENT_END | = | /.*?-->/um |
# File lib/facter/util/plist/parser.rb, line 62 62: def initialize( filename_or_xml, listener ) 63: @filename_or_xml = filename_or_xml 64: @listener = listener 65: end
# File lib/facter/util/plist/parser.rb, line 74 74: def parse 75: plist_tags = PTag::mappings.keys.join('|') 76: start_tag = /<(#{plist_tags})([^>]*)>/i 77: end_tag = /<\/(#{plist_tags})[^>]*>/i 78: 79: require 'strscan' 80: 81: contents = ( 82: if (File.exists? @filename_or_xml) 83: File.open(@filename_or_xml) {|f| f.read} 84: else 85: @filename_or_xml 86: end 87: ) 88: 89: @scanner = StringScanner.new( contents ) 90: until @scanner.eos? 91: if @scanner.scan(COMMENT_START) 92: @scanner.scan(COMMENT_END) 93: elsif @scanner.scan(XMLDECL_PATTERN) 94: elsif @scanner.scan(DOCTYPE_PATTERN) 95: elsif @scanner.scan(start_tag) 96: @listener.tag_start(@scanner[1], nil) 97: if (@scanner[2] =~ /\/$/) 98: @listener.tag_end(@scanner[1]) 99: end 100: elsif @scanner.scan(TEXT) 101: @listener.text(@scanner[1]) 102: elsif @scanner.scan(end_tag) 103: @listener.tag_end(@scanner[1]) 104: else 105: raise "Unimplemented element" 106: end 107: end 108: end