merge from trunk

This commit is contained in:
Lee 2011-03-13 04:42:08 +11:00
commit 8a7a9b68e9
9 changed files with 341 additions and 334 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

View File

@ -4,6 +4,7 @@
# # # #
# # # #
# copyright 2002 Paul Henry Tremblay # # copyright 2002 Paul Henry Tremblay #
# Copyright 2011 Kovid Goyal
# # # #
# This program is distributed in the hope that it will be useful, # # This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of # # but WITHOUT ANY WARRANTY; without even the implied warranty of #
@ -19,21 +20,21 @@
######################################################################### #########################################################################
--> -->
<xsl:output method="xml" encoding="UTF-8"/> <xsl:output method="xml" encoding="UTF-8"/>
<xsl:key name="note-link" match="fb:section" use="@id"/> <xsl:key name="note-link" match="fb:section" use="@id"/>
<xsl:template match="/*"> <xsl:template match="/*">
<html> <html>
<head> <head>
<xsl:if test="fb:description/fb:title-info/fb:lang = 'ru'"> <xsl:if test="fb:description/fb:title-info/fb:lang = 'ru'">
<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8"/> <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8"/>
</xsl:if> </xsl:if>
<title> <title>
<xsl:value-of select="fb:description/fb:title-info/fb:book-title"/> <xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
</title> </title>
<style type="text/css"> <style type="text/css">
a { color : #0002CC } a { color : #0002CC }
a:hover { color : #BF0000 } a:hover { color : #BF0000 }
body { background-color : #FEFEFE; color : #000000; font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; text-align : justify } body { background-color : #FEFEFE; color : #000000; font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; text-align : justify }
@ -62,90 +63,90 @@
.epigraph{width:50%; margin-left : 35%;} .epigraph{width:50%; margin-left : 35%;}
div.paragraph { text-align: justify; text-indent: 2em; } div.paragraph { text-align: justify; text-indent: 2em; }
</style> </style>
<link rel="stylesheet" type="text/css" href="inline-styles.css" /> <link rel="stylesheet" type="text/css" href="inline-styles.css" />
</head> </head>
<body> <body>
<xsl:for-each select="fb:description/fb:title-info/fb:annotation"> <xsl:for-each select="fb:description/fb:title-info/fb:annotation">
<div> <div>
<xsl:call-template name="annotation"/> <xsl:call-template name="annotation"/>
</div> </div>
<hr/> <hr/>
</xsl:for-each> </xsl:for-each>
<!-- BUILD TOC --> <!-- BUILD TOC -->
<ul> <ul>
<xsl:apply-templates select="fb:body" mode="toc"/> <xsl:apply-templates select="fb:body" mode="toc"/>
</ul> </ul>
<hr/> <hr/>
<!-- END BUILD TOC --> <!-- END BUILD TOC -->
<!-- BUILD BOOK --> <!-- BUILD BOOK -->
<xsl:for-each select="fb:body"> <xsl:for-each select="fb:body">
<xsl:if test="position()!=1"> <xsl:if test="position()!=1">
<hr/> <hr/>
</xsl:if> </xsl:if>
<xsl:if test="@name"> <xsl:if test="@name">
<h4 align="center"> <h4 align="center">
<xsl:value-of select="@name"/> <xsl:value-of select="@name"/>
</h4> </h4>
</xsl:if> </xsl:if>
<!-- <xsl:apply-templates /> --> <!-- <xsl:apply-templates /> -->
<xsl:apply-templates/> <xsl:apply-templates/>
</xsl:for-each> </xsl:for-each>
</body> </body>
</html> </html>
</xsl:template> </xsl:template>
<!-- author template --> <!-- author template -->
<xsl:template name="author"> <xsl:template name="author">
<xsl:value-of select="fb:first-name"/> <xsl:value-of select="fb:first-name"/>
<xsl:text disable-output-escaping="no">&#032;</xsl:text> <xsl:text disable-output-escaping="no">&#032;</xsl:text>
<xsl:value-of select="fb:middle-name"/>&#032; <xsl:value-of select="fb:middle-name"/>&#032;
<xsl:text disable-output-escaping="no">&#032;</xsl:text> <xsl:text disable-output-escaping="no">&#032;</xsl:text>
<xsl:value-of select="fb:last-name"/> <xsl:value-of select="fb:last-name"/>
<br/> <br/>
</xsl:template> </xsl:template>
<!-- secuence template --> <!-- secuence template -->
<xsl:template name="sequence"> <xsl:template name="sequence">
<LI/> <LI/>
<xsl:value-of select="@name"/> <xsl:value-of select="@name"/>
<xsl:if test="@number"> <xsl:if test="@number">
<xsl:text disable-output-escaping="no">,&#032;#</xsl:text> <xsl:text disable-output-escaping="no">,&#032;#</xsl:text>
<xsl:value-of select="@number"/> <xsl:value-of select="@number"/>
</xsl:if> </xsl:if>
<xsl:if test="fb:sequence"> <xsl:if test="fb:sequence">
<ul> <ul>
<xsl:for-each select="fb:sequence"> <xsl:for-each select="fb:sequence">
<xsl:call-template name="sequence"/> <xsl:call-template name="sequence"/>
</xsl:for-each> </xsl:for-each>
</ul> </ul>
</xsl:if> </xsl:if>
<!-- <br/> --> <!-- <br/> -->
</xsl:template> </xsl:template>
<!-- toc template --> <!-- toc template -->
<xsl:template match="fb:section|fb:body" mode="toc"> <xsl:template match="fb:section|fb:body" mode="toc">
<xsl:choose> <xsl:choose>
<xsl:when test="name()='body' and position()=1 and not(fb:title)"> <xsl:when test="name()='body' and position()=1 and not(fb:title)">
<xsl:apply-templates select="fb:section" mode="toc"/> <xsl:apply-templates select="fb:section" mode="toc"/>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<li> <li>
<a href="#TOC_{generate-id()}"><xsl:value-of select="normalize-space(fb:title/fb:p[1] | @name)"/></a> <a href="#TOC_{generate-id()}"><xsl:value-of select="normalize-space(fb:title/fb:p[1] | @name)"/></a>
<xsl:if test="fb:section"> <xsl:if test="fb:section">
<ul><xsl:apply-templates select="fb:section" mode="toc"/></ul> <ul><xsl:apply-templates select="fb:section" mode="toc"/></ul>
</xsl:if> </xsl:if>
</li> </li>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:template> </xsl:template>
<!-- description --> <!-- description -->
<xsl:template match="fb:description"> <xsl:template match="fb:description">
<xsl:apply-templates/> <xsl:apply-templates/>
</xsl:template> </xsl:template>
<!-- body --> <!-- body -->
<xsl:template match="fb:body"> <xsl:template match="fb:body">
<div><xsl:apply-templates/></div> <div><xsl:apply-templates/></div>
</xsl:template> </xsl:template>
<xsl:template match="fb:section"> <xsl:template match="fb:section">
<xsl:variable name="section_has_title"> <xsl:variable name="section_has_title">
<xsl:choose> <xsl:choose>
<xsl:when test="./fb:title"><xsl:value-of select="generate-id()" /></xsl:when> <xsl:when test="./fb:title"><xsl:value-of select="generate-id()" /></xsl:when>
@ -164,15 +165,15 @@
<xsl:apply-templates> <xsl:apply-templates>
<xsl:with-param name="section_toc_id" select="$section_has_title" /> <xsl:with-param name="section_toc_id" select="$section_has_title" />
</xsl:apply-templates> </xsl:apply-templates>
</xsl:template> </xsl:template>
<!-- section/title --> <!-- section/title -->
<xsl:template match="fb:section/fb:title|fb:poem/fb:title"> <xsl:template match="fb:section/fb:title|fb:poem/fb:title">
<xsl:param name="section_toc_id" /> <xsl:param name="section_toc_id" />
<xsl:choose> <xsl:choose>
<xsl:when test="count(ancestor::node()) &lt; 9"> <xsl:when test="count(ancestor::node()) &lt; 9">
<xsl:element name="{concat('h',count(ancestor::node())-3)}"> <xsl:element name="{concat('h',count(ancestor::node())-3)}">
<xsl:if test="../@id"> <xsl:if test="../@id">
<xsl:attribute name="id"><xsl:value-of select="../@id" /></xsl:attribute> <xsl:attribute name="id"><xsl:value-of select="../@id" /></xsl:attribute>
</xsl:if> </xsl:if>
@ -181,79 +182,79 @@
<xsl:attribute name="id">TOC_<xsl:value-of select="$section_toc_id"/></xsl:attribute> <xsl:attribute name="id">TOC_<xsl:value-of select="$section_toc_id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<a name="TOC_{generate-id()}"></a> <a name="TOC_{generate-id()}"></a>
<xsl:if test="@id"> <xsl:if test="@id">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<xsl:apply-templates/> <xsl:apply-templates/>
</xsl:element> </xsl:element>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<xsl:element name="h6"> <xsl:element name="h6">
<xsl:if test="@id"> <xsl:if test="@id">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<xsl:apply-templates/> <xsl:apply-templates/>
</xsl:element> </xsl:element>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:template> </xsl:template>
<!-- section/title --> <!-- section/title -->
<xsl:template match="fb:body/fb:title"> <xsl:template match="fb:body/fb:title">
<xsl:element name="h1"> <xsl:element name="h1">
<xsl:apply-templates /> <xsl:apply-templates />
</xsl:element> </xsl:element>
</xsl:template> </xsl:template>
<xsl:template match="fb:title/fb:p"> <xsl:template match="fb:title/fb:p">
<xsl:apply-templates/><xsl:text disable-output-escaping="no">&#032;</xsl:text><br/> <xsl:apply-templates/><xsl:text disable-output-escaping="no">&#032;</xsl:text><br/>
</xsl:template> </xsl:template>
<!-- subtitle --> <!-- subtitle -->
<xsl:template match="fb:subtitle"> <xsl:template match="fb:subtitle">
<xsl:if test="@id"> <xsl:if test="@id">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute> <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<h5> <h5>
<xsl:apply-templates/> <xsl:apply-templates/>
</h5> </h5>
</xsl:template> </xsl:template>
<!-- p --> <!-- p -->
<xsl:template match="fb:p"> <xsl:template match="fb:p">
<xsl:element name="div"> <xsl:element name="div">
<xsl:attribute name="class">paragraph</xsl:attribute> <xsl:attribute name="class">paragraph</xsl:attribute>
<xsl:if test="@id"> <xsl:if test="@id">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute> <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<xsl:if test="@style"> <xsl:if test="@style">
<xsl:attribute name="style"><xsl:value-of select="@style"/></xsl:attribute> <xsl:attribute name="style"><xsl:value-of select="@style"/></xsl:attribute>
</xsl:if> </xsl:if>
<xsl:apply-templates/> <xsl:apply-templates/>
</xsl:element> </xsl:element>
</xsl:template> </xsl:template>
<!-- strong --> <!-- strong -->
<xsl:template match="fb:strong"> <xsl:template match="fb:strong">
<b><xsl:apply-templates/></b> <b><xsl:apply-templates/></b>
</xsl:template> </xsl:template>
<!-- emphasis --> <!-- emphasis -->
<xsl:template match="fb:emphasis"> <xsl:template match="fb:emphasis">
<i> <xsl:apply-templates/></i> <i> <xsl:apply-templates/></i>
</xsl:template> </xsl:template>
<!-- style --> <!-- style -->
<xsl:template match="fb:style"> <xsl:template match="fb:style">
<span class="{@name}"><xsl:apply-templates/></span> <span class="{@name}"><xsl:apply-templates/></span>
</xsl:template> </xsl:template>
<!-- empty-line --> <!-- empty-line -->
<xsl:template match="fb:empty-line"> <xsl:template match="fb:empty-line">
<br/> <br/>
</xsl:template> </xsl:template>
<!-- super/sub-scripts --> <!-- super/sub-scripts -->
<xsl:template match="fb:sup"> <xsl:template match="fb:sup">
<sup><xsl:apply-templates/></sup> <sup><xsl:apply-templates/></sup>
@ -261,123 +262,140 @@
<xsl:template match="fb:sub"> <xsl:template match="fb:sub">
<sub><xsl:apply-templates/></sub> <sub><xsl:apply-templates/></sub>
</xsl:template> </xsl:template>
<!-- link --> <!-- link -->
<xsl:template match="fb:a"> <xsl:template match="fb:a">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute> <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
<xsl:attribute name="title"> <xsl:attribute name="title">
<xsl:choose> <xsl:choose>
<xsl:when test="starts-with(@xlink:href,'#')"><xsl:value-of select="key('note-link',substring-after(@xlink:href,'#'))/fb:p"/></xsl:when> <xsl:when test="starts-with(@xlink:href,'#')"><xsl:value-of select="key('note-link',substring-after(@xlink:href,'#'))/fb:p"/></xsl:when>
<xsl:otherwise><xsl:value-of select="key('note-link',@xlink:href)/fb:p"/></xsl:otherwise> <xsl:otherwise><xsl:value-of select="key('note-link',@xlink:href)/fb:p"/></xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:attribute> </xsl:attribute>
<xsl:choose> <xsl:choose>
<xsl:when test="(@type) = 'note'"> <xsl:when test="(@type) = 'note'">
<sup> <sup>
<xsl:apply-templates/> <xsl:apply-templates/>
</sup> </sup>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<xsl:apply-templates/> <xsl:apply-templates/>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:element> </xsl:element>
</xsl:template> </xsl:template>
<!-- annotation --> <!-- annotation -->
<xsl:template name="annotation"> <xsl:template name="annotation">
<xsl:if test="@id"> <xsl:if test="@id">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute> <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<h3>Annotation</h3> <h3>Annotation</h3>
<xsl:apply-templates/> <xsl:apply-templates/>
</xsl:template> </xsl:template>
<!-- epigraph --> <!-- tables -->
<xsl:template match="fb:epigraph"> <xsl:template match="fb:table">
<blockquote class="epigraph"> <table>
<xsl:if test="@id"> <xsl:apply-templates/>
<xsl:element name="a"> </table>
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute> </xsl:template>
</xsl:element> <xsl:template match="fb:tr">
</xsl:if> <tr><xsl:apply-templates/></tr>
<xsl:apply-templates/> </xsl:template>
</blockquote> <xsl:template match="fb:td">
</xsl:template> <xsl:element name="td">
<!-- epigraph/text-author --> <xsl:if test="@align">
<xsl:template match="fb:epigraph/fb:text-author"> <xsl:attribute name="align"><xsl:value-of select="@align"/></xsl:attribute>
<blockquote> </xsl:if>
<i><xsl:apply-templates/></i> <xsl:apply-templates/>
</blockquote> </xsl:element>
</xsl:template> </xsl:template>
<!-- cite --> <!-- epigraph -->
<xsl:template match="fb:cite"> <xsl:template match="fb:epigraph">
<blockquote> <blockquote class="epigraph">
<xsl:if test="@id"> <xsl:if test="@id">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute> <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<xsl:apply-templates/> <xsl:apply-templates/>
</blockquote> </blockquote>
</xsl:template> </xsl:template>
<!-- cite/text-author --> <!-- epigraph/text-author -->
<xsl:template match="fb:text-author"> <xsl:template match="fb:epigraph/fb:text-author">
<blockquote> <blockquote>
<i> <xsl:apply-templates/></i></blockquote> <i><xsl:apply-templates/></i>
</xsl:template> </blockquote>
<!-- date --> </xsl:template>
<xsl:template match="fb:date"> <!-- cite -->
<xsl:choose> <xsl:template match="fb:cite">
<xsl:when test="not(@value)"> <blockquote>
&#160;&#160;&#160;<xsl:apply-templates/> <xsl:if test="@id">
<br/> <xsl:element name="a">
</xsl:when> <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
<xsl:otherwise> </xsl:element>
&#160;&#160;&#160;<xsl:value-of select="@value"/> </xsl:if>
<br/> <xsl:apply-templates/>
</xsl:otherwise> </blockquote>
</xsl:choose> </xsl:template>
</xsl:template> <!-- cite/text-author -->
<!-- poem --> <xsl:template match="fb:text-author">
<xsl:template match="fb:poem"> <blockquote>
<blockquote> <i> <xsl:apply-templates/></i></blockquote>
<xsl:if test="@id"> </xsl:template>
<xsl:element name="a"> <!-- date -->
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute> <xsl:template match="fb:date">
</xsl:element> <xsl:choose>
</xsl:if> <xsl:when test="not(@value)">
<xsl:apply-templates/> &#160;&#160;&#160;<xsl:apply-templates/>
</blockquote> <br/>
</xsl:template> </xsl:when>
<xsl:otherwise>
&#160;&#160;&#160;<xsl:value-of select="@value"/>
<br/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- poem -->
<xsl:template match="fb:poem">
<blockquote>
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</blockquote>
</xsl:template>
<!-- stanza --> <!-- stanza -->
<xsl:template match="fb:stanza"> <xsl:template match="fb:stanza">
<xsl:apply-templates/> <xsl:apply-templates/>
<br/> <br/>
</xsl:template> </xsl:template>
<!-- v --> <!-- v -->
<xsl:template match="fb:v"> <xsl:template match="fb:v">
<xsl:if test="@id"> <xsl:if test="@id">
<xsl:element name="a"> <xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute> <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element> </xsl:element>
</xsl:if> </xsl:if>
<xsl:apply-templates/><br/> <xsl:apply-templates/><br/>
</xsl:template> </xsl:template>
<!-- image --> <!-- image -->
<xsl:template match="fb:image"> <xsl:template match="fb:image">
<div align="center"> <div align="center">
<img border="1"> <img border="1">
<xsl:choose> <xsl:choose>
<xsl:when test="starts-with(@xlink:href,'#')"> <xsl:when test="starts-with(@xlink:href,'#')">
<xsl:attribute name="src"><xsl:value-of select="substring-after(@xlink:href,'#')"/></xsl:attribute> <xsl:attribute name="src"><xsl:value-of select="substring-after(@xlink:href,'#')"/></xsl:attribute>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute> <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</img> </img>
</div> </div>
</xsl:template> </xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -61,8 +61,9 @@ def osx_version():
if m: if m:
return int(m.group(1)), int(m.group(2)), int(m.group(3)) return int(m.group(1)), int(m.group(2)), int(m.group(3))
_filename_sanitize = re.compile(r'[\xae\0\\|\?\*<":>\+/]') _filename_sanitize = re.compile(r'[\xae\0\\|\?\*<":>\+/]')
_filename_sanitize_unicode = frozenset([u'\\', u'|', u'?', u'*', u'<',
u'"', u':', u'>', u'+', u'/'] + list(map(unichr, xrange(32))))
def sanitize_file_name(name, substitute='_', as_unicode=False): def sanitize_file_name(name, substitute='_', as_unicode=False):
''' '''
@ -83,8 +84,35 @@ def sanitize_file_name(name, substitute='_', as_unicode=False):
one = one.decode(filesystem_encoding) one = one.decode(filesystem_encoding)
one = one.replace('..', substitute) one = one.replace('..', substitute)
# Windows doesn't like path components that end with a period # Windows doesn't like path components that end with a period
if one.endswith('.'): if one and one[-1] in ('.', ' '):
one = one[:-1]+'_' one = one[:-1]+'_'
# Names starting with a period are hidden on Unix
if one.startswith('.'):
one = '_' + one[1:]
return one
def sanitize_file_name_unicode(name, substitute='_'):
'''
Sanitize the filename `name`. All invalid characters are replaced by `substitute`.
The set of invalid characters is the union of the invalid characters in Windows,
OS X and Linux. Also removes leading and trailing whitespace.
**WARNING:** This function also replaces path separators, so only pass file names
and not full paths to it.
'''
if not isinstance(name, unicode):
return sanitize_file_name(name, substitute=substitute, as_unicode=True)
chars = [substitute if c in _filename_sanitize_unicode else c for c in
name]
one = u''.join(chars)
one = re.sub(r'\s', ' ', one).strip()
one = re.sub(r'^\.+$', '_', one)
one = one.replace('..', substitute)
# Windows doesn't like path components that end with a period or space
if one and one[-1] in ('.', ' '):
one = one[:-1]+'_'
# Names starting with a period are hidden on Unix
if one.startswith('.'):
one = '_' + one[1:]
return one return one

View File

@ -43,6 +43,9 @@
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>
</property>
<property name="minimumContentsLength"> <property name="minimumContentsLength">
<number>30</number> <number>30</number>
</property> </property>

View File

@ -795,6 +795,7 @@ class BulkEnumeration(BulkBase, Enumeration):
return value return value
def setup_ui(self, parent): def setup_ui(self, parent):
self.parent = parent
self.make_widgets(parent, QComboBox) self.make_widgets(parent, QComboBox)
vals = self.col_metadata['display']['enum_values'] vals = self.col_metadata['display']['enum_values']
self.main_widget.blockSignals(True) self.main_widget.blockSignals(True)

View File

@ -1340,7 +1340,8 @@ class TagsModel(QAbstractItemModel): # {{{
for c in sorted(user_cats.keys(), key=sort_key): for c in sorted(user_cats.keys(), key=sort_key):
if icu_lower(c).startswith(ckey_lower): if icu_lower(c).startswith(ckey_lower):
if len(c) == len(ckey): if len(c) == len(ckey):
if nkey_lower in user_cat_keys_lower: if strcmp(ckey, nkey) != 0 and \
nkey_lower in user_cat_keys_lower:
error_dialog(self.tags_view, _('Rename user category'), error_dialog(self.tags_view, _('Rename user category'),
_('The name %s is already used')%nkey, show=True) _('The name %s is already used')%nkey, show=True)
return False return False
@ -1348,7 +1349,8 @@ class TagsModel(QAbstractItemModel): # {{{
del user_cats[ckey] del user_cats[ckey]
elif c[len(ckey)] == '.': elif c[len(ckey)] == '.':
rest = c[len(ckey):] rest = c[len(ckey):]
if icu_lower(nkey + rest) in user_cat_keys_lower: if strcmp(ckey, nkey) != 0 and \
icu_lower(nkey + rest) in user_cat_keys_lower:
error_dialog(self.tags_view, _('Rename user category'), error_dialog(self.tags_view, _('Rename user category'),
_('The name %s is already used')%(nkey+rest), show=True) _('The name %s is already used')%(nkey+rest), show=True)
return False return False

View File

@ -12,13 +12,13 @@ from calibre.constants import DEBUG
from calibre.utils.config import Config, StringConfig, tweaks from calibre.utils.config import Config, StringConfig, tweaks
from calibre.utils.formatter import TemplateFormatter from calibre.utils.formatter import TemplateFormatter
from calibre.utils.filenames import shorten_components_to, supports_long_names, \ from calibre.utils.filenames import shorten_components_to, supports_long_names, \
ascii_filename, sanitize_file_name ascii_filename
from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.ebooks.metadata.opf2 import metadata_to_opf
from calibre.ebooks.metadata.meta import set_metadata from calibre.ebooks.metadata.meta import set_metadata
from calibre.constants import preferred_encoding, filesystem_encoding from calibre.constants import preferred_encoding
from calibre.ebooks.metadata import fmt_sidx from calibre.ebooks.metadata import fmt_sidx
from calibre.ebooks.metadata import title_sort from calibre.ebooks.metadata import title_sort
from calibre import strftime, prints from calibre import strftime, prints, sanitize_file_name_unicode
plugboard_any_device_value = 'any device' plugboard_any_device_value = 'any device'
plugboard_any_format_value = 'any format' plugboard_any_format_value = 'any format'
@ -197,12 +197,10 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250,
format_args[key] = '' format_args[key] = ''
components = SafeFormat().safe_format(template, format_args, components = SafeFormat().safe_format(template, format_args,
'G_C-EXCEPTION!', mi) 'G_C-EXCEPTION!', mi)
components = [x.strip() for x in components.split('/') if x.strip()] components = [x.strip() for x in components.split('/')]
components = [sanitize_func(x) for x in components if x] components = [sanitize_func(x) for x in components if x]
if not components: if not components:
components = [str(id)] components = [str(id)]
components = [x.encode(filesystem_encoding, 'replace') if isinstance(x,
unicode) else x for x in components]
if to_lowercase: if to_lowercase:
components = [x.lower() for x in components] components = [x.lower() for x in components]
if replace_whitespace: if replace_whitespace:
@ -247,7 +245,7 @@ def do_save_book_to_disk(id_, mi, cover, plugboards,
return True, id_, mi.title return True, id_, mi.title
components = get_components(opts.template, mi, id_, opts.timefmt, length, components = get_components(opts.template, mi, id_, opts.timefmt, length,
ascii_filename if opts.asciiize else sanitize_file_name, ascii_filename if opts.asciiize else sanitize_file_name_unicode,
to_lowercase=opts.to_lowercase, to_lowercase=opts.to_lowercase,
replace_whitespace=opts.replace_whitespace) replace_whitespace=opts.replace_whitespace)
base_path = os.path.join(root, *components) base_path = os.path.join(root, *components)
@ -329,8 +327,6 @@ def do_save_book_to_disk(id_, mi, cover, plugboards,
def _sanitize_args(root, opts): def _sanitize_args(root, opts):
if opts is None: if opts is None:
opts = config().parse() opts = config().parse()
if isinstance(root, unicode):
root = root.encode(filesystem_encoding)
root = os.path.abspath(root) root = os.path.abspath(root)
opts.template = preprocess_template(opts.template) opts.template = preprocess_template(opts.template)

View File

@ -72,47 +72,6 @@ if not _run_once:
pass pass
################################################################################ ################################################################################
# Improve builtin path functions to handle unicode sensibly
_abspath = os.path.abspath
def my_abspath(path, encoding=sys.getfilesystemencoding()):
'''
Work around for buggy os.path.abspath. This function accepts either byte strings,
in which it calls os.path.abspath, or unicode string, in which case it first converts
to byte strings using `encoding`, calls abspath and then decodes back to unicode.
'''
to_unicode = False
if encoding is None:
encoding = preferred_encoding
if isinstance(path, unicode):
path = path.encode(encoding)
to_unicode = True
res = _abspath(path)
if to_unicode:
res = res.decode(encoding)
return res
os.path.abspath = my_abspath
_join = os.path.join
def my_join(a, *p):
encoding=sys.getfilesystemencoding()
if not encoding:
encoding = preferred_encoding
p = [a] + list(p)
_unicode = False
for i in p:
if isinstance(i, unicode):
_unicode = True
break
p = [i.encode(encoding) if isinstance(i, unicode) else i for i in p]
res = _join(*p)
if _unicode:
res = res.decode(encoding)
return res
os.path.join = my_join
def local_open(name, mode='r', bufsize=-1): def local_open(name, mode='r', bufsize=-1):
''' '''