diff -r 044dc196ec8a -r d3668ecd9137 src/ztfy/utils/encoding.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ztfy/utils/encoding.py Wed Jun 20 16:29:53 2012 +0200 @@ -0,0 +1,159 @@ +### -*- coding: utf-8 -*- #################################################### +############################################################################## +# +# Copyright (c) 2008-2012 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## + +__docformat__ = "restructuredtext" + +# import standard packages + +# import Zope3 interfaces +from zope.schema.interfaces import IVocabularyFactory, IChoice + +# import local interfaces + +# import Zope3 packages +from zope.i18n import translate +from zope.interface import classProvides, implements +from zope.schema import Choice +from zope.schema.vocabulary import SimpleTerm, SimpleVocabulary + +# import local packages +from ztfy.utils.request import queryRequest + +from ztfy.utils import _ + + +ENCODINGS = { + 'ascii': _('English (ASCII)'), + 'big5': _('Traditional Chinese (big5)'), + 'big5hkscs': _('Traditional Chinese (big5hkscs)'), + 'cp037': _('English (cp037)'), + 'cp424': _('Hebrew (cp424)'), + 'cp437': _('English (cp437)'), + 'cp500': _('Western Europe (cp500)'), + 'cp720': _('Arabic (cp720)'), + 'cp737': _('Greek (cp737)'), + 'cp775': _('Baltic languages (cp775)'), + 'cp850': _('Western Europe (cp850)'), + 'cp852': _('Central and Eastern Europe (cp852)'), + 'cp855': _('Bulgarian, Byelorussian, Macedonian, Russian, Serbian (cp855)'), + 'cp856': _('Hebrew (cp856)'), + 'cp857': _('Turkish (cp857)'), + 'cp858': _('Western Europe (cp858)'), + 'cp860': _('Portuguese (cp860)'), + 'cp861': _('Icelandic (cp861)'), + 'cp862': _('Hebrew (cp862)'), + 'cp863': _('Canadian (cp863)'), + 'cp864': _('Arabic (cp864)'), + 'cp865': _('Danish, Norwegian (cp865)'), + 'cp866': _('Russian (cp866)'), + 'cp869': _('Greek (cp869)'), + 'cp874': _('Thai (cp874)'), + 'cp875': _('Greek (cp875)'), + 'cp932': _('Japanese (cp932)'), + 'cp949': _('Korean (cp949)'), + 'cp950': _('Traditional Chinese (cp950)'), + 'cp1006': _('Urdu (cp1006)'), + 'cp1026': _('Turkish (cp1026)'), + 'cp1140': _('Western Europe (cp1140)'), + 'cp1250': _('Central and Eastern Europe (cp1250)'), + 'cp1251': _('Bulgarian, Byelorussian, Macedonian, Russian, Serbian (cp1251)'), + 'cp1252': _('Western Europe (cp1252)'), + 'cp1253': _('Greek (cp1253)'), + 'cp1254': _('Turkish (cp1254)'), + 'cp1255': _('Hebrew (cp1255)'), + 'cp1256': _('Arabic (cp1256)'), + 'cp1257': _('Baltic languages (cp1257)'), + 'cp1258': _('Vietnamese (cp1258)'), + 'euc_jp': _('Japanese (euc_jp)'), + 'euc_jis_2004': _('Japanese (euc_jis_2004)'), + 'euc_jisx0213': _('Japanese (euc_jisx0213)'), + 'euc_kr': _('Korean (euc_kr)'), + 'gb2312': _('Simplified Chinese (gb2312)'), + 'gbk': _('Unified Chinese (gbk)'), + 'gb18030': _('Unified Chinese (gb18030)'), + 'hz': _('Simplified Chinese (hz)'), + 'iso2022_jp': _('Japanese (iso2022_jp)'), + 'iso2022_jp_1': _('Japanese (iso2022_jp_1)'), + 'iso2022_jp_2': _('Japanese, Korean, Simplified Chinese, Western Europe, Greek (iso2022_jp_2)'), + 'iso2022_jp_2004': _('Japanese (iso2022_jp_2004)'), + 'iso2022_jp_3': _('Japanese (iso2022_jp_3)'), + 'iso2022_jp_ext': _('Japanese (iso2022_jp_ext)'), + 'iso2022_kr': _('Korean (iso2022_kr)'), + 'latin_1': _('West Europe (latin_1)'), + 'iso8859_2': _('Central and Eastern Europe (iso8859_2)'), + 'iso8859_3': _('Esperanto, Maltese (iso8859_3)'), + 'iso8859_4': _('Baltic languages (iso8859_4)'), + 'iso8859_5': _('Bulgarian, Byelorussian, Macedonian, Russian, Serbian (iso8859_5)'), + 'iso8859_6': _('Arabic (iso8859_6)'), + 'iso8859_7': _('Greek (iso8859_7)'), + 'iso8859_8': _('Hebrew (iso8859_8)'), + 'iso8859_9': _('Turkish (iso8859_9)'), + 'iso8859_10': _('Nordic languages (iso8859_10)'), + 'iso8859_13': _('Baltic languages (iso8859_13)'), + 'iso8859_14': _('Celtic languages (iso8859_14)'), + 'iso8859_15': _('Western Europe (iso8859_15)'), + 'iso8859_16': _('South-Eastern Europe (iso8859_16)'), + 'johab': _('Korean (johab)'), + 'koi8_r': _('Russian (koi8_r)'), + 'koi8_u': _('Ukrainian (koi8_u)'), + 'mac_cyrillic': _('Bulgarian, Byelorussian, Macedonian, Russian, Serbian (mac_cyrillic)'), + 'mac_greek': _('Greek (mac_greek)'), + 'mac_iceland': _('Icelandic (mac_iceland)'), + 'mac_latin2': _('Central and Eastern Europe (mac_latin2)'), + 'mac_roman': _('Western Europe (mac_roman)'), + 'mac_turkish': _('Turkish (mac_turkish)'), + 'ptcp154': _('Kazakh (ptcp154)'), + 'shift_jis': _('Japanese (shift_jis)'), + 'shift_jis_2004': _('Japanese (shift_jis_2004)'), + 'shift_jisx0213': _('Japanese (shift_jisx0213)'), + 'utf_32': _('all languages (utf_32)'), + 'utf_32_be': _('all languages (utf_32_be)'), + 'utf_32_le': _('all languages (utf_32_le)'), + 'utf_16': _('all languages (utf_16)'), + 'utf_16_be': _('all languages (BMP only - utf_16_be)'), + 'utf_16_le': _('all languages (BMP only - utf_16_le)'), + 'utf_7': _('all languages (utf_7)'), + 'utf_8': _('all languages (utf_8)'), + 'utf_8_sig': _('all languages (utf_8_sig)'), + } + + +class EncodingsVocabulary(SimpleVocabulary): + + classProvides(IVocabularyFactory) + + def __init__(self, terms, *interfaces): + request = queryRequest() + terms = [SimpleTerm(unicode(v), title=translate(t, context=request)) for v, t in ENCODINGS.iteritems()] + terms.sort(key=lambda x: x.title) + super(EncodingsVocabulary, self).__init__(terms, *interfaces) + + +class IEncodingField(IChoice): + """Encoding field interface""" + + +class EncodingField(Choice): + """Encoding field""" + + implements(IEncodingField) + + def __init__(self, values=None, vocabulary='ZTFY encodings', source=None, **kw): + if 'values' in kw: + del kw['values'] + if 'source' in kw: + del kw['source'] + kw['vocabulary'] = vocabulary + super(EncodingField, self).__init__(**kw)