Skip to content

Commit 68682cc

Browse files
committed
implemented the objects, however still in a very crude way
1 parent 7571382 commit 68682cc

File tree

8 files changed

+96
-46
lines changed

8 files changed

+96
-46
lines changed

docx/document.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
from .enum.section import WD_SECTION
1313
from .enum.text import WD_BREAK
1414
from .section import Section, Sections
15-
from .shared import ElementProxy, Emu
15+
from docx.shared import ElementProxy, Emu
16+
from docx.text.bookmarks import Bookmark, Bookmarks
17+
from docx.oxml.xmlchemy import BaseOxmlElement, ZeroOrOne, ZeroOrMore
1618

1719

1820
class Document(ElementProxy):
@@ -27,15 +29,17 @@ def __init__(self, element, part):
2729
super(Document, self).__init__(element)
2830
self._part = part
2931
self.__body = None
30-
31-
def add_bookmark_start(self, name):
32-
paragraph = self.add_paragraph()
33-
return paragraph.add_bookmark_start(id, name)
3432

35-
def add_bookmark_end(self, name):
36-
id = 1
37-
paragraph = self.add_paragraph()
38-
return paragraph.add_bookmark_end(id)
33+
def bookmark(self):
34+
return Bookmarks(self._element.body)
35+
# def add_bookmark_start(self, name):
36+
# paragraph = self.add_paragraph()
37+
# return paragraph.add_bookmark_start(id, name)
38+
39+
# def add_bookmark_end(self, name):
40+
# id = 1
41+
# paragraph = self.add_paragraph()
42+
# return paragraph.add_bookmark_end(id)
3943

4044
def add_heading(self, text='', level=1):
4145
"""
@@ -210,6 +214,7 @@ class _Body(BlockItemContainer):
210214
Proxy for ``<w:body>`` element in this document, having primarily a
211215
container role.
212216
"""
217+
213218
def __init__(self, body_elm, parent):
214219
super(_Body, self).__init__(body_elm, parent)
215220
self._body = body_elm

docx/oxml/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
from __future__ import absolute_import
99

1010
from lxml import etree
11-
12-
from .ns import NamespacePrefixedTag, nsmap
13-
11+
from docx.oxml.ns import NamespacePrefixedTag, nsmap
1412

1513
# configure XML parser
1614
element_class_lookup = etree.ElementNamespaceClassLookup()
@@ -202,5 +200,5 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
202200
register_element_cls('w:t', CT_Text)
203201

204202
from .bookmark import CT_BookmarkStart, CT_BookmarkEnd
203+
register_element_cls('w:bookmarkEnd', CT_BookmarkEnd)
205204
register_element_cls('w:bookmarkStart', CT_BookmarkStart)
206-
register_element_cls('w:bookmarkEnd', CT_BookmarkEnd)

docx/oxml/bookmark.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,12 @@
33
Custom element classes for bookmarks
44
"""
55

6-
from __future__ import (
7-
absolute_import, division, print_function, unicode_literals
8-
)
6+
from __future__ import (absolute_import, division, print_function,
7+
unicode_literals)
98

10-
from . import parse_xml
11-
from .ns import nsdecls, qn
9+
from docx.oxml.simpletypes import ST_RelationshipId, ST_String
10+
from docx.oxml.xmlchemy import BaseOxmlElement, RequiredAttribute
1211

13-
from .xmlchemy import (BaseOxmlElement, OneOrMore,ZeroOrMore,
14-
RequiredAttribute, ZeroOrOne)
15-
16-
from .simpletypes import ST_RelationshipId, ST_String
17-
from docx.oxml import OxmlElement
1812

1913
class CT_BookmarkStart(BaseOxmlElement):
2014
"""
@@ -23,9 +17,9 @@ class CT_BookmarkStart(BaseOxmlElement):
2317
name = RequiredAttribute('w:name', ST_String)
2418
bmrk_id = RequiredAttribute('w:id', ST_RelationshipId)
2519

20+
2621
class CT_BookmarkEnd(BaseOxmlElement):
2722
"""
2823
The ``<w:bookmarkEnd>`` element
2924
"""
3025
bmrk_id = RequiredAttribute('w:id', ST_RelationshipId)
31-

docx/oxml/document.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
<w:document>.
66
"""
77

8-
from .xmlchemy import BaseOxmlElement, ZeroOrOne, ZeroOrMore
8+
from docx.oxml.xmlchemy import BaseOxmlElement, ZeroOrOne, ZeroOrMore
99

1010

1111
class CT_Document(BaseOxmlElement):
1212
"""
1313
``<w:document>`` element, the root element of a document.xml file.
1414
"""
1515
body = ZeroOrOne('w:body')
16-
16+
bookmarkStart = ZeroOrMore('w:bookmarkStart')
17+
bookmarkEnd = ZeroOrMore('w:bookmarkEnd')
1718
@property
1819
def sectPr_lst(self):
1920
"""
@@ -31,7 +32,9 @@ class CT_Body(BaseOxmlElement):
3132
p = ZeroOrMore('w:p', successors=('w:sectPr',))
3233
tbl = ZeroOrMore('w:tbl', successors=('w:sectPr',))
3334
sectPr = ZeroOrOne('w:sectPr', successors=())
34-
35+
bookmarkStart = ZeroOrMore('w:bookmarkStart')
36+
bookmarkEnd = ZeroOrMore('w:bookmarkEnd')
37+
3538
def add_section_break(self):
3639
"""
3740
Return the current ``<w:sectPr>`` element after adding a clone of it

docx/oxml/text/paragraph.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
Custom element classes related to paragraphs (CT_P).
55
"""
66

