in assets/support/faq/docbook-xsl/extensions/xsltproc/python/docbook.py [0:0]
def adjustColumnWidths(ctx, nodeset):
#
# Small check to verify the context is correcly accessed
#
try:
pctxt = libxslt.xpathParserContext(_obj=ctx)
ctxt = pctxt.context()
tctxt = ctxt.transformContext()
except:
pass
# Get the nominal table width
varString = lookupVariable(tctxt, "nominal.table.width", None);
if varString == None:
nominalWidth = 6 * pixelsPerInch;
else:
nominalWidth = convertLength(varString);
# Get the requested table width
tableWidth = lookupVariable(tctxt, "table.width", "100%")
foStylesheet = (tctxt.variableLookup("stylesheet.result.type", None) == "fo");
relTotal = 0
relParts = []
absTotal = 0
absParts = []
colgroup = libxml2.xmlNode(_obj = nodeset[0])
# If this is an foStylesheet, we've been passed a list of fo:table-columns.
# Otherwise we've been passed a colgroup that contains a list of cols.
if foStylesheet:
colChildren = colgroup
else:
colChildren = colgroup.children
col = colChildren
while col != None:
if foStylesheet:
width = col.prop("column-width")
else:
width = col.prop("width")
if width == None:
width = "1*"
relPart = 0.0;
absPart = 0.0;
starPos = string.find(width, "*");
if starPos >= 0:
relPart, absPart = string.split(width, "*", 2)
relPart = float(relPart);
relTotal = relTotal + float(relPart)
else:
absPart = width
pixels = convertLength(absPart);
absTotal = absTotal + pixels;
relParts.append(relPart);
absParts.append(pixels);
col = col.next
# Ok, now we have the relative widths and absolute widths in
# two parallel arrays.
#
# - If there are no relative widths, output the absolute widths
# - If there are no absolute widths, output the relative widths
# - If there are a mixture of relative and absolute widths,
# - If the table width is absolute, turn these all into absolute
# widths.
# - If the table width is relative, turn these all into absolute
# widths in the nominalWidth and then turn them back into
# percentages.
widths = [];
if relTotal == 0:
for absPart in absParts:
if foStylesheet:
inches = absPart / pixelsPerInch
widths.append("%4.2fin" % inches)
else:
widths.append("%d" % absPart)
elif absTotal == 0:
for relPart in relParts:
rel = relPart / relTotal * 100;
widths.append(rel);
widths = correctRoundingError(widths)
else:
pixelWidth = nominalWidth;
if string.find(tableWidth, "%") < 0:
pixelWidth = convertLength(tableWidth);
if pixelWidth <= absTotal:
print "Table is wider than table width"
else:
pixelWidth = pixelWidth - absTotal;
absTotal = 0
for count in range(len(relParts)):
rel = relParts[count] / relTotal * pixelWidth
relParts[count] = rel + absParts[count]
absTotal = absTotal + rel + absParts[count]
if string.find(tableWidth, "%") < 0:
for count in range(len(relParts)):
if foStylesheet:
pixels = relParts[count]
inches = pixels / pixelsPerInch
widths.append("%4.2fin" % inches)
else:
widths.append(relParts[count])
else:
for count in range(len(relParts)):
rel = relParts[count] / absTotal * 100
widths.append(rel)
widths = correctRoundingError(widths)
# Danger, Will Robinson! In-place modification of the result tree!
# Side-effect free? We don' need no steenkin' side-effect free!
count = 0
col = colChildren
while col != None:
if foStylesheet:
col.setProp("column-width", widths[count])
else:
col.setProp("width", widths[count])
count = count+1
col = col.next
return nodeset