
    Ri'                         d dl Z d dlmZmZ d dlmZmZmZmZ d dl	m
Z
mZmZmZ  e j                  e      ZdgZddgZ G d d	e      Zd
edee   dee   fdZd Zd Z G d de      Zy)    N)Enumauto)DictCallableIterableUnion)BibDatabaseCOMMON_STRINGSBibDataStringBibDataStringExpressionBibTexWriter	ENTRYTYPEIDc                   >    e Zd ZdZ e       Z	  e       Z	  e       Zy)SortingStrategyz
    Defines different strategies for sorting the entries not defined in :py:attr:`~.BibTexWriter.display_order` and that are added at the end.
    N)__name__
__module____qualname____doc__r   ALPHABETICAL_ASCALPHABETICAL_DESCPRESERVE     L/home/agent/.friday_env/lib/python3.12/site-packages/bibtexparser/bwriter.pyr   r      s3     v  vHr   r   strategyitemsreturnc                     | t         j                  k(  rt        |      S | t         j                  k(  rt	        t        |            S | t         j
                  k(  r|S t        d| j                   d      )z>
    Sorts the items based on the given sorting strategy.
    zThe strategy z is not implemented.)r   r   sortedr   reversedr   NotImplementedErrorname)r   r   s     r   _apply_sorting_strategyr$   (   se     ?333e}	_66	6u&&	_--	-!M(--@T"UVVr   c                 4    t               j                  |       S )z;
    Convenience function for backwards compatibility.
    )r   write)parseds    r   	to_bibtexr(   6   s     >''r   c                     t        | t              r2dj                  | j                  D cg c]  }t	        |       c}      S t        | t
              r| j                  S d| z   dz   S c c}w )Nz # {})
isinstancer   joinexpr_str_or_expr_to_bibtexr   r#   )ess     r   r/   r/   =   sX    !,-zzaffE1!4EFF	A}	%vvQw}	 Fs   A'c                   D    e Zd ZdZg dZddZd Zd Zd Zd Z	d Z
d	 Zy
)r   a  
    Writer to convert a :class:`BibDatabase` object to a string or file formatted as a BibTeX file.

    Example::

        from bibtexparser.bwriter import BibTexWriter

        bib_database = ...

        writer = BibTexWriter()
        writer.contents = ['comments', 'entries']
        writer.indent = '  '
        writer.order_entries_by = ('ENTRYTYPE', 'author', 'year')
        bibtex_str = bibtexparser.dumps(bib_database, writer)

    )entriescomments	preamblesstringsc                     g d| _         d| _        d| _        d| _        d| _        d| _        g | _        t        j                  | _	        d| _
        d| _        d| _        || _        y )N)r4   r5   r6   r3    F
)r   r   )contentsindentalign_valuesalign_multiline_valuesentry_separatororder_entries_bydisplay_orderr   r   display_order_sortingcomma_firstadd_trailing_comma_max_field_widthcommon_strings)selfwrite_common_stringss     r   __init__zBibTexWriter.__init__Z   ss    G /4 ',## (   7F6V6V" ! #( !2r   c                     d}| j                   D ]  }	 | t        | d|z   dz         |      z  }  |S # t        $ r2 t        j	                  dj                  || j                               Y ]w xY w)a  
        Converts a bibliographic database to a BibTeX-formatted string.

        :param bib_database: bibliographic database to be converted to a BibTeX string
        :type bib_database: BibDatabase
        :return: BibTeX-formatted string
        :rtype: str or unicode
         _
