o
    €ÏQ  ã                   @   sJ   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd„ dejƒZdS )	z5Cloud SDK markdown document man page format renderer.é    )Úabsolute_import)Údivision)Úunicode_literals)Úrendererc                       s   e Zd ZdZdZdddœZdZ‡ fdd„Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zd!dd„Zdd„ Zdd„ Zd"dd„Zd#dd„Zdd „ Z‡  ZS )$ÚManRenderera÷  Renders markdown to man(1) input.

  Attributes:
    _BULLET: A list of bullet characters indexed by list level modulo #bullets.
    _ESCAPE: Character element code string dict indexed by input character.
    _FONT_TAG: Font embellishment tag string list indexed by font attribute.
    _example: True if currently rendering an example.
    _fill: The number of characters in the current output line.
    _level: The section or list level counting from 0.
    _th_emitted: True if .TH already emitted.
  )z\(buz\(emz\ez\-)ú\ú-)z\fBz\fIz\f5c                    s2   t t| ƒj|i |¤Ž d| _d| _d| _d| _d S )NFr   )Úsuperr   Ú__init__Ú_exampleÚ_fillÚ_levelÚ_th_emitted)ÚselfÚargsÚkwargs©Ú	__class__© úP/tmp/google-cloud-sdk/lib/googlecloudsdk/core/document_renderers/man_renderer.pyr
   )   s
   
zManRenderer.__init__c                 C   s8   | j rd| _ | j d¡ | jrd| _| j d¡ dS dS )z/Flushes the current collection of Fill() lines.r   Ú
Fú.RE
N)r   Ú_outÚwriter   ©r   r   r   r   Ú_Flush0   s   þzManRenderer._Flushc                    s   d  ‡ fdd„|D ƒ¡S )z¢Escapes special characters in normal text.

    Args:
      buf: The normal text that may contain special characters.

    Returns:
      The escaped string.
    Ú c                 3   s    | ]
}ˆ j  ||¡V  qd S )N)Ú_ESCAPEÚget©Ú.0Úcr   r   r   Ú	<genexpr>B   s   € z%ManRenderer.Escape.<locals>.<genexpr>)Újoin)r   Úbufr   r   r   ÚEscape9   s   	zManRenderer.Escapec                 C   s,   | j sd| _ | j d¡ | j |d ¡ dS )zZDisplays line as an indented example.

    Args:
      line: The example line string.
    Tú.RS 2m
r   N)r   r   r   )r   Úliner   r   r   ÚExampleD   s   zManRenderer.Examplec                 C   sÆ   d}|  ¡ D ]Z}t|ƒ}| j| | | jkr1| j d¡ d| _|d dkr.| j d¡ d}n%d}n"| jrB|  jd7  _| j d¡ n|d dkrQ| j d¡ d}nd}|  j|7  _| j |¡ qdS )zrAdds a line to the output, splitting to stay within the output width.

    Args:
      line: The line string.
    r   r   ú'r   é   ú N)ÚsplitÚlenr   Ú_widthr   r   )r   r'   ÚescapesÚwordÚnr   r   r   ÚFillO   s(   ízManRenderer.Fillc                 C   s   | j | jd |  d¡ dS )z'Finishes all output document rendering.©Úoutr   N)ÚFontr   ÚListr   r   r   r   ÚFinishk   s   zManRenderer.FinishNc                 C   sh   |du r| j rd| _ d}nd}nd|> }|  j |N  _ | j |@ r%| j| nd}|r2|r2| |d ¡ |S )a$  Returns the font embellishment string for attr.

    Args:
      attr: None to reset to the default font, otherwise one of renderer.BOLD,
        renderer.ITALIC, or renderer.CODE.
      out: Writes tags line to this stream if not None.

    Returns:
      The font embellishment string.
    Nr   z\fRr   r*   r   )Ú_fontÚ	_FONT_TAGr   )r   Úattrr4   ÚtagsÚmaskr   r   r   r5   p   s   zManRenderer.Fontc                 C   sŠ   |   ¡  | j| jd |  d¡ |dkr*| d¡r*| j d|dd…  ¡ d| _dS | js;| j d	| jp5d
 ¡ d| _| j d| ¡ dS )zsRenders a heading.

    Args:
      level: The heading level counting from 1.
      heading: The heading text.
    r3   r   r*   z(1)z
.TH "%s" 1
NéýÿÿÿTz
.TH "%s" ""
ÚNOTESz

.SH "%s"
)r   r5   r   r6   Úendswithr   r   Ú_title)r   ÚlevelÚheadingr   r   r   ÚHeading‰   s   

zManRenderer.Headingc                 C   s   |   ¡  | j d¡ dS )z$Renders a paragraph separating line.r   N)r   r   r   r   r   r   r   ÚLineœ   s   zManRenderer.LineFc                 C   sÒ   |   ¡  d}| jr%| j|kr%| j d¡ |  jd8  _d}| jr%| j|ks|r-| j d¡ |s1|s3dS | j|k rE|  jd7  _| j d¡ |durU| j d| d	 ¡ dS | j d
| j|d t| jƒ   ¡ dS )zõRenders a bullet or definition markdown list item.

    Args:
      level: The markdown list nesting level.
      definition: Bullet markdown list if None, definition markdown list
        otherwise.
      end: End of markdown list if True.
    Fr   r*   Tz.sp
Nr&   z.TP 2m
r   z.IP "%s" 2m
)r   r   r   r   Ú_BULLETr-   )r   rA   Ú
definitionÚendÚneed_spr   r   r   r6   ¡   s&   	ý

ÿzManRenderer.Listc                 C   sj   | j  d¡ d}|D ]"}|dv r|d7 }n|dv r|d8 }n|dkr&|r&d}| j  |¡ q
| j  d¡ d	S )
zÉRenders NAME and SYNOPSIS lines as a hanging indent.

    Does not split top-level [...] or (...) groups.

    Args:
      line: The synopsis text.
      is_synopsis: if it is the synopsis section
    z.HP
r   z[(r*   z)]r+   z\ r   N)r   r   )r   r'   Úis_synopsisÚnestr!   r   r   r   ÚSynopsisÁ   s   	

zManRenderer.Synopsisc                 C   sú   | j  d¡ d}d}|jD ]+}|d|jd  7 }|d|jd  7 }|jr4|d |j¡7 }|d |j¡7 }|d7 }q|jrH| j  |dd… d	 ¡ | j  |dd… d
 ¡ | j  d dd„ |jD ƒ¡d	 ¡ |D ]}| j  d |¡d	 ¡ qg| j  d¡ dS )z¶Renders a table.

    Nested tables are not supported.

    Args:
      table: renderer.TableAttributes object.
      rows: A list of rows, each row is a list of column strings.
    z
.TS
tab(	);
r   r+   r   z({})ÚBr*   Nr   z.
ú	c                 S   s   g | ]}|j ‘qS r   )Úlabelr   r   r   r   Ú
<listcomp>ñ   s    z%ManRenderer.Table.<locals>.<listcomp>z.TE
)r   r   ÚcolumnsÚalignÚwidthÚformatrB   r#   )r   ÚtableÚrowsÚ	head_attrÚ	data_attrÚcolumnÚrowr   r   r   ÚTableÖ   s"   

"zManRenderer.Table)NN)NF)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   r   r9   r
   r   r%   r(   r2   r7   r5   rC   rD   r6   rK   rZ   Ú__classcell__r   r   r   r   r      s"    
	


 r   N)	r^   Ú
__future__r   r   r   Ú&googlecloudsdk.core.document_renderersr   ÚRendererr   r   r   r   r   Ú<module>   s   