ZeZc@sdZddlZddlZyddlZWnek rGdZnRXejdpeejdZyej epzdWne k rdZnXde fdYZ de fdYZ d e fd YZdS( s Error reporting should be safe from encoding/decoding errors. However, implicit conversions of strings and exceptions like >>> u'%s world: %s' % ('Hllo', Exception(u'Hllo') fail in some Python versions: * In Python <= 2.6, ``unicode()`` uses `__str__` and fails with non-ASCII chars in`unicode` arguments. (work around http://bugs.python.org/issue2517): * In Python 2, unicode() 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() fails, with non-ASCII chars in `unicode` arguments. The `SafeString`, `ErrorString` and `ErrorOutput` classes handle common exceptions. iNitt SafeStringcBs2eZdZddddZdZdZRS(sG A wrapper providing robust conversion to `str` and `unicode`. tbackslashreplacetreplacecCsF||_|p*t|ddp*tp*d|_||_||_dS(Ntencodingtascii(tdatatgetattrtNonetlocale_encodingRtencoding_errorstdecoding_errors(tselfRRR R ((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyt__init__>s   cCsyt|jSWntk r}t|jtryg|jjD]$}tt||j|j^qB}dj |St|jt rt j dkr|jS|jj |j|jSnnXdS(Ns, ii(ii(tstrRtUnicodeEncodeErrort isinstancet ExceptiontargsRRR tjointunicodetsyst version_infotencode(R terrtargR((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyt__str__Gs4  cCs5y>t|j}t|jtr9|jdd}n|SWntk r0}t|jtrd|jjt|jj|j |j t|jj |j |j fSt|jt rg|jj D]'}tt||j d|j ^q}dj|St|tr*t|j|j |j SnXdS(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(RRRtEnvironmentErrorRt UnicodeErrorterrnoRtstrerrorRR tfilenameRRRtUnicodeDecodeError(R tuterrorRR((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyt __unicode__Xs&   7 N(t__name__t __module__t__doc__RR RR#(((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR9s   t ErrorStringcBs eZdZdZdZRS(s3 Safely report exception type and message. cCs&d|jjjtt|jfS(Ns%s: %s(Rt __class__R$tsuperR'R(R ((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR}scCs&d|jjjtt|jfS(Nu%s: %s(RR(R$R)R'R#(R ((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR#s(R$R%R&RR#(((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR'ys t ErrorOutputcBs5eZdZdddddZdZdZRS(s Wrapper class for file-like error streams with failsave de- and encoding of `str`, `bytes`, `unicode` and `Exception` instances. RRcCs|dkrtj}n`|s't}nQt|trHt|d}n0t|trxt|jtj d}n||_ |pt |ddpt pd|_ ||_||_dS(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. twRRN(RRtstderrtFalseRRtopenRRtgetfilesystemencodingtstreamRR RR R (R R0RR R ((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR s   !   cCs|jtkrdSt|trItt||j|j|j}ny|jj |Wnt k r|jj |j |j|jndt k r|jt jt jfkr|jjj |q|jj t||j|jnXdS(s Write `data` to self.stream. Ignore, if self.stream is False. `data` can be a `string`, `unicode`, or `Exception` instance. N(R0R-RRRRRR R twriteRRt TypeErrorRR,tstdouttbuffer(R R((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR1s % cCsH|jtjtjfkrdSy|jjWntk rCnXdS(s Close the error-output stream. Ignored if the stream is` sys.stderr` or `sys.stdout` or has no close() method. N(R0RR3R,tclosetAttributeError(R ((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR5s  N(R$R%R&RR R1R5(((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyR*s  ! (R&Rtcodecstlocalet ImportErrorRR t getlocaletgetdefaultlocaletlookupt LookupErrortobjectRR'R*(((sB/usr/lib/python2.7/site-packages/docutils/utils/error_reporting.pyt#s     @