Example #1
0
    def coverPage(cls, theme, doc, page=None, parent=None, **kwargs):
        page = cls._initialize(theme, doc, page, parent)
        # Fill the cover page with a theme background color
        e = Rect(0, 0, page.w, page.h,
                 fill=theme.getColor(1, 4))  # Dark cover color
        page.addElement(e)

        # Add title and author, centered on top-half of the cover.
        e = TextBox('',
                    name='Title',
                    x=page.pl / 2,
                    y=page.h / 2,
                    w=page.pw,
                    h=page.ph / 2)
        page.addElement(e)

        e = Image(x=page.pl, y=page.pb, w=page.pw)
        page.addElement(e)
Example #2
0
    def colophonPage(cls, theme, doc, page=None, parent=None, **kwargs):
        """Compose the template page with the position of the ColophonPage.
        Empty page, with only the title of the book centere on the page width.

        >>> from pagebotnano.document import Document
        >>> from pagebotnano.themes import BackToTheCity
        >>> template = OneColumnTemplate()
        >>> theme = BackToTheCity()
        >>> doc = Document()
        >>> page = template.colophonPage(theme, doc) # Creating a new page
        >>> page.compose(doc, page)
        >>> page.find(MAIN)
        <TextBox name=mainText w=535 h=782>
        """
        page = _initialize(doc, page, parent)
        e = TextBox('', name=MAIN, x=page.pl, y=page.pb, w=page.pw, h=page.ph)
        page.addElement(e)
        return page
Example #3
0
    def getTextBox(self, e=None):
        """Answer the last TextBox element if it exists. 
        Otherwise create it first.

        >>> ts = Typesetter()
        >>> e = ts.getTextBox()
        >>> e
        <TextBox name=TextBox w=100 h=None>
        >>> e1 = ts.getTextBox() # Gets the existing last TextBox
        >>> e is e1
        True
        >>> e2 = TextBox('', x=0, y=0, w=DEFAULT_WIDTH)
        >>> ts.galley.addElement(e2)
        <TextBox name=TextBox w=100 h=None>
        >>> e2 is ts.getTextBox() # Now finding the new one as last
        True
        """
        if e is None:
            e = self.galley
        if not e.elements or not isinstance(e.elements[-1], TextBox):
            e.addElement(TextBox('', x=0, y=0, w=e.w or DEFAULT_WIDTH))
        return e.elements[-1]
Example #4
0
    def oneColumnPage(cls,
                      theme,
                      doc,
                      page=None,
                      parent=None,
                      pageNumbers=None,
                      **kwargs):
        """
        >>> from pagebotnano.document import Document
        >>> from pagebotnano.themes import BackToTheCity
        >>> template = OneColumnTemplate()
        >>> theme = BackToTheCity()
        >>> doc = Document()
        >>> page = template.oneColumnPage(theme, doc, pageNumbers=NONE)
        >>> page.compose(doc)
        >>> page.find(MAIN)
        <TextBox name=mainText w=535 h=782>
        >>> page = doc.newPage(template=oneColumnPage)
        """
        page = cls._initialize(theme, doc, page, parent)
        # Add text element with the main text column of this page
        e = TextBox('', name=MAIN, x=page.pl, y=page.pb, w=page.pw, h=page.ph)
        page.addElement(e)

        if pageNumbers is None:
            pageNumbers = [LEFT, RIGHT]
        if LEFT in pageNumbers and page.pn % 2 == 0:  # Even page number?:
            bs = BabelString(str(page.pn), style)
            e = Text(bs, name=PN_LEFT, x=page.pl, y=page.pb / 2)
            page.addElement(e)
        if CENTER in pageNumbers:
            e = Text('', name=PN_CENTER, x=page.pl + page.pw, y=page.pb / 2)
            page.addElement(e)
        if RIGHT in pageNumbers:
            e = Text('', name=PN_RIGHT, x=page.pl + page.pw, y=page.pb / 2)
            page.addElement(e)
        return page
