Exemplo n.º 1
0
def makeDocument(rs):
    u"""Demo Bitcount Reference composer."""

    # Set some values of the default template (as already generated by the document).
    # Make squential unique names for the flow boxes inside the templates
    coverTitleId = 'coverTitleId'  # To find the placement of the cover title.
    coverAuthorId = 'coverAuthorId'  # Find the placement for the author name.
    tocId = 'toc'  # Id of target textBox, containing the table of content.
    flowId1 = MAIN_FLOW + '1'
    flowIds = [flowId1]  # Names of boxes that contain footnote text in flow.
    footnotesId = 'footnotes'  # Id of target textBox containing footnotes per page.
    literatureIndexId = 'literatureIndex'
    imageIndexId = 'imageIndex'
    pageNumberId = 'pageNumberId'

    # Template for Cover page
    templateCover = Template(rs)  # Create new template
    templateCover.rect(0, 0, rs['w'], rs['h'], fill=(1, 0, 0))
    # Placement of first <h1> in the Galley, holding the Thesis title.
    templateCover.cTextBox(FS, 1, 1, 6, 5, rs, coverTitleId, fill=BOX_COLOR)
    # Placement of first <h4> in the Galley, holding the author name(s)
    templateCover.cTextBox(FS, 1, 8, 6, 5, rs, coverAuthorId, fill=BOX_COLOR)

    # Template for Table of Content
    templateToc = Template(rs)  # Create template for Table of Content
    # Show grid columns and paddngs if rootStyle.showGrid or rootStyle.showGridColumns are True
    templateToc.grid(rs)
    # Show baseline grid if rs.showBaselineGrid is True
    templateToc.baselineGrid(rs)
    templateToc.cTextBox('\nTable of Content',
                         3,
                         0,
                         4,
                         1,
                         rs,
                         fill=BOX_COLOR,
                         fontSize=32)
    templateToc.cTextBox('', 3, 1, 4, 8, rs, tocId, fill=BOX_COLOR)

    # Template for literature reference index.
    templateLiteratureIndex = Template(
        rs)  # Create template for Table of Content
    # Show grid columns and paddings if rootStyle.showGrid or rootStyle.showGridColumns are True
    templateLiteratureIndex.grid(rs)
    # Show baseline grid if rs.showBaselineGrid is True
    templateLiteratureIndex.baselineGrid(rs)
    templateLiteratureIndex.cTextBox('\nLiterature index',
                                     3,
                                     0,
                                     4,
                                     1,
                                     rs,
                                     fill=BOX_COLOR,
                                     fontSize=32)
    templateLiteratureIndex.cTextBox('',
                                     3,
                                     1,
                                     4,
                                     8,
                                     rs,
                                     literatureIndexId,
                                     fill=BOX_COLOR)

    # Template for image reference index.
    templateImageIndex = Template(rs)  # Create template for Table of Content
    # Show grid columns and padding if rootStyle.showGrid or rootStyle.showGridColumns are True
    templateImageIndex.grid(rs)
    # Show baseline grid if rs.showBaselineGrid is True
    templateImageIndex.baselineGrid(rs)
    templateImageIndex.cTextBox('\nImage index',
                                3,
                                0,
                                4,
                                1,
                                rs,
                                fill=BOX_COLOR,
                                fontSize=32)
    templateImageIndex.cTextBox('',
                                3,
                                1,
                                4,
                                8,
                                rs,
                                imageIndexId,
                                fill=BOX_COLOR)

    # Template 1
    template1 = Template(rs)  # Create template of main size. Front page only.
    # Show grid columns and paddings if rootStyle.showGrid or rootStyle.showGridColumns are True
    template1.grid(rs)
    # Show baseline grid if rs.showBaselineGrid is True
    template1.baselineGrid(rs)
    # Create empty image place holders. To be filled by running content on the page.
    # In this templates the images fill the left column if there is a reference on the page.
    template1.cContainer(0, 0, 3, 3, rs)  # Empty image element, cx, cy, cw, ch
    template1.cContainer(0, 3, 3, 3, rs)
    template1.cContainer(0, 6, 3, 3, rs)
    # Create linked text boxes. Note the "nextPage" to keep on the same page or to next.
    template1.cTextBox(FS,
                       3,
                       0,
                       4,
                       9,
                       rs,
                       flowId1,
                       nextBox=flowId1,
                       nextPage=1,
                       fill=BOX_COLOR)
    template1.cTextBox('', 3, 9, 3, 2, rs, footnotesId, fill=BOX_COLOR)
    # Create page number box. Pattern pageNumberMarker is replaced by FormattedString of actual page number.
    # Mark the text box, so we can find it back later.
    template1.cTextBox(rs['pageIdMarker'],
                       6,
                       9,
                       1,
                       1,
                       eId=pageNumberId,
                       style=rs,
                       font=BOOK,
                       fontSize=12,
                       fill=BOX_COLOR,
                       xAlign=RIGHT)

    # Create new document with (w,h) and fixed amount of pages.
    # Make number of pages with default document size.
    # Initially make all pages default with template2
    doc = Document(rs, autoPages=5, template=template1)

    # Cache some values from the root style that we need multiple time to create the tag styles.
    fontSize = rs['fontSize']
    leading = rs['leading']
    rLeading = rs['rLeading']
    listIndent = rs['listIndent']
    language = rs['language']

    # Add styles for whole document and text flows.
    # Note that some values are defined here for clarity, even if their default root values
    # are the same.
    doc.newStyle(name='chapter', font=BOOK)
    doc.newStyle(name='title', fontSize=3 * fontSize, font=BOLD)
    doc.newStyle(name='subtitle', fontSize=2.6 * fontSize, font=BOOK_ITALIC)
    doc.newStyle(name='author',
                 fontSize=2 * fontSize,
                 font=BOOK,
                 fill=(1, 0, 0))
    doc.newStyle(name='h1',
                 fontSize=7 * fontSize,
                 font=SEMIBOLD_CONDENSED,
                 fill=(1, 0, 0),
                 leading=7.2 * fontSize,
                 tracking=H1_TRACK,
                 prefix='',
                 postfix='\n')
    doc.newStyle(name='h2',
                 fontSize=1.5 * fontSize,
                 font=SEMIBOLD_CONDENSED,
                 fill=0,
                 leading=1.6 * fontSize,
                 rLeading=0,
                 rTracking=H2_TRACK,
                 prefix='\n',
                 postfix='\n',
                 paragraphTopSpacing=U)
    doc.newStyle(name='h3',
                 fontSize=1.1 * fontSize,
                 font=MEDIUM,
                 fill=0,
                 paragraphTopSpacing=2 * U,
                 paragraphBottomSpacing=U,
                 leading=leading,
                 rLeading=0,
                 rNeedsBelow=2 * rLeading,
                 rTracking=H3_TRACK,
                 prefix='\n',
                 postfix='\n')
    doc.newStyle(name='h4',
                 fontSize=1.1 * fontSize,
                 font=BOOK,
                 fill=0,
                 leading=leading,
                 rLeading=0,
                 rNeedsBelow=2 * rLeading,
                 rTracking=H3_TRACK,
                 paragraphTopSpacing=U,
                 paragraphBottomSpacing=U,
                 prefix='\n',
                 postfix='\n')

    # Spaced paragraphs.
    doc.newStyle(
        name='p',
        fontSize=fontSize,
        font=BOOK,
        fill=0.1,
        prefix='',
        postfix='\n',
        rTracking=P_TRACK,
        leading=14,
        rLeading=0,
        xAlign=LEFT,
        hyphenation=True,
        indent=0,
        firstLineIndent=2 * U,
        firstParagraphIndent=0)  # TODO: Make firstParagraphIndent to work.
    # Inline tags need to refined prefix and postfix as non-\n, otherwise they
    # will inherit these attributes from the parent <p>
    doc.newStyle(name='b', font=SEMIBOLD, prefix='', postfix='')
    doc.newStyle(name='em',
                 font=BOOK_ITALIC,
                 textFill=(1, 0, 0),
                 prefix='',
                 postfix='')
    doc.newStyle(name='hr', stroke=(1, 0, 0), strokeWidth=4)
    doc.newStyle(name='br',
                 postfix='\n')  # Simplest way to make <br/> show newline
    doc.newStyle(name='a', prefix='', postfix='')

    # Literature reference.
    doc.newStyle(name='literatureref', textFill=0.3, fontSize=fontSize - 1)

    # Footnote reference index.
    doc.newStyle(name='sup',
                 font=MEDIUM,
                 baselineShift=2,
                 prefix='',
                 postfix=' ',
                 fontSize=fontSize - 2)
    doc.newStyle(
        name='li',
        fontSize=fontSize,
        font=BOOK,
        rTracking=P_TRACK,
        leading=leading,
        hyphenation=True,
        # Lists need to copy the listIndex over to the regalar style value.
        tabs=[(listIndent, LEFT)],
        indent=listIndent,
        firstLineIndent=1,
        postfix='\n')
    doc.newStyle(name='ul', prefix='', postfix='')
    doc.newStyle(name='footnote',
                 fill=0,
                 fontSize=0.9 * fontSize,
                 font=BOOK,
                 rTracking=P_TRACK,
                 tabs=[(listIndent, LEFT)],
                 indent=listIndent,
                 firstLineIndent=1,
                 postfix='\n')

    # Image & captions
    doc.newStyle(
        name='img',
        stroke=0.3,
        fill=None,
        rTracking=P_TRACK,
        language=language,
        textFill=0.2,
        strokeWidth=1,
        leading=leading * 0.8,
        fontSize=0.8 * fontSize,
        font=BOOK_ITALIC,
        hyphenation=True,
        indent=0,
        firstLineIndent=0,
        # Use style['fill'] = transparant color as overlay on image.
    )

    # Generic document layout
    # Page 1    Cover
    # Page 2    Title
    # Page 3    Table of Content
    # Page 4+   Content  (footnotes are shown on the page of their reference)
    # Page -1   Alphabetical literature reference.

    # Change template of cover page.
    # Create filtered Galley for cover page.
    # See https://docs.python.org/2/library/xml.etree.elementtree.html#xpath-support
    # for XPath filter syntax.
    gTitle = Galley()
    t = Typesetter(doc, gTitle)
    t.typesetFile(MD_PATH,
                  rootStyle=dict(textFill=1,
                                 fontSize=80,
                                 font=MEDIUM,
                                 leading=84),
                  xPath='h1')

    gAuthor = Galley()
    t = Typesetter(doc, gAuthor)
    t.typesetFile(MD_PATH,
                  rootStyle=dict(textFill=1, fontSize=24, font=MEDIUM),
                  xPath='h4')  # First one is the author

    coverPage = doc[1]
    coverPage.setTemplate(templateCover)
    c = Composer(doc)
    c.compose(gTitle, coverPage, coverTitleId)
    c.compose(gAuthor, coverPage, coverAuthorId)

    # Change template of Table of Content page
    tocPage = doc[2]
    tocPage.setTemplate(templateToc)

    mainPage = doc[3]

    # Create main Galley for this page, for pasting the sequence of elements.
    g = Galley()
    t = Typesetter(doc, g)
    t.typesetFile(MD_PATH)

    # Fill the main flow of text boxes with the ML-->XHTML formatted text.
    c = Composer(doc)
    c.compose(g, mainPage, flowId1)

    # Now all text is composed on pages, scan for the pages that contain footnotes.
    # TODO: This will be implemented a function inside Composer in a later version.
    # Assume the tocBox (Table of Content) to be available on the first page.
    literatureRefs = {}
    tocBox, (_, _) = tocPage[tocId]
    for pageId, page in sorted(doc.pages.items()):
        if page in (tocPage,
                    coverPage):  # Skip these for toc collect and footnotes.
            continue
        # Get page box for footnotes
        fnBox, (_, _) = page[footnotesId]
        assert fnBox is not None  # Otherwise there is a template error. Footnote box needs to exist.
        for flowId in flowIds:
            # BUG: Need to check if the marker was really found in the textbox area.
            # If it is part of the overflow, then it should not be found here.
            flow, _ = page[flowId]
            for marker, arguments in findMarkers(flow.fs):
                if marker == 'footnote':
                    footNoteIsInOverflow = False
                    # Process the foot note.
                    footnoteId = int(arguments)  # Footnode ids are numbers.
                    # @@@ Hack to check if the marker is in the overflow text.
                    # In that case, ignore it.
                    for overFlowMarker, overFlowArguments in findMarkers(
                            flow.getOverflow()):
                        # If this marker is a footnote and one that we are looking for,
                        # we can ignore it, because it is in the overflow part of the flow.fs
                        if overFlowMarker == 'footnote' and footnoteId == int(
                                overFlowArguments):
                            footNoteIsInOverflow = True
                            break
                    if not footNoteIsInOverflow:
                        # We found a footnote that is visible on this page and
                        # not in one of the overflow texts.
                        # Process the footnote id and content, usng the “footnote“ content style.
                        # We are re-using the typesetter here. This may become a separate typesetter, if this code
                        # becomes a method of the composer.
                        # TODO: Make this into Galley, in case footnote <p> has child nodes.
                        footnoteText = doc.context.newString(
                            '%d\t%s\n' %
                            (footnoteId, doc.footnotes[footnoteId]['p'].text),
                            page, t.getCascadedStyle(doc.getStyle('footnote')))
                        # Add the footnote content to the box (it may not be the first to be added.
                        fnBox.append(footnoteText)
                elif marker in ('h1', 'h2', 'h3',
                                'h4'):  # For now we want them all in the TOC
                    #doc.addToc(marker)
                    pass
                elif marker == 'literature':
                    # The "arguments" contains the refId, so we can find it in the collected literature references
                    # and then add this page number.
                    # @@@ TODO: check if reference marker is in overflow. Then ignore processing it.
                    doc.literatureRefs[int(arguments)]['pageIds'].append(
                        pageId)

    # Build the alphabetical literature reference page.
    # Scan the created pages for literature references and build an index on a new page.
    literatureIndexPage = doc.newPage(template=templateLiteratureIndex)
    # Make an alfabetic sorted list of name-->(reference, (pageNumber, ...))
    references = {}
    for refIndex, item in doc.literatureRefs.items():
        references[item['nodeId']] = item
    literatureRefBox = literatureIndexPage.getElement(literatureIndexId)
    for refId, item in sorted(references.items()):
        # Now we have a sorted list of reference items, we need to make it into a galley.
        # Several ways of doing it: Create MarkDown, HTML/XML or directly writing FormattedText.
        pageNumbers = []
        for pageNumber in item['pageIds']:
            pageNumbers.append( ` pageNumber `)
        literatureRefBox.append(u'%s – %s\n' % (refId, ', '.join(pageNumbers)))

        print refId, item['nodeId'], item['node'], item['p'], item['pageIds']

    # Build the alphabetical image reference page.
    # Scan the created pages for image references and build an index on a new page.
    imageIndexPage = doc.newPage(template=templateImageIndex)
    # Make an alfabetic sorted list of name-->(reference, (pageNumber, ...))
    references = {}
    for refIndex, item in doc.imageRefs.items():
        references[item['nodeId']] = item
    for imageRefId, item in sorted(references.items()):
        print imageRefId, item['nodeId'], item['node'], item['p'], item[
            'pageIds']

    # Set all pagenumbers and other page-based info
    for pageId, page in sorted(doc.pages.items()):
        for e in page.elements:
            if e.eId == pageNumberId:
                e.setText('%s' % pageId)
                break

    return doc
