Reference for all built-in template language functions¶
Here, we document all the built-in functions available in the calibre template language. Every function is implemented as a class in python and you can click the source links to see the source code, in case the documentation is insufficient. The functions are arranged in logical groups by type.
Arithmetic¶
add(x [, y]*)¶
ceiling(x)¶
divide(x, y)¶
floor(x)¶
fractional_part(x)¶
mod(x)¶
multiply(x [, y]*)¶
round(x)¶
subtract(x, y)¶
Boolean¶
and(hodnota [, hodnota]*)¶
- class calibre.utils.formatter_functions.BuiltinAnd[zdroj]¶
and(hodnota [, hodnota]*) – vrací řetězec „1“, pokud všechny hodnoty nejsou prázdné, jinak vrací prázdný řetězec. Tato funkce funguje dobře s test nebo first_non_empty. Můžete mít tolik hodnot, kolik chcete. V mnoha případech může tuto funkci nahradit operátor &&.
not(hodnota)¶
or(hodnota [, hodnota]*)¶
- class calibre.utils.formatter_functions.BuiltinOr[zdroj]¶
or(hodnota [, hodnota]*) – vrací řetězec „1“, pokud jakákoliv hodnota není prázdná, jinak vrací prázdný řetězec. Tato funkce funguje dobře s test nebo first_non_empty. Můžete mít tolik hodnot, kolik chcete. V mnoha případech může tuto funkci nahradit operátor ||.
Date functions¶
date_arithmetic(date, calc_spec, fmt)¶
- class calibre.utils.formatter_functions.BuiltinDateArithmetic[zdroj]¶
date_arithmetic(date, calc_spec, fmt) – Vypočítá nové datum z ‚date‘ pomocí ‚calc_spec‘. Vrátí nové datum formátované podle nepovinného ‚fmt‘: pokud není zadáno, bude výsledek ve formátu iso. Calc_spec je řetězec vytvořený spojením dvojic ‚vW‘ (valueWhat), kde ‚v‘ je případně záporné číslo a W je jedno z následujících písmen: s: přidat ‚v‘ sekund k ‚date‘ m: přidat ‚v‘ minut k ‚date‘ h: přidat ‚v‘ hodin k ‚date‘ d: přidat ‚v‘ dnů k ‚date‘ w: přidat ‚v‘ týdnů k ‚date‘ y: přidat ‚v‘ let k ‚date‘, kde rok je 365 dní. Příklad: ‚1s3d-1m‘ přidá 1 sekundu, přidá 3 dny a odebere 1 minutu od ‚date‘.
days_between(datum1, datum2)¶
today()¶
Formatting values¶
finish_formatting(hodnota, formát, předpona, přípona)¶
- class calibre.utils.formatter_functions.BuiltinFinishFormatting[zdroj]¶
finish_formatting(hodnota, formát, předpona, přípona) – použije formát, předponu a příponu na hodnotu stejným způsobem, jak bylo provedeno v šabloně jako {series_index:05.2f| - |- }. Například následující vytváří stejný výstup jako výše uvedená šablona: program: finish_formatting(field(„series_index“), „05.2f“, „ - „, „ - „)
format_date(hodnota, formát_řetězce)¶
- class calibre.utils.formatter_functions.BuiltinFormatDate[zdroj]¶
format_date(hodnota, formát_řetězce) – formátuje hodnotu, což musí být datum, pomocí formát_řetězce, vrací řetězec. Kódy formátování jsou: d: den jako číslo bez úvodní nuly (1 až 31), dd: den jako číslo s úvodní nulou (01 až 31), ddd: zkrácený lokalizovaný název dne (např. „Pon“ až „Ned“), dddd: dlouhý lokalizovaný název dne (např. „Pondělí“ až „Neděle“). M: měsíc jako číslo bez úvodní nuly (1 až 12), MM: měsíc jako číslo s úvodní nulou (01 až 12), MMM: zkrácený lokalizovaný název měsíce (např. „Led“ až „Pro“), MMMM: dlouhý lokalizovaný název měsíce (např. „Leden“ až „Prosinec“). yy: rok jako dvoumístné číslo (00 až 99), yyyy: rok jako čtyřmístné číslo. h: hodiny bez úvodní nuly (0 až 11 nebo 0 až 23, v závislosti na dop./odp.), hh: hodiny s úvodní nulou (00 až 11 nebo 00 až 23, v závislosti na dop./odp.), m: minuty bez úvodní nuly (0 až 59), mm: minuty s úvodní nulou (00 až 59), s: sekundy bez úvodní nuly (0 až 59), ss: sekundy s úvodní nulou (00 až 59). ap: použít 12hodinový formát namísto 24hodinového formátu, kde je „ap“ nahrazeno lokalizovaným řetězcem pro am nebo pm, AP: použít 12hodinový formát namísto 24hodinového formátu, kde je „AP“ nahrazeno lokalizovaným řetězcem pro AM nebo PM, iso: datum s časem a časovou zónou. Musí být přítomen jediný formát to_number: datum jako číslo s plovoucí desetinnou čárkou from_number[:fmt]: naformátujte časové razítko pomocí fmt, pokud je k dispozici, jinak iso
format_date_field(field_name, format_string)¶
- class calibre.utils.formatter_functions.BuiltinFormatDateField[zdroj]¶
format_date_field(field_name, format_string) – format the value in the field ‚field_name‘, which must be the lookup name of date field, either standard or custom. See ‚format_date‘ for the formatting codes. This function is much faster than format_date and should be used when you are formatting the value in a field (column). It can’t be used for computed dates or dates in string variables. Example: format_date_field(‚pubdate‘, ‚yyyy.MM.dd‘)
format_number(v template)¶
- class calibre.utils.formatter_functions.BuiltinFormatNumber[zdroj]¶
format_number(v template) – formátuje číslo v pomocí šablony formátování Pythonu, jako je „{0:5.2f}“ nebo „{0:,d}“ nebo „${0:5,.2f}“. Součást šablony field_name musí být 0 (nula) („{0:“ ve výše uvedených příkladech). Pro více příkladů se podívejte na jazyk šablony a do dokumentace Pythonu. Pokud šablona obsahuje pouze formát, můžete vynechat úvodní „{0:“ a koncové „}“. Vrací prázdný řetězec, pokud formátování selže.
human_readable(hodnota)¶
rating_to_stars (hodnota, use_half_stars)¶
- class calibre.utils.formatter_functions.BuiltinRatingToStars[zdroj]¶
rating_to_stars (hodnota, use_half_stars) – Vrací hodnocení jako řetězec znaků hvězdiček. Hodnota je číslo mezi 0 a 5. Nastavte use_half_stars na 1, pokud chcete používat poloviční hvězdičky ve sloupcích s vlastním hodnocením, které podporují neceločíselná hodnocení, například 2,5.
urls_from_identifiers(identifikátory, řazení_výsledků)¶
- class calibre.utils.formatter_functions.BuiltinUrlsFromIdentifiers[zdroj]¶
urls_from_identifiers(identifikátory, řazení_výsledků) – při zadání seznamu identifikátorů oddělených čárkou, kde identifikátor je dvojtečkou oddělená dvojice hodnot (název:hodnota_id), vrátí čárkou oddělený seznam URL HTML vygenerovaných z identifikátorů. Seznam není seřazen, pokud je řazení_výsledků 0 (znak nebo číslo), jinak je seřazen abecedně podle názvu identifikátoru. Adresy URL jsou generovány stejným způsobem jako vestavěný sloupec identifikátorů, když jsou zobrazeny v Podrobnostech o knize.
Get values from metadata¶
annotation_count()¶
approximate_formats()¶
- class calibre.utils.formatter_functions.BuiltinApproximateFormats[zdroj]¶
approximate_formats() – vrací čárkami oddělený seznam formátů, které svého času byly přidruženy ke knize. Není žádná záruka, že je tento seznam správný, ačkoliv nejspíš je. Tato funkce může být volána v režimu šablony programu pomocí šablony „{:‘approximate_formats()‘}“. Pamatujte, že názvy formátů jsou vždy velkými písmeny, jako v EPUB. Tato funkce funguje pouze v grafickém rozhraní. Pokud chcete použít tyto hodnoty v šablonách uložení na disk nebo odeslání do zařízení, pak musíte vytvořit vlastní „Sloupec sestavený z jiných sloupců“, použít funkci v šabloně toho sloupce a použít hodnotu toho sloupce ve své šabloně uložení nebo odeslání
booksize()¶
- class calibre.utils.formatter_functions.BuiltinBooksize[zdroj]¶
booksize() – vrací hodnotu pole velikost. Tato funkce funguje pouze v grafickém rozhraní. Pokud chcete použít tuto hodnotu v šablonách uložení na disk nebo odeslání do zařízení, pak musíte vytvořit vlastní „Sloupec sestavený z jiných sloupců“, použít funkci v šabloně toho sloupce a použít hodnotu toho sloupce ve své šabloně uložení nebo odeslání
connected_device_name(storage_location)¶
- class calibre.utils.formatter_functions.BuiltinConnectedDeviceName[zdroj]¶
connected_device_name(storage_location) – pokud je zařízení připojeno, vrátit název zařízení, jinak vrátit prázdný řetězec. Každé umístění úložiště v zařízení může mít jiný název. Názvy umístění jsou ‚main‘, ‚carda‘ a ‚cardb‘. Tato funkce funguje pouze v grafickém rozhraní.
connected_device_uuid(storage_location)¶
- class calibre.utils.formatter_functions.BuiltinConnectedDeviceUUID[zdroj]¶
connected_device_uuid(storage_location) – pokud je zařízení připojeno, vrátit uuid zařízení (jedinečný identifikátor), jinak vrátit prázdný řetězec. Každé umístění úložiště v zařízení má jiné uuid. Názvy umístění jsou ‚main‘, ‚carda‘ a ‚cardb‘. Tato funkce funguje pouze v grafickém rozhraní.
current_library_name()¶
current_library_path()¶
current_virtual_library_name()¶
field(lookup_name)¶
formats_modtimes(formát_data)¶
- class calibre.utils.formatter_functions.BuiltinFormatsModtimes[zdroj]¶
formats_modtimes(formát_data) – vrací čárkami oddělený seznam dvojtečkami oddělených položek představujících časy úpravy pro formáty knihy. Parametr formát_data určuje, jak má být datum formátováno. Pro podrobnosti se podívejte na funkci date_format. Můžete použít funkci select pro získání času úpravy konkrétního formátu. Pamatujte, že názvy formátu jsou vždy velkými písmeny, jako v EPUB.
formats_paths()¶
- class calibre.utils.formatter_functions.BuiltinFormatsPaths[zdroj]¶
formats_paths() – vrací čárkami oddělený seznam dvojtečkami oddělených položek představujících celé cesty k formátům knihy. Můžete použít funkci select pro získání cesty ke konkrétnímu formátu. Pamatujte, že názvy formátu jsou vždy velkými písmeny, jako v EPUB.
formats_sizes()¶
- class calibre.utils.formatter_functions.BuiltinFormatsSizes[zdroj]¶
formats_sizes() – vrací čárkami oddělený seznam dvojtečkami oddělených položek představujících velikosti formátů knihy v bajtech. Můžete použít funkci select pro získání velikosti pro konkrétní formát. Pamatujte, že názvy formátu jsou vždy velkými písmeny, jako v EPUB.
has_cover()¶
is_marked()¶
language_codes(řetězce_jazyka)¶
language_strings(kódy_jazyka, lokalizovat)¶
- class calibre.utils.formatter_functions.BuiltinLanguageStrings[zdroj]¶
language_strings(kódy_jazyka, lokalizovat) – vrací řetězec pro kódy jazyka předané v kódy_jazyka. Pokud lokalizovat je nula, vrací řetězce v angličtině. Pokud lokalizovat není nula, vrací řetězce v jazyce aktuálního národního prostředí. Kódy_jazyka je čárkami oddělený seznam.
ondevice()¶
- class calibre.utils.formatter_functions.BuiltinOndevice[zdroj]¶
ondevice() – vrací Ano, pokud je nastaveno ondevice, jinak vrací prázdný řetězec. Tato funkce funguje pouze v grafickém rozhraní. Pokud chcete použít tuto hodnotu v šablonách uložení na disk nebo odeslání do zařízení, pak musíte vytvořit vlastní „Sloupec sestavený z jiných sloupců“, použít funkci v šabloně toho sloupce a použít hodnotu toho sloupce ve své šabloně uložení nebo odeslání
raw_field(lookup_name)¶
raw_list(lookup_název, oddělovač)¶
series_sort()¶
user_categories()¶
- class calibre.utils.formatter_functions.BuiltinUserCategories[zdroj]¶
user_categories() – vrátí čárkami oddělený seznam uživatelských kategorií, které obsahují tuto knihu. Tato funkce funguje pouze v grafickém rozhraníI. Pokud chcete použít tyto hodnoty v šablonách uložení na disk nebo odeslání do zařízení, pak musíte vytvořit vlastní „Sloupec sestavený z jiných sloupců“, použít funkci v šabloně toho sloupce a použít hodnotu toho sloupce ve svých šablonách uložení nebo odeslání
virtual_libraries()¶
- class calibre.utils.formatter_functions.BuiltinVirtualLibraries[zdroj]¶
virtual_libraries() – vrací čárkami oddělený seznam Virtuálních knihoven, které obsahují tuto knihu. Tato funkce funguje pouze v grafickém rozhraní. Pokud chcete použít tyto hodnoty v šablonách uložení na disk nebo odeslání do zařízení, pak musíte vytvořit vlastní „Sloupec sestavený z jiných sloupců“, použít funkci v šabloně toho sloupce a použít hodnotu toho sloupce ve své šabloně uložení nebo odeslání
If-then-else¶
check_yes_no(field_name, is_undefined, is_false, is_true)¶
- class calibre.utils.formatter_functions.BuiltinCheckYesNo[zdroj]¶
check_yes_no(field_name, is_undefined, is_false, is_true) – kontroluje hodnotu pole ano/ne pojmenovanou vyhledávacím klíčem field_name podle hodnoty zadané parametry, vrací „ano“, pokud je nalezena shoda, jinak vrací prázdný řetězec. Nastavte parametry is_undefined, is_false nebo is_true na 1 (číslo) pro kontrolu těchto podmínek, jinak je nastavte na 0. Příklad: check_yes_no(„#bool“, 1, 0, 1) vrací „ano“, pokud pole ano/ne „#bool“ je buď nedefinováno (ani True ani False) nebo True. Na 1 může být nastaveno více než jeden z parametrů is_undefined, is_false nebo is_true. Tato funkce je obvykle používána funkcemi test() nebo is_empty().
contains(hodnota, vzor, text při shodě, text při neshodě)¶
field_exists(field_name)¶
ifempty(hodnota, text při prázdné)¶
test(hodnota, text při neprázdném, text při prázdném)¶
Iterating over values¶
first_non_empty(hodnota [, hodnota]*)¶
lookup(hodnota, [vzor, pole,]+ jinak_pole)¶
- class calibre.utils.formatter_functions.BuiltinLookup[zdroj]¶
lookup(hodnota, [vzor, pole,]+ jinak_pole) – jako switch kromě toho, že parametry jsou názvy polí (metadat), ne text. Hodnota vhodného pole bude načtena a použita. Všimněte si, že protože složené sloupce jsou pole, můžete použít tuto funkci v jednom složeném poli, aby použilo hodnotu některého jiného složeného pole. Toto je neobyčejně užitečné při sestavování proměnných cest uložení.
switch(hodnota, [výraz, hodnota,]+ jinak_hodnota)¶
- class calibre.utils.formatter_functions.BuiltinSwitch[zdroj]¶
switch(hodnota, [výraz, hodnota,]+ jinak_hodnota) – pro každý pár výraz, hodnota kontroluje, zda pole odpovídá regulárnímu výrazu výraz a pokud ano, vrací tu hodnotu. Pokud neodpovídají žádné výrazy, pak je vrácena jinak_hodnota. Můžete mít tolik párů výraz, hodnota, kolik chcete.
switch_if([testovaný_výraz, hodnota_výrazu,]+ jinak_výraz)¶
- class calibre.utils.formatter_functions.BuiltinSwitchIf[zdroj]¶
switch_if([testovaný_výraz, hodnota_výrazu,]+ jinak_výraz) – pro každý pár „testovaný_výraz, hodnota_výrazu“ zkontroluje, zda je testovaný_výraz True (neprázdný), a pokud ano, vrátí výsledek hodnota_výrazu. Pokud žádný testovaný_výraz není True, pak se vrátí výsledek jinak_výraz. Můžete mít libovolný počet párů „testovaný_výraz, hodnota_výrazu“.
List lookup¶
identifier_in_list(val, id_name [, found_val, not_found_val])¶
- class calibre.utils.formatter_functions.BuiltinIdentifierInList[zdroj]¶
identifier_in_list(val, id_name [, found_val, not_found_val]) – treat val as a list of identifiers separated by commas. An identifier has the format „id_name:value“. The id_name parameter is the id_name text to search for, either „id_name“ or „id_name:regexp“. The first case matches if there is any identifier matching that id_name. The second case matches if id_name matches an identifier and the regexp matches the identifier’s value. If found_val and not_found_val are provided then if there is a match then return found_val, otherwise return not_found_val. If found_val and not_found_val are not provided then if there is a match then return the identifier:value pair, otherwise the empty string.
in_list(hodnota, oddělovač, [ vzor, nalezená_hodnota, ]+ nenalezená_hodnota)¶
- class calibre.utils.formatter_functions.BuiltinInList[zdroj]¶
in_list(hodnota, oddělovač, [ vzor, nalezená_hodnota, ]+ nenalezená_hodnota) – považuje hodnotu za seznam položek oddělených oddělovačem, pokud vzor odpovídá kterékoliv hodnotě ze seznamu, pak vrací nalezená_hodnota. Pokud vzor neodpovídá žádné hodnotě ze seznamu, pak vrací nenalezená_hodnota. Páry vzoru a nalezené_hodnoty mohou být opakovány tolikrát, kolikrát je potřeba. Vzory jsou kontrolovány v pořadí. Je vrácena nenalezená_hodnota pro první shodu. Aliasy: in_list(), list_contains().
list_item(hodnota, pořadí, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinListitem[zdroj]¶
list_item(hodnota, pořadí, oddělovač) – interpretuje hodnotu jako seznam položek oddělených oddělovačem, vrací položku na pořadí. První položka je číslo nula. Poslední položka může být vrácena pomocí list_item(-1,oddělovač). Pokud položka naní v seznamu, pak je vrácena prázdné hodnota. Oddělovač má stejný význam jako ve funkci count.
select(hodnota, klíč)¶
- class calibre.utils.formatter_functions.BuiltinSelect[zdroj]¶
select(hodnota, klíč) – interpretuje hodnotu jako čárkami oddělený seznam položek, s položkami „identifikátor:hodnota“. Nejde pár s identifikátorem rovnajícím se klíči a vrátí odpovídající hodnotu. Vrací prázdný řetězec, pokud není nalezena žádná shoda.
str_in_list(hodnota, oddělovač, [ řetězec, nalezená_hodnota, ]+ nenalezená_hodnota)¶
- class calibre.utils.formatter_functions.BuiltinStrInList[zdroj]¶
str_in_list(hodnota, oddělovač, [ řetězec, nalezená_hodnota, ]+ nenalezená_hodnota) – považuje hodnotu za seznam položek oddělených oddělovačem, pokud řetězec odpovídá kterékoliv hodnotě ze seznamu, pak vrací nalezenou_hodnotu. Pokud řetězec neodpovídá žádné hodnotě ze seznamu, pak vrací nenalezenou_hodnotu. Porovnání je přesná shoda (neobsahuje) a nerozlišuje velikost písmen. Páry řetězce a nalezené_hodnoty mohou být opakovány tolikrát, kolikrát je potřeba. Vzory jsou kontrolovány v pořadí. Je vrácena nenalezená_hodnota pro první shodu.
List manipulation¶
count(hodnota, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinCount[zdroj]¶
count(hodnota, oddělovač) – interpretuje hodnotu jako seznam položek oddělených oddělovačem, vrací počet položek v seznamu. Většina seznamů používá jako oddělovač čárku, ale autoři používají znak &. Příklady: {tags:count(,)}, {authors:count(&)}. Aliasy: count(), list_count().
list_count_matching(seznam, vzor, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinListCountMatching[zdroj]¶
list_count_matching(seznam, vzor, oddělovač) – interpretuje ‚seznam‘ jako seznam položek oddělených ‚oddělovačem‘ a vrací počet položek v seznamu, které odpovídají regulárnímu výrazu ‚vzor‘. Aliasy: list_count_matching(), count_matching().
list_difference(seznam1, seznam2, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinListDifference[zdroj]¶
list_difference(seznam1, seznam2, oddělovač) – vrací seznam vytvořený odebrání ze seznam1 všech položek nalezených v seznam2 pomocí porovnání bez rozlišení malých a velkých písmen. Položky v seznam1 a seznam2 jsou odděleny oddělovačem, stejně jako položky ve vráceném seznamu.
list_equals(seznam1, oddělovač1, seznam2, oddělovač2, hodnota_ano, hodnota_ne)¶
- class calibre.utils.formatter_functions.BuiltinListEquals[zdroj]¶
list_equals(seznam1, oddělovač1, seznam2, oddělovač2, hodnota_ano, hodnota_ne) – vrací hodnota_ano, pokud seznam1 a seznam2 obsahují stejné položky, jinak vrací hodnota_ne. Položky jsou určeny rozdělením každého seznamu pomocí příslušného znaku oddělovače (oddělovač1 nebo oddělovač2). Pořadí položek v seznamu není relevantní. Porovnání je bez rozlišení malých a velkých písmen.
list_intersection(seznam1, seznam2, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinListIntersection[zdroj]¶
list_intersection(seznam1, seznam2, oddělovač) – vrací seznam vytvořený odebrání ze seznam1 všech položek nenalezených v seznam2 pomocí porovnání bez rozlišení malých a velkých písmen. Položky v seznam1 a seznam2 jsou odděleny oddělovačem, stejně jako položky ve vráceném seznamu.
list_join(with_separator, seznam1, oddělovač1 [, seznam2, oddělovač2]*)¶
- class calibre.utils.formatter_functions.BuiltinListJoin[zdroj]¶
list_join(with_separator, seznam1, oddělovač1 [, seznam2, oddělovač2]*) – vrací seznam vytvořený spojením položek zdrojových seznamů (seznam1 atd.) s použitím oddělovače mezi položkami výsledného seznamu. Položky v každém zdrojovém seznamu[123…] jsou odděleny přidruženým oddělovačem[123…]. Seznam může obsahovat nulové hodnoty. Může to být pole jako vydavatel, které je jednohodnotové, tedy vlastně jednopoložkový seznam. Duplicity jsou odebrány pomocí porovnávání bez ohledu na velikost písmen. Položky jsou vráceny v pořadí, v jakém jsou uvedeny ve zdrojových seznamech. Pokud se položky v seznamech liší pouze velikostí písmen, použije se poslední z nich. Všechny oddělovače mohou mít více než jeden znak. Příklad:
- program:
list_join(‚#@#‘, $authors, ‚&‘, $tags, ‚,‘)
- Příkaz list_join můžete použít na výsledky předchozích volání příkazu list_join následujícím způsobem:
program:
a = list_join(‚#@#‘, $authors, ‚&‘, $tags, ‚,‘); b = list_join(‚#@#‘, a, ‚#@#‘, $#genre, ‚,‘, $#people, ‚&‘)
- K vygenerování seznamu můžete použít výrazy. Předpokládejme například, že chcete položky pro autory a #žánr, ale se změnou žánru na slovo ‚Žánr: ‘ následované prvním písmenem žánru, tj. z žánru ‚Fikce‘ se stane ‚Žánr: F‘. To uděláte následujícím způsobem:
- program:
list_join(‚#@#‘, $authors, ‚&‘, list_re($#genre, ‚,‘, ‚^(.).*$‘, ‚Genre: 1‘), ‚,‘)
list_re(seznam_zdrojů, oddělovač, zahrnout_vrácené, volitelně_nahradit)¶
- class calibre.utils.formatter_functions.BuiltinListRe[zdroj]¶
list_re(seznam_zdrojů, oddělovač, zahrnout_vrácené, volitelně_nahradit) – Vytváří seznam nejdříve rozdělením seznam_zdrojů na položky pomocí znaku oddělovače. Pro každou položku na seznamu kontroluje, zda odpovídá zahrnout_vrácené. Pokud ano, pak ji přidá na seznam vrácených. Pokud volitelně_nahradit není prázdný řetězec, pak použije náhradu před přidáním položky na seznam vrácených.
list_re_group(src_list, separator, include_re, search_re [, group_template]+)¶
- class calibre.utils.formatter_functions.BuiltinListReGroup[zdroj]¶
list_re_group(src_list, separator, include_re, search_re [, group_template]+) – Jako list_re kromě toho, že nahrazení nejsou volitelná. Používáre_group(list_item, search_re, group_template, …) při provádění nahrazení na seznamu výsledků.
list_remove_duplicates(seznam, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinListRemoveDuplicates[zdroj]¶
list_remove_duplicates(seznam, oddělovač) – vrací seznam vytvořený odebráním duplicitních položek ze zdrojového seznamu. Pokud se položky liší pouze ve velikost písmen, vrátí se poslední z nich. Položky ve zdrojovém seznamu jsou odděleny oddělovačem, stejně jako položky ve vráceném seznamu.
list_sort(seznam, směr, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinListSort[zdroj]¶
list_sort(seznam, směr, oddělovač) – vrací seznam seřazený pomocí řazení bez rozlišení malých a velkých písmen. Pokud je směr nula, je seznam seřazen vzestupně, jinak sestupně. Položky seznamu jsou odděleny oddělovačem, stejně jako položky ve vráceném seznamu.
list_split(list_val, sep, id_prefix)¶
- class calibre.utils.formatter_functions.BuiltinListSplit[zdroj]¶
list_split(list_val, sep, id_prefix) – rozdělí list_val na samostatné hodnoty pomocí ‚sep‘, poté přiřadí hodnoty proměnným s názvem ‚id_prefix_N‘, kde N je pozice hodnoty v seznamu. První položka má pozici 0 (nula). Funkce vrací poslední prvek v seznamu. Příklad: split(‚jedna:dva:moc‘, ‚:‘, ‚var‘) je ekvivalentem k var_0 = ‚jedna‘; var_1 = ‚dva‘; var_2 = ‚moc‘.
list_union(seznam1, seznam2, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinListUnion[zdroj]¶
list_union(seznam1, seznam2, oddělovač) – vrací seznam vytvořený sloučením položek v seznam1 a seznam2, odebráním duplicitních položek pomocí porovnání bez rozlišení malých a velkých písmen. Pokud se položky liší velikostí písmen, je použita ta z seznam1. Položky v seznam1 a seznam2 jsou odděleny oddělovačem, stejně jako položky ve vráceném seznamu. Aliasy: list_union(), merge_lists().
range(start, stop, step, limit)¶
- class calibre.utils.formatter_functions.BuiltinRange[zdroj]¶
range(start, stop, step, limit) – vrací seznam čísel vygenerovaných smyčkou nad rozsahem zadaném parametry start (začátek), stop (konec) a step (krok) s maximální délkou limit (omezení). První vytvořená hodnota je ‚start‘. Následující hodnoty next_v jsou current_v+step. Smyčka pokračuje, dokud next_v < stop assuming step is positive, otherwise while next_v > stop. Pokud start neprojde testem, vytvoří se prázdný seznam: start>=stop, pokud je step kladný. limit nastaví maximální délku seznamu a má výchozí hodnotu 1000. Parametry start, step a limit jsou nepovinné. Volání range() s jedním argumentem určuje stop. Dva parametry určují start a stop. Tři parametry určují start, stop a krok. Čtyři parametry určují start, stop, krok a limit. Příklady: range(5) -> ‚0,1,2,3,4‘. range(0,5) -> ‚0,1,2,3,4‘. range(-1,5) -> ‚-1,0,1,2,3,4‘. range(1,5) -> ‚1,2,3,4‘. range(1,5,2) -> ‚1,3‘. range(1,5,2,5) -> ‚1,3‘. range(1,5,2,1) -> chyba(překročen limit).
subitems(hodnota, počáteční_index, konečný_index)¶
- class calibre.utils.formatter_functions.BuiltinSubitems[zdroj]¶
subitems(hodnota, počáteční_index, konečný_index) – tato funkce je používána na rozdělení seznamů položek, jako jsou žánry. Interpretuje hodnotu jako čárkami oddělený seznam položek, kde každá položka je tečkami oddělený seznam. Vrací nový seznam vytvořený nejdříve nalezením všech tečkami oddělených položek, pak pro každou takovou položku extrahováním komponent od počáteční_index po konečný_index a pak zkombinováním výsledků zpět dohromady. První komponenta v tečkami odděleném seznamu má index nula. Pokud je index záporný, pak se počítá od konce seznamu. Jako speciální příklad je koncový_index nula považován za délku seznamu. Příklady používající režim základní šablony a předpokládající, že hodnota #genre „A.B.C“: {#genre:subitems(0,1)} vrací „A“. {#genre:subitems(0,2)} vrací „A.B“. {#genre:subitems(1,0)} vrací „B.C“. Předpokládající, že hodnota #genre „A.B.C, D.E.F“, {#genre:subitems(0,1)} vrací „A, D“. {#genre:subitems(0,2)} vrací „A.B, D.E“
sublist(hodnota, počáteční_index, konečný_index, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinSublist[zdroj]¶
sublist(hodnota, počáteční_index, konečný_index, oddělovač) – interpretuje hodnotu jako seznam položek oddělený oddělovačem, vrací nový seznam vytvořený od položky počáteční_pořadí po konečný_pořadí. První položka je číslo nula. Pokud je pořadí záporný, pak se počítá od konce seznamu. Jako speciální příklad je koncový_index nula považován za délku seznamu. Příklady používající základní režim šablony a předpokládající, že sloupec štítky (který je čárkami oddělený) obsahující „A, B, C“: {tags:sublist(0,1,\,)} vrací „A“. {tags:sublist(-1,0,\,)} vrací „C“. {tags:sublist(0,-1,\,)} vrací „A, B“.
Other¶
arguments(id[=výraz] [, id[=výraz]]*)¶
- class calibre.utils.formatter_functions.BuiltinArguments[zdroj]¶
arguments(id[=výraz] [, id[=výraz]]*) – používá se v uložené šabloně k načtení parametrů předaných ve volání. Deklaruje a inicializuje místní proměnné, účinně parametry. Proměnné jsou poziční; získají hodnotu parametru zadaného ve volání na stejné pozici. Pokud odpovídající parametr není uveden ve volání, pak parametry přiřadí dané proměnné uvedenou výchozí hodnotu. Pokud neexistuje žádná výchozí hodnota, je proměnná nastavena na prázdný řetězec.
assign(id, val)¶
globals(id[=výraz] [, id[=výraz]]*)¶
- class calibre.utils.formatter_functions.BuiltinGlobals[zdroj]¶
globals(id[=výraz] [, id[=výraz]]*) – načte „globální proměnné“, které lze předat do formátovače. Deklaruje a inicializuje místní proměnné s názvy předaných globálních proměnných. Pokud odpovídající proměnná není v předaných globálních uvedena, přiřadí dané proměnné uvedenou výchozí hodnotu. Pokud neexistuje žádná výchozí hodnota, je proměnná nastavena na prázdný řetězec.
print(a [, b]*)¶
Recursion¶
eval(template)¶
- class calibre.utils.formatter_functions.BuiltinEval[zdroj]¶
eval(template) – vyhodnocuje šablonu, předává místní proměnné (ty ‚přiřazené‘) namísto metadat knihy. Toto umožňuje pomocí zpracování šablony vytvořit složité výsledky z místních proměnných. Protože znaky { a } jsou speciální, musíte použít [[ pro znak { a ]] pro znak }; jsou převedeny automaticky. Pamatujte také na to, že předpony a přípony (syntaxe |prefix|suffix) nemohou být použity v parametru této funkce při použití režimu šablony programu.
template(x)¶
- class calibre.utils.formatter_functions.BuiltinTemplate[zdroj]¶
template(x) – vyhodnocuje x jako šablonu.Vyhodnocení se provádí ve vlastním kontextu, což znamená, že proměnné nejsou sdíleny mezi volajícím a vyhodnocením šablony. Protože znaky { a } jsou speciální, musíte použít [[ pro znak { a ]] pro znak }; jsou převedeny automaticky. Například template(‚[[title_sort]]‘) vyhodnotí šablonu {title_sort} a vrátí její hodnotu. Pamatujte také na to, že předpony a přípony (syntaxe |prefix|suffix) nemohou být použity v parametru této funkce při použití režimu šablony programu.
Relational¶
cmp(x, y, lt, eq, gt)¶
first_matching_cmp(val, [cmp1, result1,]+, else_result)¶
- class calibre.utils.formatter_functions.BuiltinFirstMatchingCmp[zdroj]¶
first_matching_cmp(val, [cmp1, result1,]+, else_result) – porovnává „val < cmpN“ v posloupnosti, vrací resultN pro první porovnání, které uspěje. Vrací else_result, když žádné porovnání neuspěje. Příklad: first_matching_cmp(10,5,“malý“,10,“střední“,15,“velký“,“obrovský“) vrací „velký“. Stejný příklad s první hodnotou 16 vrací „obrovský“.
strcmp(x, y, lt, eq, gt)¶
- class calibre.utils.formatter_functions.BuiltinStrcmp[zdroj]¶
strcmp(x, y, lt, eq, gt) – dělá porovnání x a y jako řetězců bez rozlišení malých a velkých písmen. Vrací lt, když x < y. Vrací eq, když x == y. Jinak vrací gt. V mnoha případech mohou tuto funkci nahradit slovní operátory porovnání (>, <, == atd.).
strcmpcase(x, y, lt, eq, gt)¶
- class calibre.utils.formatter_functions.BuiltinStrcmpcase[zdroj]¶
strcmpcase(x, y, lt, eq, gt) – porovná x a y jako řetězce s ohledem na velikost písmen. Vrací lt, pokud x < y. Vrací eq, pokud x == y. Jinak vrací gt. Poznámka: Toto NENÍ výchozí chování, které Calibre používá například u operátorů lexikálního porovnávání (==, >, < atd.). Tato funkce by mohla způsobit neočekávané výsledky, raději používejte funkci strcmp(), kdykoliv je to možné.
String case changes¶
capitalize(hodnota)¶
lowercase(hodnota)¶
titlecase(hodnota)¶
uppercase(hodnota)¶
String manipulation¶
character(character_name)¶
- class calibre.utils.formatter_functions.BuiltinCharacter[zdroj]¶
character(character_name) – vrací znak pojmenovaný podle character_name. Například character(‚newline‘) vrací znak nového řádku (‘n‘). Podporované názvy znaků jsou ‚newline‘ (nový řádek), ‚return‘ (enter), ‚tab‘ (tabulátor) a ‚backslash‘ (zpětné lomítko).
re(hodnota, vzor, náhrada)¶
re_group(val, pattern [, template_for_group]*)¶
- class calibre.utils.formatter_functions.BuiltinReGroup[zdroj]¶
re_group(val, pattern [, template_for_group]*) – vrací řetězec vytvořený použitím vzoru regulárního výrazu (pattern) na hodnotu (val) a nahrazením každé odpovídající instance řetězcem vypočítaným nahrazením každé odpovídající skupiny hodnotou vrácenou odpovídající šablonou (tempůate_for_group_1). Původní odpovídající hodnota pro skupinu je dostupná jako $. V režimu programu šablony, jako pro šablonu a funkce eval, použijte [[ pro { a ]] pro }. Následující příklad v režimu programu šablony hledá série s více než jedním slovem a prvním slovem velkými písmeny: {series:‘re_group($, „(S* )(.*)“, „[[$:uppercase()]]“, „[[$]]“)‘}
shorten(hodnota, znaky vlevo, text uprostřed, znaky vpravo)¶
- class calibre.utils.formatter_functions.BuiltinShorten[zdroj]¶
shorten(hodnota, znaky vlevo, text uprostřed, znaky vpravo) – Vrací zkrácenou verzi hodnoty, skládající se ze znaky vlevo znaků od začátku hodnoty, následované text uptostřed, následovné znaky vpravo znaků od konce řetězce. Znaky vlevo a znaky vpravo musí být celá čísla. Například předpokládejme, že název knihy je Život a doba soudce Roye Beana a chcete, aby se vešel do míst s nanejvýše 15 znaky. Pokud použijete {title:shorten(9,-,5)}, výsledek bude Život a d-Beana. Pokud je délka pole menší než znaky vlevo + znaky vpravo + délka text uprostřed, pak bude pole použito nezměněno. Například název Kopule by nebyl změněn.
strcat(a [, b]*)¶
strcat_max(max, řetězec1 [, předpona2, řetězec2]*)¶
- class calibre.utils.formatter_functions.BuiltinStrcatMax[zdroj]¶
strcat_max(max, řetězec1 [, předpona2, řetězec2]*) – Vrací řetězec vytvořený spojením parametrů. Vrácená hodnota je spuštěna na řetězec1. Páry předpona, řetězec jsou přidávány na konec hodnoty, dokud je výsledný řetězec kratší než max. Řetězec1 je vrácen, dokonce i když je řetězec1 delší než max. Můžete předat tolik párů předpona, řetězec, kolik si přejete.
strlen(a)¶
substr(řetězec, počátek, konec)¶
- class calibre.utils.formatter_functions.BuiltinSubstr[zdroj]¶
substr(řetězec, počátek, konec) – vrací počáteční až koncové znaky řetězce. První znak v řetězci je nultý znak. Pokud je konec záporný, pak označuje, kolik znaků počítat zprava. Pokud je konec nula, pak označuje poslední znak. Například substr(‚12345‘, 1, 0) vrací ‚2345‘ a substr(‚12345‘, 1, -1) vrací ‚234‘.
swap_around_articles (hodnota, oddělovač)¶
- class calibre.utils.formatter_functions.BuiltinSwapAroundArticles[zdroj]¶
swap_around_articles (hodnota, oddělovač) – Vrací hodnotu s články přesunutými na konec. Hodnota může být seznam, v takovém případě je zpracován každý člen seznamu. Pokud je hodnota seznam, pak musíte zadat oddělovač hodnot seznamu. Pokud není k dispozici žádný oddělovač, bude se s hodnotou zacházet jako s jedinou hodnotou, nikoliv jako se seznamem.
swap_around_comma(hodnota)¶
to_hex(val)¶
transliterate(a)¶
Template database functions¶
book_count(dotaz, use_vl)¶
book_values(sloupec, dotaz, oddělovač, use_vl)¶
- class calibre.utils.formatter_functions.BuiltinBookValues[zdroj]¶
book_values(sloupec, dotaz, oddělovač, use_vl) – vrací seznam hodnot obsažených ve sloupci „sloupec“ oddělených znakem „oddělovač“ v knihách nalezených při vyhledání „doatz“. Pokud je use_vl 0 (nula), pak jsou virtuální knihovny ignorovány. Tato funkce může být použita pouze v grafickém rozhraní.
extra_file_modtime(file_name, format_string)¶
- class calibre.utils.formatter_functions.BuiltinExtraFileModtime[zdroj]¶
extra_file_modtime(file_name, format_string) – returns the modification time of the extra file ‚file_name‘ in the book’s ‚data/‘ folder if it exists, otherwise -1.0. The modtime is formatted according to ‚format_string‘ (see format_date()). If ‚format_string‘ is empty, returns the modtime as the floating point number of seconds since the epoch. The epoch is OS dependent. This function can be used only in the GUI.
extra_file_names(oddělovač [, vzor])¶
- class calibre.utils.formatter_functions.BuiltinExtraFileNames[zdroj]¶
extra_file_names(oddělovač [, vzor]) – vrací seznam dodatečných souborů oddělených oddělovačem ve složce ‚data/‘ knihy. Pokud je zadán volitelný parametr ‚vzor‘, regulární výraz, je seznam filtrován na soubory, které odpovídají vzoru. Shoda se vzorem nerozlišuje velká a malá písmena. Tato funkce může být použita pouze v grafickém rozhraní.
extra_file_size(název_souboru)¶
get_link(field_name, field_value)¶
get_note(field_name, field_value, plain_text)¶
- class calibre.utils.formatter_functions.BuiltinGetNote[zdroj]¶
get_note(field_name, field_value, plain_text) – fetch the note for field ‚field_name‘ with value ‚field_value‘. If ‚plain_text‘ is empty, return the note’s HTML including images. If ‚plain_text‘ is 1 (or ‚1‘), return the note’s plain text. If the note doesn’t exist, return the empty string in both cases. Example: get_note(‚tags‘, ‚Fiction‘, ‚‘) returns the HTML of the note attached to the tag ‚Fiction‘.
has_extra_files([vzor])¶
- class calibre.utils.formatter_functions.BuiltinHasExtraFiles[zdroj]¶
has_extra_files([vzor]) – vrací počet dodatečných souborů, jinak ‚‘ (prázdný řetězec). Pokud je zadán volitelný parametr ‚vzor‘ (regulární výraz), je seznam před spočítáním souborů filtrován na soubory, které odpovídají vzoru. Shoda se vzorem nerozlišuje velká a malá písmena. Tato funkce může být použita pouze v grafickém rozhraní.
has_note(field_name, field_value)¶
- class calibre.utils.formatter_functions.BuiltinHasNote[zdroj]¶
has_note(field_name, field_value) – return ‚1‘ if the value ‚field_value‘ in the field ‚field_name‘ has an attached note, ‚‘ otherwise. Example: has_note(‚tags‘, ‚Fiction‘) returns ‚1‘ if the tag ‚fiction‘ has an attached note, ‚‘ otherwise.
other¶
is_dark_mode()¶
- class calibre.utils.formatter_functions.BuiltinIsDarkMode[zdroj]¶
is_dark_mode() – Returns ‚1‘ if calibre is running in dark mode, ‚‘ (the empty string) otherwise. This function can be used in advanced color and icon rules to choose different colors/icons according to the mode. Example: if is_dark_mode() then ‚dark.png‘ else ‚light.png‘ fi
set_globals(id[=výraz] [, id[=výraz]]*)¶
- class calibre.utils.formatter_functions.BuiltinSetGlobals[zdroj]¶
set_globals(id[=výraz] [, id[=výraz]]*) – Nastaví „globální proměnné“, které mohou být předány formátovacímu modulu. Globální proměnné dostanou název předaného identifikátoru. Pokud není zadán výraz, použije se hodnota identifikátoru.
API of the Metadata objects¶
The python implementation of the template functions is passed in a Metadata object. Knowing it’s API is useful if you want to define your own template functions.
- class calibre.ebooks.metadata.book.base.Metadata(title, authors=('Neznámý',), other=None, template_cache=None, formatter=None)[zdroj]¶
A class representing all the metadata for a book. The various standard metadata fields are available as attributes of this object. You can also stick arbitrary attributes onto this object.
Metadata from custom columns should be accessed via the get() method, passing in the lookup name for the column, for example: „#mytags“.
Use the
is_null()
method to test if a field is null.This object also has functions to format fields into strings.
The list of standard metadata fields grows with time is in
STANDARD_METADATA_FIELDS
.Please keep the method based API of this class to a minimum. Every method becomes a reserved field name.
- is_null(field)[zdroj]¶
Return True if the value of field is null in this object. ‚null‘ means it is unknown or evaluates to False. So a title of _(‚Unknown‘) is null or a language of ‚und‘ is null.
Be careful with numeric fields since this will return True for zero as well as None.
Also returns True if the field does not exist.
- deepcopy(class_generator=<function Metadata.<lambda>>)[zdroj]¶
Do not use this method unless you know what you are doing, if you want to create a simple clone of this object, use
deepcopy_metadata()
instead. Class_generator must be a function that returns an instance of Metadata or a subclass of it.
- get_identifiers()[zdroj]¶
Return a copy of the identifiers dictionary. The dict is small, and the penalty for using a reference where a copy is needed is large. Also, we don’t want any manipulations of the returned dict to show up in the book.
- set_identifiers(identifiers)[zdroj]¶
Set all identifiers. Note that if you previously set ISBN, calling this method will delete it.
- standard_field_keys()[zdroj]¶
return a list of all possible keys, even if this book doesn’t have them
- all_non_none_fields()[zdroj]¶
Return a dictionary containing all non-None metadata fields, including the custom ones.
- get_standard_metadata(field, make_copy)[zdroj]¶
return field metadata from the field if it is there. Otherwise return None. field is the key name, not the label. Return a copy if requested, just in case the user wants to change values in the dict.
- get_all_standard_metadata(make_copy)[zdroj]¶
return a dict containing all the standard field metadata associated with the book.
- get_all_user_metadata(make_copy)[zdroj]¶
return a dict containing all the custom field metadata associated with the book.
- get_user_metadata(field, make_copy)[zdroj]¶
return field metadata from the object if it is there. Otherwise return None. field is the key name, not the label. Return a copy if requested, just in case the user wants to change values in the dict.
- set_all_user_metadata(metadata)[zdroj]¶
store custom field metadata into the object. Field is the key name not the label
- set_user_metadata(field, metadata)[zdroj]¶
store custom field metadata for one column into the object. Field is the key name not the label
- remove_stale_user_metadata(other_mi)[zdroj]¶
Remove user metadata keys (custom column keys) if they don’t exist in ‚other_mi‘, which must be a metadata object
- template_to_attribute(other, ops)[zdroj]¶
Takes a list [(src,dest), (src,dest)], evaluates the template in the context of other, then copies the result to self[dest]. This is on a best-efforts basis. Some assignments can make no sense.
- calibre.ebooks.metadata.book.base.STANDARD_METADATA_FIELDS¶
The set of standard metadata fields.
'''
All fields must have a NULL value represented as None for simple types,
an empty list/dictionary for complex types and (None, None) for cover_data
'''
SOCIAL_METADATA_FIELDS = frozenset((
'tags', # Ordered list
'rating', # A floating point number between 0 and 10
'comments', # A simple HTML enabled string
'series', # A simple string
'series_index', # A floating point number
# Of the form { scheme1:value1, scheme2:value2}
# For example: {'isbn':'123456789', 'doi':'xxxx', ... }
'identifiers',
))
'''
The list of names that convert to identifiers when in get and set.
'''
TOP_LEVEL_IDENTIFIERS = frozenset((
'isbn',
))
PUBLICATION_METADATA_FIELDS = frozenset((
'title', # title must never be None. Should be _('Unknown')
# Pseudo field that can be set, but if not set is auto generated
# from title and languages
'title_sort',
'authors', # Ordered list. Must never be None, can be [_('Unknown')]
'author_sort_map', # Map of sort strings for each author
# Pseudo field that can be set, but if not set is auto generated
# from authors and languages
'author_sort',
'book_producer',
'timestamp', # Dates and times must be timezone aware
'pubdate',
'last_modified',
'rights',
# So far only known publication type is periodical:calibre
# If None, means book
'publication_type',
'uuid', # A UUID usually of type 4
'languages', # ordered list of languages in this publication
'publisher', # Simple string, no special semantics
# Absolute path to image file encoded in filesystem_encoding
'cover',
# Of the form (format, data) where format is, e.g. 'jpeg', 'png', 'gif'...
'cover_data',
# Either thumbnail data, or an object with the attribute
# image_path which is the path to an image file, encoded
# in filesystem_encoding
'thumbnail',
))
BOOK_STRUCTURE_FIELDS = frozenset((
# These are used by code, Null values are None.
'toc', 'spine', 'guide', 'manifest',
))
USER_METADATA_FIELDS = frozenset((
# A dict of dicts similar to field_metadata. Each field description dict
# also contains a value field with the key #value#.
'user_metadata',
))
DEVICE_METADATA_FIELDS = frozenset((
'device_collections', # Ordered list of strings
'lpath', # Unicode, / separated
'size', # In bytes
'mime', # Mimetype of the book file being represented
))
CALIBRE_METADATA_FIELDS = frozenset((
'application_id', # An application id, currently set to the db_id.
'db_id', # the calibre primary key of the item.
'formats', # list of formats (extensions) for this book
# a dict of user category names, where the value is a list of item names
# from the book that are in that category
'user_categories',
# a dict of items to associated hyperlink
'link_maps',
))
ALL_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union(
PUBLICATION_METADATA_FIELDS).union(
BOOK_STRUCTURE_FIELDS).union(
USER_METADATA_FIELDS).union(
DEVICE_METADATA_FIELDS).union(
CALIBRE_METADATA_FIELDS)
# All fields except custom fields
STANDARD_METADATA_FIELDS = SOCIAL_METADATA_FIELDS.union(
PUBLICATION_METADATA_FIELDS).union(
BOOK_STRUCTURE_FIELDS).union(
DEVICE_METADATA_FIELDS).union(
CALIBRE_METADATA_FIELDS)
# Metadata fields that smart update must do special processing to copy.
SC_FIELDS_NOT_COPIED = frozenset(('title', 'title_sort', 'authors',
'author_sort', 'author_sort_map',
'cover_data', 'tags', 'languages',
'identifiers'))
# Metadata fields that smart update should copy only if the source is not None
SC_FIELDS_COPY_NOT_NULL = frozenset(('device_collections', 'lpath', 'size', 'comments', 'thumbnail'))
# Metadata fields that smart update should copy without special handling
SC_COPYABLE_FIELDS = SOCIAL_METADATA_FIELDS.union(
PUBLICATION_METADATA_FIELDS).union(
BOOK_STRUCTURE_FIELDS).union(
DEVICE_METADATA_FIELDS).union(
CALIBRE_METADATA_FIELDS) - \
SC_FIELDS_NOT_COPIED.union(
SC_FIELDS_COPY_NOT_NULL)
SERIALIZABLE_FIELDS = SOCIAL_METADATA_FIELDS.union(
USER_METADATA_FIELDS).union(
PUBLICATION_METADATA_FIELDS).union(
CALIBRE_METADATA_FIELDS).union(
DEVICE_METADATA_FIELDS) - \
frozenset(('device_collections', 'formats',
'cover_data'))
# these are rebuilt when needed