trelby_export/src/headers.py

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