Merge pull request #168 from mx2048/master

Added `PAGE_BREAK` feature
This commit is contained in:
Eric Lapouyade 2019-01-02 10:35:57 +01:00 committed by GitHub
commit e6b7b58c92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 11 deletions

View File

@ -189,12 +189,12 @@ especially ``<``, ``>`` and ``&``. In order to use them, you must escape them. T
* ``context = { 'var':escape('my text')}`` and ``{{ <var> }}`` in the template. * ``context = { 'var':escape('my text')}`` and ``{{ <var> }}`` in the template.
* enable autoescaping when calling render method: ``tpl.render(context, autoescape=True)`` (default is autoescape=False) * enable autoescaping when calling render method: ``tpl.render(context, autoescape=True)`` (default is autoescape=False)
The ``RichText()`` or ``R()`` offers newline and new paragraph feature : just use ``\n`` or ``\a`` in the The ``RichText()`` or ``R()`` offers newline, new paragraph, and page break features : just use ``\n``, ``\a``, or ``\f`` in the
text, they will be converted accordingly. text, they will be converted accordingly.
See tests/escape.py example for more informations. See tests/escape.py example for more informations.
Another solution, if you want to include a listing into your document, that is to escape the text and manage \n and \a, Another solution, if you want to include a listing into your document, that is to escape the text and manage \n, \a, and \f
you can use the ``Listing`` class : you can use the ``Listing`` class :
in your python code :: in your python code ::

View File

@ -32,6 +32,8 @@ import zipfile
NEWLINE_XML = '</w:t><w:br/><w:t xml:space="preserve">' NEWLINE_XML = '</w:t><w:br/><w:t xml:space="preserve">'
NEWPARAGRAPH_XML = '</w:t></w:r></w:p><w:p><w:r><w:t xml:space="preserve">' NEWPARAGRAPH_XML = '</w:t></w:r></w:p><w:p><w:r><w:t xml:space="preserve">'
TAB_XML = '</w:t></w:r><w:r><w:tab/></w:r><w:r><w:t xml:space="preserve">' TAB_XML = '</w:t></w:r><w:r><w:tab/></w:r><w:r><w:t xml:space="preserve">'
PAGE_BREAK = '</w:t><w:br w:type="page"/><w:t xml:space="preserve">'
class DocxTemplate(object): class DocxTemplate(object):
""" Class for managing docx files as they were jinja2 templates """ """ Class for managing docx files as they were jinja2 templates """
@ -582,6 +584,7 @@ class Subdoc(object):
def __html__(self): def __html__(self):
return self._get_xml() return self._get_xml()
class RichText(object): class RichText(object):
""" class to generate Rich Text when using templates variables """ class to generate Rich Text when using templates variables
@ -612,10 +615,11 @@ class RichText(object):
text = six.text_type(text) text = six.text_type(text)
if not isinstance(text, six.text_type): if not isinstance(text, six.text_type):
text = text.decode('utf-8',errors='ignore') text = text.decode('utf-8',errors='ignore')
text = ( escape(text) text = (escape(text)
.replace('\n', NEWLINE_XML) .replace('\n', NEWLINE_XML)
.replace('\a', NEWPARAGRAPH_XML) .replace('\a', NEWPARAGRAPH_XML)
.replace('\t',TAB_XML) ) .replace('\t', TAB_XML)
.replace('\f', PAGE_BREAK))
prop = u'' prop = u''
@ -670,8 +674,10 @@ class RichText(object):
def __html__(self): def __html__(self):
return self.xml return self.xml
R = RichText R = RichText
class Listing(object): class Listing(object):
r"""class to manage \n and \a without to use RichText, r"""class to manage \n and \a without to use RichText,
by this way you keep the current template styling by this way you keep the current template styling
@ -683,9 +689,11 @@ class Listing(object):
# If not a string : cast to string (ex: int, dict etc...) # If not a string : cast to string (ex: int, dict etc...)
if not isinstance(text, (six.text_type, six.binary_type)): if not isinstance(text, (six.text_type, six.binary_type)):
text = six.text_type(text) text = six.text_type(text)
self.xml = ( escape(text) self.xml = (escape(text)
.replace('\n', NEWLINE_XML) .replace('\n', NEWLINE_XML)
.replace('\a', NEWPARAGRAPH_XML) ) .replace('\a', NEWPARAGRAPH_XML)
.replace('\t', TAB_XML)
.replace('\f', PAGE_BREAK))
def __unicode__(self): def __unicode__(self):
return self.xml return self.xml

View File

@ -3,9 +3,10 @@ from docxtpl import *
tpl = DocxTemplate('templates/escape_tpl.docx') tpl = DocxTemplate('templates/escape_tpl.docx')
context = {'myvar': R('"less than" must be escaped : <, this can be done with RichText() or R()'), context = {'myvar': R('"less than" must be escaped : <, this can be done with RichText() or R()'),
'myescvar':'It can be escaped with a "|e" jinja filter in the template too : < ', 'myescvar': 'It can be escaped with a "|e" jinja filter in the template too : < ',
'nlnp' : R('Here is a multiple\nlines\nstring\aand some\aother\aparagraphs\aNOTE: the current character styling is removed'), 'nlnp': R('Here is a multiple\nlines\nstring\aand some\aother\aparagraphs\aNOTE: the current character styling is removed'),
'mylisting': Listing('the listing\nwith\nsome\nlines\nand special chars : <>&'), 'mylisting': Listing('the listing\nwith\nsome\nlines\nand special chars : <>&'),
'page_break': R('\f'),
} }
tpl.render(context) tpl.render(context)

Binary file not shown.