Example #5
0
    def compose(self):
        """This is the core of a publication, composing the specific
        content of the document. The compose method gets called
        before building and exporting the self.doc document.
        """
        fontSize = 11
        headSize = fontSize * 1.5
        titleSize = 36
        subTitleSize = titleSize * 0.5
        pad = 48

        self.theme.styles['h1'] = dict(
            font='Georgia-Bold',
            lineHeight=titleSize * 1.1,
            fontSize=titleSize,
            align=CENTER,
            fill=1,  # White title on dark cover background
            language=EN,
            hyphenation=False,
        )
        self.theme.styles['h2'] = dict(
            font='Georgia-Italic',
            paragraphTopSpacing=subTitleSize / 2,
            lineHeight=subTitleSize * 1.2,
            fontSize=subTitleSize,
            align=CENTER,
            fill=1,  # White title on dark cover background
            language=EN,
            hyphenation=False,
        )
        headStyle = dict(
            font='Georgia',
            lineHeight=headSize * 1.3,
            fontSize=headSize,
            fill=0,  # Black text
            language=EN,
            hyphenation=False,
        )
        subHeadStyle = dict(
            font='Georgia-Italic',
            lineHeight=headSize * 0.8 * 1.4,
            fontSize=headSize * 0.8,
            fill=0,  # Black text
            language=EN,
            hyphenation=False,
        )
        bodyStyle = dict(
            font='Georgia',
            lineHeight=fontSize * 1.4,
            fontSize=fontSize,
            fill=0,  # Black text
            language=EN,
            hyphenation=True,
        )
        pageNumberLeftStyle = dict(
            font='Georgia',
            fontSize=9,
            fill=0,  # Black text
            align=LEFT,
        )
        pageNumberRightStyle = copy(pageNumberLeftStyle)
        pageNumberRightStyle['align'] = RIGHT

        # Make the cover page.
        page = coverPage(self.theme, self.doc)

        # Make “French” “Voordehandse” page.
        page = self.doc.newPage()  # No page number here.

        # CENTER text alignment overwrites the value in headStyle.
        # fontSize overwrites the value in headStyle
        bs = BabelString('AAAA' + '\n',
                         headStyle,
                         fontSize=fontSize,
                         align=CENTER)
        e = Text(bs, x=page.w / 2, y=page.h * 4 / 5)
        page.addElement(e)

        # Make Title page.
        page = titlePage(self.theme, self.doc)
        page.compose(self.doc, page)
        bs = BabelString('VVVVV' + '\n', headStyle, align=CENTER)
        bs.append(BabelString('AUTHOR', subHeadStyle, align=CENTER))
        page.find(MAIN).bs = bs

        # For all the elements that are collected in the galley, assume that
        # the TextBoxes are chapters, creating a new page for them.
        # If the TextBox does not fit on the page, keep adding new pages
        # until all of the BabelString overfill is processed.

        for ge in self.galley.elements:

            if isinstance(ge, TextBox):

                bs = ge.bs  # Get the BabelString from the galley box.

                for n in range(self.MAX_PAGES):
                    page = self.doc.newPage()

                    # Add text element with page number
                    self.addPageNumber(page, pad, pageNumberLeftStyle,
                                       pageNumberRightStyle)

                    # Add text element with the main text column of this page
                    e = TextBox(bs,
                                x=pad,
                                y=pad,
                                w=page.w - 2 * pad,
                                h=page.h - 2 * pad)
                    page.addElement(e)

                    # If there is overflow on this page, continue looping creating
                    # as many pages as needed to fill all the text in self.content.
                    # Otherwise break the loop, as we are done placing content.
                    bs = e.getOverflow(bs, doc=self.doc)
                    # Test on this “incomplete” BabelString, as it only has a cached FS
                    if not bs.fs:
                        break

            elif isinstance(ge, Image):  # Images not supported yet
                page = self.doc.newPage()

                self.addPageNumber(page, pad, pageNumberLeftStyle,
                                   pageNumberRightStyle)
                page.addElement(ge)
                ge.w = page.w - pad
                iw, ih = ge.getSize(self.doc)
                ge.x = pad / 2
                ge.y = page.h - pad - ih