[reportlab-users] Hebrew Support Patch

Marius Gedminas marius at gedmin.as
Fri Jun 5 08:54:24 EDT 2009


On Fri, Jun 05, 2009 at 10:02:57AM +0300, Moshe Wagner wrote:

> Thanks for your corrections.

> As I said, I'm new to python, so I didn't realize you could use loops

> that way.


Welcome. I think you'll enjoy Python. I do.


> This line:

> "if type(line) in (FragLine, ParaLines):"

> didn't seem to work, as type(line) always returned "instance", so I

> kept it the way I had it.


Old-style classes FTW.

isinstance(line, (FragLine, ParaLines)) should work, and is better style
anyway.


> Another thing I did wrong is implementing '.reverse()' manually, not

> realizing it exists.

>

> So here's the new code. Clearly looks better:

>

> ######################

> # Hebrew text patch, Moshe Wagner, June 2009

> # <moshe.wagner at gmail.com>

>

> #This code fixes paragraphs with RTL text

>

> # It does it by flipping each line seperatly.

> # (Depending on the type of the line)

>

> # If fribidi cant be imported, it does nothing

>

> try:

> import pyfribidi


Please don't use tabs for indentation. 4 spaces are traditional. (The
Python coding style guidelines are almost universally accepted; you can
find them at http://www.python.org/dev/peps/pep-0008/)

Although last time I checked Reportlab didn't follow PEP-8 faithfully.


> for line in blPara.lines:

> if line.__class__.__name__ in ('FragLine', 'ParaLines'):


isinstance(line, (FragLine, ParaLines))


> """When the line is a FragLine or ParaLines, It's

> text attribute of each of it's words is flipped.

> Then, the order of the words is flipped too,

> So that 2 word parts on the same line

> will be in the right order """


Comments are written like this:

# When the line is a FragLine or ParaLines, It's
# text attribute of each of it's words is flipped.
# Then, the order of the words is flipped too,
# So that 2 word parts on the same line
# will be in the right order

Also, it's "its", not "It's".


> for word in line.words:

> word.text = pyfribidi.log2vis (word.text, base_direction = pyfribidi.ON)


PEP-8 recommends no space in front of ( following a function name, and
no spaces around = when used to pass keyword arguments.


>

> line.words.reverse()

>

> elif line.__class__.__name__ == 'tuple':


isinstance(line, tuple)


> """When the line is just a tuple whose second value is the text.

> since I coulden't directly change it's value,

> it's done by merging the words, flipping them,

> and re-entering them one by one to the second attribute """

>

> s = ' '.join(line[1])

> s = pyfribidi.log2vis( s, base_direction=pyfribidi.ON)

> line[1][:] = s.split()

> else:

> print line.__class__.__name__


This is for debugging purposes, right?


> #print self.blPara.lines[i][1][1:]

> except ImportError:

> print "Fribidi module not found; You will not have rtl support for

> this paragraph"


It's typically better to keep the part between try: and except: as small
as possible, thus it's idiomatic to write

try:
import pyfribidi
except ImportError:
print >> sys.stderr, "Fribidi module not found ..."
else:
# code

Printing to sys.stdout (or even sys.stderr) from a library is perhaps
bad style, but I'm not sure what's the right solution here. Either the
logging or the warnings module would be better. E.g.

try:
import pyfribidi
except ImportError:
warnings.warn("Fribidi module not found ...")
else:
# code


> ######################

>

> Is there any chance this could be added to the official code?


I'm not affiliated with Reportlab in any way (other than being a happy
user and a some-time contributor a long time ago), but I'd say yes. The
chances would be better if you added some tests for the new code.

Marius Gedminas
--
We have enough youth, how about a fountain of SMART?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : <http://two.pairlist.net/pipermail/reportlab-users/attachments/20090605/a5b14f24/attachment.pgp>


More information about the reportlab-users mailing list