From 4f6709d7548b8961b04e14ab882c12024585a621 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 25 Mar 2013 16:10:45 +0530 Subject: [PATCH] Implement writing of languages field --- src/calibre/db/tests/writing.py | 16 +++++++++++++++- src/calibre/db/write.py | 12 ++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/calibre/db/tests/writing.py b/src/calibre/db/tests/writing.py index 875329558b..de40052c9b 100644 --- a/src/calibre/db/tests/writing.py +++ b/src/calibre/db/tests/writing.py @@ -252,7 +252,21 @@ class WritingTest(BaseTest): ae(cache.field_for('author_sort', 1), 'GoyaL, KoviD') ae(cache.field_for('author_sort', 3), 'GoyaL, KoviD & Layog, Divok') - # TODO: identifiers, languages + # Languages + f = cache.fields['languages'] + ae(f.table.id_map, {1: 'eng', 2: 'deu'}) + ae(sf('languages', {1:''}), set([1])) + ae(cache.field_for('languages', 1), ()) + ae(sf('languages', {2:('und',)}), set([2])) + af(f.table.id_map) + ae(sf('languages', {1:'eng,fra,deu', 2:'es,Dutch', 3:'English'}), {1, 2, 3}) + ae(cache.field_for('languages', 1), ('eng', 'fra', 'deu')) + ae(cache.field_for('languages', 2), ('spa', 'nld')) + ae(cache.field_for('languages', 3), ('eng',)) + ae(sf('languages', {3:None}), set([3])) + ae(cache.field_for('languages', 3), ()) + + # TODO: identifiers # }}} diff --git a/src/calibre/db/write.py b/src/calibre/db/write.py index e558c95fe5..764be65900 100644 --- a/src/calibre/db/write.py +++ b/src/calibre/db/write.py @@ -15,6 +15,7 @@ from calibre.constants import preferred_encoding, ispy3 from calibre.ebooks.metadata import author_to_author_sort from calibre.utils.date import (parse_only_date, parse_date, UNDEFINED_DATE, isoformat) +from calibre.utils.localization import canonicalize_lang from calibre.utils.icu import strcmp if ispy3: @@ -96,6 +97,15 @@ def adapt_bool(x): x = bool(int(x)) return x if x is None else bool(x) +def adapt_languages(to_tuple, x): + ans = [] + for lang in to_tuple(x): + lc = canonicalize_lang(lang) + if not lc or lc in ans or lc in ('und', 'zxx', 'mis', 'mul'): + continue + ans.append(lc) + return tuple(ans) + def get_adapter(name, metadata): dt = metadata['datatype'] if dt == 'text': @@ -133,6 +143,8 @@ def get_adapter(name, metadata): return lambda x: ans(x) or UNDEFINED_DATE if name == 'series_index': return lambda x: 1.0 if ans(x) is None else ans(x) + if name == 'languages': + return partial(adapt_languages, ans) return ans # }}}