_to_bibtexzLBibTeX item '{}' does not exist and will not be written. Valid items are {}.)r:   getattrAttributeErrorloggerwarningformat_valid_contents)rF   bib_databasebibtexcontents       r   r&   zBibTexWriter.write~   s     }} 	GGGE'$g(DElSS	G  " Gm &w0D0D EGGs   28A-,A-c                      j                   rt        |j                   fd      }n|j                  } j                  du r;|D cg c]  }|D ]  }|t        vst        |        }}}t        |       _        n-t         j                        t        k(  r j                   _         j                  j                   fd|D              S c c}}w )Nc                 D    t        j                  | j                        S N)r	   entry_sort_keyr?   )xrF   s    r   <lambda>z1BibTexWriter._entries_to_bibtex.<locals>.<lambda>   s    A[A[\]_c_t_tAu r   )keyTc              3   @   K   | ]  }j                  |        y wrX   )_entry_to_bibtex).0entryrF   s     r   	<genexpr>z2BibTexWriter._entries_to_bibtex.<locals>.<genexpr>   s     ([%)>)>u)E([s   )r?   r    r3   r<   ENTRY_TO_BIBTEX_IGNORE_ENTRIESlenmaxrD   typeintr>   r-   )rF   rS   r3   r`   elewidthss   `     r   _entries_to_bibtexzBibTexWriter._entries_to_bibtex   s      \117uvG"**G$,3r5urSqHqc#hrhrFr$'KD!$##$+$($5$5D!##((([SZ([[[ ss   CCc           	      ,   d}|d|d   z   dz   |d   z   z  }| j                   D cg c]	  }||v s| }}|t        | j                  |      D cg c]  }|| j                   vs| c}z  }| j                  rd}nd}|D cg c]  }|t        vs| c}D ]  }t        t        |      | j                        }	 t        ||         }| j                  r5t        | j                        |z   }	|	dz  }	|j                  d	d	|	d
z  z         }||j                  | j                  |||      z  } | j                  r'| j                  r|d	| j                  z   dz   z  }n|dz  }|dz  }|S c c}w c c}w c c}w # t        $ r t        d|d|d   d      w xY w)NrJ   @r   r*   r   z+
{indent}, {field:<{field_max_w}} = {value}z*,
{indent}{field:<{field_max_w}} = {value}   r9   r8   )r;   fieldfield_max_wvaluez
The field z
 in entry z must be a string,z
}
)r@   r$   rA   rB   rb   rd   rc   rD   r/   r=   r;   replacerQ   	TypeErrorrC   )
rF   r`   rT   ir@   	field_fmtrm   max_field_widthro   value_indents
             r   r^   zBibTexWriter._entry_to_bibtex   s   #k**S05;>> %)$6$6Eq!u*EE%<T=W=WY^%_cdlpl~l~c~!GIFI!.ZA!;Y2YaZ 	8E!#e*d.C.CDO8.uU|<.. $'t{{#3o#EL E)L!MM$|c7I0IJE)**;; /	 + ! !%	84 ""$t{{*3..#'Q F [.  8#(%+!7 8 88s/   	E%E%E*"E* E/E/8A1E44Fc           	          dj                  |j                  D cg c]  }dj                  || j                          c}      S c c}w )NrJ   z@comment{{{0}}}
{1})r-   r4   rQ   r>   )rF   rS   comments      r   _comments_to_bibtexz BibTexWriter._comments_to_bibtex   sG    ww'3'<'<># /55gt?S?ST > ? 	? >   #Ac           	          dj                  |j                  D cg c]  }dj                  || j                          c}      S c c}w )NrJ   z@preamble{{"{0}"}}
{1})r-   r5   rQ   r>   )rF   rS   preambles      r   _preambles_to_bibtexz!BibTexWriter._preambles_to_bibtex   sL    ww(4(>(>@$ 2884CWCWX @ A 	A @rz   c                    dj                  |j                  j                         D cg c]L  \  }}| j                  s|t        vs|t        |   k7  r'dj                  |t        |      | j                        N c}}      S c c}}w )NrJ   z!@string{{{name} = {value}}}
{sep})r#   ro   sep)r-   r6   r   rE   r
   rQ   r/   r>   )rF   rS   r#   ro   s       r   _strings_to_bibtexzBibTexWriter._strings_to_bibtex   s    ww
  ,3399;	
 e##N*-- 288,U3(( 9 *	 	 		 	s   AB
N)F)r   r   r   r   rR   rH   r&   ri   r^   ry   r}   r   r   r   r   r   r   F   s6    " FO"3H&\"/b?A
r   )loggingenumr   r   typingr   r   r   r   bibtexparser.bibdatabaser	   r
   r   r   	getLoggerr   rO   __all__rb   r   strr$   r(   r/   objectr   r   r   r   <module>r      s      2 2? ?
 
		8	$
 #.t!4 d $Wo Whsm WPXY\P] W(_6 _r   