
    i82                     z    d dl Z d dlZd dlZddlmZmZ dZdZdZdZ	dZ
 G d	 d
e      Z G d de      Z e       Zy)    N   )ImproperlyConfiguredInvalidRegistryItemTypeztransliterate.basezArtur Barseghyanz2013-2018 Artur BarseghyanzGPL 2.0/LGPL 2.1)registryTranslitLanguagePackc                        e Zd ZdZdZdZdZdZdZg Z	dZ
g ZdZg ZdZdZdZ fdZ	 	 ddZddZddZed        Zedd	       Zedd
       Z xZS )r   uo
  Base language pack.

    The attributes below shall be defined in every language pack.

    ``language_code``: Language code (obligatory). Example value: 'hy', 'ru'.
    ``language_name``: Language name (obligatory). Example value: 'Armenian',
        'Russian'.
    ``character_ranges``: Character ranges that are specific to the language.
        When making a pack, check `this
        <http://en.wikipedia.org/wiki/List_of_Unicode_characters>`_ page for
        the ranges.
    ``mapping``: Mapping  (obligatory). A tuple, consisting of two strings
        (source and target). Example value: (u'abc', u'աբց').
    ``reversed_specific_mapping``: Specific mapping (one direction only) used
        when transliterating from target script to source script (reversed
        transliteration).
    ՝՝pre_processor_mapping՝՝: Pre processor mapping (optional). A dictionary
        mapping for letters that can't be represented by a single latin letter.
    ՝՝reversed_specific_pre_processor_mapping՝՝: Pre processor mapping (
        optional). A dictionary mapping for letters that can't be represented
        by a single latin letter (reversed transliteration).

    :example:
>>>    class ArmenianLanguagePack(TranslitLanguagePack):
>>>    language_code = "hy"
>>>    language_name = "Armenian"
>>>    character_ranges = ((0x0530, 0x058F), (0xFB10, 0xFB1F))
>>>    mapping = (
>>>        u"abgdezilxkhmjnpsvtrcq&ofABGDEZILXKHMJNPSVTRCQOF", # Source script
>>>        u"աբգդեզիլխկհմյնպսվտրցքևօֆԱԲԳԴԵԶԻԼԽԿՀՄՅՆՊՍՎՏՐՑՔՕՖ", # Target script
>>>    )
>>>    reversed_specific_mapping = (
>>>        u"ռՌ",
>>>        u"rR"
>>>    )
>>>    pre_processor_mapping = {
>>>        # lowercase
>>>        u"e'": u"է",
>>>        u"y": u"ը",
>>>        u"th": u"թ",
>>>        u"jh": u"ժ",
>>>        u"ts": u"ծ",
>>>        u"dz": u"ձ",
>>>        u"gh": u"ղ",
>>>        u"tch": u"ճ",
>>>        u"sh": u"շ",
>>>        u"vo": u"ո",
>>>        u"ch": u"չ",
>>>        u"dj": u"ջ",
>>>        u"ph": u"փ",
>>>        u"u": u"ու",
>>>
>>>        # uppercase
>>>        u"E'": u"Է",
>>>        u"Y": u"Ը",
>>>        u"Th": u"Թ",
>>>        u"Jh": u"Ժ",
>>>        u"Ts": u"Ծ",
>>>        u"Dz": u"Ձ",
>>>        u"Gh": u"Ղ",
>>>        u"Tch": u"Ճ",
>>>        u"Sh": u"Շ",
>>>        u"Vo": u"Ո",
>>>        u"Ch": u"Չ",
>>>        u"Dj": u"Ջ",
>>>        u"Ph": u"Փ",
>>>        u"U": u"Ու"
>>>    }
>>>    reversed_specific_pre_processor_mapping = {
>>>        u"ու": u"u",
>>>        u"Ու": u"U"
>>>    }
    Note, that in Python 3 you won't be using u prefix before the strings.
    NFc                 Z   	 | j                   J | j                  J | j                  sJ 	 t
        t        |           i | _        t        | j                   D ]4  \  }}| j                  j                  t        |      t        |      i       6 t        t        | j                  j                         | j                  j                                     | _        | j                   rt        t        | j                   j                         | j                   j                                     | _        | j                   j                         | _        | j                   j                         | _        nd | _        | j(                  rPi | _        t        | j(                   D ]4  \  }}| j*                  j                  t        |      t        |      i       6 | j,                  r| j,                  j                         | _        d| _        | j2                  8dj5                  dj7                  t9        | j2                                    | _        d| _        | j<                  9dj5                  dj7                  t9        | j2                                    | _        y y # t        $ r t	        d      w xY w)NzYou should define ``language_code``, ``language_name`` and ``mapping`` properties in your subclassed ``TranslitLanguagePack`` class.z[^]z[^{0}]\)language_codelanguage_namemappingAssertionErrorr   superr   __init__translation_tablezipupdateorddictvalueskeysreversed_translation_tablepre_processor_mappingreversed_pre_processor_mappingpre_processor_mapping_keys#reversed_pre_processor_mapping_keysreversed_specific_mapping#reversed_specific_translation_table'reversed_specific_pre_processor_mapping,reversed_specific_pre_processor_mapping_keys_characters
