Add a convenience formatter function to slice up hierarchical tag fields.

This commit is contained in:
Charles Haley 2011-03-10 13:18:27 +00:00
parent 6482914216
commit 906eae2677

View File

@ -11,7 +11,7 @@ __docformat__ = 'restructuredtext en'
import inspect, re, traceback, sys import inspect, re, traceback, sys
from calibre.utils.titlecase import titlecase from calibre.utils.titlecase import titlecase
from calibre.utils.icu import capitalize, strcmp from calibre.utils.icu import capitalize, strcmp, sort_key
from calibre.utils.date import parse_date, format_date from calibre.utils.date import parse_date, format_date
@ -427,8 +427,8 @@ class BuiltinSublist(BuiltinFormatterFunction):
name = 'sublist' name = 'sublist'
arg_count = 4 arg_count = 4
doc = _('sublist(val, start_index, end_index, separator) -- interpret the ' doc = _('sublist(val, start_index, end_index, separator) -- interpret the '
' value as a list of items separated by `separator`, returning a ' 'value as a list of items separated by `separator`, returning a '
' new list made from the `start_index`th to the `end_index`th item. ' 'new list made from the `start_index`th to the `end_index`th item. '
'The first item is number zero. If an index is negative, then it ' 'The first item is number zero. If an index is negative, then it '
'counts from the end of the list. As a special case, an end_index ' 'counts from the end of the list. As a special case, an end_index '
'of zero is assumed to be the length of the list. Examples using ' 'of zero is assumed to be the length of the list. Examples using '
@ -451,6 +451,43 @@ class BuiltinSublist(BuiltinFormatterFunction):
except: except:
return '' return ''
class BuiltinSubitems(BuiltinFormatterFunction):
name = 'subitems'
arg_count = 3
doc = _('subitems(val, start_index, end_index) -- This function is used to '
'break apart lists of items such as genres. It interprets the value '
'as a comma-separated list of items, where each item is a period-'
'separated list. Returns a new list made by first finding all the'
'period-separated items, then for each such item extracting the '
'start_index`th to the `end_index`th components, then combining '
'the results back together. The first component in a period-'
'separated list has an index of zero. If an index is negative, '
'then it counts from the end of the list. As a special case, an '
'end_index of zero is assumed to be the length of the list. '
'Example using basic template mode and assuming a #genre value of '
'"A.B.C": {#genre:subgroup(0,1)} returns A. '
'{#genre:sublist(0,2)} returns A.B. {#genre:subgroup(1,0)} returns '
'C. Assuming a #genre value of "A.B.C,D.E.F", {#genre:subgroup(0,1)} '
'returns A,D. {#genre:sublist(0,2)} returns A.B,D.E')
def evaluate(self, formatter, kwargs, mi, locals, val, start_index, end_index):
if not val:
return ''
si = int(start_index)
ei = int(end_index)
items = [v.strip() for v in val.split(',')]
rv = set()
for item in items:
component = item.split('.')
try:
if ei == 0:
rv.add('.'.join(component[si:]))
else:
rv.add('.'.join(component[si:ei]))
except:
pass
return ', '.join(sorted(rv, key=sort_key))
class BuiltinFormat_date(BuiltinFormatterFunction): class BuiltinFormat_date(BuiltinFormatterFunction):
name = 'format_date' name = 'format_date'
arg_count = 2 arg_count = 2
@ -532,6 +569,7 @@ builtin_select = BuiltinSelect()
builtin_shorten = BuiltinShorten() builtin_shorten = BuiltinShorten()
builtin_strcat = BuiltinStrcat() builtin_strcat = BuiltinStrcat()
builtin_strcmp = BuiltinStrcmp() builtin_strcmp = BuiltinStrcmp()
builtin_subitems = BuiltinSubitems()
builtin_sublist = BuiltinSublist() builtin_sublist = BuiltinSublist()
builtin_substr = BuiltinSubstr() builtin_substr = BuiltinSubstr()
builtin_subtract = BuiltinSubtract() builtin_subtract = BuiltinSubtract()