1# frozen_string_literal: false 2begin 3 require "xml/parser" 4rescue LoadError 5 require "xmlparser" 6end 7 8begin 9 require "xml/encoding-ja" 10rescue LoadError 11 require "xmlencoding-ja" 12 if defined?(Kconv) 13 module XMLEncoding_ja 14 class SJISHandler 15 include Kconv 16 end 17 end 18 end 19end 20 21module XML 22 class Parser 23 unless defined?(Error) 24 # This error is legacy, so we just set it to the new one 25 Error = ::XMLParserError # :nodoc: 26 end 27 end 28end 29 30module RSS 31 32 class REXMLLikeXMLParser < ::XML::Parser 33 34 include ::XML::Encoding_ja 35 36 def listener=(listener) 37 @listener = listener 38 end 39 40 def startElement(name, attrs) 41 @listener.tag_start(name, attrs) 42 end 43 44 def endElement(name) 45 @listener.tag_end(name) 46 end 47 48 def character(data) 49 @listener.text(data) 50 end 51 52 def xmlDecl(version, encoding, standalone) 53 @listener.xmldecl(version, encoding, standalone == 1) 54 end 55 56 def processingInstruction(target, content) 57 @listener.instruction(target, content) 58 end 59 60 end 61 62 class XMLParserParser < BaseParser 63 64 class << self 65 def listener 66 XMLParserListener 67 end 68 end 69 70 private 71 def _parse 72 begin 73 parser = REXMLLikeXMLParser.new 74 parser.listener = @listener 75 parser.parse(@rss) 76 rescue ::XML::Parser::Error => e 77 raise NotWellFormedError.new(parser.line){e.message} 78 end 79 end 80 81 end 82 83 class XMLParserListener < BaseListener 84 85 include ListenerMixin 86 87 def xmldecl(version, encoding, standalone) 88 super 89 # Encoding is converted to UTF-8 when XMLParser parses XML. 90 @encoding = 'UTF-8' 91 end 92 93 end 94 95end 96