diff --git a/resources/recipes/mail_and_guardian.recipe b/resources/recipes/mail_and_guardian.recipe new file mode 100644 index 0000000000..5b58f3f938 --- /dev/null +++ b/resources/recipes/mail_and_guardian.recipe @@ -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;} + ''' diff --git a/setup/resources.py b/setup/resources.py index 977d753828..972bf93345 100644 --- a/setup/resources.py +++ b/setup/resources.py @@ -84,6 +84,22 @@ class Resources(Command): 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): for x in ('scripts', 'recipes', 'ebook-convert-complete'): x = self.j(self.RESOURCES, x+'.pickle') diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 291c5205cd..b9c4464c57 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -782,10 +782,16 @@ class TagsModel(QAbstractItemModel): # {{{ ts = tag.sort if not ts: ts = ' ' - sk = sort_key(ts)[0] - if sk[0] != collapse_letter_sk: + try: + sk = sort_key(ts)[0] + except: + sk = ' ' + if sk != collapse_letter_sk: 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, data = collapse_letter, category_icon = category_node.icon, diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index d87bb45f7a..f2ff783a76 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -386,11 +386,13 @@ class LineEditECM(object): action_lower_case = case_menu.addAction(_('Lower Case')) action_swap_case = case_menu.addAction(_('Swap 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_lower_case, SIGNAL('triggered()'), self.lower_case) self.connect(action_swap_case, SIGNAL('triggered()'), self.swap_case) self.connect(action_title_case, SIGNAL('triggered()'), self.title_case) + self.connect(action_capitalize, SIGNAL('triggered()'), self.capitalize) menu.addMenu(case_menu) menu.exec_(event.globalPos()) @@ -408,6 +410,10 @@ class LineEditECM(object): from calibre.utils.titlecase import titlecase 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): diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index 77ce43ec53..aef0792c05 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -614,32 +614,15 @@ def evaluate(self, formatter, kwargs, mi, locals, val): def evaluate(self, formatter, kwargs, mi, locals, val): return capitalize(val) -builtin_add = BuiltinAdd() -builtin_assign = BuiltinAssign() -builtin_capitalize = BuiltinCapitalize() -builtin_cmp = BuiltinCmp() -builtin_contains = BuiltinContains() -builtin_count = BuiltinCount() -builtin_divide = BuiltinDivide() -builtin_eval = BuiltinEval() -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() +all_builtin_functions = [ + BuiltinAdd(), BuiltinAssign(), BuiltinCapitalize(), BuiltinCmp(), + BuiltinContains(), BuiltinCount(), BuiltinDivide(), BuiltinEval(), + BuiltinIfempty(), BuiltinField(), BuiltinListitem(), BuiltinLookup(), + BuiltinLowercase(), BuiltinMultiply(), BuiltinPrint(), BuiltinRe(), + BuiltinShorten(), BuiltinStrcat(), BuiltinStrcmp(), BuiltinSubstr(), + BuiltinSubtract(), BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(), + BuiltinTitlecase(), BuiltinUppercase(), + ] class FormatterUserFunction(FormatterFunction): def __init__(self, name, doc, arg_count, program_text): diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 659984e7f9..f17ff1b17f 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -80,7 +80,7 @@ def icu_case_sensitive_strcmp(collator, a, b): def icu_capitalize(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_collator()