o
     ¢iX   ã                   @   s²   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
dd„ Zddd„Zdd	„ Zd
d„ Zddd„Zdd„ Zddd„Zdd„ Zddefdd„ZdS )é    Nc                 C   s   t  dt| ƒ¡S )Nz	https?://)ÚreÚmatchÚstr©Ús© r   ú>/home/ubuntu/.local/lib/python3.10/site-packages/csvw/utils.pyÚis_url   s   r	   FTc                    s„   |rˆt krt|t ƒrdd„ ‡ ‡fdd„|D ƒD ƒS |r"|d u r"|S t|ˆƒr6ˆtkr0t|tƒs6ˆ r@ˆ |ƒs@t d |¡¡ |S |S )Nc                 S   s   g | ]}|d ur|‘qS ©Nr   )Ú.0Úvr   r   r   Ú
<listcomp>   s    zconverter.<locals>.<listcomp>c                    s   g | ]
}t ˆd |ˆ d‘qS )N)Úcond)Ú	converter©r   Úss©r   Útype_r   r   r      s    zInvalid value for property: {})ÚlistÚ
isinstanceÚintÚboolÚwarningsÚwarnÚformat)r   Údefaultr   Ú
allow_noner   Ú
allow_listr   r   r   r      s   (r   c                 C   s(   t | tjƒst | tƒsJ ‚t | ¡S | S r
   )r   ÚpathlibÚPathr   )Úfnamer   r   r   Úensure_path   s   
r!   c                 C   s@   t  ¡ }t | ¡D ]}|j}t|tjƒr| ¡ }|||j< q	|S r
   )	ÚcollectionsÚOrderedDictÚattrÚfieldsr   r   ÚFactoryÚfactoryÚname)ÚclsÚresÚfieldr   r   r   r   Úattr_defaults&   s   r,   c                 C   sv   t | jƒ}t ¡ }t | j¡D ])}|r|j d¡s8t| |jƒ}|r(|||j ks8t	|dƒr3|j
dd}|||j< q|S )NÚ_ÚasdictT)Úomit_defaults)r,   Ú	__class__r"   r#   r$   r%   r(   Ú
startswithÚgetattrÚhasattrr.   )Úobjr/   Úomit_privateÚdefsr*   r+   Úvaluer   r   r   Úattr_asdict0   s   


€r8   c                 C   sn   |   dd¡  dd¡  dd¡} | tjv r| d S d dd„ |  d¡D ƒ¡} | s(d} | d tjd vr5d|  } | S )uß  Convert a string into a valid python attribute name.
    This function is called to convert ASCII strings to something that can pass as
    python attribute name, to be used with namedtuples.

    >>> str(normalize_name('class'))
    'class_'
    >>> str(normalize_name('a-name'))
    'a_name'
    >>> str(normalize_name('a nÃ¤me'))
    'a_name'
    >>> str(normalize_name('Name'))
    'Name'
    >>> str(normalize_name(''))
    '_'
    >>> str(normalize_name('1'))
    '_1'
    ú-r-   Ú.ú c                 s   s    | ]	}t |d dV  qdS )F)Ú	lowercaseN)Úslugr   r   r   r   Ú	<genexpr>R   s   € z!normalize_name.<locals>.<genexpr>r   )ÚreplaceÚkeywordÚkwlistÚjoinÚsplitÚstringÚascii_lettersr   r   r   r   Únormalize_name=   s   
rF   c                 C   s|   d  dd„ t d| ¡D ƒ¡}|r| ¡ }tjD ]}| |d¡}qt d|r'dnd|¡}| 	dd¡ 
d¡}t d	|¡s<J ‚|S )
uy   Condensed version of s, containing only lowercase alphanumeric characters.

    >>> str(slug('A B. Ã¤C'))
    'abac'
    Ú c                 s   s"    | ]}t  |¡d kr|V  qdS )ÚMnN)ÚunicodedataÚcategory)r   Úcr   r   r   r>   `   s   € ÿÿzslug.<locals>.<genexpr>ÚNFDz\s+r;   ÚasciiÚignorez[ A-Za-z0-9]*$)rB   rI   Ú	normalizeÚlowerrD   Úpunctuationr?   r   ÚsubÚencodeÚdecoder   )r   Úremove_whitespacer<   r*   rK   r   r   r   r=   Z   s   
r=   c                 C   sH   ddddddddœ  ¡ D ]\}}|  |d	 ¡r!|  |d	 |¡  S qd S )
Nzhttp://www.w3.org/ns/csvw#z+http://www.w3.org/1999/02/22-rdf-syntax-ns#z%http://www.w3.org/2000/01/rdf-schema#z!http://www.w3.org/2001/XMLSchema#zhttp://purl.org/dc/terms/zhttp://www.w3.org/ns/dcat#zhttp://www.w3.org/ns/prov#)ÚcsvwÚrdfÚrdfsÚxsdÚdcÚdcatÚprovú:)Úitemsr1   r?   )ÚqnameÚprefixÚurir   r   r   Ú	qname2urll   s   ù
ø	ÿ÷rb   Úreturnc           
   	      sŒ  ddd„‰d‡ ‡fdd„	‰ ‡ ‡fdd„}d	d