def makeDocument():
    """Demo page composer."""
    tt = time()  # Keep track of time, in case SHOW_TIMER is True

    # Set some values of the default template
    # (as already generated by the document).
    # Make squential unique names for the flow boxes inside the templates
    flowId0 = MAIN_FLOW + '0'
    flowId1 = MAIN_FLOW + '1'
    flowId2 = MAIN_FLOW + '2'

    # Template 1
    template1 = Template(rs)  # Create template of main size. Front page only.
    # Show grid columns and margins if rootStyle.showGrid
    # or rootStyle.showGridColumns are True
    template1.grid(rs)
    # Show baseline grid if rs.showBaselines is True
    template1.baselineGrid(rs)
    # Create empty image place holders.
    # To be filled by running content on the page.
    template1.cContainer(4, 0, 2, 4, rs)  # Empty image element, cx, cy, cw, ch
    template1.cContainer(0, 5, 2, 3, rs)
    # Create linked text boxes.
    # Note the "nextPageName" to keep on the same page or to next.
    template1.cTextBox('',
                       0,
                       0,
                       2,
                       5,
                       style=rs,
                       prevBox=flowId0,
                       nextBox=flowId1,
                       nextPageName=0,
                       fill=BOX_COLOR)
    template1.cTextBox('',
                       2,
                       0,
                       2,
                       8,
                       style=rs,
                       prevBox=flowId1,
                       nextBox=flowId2,
                       nextPageName=0,
                       fill=BOX_COLOR)
    template1.cTextBox('',
                       4,
                       4,
                       2,
                       4,
                       style=rs,
                       prevBox=flowId2,
                       nextBox=flowId0,
                       nextPageName=1,
                       fill=BOX_COLOR)
    # Create page number box.
    # Pattern pageNumberMarker is replaced by actual page number.
    template1.cText(rs['pageNumberMarker'],
                    6,
                    0,
                    style=rs,
                    font=BOOK,
                    fontSize=12,
                    fill=BOX_COLOR)

    # Template 2
    template2 = Template(rs)  # Create second template.
    # This is for the main pages.

    # Show grid columns and margins if rootStyle.showGrid
    # or rootStyle.showGridColumns are True
    template2.grid(rs)
    # Show baseline grid if rs.showBaselines is True
    template2.baselineGrid(rs)
    template2.cContainer(4, 0, 2, 3, style=rs)  # Empty image element,
    # cx, cy, cw, ch
    template2.cContainer(0, 5, 2, 3, style=rs)
    template2.cContainer(2, 2, 2, 2, style=rs)
    template2.cContainer(2, 0, 2, 2, style=rs)
    template2.cContainer(4, 6, 2, 2, style=rs)
    template2.cTextBox('',
                       0,
                       0,
                       2,
                       5,
                       style=rs,
                       prevBox=flowId0,
                       nextBox=flowId1,
                       nextPageName=0,
                       fill=BOX_COLOR)
    template2.cTextBox('',
                       2,
                       4,
                       2,
                       4,
                       style=rs,
                       prevBox=flowId1,
                       nextBox=flowId2,
                       nextPageName=0,
                       fill=BOX_COLOR)
    template2.cTextBox('',
                       4,
                       3,
                       2,
                       3,
                       style=rs,
                       prevBox=flowId2,
                       nextBox=flowId0,
                       nextPageName=1,
                       fill=BOX_COLOR)
    # Create page number box.
    # Pattern pageNumberMarker is replaced by actual page number.
    template2.cText(rs['pageNumberMarker'],
                    6,
                    0,
                    style=rs,
                    font=BOOK,
                    fontSize=12,
                    fill=BOX_COLOR)

    # Create new document with (w,h) and fixed amount of pages.
    # Make number of pages with default document size.
    # Initially make all pages default with template2
    doc = Document(rs, autoPages=2, template=template2)

    # Cache some values from the root style that we need
    # multiple time to create the tag styles.
    fontSize = rs['fontSize']
    leading = rs['leading']
    listIndent = rs['listIndent']
    language = rs['language']

    # Add styles for whole document and text flows.
    # Note that some values are defined here for clarity,
    # even if their default root values are the same.
    doc.newStyle(name='chapter', font=BOOK)
    doc.newStyle(name='title', fontSize=3 * fontSize, font=BOLD)
    doc.newStyle(name='subtitle', fontSize=2 * fontSize, font=BOOK_ITALIC)
    doc.newStyle(name='author',
                 fontSize=2 * fontSize,
                 font=BOOK,
                 fill=color(1, 0, 0))
    doc.newStyle(name='h1',
                 fontSize=fontSize,
                 font=SEMIBOLD,
                 fill=color(1, 0, 0),
                 leading=2 * fontSize,
                 tracking=H1_TRACK,
                 postfix='\n')
    doc.newStyle(name='h2',
                 fontSize=fontSize,
                 font=SEMIBOLD,
                 fill=color(0, 0.5, 1),
                 leading=1 * fontSize,
                 tracking=H2_TRACK,
                 postfix='\n')
    doc.newStyle(name='h3',
                 fontSize=fontSize,
                 font=MEDIUM,
                 fill=blackColor,
                 leading=1 * fontSize,
                 needsBelow=2 * leading,
                 tracking=H3_TRACK,
                 postfix='\n')

    # Spaced paragraphs.
    doc.newStyle(name='p',
                 fontSize=fontSize,
                 font=BOOK,
                 fill=color(0.1),
                 prefix='',
                 postfix='\n',
                 tracking=P_TRACK,
                 leading=14,
                 align=LEFT,
                 hyphenation=True)
    doc.newStyle(name='b', font=SEMIBOLD)
    doc.newStyle(name='em', font=BOOK_ITALIC)
    doc.newStyle(name='hr', stroke=color(1, 0, 0), strokeWidth=4)
    doc.newStyle(name='br', postfix='\n')  # Simplest way to make
    # <br/> be newline
    doc.newStyle(
        name='img',
        leading=leading,
        fontSize=fontSize,
        font=BOOK,
    )

    # Footnote reference index.
    doc.newStyle(name='sup',
                 font=MEDIUM,
                 rBaselineShift=0.6,
                 fontSize=0.65 * fontSize)
    doc.newStyle(
        name='li',
        fontSize=fontSize,
        font=BOOK,
        tracking=P_TRACK,
        leading=leading,
        hyphenation=True,
        # Lists need to copy the listIndex over to the regalar style value.
        tabs=[(listIndent, LEFT)],
        indent=listIndent,
        firstLineIndent=1,
        postfix='\n')
    doc.newStyle(name='ul')
    doc.newStyle(name='literatureref',
                 fill=color(0.5),
                 rBaselineShift=0.2,
                 fontSize=0.8 * fontSize)
    doc.newStyle(name='footnote',
                 fill=color(1, 0, 0),
                 fontSize=0.8 * U,
                 font=BOOK)
    doc.newStyle(name='caption',
                 tracking=P_TRACK,
                 language=language,
                 fill=color(0.2),
                 leading=leading * 0.8,
                 fontSize=0.8 * fontSize,
                 font=BOOK_ITALIC,
                 indent=U / 2,
                 tailIndent=-U / 2,
                 hyphenation=True)

    if SHOW_TIMER:
        print('Time styles %0.3f' % (time() - tt))
        tt = time()

    # Change template of page 1
    page1 = doc[1]
    page1.setTemplate(template1)

    ttt = ''
    for n in range(100):
        ttt += 'abcdefg%d\n' % n
    ttt = doc.context.newString(ttt, rs)
    ttt = page0.textBox(ttt,
                        point=(rs.get('pl'), rs.get('pt')),
                        w=11 * 14,
                        h=50 * 14,
                        fill=color(0.8, 0.8, 0.8, 0.5))
    page0.textBox(ttt,
                  point=(rs.get('pl') + 11 * 14 + 14, rs.get('pt')),
                  w=11 * 14,
                  h=50 * 14,
                  fill=color(0.8, 0.8, 0.8, 0.5))

    if SHOW_TIMER:
        print('Time template %0.3f' % (time() - tt))
        tt = time()

    # Create main Galley for this page, for pasting the sequence of elements.
    g = Galley()
    t = Typesetter(doc, g)
    t.typesetFile(MD_PATH)

    if SHOW_TIMER:
        print('Time typesetter %0.3f' % (time() - tt))
        tt = time()

    # Fill the main flow of text boxes with the ML-->XHTML formatted text.
    c = Composer(doc)
    c.compose(g, doc[1], flowId0)

    if SHOW_TIMER:
        print('Time compose %0.3f' % (time() - tt))

    return doc
