Hello!
I'm new Quixote user. Quixote is very interesting framework!

I'm sorry for my bad English. My native language is Russian, and I
write English very bad, albeit read without problem. If sometimes
I say something impolite, please don't be offended, it is purely
caused by my illiteracy.

------------------------------------------------------------------

I discover some bug in Quixote.2.1, module quixote.html.
(I used only pure-Python version, _py_htmltext)
Demonstration:

>>> from quixote.html import htmltext, stringify
>>> a = htmltext('string %s')  # htmltext contains bytestring
>>> b = u'unicode'             # unicode string
>>> c = a % b                  # must contains unicode
>>> d = a % htmltext(b)        # must contains unicode
>>> type(stringify(c)), type(stringify(d))
(<type 'str'>, <type 'str'>)

EXPECTED:
(<type 'unicode'>, <type 'unicode'>)

That is, if left argument of % operation is htmltext containing
bytestring, then right argument erroneously converted from unicode
to str with using default encoding (sys.getdefaultencoding()).
If right htmltext contains non-ascii symbols, it lead to exception:

>>> htmltext('hello %s') % u'\u044b'
Traceback (most recent call last):
....
UnicodeEncodeError: 'ascii' codec can't encode character u'\u044b'
in position 0: ordinal not in range(128)


Of course, if I only use single codepage, then I can set, for example,
sys.setdefaultencoding('windows-1251') in sitecustomise.py and
prevent exception raising, but AFAIC it is strongly unrecommended way.

I propose patch. I think, this patch solves all above-mentioned
problems. We may change _wraparg function in _py_htmltext:

------------------------- OLD VERSION: ---------------------------

def _wraparg(arg):
    if (isinstance(arg, htmltext) or
        isinstance(arg, int) or
        isinstance(arg, long) or
        isinstance(arg, float)):
        # ints, longs, floats, and htmltext are okay
        return arg
    else:
        # everything is gets wrapped
        return _QuoteWrapper(arg)

------------------------- NEW VERSION: ---------------------------

def _wraparg(arg):
    if isinstance(arg, htmltext):
        return stringify(arg)
    elif isinstance(arg, basestring):
        return _escape_string(arg)
    elif isinstance(arg, (int, long, float)):
        return arg
    else:
        return _QuoteWrapper(arg)



I'm sorry again for my bad English.
        
Best regards,
 Alexander                          mailto:[EMAIL PROTECTED]

_______________________________________________
Quixote-users mailing list
[email protected]
http://mail.mems-exchange.org/mailman/listinfo/quixote-users

Reply via email to