def makeTemplate(self, rs): # Template for the main page. template = Template( ) # Create second template. This is for the main pages. # Add named text box to template for main specimen text. template.cTextBox('', 0, -1, 6, 1, eId=self.titleBoxId) template.cTextBox('', 0, 0, 6, 6, eId=self.specimenBoxId) # Some lines, positioned by vertical and horizontal column index. template.cLine(0, 0, 6, 0, stroke=0, strokeWidth=0.25) #template.cLine(0, 1, 6, 0, style=rs, stroke=0, strokeWidth=0.25) template.cLine(0, 7, 6, 0, stroke=0, strokeWidth=0.25) return template
def makeTemplate(self): # Generic conditions to build stacked elements page with full width. lw = 0.25 lineColor = 0 conditions = (Float2Top(), Left2Left(), Fit2Width()) # Template for the main page. template = Template( ) # Create second template. This is for the main pages. # Add named text box to template for main specimen text. newTextBox('', eId=self.titleBoxId, parent=template, conditions=conditions) # Some lines, positioned by vertical and horizontal column index. newLine(stroke=lineColor, strokeWidth=lw, parent=template, conditions=conditions) newTextBox('', eId=self.specimenBoxId, parent=template) newLine(stroke=lineColor, strokeWidth=lw, parent=template, conditions=conditions) newTextBox('', eId=self.infoBoxId, parent=template) newLine(stroke=lineColor, strokeWidth=lw, parent=template, conditions=conditions) return template
def makeDocument(): 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 flowId0 = MAIN_FLOW+'0' flowId1 = MAIN_FLOW+'1' flowId2 = MAIN_FLOW+'2' headlineId = 'headLine' # Template 2 template = Template(w=W, h=H) # Create second template. This is for the main pages. # Add image containers to the page, that images + captions, within the defined space. newColRect(4, 0, 2, 3, parent=template, ) # Empty image element, cx, cy, cw, ch newColRect(0, 5, 2, 3, parent=template, ) newColRect(2, 2, 2, 2, parent=template, ) newColRect(4, 6, 2, 2, parent=template, ) # In this simple example page, we won't have the headline run in the galley of the main text. # Create separate text box here to accommodate the headline. newColTextBox('', 0, 0, 4, 2, parent=template, eId=headlineId, fill=BOX_COLOR) # Make linked text box elemnents, where position and size is defined by columns. newColTextBox('', 0, 2, 2, 3, parent=template, eId=flowId0, nextBox=flowId1, nextPage=0, fill=BOX_COLOR) newColTextBox('', 2, 4, 2, 4, parent=template, eId=flowId1, nextBox=flowId2, nextPage=0, fill=BOX_COLOR) # Final column flow on the page does not link to next page. We want this demo one page only. newColTextBox('', 4, 3, 2, 3, parent=template, eId=flowId2, 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 template doc = Document(w=W, h=H, autoPages=2, template=template) # Change template of page 1 onePage = doc[0] # Create main Galley for this page, for pasting the sequence of elements. g = Galley() t = Typesetter(g, doc) """ blurbNames = (('h1', 'news_headline'), ('h2', 'article_ankeiler')) t.typesetFilibuster(blurbNames) c = Composer(doc) c.compose(g, onePage, headlineId) g = Galley() t = Typesetter(doc, g) blurbNames = (('h3', 'article_ankeiler'), ('h2', 'article_summary'), ('p', 'article')) t.typesetFilibuster(blurbNames) # Fill the main flow of text boxes with the ML-->XHTML formatted text. c = Composer(doc) c.compose(g, onePage, flowId0) """ return doc
def makeSpecimen(rs): # 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 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=template1) page1 = doc[1] vCube = VariationCube(FONT_PATH, w=500, h=500, s='a', fontSize=86, dimensions=dict(wght=4, rnds=4)) page1.place(vCube, 50, 160) font = getVariationFont(FONT_PATH, location=dict(wght=-0.5, rnds=2, diam=0.5)) page2 = doc[2] for n in range(600): page2.text( FormattedString('@', font=font, fontSize=800, fill=(random(), random(), random(), 0.8)), 50 + random() * 100, 200 + random() * 100) return doc
def makeSpecimen(rs): # 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 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=1, template=template1) page = doc[1] """ for (axis1, axis2), location in AXES_LOCATIONS: vCube = VariationCube(FONT_PATH, w=500, h=500, s='a', fontSize=86, dimensions={axis1:8, axis2:8}, location=location) page.place(vCube, 50, 160) page = doc.newPage() """ vMasterFont = TTFont(FONT_PATH) for c in ((0.2, 0, 0.5), (1, 0, 0), (0, 0.1, 0)): for ix in range(15): for iy in range(15): location = {'line': int(random()*1000), 'open': int(random()*1000), 'rndi': int(random()*1000), 'rndo': int(random()*1000), 'sqri': int(random()*1000), 'sqro': int(random()*1000), 'wght': int(random()*1000)} drawGlyphPath(vMasterFont, 'a', 50 + ix * 500/8, 50 + iy * 500/8, location=location, s=0.09, fillColor=c) #page = doc.newPage() return doc
def initializeTemplates(self, templates, defaultTemplate): u"""Initialize the document templates.""" self.templates = {} # Store defined dictionary of templates or empty dict. if templates is not None: for name, template in templates.items(): self.addTemplate(name, template) # Used as default document master template if undefined in pages. if isinstance(defaultTemplate, basestring): # Make reference to existing template by name defaultTemplate = self.templates.get(defaultTemplate) # If it exists, otherwise it is None if defaultTemplate is None: # Only if we have one, overwrite existing default template if it was there. # Make sure there is at least a default template. defaultTemplate = Template(w=self.w, h=self.h, name='default', padding=self.css('padding')) self.defaultTemplate = defaultTemplate
def makeSpecimen(rs): # 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) vCube = VariableCube(path=VAR_FONT_PATH, point=(50, 100), w=500, h=500, s='a', fontSize=86, dimensions=dict(wght=5, wdth=5)) template1.append(vCube) # 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=1, template=template1) return doc
def newTemplate(**kwargs): u"""In most cases views are initialized as dictionary by the Document class. But since they inherit from Element, they also can be used as placable elements. """ return Template(**kwargs)
def makeDocument(): 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() # Create new template newColTextBox(0, 0, w=W, h=H, fill=(1, 0, 0), parent=templateCover) # Placement of first <h1> in the Galley, holding the Thesis title. newColTextBox('Title of the page', 1, 1, 6, 5, eId=coverTitleId, fill=BOX_COLOR, parent=templateCover) # Placement of first <h4> in the Galley, holding the author name(s) newColTextBox('Subhead of the page', 1, 8, 6, 5, eId=coverAuthorId, fill=BOX_COLOR, parent=templateCover) # Template for Table of Content templateToc = Template() # Create template for Table of Content newColTextBox('\nTable of Content', 3, 0, 4, 1, fill=BOX_COLOR, fontSize=32, parent=templateToc) newColTextBox('', 3, 1, 4, 8, eId=tocId, fill=BOX_COLOR, parent=templateToc) # Template for literature reference index. templateLiteratureIndex = Template( ) # Create template for Table of Content newColTextBox('\nLiterature index', 3, 0, 4, 1, fill=BOX_COLOR, fontSize=32, parent=templateLiteratureIndex) newColTextBox('', 3, 1, 4, 8, eId=literatureIndexId, fill=BOX_COLOR, parent=templateLiteratureIndex) # Template for image reference index. templateImageIndex = Template() # Create template for Table of Content newColTextBox('\nImage index', 3, 0, 4, 1, fill=BOX_COLOR, fontSize=32, parent=templateImageIndex) newColTextBox('', 3, 1, 4, 8, eId=imageIndexId, fill=BOX_COLOR, parent=templateImageIndex) # Template 1 template1 = Template() # Create template of main size. Front page only. # 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. newColPlacer(0, 0, 3, 3, parent=template1) # Empty image element, cx, cy, cw, ch newColPlacer(0, 3, 3, 3, parent=template1) newColPlacer(0, 6, 3, 3, parent=template1) # Create linked text boxes. Note the "nextPage" to keep on the same page or to next. newColTextBox('ABC', 3, 0, 4, 9, eId=flowId1, nextBox=flowId1, nextPage=1, fill=BOX_COLOR, parent=template1) newColTextBox('', 3, 9, 3, 2, eId=footnotesId, fill=BOX_COLOR, parent=template1) # 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. newColTextBox(['pageIdMarker'], 6, 9, 1, 1, eId=pageNumberId, font=BOOK, fontSize=12, fill=BOX_COLOR, xAlign=RIGHT, parent=template1) # 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(autoPages=5, template=template1) rs = doc.getRootStyle() rs['openTypeFeatures'] = dict(zero=Slashed_Zero, smcp=Smallcaps, c2sc=Caps_As_Smallcaps, ss08=Italic_Shapes, ss07=Condensed, ss01=Extended_Ascenders, ss02=Extended_Capitals, ss03=Extended_Descenders, ss04=Contrast_Pixel, ss09=Alternative_g, onum=LC_Figures) # 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, style=dict(textFill=1, fontSize=80, font=MEDIUM, leading=84), # xPath='h1') gAuthor = Galley() t = Typesetter(doc, gAuthor) #t.typesetFile(MD_PATH, style=dict(textFill=1, fontSize=24, font=MEDIUM), # xPath='h4') # First one is the author coverPage = doc[1] coverPage.applyTemplate(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.applyTemplate(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
def makeTemplate(self, rs): hyphenation(False) # Template for the main page. template = Template( rs) # Create second template. This is for the main pages. # Show grid columns and paddings if rootStyle.showGrid or # rootStyle.showGridColumns are True. # The grid is just a regular element, like all others on the page. Same parameters apply. template.grid(rs) # Add named text box to template for main specimen text. template.cTextBox('', 0, 0, 6, 1, eId=self.titleBoxId, style=rs) template.cTextBox('', 1, 1, 5, 6, eId=self.specimenBoxId, style=rs) #template.cTextBox('', 0, 1, 2, 6, eId=self.infoBoxId, style=rs) # Some lines, positioned by vertical and horizontal column index. template.cLine(0, 0, 6, 0, style=rs, stroke=0, strokeWidth=0.25) template.cLine(0, 1, 6, 0, style=rs, stroke=0, strokeWidth=0.25) template.cLine(0, 7, 6, 0, style=rs, stroke=0, strokeWidth=0.25) return template
def makeTemplate(self, rs): # Template for the main page. template = Template( rs) # Create second template. This is for the main pages. return template
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
def initialize(self, padding=None, gutter=None, columns=None, **kwargs): u"""Initialize the generic book templates. """ blurb = Blurb() # TODO: Solve for left/right templates. if padding is None: padding = self.PADDING if gutter is None: gutter = self.GUTTER if columns is None: columns = self.COLUMNS fillColor1 = (0.2, 0.2, 0.9, 0.6) # Temp fill of markers. fillColor2 = (0.9, 0.2, 0.9, 0.6) # Temp fill of markers. fillColor3 = (0.9, 0.2, 0.3, 0.6) # Temp fill of markers. fillColor4 = (0.9, 0.9, 0.3, 0.6) # Temp fill of markers. fillColor1 = fillColor2 = fillColor3 = fillColor4 = None w, h = self.w, self.h cw = (w - 2 * padding - gutter * (columns - 1)) / columns cwg = cw + gutter lineW = 4 # Max amount of words return by the blurb generator. maxHeadline = 6 maxHeadlineShort = 4 maxAnkeiler = 30 fontPaths = getFontPaths() #for fontName, path in getFontPaths().items(): # if 'Escrow' in fontName: # print(fontName, path) #newspaperTitleFont = fontPaths['Escrow-Black'] #newspaperTitleFont = 'Proforma Book' newspaperTitleFont = 'Upgrade Semibold' h1Font = 'Upgrade Medium' bodyFont = 'Upgrade Book' titleStyle = dict(font=newspaperTitleFont, fontSize=140, w=(columns - 2) * cw, textFill=0) h1Style = dict(font=h1Font, fontSize=90, leading=90, textFill=0) h2Style = dict(font=h1Font, fontSize=60, leading=60, textFill=0) bodyStyle = dict(font=bodyFont, fontSize=14, hyphenation=True, leading=18, textFill=0, firstParagraphIndent=2 * gutter, firstLineIndent=gutter) h1IntroStyle = dict(font=bodyFont, fontSize=45, hyphenation=True, leading=52, textFill=0) h2IntroStyle = dict(font=bodyFont, fontSize=30, hyphenation=True, leading=36, textFill=0) titleLine = dict(strokeWidth=1, stroke=0) # grid-template-columns, grid-template-rows, grid-auto-rows, grid-column-gap, grid-row-gap, gridX = [] for n in range(columns): gridX.append([cw, gutter]) gridX[-1][-1] = 0 gridY = [(None, 0)] # Default is full height of columns # Template 'Front' t = Template(w=w, h=h, name='Front', padding=padding, gridX=gridX, gridY=gridY) # Newspaper name with border lines on top and bottom #self.title = 'NORTHAMPTON GLOBE' bs = self.view.newString(self.title.upper(), style=titleStyle) _, nameHeight = bs.size() title = Title(parent=t, mb=2 * gutter, h=nameHeight, conditions=[Top2Top(), Fit2Width()]) tb = newTextBox(bs, parent=title, h=nameHeight, xTextAlign=CENTER, pt=gutter, borderTop=titleLine, borderBottom=titleLine, conditions=[Fit2Width()]) # Place article 3 columns cc = 3 # Column width of this article. article = Article(parent=t, h=h / 3, w=cc * cwg - gutter, mr=gutter, mb=gutter, fill=fillColor1, conditions=[Left2Left(), Float2Top()]) s = None #'Happy birthday, Jill' headLine = self.getHeadline(s, h2Style, cnt=maxHeadline, w=cc * cwg - gutter) newTextBox(headLine, parent=article, w=cc * cwg - gutter, fill=fillColor2, conditions=[Left2Left(), Float2Top()]) intro = self.getAnkeiler(cnt=maxAnkeiler) bs = self.view.newString(intro, style=h2IntroStyle) newTextBox(bs, parent=article, w=cc * cwg - gutter, mt=gutter, mb=gutter, fill=fillColor3, conditions=[Left2Left(), Float2Top()]) for n in range(cc): dummyArticle = blurb.getBlurb('article', newLines=True) bs = self.view.newString(dummyArticle, style=bodyStyle) newTextBox(bs, parent=article, w=cw, mr=gutter, h=10, fill=fillColor4, conditions=[ Right2Right(), Float2Top(), Float2Left(), Fit2Bottom() ]) cc = 3 # Column width of this article. article = Article(parent=t, h=h / 4, w=cc * cwg - gutter, mr=gutter, mb=gutter, pt=gutter, borderTop=titleLine, conditions=[Left2Left(), Float2Top()]) s = None #'Explore Northampton in spring' headLine = self.getHeadline(s, h2Style, cnt=maxHeadline, w=cc * cwg - 2 * gutter) newTextBox(headLine, parent=article, pr=gutter, w=cc * cwg, conditions=[Left2Left(), Float2Top()]) intro = blurb.getBlurb('article_ankeiler', cnt=maxAnkeiler) bs = self.view.newString(intro, style=h2IntroStyle) newTextBox(bs, parent=article, pr=gutter, w=cc * cwg, mt=gutter, mb=gutter, conditions=[Left2Left(), Float2Top()]) for n in range(cc): dummyArticle = blurb.getBlurb('article', newLines=True) bs = self.view.newString(dummyArticle, style=bodyStyle) newTextBox(bs, parent=article, w=cw, mr=gutter, conditions=[ Left2RightSide(), Float2Top(), Float2Left(), Fit2Bottom() ]) cc = 3 # Column width of this article. article = Article(parent=t, h=h / 4, w=cc * cwg - gutter, mr=gutter, mb=gutter, pt=gutter, borderTop=titleLine, borderBottom=titleLine, conditions=[Left2Left(), Float2Top(), Fit2Bottom()]) s = None #'Mothersday for Sara & Jill' headLine = self.getHeadline(s, h2Style, cnt=maxHeadline, w=cc * cwg - 2 * gutter) newTextBox(headLine, parent=article, pr=gutter, w=cc * cwg, conditions=[Left2Left(), Float2Top()]) intro = self.getAnkeiler(cnt=maxAnkeiler) bs = self.view.newString(intro, style=h2IntroStyle) newTextBox(bs, parent=article, w=cc * cwg, mt=gutter, mb=gutter, conditions=[Left2Left(), Float2Top()]) for n in range(cc): dummyArticle = blurb.getBlurb('article', newLines=True) bs = self.view.newString(dummyArticle, style=bodyStyle) newTextBox(bs, parent=article, pr=gutter, w=cw, mr=gutter, conditions=[ Left2RightSide(), Float2Top(), Float2Left(), Fit2Bottom() ]) # Place article 4 columns with photo cc = 4 article = Article( parent=t, w=cc * cwg, h=h / 2, pr=gutter, conditions=[Right2RightSide(), Float2Top(), Float2Left()]) newRect(h=cc * cw * 2 / 3, mb=gutter, parent=article, fill=0.8, stroke=0, strokeWidth=0.5, conditions=[Left2Left(), Top2Top(), Fit2Width()]) s = None #'Petr & Claudia visiting soon' headLine = self.getHeadline(s, h1Style, cnt=5, w=cc * cwg - 2 * gutter) newTextBox(headLine, parent=article, pr=gutter, w=cc * cwg, pb=gutter, conditions=[Left2Left(), Float2Top(), Fit2Width()]) for n in range(cc): if n == 3: newRect(mb=gutter, parent=article, w=cw, fill=0.8, stroke=0, strokeWidth=0.5, conditions=[ Right2RightSide(), Float2Top(), Float2Left(), Fit2Bottom() ]) else: dummyArticle = blurb.getBlurb('article', newLines=True) bs = self.view.newString(dummyArticle, style=bodyStyle) newTextBox(bs, parent=article, pr=gutter, w=cw, mr=gutter, h=10, conditions=[ Right2Right(), Float2Top(), Float2Left(), Fit2Bottom() ]) cc = 2 # Column width of this article. article = Article(parent=t, w=cc * cwg, borderTop=titleLine, mb=gutter, borderBottom=titleLine, conditions=[ Right2Right(), Float2Top(), Float2Left(), Fit2Bottom() ]) s = None #'AirB&B stock up 450%' headLine = self.getHeadline(s, h2Style, cnt=maxHeadlineShort, w=cc * cwg - gutter) newTextBox(headLine, parent=article, pr=gutter, w=cc * cwg, pt=gutter, conditions=[Left2Left(), Float2Top()]) intro = self.getAnkeiler(cnt=maxAnkeiler) bs = self.view.newString(intro, style=h2IntroStyle) newTextBox(bs, parent=article, pr=gutter, w=cc * cwg, mt=gutter, mb=gutter, conditions=[Left2Left(), Float2Top()]) for n in range(cc): dummyArticle = blurb.getBlurb('article', newLines=True) bs = self.view.newString(dummyArticle, style=bodyStyle) newTextBox(bs, parent=article, pr=gutter, w=cwg, conditions=[ Left2RightSide(), Float2Top(), Float2Left(), Fit2Bottom() ]) cc = 2 # Column width of this article. article = Article(parent=t, w=cc * cwg, borderTop=titleLine, mb=gutter, borderBottom=titleLine, conditions=[ Right2RightSide(), Float2Top(), Float2Left(), Fit2Bottom() ]) s = None #u'Tay & Lan’s best moms' headLine = self.getHeadline(s, h2Style, cnt=maxHeadlineShort, w=cc * cwg - gutter) newTextBox(headLine, parent=article, pr=gutter, w=cc * cwg, pt=gutter, conditions=[Left2Left(), Float2Top()]) intro = self.getAnkeiler(cnt=maxAnkeiler) bs = self.view.newString(intro, style=h2IntroStyle) newTextBox(bs, parent=article, pr=gutter, w=cc * cwg - gutter, mr=gutter, mt=gutter, mb=gutter, conditions=[Left2Left(), Float2Top()]) newRect( mb=gutter, parent=article, h=200, maxH= MAX_HEIGHT, # TODO: Why need to set this, as r.maxH is 100 here. fill=0.8, stroke=0, strokeWidth=0.5, conditions=[Left2Left(), Float2Top(), Fit2Width()]) for n in range(cc): dummyArticle = blurb.getBlurb('article', newLines=True) bs = self.view.newString(dummyArticle, style=bodyStyle) newTextBox(bs, parent=article, pr=gutter, w=cwg, conditions=[ Left2RightSide(), Float2Top(), Float2Left(), Fit2Bottom() ]) self.addTemplate(t.name, t) # Template 'MainPage' t = Template(w=w, h=h, name='MainPage', padding=padding, gridX=gridX, gridY=gridY) for n in range(columns): if n == 0: cc = 3 headLine = self.getHeadline(None, h2Style, cnt=maxHeadline) newTextBox(headLine, parent=t, pr=gutter, w=cc * cwg, conditions=[Left2Left(), Float2Top()]) intro = self.getAnkeiler(cnt=maxAnkeiler) bs = self.view.newString(intro, style=h2IntroStyle) newTextBox(bs, parent=t, pr=gutter, w=cc * cwg, mt=gutter, mb=gutter, conditions=[Left2Left(), Float2Top()]) dummyArticle = blurb.getBlurb('article', newLines=True) bs = self.view.newString(dummyArticle, style=bodyStyle) newTextBox(bs, parent=t, pr=gutter, w=cw + gutter, z=0, conditions=[ Right2RightSide(), Float2Top(), Fit2Bottom(), Float2Left() ]) self.addTemplate(t.name, t)
def makeDocument(): u"""Demo page composer by templates.""" # 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() # Create template of main size. Front page only. # Create empty image place holders. To be filled by running content on the page. newColRect(4, 0, 2, 4, parent=template1) # Empty image element, cx, cy, cw, ch newColRect(0, 5, 2, 3, parent=template1) # Create linked text boxes. Note the "nextPage" to keep on the same page or to next. newColTextBox('', 0, 0, 2, 5, parent=template1, name=flowId1, nextElement=flowId2, nextPage=0, fill=BOX_COLOR) newColTextBox('', 2, 0, 2, 8, parent=template1, name=flowId2, nextElement=flowId3, nextPage=0, fill=BOX_COLOR) newColTextBox('', 4, 4, 2, 4, parent=template1, name=flowId3, nextElement=flowId1, nextPage=1, fill=BOX_COLOR) # Create page number box. Pattern pageNumberMarker is replaced by actual page number. pnString = context.newString('%d', style=dict(font=BOOK, fontSize=12, fill=BOX_COLOR)) newColText(pnString, 6, 0, parent=template1) """ # Template 2 template2 = Template(style=rs) # Create second template. This is for the main pages. 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=1, language=LANGUAGE, template=template1) # 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, textFill=(1, 0, 0)) doc.newStyle(name='h1', fontSize=2.6 * fontSize, font=SEMIBOLD_CONDENSED, textFill=0.2, leading=2.6 * fontSize, tracking=H1_TRACK, prefix='\n', postfix='\n', paragraphTopSpacing=U, paragraphBottomSpacing=U) doc.newStyle(name='h2', fontSize=2 * fontSize, font=LIGHT_CONDENSED, textFill=(1, 0, 0), leading=2.2 * leading, rLeading=0, tracking=H2_TRACK, prefix='', postfix='\n') doc.newStyle(name='h3', fontSize=1.1 * fontSize, font=MEDIUM, textFill=0, leading=1.4 * fontSize, rLeading=0, rNeedsBelow=2 * rLeading, tracking=H3_TRACK, prefix='', postfix='\n') # paragraphTopSpacing=U, paragraphBottomSpacing=U only work if there is a prefix/postfix doc.newStyle(name='h4', fontSize=1.1 * fontSize, font=BOOK, textFill=0, leading=leading, rLeading=0, rNeedsBelow=2 * rLeading, tracking=H3_TRACK, paragraphTopSpacing=U, paragraphBottomSpacing=U, prefix='\n', postfix='\n') # Spaced paragraphs. doc.newStyle(name='p', fontSize=fontSize, font=BOOK, textFill=0.1, prefix='', postfix='\n', rTracking=P_TRACK, leading=14, rLeading=0, xTextAlign=LEFT, 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)], indent=listIndent, firstLineIndent=1, prefix='', 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, tailIndent=-U / 2, hyphenation=True) # Change template of page 1 page1 = doc[0] page1.template = 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(makeNewPage=True) c.compose(galley, page1, flowId1) return doc