
    Q                     b    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ej                        Zy)	z5Cloud SDK markdown document man page format renderer.    )absolute_import)division)unicode_literals)rendererc                   |     e Zd ZdZdZdddZdZ fdZd Zd	 Z	d
 Z
d Zd ZddZd Zd ZddZddZd Z x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                 d    t        t        | 
  |i | d| _        d| _        d| _        d| _        y )NFr   )superr   __init___example_fill_level_th_emitted)selfargskwargs	__class__s      :lib/googlecloudsdk/core/document_renderers/man_renderer.pyr   zManRenderer.__init__)   s4    	+t%t6v6DMDJDKD    c                     | j                   r"d| _         | j                  j                  d       | j                  r#d| _        | j                  j                  d       yy)z/Flushes the current collection of Fill() lines.r   
F.RE
N)r   _outwriter   r   s    r   _FlushzManRenderer._Flush0   sC    zzdj
iiood}}dm
iioog r   c                 8     dj                   fd|D              S )zEscapes special characters in normal text.

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

    Returns:
      The escaped string.
     c              3   V   K   | ]   }j                   j                  ||       " y w)N)_ESCAPEget).0cr   s     r   	<genexpr>z%ManRenderer.Escape.<locals>.<genexpr>B   s#     73a4<<##Aq)3s   &))join)r   bufs   ` r   EscapezManRenderer.Escape9   s     7773777r   c                     | j                   s"d| _         | j                  j                  d       | j                  j                  |dz          y)zZDisplays line as an indented example.

    Args:
      line: The example line string.
    T.RS 2m
r   N)r   r   r   )r   lines     r   ExamplezManRenderer.ExampleD   s6     ==dm
iiooj!IIOOD4K r   c                 J   d}|j                         D ]  }t        |      }| j                  |z   |z   | j                  k\  rK| j                  j                  d       d| _        |d   dk(  r| j                  j                  d       d}nhd}ne| j                  r1| xj                  dz  c_        | j                  j                  d       n(|d   dk(  r| j                  j                  d       d}nd}| xj                  |z  c_        | j                  j                  |        y)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ns        r   FillzManRenderer.FillO   s     G


d)a	a'	!T[[	0		
7c>
))//$
''::

a
		7c>		
jjAoj
iiood' r   c                 ^    | j                  | j                         | j                  d       y)z'Finishes all output document rendering.outr   N)Fontr   Listr   s    r   FinishzManRenderer.Finishk   s    II$))IIIaLr   c                     || j                   r
d| _         d}n=d}n:d|z  }| xj                   |z  c_         | j                   |z  r| j                  |   nd}|r|r|j                  |dz          |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.
    r   z\fRr    r0   r   )_font	_FONT_TAGr   )r   attrr;   tagsmasks        r   r<   zManRenderer.Fontp   sm     |	
$Yd
jjDj&*jj4&7T^^D!fd
t	iitKr   c                    | j                          | j                  | j                         | j                  d       |dk(  r:|j	                  d      r)| j                  j                  d|dd z         d| _        y| j                  s3| j                  j                  d	| j                  xs d
z         d| _        | j                  j                  d|z         y)zsRenders a heading.

    Args:
      level: The heading level counting from 1.
      heading: The heading text.
    r:   r   r0   z(1)z
.TH "%s" 1
NTz
.TH "%s" ""
NOTESz

.SH "%s"
)r   r<   r   r=   endswithr   r   _title)r   levelheadings      r   HeadingzManRenderer.Heading   s     	KKMII$))IIIaLzg&&u-
iioo&"56d		)T[[-CGDE
iioonw./r   c                 Z    | j                          | j                  j                  d       y)z$Renders a paragraph separating line.r   N)r   r   r   r   s    r   LinezManRenderer.Line   s    KKMIIOODr   c                    | j                          d}| j                  r]| j                  |kD  rN| j                  j                  d       | xj                  dz  c_        d}| j                  r| j                  |kD  rN|r| j                  j                  d       |s|sy| j                  |k  r0| xj                  dz  c_        | j                  j                  d       |"| j                  j                  d|z   d	z          y| j                  j                  d
| j                  |dz
  t        | j                        z     z         y)zRenders 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   r0   Tz.sp
Nr+   z.TP 2m
r   z.IP "%s" 2m
)r   r   r   r   _BULLETr3   )r   rJ   
definitionendneed_sps        r   r=   zManRenderer.List   s     	KKMG
++$++-
iioog
kkQkg ++$++- 
iioog
%{{U
kkQk
iiooj!
iiooj:-45 iiooollEAIT\\1B#BCD Er   c                     | j                   j                  d       d}|D ]:  }|dv r|dz  }n|dv r|dz  }n	|dk(  r|rd}| j                   j                  |       < | j                   j                  d       y	)
zRenders 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[(r0   z)]r1   z\ r   N)r   r   )r   r,   is_synopsisnestr%   s        r   SynopsiszManRenderer.Synopsis   ss     	IIOOGD	
d	9	8
iiooa  	IIOODr   c                 4   | j                   j                  d       d}d}|j                  D ]y  }|d|j                  d   z   z  }|d|j                  d   z   z  }|j                  r<|dj                  |j                        z  }|dj                  |j                        z  }|dz  }{ |j                  r!| j                   j                  |dd d	z          | j                   j                  |dd d
z          | j                   j                  dj                  |j                  D cg c]  }|j                   c}      d	z          |D ]/  }| j                   j                  dj                  |      d	z          1 | j                   j                  d       yc c}w )zRenders 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    r1   r   z({})Br0   Nr   z.
	z.TE
)	r   r   columnsalignwidthformatrK   r'   label)r   tablerows	head_attr	data_attrcolumnr%   rows           r   TablezManRenderer.Table   sP    	IIOO'( II--3a((i3a((i	V]]6<<00	V]]6<<00	3i   }}
iiooimd*+IIOOIabME)*IIOODII>1qww>?$FG 
iioodiint+, 
 	IIOOG ?s   $F)NN)NF)F)__name__
__module____qualname____doc__rP   r"   rA   r   r   r)   r-   r8   r>   r<   rL   rN   r=   rW   rf   __classcell__)r   s   @r   r   r      s\    
 'u%'&)	8	!8
20&
E@*$r   r   N)	rj   
__future__r   r   r   &googlecloudsdk.core.document_renderersr   Rendererr    r   r   <module>rp      s*     < &  ' ;a(## ar   