7-
from ..ns import qn
8-
from ..xmlchemy import BaseOxmlElement, OxmlElement, ZeroOrMore, ZeroOrOne
9-
from docx.oxml.bookmark import CT_BookmarkStart, CT_BookmarkEnd
7+
from docx.oxml.ns import qn
8+
from docx.oxml.xmlchemy import (BaseOxmlElement, OxmlElement, ZeroOrMore,
9+
ZeroOrOne)
10+
1011

1112
class CT_P(BaseOxmlElement):
1213
"""
@@ -16,7 +17,7 @@ class CT_P(BaseOxmlElement):
1617
r = ZeroOrMore('w:r')
1718
bookmarkStart = ZeroOrMore('w:bookmarkStart')
1819
bookmarkEnd = ZeroOrMore('w:bookmarkEnd')
19-
20+
2021
def _insert_pPr(self, pPr):
2122
self.insert(0, pPr)
2223
return pPr

docx/oxml/text/run.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class CT_R(BaseOxmlElement):
2929
cr = ZeroOrMore('w:cr')
3030
tab = ZeroOrMore('w:tab')
3131
drawing = ZeroOrMore('w:drawing')
32+
bookmarkStart = ZeroOrMore('w:bookmarkStart')
33+
bookmarkEnd = ZeroOrMore('w:bookmarkEnd')
3234

3335
def _insert_rPr(self, rPr):
3436
self.insert(0, rPr)

docx/text/bookmarks.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# encoding: utf-8
2+
3+
"""
4+
Bookmarks-related proxy types.
5+
"""
6+
7+
from __future__ import (
8+
absolute_import, division, print_function, unicode_literals
9+
)
10+
11+
from collections import Sequence
12+
from docx.oxml.bookmark import CT_BookmarkEnd, CT_BookmarkStart
13+
from docx.shared import ElementProxy
14+
15+
16+
class Bookmarks(Sequence):
17+
def __init__(self, document_elm):
18+
super(Bookmarks, self).__init__()
19+
self._document = self._element = document_elm
20+
21+
def __iter__(self):
22+
for bookmarkStart in self._bookmarkStarts:
23+
yield Bookmark(bookmarkStart)
24+
25+
def __getitem__(self, idx):
26+
bookmarkStart = self._bookmarkStarts[idx]
27+
return Bookmark(bookmarkStart)
28+
29+
def __len__(self):
30+
return len(self._bookmarkStarts)
31+
32+
def get(self, name, default=None):
33+
for bookmarkStart in self._bookmarkStarts:
34+
if bookmarkStart.name == name:
35+
return Bookmark(bookmarkStart)
36+
return default
37+
38+
def add_bookmark(self):
39+
return Bookmark(self._element)
40+
41+
@property
42+
def _bookmarkStarts(self):
43+
return self._document.xpath('.//w:bookmarkStart')
44+
45+
46+
class Bookmark(ElementProxy):
47+
def __init__(self, doc_element):
48+
super(Bookmark, self).__init__(doc_element)
49+
self._element = doc_element
50+
51+
def add_bookmark_start(self, id, name):
52+
bmrk = self._element._add_bookmarkStart()
53+
bmrk.name = name
54+
bmrk.bmrk_id = str(id)
55+
return self._element.append(bmrk)
56+
57+
def add_bookmark_end(self, id):
58+
bmrk = self._element._add_bookmarkEnd()
59+
bmrk.bmrk_id = str(1)
60+
return self._element.append(bmrk)

docx/text/paragraph.py

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,16 @@
1313
from .run import Run
1414
from ..shared import Parented
1515

16-
from docx.shared import ElementProxy
17-
from docx.oxml.bookmark import CT_BookmarkStart, CT_BookmarkEnd
1816

1917
class Paragraph(Parented):
2018
"""
2119
Proxy object wrapping ``<w:p>`` element.
2220
"""
21+
2322
def __init__(self, p, parent):
2423
super(Paragraph, self).__init__(parent)
2524
self._p = self._element = p
26-
27-
def add_bookmark_start(self, id, name):
28-
29-
bmrk = self._p._add_bookmarkStart()
30-
bmrk.name = name
31-
bmrk.bmrk_id = str(id)
32-
return self._p.append(bmrk)
33-
34-
def add_bookmark_end(self, id):
35-
bmrk = self._p._add_bookmarkEnd()
36-
bmrk.bmrk_id =str(1)
37-
return self._p.append(bmrk)
38-
25+
3926
def add_run(self, text=None, style=None):
4027
"""
4128
Append a run to this paragraph containing *text* and having character

0 commit comments

Comments
 (0)