„ }d  | j dd¡¡g}| jr2|r2| d  | jj¡¡ | |dd„ | j ¡ D ƒƒ¡ | jD ]|}dd„ |jj	D ƒ}d  t
|jjƒ¡}|rr| jrr| jj |jj¡ ¡ rr|d  |jj¡7 }n||jj7 }| d| d ¡ | ||jƒ¡ | d¡}| ¡ rŸ| d  t | ¡ ¡¡¡ | d¡ | d¡ | d¡ |jjD ]}	| ||	||jjƒ¡ q²qDd |¡S )zû
    Render the metadata of a dataset as markdown.

    :param link_files: If True, links to data files will be added, assuming the markdown is stored     in the same directory as the metadata file.
    :return: `str` with markdown formatted text
    Fc                 S   s,   t | ƒ}|r|rd || ¡S d | |¡S | S )Nz<a href="{}">{}</a>ú[{}]({}))rb   r   )r_   ÚhtmlÚurlr   r   r   Ú
qname2link‚   s   z%metadata2markdown.<locals>.qname2linkNc              
      s†   t | tƒrd d ‡‡ fdd„| D ƒ¡¡S t | tƒr?g }|  ¡ D ]\}}| d ˆ|ddt t	|ƒ¡¡¡ q d d |¡¡S t	| ƒS )	zE
        For inclusion in tables we must use HTML for lists.
        z<ol>{}</ol>rG   c                 3   s"    | ]}d   ˆ |ˆd¡V  qdS )z<li>{}</li>©ÚkeyN©r   )r   Úitem)Úhtmlifyri   r   r   r>      s   €  z5metadata2markdown.<locals>.htmlify.<locals>.<genexpr>z<dt>{}</dt><dd>{}</dd>T)re   z<dl>{}</dl>)
r   r   r   rB   Údictr^   Úappendre   Úescaper   )r4   ri   r^   Úkr   ©rl   rg   rh   r   rl   Š   s   
ÿ
ÿz"metadata2markdown.<locals>.htmlifyc              
      sÊ   dd„ t  | ¡ ¡ D ƒ} g }|  dd ¡}|r| |d ¡ |  dd ¡}|r?t|tƒr.d|i}| d | d¡p8d	| d
¡¡¡ | r^| d¡ |  ¡ D ]\}}| d ˆ|ƒˆ ||d¡¡ qJd 	|¡d S )Nc                 S   s   i | ]	\}}|r||“qS r   r   ©r   rp   r   r   r   r   Ú
<dictcomp>š   s    z9metadata2markdown.<locals>.properties.<locals>.<dictcomp>údc:descriptionÚ
zhttps://schema.org/imageÚ
contentUrlz
![{}]({})
zhttps://schema.org/captionrG   zhttps://schema.org/contentUrlzproperty | value
 --- | ---z{} | {}rh   )
ÚcopyÚdeepcopyr^   Úpoprn   r   r   r   ÚgetrB   )Úpropsr*   ÚdescÚimgrp   r   rq   r   r   Ú
properties™   s$   
þ
 z%metadata2markdown.<locals>.propertiesc                 S   s€  d  | jr	| jjnd¡}| jrZ| jj r@t d| jj ¡r1|d7 }|d dd„ | jj  d¡D ƒ¡7 }n| jjdkr@|d	  | jj ¡7 }| jjrM|d
  | jj¡7 }| jjrZ|d  | jj¡7 }| j	rdd  || j	¡}| j
 dd¡ dd¡}|r‚| j|v r‚|r||d n|}|d7 }| j|v r©|r|d n|}|d  || j d || j d t|| j d ƒ¡7 }d | jr¶d  | j| j¡nd  | j¡||g¡S )Nz`{}`rD   z[\w\s]+(\|[\w\s]+)*z<br>Valid choices:<br>rG   c                 s   s    | ]}d   |¡V  qdS )z `{}`Nrj   )r   Úwr   r   r   r>   ²   s   € z4metadata2markdown.<locals>.colrow.<locals>.<genexpr>ú|z<br>Regex: `{}`z<br>&ge; {}z<br>&le; {}zlist of {} (separated by `{}`)rt   ru   r;   z<br>zPrimary keyzReferences [{}::{}](#table-{})é   r   z | rd   )r   ÚdatatypeÚbaser   Ú	fullmatchrB   rC   ÚminimumÚmaximumÚ	separatorÚcommon_propsrz   r?   r(   r=   ÚpropertyUrl)ÚcolÚfksÚpkÚdtr|   r   r   r   Úcolrow¬   s<   $
(ÿÿ
üz!metadata2markdown.<locals>.colrowz# {}
údc:titleÚDatasetz%> [!NOTE]
> Described by [{0}]({0}).
c                 S   s   i | ]\}}|d kr||“qS )r   r   rr   r   r   r   rs   Ñ   s    z%metadata2markdown.<locals>.<dictcomp>c                 S   s8   i | ]}t |jƒd kr|jd |jjd |jjjf“qS )r   r   )ÚlenÚcolumnReferenceÚ	referenceÚresourcerD   )r   Úfkr   r   r   rs   Ô   s    ÿz ## <a name="table-{}"></a>Table z[{0}]({0})
ru   Údialectz
**CSV dialect**: `{}`
z
### Columns
z&Name/Property | Datatype | Descriptionz --- | --- | --- ©Fr
   )r   rˆ   rz   Ú_fnamern   r(   r^   ÚtablesÚtableSchemaÚforeignKeysr=   rf   rD   ÚparentÚjoinpathÚexistsÚinheritr.   ÚjsonÚdumpsÚcolumnsÚ
primaryKeyrB   )
ÚtgÚ
link_filesr~   rŽ   r*   Útabler‹   Úheaderr–   rŠ   r   rq   r   Úmetadata2markdownz   s8   
!

þ 



ÿ
r¨   )FNT)TTr—   )r   rw   re   r    rD   r@   r   r   r"   rI   r$   r	   r   r!   r,   r8   rF   r=   rb   r   r¨   r   r   r   r   Ú<module>   s(    