Exemplo n.º 3
0
def makeDocument(rs):
    u"""Demo page composer."""

    # Set some values of the default template (as already generated by the document).
    # Make squential unique names for the flow boxes inside the templates
    flowId1 = MAIN_FLOW+'1' 
    flowId2 = MAIN_FLOW+'2'
    flowId3 = MAIN_FLOW+'3'
        
    # Template 1
    template1 = Template(rs) # Create template of main size. Front page only.
    # Show grid columns and margins if rootStyle.showGrid or rootStyle.showGridColumns are True
    template1.grid(rs) 
    # Show baseline grid if rs.showBaselineGrid is True
    template1.baselineGrid(rs)
    # Create empty image place holders. To be filled by running content on the page.
    template1.cContainer(4, 0, 2, 4, rs)  # Empty image element, cx, cy, cw, ch
    template1.cContainer(0, 5, 2, 3, rs)
    # Create linked text boxes. Note the "nextPage" to keep on the same page or to next.
    template1.cTextBox(FS, 0, 0, 2, 5, rs, flowId1, nextBox=flowId2, nextPage=0, fill=BOX_COLOR)
    template1.cTextBox(FS, 2, 0, 2, 8, rs, flowId2, nextBox=flowId3, nextPage=0, fill=BOX_COLOR)
    template1.cTextBox(FS, 4, 4, 2, 4, rs, flowId3, nextBox=flowId1, nextPage=1, fill=BOX_COLOR)
    # Create page number box. Pattern pageNumberMarker is replaced by actual page number.
    template1.cText(FS+rs['pageIdMarker'], 6, 0, style=rs, font=BOOK, fontSize=12, fill=BOX_COLOR)

    # Template 2
    template2 = Template(rs) # Create second template. This is for the main pages.
    # Show grid columns and margins if rootStyle.showGrid or rootStyle.showGridColumns are True
    template2.grid(rs) 
    # Show baseline grid if rs.showBaselineGrid is True
    template2.baselineGrid(rs)
    template2.cContainer(4, 0, 2, 3, rs)  # Empty image element, cx, cy, cw, ch
    template2.cContainer(0, 5, 2, 3, rs)
    template2.cContainer(2, 2, 2, 2, rs)
    template2.cContainer(2, 0, 2, 2, rs)
    template2.cContainer(4, 6, 2, 2, rs)
    template2.cTextBox(FS, 0, 0, 2, 5, rs, flowId1, nextBox=flowId2, nextPage=0, fill=BOX_COLOR)
    template2.cTextBox(FS, 2, 4, 2, 4, rs, flowId2, nextBox=flowId3, nextPage=0, fill=BOX_COLOR)
    template2.cTextBox(FS, 4, 3, 2, 3, rs, flowId3, nextBox=flowId1, nextPage=1, fill=BOX_COLOR)
    # Create page number box. Pattern pageNumberMarker is replaced by actual page number.
    template2.cText(FS+rs['pageIdMarker'], 6, 0, style=rs, font=BOOK, fontSize=12, fill=BOX_COLOR)
   
    # Create new document with (w,h) and fixed amount of pages.
    # Make number of pages with default document size.
    # Initially make all pages default with template2
    doc = Document(rs, autoPages=3, template=template2) 
 
    # Cache some values from the root style that we need multiple time to create the tag styles.
    fontSize = rs['fontSize']
    leading = rs['leading']
    rLeading = rs['rLeading']
    listIndent = rs['listIndent']
    language = rs['language']

    # Add styles for whole document and text flows.  
    # Note that some values are defined here for clarity, even if their default root values
    # are the same.             
    doc.newStyle(name='chapter', font=BOOK)    
    doc.newStyle(name='title', fontSize=3*fontSize, font=BOLD)
    doc.newStyle(name='subtitle', fontSize=2.6*fontSize, font=BOOK_ITALIC)
    doc.newStyle(name='author', fontSize=2*fontSize, font=BOOK, fill=(1, 0, 0))
    doc.newStyle(name='h1', fontSize=2*fontSize, font=BLACK, fill=(1, 0, 0), 
        leading=2.5*leading, tracking=H1_TRACK, postfix='\n')
    doc.newStyle(name='h2', fontSize=5*fontSize, font=LIGHT_CONDENSED, 
        fill=0, leading=1*leading, rLeading=0, tracking=H2_TRACK, 
        prefix='', postfix='\n')
    doc.newStyle(name='h3', fontSize=1.1*fontSize, font=MEDIUM, fill=0, 
        leading=leading, rLeading=0, rNeedsBelow=2*rLeading, tracking=H3_TRACK,
        prefix='', postfix='\n')
    doc.newStyle(name='h4', fontSize=1.1*fontSize, font=BOOK, fill=0, 
        leading=leading, rLeading=0, rNeedsBelow=2*rLeading, tracking=H3_TRACK,
        paragraphTopSpacing=U, paragraphBottomSpacing=U, prefix='', postfix='\n')
    
    # Spaced paragraphs.
    doc.newStyle(name='p', fontSize=fontSize, font=BOOK, fill=0.1, prefix='', postfix='\n',
        rTracking=P_TRACK, leading=14, rLeading=0, align=LEFT_ALIGN, hyphenation=True)
    doc.newStyle(name='b', font=SEMIBOLD)
    doc.newStyle(name='em', font=BOOK_ITALIC)
    doc.newStyle(name='hr', stroke=(1, 0, 0), strokeWidth=4)
    doc.newStyle(name='br', postfix='\n') # Simplest way to make <br/> show newline
    doc.newStyle(name='a', prefix='', postfix='')
    doc.newStyle(name='img', leading=leading, fontSize=fontSize, font=BOOK,
        stroke=1, fill=None)
    
    # Footnote reference index.
    doc.newStyle(name='sup', font=MEDIUM, rBaselineShift=0.6, prefix='', postfix=' ',
        fontSize=0.6*fontSize)
    doc.newStyle(name='li', fontSize=fontSize, font=BOOK, 
        tracking=P_TRACK, leading=leading, hyphenation=True, 
        # Lists need to copy the listIndex over to the regalar style value.
        tabs=[(listIndent, LEFT_ALIGN)], indent=listIndent, 
        firstLineIndent=1, postfix='\n')
    doc.newStyle(name='ul', prefix='', postfix='')
    doc.newStyle(name='literatureref', fill=0.5, rBaselineShift=0.2, fontSize=0.8*fontSize)
    doc.newStyle(name='footnote', fill=(1, 0, 0), fontSize=0.8*U, font=BOOK)
    doc.newStyle(name='caption', tracking=P_TRACK, language=language, fill=0.2, 
        leading=leading*0.8, fontSize=0.8*fontSize, font=BOOK_ITALIC, 
        indent=U/2, tailIndent=-U/2, hyphenation=True)
    
    # Change template of page 1
    page1 = doc[1]
    page1.setTemplate(template1)
    
    # Create main Galley for this page, for pasting the sequence of elements.    
    galley = Galley() 
    t = Typesetter(doc, galley)
    t.typesetFile(MD_PATH)
    
    # Fill the main flow of text boxes with the ML-->XHTML formatted text. 
    c = Composer(doc)
    c.compose(galley, page1, flowId1)
    
    return doc