134 lines
3.2 KiB
Python
134 lines
3.2 KiB
Python
import pml
|
|
import util
|
|
|
|
# a script's headers.
|
|
class Headers:
|
|
|
|
def __init__(self):
|
|
# list of HeaderString objects
|
|
self.hdrs = []
|
|
|
|
# how many empty lines after the headers
|
|
self.emptyLinesAfter = 1
|
|
|
|
# create standard headers
|
|
def addDefaults(self):
|
|
h = HeaderString()
|
|
h.text = "${PAGE}."
|
|
h.align = util.ALIGN_RIGHT
|
|
h.line = 1
|
|
|
|
self.hdrs.append(h)
|
|
|
|
# return how many header lines there are. includes number of empty
|
|
# lines after possible headers.
|
|
def getNrOfLines(self):
|
|
nr = 0
|
|
|
|
for h in self.hdrs:
|
|
nr = max(nr, h.line)
|
|
|
|
if nr > 0:
|
|
nr += self.emptyLinesAfter
|
|
|
|
return nr
|
|
|
|
# add headers to given page. 'pageNr' must be a string.
|
|
def generatePML(self, page, pageNr, cfg):
|
|
for h in self.hdrs:
|
|
h.generatePML(page, pageNr, cfg)
|
|
|
|
# a single header string
|
|
class HeaderString:
|
|
def __init__(self):
|
|
|
|
# which line, 1-based
|
|
self.line = 1
|
|
|
|
# x offset, in characters
|
|
self.xoff = 0
|
|
|
|
# contents of string
|
|
self.text = ""
|
|
|
|
# whether this is centered in the horizontal direction
|
|
self.align = util.ALIGN_CENTER
|
|
|
|
# style flags
|
|
self.isBold = False
|
|
self.isItalic = False
|
|
self.isUnderlined = False
|
|
|
|
def generatePML(self, page, pageNr, cfg):
|
|
fl = 0
|
|
|
|
if self.isBold:
|
|
fl |= pml.BOLD
|
|
|
|
if self.isItalic:
|
|
fl |= pml.ITALIC
|
|
|
|
if self.isUnderlined:
|
|
fl |= pml.UNDERLINED
|
|
|
|
if self.align == util.ALIGN_LEFT:
|
|
x = cfg.marginLeft
|
|
elif self.align == util.ALIGN_CENTER:
|
|
x = (cfg.marginLeft + (cfg.paperWidth - cfg.marginRight)) / 2.0
|
|
else:
|
|
x = cfg.paperWidth - cfg.marginRight
|
|
|
|
fs = cfg.fontSize
|
|
|
|
if self.xoff != 0:
|
|
x += util.getTextWidth(" ", pml.COURIER, fs) * self.xoff
|
|
|
|
y = cfg.marginTop + (self.line - 1) * util.getTextHeight(fs)
|
|
|
|
text = self.text.replace("${PAGE}", pageNr)
|
|
|
|
page.add(pml.TextOp(text, x, y, fs, fl, self.align))
|
|
|
|
# parse information from s, which must be a string created by __str__,
|
|
# and set object state accordingly. keeps default settings on any
|
|
# errors, does not throw any exceptions.
|
|
#
|
|
# sample of the format: '1,0,r,,${PAGE}.'
|
|
def load(self, s):
|
|
a = util.fromUTF8(s).split(",", 4)
|
|
|
|
if len(a) != 5:
|
|
return
|
|
|
|
self.line = util.str2int(a[0], 1, 1, 5)
|
|
self.xoff = util.str2int(a[1], 0, -100, 100)
|
|
|
|
l, c, self.isBold, self.isItalic, self.isUnderlined = \
|
|
util.flags2bools(a[2], "lcbiu")
|
|
|
|
if l:
|
|
self.align = util.ALIGN_LEFT
|
|
elif c:
|
|
self.align = util.ALIGN_CENTER
|
|
else:
|
|
self.align = util.ALIGN_RIGHT
|
|
|
|
self.text = a[4]
|
|
|
|
def __str__(self):
|
|
s = "%d,%d," % (self.line, self.xoff)
|
|
|
|
if self.align == util.ALIGN_LEFT:
|
|
s += "l"
|
|
elif self.align == util.ALIGN_CENTER:
|
|
s += "c"
|
|
else:
|
|
s += "r"
|
|
|
|
s += util.bools2flags("biu", self.isBold, self.isItalic,
|
|
self.isUnderlined)
|
|
|
|
s += ",,%s" % self.text
|
|
|
|
return s
|