ó
¡V]c           @   s÷   d  Z  d Z d d l Z d d l Z d d l Z d d l m Z m Z m	 Z	 m
 Z
 d d l m Z d d l m Z d d l m Z d d l m Z d	 „  Z d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   s    
Directives for table elements.
t   reStructuredTextiÿÿÿÿN(   t   iot   nodest   statemachinet   utils(   t
   SafeString(   t   SystemMessagePropagation(   t	   Directive(   t
   directivesc         C   s   t  j |  d ƒ S(   Nt   leftt   centert   right(   R	   R
   R   (   R   t   choice(   t   argument(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   align   s    t   Tablec           B   s¦   e  Z d  Z d Z e Z i e j d 6e j d 6e	 d 6e j
 d 6e j d e j ƒ d 6Z e Z d	 „  Z d
 „  Z d „  Z d „  Z e d „  ƒ Z d „  Z d „  Z RS(   s#   
    Generic table base class.
    i   t   classt   nameR   t   widtht   autot   gridt   widthsc         C   sƒ   |  j  rm |  j  d } |  j j | |  j ƒ \ } } t j | d | Œ } |  j j |  j ƒ \ | _ | _	 n d  } g  } | | f S(   Ni    t    (   t	   argumentst   statet   inline_textt   linenoR   t   titlet   state_machinet   get_source_and_linet   sourcet   linet   None(   t   selft
   title_textt
   text_nodest   messagesR   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt
   make_title+   s    	$c         C   s   |  j  j |  j d ƒ } g  } d } d |  j k ru |  j |  j d j d ƒ |  j ƒ  | ƒ \ } } | j | ƒ n  | | f S(   Ni   i    t   headers   
(   R   t
   get_sourceR   t   optionst   parse_csv_data_into_rowst   splitt   HeaderDialectt   extend(   R!   R   t
   table_headt   max_header_colst   rows(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   process_header_option8   s    c         C   s×  t  | ƒ | k  rj |  j j j d | t  | ƒ |  j f t j |  j |  j ƒ d |  j ƒ} t	 | ƒ ‚ n  t  | ƒ | k o‡ d k n rá |  j j j d t  | ƒ |  j f t j |  j |  j ƒ d |  j ƒ} t	 | ƒ ‚ n  xï | D]ç } t  | ƒ | k  rX|  j j j d | t  | ƒ |  j f t j |  j |  j ƒ d |  j ƒ} t	 | ƒ ‚ n  t  | ƒ | k oud k n rè |  j j j d t  | ƒ |  j f t j |  j |  j ƒ d |  j ƒ} t	 | ƒ ‚ qè qè Wd  S(   NsP   %s header row(s) specified but only %s row(s) of data supplied ("%s" directive).R   i    se   Insufficient data supplied (%s row(s)); no data remaining for table body, required by "%s" directive.sU   %s stub column(s) specified but only %s columns(s) of data supplied ("%s" directive).si   Insufficient data supplied (%s columns(s)); no data remaining for table body, required by "%s" directive.(
   t   lenR   t   reportert   errorR   R   t   literal_blockt
   block_textR   R   (   R!   R/   t   header_rowst   stub_columnsR3   t   row(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   check_table_dimensionsC   s2    ""c         C   s,   d |  j  k r( |  j  j d ƒ | d <n  d  S(   NR   (   R(   t   get(   R!   t
   table_node(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   set_table_widthb   s    c         C   s   |  j  j d d ƒ S(   NR   R   (   R(   R:   (   R!   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyR   f   s    c         C   sâ   t  |  j ƒ t k r… t |  j ƒ | k ry |  j j j d |  j | f t j	 |  j
 |  j
 ƒ d |  j ƒ} t | ƒ ‚ n  |  j } nY | rŸ d | g | } n? |  j j j d t j	 |  j
 |  j
 ƒ d |  j ƒ} t | ƒ ‚ | S(   Ns=   "%s" widths do not match the number of columns in table (%s).R   id   s#   No table data detected in CSV file.(   t   typeR   t   listR1   R   R2   R3   R   R   R4   R5   R   R   (   R!   t   max_colsR3   t
   col_widths(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   get_column_widthsj   s    	c         C   se   x^ | D]V } xM | D]E } t  | ƒ | k  r | j d d d g  f g | t  | ƒ ƒ q q Wq Wd  S(   Ni    (   R1   R,   (   R!   t   columnst   partst   partR8   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt"   extend_short_rows_with_empty_cells|   s    (   R   R   (   t   __name__t
   __module__t   __doc__t   optional_argumentst   Truet   final_argument_whitespaceR   t   class_optiont	   unchangedR   t    length_or_percentage_or_unitlesst   value_ort   positive_int_listt   option_spect   has_contentR%   R0   R9   R<   t   propertyR   RA   RE   (    (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyR      s"   

						t   RSTTablec           B   s   e  Z d  „  Z RS(   c         C   s;  |  j  sJ |  j j j d |  j t j |  j |  j ƒ d |  j ƒ} | g S|  j	 ƒ  \ } } t j
 ƒ  } |  j j |  j  |  j | ƒ t | ƒ d k s­ t | d t j ƒ rî |  j j j d |  j t j |  j |  j ƒ d |  j ƒ} | g S| d } | d c |  j j d g  ƒ 7<|  j | ƒ d |  j k rL|  j j d ƒ | d <n  | d } t |  j ƒ t k rÆg  | j D] } | j d	 k ru| ^ qu}	 x- t |	 |  j ƒ D] \ }
 } | |
 d
 <q©Wn  |  j d k rë| d c d g 7<n |  j r
| d c d g 7<n  |  j | ƒ | r0| j d | ƒ n  | g | S(   Ns:   Content block expected for the "%s" directive; none found.R   i   i    sO   Error parsing content block for the "%s" directive: exactly one table expected.t   classesR   R   t   colspect   colwidthR   s   colwidths-autos   colwidths-given(   t   contentR   R2   t   warningR   R   R4   R5   R   R%   t   ElementR   t   nested_parset   content_offsetR1   t
   isinstancet   tableR3   R(   R:   R<   R=   R   R>   t   childrent   tagnamet   zipt   add_namet   insert(   R!   RY   R   R$   t   nodeR3   R;   t   tgroupt   childt   colspecsRV   t	   col_width(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   run…   sD    	)

	(   RF   RG   Ri   (    (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRT   ƒ   s   t   CSVTablec           B   sQ  e  Z i e j d  6e j d 6e j d 6e j d 6e j d e j ƒ d 6e j d 6e j	 d 6e j
 d 6e j d	 6e j d
 6e d 6e j d 6e j d 6e j d 6e j d 6Z d e j f d „  ƒ  YZ d e j f d „  ƒ  YZ d „  Z d „  Z d „  Z e j d k  rd „  Z d „  Z n d „  Z d „  Z e e ƒ Z e e ƒ Z d „  Z RS(   s   header-rowss   stub-columnsR&   R   R   R   t   filet   urlt   encodingR   R   R   t   delimt	   keepspacet   quotet   escapet   DocutilsDialectc           B   sD   e  Z d  Z d Z d Z e Z e Z e Z d Z	 e
 j Z d „  Z RS(   s&   CSV dialect for `csv_table` directive.t   ,t   "s   
c         C   s¤   d | k r% t  j | d ƒ |  _ n  d | k r= t |  _ n  d | k rb t  j | d ƒ |  _ n  d | k r t |  _ t  j | d ƒ |  _ n  t j	 j
 |  ƒ d  S(   NRn   Ro   Rp   Rq   (   Rj   t   encode_for_csvt	   delimitert   Falset   skipinitialspacet	   quotechart   doublequotet
   escapechart   csvt   Dialectt   __init__(   R!   R(   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyR~   Ð   s    	(   RF   RG   RH   Rv   Ry   RJ   Rz   Rx   t   strictt   lineterminatorR|   t   QUOTE_MINIMALt   quotingR~   (    (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRr   Ä   s   	R+   c           B   sA   e  Z d  Z d Z d Z d Z e Z e Z	 e Z
 d Z e j Z RS(   s0   CSV dialect to use for the "header" option data.Rs   Rt   s   \s   
(   RF   RG   RH   Rv   Ry   R{   Rw   Rz   RJ   Rx   R   R€   R|   R   R‚   (    (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyR+   Ý   s   c         C   s   d  S(   N(    (   R!   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   check_requirementsê   s    c         C   sÏ  yi|  j  j j j ru d |  j k s4 d |  j k ru |  j j j d |  j t	 j
 |  j |  j ƒ d |  j ƒ} | g S|  j ƒ  |  j ƒ  \ } } |  j ƒ  \ } } |  j ƒ  \ } } |  j | |  j |  j ƒ | ƒ \ } }	 t |	 | ƒ }	 |  j j d d ƒ }
 |  j j d d ƒ } |  j | |
 | ƒ | j | |
  ƒ | |
 } |  j |	 ƒ } |  j |	 | | f ƒ Wn« t k
 r‰} | j d g St j k
 r} t | ƒ } t j d k  rÏd	 | k rÏ| d
 7} n  |  j j j  d |  j | f t	 j
 |  j |  j ƒ d |  j ƒ} | g SX| | | f } |  j  j! | |  j" | d |  j# ƒ} | d c |  j j d g  ƒ 7<d |  j k r‘|  j j d ƒ | d <n  |  j$ | ƒ |  j% | ƒ | rÄ| j& d | ƒ n  | g | S(   NRk   Rl   s9   File and URL access deactivated; ignoring "%s" directive.R   s   header-rowsi    s   stub-columnsi   s   1-character strings1   
with Python 2.x this must be an ASCII character.s)   Error with CSV data in "%s" directive:
%sR   RU   R   R   (   i   ('   R   t   documentt   settingst   file_insertion_enabledR(   R   R2   RY   R   R   R4   R5   R   Rƒ   R%   t   get_csv_dataR0   R)   Rr   t   maxR:   R9   R,   RA   RE   R   t   argsR|   t   Errort   strt   syst   version_infoR3   t   build_tableR\   R   R<   Rb   Rc   (   R!   RY   R   R$   t   csv_dataR   R-   R.   R/   R?   R6   R7   t
   table_bodyR@   t   detailt   messageR3   R^   R;   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRi   í   s\    
!
	c      	   C   s˜  |  j  j d |  j j j j ƒ } |  j j j j } |  j rÁ d |  j  k sZ d |  j  k r£ |  j j	 j
 d |  j t j |  j |  j ƒ d |  j ƒ} t | ƒ ‚ n  |  j j d ƒ } |  j } nÍd |  j  k rAd |  j  k r(|  j j	 j
 d |  j t j |  j |  j ƒ d |  j ƒ} t | ƒ ‚ n  t j j t j j |  j j j ƒ ƒ } t j j t j j | |  j  d ƒ ƒ } t j d | ƒ } yM |  j j j j j | ƒ t j d | d | d	 | ƒ } | j  ƒ  j! ƒ  } WqŽt" k
 r=} |  j j	 j# d
 |  j t$ | ƒ f t j |  j |  j ƒ d |  j ƒ} t | ƒ ‚ qŽXnMd |  j  k rHd d l% }	 |  j  d } y |	 j& | ƒ j  ƒ  }
 Wn~ |	 j' t" t( t) f k
 r} |  j j	 j# d |  j |  j  d t$ | ƒ f t j |  j |  j ƒ d |  j ƒ} t | ƒ ‚ n Xt j* d |
 d | d | d	 |  j j j j ƒ } | j  ƒ  j! ƒ  } nF |  j j	 j+ d |  j t j |  j |  j ƒ d |  j ƒ} t | ƒ ‚ | | f S(   sr   
        Get CSV data from the directive content, from an external
        file, or from a URL reference.
        Rm   Rk   Rl   sF   "%s" directive may not both specify an external file and have content.R   i    sX   The "file" and "url" options may not be simultaneously specified for the "%s" directive.t   source_patht   error_handleru&   Problems with "%s" directive path:
%s.iÿÿÿÿNs*   Problems with "%s" directive URL "%s":
%s.R   s3   The "%s" directive requires content; none supplied.(,   R(   R:   R   R„   R…   t   input_encodingt   input_encoding_error_handlerRX   R   R2   R3   R   R   R4   R5   R   R   R   t   ost   patht   dirnamet   abspatht   current_sourcet   normpatht   joinR   t   relative_pathR    t   record_dependenciest   addR   t	   FileInputt   readt
   splitlinest   IOErrort   severeR   t   urllib2t   urlopent   URLErrort   OSErrort
   ValueErrort   StringInputRY   (   R!   Rm   R”   R3   R   R   t
   source_dirt   csv_fileR¥   R¦   t   csv_text(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyR‡     sx    					i   c         C   s   |  j  d ƒ S(   Ns   utf-8(   t   decode(   t   s(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   decode_from_csvi  s    c         C   s   |  j  d ƒ S(   Ns   utf-8(   t   encode(   R°   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRu   k  s    c         C   s   |  S(   N(    (   R°   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyR±   n  s    c         C   s   |  S(   N(    (   R°   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRu   p  s    c      	   C   sØ   t  j g  | D] } |  j | d ƒ ^ q d | ƒ} g  } d } xŠ | D]‚ } g  }	 xQ | D]I }
 |  j |
 ƒ } d d d t j | j ƒ  d | ƒf } |	 j | ƒ q[ W| j |	 ƒ t | t	 | ƒ ƒ } qH W| | f S(   Ns   
t   dialecti    R   (
   R|   t   readerRu   R±   R   t
   StringListR£   t   appendRˆ   R1   (   R!   R   R³   R   R   t
   csv_readerR/   R?   R8   t   row_datat   cellt	   cell_textt	   cell_data(    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyR)   u  s    	#	(   R   (   i   (   RF   RG   R   t   nonnegative_intRM   RN   RO   RP   R˜   t   uriRm   RL   R   t$   single_char_or_whitespace_or_unicodet   flagt   single_char_or_unicodeRQ   R|   R}   Rr   R+   Rƒ   Ri   R‡   RŒ   R   R±   Ru   t   staticmethodR)   (    (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRj   ­   s:   


	







		0	J			t	   ListTablec           B   s~   e  Z d  Z i e j d 6e j d 6e j d 6e j d e j ƒ d 6e j d 6e j	 d 6e
 d 6Z d	 „  Z d
 „  Z d „  Z RS(   s¼   
    Implement tables whose data is encoded as a uniform two-level bullet list.
    For further ideas, see
    http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables
    s   header-rowss   stub-columnsR   R   R   R   R   R   c         C   sÏ  |  j  sJ |  j j j d |  j t j |  j |  j ƒ d |  j ƒ} | g S|  j	 ƒ  \ } } t j
 ƒ  } |  j j |  j  |  j | ƒ y |  j | ƒ \ } } g  | d D]& } g  | d D] } | j ^ q¸ ^ q§ }	 |  j j d d ƒ }
 |  j j d d ƒ } |  j |	 |
 | ƒ Wn t k
 r1} | j d g SX|  j |	 | |
 | ƒ } d |  j k rr|  j j d ƒ | d <n  | d c |  j j d g  ƒ 7<|  j | ƒ |  j | ƒ | rÄ| j d | ƒ n  | g | S(	   Ns.   The "%s" directive is empty; content required.R   i    s   header-rowss   stub-columnsR   RU   R   (   RX   R   R2   R3   R   R   R4   R5   R   R%   RZ   R   R[   R\   t   check_list_contentR_   R(   R:   R9   R   R‰   t   build_table_from_listR<   Rb   Rc   (   R!   R3   R   R$   Rd   t   num_colsR@   t   row_listt   itemt
   table_dataR6   R7   R‘   R;   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRi   š  s8    	
4c         C   sÊ  t  | ƒ d k s) t | d t j ƒ rr |  j j j d |  j t j |  j	 |  j	 ƒ d |  j
 ƒ} t | ƒ ‚ n  | d } x2t t  | ƒ ƒ D]} | | } t  | ƒ d k sÈ t | d t j ƒ r|  j j j d |  j | d f t j |  j	 |  j	 ƒ d |  j
 ƒ} t | ƒ ‚ q | rt  | d ƒ | k r­|  j j j d |  j | d t  | d ƒ | f t j |  j	 |  j	 ƒ d |  j
 ƒ} t | ƒ ‚ q­q t  | d ƒ } q W|  j | ƒ } | | f S(   Ni   i    sU   Error parsing content block for the "%s" directive: exactly one bullet list expected.R   s‹   Error parsing content block for the "%s" directive: two-level bullet list expected, but row %s does not contain a second-level bullet list.s¥   Error parsing content block for the "%s" directive: uniform two-level bullet list expected, but row %s does not contain the same number of items as row 1 (%s vs %s).(   R1   R]   R   t   bullet_listR   R2   R3   R   R4   R5   R   R   t   rangeRA   (   R!   Rd   R3   t	   list_nodet
   item_indexRÇ   RÅ   R@   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRÃ   ¸  s6    )

)!c         C   s‘  t  j ƒ  } |  j d k r1 | d c d g 7<n |  j rP | d c d g 7<n  t  j d t | ƒ ƒ } | | 7} x` | D]X } t  j ƒ  } | d  k	 r§ | | j d <n  | rÇ d | j d <| d 8} n  | | 7} qy Wg  }	 xX | D]P }
 t  j ƒ  } x. |
 D]& } t  j	 ƒ  } | | 7} | | 7} qû W|	 j
 | ƒ qâ W| rft  j ƒ  } | j |	 |  ƒ | | 7} n  t  j ƒ  } | j |	 | ƒ | | 7} | S(	   NR   RU   s   colwidths-autos   colwidths-givent   colsRW   i   t   stub(   R   R^   R   Re   R1   RV   R    t
   attributesR8   t   entryR¶   t   theadR,   t   tbody(   R!   RÈ   R@   R6   R7   R^   Re   Rh   RV   R/   R8   t   row_nodeR¹   RÐ   RÑ   RÒ   (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRÄ   ß  s>    	


(   R   (   RF   RG   RH   R   R¼   RN   RO   RP   RL   RM   R   RQ   Ri   RÃ   RÄ   (    (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyRÂ   ‰  s   

	


		'(   RH   t   __docformat__RŒ   t   os.pathR—   R|   t   docutilsR   R   R   R   t   docutils.utils.error_reportingR   t   docutils.utilsR   t   docutils.parsers.rstR   R   R   R   RT   Rj   RÂ   (    (    (    sE   lib/python2.7/site-packages/docutils/parsers/rst/directives/tables.pyt   <module>   s   "	h*Ü