Skip to content

Commit c89674d

Browse files
author
Steve Canny
committed
text: support mixed text in existing methods
By using run.text = text instead of run.add_text() in text adding methods, the parsing logic to interpret newlines and tabs is invoked automatically.
1 parent 6a85cab commit c89674d

4 files changed

Lines changed: 35 additions & 27 deletions

File tree

docs/dev/analysis/schema/ct_p.rst

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@ Schema excerpt
3434

3535
<xsd:group name="EG_PContent"> <!-- denormalized -->
3636
<xsd:choice>
37-
<xsd:element name="customXml" type="CT_CustomXmlRun"/>
38-
<xsd:element name="smartTag" type="CT_SmartTagRun"/>
39-
<xsd:element name="sdt" type="CT_SdtRun"/>
40-
<xsd:element name="dir" type="CT_DirContentRun"/>
41-
<xsd:element name="bdo" type="CT_BdoContentRun"/>
42-
<xsd:element name="r" type="CT_R"/>
43-
<xsd:group ref="EG_RunLevelElts" minOccurs="0" maxOccurs="unbounded"/>
44-
<xsd:element name="fldSimple" type="CT_SimpleField"/>
45-
<xsd:element name="hyperlink" type="CT_Hyperlink"/>
46-
<xsd:element name="subDoc" type="CT_Rel"/>
37+
<xsd:element name="r" type="CT_R"/>
38+
<xsd:element name="hyperlink" type="CT_Hyperlink"/>
39+
<xsd:element name="fldSimple" type="CT_SimpleField"/>
40+
<xsd:element name="sdt" type="CT_SdtRun"/>
41+
<xsd:element name="customXml" type="CT_CustomXmlRun"/>
42+
<xsd:element name="smartTag" type="CT_SmartTagRun"/>
43+
<xsd:element name="dir" type="CT_DirContentRun"/>
44+
<xsd:element name="bdo" type="CT_BdoContentRun"/>
45+
<xsd:element name="subDoc" type="CT_Rel"/>
46+
<xsd:group ref="EG_RunLevelElts"/>
4747
</xsd:choice>
4848
</xsd:group>
4949

@@ -88,38 +88,38 @@ Schema excerpt
8888

8989
<xsd:group name="EG_RunInnerContent">
9090
<xsd:choice>
91-
<xsd:element name="br" type="CT_Br"/>
9291
<xsd:element name="t" type="CT_Text"/>
92+
<xsd:element name="tab" type="CT_Empty"/>
93+
<xsd:element name="br" type="CT_Br"/>
94+
<xsd:element name="cr" type="CT_Empty"/>
95+
<xsd:element name="sym" type="CT_Sym"/>
96+
<xsd:element name="ptab" type="CT_PTab"/>
97+
<xsd:element name="softHyphen" type="CT_Empty"/>
9398
<xsd:element name="contentPart" type="CT_Rel"/>
94-
<xsd:element name="delText" type="CT_Text"/>
95-
<xsd:element name="instrText" type="CT_Text"/>
96-
<xsd:element name="delInstrText" type="CT_Text"/>
9799
<xsd:element name="noBreakHyphen" type="CT_Empty"/>
98-
<xsd:element name="softHyphen" type="CT_Empty"/>
100+
<xsd:element name="fldChar" type="CT_FldChar"/>
101+
<xsd:element name="instrText" type="CT_Text"/>
99102
<xsd:element name="dayShort" type="CT_Empty"/>
100103
<xsd:element name="monthShort" type="CT_Empty"/>
101104
<xsd:element name="yearShort" type="CT_Empty"/>
102105
<xsd:element name="dayLong" type="CT_Empty"/>
103106
<xsd:element name="monthLong" type="CT_Empty"/>
104107
<xsd:element name="yearLong" type="CT_Empty"/>
105108
<xsd:element name="annotationRef" type="CT_Empty"/>
109+
<xsd:element name="footnoteReference" type="CT_FtnEdnRef"/>
106110
<xsd:element name="footnoteRef" type="CT_Empty"/>
111+
<xsd:element name="endnoteReference" type="CT_FtnEdnRef"/>
107112
<xsd:element name="endnoteRef" type="CT_Empty"/>
113+
<xsd:element name="commentReference" type="CT_Markup"/>
108114
<xsd:element name="separator" type="CT_Empty"/>
109115
<xsd:element name="continuationSeparator" type="CT_Empty"/>
110-
<xsd:element name="sym" type="CT_Sym" />
111116
<xsd:element name="pgNum" type="CT_Empty"/>
112-
<xsd:element name="cr" type="CT_Empty"/>
113-
<xsd:element name="tab" type="CT_Empty"/>
114117
<xsd:element name="object" type="CT_Object"/>
115118
<xsd:element name="pict" type="CT_Picture"/>
116-
<xsd:element name="fldChar" type="CT_FldChar"/>
117119
<xsd:element name="ruby" type="CT_Ruby"/>
118-
<xsd:element name="footnoteReference" type="CT_FtnEdnRef"/>
119-
<xsd:element name="endnoteReference" type="CT_FtnEdnRef"/>
120-
<xsd:element name="commentReference" type="CT_Markup"/>
121120
<xsd:element name="drawing" type="CT_Drawing"/>
122-
<xsd:element name="ptab" type="CT_PTab"/>
121+
<xsd:element name="delText" type="CT_Text"/>
122+
<xsd:element name="delInstrText" type="CT_Text"/>
123123
<xsd:element name="lastRenderedPageBreak" type="CT_Empty"/>
124124
</xsd:choice>
125125
</xsd:group>

docx/api.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ def add_page_break(self):
6363
def add_paragraph(self, text='', style=None):
6464
"""
6565
Return a paragraph newly added to the end of the document, populated
66-
with *text* and having paragraph style *style*.
66+
with *text* and having paragraph style *style*. *text* can contain
67+
tab (``\\t``) characters, which are converted to the appropriate XML
68+
form for a tab. *text* can also include newline (``\\n``) or carriage
69+
return (``\\r``) characters, each of which is converted to a line
70+
break.
6771
"""
6872
paragraph = self._document_part.add_paragraph()
6973
if text:

docx/table.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def text(self, text):
112112
tc.clear_content()
113113
p = tc.add_p()
114114
r = p.add_r()
115-
r.add_t(text)
115+
r.text = text
116116

117117

118118
class _Column(object):

docx/text.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,16 @@ def __init__(self, p):
6161
def add_run(self, text=None, style=None):
6262
"""
6363
Append a run to this paragraph containing *text* and having character
64-
style identified by style ID *style*.
64+
style identified by style ID *style*. *text* can contain tab
65+
(``\\t``) characters, which are converted to the appropriate XML form
66+
for a tab. *text* can also include newline (``\\n``) or carriage
67+
return (``\\r``) characters, each of which is converted to a line
68+
break.
6569
"""
6670
r = self._p.add_r()
6771
run = Run(r)
6872
if text:
69-
run.add_text(text)
73+
run.text = text
7074
if style:
7175
run.style = style
7276
return run

0 commit comments

Comments
 (0)