IGN: calibredb list with XML output: Fix entity escaping

This commit is contained in:
Kovid Goyal 2009-11-20 21:14:31 -07:00
parent 7686749b97
commit c98a4df96d

View File

@ -9,7 +9,6 @@ Command line interface to the calibre database.
import sys, os, cStringIO import sys, os, cStringIO
from textwrap import TextWrapper from textwrap import TextWrapper
from xml.sax.saxutils import escape
from calibre import terminal_controller, preferred_encoding, prints from calibre import terminal_controller, preferred_encoding, prints
from calibre.utils.config import OptionParser, prefs from calibre.utils.config import OptionParser, prefs
@ -48,10 +47,10 @@ XML_TEMPLATE = '''\
<comments>${record['comments']}</comments> <comments>${record['comments']}</comments>
<series py:if="record['series']" index="${record['series_index']}">${record['series']}</series> <series py:if="record['series']" index="${record['series_index']}">${record['series']}</series>
<isbn>${record['isbn']}</isbn> <isbn>${record['isbn']}</isbn>
<cover py:if="record['cover']">${escape(record['cover'].replace(os.sep, '/'))}</cover> <cover py:if="record['cover']">${record['cover'].replace(os.sep, '/')}</cover>
<formats py:if="record['formats']"> <formats py:if="record['formats']">
<py:for each="path in record['formats']"> <py:for each="path in record['formats']">
<format>${escape(path.replace(os.sep, '/'))}</format> <format>${path.replace(os.sep, '/')}</format>
</py:for> </py:for>
</formats> </formats>
</record> </record>
@ -186,15 +185,17 @@ def do_list(db, fields, sort_by, ascending, search_text, line_width, separator,
return o.getvalue() return o.getvalue()
elif output_format == 'xml': elif output_format == 'xml':
template = MarkupTemplate(XML_TEMPLATE) template = MarkupTemplate(XML_TEMPLATE)
return template.generate(data=data, os=os, escape=escape).render('xml') return template.generate(data=data, os=os).render('xml')
elif output_format == 'stanza': elif output_format == 'stanza':
def quote(raw):
return raw.replace('"', r'\"')
data = [i for i in data if i.has_key('fmt_epub')] data = [i for i in data if i.has_key('fmt_epub')]
for x in data: for x in data:
if isinstance(x['fmt_epub'], unicode): if isinstance(x['fmt_epub'], unicode):
x['fmt_epub'] = x['fmt_epub'].encode('utf-8') x['fmt_epub'] = x['fmt_epub'].encode('utf-8')
template = MarkupTemplate(STANZA_TEMPLATE) template = MarkupTemplate(STANZA_TEMPLATE)
return template.generate(id="urn:calibre:main", data=data, subtitle=subtitle, return template.generate(id="urn:calibre:main", data=data, subtitle=subtitle,
sep=os.sep, quote=escape, updated=db.last_modified()).render('xml') sep=os.sep, quote=quote, updated=db.last_modified()).render('xml')
def list_option_parser(): def list_option_parser():
parser = get_parser(_( parser = get_parser(_(