Edgewall Software

Ticket #111: xmldecl-r557.diff

File xmldecl-r557.diff, 5.9 KB (added by Alec Thomas <alec@…>, 16 years ago)

Patch adding support for the XML declaration

  • genshi/core.py

     
    6262    START_CDATA = StreamEventKind('START_CDATA') #: start CDATA section
    6363    END_CDATA = StreamEventKind('END_CDATA') #: end CDATA section
    6464    PI = StreamEventKind('PI') #: processing instruction
     65    XML_DECL = StreamEventKind('XML_DECL') #: XML declaration PI
    6566    COMMENT = StreamEventKind('COMMENT') #: comment
    6667
    6768    def __init__(self, events):
     
    214215START_CDATA = Stream.START_CDATA
    215216END_CDATA = Stream.END_CDATA
    216217PI = Stream.PI
     218XML_DECL = Stream.XML_DECL
    217219COMMENT = Stream.COMMENT
    218220
    219221def _ensure(stream):
  • genshi/tests/input.py

     
    7171        <div>\xf6</div>
    7272        """.encode('iso-8859-1')
    7373        events = list(XMLParser(StringIO(text)))
    74         kind, data, pos = events[1]
     74        kind, data, pos = events[2]
    7575        self.assertEqual(Stream.TEXT, kind)
    7676        self.assertEqual(u'\xf6', data)
    7777
     
    181181        self.assertEqual(u'php', target)
    182182        self.assertEqual(u'echo "Foobar"', data)
    183183
     184    def test_xmldecl(self):
     185        text = '<?xml version="1.0" ?><root />'
     186        events = list(XMLParser(StringIO(text)))
     187        kind, (version, encoding, standalone), pos = events[0]
     188        self.assertEqual(Stream.XML_DECL, kind)
     189        self.assertEqual(u'1.0', version)
     190        self.assertEqual(None, encoding)
     191        self.assertEqual(-1, standalone)
     192
     193    def test_xmldecl_encoding(self):
     194        text = '<?xml version="1.0" encoding="utf-8" ?><root />'
     195        events = list(XMLParser(StringIO(text)))
     196        kind, (version, encoding, standalone), pos = events[0]
     197        self.assertEqual(Stream.XML_DECL, kind)
     198        self.assertEqual(u'1.0', version)
     199        self.assertEqual(u'utf-8', encoding)
     200        self.assertEqual(-1, standalone)
     201
     202    def test_xmldecl_standalone(self):
     203        text = '<?xml version="1.0" standalone="yes" ?><root />'
     204        events = list(XMLParser(StringIO(text)))
     205        kind, (version, encoding, standalone), pos = events[0]
     206        self.assertEqual(Stream.XML_DECL, kind)
     207        self.assertEqual(u'1.0', version)
     208        self.assertEqual(None, encoding)
     209        self.assertEqual(1, standalone)
     210
    184211    def test_processing_instruction_trailing_qmark(self):
    185212        text = '<?php echo "Foobar" ??>'
    186213        events = list(HTMLParser(StringIO(text)))
  • genshi/input.py

     
    2727
    2828from genshi.core import Attrs, QName, Stream, stripentities
    2929from genshi.core import DOCTYPE, START, END, START_NS, END_NS, TEXT, \
    30                         START_CDATA, END_CDATA, PI, COMMENT
     30                        START_CDATA, END_CDATA, PI, XML_DECL, COMMENT
    3131
    3232__all__ = ['ET', 'ParseError', 'XMLParser', 'XML', 'HTMLParser', 'HTML']
    3333__docformat__ = 'restructuredtext en'
     
    123123        parser.StartCdataSectionHandler = self._handle_start_cdata
    124124        parser.EndCdataSectionHandler = self._handle_end_cdata
    125125        parser.ProcessingInstructionHandler = self._handle_pi
     126        parser.XmlDeclHandler = self._handle_xml_decl
    126127        parser.CommentHandler = self._handle_comment
    127128
    128129        # Tell Expat that we'll handle non-XML entities ourselves
     
    234235    def _handle_pi(self, target, data):
    235236        self._enqueue(PI, (target, data))
    236237
     238    def _handle_xml_decl(self, version, encoding, standalone):
     239        self._enqueue(XML_DECL, (version, encoding, standalone))
     240
    237241    def _handle_comment(self, text):
    238242        self._enqueue(COMMENT, text)
    239243
  • genshi/output.py

     
    2424
    2525from genshi.core import escape, Attrs, Markup, Namespace, QName, StreamEventKind
    2626from genshi.core import DOCTYPE, START, END, START_NS, END_NS, TEXT, \
    27                         START_CDATA, END_CDATA, PI, COMMENT, XML_NAMESPACE
     27                        START_CDATA, END_CDATA, PI, XML_DECL, COMMENT, \
     28                        XML_NAMESPACE
    2829
    2930__all__ = ['DocType', 'XMLSerializer', 'XHTMLSerializer', 'HTMLSerializer',
    3031           'TextSerializer']
     
    139140            elif kind is PI:
    140141                yield Markup('<?%s %s?>' % data)
    141142
     143            elif kind is XML_DECL:
     144                version, encoding, standalone = data
     145                buf = ['<?xml version="%s"' % version]
     146                if encoding:
     147                    buf.append(' encoding="%s"' % encoding)
     148                if standalone != -1:
     149                    standalone = standalone and 'yes' or 'no'
     150                    buf.append(' standalone="%s"' % standalone)
     151                buf.append('?>\n')
     152                yield Markup(u''.join(buf))
     153
    142154
    143155class XHTMLSerializer(XMLSerializer):
    144156    """Produces XHTML text from an event stream.
  • genshi/template/tests/markup.py

     
    183183        <div xmlns:py="http://genshi.edgewall.org/">
    184184          \xf6
    185185        </div>""".encode('iso-8859-1'), encoding='iso-8859-1')
    186         self.assertEqual(u"""<div>
     186        self.assertEqual(u"""<?xml version="1.0" encoding="iso-8859-1"?>\n<div>
    187187          \xf6
    188188        </div>""", unicode(tmpl.generate()))
    189189
     
    228228          <Size py:if="0" xmlns:t="test">Size</Size>
    229229          <Item/>
    230230        </Test>""")
    231         self.assertEqual("""<Test>
     231        self.assertEqual("""<?xml version="1.0"?>\n<Test>
    232232         
    233233          <Item/>
    234234        </Test>""", str(tmpl.generate()))