ó
¦á­Qc           @   sß   d  Z  d d l Z d d l Z y d d l Z Wn e k
 rG d Z nR Xe j ƒ  d pe e j ƒ  d Z y e j	 e pz d ƒ Wn e
 k
 r˜ d Z n Xd e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d S(   sç  
Error reporting should be safe from encoding/decoding errors.
However, implicit conversions of strings and exceptions like

>>> u'%s world: %s' % ('Hällo', Exception(u'Hällo')

fail in some Python versions:

* In Python <= 2.6, ``unicode(<exception instance>)`` uses
  `__str__` and fails with non-ASCII chars in`unicode` arguments.
  (work around http://bugs.python.org/issue2517):

* In Python 2, unicode(<exception instance>) fails, with non-ASCII
  chars in arguments. (Use case: in some locales, the errstr
  argument of IOError contains non-ASCII chars.)

* In Python 2, str(<exception instance>) fails, with non-ASCII chars
  in `unicode` arguments.

The `SafeString`, `ErrorString` and `ErrorOutput` classes handle
common exceptions.
iÿÿÿÿNi   t    t
   SafeStringc           B   s2   e  Z d  Z d d d d „ Z d „  Z d „  Z RS(   sG   
    A wrapper providing robust conversion to `str` and `unicode`.
    t   backslashreplacet   replacec         C   sF   | |  _  | p* t | d d  ƒ p* t p* d |  _ | |  _ | |  _ d  S(   Nt   encodingt   ascii(   t   datat   getattrt   Nonet   locale_encodingR   t   encoding_errorst   decoding_errors(   t   selfR   R   R
   R   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyt   __init__?   s
    		c         C   sÈ   y t  |  j ƒ SWn° t k
 rÃ } t |  j t ƒ ry g  |  j j D]$ } t  t | |  j |  j ƒ ƒ ^ qB } d j	 | ƒ St |  j t
 ƒ r½ t j d k r¡ |  j S|  j j |  j |  j ƒ Sn  ‚  n Xd  S(   Ns   , i   i    (   i   i    (   t   strR   t   UnicodeEncodeErrort
   isinstancet	   Exceptiont   argsR   R   R
   t   joint   unicodet   syst   version_infot   encode(   R   t   errt   argR   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyt   __str__H   s    4c         C   s5  y> t  |  j ƒ } t |  j t ƒ r9 | j d d ƒ } n  | SWnð t k
 r0} t |  j t ƒ r© d |  j j t |  j j |  j	 |  j
 ƒ t |  j j |  j	 |  j
 ƒ f St |  j t ƒ rg  |  j j D]' } t  t | |  j	 d |  j
 ƒƒ ^ qÈ } d j | ƒ St | t ƒ r*t  |  j |  j	 |  j
 ƒ S‚  n Xd S(   sf  
        Return unicode representation of `self.data`.

        Try ``unicode(self.data)``, catch `UnicodeError` and

        * if `self.data` is an Exception instance, work around
          http://bugs.python.org/issue2517 with an emulation of
          Exception.__unicode__,

        * else decode with `self.encoding` and `self.decoding_errors`.
        s   : u's   : 'u   [Errno %s] %s: '%s'R   u   , N(   R   R   R   t   EnvironmentErrorR   t   UnicodeErrort   errnoR   t   strerrorR   R   t   filenameR   R   R   t   UnicodeDecodeError(   R   t   ut   errorR   R   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyt   __unicode__Y   s&    	7N(   t   __name__t
   __module__t   __doc__R   R   R   R#   (    (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR   :   s
   	t   ErrorStringc           B   s    e  Z d  Z d „  Z d „  Z RS(   s3   
    Safely report exception type and message.
    c         C   s&   d |  j  j j t t |  ƒ j ƒ  f S(   Ns   %s: %s(   R   t	   __class__R$   t   superR'   R   (   R   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR   ~   s    c         C   s&   d |  j  j j t t |  ƒ j ƒ  f S(   Nu   %s: %s(   R   R(   R$   R)   R'   R#   (   R   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR#   ‚   s    (   R$   R%   R&   R   R#   (    (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR'   z   s   	t   ErrorOutputc           B   s5   e  Z d  Z d d d d d „ Z d „  Z d „  Z RS(   s’   
    Wrapper class for file-like error streams with
    failsave de- and encoding of `str`, `bytes`, `unicode` and
    `Exception` instances.
    R   R   c         C   s¾   | d k r t j } n` | s' t } nQ t | t ƒ rH t | d ƒ } n0 t | t ƒ rx t | j t j	 ƒ  ƒ d ƒ } n  | |  _
 | p¢ t | d d ƒ p¢ t p¢ d |  _ | |  _ | |  _ d S(   s‘  
        :Parameters:
            - `stream`: a file-like object,
                        a string (path to a file),
                        `None` (write to `sys.stderr`, default), or
                        evaluating to `False` (write() requests are ignored).
            - `encoding`: `stream` text encoding. Guessed if None.
            - `encoding_errors`: how to treat encoding errors.
        t   wR   R   N(   R   R   t   stderrt   FalseR   R   t   openR   R   t   getfilesystemencodingt   streamR   R	   R   R
   R   (   R   R0   R   R
   R   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR   Ž   s    	!			c         C   sú   |  j  t k r d St | t ƒ rI t t | |  j |  j |  j ƒ ƒ } n  y |  j  j	 | ƒ Wn– t
 k
 r’ |  j  j	 | j |  j |  j ƒ ƒ nd t k
 rõ |  j  t j t j f k rÐ |  j  j j	 | ƒ qö |  j  j	 t | |  j |  j ƒ ƒ n Xd S(   s–   
        Write `data` to self.stream. Ignore, if self.stream is False.

        `data` can be a `string`, `unicode`, or `Exception` instance.
        N(   R0   R-   R   R   R   R   R   R
   R   t   writeR   R   t	   TypeErrorR   R,   t   stdoutt   buffer(   R   R   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR1   ±   s    %c         C   sH   |  j  t j t j f k r d Sy |  j  j ƒ  Wn t k
 rC n Xd S(   s‘   
        Close the error-output stream.

        Ignored if the stream is` sys.stderr` or `sys.stdout` or has no
        close() method.
        N(   R0   R   R3   R,   t   closet   AttributeError(   R   (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR5   Ç   s    N(   R$   R%   R&   R   R   R1   R5   (    (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyR*   ‡   s   !	(   R&   R   t   codecst   localet   ImportErrorR   R	   t	   getlocalet   getdefaultlocalet   lookupt   LookupErrort   objectR   R'   R*   (    (    (    sB   /usr/lib/python2.7/dist-packages/docutils/utils/error_reporting.pyt   <module>$   s   
 
@