[liblouis-liblouisxml] Re: Here's the Python formatter

  • From: "Michael Whapples" <dmarc-noreply@xxxxxxxxxxxxx> (Redacted sender "mwhapples" for DMARC)
  • To: liblouis-liblouisxml@xxxxxxxxxxxxx
  • Date: Thu, 17 Dec 2020 16:33:33 +0000

Hello,

You could make this code much shorter by using some Python features. Also the with statements means the closing of the files is more reliable. You may be able to go further with list comprehensions but I leave that one for you if you think it may be worth while.


tableList = ["en-ueb-g2.ctb"]
lineLength = 38
import louis
import textwrap
fileIn = input ("Please enter the input file name: ")
fileOut = input ("Please enter the output file name: ")
with open (fileIn, "rt") as inputFile:
  with open (fileOut, "wt", newline='\r\n') as outputFile:
    for line in inputFile:
      line2 = line.strip()
      if len(line2) > 0:
        translation = louis.translateString (tableList, line2, 0, 0)
        outputFile.write (textwrap.fill (translation, lineLength))
        outputFile.write("\n")

print ("Done.")


Michael Whapples

On 17/12/2020 08:36, John J. Boyer wrote:

Hello Michael,

Thanks for the clarification on freing the liblouis table. I'm pasting the 
program directly into this mesage. so it is easier to read.
Maybe some server didn't like the filename of the attachment. Let's see what 
happens this time.

""" This program, lou_transtext.py, takes an input file, translates it with 
liblouis according to the tablelist variable
and formats it with a line length given in the lineLength variable. It asks for 
the names of the input file and the output file.
As provided, tableList is ["en-ueb-g2.ctb] Note that it is a Python list.
lineLength is currently set to 38. You can set tableList and lineLength 
according to your preferences.
"""

tableList = ["en-ueb-g2.ctb"]
lineLength = 38
import louis
import textwrap
fileIn = input ("Please enter the input file name: ")
fileOut = input ("Please enter the output file name: ")
inputFile = open (fileIn, "rt")
outputFile = open (fileOut, "wt", newline='\r\n')
while True:
     line = next(inputFile, None)
     if line is None:
         break
     line2 = line.strip()
     if line2 == "":
         continue
     translation = louis.translateString (tableList, line2, 0, 0)
     outputFile.write (textwrap.fill (translation, lineLength))
     outputFile.write("\n")
inputFile.close()
outputFile.close()
print ("Done.")

On Thu, Dec 17, 2020 at 07:22:01AM +0000, Michael Whapples wrote:
Hello,

Regarding how the table memory gets freed, this is automatically done by the
bindings when Python exits. The bindings use the atexit module of Python to
register the lou_free function to be called on exit.


Thanks to the Python approach of treating developers as adults, it is
possible to call the lou_free function yourself:

import louis

louis.liblouis.lou_free()


I would recommend against doing that though. As said lou_free is called
automatically on exit. If you need to free the table memory at some other
point I guess you could use the above, although using the liblouis object is
probably seen as dealing with implementation details rather than the API. It
might be preferrable to request the addition of a function in the bindings
API to avoid this direct accessing of implementation details.


Michael Whapples

On 17/12/2020 00:52, John J. Boyer wrote:
Hello Everyone

The Python formatter that I mentioned a few weeks ago is attached. It has a doc 
string that explains its usage.
One thing I'm wondering about is what happens to the memory used by the 
liblouis table when the program ends. I don't see how to clear it.

John

For a description of the software, to download it and links to
project pages go to http://liblouis.org
Donate: http://liblouis.org/sponsoring
For a description of the software, to download it and links to
project pages go to http://liblouis.org
Donate: http://liblouis.org/sponsoring

Other related posts: