141 lines
5.5 KiB
Python
141 lines
5.5 KiB
Python
#Copyright ReportLab Europe Ltd. 2000-2004
|
|
#see license.txt for license details
|
|
#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/test/test_platypus_indents.py
|
|
"""Tests for context-dependent indentation
|
|
"""
|
|
|
|
import sys, os, random
|
|
from string import split, strip, join, whitespace
|
|
from operator import truth
|
|
from types import StringType, ListType
|
|
|
|
from reportlab.test import unittest
|
|
from reportlab.test.utils import makeSuiteForClasses, outputfile, printLocation
|
|
|
|
from reportlab.pdfbase.pdfmetrics import stringWidth
|
|
from reportlab.platypus.paraparser import ParaParser
|
|
from reportlab.platypus.flowables import Flowable
|
|
from reportlab.lib.colors import Color
|
|
from reportlab.lib.units import cm
|
|
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
|
|
from reportlab.lib.utils import _className
|
|
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
|
|
from reportlab.platypus.paragraph import Paragraph
|
|
from reportlab.platypus.frames import Frame
|
|
from reportlab.platypus.doctemplate \
|
|
import PageTemplate, BaseDocTemplate, Indenter, FrameBreak, NextPageTemplate
|
|
from reportlab.platypus import tableofcontents
|
|
from reportlab.platypus.tableofcontents import TableOfContents
|
|
from reportlab.platypus.tables import TableStyle, Table
|
|
from reportlab.platypus.paragraph import *
|
|
from reportlab.platypus.paragraph import _getFragWords
|
|
from reportlab.platypus.flowables import Spacer
|
|
|
|
|
|
def myMainPageFrame(canvas, doc):
|
|
"The page frame used for all PDF documents."
|
|
|
|
canvas.saveState()
|
|
|
|
canvas.rect(2.5*cm, 2.5*cm, 15*cm, 25*cm)
|
|
canvas.setFont('Times-Roman', 12)
|
|
pageNumber = canvas.getPageNumber()
|
|
canvas.drawString(10*cm, cm, str(pageNumber))
|
|
|
|
canvas.restoreState()
|
|
|
|
|
|
class MyDocTemplate(BaseDocTemplate):
|
|
_invalidInitArgs = ('pageTemplates',)
|
|
|
|
def __init__(self, filename, **kw):
|
|
frame1 = Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')
|
|
self.allowSplitting = 0
|
|
apply(BaseDocTemplate.__init__, (self, filename), kw)
|
|
template1 = PageTemplate('normal', [frame1], myMainPageFrame)
|
|
|
|
frame2 = Frame(2.5*cm, 16*cm, 15*cm, 10*cm, id='F2', showBoundary=1)
|
|
frame3 = Frame(2.5*cm, 2.5*cm, 15*cm, 10*cm, id='F3', showBoundary=1)
|
|
|
|
template2 = PageTemplate('updown', [frame2, frame3])
|
|
self.addPageTemplates([template1, template2])
|
|
|
|
|
|
class IndentTestCase(unittest.TestCase):
|
|
"Test multi-page splitting of paragraphs (eyeball-test)."
|
|
|
|
def test0(self):
|
|
"This makes one long multi-page paragraph."
|
|
|
|
# Build story.
|
|
story = []
|
|
|
|
styleSheet = getSampleStyleSheet()
|
|
h1 = styleSheet['Heading1']
|
|
h1.spaceBefore = 18
|
|
bt = styleSheet['BodyText']
|
|
bt.spaceBefore = 6
|
|
|
|
story.append(Paragraph('Test of context-relative indentation',h1))
|
|
|
|
story.append(Spacer(18,18))
|
|
|
|
story.append(Indenter(0,0))
|
|
story.append(Paragraph("This should be indented 0 points at each edge. " + ("spam " * 25),bt))
|
|
story.append(Indenter(0,0))
|
|
|
|
story.append(Indenter(36,0))
|
|
story.append(Paragraph("This should be indented 36 points at the left. " + ("spam " * 25),bt))
|
|
story.append(Indenter(-36,0))
|
|
|
|
story.append(Indenter(0,36))
|
|
story.append(Paragraph("This should be indented 36 points at the right. " + ("spam " * 25),bt))
|
|
story.append(Indenter(0,-36))
|
|
|
|
story.append(Indenter(36,36))
|
|
story.append(Paragraph("This should be indented 36 points at each edge. " + ("spam " * 25),bt))
|
|
story.append(Indenter(36,36))
|
|
story.append(Paragraph("This should be indented a FURTHER 36 points at each edge. " + ("spam " * 25),bt))
|
|
story.append(Indenter(-72,-72))
|
|
|
|
story.append(Paragraph("This should be back to normal at each edge. " + ("spam " * 25),bt))
|
|
|
|
|
|
story.append(Indenter(36,36))
|
|
story.append(Paragraph(("""This should be indented 36 points at the left
|
|
and right. It should run over more than one page and the indent should
|
|
continue on the next page. """ + (random.randint(0,10) * 'x') + ' ') * 20 ,bt))
|
|
story.append(Indenter(-36,-36))
|
|
|
|
story.append(NextPageTemplate('updown'))
|
|
story.append(FrameBreak())
|
|
story.append(Paragraph('Another test of context-relative indentation',h1))
|
|
story.append(NextPageTemplate('normal')) # so NEXT page is different template...
|
|
story.append(Paragraph("""This time we see if the indent level is continued across
|
|
frames...this page has 2 frames, let's see if it carries top to bottom. Then
|
|
onto a totally different template.""",bt))
|
|
|
|
story.append(Indenter(0,0))
|
|
story.append(Paragraph("This should be indented 0 points at each edge. " + ("spam " * 25),bt))
|
|
story.append(Indenter(0,0))
|
|
story.append(Indenter(36,72))
|
|
story.append(Paragraph(("""This should be indented 36 points at the left
|
|
and 72 at the right. It should run over more than one frame and one page, and the indent should
|
|
continue on the next page. """ + (random.randint(0,10) * 'x') + ' ') * 35 ,bt))
|
|
|
|
story.append(Indenter(-36,-72))
|
|
story.append(Paragraph("This should be back to normal at each edge. " + ("spam " * 25),bt))
|
|
doc = MyDocTemplate(outputfile('test_platypus_indents.pdf'))
|
|
doc.multiBuild(story)
|
|
|
|
|
|
#noruntests
|
|
def makeSuite():
|
|
return makeSuiteForClasses(IndentTestCase)
|
|
|
|
|
|
#noruntests
|
|
if __name__ == "__main__":
|
|
unittest.TextTestRunner().run(makeSuite())
|
|
printLocation()
|