U
    e &                     @   s   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 eZdgZddgZG dd	 d	eZeee ee d
ddZdd Zdd ZG dd deZdS )    N)Enumauto)DictCallableIterableUnion)BibDatabaseCOMMON_STRINGSBibDataStringBibDataStringExpressionBibTexWriter	ENTRYTYPEIDc                   @   s"   e Zd ZdZe Ze Ze ZdS )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 r   r   r/mounts/lovelace/software/anaconda3/envs/qiime2-shotgun-2023.9/lib/python3.8/site-packages/bibtexparser/bwriter.pyr      s
   r   )strategyitemsreturnc                 C   sL   | t jkrt|S | t jkr(tt|S | t jkr6|S td| j ddS )z>
    Sorts the items based on the given sorting strategy.
    zThe strategy z is not implemented.N)r   r   sortedr   reversedr   NotImplementedErrorname)r   r   r   r   r   _apply_sorting_strategy(   s    


r    c                 C   s   t  | S )z;
    Convenience function for backwards compatibility.
    )r   write)parsedr   r   r   	to_bibtex6   s    r#   c                 C   s@   t | tr ddd | jD S t | tr0| jS d|  d S d S )Nz # c                 S   s   g | ]}t |qS r   )_str_or_expr_to_bibtex).0sr   r   r   
<listcomp>?   s     z*_str_or_expr_to_bibtex.<locals>.<listcomp>{})
isinstancer   joinexprr
   r   )er   r   r   r$   =   s
    

r$   c                   @   sV   e Zd ZdZddddgZdddZd	d
 Zdd Zdd Zdd Z	dd Z
dd ZdS )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stringsFc                 C   sV   ddddg| _ d| _d| _d| _d| _d| _g | _tj| _	d| _
d| _d	| _|| _d S )
Nr/   r0   r1   r.    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)selfZwrite_common_stringsr   r   r   __init__Z   s    zBibTexWriter.__init__c              
   C   s\   d}| j D ]L}z|t| d| d |7 }W q
 tk
rT   td|| j Y q
X q
|S )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
         _Z
_to_bibtexzLBibTeX item '{}' does not exist and will not be written. Valid items are {}.)r4   getattrAttributeErrorloggerwarningformat_valid_contents)r@   bib_databasebibtexcontentr   r   r   r!   ~   s    	
 zBibTexWriter.writec                    sx    j rt|j fddd}n|j} jdkrHdd |D }t| _nt jtkr^ j _ j	 fdd|D S )	Nc                    s   t |  jS N)r   entry_sort_keyr9   )xr@   r   r   <lambda>       z1BibTexWriter._entries_to_bibtex.<locals>.<lambda>)keyTc                 S   s&   g | ]}|D ]}|t krt|qqS r   )ENTRY_TO_BIBTEX_IGNORE_ENTRIESlen)r%   entryZeler   r   r   r'      s
        z3BibTexWriter._entries_to_bibtex.<locals>.<listcomp>c                 3   s   | ]}  |V  qd S rM   )_entry_to_bibtex)r%   rV   rP   r   r   	<genexpr>   s     z2BibTexWriter._entries_to_bibtex.<locals>.<genexpr>)
r9   r   r.   r6   maxr>   typeintr8   r+   )r@   rJ   r.   widthsr   rP   r   _entries_to_bibtex   s    
zBibTexWriter._entries_to_bibtexc           	   	      sB  d}|d d  d  d  7 } fddj D }|fddtj D 7 }jr^d	}nd
}dd |D D ]}tt|j}zXt | }jrtj	| }|d7 }|
dd|d  }||jj	|||d7 }W qp tk
r   td| d f Y qpX qpjr6jr.|dj	 d 7 }n|d7 }|d7 }|S )NrB   @r   r(   r   c                    s   g | ]}| kr|qS r   r   r%   i)rV   r   r   r'      s      z1BibTexWriter._entry_to_bibtex.<locals>.<listcomp>c                    s   g | ]}| j kr|qS r   )r:   r_   rP   r   r   r'      s     
 z+
{indent}, {field:<{field_max_w}} = {value}z*,
{indent}{field:<{field_max_w}} = {value}c                 S   s   g | ]}|t kr|qS r   )rT   r_   r   r   r   r'      s         r3   r2   )r5   fieldZfield_max_wvaluez)The field %s in entry %s must be a string,z
}
)r:   r    r;   r<   rY   rU   r>   r$   r7   r5   replacerH   	TypeErrorr=   )	r@   rV   rK   r:   Z	field_fmtrb   Zmax_field_widthrc   Zvalue_indentr   )rV   r@   r   rW      s>    
zBibTexWriter._entry_to_bibtexc                    s   d  fdd|jD S )NrB   c                    s   g | ]}d  | jqS )z@comment{{{0}}}
{1}rH   r8   )r%   commentrP   r   r   r'      s   z4BibTexWriter._comments_to_bibtex.<locals>.<listcomp>)r+   r/   r@   rJ   r   rP   r   _comments_to_bibtex   s    z BibTexWriter._comments_to_bibtexc                    s   d  fdd|jD S )NrB   c                    s   g | ]}d  | jqS )z@preamble{{"{0}"}}
{1}rg   )r%   preamblerP   r   r   r'      s   z5BibTexWriter._preambles_to_bibtex.<locals>.<listcomp>)r+   r0   ri   r   rP   r   _preambles_to_bibtex   s    z!BibTexWriter._preambles_to_bibtexc                    s   d  fdd|j D S )NrB   c                    s@   g | ]8\}} j s&|tks&|t| krd j|t| jdqS )z!@string{{{name} = {value}}}
{sep})r   rc   sep)r?   r	   rH   r$   r8   )r%   r   rc   rP   r   r   r'      s   z3BibTexWriter._strings_to_bibtex.<locals>.<listcomp>)r+   r1   r   ri   r   rP   r   _strings_to_bibtex   s    zBibTexWriter._strings_to_bibtexN)F)r   r   r   r   rI   rA   r!   r]   rW   rj   rl   rn   r   r   r   r   r   F   s   
$1)loggingenumr   r   typingr   r   r   r   Zbibtexparser.bibdatabaser   r	   r
   r   	getLoggerr   rF   __all__rT   r   strr    r#   r$   objectr   r   r   r   r   <module>   s   
	