From 0f0d330ba3d0669e3d8a69ed55b39ea667f1cc6c Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sat, 23 Jul 2022 17:15:03 +0100 Subject: [PATCH 1/3] Correct an error message. --- src/calibre/utils/formatter_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index 2a8c80ddaf..9d75bfe9cc 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -611,7 +611,7 @@ class BuiltinSwitch(BuiltinFormatterFunction): def evaluate(self, formatter, kwargs, mi, locals, val, *args): if (len(args) % 2) != 1: - raise ValueError(_('switch requires an odd number of arguments')) + raise ValueError(_('switch requires an even number of arguments')) i = 0 while i < len(args): if i + 1 >= len(args): From 7b6c56befe8397a106fbc418c759ee4611761d4f Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sat, 23 Jul 2022 17:16:10 +0100 Subject: [PATCH 2/3] Inline the switch() function for performance. --- src/calibre/utils/formatter.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index e10c4c5481..938ac696d8 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -52,6 +52,7 @@ class Node: NODE_LOCAL_FUNCTION_DEFINE = 28 NODE_LOCAL_FUNCTION_CALL = 29 NODE_RANGE = 30 + NODE_SWITCH = 31 def __init__(self, line_number, name): self.my_line_number = line_number @@ -278,6 +279,13 @@ class FirstNonEmptyNode(Node): self.expression_list = expression_list +class SwitchNode(Node): + def __init__(self, line_number, expression_list): + Node.__init__(self, line_number, 'first_non_empty()') + self.node_type = self.NODE_SWITCH + self.expression_list = expression_list + + class ContainsNode(Node): def __init__(self, line_number, arguments): Node.__init__(self, line_number, 'contains()') @@ -670,6 +678,8 @@ class _Parser: lambda ln, args: IfNode(ln, args[0], (args[1],), (args[2],))), 'first_non_empty': (lambda args: len(args) >= 1, lambda ln, args: FirstNonEmptyNode(ln, args)), + 'switch': (lambda args: len(args) >= 3 and (len(args) %2) == 0, + lambda ln, args: SwitchNode(ln, args)), 'assign': (lambda args: len(args) == 2 and len(args[0]) == 1 and args[0][0].node_type == Node.NODE_RVALUE, lambda ln, args: AssignNode(ln, args[0][0].name, args[1])), 'contains': (lambda args: len(args) == 4, @@ -1148,6 +1158,20 @@ class _Interpreter: self.break_reporter(prog.node_name, '', prog.line_number) return '' + def do_node_switch(self, prog): + val = self.expr(prog.expression_list[0]) + for i in range(1, len(prog.expression_list)-1, 2): + v = self.expr(prog.expression_list[i]) + if re.search(v, val, flags=re.I): + res = self.expr(prog.expression_list[i+1]) + if self.break_reporter: + self.break_reporter(prog.node_name, res, prog.line_number) + return res + res = self.expr(prog.expression_list[-1]) + if (self.break_reporter): + self.break_reporter(prog.node_name, res, prog.line_number) + return res + def do_node_strcat(self, prog): res = ''.join([self.expr(expr) for expr in prog.expression_list]) if self.break_reporter: @@ -1363,6 +1387,7 @@ class _Interpreter: Node.NODE_ARGUMENTS: do_node_arguments, Node.NODE_CALL_STORED_TEMPLATE: do_node_stored_template_call, Node.NODE_FIRST_NON_EMPTY: do_node_first_non_empty, + Node.NODE_SWITCH: do_node_switch, Node.NODE_FOR: do_node_for, Node.NODE_RANGE: do_node_range, Node.NODE_GLOBALS: do_node_globals, From 7ae8ad6dde6f1729f21cb5ea0aa3e331c89ddb4c Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sat, 23 Jul 2022 17:16:55 +0100 Subject: [PATCH 3/3] Add a tooltip explaining that you can create a compound icon by separating the file names with a colon. --- src/calibre/gui2/dialogs/template_dialog.py | 1 + src/calibre/gui2/dialogs/template_dialog.ui | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/dialogs/template_dialog.py b/src/calibre/gui2/dialogs/template_dialog.py index 0cab0d6ddc..d8c5ed7068 100644 --- a/src/calibre/gui2/dialogs/template_dialog.py +++ b/src/calibre/gui2/dialogs/template_dialog.py @@ -276,6 +276,7 @@ class TemplateDialog(QDialog, Ui_TemplateDialog): self.colored_field.setCurrentIndex(self.colored_field.findData(color_field)) elif self.iconing or self.embleming: self.icon_layout.setVisible(True) + self.icon_select_layout.setContentsMargins(0, 0, 0, 0) if self.embleming: self.icon_kind_label.setVisible(False) self.icon_kind.setVisible(False) diff --git a/src/calibre/gui2/dialogs/template_dialog.ui b/src/calibre/gui2/dialogs/template_dialog.ui index 2c3eb4b9f2..5f5ac361d1 100644 --- a/src/calibre/gui2/dialogs/template_dialog.ui +++ b/src/calibre/gui2/dialogs/template_dialog.ui @@ -76,7 +76,7 @@ - + @@ -110,15 +110,21 @@ Copy an icon file name to the clipboard: - color_name + icon_files - + + + <p>The template must return the name of the icon file + to display. If you wish to display multiple icons, separate the + individual icon file names with a ':' (colon). They will all be + displayed on the column</p> +