From cfbff3d98f4595667493ecd06d4f21cd4dccde37 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sun, 17 Jan 2021 13:56:55 +0000 Subject: [PATCH] New template function: field_exists() --- manual/template_lang.rst | 1 + src/calibre/utils/formatter_functions.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/manual/template_lang.rst b/manual/template_lang.rst index 2b0c19ac3b..f09e19a523 100644 --- a/manual/template_lang.rst +++ b/manual/template_lang.rst @@ -390,6 +390,7 @@ parameters can be statements (sequences of expressions). Note that the definitiv `[[` for the `{` character and `]]` for the '}' character; they are converted automatically. Note also that prefixes and suffixes (the `|prefix|suffix` syntax) cannot be used in the argument to this function when using Template Program Mode. * ``field(name)`` -- returns the metadata field named by ``name``. + * ``field_exists(field_name)`` -- checks if a field (column) named ``field_name`` exists, returning '1' if so and '' if not. * ``finish_formatting(val, fmt, prefix, suffix)`` -- apply the format, prefix, and suffix to a value in the same way as done in a template like ``{series_index:05.2f| - |- }``. This function is provided to ease diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index d8e38d667d..ca581738d0 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -1894,6 +1894,19 @@ class BuiltinGlobals(BuiltinFormatterFunction): # The globals function is implemented in-line in the formatter raise NotImplementedError() +class BuiltinFieldExists(BuiltinFormatterFunction): + name = 'field_exists' + arg_count = 1 + category = 'If-then-else' + __doc__ = doc = _('field_exists(field_name) -- checks if a field ' + '(column) named field_name exists, returning ' + "'1' if so and '' if not.") + + def evaluate(self, formatter, kwargs, mi, locals, field_name): + if field_name.lower() in mi.all_field_keys(): + return '1' + return '' + _formatter_builtins = [ BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(), BuiltinArguments(), @@ -1903,7 +1916,8 @@ _formatter_builtins = [ BuiltinCmp(), BuiltinConnectedDeviceName(), BuiltinConnectedDeviceUUID(), BuiltinContains(), BuiltinCount(), BuiltinCurrentLibraryName(), BuiltinCurrentLibraryPath(), BuiltinDaysBetween(), BuiltinDivide(), BuiltinEval(), BuiltinFirstNonEmpty(), - BuiltinField(), BuiltinFinishFormatting(), BuiltinFirstMatchingCmp(), BuiltinFloor(), + BuiltinField(), BuiltinFieldExists(), + BuiltinFinishFormatting(), BuiltinFirstMatchingCmp(), BuiltinFloor(), BuiltinFormatDate(), BuiltinFormatNumber(), BuiltinFormatsModtimes(), BuiltinFormatsPaths(), BuiltinFormatsSizes(), BuiltinFractionalPart(), BuiltinGlobals(),