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