a
    V$c                      @   s   d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlZd dlZd dlZdejv ZG dd dejZe ZG dd deZdddZdS )    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicodeNZRENPY_UPDATE_TRANSLATIONSc                       s0   e Zd ZdZdd Z fddZdd Z  ZS )	Formatterz
    A string formatter that uses Ren'Py's formatting rules. Ren'Py uses
    square brackets to introduce formatting, and it supports a q conversion
    that quotes the text being shown to the user.
    c                 c   s  d}d}d}d}d}d}d}d}	d}
d}|}|D ]}||krZ|dkrN|}q0n
||7 }q0q0||kr|dkrz||7 }|}q0n|}	|}d}q0q0||kr*|dkr|d7 }|	|7 }	q0nx|d	kr|r|d8 }|	|7 }	q0n$||	|
|fV  |}d}d}	d}
d}q0n2|d
kr|}q0n |dkr|}d}q0n
|	|7 }	q0q0||kr|d	krd||	|
|fV  |}d}d}	d}
d}q0n |dkrz|}d}q0n
|
|7 }
q0q0||kr0|d	kr||	|
|fV  |}d}d}	d}
d}q0q0||7 }q0q0||krt d||r|dddfV  dS )z
        Parses s according to Ren'Py string formatting rules. Returns a list
        of (literal_text, field_name, format, replacement) tuples, just like
        the method we're overriding.
        r                N[]:!z0String {0!r} ends with an open format operation.)	Exceptionformat)selfsLITERALOPEN_BRACKETVALUEFORMAT
CONVERSIONbracket_depthliteralvaluer   
conversionstatec r,   renpy/substitutions.pyparse,   s    








zFormatter.parsec                    s$   t t| |||\}}||f|fS N)superr   	get_field)r   
field_nameargskwargsobjarg_used	__class__r,   r-   r1      s    zFormatter.get_fieldc                 C   s@  |\}}|d u r|S |s t dt|td r8t dd|v rVt|}|dd}nd|v rrt|}|dd}|sz|S t|tst|}d|v rtj	|}d|v rz| 
|d	|}W n  ty   t d
|Y n0 d|v r|dd}d|v r| }d|v r| }d|v r<|r<|d  |dd   }|S )Nz$Conversion specifier can't be empty.z	rstqulci!zKUnknown symbols in conversion specifier, this must use only the "rstqulci".rr   r    tir,   z-Substitution {!r} refers to itself in a loop.q{z{{ulr+   r   r   )
ValueErrorsetreprreplacer   
isinstancer   renpytranslationtranslate_stringvformatRuntimeErrorr   upperlower)r   r(   r)   r4   r,   r,   r-   convert_field   sB    


zFormatter.convert_field)__name__
__module____qualname____doc__r.   r1   rL   __classcell__r,   r,   r7   r-   r   %   s   {r   c                   @   s   e Zd Zdd Zdd ZdS )MultipleDictc                 G   s
   || _ d S r/   )dicts)r   rS   r,   r,   r-   __init__   s    zMultipleDict.__init__c                 C   s2   | j D ]}||v r||   S qtd|d S )NzName '{}' is not defined.)rS   	NameErrorr   )r   keydr,   r,   r-   __getitem__   s    
zMultipleDict.__getitem__N)rM   rN   rO   rT   rX   r,   r,   r,   r-   rR      s   rR   FTc                 C   s   t | tst| } |r"tj| } tjjs6|s6| dfS d| vrF| dfS | }|durbt|tj	j
}ntj	j
}zt| d|} W n$ ty   tjjjrY dS  Y n0 | | |kfS )a  
    Performs translation and formatting on `s`, as necessary.

    `scope`
        The scope which is used in formatting, in addition to the default
        store.

    `force`
        Force substitution to occur, even if it's disabled in the config.

    `translate`
        Determines if translation occurs.

    Returns the substituted string, and a flag that is True if substitution
    occurred, or False if no substitution occurred.
    Fr   Nr,   ) T)rD   r   r   rE   rF   rG   confignew_substitutionsrR   store__dict__	formatterrH   r   displaypredict
predicting)r    scopeforce	translateold_sr4   r,   r,   r-   
substitute   s&    

rf   )NFT)
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   rE   stringosenvironupdate_translationsr   r^   objectrR   rf   r,   r,   r,   r-   <module>   s   8
 ;