o
    MKd2&                     @   s.   d dl Z d dlZddlmZ G dd dZdS )    N   )utilsc                   @   sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )MdCodeGeneratorz+Generates documentation in Markdown format.c                 C   s   || _ |   d S )N)ifaces_generate_expand_dicts)selfr    r   )/usr/share/glib-2.0/codegen/codegen_md.py__init__   s   zMdCodeGenerator.__init__c                 C   s   g }| dD ]G}| }|dkr|d q| jD ]}||| j| }q| jD ]}||| j| }q)|rIt	ddd |}t	ddd |}|| qd
|S )z)Expands parameters and constant literals.
 z@[a-zA-Z0-9_]*c                 S      d|  ddd   d S N`r   r   groupmr   r   r	   <lambda>&       z)MdCodeGenerator._expand.<locals>.<lambda>z%[a-zA-Z0-9_]*c                 S   r   r   r   r   r   r   r	   r   ,   r   )splitstripappend_expand_member_dict_keysreplace_expand_member_dict_expand_iface_dict_keys_expand_iface_dictresubjoin)r   sexpandParamsAndConstantsreslinekeyr   r   r	   _expand   s.   



zMdCodeGenerator._expandc                 C   s  i | _ i | _| jD ]n}d|j }d|j d}|| j|< |jD ]}d|j|jf }d|j d|j d}|| j |< q |jD ]}d|j|jf }d|j d|j d}|| j |< q>|jD ]}d|j|jf }d|j d	|j d}|| j |< q\q	t| j  d
d| _	t| j d
d| _
dS )z9Generates the dictionaries used to expand gtk-doc sigils.#r   z`_z%s.%s().z#%s::%s::z#%s:%s:T)reverseN)r   r   r   namemethodssignals
propertiessortedkeysr   r   )r   ir%   valuer   r!   pr   r   r	   r   2   s2   






z&MdCodeGenerator._generate_expand_dictsc                 C   s   t |j}d|j dd|j dd|j ddd|j d| |jddg}|jr4|d|j d	dg7 }|jr=|d
dg7 }|dg7 }d|S )z2Generates the header and preamble of the document.zTitle: z D-Bus InterfacezSlug: r   z# z## DescriptionTzInterface available since: r(   z(*Warning*: This interface is deprecated.r   )	lenr,   doc_string_briefr   r&   
doc_stringsince
deprecatedr    )r   ifaceZ
header_lenr#   r   r   r	   _generate_headerS   s2   



z MdCodeGenerator._generate_headerc                 C   s   d| dg}d |S )z)Generates a section with the given title.### r   r   )r    )r   titler,   r#   r   r   r	   _generate_sectionp   s   
z!MdCodeGenerator._generate_sectionc                 C   s   g }|j D ]V}|j d|j }|jr|jrd}n|jrd}nd}|d| ddd|j d	| d	|j dd| |jd
dg7 }|jrM|d|j ddg7 }|jrV|ddg7 }|dg7 }qd	|S )z!Generates the properties section.r*   	readwritewritablereadabler<   r   ```     TzProperty available since: r(   z'*Warning*: This property is deprecated.r   )
r/   r,   rA   r@   	signaturer&   r7   r8   r9   r    )r   r:   r#   r4   r=   accessr   r   r	   _generate_propertiesx   s<   


z$MdCodeGenerator._generate_propertiesc                 C   s*  dg}t |j}t |j}|dkr |dkr |d|j dg7 }nk|d|j dg7 }t|jD ]*\}}||d krK|dkrK|d|j d|j g7 }q/|d|j d|j d	g7 }q/t|jD ]&\}}||d krw|d
|j d|j g7 }q_|d
|j d|j d	g7 }q_|dg7 }|dg7 }d|S )z/Generates the method signature as a code block.rB   r   rC    () (r   z	      IN rD   ,z
      OUT     )r   )r5   in_argsout_argsr,   	enumeraterE   r    )r   methodr#   Z	n_in_argsZ
n_out_argsidxargr   r   r	   _generate_method_signature   s@   



z*MdCodeGenerator._generate_method_signaturec              
   C   s   g }|j D ]Z}|j d|j }|d| d| |d| |jddg7 }|jD ]}| |jd}|d|j d| dg7 }q'|dg7 }|jrQ|d|j ddg7 }|jrZ|ddg7 }|dg7 }qd	|S )
zGenerates the methods section.r(   r<   r   Tz* z: zMethod available since: z%*Warning*: This method is deprecated.r   )	r-   r,   rR   r&   r7   rL   r8   r9   r    )r   r:   r#   r   r=   aarg_descr   r   r	   _generate_methods   s<   



z!MdCodeGenerator._generate_methodsc                 C   s   dg}t |j}|dkr|d|j dg7 }n;|d|j dg7 }t|jD ]&\}}||d kr>|d|j d|j g7 }q&|d|j d|j d	g7 }q&|d
g7 }|dg7 }d|S )zGenerates the signal signature.rB   r   rC   rH   rI   r   z      rD   rJ   rK   r   )r5   argsr,   rN   rE   r    )r   signalr#   Zn_argsrP   rQ   r   r   r	   _generate_signal_signature   s.   


z*MdCodeGenerator._generate_signal_signaturec              
   C   s   g }|j D ]Y}|j d|j }|d| d| |d| |jddg7 }|jD ]}| |jd}||j d| dg7 }q'|dg7 }|jrP|d|j ddg7 }|jrY|ddg7 }|dg7 }qd	|S )
zGenerates the signals section.r)   r<   r   Tz  zSignal available since: r(   z%*Warning*: This signal is deprecated.r   )	r.   r,   rX   r&   r7   rV   r8   r9   r    )r   r:   r#   r!   r=   rS   rT   r   r   r	   _generate_signals   s>   



z!MdCodeGenerator._generate_signalsc              	   C   s   | j D ]v}ttj|| d|j dd[}|| | t|j	dkr8|| 
d|j || | t|jdkrQ|| 
d|j || | t|jdkrj|| 
d|j || | W d   n1 stw   Y  qdS )	z/Generates the Markdown file for each interface.-z.mdwr   Z
PropertiesZMethodsSignalsN)r   openospathr    r,   writer;   r5   r/   r>   rG   r-   rU   r.   rY   )r   mdoutdirr2   outfiler   r   r	   generate!  s    
$zMdCodeGenerator.generateN)__name__
__module____qualname____doc__r
   r&   r   r;   r>   rG   rR   rU   rX   rY   rd   r   r   r   r	   r      s    !"'!"r   )r^   r   r   r   r   r   r   r   r	   <module>   s   