From 0e539de488ab24d6dfd2e3e5d9b4cd489c365c60 Mon Sep 17 00:00:00 2001 From: aorsten Date: Sat, 20 Jan 2018 12:40:11 +0100 Subject: [PATCH 1/3] Able to get drawings from run. --- docx/text/run.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docx/text/run.py b/docx/text/run.py index 97d6da7db..27c115df1 100644 --- a/docx/text/run.py +++ b/docx/text/run.py @@ -181,6 +181,14 @@ def underline(self): def underline(self, value): self.font.underline = value + @property + def drawings(self): + """ + ORSTEN added. + Retrieve drawings from _r. + """ + return self._r.drawing_lst + class _Text(object): """ From ccfc076eedb2293e9a7e67db7ff669573c4a78e2 Mon Sep 17 00:00:00 2001 From: aorsten Date: Sat, 20 Jan 2018 12:40:44 +0100 Subject: [PATCH 2/3] Able to get elements from body --- docx/document.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docx/document.py b/docx/document.py index ba94a7990..c63946eb1 100644 --- a/docx/document.py +++ b/docx/document.py @@ -195,6 +195,13 @@ def _body(self): self.__body = _Body(self._element.body, self) return self.__body + def get_elements(self): + """ + ORSTEN added. + Return elements from body. + """ + return self._body._element + class _Body(BlockItemContainer): """ From 46b7c8d6a1c4aafb9d5714ea624f46162f90a323 Mon Sep 17 00:00:00 2001 From: aorsten Date: Sat, 20 Jan 2018 12:41:01 +0100 Subject: [PATCH 3/3] Added AbstractNum with properties plus some table properties --- docx/oxml/__init__.py | 19 ++++++++- docx/oxml/numbering.py | 88 ++++++++++++++++++++++++++++++++++++++++-- docx/oxml/table.py | 21 +++++++++- 3 files changed, 121 insertions(+), 7 deletions(-) diff --git a/docx/oxml/__init__.py b/docx/oxml/__init__.py index 528b1eac7..fb27dc8d4 100644 --- a/docx/oxml/__init__.py +++ b/docx/oxml/__init__.py @@ -75,9 +75,16 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None): register_element_cls('w:document', CT_Document) from .numbering import ( - CT_Num, CT_Numbering, CT_NumLvl, CT_NumPr + CT_AbstractNum, CT_AbstractNumLvl, CT_Num, CT_Numbering, CT_NumLvl, CT_NumPr ) register_element_cls('w:abstractNumId', CT_DecimalNumber) +register_element_cls('w:nsid', CT_String) +register_element_cls('w:multiLevelType',CT_String) +register_element_cls('w:lvl', CT_AbstractNumLvl) +register_element_cls('w:start', CT_DecimalNumber) +register_element_cls('w:numFmt', CT_String) +register_element_cls('w:abstractNum', CT_AbstractNum) + register_element_cls('w:ilvl', CT_DecimalNumber) register_element_cls('w:lvlOverride', CT_NumLvl) register_element_cls('w:num', CT_Num) @@ -128,7 +135,8 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None): register_element_cls('w:unhideWhenUsed', CT_OnOff) from .table import ( - CT_Row, CT_Tbl, CT_TblGrid, CT_TblGridCol, CT_TblLayoutType, CT_TblPr, + CT_Row, CT_Tbl, CT_TblGrid, CT_TblGridCol, CT_TblLayoutType, + CT_TblLook, CT_TblPr, CT_TblWidth, CT_Tc, CT_TcPr, CT_VMerge ) register_element_cls('w:bidiVisual', CT_OnOff) @@ -137,6 +145,7 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None): register_element_cls('w:tbl', CT_Tbl) register_element_cls('w:tblGrid', CT_TblGrid) register_element_cls('w:tblLayout', CT_TblLayoutType) +register_element_cls('w:tblLook', CT_TblLook) register_element_cls('w:tblPr', CT_TblPr) register_element_cls('w:tblStyle', CT_String) register_element_cls('w:tc', CT_Tc) @@ -144,6 +153,12 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None): register_element_cls('w:tcW', CT_TblWidth) register_element_cls('w:tr', CT_Row) register_element_cls('w:vMerge', CT_VMerge) +# register_element_cls('w:firstRow', CT_DecimalNumber) +# register_element_cls('w:lastRow', CT_DecimalNumber) +# register_element_cls('w:firstColumn',CT_DecimalNumber) +# register_element_cls('w:lastColumn', CT_DecimalNumber) +# register_element_cls('w:noHBand', CT_DecimalNumber) +# register_element_cls('w:noVBand', CT_DecimalNumber) from .text.font import ( CT_Color, CT_Fonts, CT_Highlight, CT_HpsMeasure, CT_RPr, CT_Underline, diff --git a/docx/oxml/numbering.py b/docx/oxml/numbering.py index aeedfa9a0..acc7cbf15 100644 --- a/docx/oxml/numbering.py +++ b/docx/oxml/numbering.py @@ -5,12 +5,47 @@ """ from . import OxmlElement -from .shared import CT_DecimalNumber +from .shared import CT_DecimalNumber, CT_String from .simpletypes import ST_DecimalNumber from .xmlchemy import ( BaseOxmlElement, OneAndOnlyOne, RequiredAttribute, ZeroOrMore, ZeroOrOne ) +class CT_AbstractNum(BaseOxmlElement): + """ + ```` element + """ + nsid = OneAndOnlyOne('w:nsid') + multiLevelType = OneAndOnlyOne('w:multiLevelType') + lvl = ZeroOrMore('w:lvl') + abstractNumId = RequiredAttribute('w:abstractNumId', ST_DecimalNumber) + +# def add_lvl(self, ilvl): +# """ +# Return a newly added CT_NumLvl () element having its +# ``ilvl`` attribute set to *ilvl*. +# """ +# return self._add_lvl(ilvl=ilvl) +# +# @classmethod +# def new(cls, abstract_num_id, nsid, multiLevelType): +# abstractNum = OxmlElement('w:abstractNum') +# abstractNum.abstractNumId = abstract_num_id +# +# #: Add nsid +# nsid = CT_String.new( +# 'w:nsid', nsid +# ) +# abstractNum.append(nsid) +# +# #: Add multiLevelType +# multiLevelType = CT_String.new( +# 'w:multiLevelType', multiLevelType +# ) +# abstractNum.append(multiLevelType) +# +# +# return abstractNum class CT_Num(BaseOxmlElement): """ @@ -22,12 +57,12 @@ class CT_Num(BaseOxmlElement): lvlOverride = ZeroOrMore('w:lvlOverride') numId = RequiredAttribute('w:numId', ST_DecimalNumber) - def add_lvlOverride(self, ilvl): + def add_lvlOverride(self, ilvl, start, numFmt): """ Return a newly added CT_NumLvl () element having its ``ilvl`` attribute set to *ilvl*. """ - return self._add_lvlOverride(ilvl=ilvl) + return self._add_lvlOverride(ilvl=ilvl, start=start, numFmt=numFmt) @classmethod def new(cls, num_id, abstractNum_id): @@ -44,6 +79,35 @@ def new(cls, num_id, abstractNum_id): num.append(abstractNumId) return num +class CT_AbstractNumLvl(BaseOxmlElement): + """ + ```` element, which identifies a level in a list + definition with settings it contains. + """ + start = OneAndOnlyOne('w:start') + numFmt = OneAndOnlyOne('w:numFmt') + ilvl = RequiredAttribute('w:ilvl', ST_DecimalNumber) + +# def add_start(self, start, numFmt): +# return self._add_lvl(start=start, numFmt=numFmt) +# @classmethod +# def new(cls, ilvl, start, numFmt): +# """ +# Return a new ```` element having numId of *num_id* and having +# a ```` child with val attribute set to +# *abstractNum_id*. +# """ +# lvl = OxmlElement('w:lvl') +# lvl.ilvl = ilvl +# start = CT_DecimalNumber.new( +# 'w:start', start +# ) +# lvl.append(start) +# numFmt = CT_String.new( +# 'w:numFmt', numFmt +# ) +# lvl.append(numFmt) +# return lvl class CT_NumLvl(BaseOxmlElement): """ @@ -94,6 +158,7 @@ class CT_Numbering(BaseOxmlElement): ```` element, the root element of a numbering part, i.e. numbering.xml """ + abstractNum = ZeroOrMore('w:abstractNum', successors=('w:num',)) num = ZeroOrMore('w:num', successors=('w:numIdMacAtCleanup',)) def add_num(self, abstractNum_id): @@ -105,6 +170,15 @@ def add_num(self, abstractNum_id): num = CT_Num.new(next_num_id, abstractNum_id) return self._insert_num(num) +# def add_abstractNum(self, nsid, multiLevelType): +# """ +# Return a newly added CT_AbstractNum () element referencing the +# abstract numbering definition identified by *abstractNum_id*. +# """ +# next_abstract_num_id = self._next_abstractNumId +# abstractNum = CT_AbstractNum.new(next_abstract_num_id, nsid, multiLevelType) +# return self._insert_abstractNum(abstractNum) + def num_having_numId(self, numId): """ Return the ```` child element having ``numId`` attribute @@ -129,3 +203,11 @@ def _next_numId(self): if num not in num_ids: break return num +# @property +# def _next_abstractNumId(self): +# numId_strs = self.xpath('./w:abstractNum/@w:abstractNumId') +# num_ids = [int(numId_str) for numId_str in numId_strs] +# for num in range(1, len(num_ids)+2): +# if num not in num_ids: +# break +# return num diff --git a/docx/oxml/table.py b/docx/oxml/table.py index 24d91690e..f1e86df1e 100644 --- a/docx/oxml/table.py +++ b/docx/oxml/table.py @@ -13,7 +13,7 @@ from .ns import nsdecls, qn from ..shared import Emu, Twips from .simpletypes import ( - ST_Merge, ST_TblLayoutType, ST_TblWidth, ST_TwipsMeasure, XsdInt + ST_DecimalNumber, ST_Merge, ST_TblLayoutType, ST_TblWidth, ST_TwipsMeasure, XsdInt ) from .xmlchemy import ( BaseOxmlElement, OneAndOnlyOne, OneOrMore, OptionalAttribute, @@ -226,6 +226,22 @@ class CT_TblLayoutType(BaseOxmlElement): """ type = OptionalAttribute('w:type', ST_TblLayoutType) +class CT_TblLook(BaseOxmlElement): + """ + ```` element, containing info on table formatting. + """ + firstRow = OptionalAttribute('w:firstRow', ST_DecimalNumber) + lastRow = OptionalAttribute('w:lastRow', ST_DecimalNumber) + firstColumn = OptionalAttribute('w:firstColumn', ST_DecimalNumber) + lastColumn = OptionalAttribute('w:lastColumn', ST_DecimalNumber) + noHBand = OptionalAttribute('w:noHBand', ST_DecimalNumber) + noVBand = OptionalAttribute('w:noVBand', ST_DecimalNumber) +# firstRow = OneAndOnlyOne('w:firstRow') +# lastRow = OneAndOnlyOne('w:lastRow') +# firstColumn = OneAndOnlyOne('w:firstColumn') +# lastColumn = OneAndOnlyOne('w:lastColumn') +# noHBand = OneAndOnlyOne('w:noHBand') +# noVBand = OneAndOnlyOne('w:noVBand') class CT_TblPr(BaseOxmlElement): """ @@ -242,7 +258,8 @@ class CT_TblPr(BaseOxmlElement): tblStyle = ZeroOrOne('w:tblStyle', successors=_tag_seq[1:]) bidiVisual = ZeroOrOne('w:bidiVisual', successors=_tag_seq[4:]) jc = ZeroOrOne('w:jc', successors=_tag_seq[8:]) - tblLayout = ZeroOrOne('w:tblLayout', successors=_tag_seq[13:]) + tblLayout = ZeroOrOne('w:tblLayout', successors=_tag_seq[13]) + tblLook = ZeroOrOne('w:tblLook', successors=_tag_seq[14:]) del _tag_seq @property