charactersformatjoinlist_reversed_charactersreversed_characters)selfkeyval	__class__s      n/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/venv/lib/python3.12/site-packages/transliterate/base.pyr   zTranslitLanguagePack.__init__u   s`   		%%111%%111<<< 	"D24 "$T\\* 	@HC""))3s8SX*>?	@ +/&&--/1G1G1L1L1NO+
'
 %%26..557..33573D/
 /3.H.H.M.M.OD+**113 4 37D/))79D4!?!?@ S88??Xs3x(
 77<<AAC = !??&'		$t/0 D %*!##/		$t*? @A % 0k  	&2 	s   *J J*c                    t         j                  st        |      }|r| j                  r|j	                  | j
                        }| j                  r0| j                  D ]!  }|j                  || j                  |         }# | j                  r0| j                  D ]!  }|j                  || j                  |         }# |j	                  | j                        S | j                  r0| j                  D ]!  }|j                  || j                  |         }# |j	                  | j                        }|r| j                  |||      }|S )zTransliterate the given value according to the rules.

        Rules are set in the transliteration pack.

        :param str value:
        :param bool reversed:
        :param bool strict:
        :param bool fail_silently:
        :return str:
        )valuereversedfail_silently)sixPY3unicoder   	translater   r   r    replacer   r   r   r   r   r   _make_strict)r(   r.   r/   strictr0   ruleress          r,   translitzTranslitLanguagePack.translit   sC    wwENE--<< ;; MM D!MMDDTJE 22 DD D!MM;;DAE ??4#B#BCC%%77 NdD,F,Ft,LMNood445###-52? $ AC 
    c                 `    	 | j                  ||      S # t        $ r}|r|cY d}~S |d}~ww xY w)zStrip out unnecessary characters from the string.

        :param string value:
        :param bool reversed:
        :param bool fail_silently:
        :return string:
        N)make_strict	Exception)r(   r.   r/   r0   errs        r,   r6   z!TranslitLanguagePack._make_strict   s7    	##E844 				s    	-(-(-c                     |r2| j                   r#t        j                  | j                  d|      }|S 	 |S | j                  r#t        j                  | j
                  d|      }|S 	 |S )zStrip out unnecessary characters from the string.

        :param string value:
        :param bool reversed:
        :return string:
         )r'   resubr&   r"   r!   )r(   r.   r/   s      r,   r=   z TranslitLanguagePack.make_strict   sm     ''t88"eD    t//U;
  r;   c                     | j                   rIt        j                  d|      }t        |      }| j                   D ]  }|d   }|d   }||k\  s||k  s y y)zVCheck if given character belongs to the language pack.

        :return bool:
        NFCr   r   TF)character_rangesunicodedata	normalizer   )cls	characterchar_numcharacter_rangerange_lowerrange_uppers         r,   containszTranslitLanguagePack.contains  sh     ",,UI>H8}H#&#7#7  -a0-a0{*x;/F	 
 r;   c                      y)zSuggest possible variants (some sort of auto-complete).

        :param str value:
        :param int limit: Limit number of suggested variants.
        :return list:
        N )r.   r/   limits      r,   suggestzTranslitLanguagePack.suggest      r;   c                      y)a\  Detect the language.

        Heavy language detection, which is activated for languages that are
        harder detect (like Russian Cyrillic and Ukrainian Cyrillic).

        :param unicode value: Input string.
        :param int num_words: Number of words to base decision on.
        :return bool: True if detected and False otherwise.
        NrQ   )text	num_wordss     r,   detectzTranslitLanguagePack.detect(  rT   r;   )FFT)FTF)FNN)__name__
__module____qualname____doc__r   r   rF   r   r   r   r   r    r   r   
detectabler"   r'   r   r:   r6   r=   classmethodrO   rS   rX   __classcell__)r+   s   @r,   r   r      s    IV MMG $*,'.2+350 !#JJ<B| 6;#1f 0     	 	r;   r   c                   <    e Zd ZdZd Zed        ZddZd Zd	dZ	y)
TranslitRegistryzLanguage pack registry.c                      i | _         g | _        y rZ   )	_registry_forcedr(   s    r,   r   zTranslitRegistry.__init__9  s    r;   c                     | j                   S )z	Registry.)re   rg   s    r,   r   zTranslitRegistry.registry=  s     ~~r;   c                 j   t        |t              st        d|| j                        |rX|j                  | j
                  vr?|| j                  |j                  <   | j
                  j                  |j                         yy|j                  | j                  v ry|| j                  |j                  <   y)a^  Register the language pack in the registry.

        :param transliterate.base.LanguagePack cls: Subclass of
            ``transliterate.base.LanguagePack``.
        :param bool force: If set to True, item stays forced. It's not possible
            to un-register a forced item.
        :return bool: True if registered and False otherwise.
        (Invalid item type `%s` for registry `%s`TF)
issubclassr   r   r+   r   rf   re   append)r(   rI   forces      r,   registerzTranslitRegistry.registerB  s     #34):    447s001##C$5$56   DNN247s001r;   c                     t        |t              st        d|| j                        |j                  | j
                  v r>|j                  | j                  vr&| j
                  j                  |j                         yy)zUn-registers an item from registry.

        :param transliterate.base.LanguagePack cls: Subclass of
            ``transliterate.base.LanguagePack``.
        :return bool: True if unregistered and False otherwise.
        rj   TF)rk   r   r   r+   r   re   rf   pop)r(   rI   s     r,   
unregisterzTranslitRegistry.unregistere  sm     #34):  .%%T\\9NNs001r;   Nc                 :    | j                   j                  ||      S )zGet the given language pack from the registry.

        :param str language_code:
        :return transliterate.base.LanguagePack: Subclass of
            ``transliterate.base.LanguagePack``.
        )re   get)r(   r   defaults      r,   rs   zTranslitRegistry.get|  s     ~~!!-99r;   rY   rZ   )
r[   r\   r]   r^   r   propertyr   rn   rq   rs   rQ   r;   r,   rc   rc   6  s.    !  !F.:r;   rc   )rB   rG   r1   
exceptionsr   r   	__title__
__author____copyright____license____all__objectr   rc   r   rQ   r;   r,   <module>r}      sZ    
  

 !	
, [6 [~M:v M:b r;   