mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
1. Merge from trunk.
2. Improvement on first-letter partitioning fix 3. Code to build dict of source for formatter builtins
This commit is contained in:
commit
6b6b8c2eb7
32
resources/recipes/mail_and_guardian.recipe
Normal file
32
resources/recipes/mail_and_guardian.recipe
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class AdvancedUserRecipe1295081935(BasicNewsRecipe):
|
||||||
|
title = u'Mail & Guardian ZA News'
|
||||||
|
__author__ = '77ja65'
|
||||||
|
language = 'en'
|
||||||
|
oldest_article = 7
|
||||||
|
max_articles_per_feed = 30
|
||||||
|
no_stylesheets = True
|
||||||
|
masthead_url = 'http://c1608832.cdn.cloudfiles.rackspacecloud.com/mg_logo.gif'
|
||||||
|
remove_tags_after = [dict(id='content')]
|
||||||
|
|
||||||
|
feeds = [
|
||||||
|
(u'National News', u'http://www.mg.co.za/rss/national'),
|
||||||
|
(u'Top Stories', u'http://www.mg.co.za/rss'),
|
||||||
|
(u'Africa News', u'http://www.mg.co.za/rss/africa'),
|
||||||
|
(u'Sport', u'http://www.mg.co.za/rss/sport'),
|
||||||
|
(u'Business', u'http://www.mg.co.za/rss/business'),
|
||||||
|
(u'And In Other News', u'http://www.mg.co.za/rss/and-in-other-news'),
|
||||||
|
(u'World News', u'http://www.mg.co.za/rss/world')
|
||||||
|
]
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
return url.replace('http://www.mg.co.za/article/',
|
||||||
|
'http://www.mg.co.za/printformat/single/')
|
||||||
|
|
||||||
|
extra_css = '''
|
||||||
|
h1{font-family:Arial,Helvetica,sans-serif; font-
|
||||||
|
weight:bold;font-size:large;}
|
||||||
|
h2{font-family:Arial,Helvetica,sans-serif; font-
|
||||||
|
weight:normal;font-size:small;}
|
||||||
|
'''
|
@ -84,6 +84,22 @@ class Resources(Command):
|
|||||||
|
|
||||||
cPickle.dump(complete, open(dest, 'wb'), -1)
|
cPickle.dump(complete, open(dest, 'wb'), -1)
|
||||||
|
|
||||||
|
self.info('\tCreating template-functions.json')
|
||||||
|
dest = self.j(self.RESOURCES, 'template-functions.json')
|
||||||
|
import inspect
|
||||||
|
from calibre.utils.formatter_functions import all_builtin_functions
|
||||||
|
for cls in all_builtin_functions:
|
||||||
|
eval_func = inspect.getmembers(self.__class__,
|
||||||
|
lambda x: inspect.ismethod(x) and x.__name__ == 'evaluate')
|
||||||
|
try:
|
||||||
|
lines = [l[4:] for l in inspect.getsourcelines(eval_func[0][1])[0]]
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
lines = ''.join(lines)
|
||||||
|
function_dict[cls.name] = lines
|
||||||
|
import json
|
||||||
|
json.dump(function_dict, open(dest, 'wb'))
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
for x in ('scripts', 'recipes', 'ebook-convert-complete'):
|
for x in ('scripts', 'recipes', 'ebook-convert-complete'):
|
||||||
x = self.j(self.RESOURCES, x+'.pickle')
|
x = self.j(self.RESOURCES, x+'.pickle')
|
||||||
|
@ -782,10 +782,16 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
ts = tag.sort
|
ts = tag.sort
|
||||||
if not ts:
|
if not ts:
|
||||||
ts = ' '
|
ts = ' '
|
||||||
sk = sort_key(ts)[0]
|
try:
|
||||||
if sk[0] != collapse_letter_sk:
|
sk = sort_key(ts)[0]
|
||||||
|
except:
|
||||||
|
sk = ' '
|
||||||
|
if sk != collapse_letter_sk:
|
||||||
collapse_letter = upper(ts[0])
|
collapse_letter = upper(ts[0])
|
||||||
collapse_letter_sk = sort_key(collapse_letter)[0]
|
try:
|
||||||
|
collapse_letter_sk = sort_key(collapse_letter)[0]
|
||||||
|
except:
|
||||||
|
collapse_letter_sk = ' '
|
||||||
sub_cat = TagTreeItem(parent=category,
|
sub_cat = TagTreeItem(parent=category,
|
||||||
data = collapse_letter,
|
data = collapse_letter,
|
||||||
category_icon = category_node.icon,
|
category_icon = category_node.icon,
|
||||||
|
@ -386,11 +386,13 @@ class LineEditECM(object):
|
|||||||
action_lower_case = case_menu.addAction(_('Lower Case'))
|
action_lower_case = case_menu.addAction(_('Lower Case'))
|
||||||
action_swap_case = case_menu.addAction(_('Swap Case'))
|
action_swap_case = case_menu.addAction(_('Swap Case'))
|
||||||
action_title_case = case_menu.addAction(_('Title Case'))
|
action_title_case = case_menu.addAction(_('Title Case'))
|
||||||
|
action_capitalize = case_menu.addAction(_('Capitalize'))
|
||||||
|
|
||||||
self.connect(action_upper_case, SIGNAL('triggered()'), self.upper_case)
|
self.connect(action_upper_case, SIGNAL('triggered()'), self.upper_case)
|
||||||
self.connect(action_lower_case, SIGNAL('triggered()'), self.lower_case)
|
self.connect(action_lower_case, SIGNAL('triggered()'), self.lower_case)
|
||||||
self.connect(action_swap_case, SIGNAL('triggered()'), self.swap_case)
|
self.connect(action_swap_case, SIGNAL('triggered()'), self.swap_case)
|
||||||
self.connect(action_title_case, SIGNAL('triggered()'), self.title_case)
|
self.connect(action_title_case, SIGNAL('triggered()'), self.title_case)
|
||||||
|
self.connect(action_capitalize, SIGNAL('triggered()'), self.capitalize)
|
||||||
|
|
||||||
menu.addMenu(case_menu)
|
menu.addMenu(case_menu)
|
||||||
menu.exec_(event.globalPos())
|
menu.exec_(event.globalPos())
|
||||||
@ -408,6 +410,10 @@ class LineEditECM(object):
|
|||||||
from calibre.utils.titlecase import titlecase
|
from calibre.utils.titlecase import titlecase
|
||||||
self.setText(titlecase(unicode(self.text())))
|
self.setText(titlecase(unicode(self.text())))
|
||||||
|
|
||||||
|
def capitalize(self):
|
||||||
|
from calibre.utils.icu import capitalize
|
||||||
|
self.setText(capitalize(unicode(self.text())))
|
||||||
|
|
||||||
|
|
||||||
class EnLineEdit(LineEditECM, QLineEdit):
|
class EnLineEdit(LineEditECM, QLineEdit):
|
||||||
|
|
||||||
|
@ -614,32 +614,15 @@ def evaluate(self, formatter, kwargs, mi, locals, val):
|
|||||||
def evaluate(self, formatter, kwargs, mi, locals, val):
|
def evaluate(self, formatter, kwargs, mi, locals, val):
|
||||||
return capitalize(val)
|
return capitalize(val)
|
||||||
|
|
||||||
builtin_add = BuiltinAdd()
|
all_builtin_functions = [
|
||||||
builtin_assign = BuiltinAssign()
|
BuiltinAdd(), BuiltinAssign(), BuiltinCapitalize(), BuiltinCmp(),
|
||||||
builtin_capitalize = BuiltinCapitalize()
|
BuiltinContains(), BuiltinCount(), BuiltinDivide(), BuiltinEval(),
|
||||||
builtin_cmp = BuiltinCmp()
|
BuiltinIfempty(), BuiltinField(), BuiltinListitem(), BuiltinLookup(),
|
||||||
builtin_contains = BuiltinContains()
|
BuiltinLowercase(), BuiltinMultiply(), BuiltinPrint(), BuiltinRe(),
|
||||||
builtin_count = BuiltinCount()
|
BuiltinShorten(), BuiltinStrcat(), BuiltinStrcmp(), BuiltinSubstr(),
|
||||||
builtin_divide = BuiltinDivide()
|
BuiltinSubtract(), BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(),
|
||||||
builtin_eval = BuiltinEval()
|
BuiltinTitlecase(), BuiltinUppercase(),
|
||||||
builtin_ifempty = BuiltinIfempty()
|
]
|
||||||
builtin_field = BuiltinField()
|
|
||||||
builtin_list_item = BuiltinListitem()
|
|
||||||
builtin_lookup = BuiltinLookup()
|
|
||||||
builtin_lowercase = BuiltinLowercase()
|
|
||||||
builtin_multiply = BuiltinMultiply()
|
|
||||||
builtin_print = BuiltinPrint()
|
|
||||||
builtin_re = BuiltinRe()
|
|
||||||
builtin_shorten = BuiltinShorten()
|
|
||||||
builtin_strcat = BuiltinStrcat()
|
|
||||||
builtin_strcmp = BuiltinStrcmp()
|
|
||||||
builtin_substr = BuiltinSubstr()
|
|
||||||
builtin_subtract = BuiltinSubtract()
|
|
||||||
builtin_switch = BuiltinSwitch()
|
|
||||||
builtin_template = BuiltinTemplate()
|
|
||||||
builtin_test = BuiltinTest()
|
|
||||||
builtin_titlecase = BuiltinTitlecase()
|
|
||||||
builtin_uppercase = BuiltinUppercase()
|
|
||||||
|
|
||||||
class FormatterUserFunction(FormatterFunction):
|
class FormatterUserFunction(FormatterFunction):
|
||||||
def __init__(self, name, doc, arg_count, program_text):
|
def __init__(self, name, doc, arg_count, program_text):
|
||||||
|
@ -80,7 +80,7 @@ def icu_case_sensitive_strcmp(collator, a, b):
|
|||||||
|
|
||||||
def icu_capitalize(s):
|
def icu_capitalize(s):
|
||||||
s = lower(s)
|
s = lower(s)
|
||||||
return s.replace(s[0], upper(s[0]), 1)
|
return s.replace(s[0], upper(s[0]), 1) if s else s
|
||||||
|
|
||||||
load_icu()
|
load_icu()
|
||||||
load_collator()
|
load_collator()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user