python-docx-oss 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. docx/__init__.py +71 -0
  2. docx/api.py +37 -0
  3. docx/blkcntnr.py +101 -0
  4. docx/comments.py +163 -0
  5. docx/dml/__init__.py +0 -0
  6. docx/dml/color.py +112 -0
  7. docx/document.py +285 -0
  8. docx/drawing/__init__.py +59 -0
  9. docx/enum/__init__.py +0 -0
  10. docx/enum/base.py +150 -0
  11. docx/enum/dml.py +103 -0
  12. docx/enum/section.py +86 -0
  13. docx/enum/shape.py +19 -0
  14. docx/enum/style.py +452 -0
  15. docx/enum/table.py +136 -0
  16. docx/enum/text.py +367 -0
  17. docx/exceptions.py +18 -0
  18. docx/image/__init__.py +32 -0
  19. docx/image/bmp.py +43 -0
  20. docx/image/constants.py +172 -0
  21. docx/image/emf.py +46 -0
  22. docx/image/exceptions.py +13 -0
  23. docx/image/gif.py +38 -0
  24. docx/image/helpers.py +86 -0
  25. docx/image/image.py +237 -0
  26. docx/image/jpeg.py +469 -0
  27. docx/image/png.py +253 -0
  28. docx/image/svg.py +118 -0
  29. docx/image/tiff.py +289 -0
  30. docx/opc/__init__.py +0 -0
  31. docx/opc/constants.py +307 -0
  32. docx/opc/coreprops.py +142 -0
  33. docx/opc/customprops.py +59 -0
  34. docx/opc/exceptions.py +12 -0
  35. docx/opc/oxml.py +247 -0
  36. docx/opc/package.py +254 -0
  37. docx/opc/packuri.py +109 -0
  38. docx/opc/part.py +267 -0
  39. docx/opc/parts/__init__.py +0 -0
  40. docx/opc/parts/coreprops.py +48 -0
  41. docx/opc/parts/customprops.py +61 -0
  42. docx/opc/phys_pkg.py +119 -0
  43. docx/opc/pkgreader.py +254 -0
  44. docx/opc/pkgwriter.py +115 -0
  45. docx/opc/rel.py +169 -0
  46. docx/opc/shared.py +31 -0
  47. docx/opc/spec.py +24 -0
  48. docx/oxml/__init__.py +252 -0
  49. docx/oxml/comments.py +124 -0
  50. docx/oxml/coreprops.py +298 -0
  51. docx/oxml/customprops.py +141 -0
  52. docx/oxml/dml/CT_ExtensionList.py +48 -0
  53. docx/oxml/document.py +88 -0
  54. docx/oxml/drawing.py +11 -0
  55. docx/oxml/exceptions.py +10 -0
  56. docx/oxml/ns.py +111 -0
  57. docx/oxml/numbering.py +109 -0
  58. docx/oxml/parser.py +62 -0
  59. docx/oxml/section.py +537 -0
  60. docx/oxml/settings.py +138 -0
  61. docx/oxml/shape.py +426 -0
  62. docx/oxml/shared.py +52 -0
  63. docx/oxml/simpletypes.py +434 -0
  64. docx/oxml/styles.py +320 -0
  65. docx/oxml/table.py +977 -0
  66. docx/oxml/text/__init__.py +0 -0
  67. docx/oxml/text/font.py +358 -0
  68. docx/oxml/text/hyperlink.py +45 -0
  69. docx/oxml/text/pagebreak.py +278 -0
  70. docx/oxml/text/paragraph.py +106 -0
  71. docx/oxml/text/parfmt.py +392 -0
  72. docx/oxml/text/run.py +316 -0
  73. docx/oxml/xmlchemy.py +711 -0
  74. docx/package.py +119 -0
  75. docx/parts/__init__.py +0 -0
  76. docx/parts/comments.py +51 -0
  77. docx/parts/customxml.py +67 -0
  78. docx/parts/document.py +193 -0
  79. docx/parts/hdrftr.py +53 -0
  80. docx/parts/image.py +80 -0
  81. docx/parts/numbering.py +51 -0
  82. docx/parts/settings.py +50 -0
  83. docx/parts/story.py +113 -0
  84. docx/parts/styles.py +42 -0
  85. docx/py.typed +0 -0
  86. docx/section.py +479 -0
  87. docx/settings.py +35 -0
  88. docx/shape.py +103 -0
  89. docx/shared.py +382 -0
  90. docx/styles/__init__.py +40 -0
  91. docx/styles/latent.py +198 -0
  92. docx/styles/style.py +254 -0
  93. docx/styles/styles.py +136 -0
  94. docx/table.py +537 -0
  95. docx/templates/default-comments.xml +12 -0
  96. docx/templates/default-docx-template/[Content_Types].xml +17 -0
  97. docx/templates/default-docx-template/_rels/.rels +7 -0
  98. docx/templates/default-docx-template/customXml/_rels/item1.xml.rels +4 -0
  99. docx/templates/default-docx-template/customXml/item1.xml +2 -0
  100. docx/templates/default-docx-template/customXml/itemProps1.xml +6 -0
  101. docx/templates/default-docx-template/docProps/app.xml +36 -0
  102. docx/templates/default-docx-template/docProps/core.xml +13 -0
  103. docx/templates/default-docx-template/docProps/thumbnail.jpeg +0 -0
  104. docx/templates/default-docx-template/word/_rels/document.xml.rels +11 -0
  105. docx/templates/default-docx-template/word/document.xml +11 -0
  106. docx/templates/default-docx-template/word/fontTable.xml +61 -0
  107. docx/templates/default-docx-template/word/numbering.xml +201 -0
  108. docx/templates/default-docx-template/word/settings.xml +53 -0
  109. docx/templates/default-docx-template/word/styles.xml +11844 -0
  110. docx/templates/default-docx-template/word/stylesWithEffects.xml +11800 -0
  111. docx/templates/default-docx-template/word/theme/theme1.xml +318 -0
  112. docx/templates/default-docx-template/word/webSettings.xml +5 -0
  113. docx/templates/default-footer.xml +27 -0
  114. docx/templates/default-header.xml +27 -0
  115. docx/templates/default-numbering.xml +20 -0
  116. docx/templates/default-settings.xml +26 -0
  117. docx/templates/default-styles.xml +190 -0
  118. docx/templates/default.docx +0 -0
  119. docx/text/__init__.py +0 -0
  120. docx/text/font.py +466 -0
  121. docx/text/hyperlink.py +121 -0
  122. docx/text/pagebreak.py +104 -0
  123. docx/text/paragraph.py +173 -0
  124. docx/text/parfmt.py +286 -0
  125. docx/text/run.py +272 -0
  126. docx/text/tabstops.py +123 -0
  127. docx/types.py +34 -0
  128. python_docx_oss-0.1.0.dist-info/METADATA +57 -0
  129. python_docx_oss-0.1.0.dist-info/RECORD +132 -0
  130. python_docx_oss-0.1.0.dist-info/WHEEL +5 -0
  131. python_docx_oss-0.1.0.dist-info/licenses/LICENSE +21 -0
  132. python_docx_oss-0.1.0.dist-info/top_level.txt +1 -0
docx/text/run.py ADDED
@@ -0,0 +1,272 @@
1
+ """Run-related proxy objects for python-docx, Run in particular."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import IO, TYPE_CHECKING, Iterator, cast
6
+
7
+ from docx.drawing import Drawing
8
+ from docx.enum.style import WD_STYLE_TYPE
9
+ from docx.enum.text import WD_BREAK
10
+ from docx.oxml.drawing import CT_Drawing
11
+ from docx.oxml.text.pagebreak import CT_LastRenderedPageBreak
12
+ from docx.shape import InlineShape
13
+ from docx.shared import StoryChild
14
+ from docx.styles.style import CharacterStyle
15
+ from docx.text.font import Font
16
+ from docx.text.pagebreak import RenderedPageBreak
17
+
18
+ if TYPE_CHECKING:
19
+ import docx.types as t
20
+ from docx.enum.text import WD_UNDERLINE
21
+ from docx.oxml.text.run import CT_R, CT_Text
22
+ from docx.shared import Length
23
+
24
+
25
+ class Run(StoryChild):
26
+ """Proxy object wrapping `<w:r>` element.
27
+
28
+ Several of the properties on Run take a tri-state value, |True|, |False|, or |None|.
29
+ |True| and |False| correspond to on and off respectively. |None| indicates the
30
+ property is not specified directly on the run and its effective value is taken from
31
+ the style hierarchy.
32
+ """
33
+
34
+ def __init__(self, r: CT_R, parent: t.ProvidesStoryPart):
35
+ super().__init__(parent)
36
+ self._r = self._element = self.element = r
37
+
38
+ def add_break(self, break_type: WD_BREAK = WD_BREAK.LINE):
39
+ """Add a break element of `break_type` to this run.
40
+
41
+ `break_type` can take the values `WD_BREAK.LINE`, `WD_BREAK.PAGE`, and
42
+ `WD_BREAK.COLUMN` where `WD_BREAK` is imported from `docx.enum.text`.
43
+ `break_type` defaults to `WD_BREAK.LINE`.
44
+ """
45
+ type_, clear = {
46
+ WD_BREAK.LINE: (None, None),
47
+ WD_BREAK.PAGE: ("page", None),
48
+ WD_BREAK.COLUMN: ("column", None),
49
+ WD_BREAK.LINE_CLEAR_LEFT: ("textWrapping", "left"),
50
+ WD_BREAK.LINE_CLEAR_RIGHT: ("textWrapping", "right"),
51
+ WD_BREAK.LINE_CLEAR_ALL: ("textWrapping", "all"),
52
+ }[break_type]
53
+ br = self._r.add_br()
54
+ if type_ is not None:
55
+ br.type = type_
56
+ if clear is not None:
57
+ br.clear = clear
58
+
59
+ def add_picture(
60
+ self,
61
+ image_path_or_stream: str | IO[bytes],
62
+ width: int | Length | None = None,
63
+ height: int | Length | None = None,
64
+ ) -> InlineShape:
65
+ """Return |InlineShape| containing image identified by `image_path_or_stream`.
66
+
67
+ The picture is added to the end of this run.
68
+
69
+ `image_path_or_stream` can be a path (a string) or a file-like object containing
70
+ a binary image.
71
+
72
+ If neither width nor height is specified, the picture appears at
73
+ its native size. If only one is specified, it is used to compute a scaling
74
+ factor that is then applied to the unspecified dimension, preserving the aspect
75
+ ratio of the image. The native size of the picture is calculated using the dots-
76
+ per-inch (dpi) value specified in the image file, defaulting to 72 dpi if no
77
+ value is specified, as is often the case.
78
+ """
79
+ inline = self.part.new_pic_inline(image_path_or_stream, width, height)
80
+ self._r.add_drawing(inline)
81
+ return InlineShape(inline)
82
+
83
+ def add_float_picture(
84
+ self,
85
+ image_path_or_stream: str | IO[bytes],
86
+ width: int | Length | None = None,
87
+ height: int | Length | None = None,
88
+ pos_x: int | Length = 0,
89
+ pos_y: int | Length = 0,
90
+ ):
91
+ """Add float picture at fixed position `pos_x` and `pos_y` to the top-left
92
+ point of page.
93
+ """
94
+ anchor = self.part.new_pic_anchor(image_path_or_stream, width, height, pos_x, pos_y)
95
+ self._r.add_drawing(anchor)
96
+ return anchor
97
+
98
+ def add_tab(self) -> None:
99
+ """Add a ``<w:tab/>`` element at the end of the run, which Word interprets as a
100
+ tab character."""
101
+ self._r.add_tab()
102
+
103
+ def add_text(self, text: str):
104
+ """Returns a newly appended |_Text| object (corresponding to a new ``<w:t>``
105
+ child element) to the run, containing `text`.
106
+
107
+ Compare with the possibly more friendly approach of assigning text to the
108
+ :attr:`Run.text` property.
109
+ """
110
+ t = self._r.add_t(text)
111
+ return _Text(t)
112
+
113
+ @property
114
+ def bold(self) -> bool | None:
115
+ """Read/write tri-state value.
116
+
117
+ When |True|, causes the text of the run to appear in bold face. When |False|,
118
+ the text unconditionally appears non-bold. When |None| the bold setting for this
119
+ run is inherited from the style hierarchy.
120
+ """
121
+ return self.font.bold
122
+
123
+ @bold.setter
124
+ def bold(self, value: bool | None):
125
+ self.font.bold = value
126
+
127
+ def clear(self):
128
+ """Return reference to this run after removing all its content.
129
+
130
+ All run formatting is preserved.
131
+ """
132
+ self._r.clear_content()
133
+ return self
134
+
135
+ @property
136
+ def contains_page_break(self) -> bool:
137
+ """`True` when one or more rendered page-breaks occur in this run.
138
+
139
+ Note that "hard" page-breaks inserted by the author are not included. A hard
140
+ page-break gives rise to a rendered page-break in the right position so if those
141
+ were included that page-break would be "double-counted".
142
+
143
+ It would be very rare for multiple rendered page-breaks to occur in a single
144
+ run, but it is possible.
145
+ """
146
+ return bool(self._r.lastRenderedPageBreaks)
147
+
148
+ @property
149
+ def font(self) -> Font:
150
+ """The |Font| object providing access to the character formatting properties for
151
+ this run, such as font name and size."""
152
+ return Font(self._element)
153
+
154
+ @property
155
+ def italic(self) -> bool | None:
156
+ """Read/write tri-state value.
157
+
158
+ When |True|, causes the text of the run to appear in italics. When |False|, the
159
+ text unconditionally appears non-italic. When |None| the italic setting for this
160
+ run is inherited from the style hierarchy.
161
+ """
162
+ return self.font.italic
163
+
164
+ @italic.setter
165
+ def italic(self, value: bool | None):
166
+ self.font.italic = value
167
+
168
+ def iter_inner_content(self) -> Iterator[str | Drawing | RenderedPageBreak]:
169
+ """Generate the content-items in this run in the order they appear.
170
+
171
+ NOTE: only content-types currently supported by `python-docx` are generated. In
172
+ this version, that is text and rendered page-breaks. Drawing is included but
173
+ currently only provides access to its XML element (CT_Drawing) on its
174
+ `._drawing` attribute. `Drawing` attributes and methods may be expanded in
175
+ future releases.
176
+
177
+ There are a number of element-types that can appear inside a run, but most of
178
+ those (w:br, w:cr, w:noBreakHyphen, w:t, w:tab) have a clear plain-text
179
+ equivalent. Any contiguous range of such elements is generated as a single
180
+ `str`. Rendered page-break and drawing elements are generated individually. Any
181
+ other elements are ignored.
182
+ """
183
+ for item in self._r.inner_content_items:
184
+ if isinstance(item, str):
185
+ yield item
186
+ elif isinstance(item, CT_LastRenderedPageBreak):
187
+ yield RenderedPageBreak(item, self)
188
+ elif isinstance(item, CT_Drawing): # pyright: ignore[reportUnnecessaryIsInstance]
189
+ yield Drawing(item, self)
190
+
191
+ def mark_comment_range(self, last_run: Run, comment_id: int) -> None:
192
+ """Mark the range of runs from this run to `last_run` (inclusive) as belonging to a comment.
193
+
194
+ `comment_id` identfies the comment that references this range.
195
+ """
196
+ # -- insert `w:commentRangeStart` with `comment_id` before this (first) run --
197
+ self._r.insert_comment_range_start_above(comment_id)
198
+
199
+ # -- insert `w:commentRangeEnd` and `w:commentReference` run with `comment_id` after
200
+ # -- `last_run`
201
+ last_run._r.insert_comment_range_end_and_reference_below(comment_id)
202
+
203
+ @property
204
+ def style(self) -> CharacterStyle:
205
+ """Read/write.
206
+
207
+ A |CharacterStyle| object representing the character style applied to this run.
208
+ The default character style for the document (often `Default Character Font`) is
209
+ returned if the run has no directly-applied character style. Setting this
210
+ property to |None| removes any directly-applied character style.
211
+ """
212
+ style_id = self._r.style
213
+ return cast(CharacterStyle, self.part.get_style(style_id, WD_STYLE_TYPE.CHARACTER))
214
+
215
+ @style.setter
216
+ def style(self, style_or_name: str | CharacterStyle | None):
217
+ style_id = self.part.get_style_id(style_or_name, WD_STYLE_TYPE.CHARACTER)
218
+ self._r.style = style_id
219
+
220
+ @property
221
+ def text(self) -> str:
222
+ """String formed by concatenating the text equivalent of each run.
223
+
224
+ Each `<w:t>` element adds the text characters it contains. A `<w:tab/>` element
225
+ adds a `\\t` character. A `<w:cr/>` or `<w:br>` element each add a `\\n`
226
+ character. Note that a `<w:br>` element can indicate a page break or column
227
+ break as well as a line break. Only line-break `<w:br>` elements translate to
228
+ a `\\n` character. Others are ignored. All other content child elements, such as
229
+ `<w:drawing>`, are ignored.
230
+
231
+ Assigning text to this property has the reverse effect, translating each `\\t`
232
+ character to a `<w:tab/>` element and each `\\n` or `\\r` character to a
233
+ `<w:cr/>` element. Any existing run content is replaced. Run formatting is
234
+ preserved.
235
+ """
236
+ return self._r.text
237
+
238
+ @text.setter
239
+ def text(self, text: str):
240
+ self._r.text = text
241
+
242
+ @property
243
+ def underline(self) -> bool | WD_UNDERLINE | None:
244
+ """The underline style for this |Run|.
245
+
246
+ Value is one of |None|, |True|, |False|, or a member of :ref:`WdUnderline`.
247
+
248
+ A value of |None| indicates the run has no directly-applied underline value and
249
+ so will inherit the underline value of its containing paragraph. Assigning
250
+ |None| to this property removes any directly-applied underline value.
251
+
252
+ A value of |False| indicates a directly-applied setting of no underline,
253
+ overriding any inherited value.
254
+
255
+ A value of |True| indicates single underline.
256
+
257
+ The values from :ref:`WdUnderline` are used to specify other outline styles such
258
+ as double, wavy, and dotted.
259
+ """
260
+ return self.font.underline
261
+
262
+ @underline.setter
263
+ def underline(self, value: bool | WD_UNDERLINE | None):
264
+ self.font.underline = value
265
+
266
+
267
+ class _Text:
268
+ """Proxy object wrapping `<w:t>` element."""
269
+
270
+ def __init__(self, t_elm: CT_Text):
271
+ super(_Text, self).__init__()
272
+ self._t = t_elm
docx/text/tabstops.py ADDED
@@ -0,0 +1,123 @@
1
+ """Tabstop-related proxy types."""
2
+
3
+ from docx.enum.text import WD_TAB_ALIGNMENT, WD_TAB_LEADER
4
+ from docx.shared import ElementProxy
5
+
6
+
7
+ class TabStops(ElementProxy):
8
+ """A sequence of |TabStop| objects providing access to the tab stops of a paragraph
9
+ or paragraph style.
10
+
11
+ Supports iteration, indexed access, del, and len(). It is accesed using the
12
+ :attr:`~.ParagraphFormat.tab_stops` property of ParagraphFormat; it is not intended
13
+ to be constructed directly.
14
+ """
15
+
16
+ def __init__(self, element):
17
+ super(TabStops, self).__init__(element, None)
18
+ self._pPr = element
19
+
20
+ def __delitem__(self, idx):
21
+ """Remove the tab at offset `idx` in this sequence."""
22
+ tabs = self._pPr.tabs
23
+ try:
24
+ tabs.remove(tabs[idx])
25
+ except (AttributeError, IndexError):
26
+ raise IndexError("tab index out of range")
27
+
28
+ if len(tabs) == 0:
29
+ self._pPr.remove(tabs)
30
+
31
+ def __getitem__(self, idx):
32
+ """Enables list-style access by index."""
33
+ tabs = self._pPr.tabs
34
+ if tabs is None:
35
+ raise IndexError("TabStops object is empty")
36
+ tab = tabs.tab_lst[idx]
37
+ return TabStop(tab)
38
+
39
+ def __iter__(self):
40
+ """Generate a TabStop object for each of the w:tab elements, in XML document
41
+ order."""
42
+ tabs = self._pPr.tabs
43
+ if tabs is not None:
44
+ for tab in tabs.tab_lst:
45
+ yield TabStop(tab)
46
+
47
+ def __len__(self):
48
+ tabs = self._pPr.tabs
49
+ if tabs is None:
50
+ return 0
51
+ return len(tabs.tab_lst)
52
+
53
+ def add_tab_stop(self, position, alignment=WD_TAB_ALIGNMENT.LEFT, leader=WD_TAB_LEADER.SPACES):
54
+ """Add a new tab stop at `position`, a |Length| object specifying the location
55
+ of the tab stop relative to the paragraph edge.
56
+
57
+ A negative `position` value is valid and appears in hanging indentation. Tab
58
+ alignment defaults to left, but may be specified by passing a member of the
59
+ :ref:`WdTabAlignment` enumeration as `alignment`. An optional leader character
60
+ can be specified by passing a member of the :ref:`WdTabLeader` enumeration as
61
+ `leader`.
62
+ """
63
+ tabs = self._pPr.get_or_add_tabs()
64
+ tab = tabs.insert_tab_in_order(position, alignment, leader)
65
+ return TabStop(tab)
66
+
67
+ def clear_all(self):
68
+ """Remove all custom tab stops."""
69
+ self._pPr._remove_tabs()
70
+
71
+
72
+ class TabStop(ElementProxy):
73
+ """An individual tab stop applying to a paragraph or style.
74
+
75
+ Accessed using list semantics on its containing |TabStops| object.
76
+ """
77
+
78
+ def __init__(self, element):
79
+ super(TabStop, self).__init__(element, None)
80
+ self._tab = element
81
+
82
+ @property
83
+ def alignment(self):
84
+ """A member of :ref:`WdTabAlignment` specifying the alignment setting for this
85
+ tab stop.
86
+
87
+ Read/write.
88
+ """
89
+ return self._tab.val
90
+
91
+ @alignment.setter
92
+ def alignment(self, value):
93
+ self._tab.val = value
94
+
95
+ @property
96
+ def leader(self):
97
+ """A member of :ref:`WdTabLeader` specifying a repeating character used as a
98
+ "leader", filling in the space spanned by this tab.
99
+
100
+ Assigning |None| produces the same result as assigning `WD_TAB_LEADER.SPACES`.
101
+ Read/write.
102
+ """
103
+ return self._tab.leader
104
+
105
+ @leader.setter
106
+ def leader(self, value):
107
+ self._tab.leader = value
108
+
109
+ @property
110
+ def position(self):
111
+ """A |Length| object representing the distance of this tab stop from the inside
112
+ edge of the paragraph.
113
+
114
+ May be positive or negative. Read/write.
115
+ """
116
+ return self._tab.pos
117
+
118
+ @position.setter
119
+ def position(self, value):
120
+ tab = self._tab
121
+ tabs = tab.getparent()
122
+ self._tab = tabs.insert_tab_in_order(value, tab.val, tab.leader)
123
+ tabs.remove(tab)
docx/types.py ADDED
@@ -0,0 +1,34 @@
1
+ """Abstract types used by `python-docx`."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from typing_extensions import Protocol
8
+
9
+ if TYPE_CHECKING:
10
+ from docx.opc.part import XmlPart
11
+ from docx.parts.story import StoryPart
12
+
13
+
14
+ class ProvidesStoryPart(Protocol):
15
+ """An object that provides access to the StoryPart.
16
+
17
+ This type is for objects that have a story part like document or header as their
18
+ root part.
19
+ """
20
+
21
+ @property
22
+ def part(self) -> StoryPart: ...
23
+
24
+
25
+ class ProvidesXmlPart(Protocol):
26
+ """An object that provides access to its XmlPart.
27
+
28
+ This type is for objects that need access to their part but it either isn't a
29
+ StoryPart or they don't care, possibly because they just need access to the package
30
+ or related parts.
31
+ """
32
+
33
+ @property
34
+ def part(self) -> XmlPart: ...
@@ -0,0 +1,57 @@
1
+ Metadata-Version: 2.4
2
+ Name: python-docx-oss
3
+ Version: 0.1.0
4
+ Summary: Create, read, and update Microsoft Word .docx files.
5
+ Author: Ethan St. Lee
6
+ License: MIT
7
+ Keywords: docx,office,openxml,word
8
+ Classifier: Development Status :: 5 - Production/Stable
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Topic :: Office/Business :: Office Suites
18
+ Classifier: Topic :: Software Development :: Libraries
19
+ Requires-Python: >=3.12
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: lxml>=3.1.0
23
+ Requires-Dist: typing_extensions>=4.9.0
24
+ Dynamic: license-file
25
+
26
+ <p align="center">
27
+ <img src="https://raw.githubusercontent.com/lsaint/python-docx-oss/master/docs/_static/img/oss.png" width="400" alt="oss"/>
28
+ </p>
29
+
30
+ _As a Brazilian jiu-jitsu player, OSS means anything and everything. It's a term used in BJJ that is a way of greeting and demonstrating respect to others._
31
+
32
+ **_python-docx-oss_** is a Python library for CRUD Microsoft Word (.docx) files. It fork from [python-docx](https://github.com/python-openxml/python-docx).
33
+
34
+ <p>
35
+ <a href="https://pypi.org/project/python-docx-oss/"><img alt="PyPI" src="https://img.shields.io/pypi/v/python-docx-oss"></a>
36
+ <a href="https://pypi.org/project/python-docx-oss"> <img src="https://img.shields.io/pypi/pyversions/python-docx-oss.svg"/></a>
37
+ <a href="https://github.com/astral-sh/ruff"><img alt="Code style: ruff" src="https://img.shields.io/badge/code%20style-ruff-FF6B6B.svg?logo=ruff&logoColor=white"></a>
38
+ <a href="https://github.com/lsaint/python-docx-oss/blob/master/LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-yellow.svg"></a>
39
+ </p>
40
+
41
+ ______________________________________________________________________
42
+
43
+ ### FAQ
44
+
45
+ **Q: What's New?**
46
+
47
+ **A:** [HISTORY](https://github.com/lsaint/python-docx-oss/blob/master/HISTORY.md)
48
+
49
+ ______________________________________________________________________
50
+
51
+ More information is available in the [python-docx-oss documentation](https://python-docx-oss.readthedocs.io/en/latest/)
52
+
53
+ This project is based on the original work by [Steve Canny](https://github.com/scanny) and has been modified by [Ethan St. Lee](https://github.com/lsaint).
54
+
55
+ ### Donation
56
+
57
+ [https://lsaint.github.io/donation/](https://lsaint.github.io/donation/)
@@ -0,0 +1,132 @@
1
+ docx/__init__.py,sha256=J1Jec8wLqIIv2tZuz4YeFpa3nQC8AVq9LAcP39c-790,2102
2
+ docx/api.py,sha256=13U56iPSM2tMRDEb03OmSZQkDAPmwGjfxosYkWS2tcc,1350
3
+ docx/blkcntnr.py,sha256=_xe7Uz3RBCz4TPKXpIzRxtGg-1YPb3gAG9YvsSUyoLU,3525
4
+ docx/comments.py,sha256=MmaP7U9mZOUFsRhaZNIbXatqOOA8-pOC6UlqWAuTHsc,6385
5
+ docx/document.py,sha256=MbIMThSh8tEVExx72aKI4SMGQBcsScQdGLzNv2Asa9o,11941
6
+ docx/exceptions.py,sha256=WWiMy3ZtsfKRS31Wv09egLZnpPkX0H66B8JkOPCC3FM,454
7
+ docx/package.py,sha256=Eob2q7R6jXQ3iPD0cAGHzu2RVYgU2te4zfG3oVN_-lM,4288
8
+ docx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ docx/section.py,sha256=r2SLP6EXCtHPmv8PtaTuYZg1Wy8l9MoVHlA9JHT3SiA,18412
10
+ docx/settings.py,sha256=tWJUOj3KABgk_3bXoxhIHVWVY5HmmKKl2tsqic2YN_c,1082
11
+ docx/shape.py,sha256=5agasreXHsVIOdd1z8d-3erPvlsbBRJQjHQ0ILSfeaI,2969
12
+ docx/shared.py,sha256=N6YIJKiQev-0XIC0ND9fJg1eVt1mG_MELnTawf_e-9g,13506
13
+ docx/table.py,sha256=EFxbVD3aEbLOqdes5cpGt3xXbPzbZLFG0Sl5OPHSrhY,19477
14
+ docx/types.py,sha256=BgnXlRS-roPaNF1pbQX4ZO1AHqIIjIN7qMwAcaDniSE,848
15
+ docx/dml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ docx/dml/color.py,sha256=O7xeVwtCbOPW1aNKSHEBqcxpYnOUFMjKKv2vc2riJGo,4439
17
+ docx/drawing/__init__.py,sha256=hMb-YV3QFd8ja3eXPwWcMntpWQRv8Okeas47RXNU3zc,2243
18
+ docx/enum/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ docx/enum/base.py,sha256=rh6mFowU4qC6unhn6Xvf55rtY3NHh9Q-Ak0UAFTM65Y,5070
20
+ docx/enum/dml.py,sha256=DqqkYxl09iXQgDNZxxl_wi_n9rA7mTokde1TpO3ygmU,3346
21
+ docx/enum/section.py,sha256=mNN1kF1mdIJQ82XFFZnd3yXXnCu5mfnXzopalnmPCqo,2391
22
+ docx/enum/shape.py,sha256=DKQm6J3Is2050bT5RseUpwPHZZl9at0OAQjU1ha2H4g,396
23
+ docx/enum/style.py,sha256=Z9cBR7N3mCmZ54nKJxKqPhR4SMy_hqJRH2yabDxRLo8,10137
24
+ docx/enum/table.py,sha256=7PuQ--PGnSaNiE0Bu4VJ9t6LOgM-hNNmKEcl-3S2eUk,3943
25
+ docx/enum/text.py,sha256=o6bdpJot2iY40UnnBQ1uGfdE8oHFm3dtXUrmt9eMlvE,10276
26
+ docx/image/__init__.py,sha256=OvnRg5_DTmmrJObUBWLVcPFMRPb-u63e0EKfF_eIQlk,924
27
+ docx/image/bmp.py,sha256=w_Jhu6hByAckJNyKhI3zHOKsHyibHgxDIjiPI9ev704,1347
28
+ docx/image/constants.py,sha256=Y-ME9Z2KDLsjFQDun8XxhXrL6HNXhkUZqGHuCHXEMf4,3466
29
+ docx/image/emf.py,sha256=ZrmGNK50Iv0GmbbC1OAL5gqHhp-de5STrGTfkBdO1-8,1209
30
+ docx/image/exceptions.py,sha256=_6rkjXXcbFxb_H-J0kK4Q1J9RaLx3TVQ5hoOVENvQaI,383
31
+ docx/image/gif.py,sha256=0R7L0r7kjf844pdpN6UKEISsEQzOPAyA3cghXXdJW2s,1118
32
+ docx/image/helpers.py,sha256=jy0fQBqIfstp9ExfKw3dGNKozn74RnmSA_YwmolsDqM,3089
33
+ docx/image/image.py,sha256=DMw6DngMr-5L6A13m2c5RSoFOYUJQkGe7uNDOm3Y2sI,8115
34
+ docx/image/jpeg.py,sha256=oAkMabNy9wRvFn6_iQOFFqMrG6EFyhkKOmqD6E5ka28,16959
35
+ docx/image/png.py,sha256=hGpF7Nr7rBUCkE9NoHtQIrKM8hpiBaJXWio28vfZs0U,8214
36
+ docx/image/svg.py,sha256=qDtoQerJ7lJscevXM65BlWqmtUKVB05jTnQajjwLpFw,3576
37
+ docx/image/tiff.py,sha256=LZx-P2uMSzgdzHfIWRqRqtnbhuIqWBY_cLkx9_HTrPs,10379
38
+ docx/opc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ docx/opc/constants.py,sha256=u7JE0q95EFiAp3jXOntjv1cV0GdGpKtLfx85D2mlch0,17124
40
+ docx/opc/coreprops.py,sha256=IfQeqC5o4k9Obj_kQ4ZKfFl6IL7eIm7dcIC1AZkVvac,3468
41
+ docx/opc/customprops.py,sha256=oCHxWPNWSekBQrtO07WPSb0WKLQgTgfS3y8m8ZUXN-A,1986
42
+ docx/opc/exceptions.py,sha256=pqa1GuFxMlGZDBgGBqntZ_8aDINLwo2gtPuNRwADzyM,264
43
+ docx/opc/oxml.py,sha256=IE3H4F-DWr8QSZi0pxc767apU3Nk-BhFTs7HiTD5ck0,8325
44
+ docx/opc/package.py,sha256=zWteqHOyPbR4mpcoOZy-sPVWvQR2e2fQVoYdjaHXXfI,10217
45
+ docx/opc/packuri.py,sha256=1-uRAwjIftl475nozvssEoS-0EBz0w-oJvT-fNYcx9o,3729
46
+ docx/opc/part.py,sha256=15TjdwOs137LDdr-EVNeLb4iQdRyIfDZg6Vjx6_8Zdc,9606
47
+ docx/opc/phys_pkg.py,sha256=-eNZDBbLShHo3W1iglf1CwN_nkK8qnmTWp6ABg77cjA,4005
48
+ docx/opc/pkgreader.py,sha256=iUPZ7Ba4kNXjPB-q1mQEO44eVmbnP08po4WFH-HD2IE,9588
49
+ docx/opc/pkgwriter.py,sha256=shDeuBtW2BbFOTHrXx8R97PWFaH_fE37JYBfbw6QWRs,4524
50
+ docx/opc/rel.py,sha256=9BAZ59Cr5-BKs_5R8aifPDnPpXw-75GdfYYY6_a8Ays,6219
51
+ docx/opc/shared.py,sha256=Zn2avg2g0J2fkG5YgFfCbl138gXex8stR-QwVJcuSIY,996
52
+ docx/opc/spec.py,sha256=GP8YEb7bSmZQ0i338M3lQCVZm6yUnkUhm3PFKVgW8bQ,638
53
+ docx/opc/parts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ docx/opc/parts/coreprops.py,sha256=VBczdH-CIj-tcE4bB11LxwmZkFGM2AG1BVyiJ2A2mCY,1775
55
+ docx/opc/parts/customprops.py,sha256=cUBIN9QBSSosri29T2UIVVpYfwRVQm1rBxZkss3KilU,2047
56
+ docx/oxml/__init__.py,sha256=c3iIpXJOVJ5PszgJ2FvZSD-INE61cDYhAcS-SNfLuEo,8296
57
+ docx/oxml/comments.py,sha256=g4FZAavN3dpD-7GL0WheXk_Mbfsea3a5fPXNjOjY1e8,4912
58
+ docx/oxml/coreprops.py,sha256=GkDRxoxfOusgNoaJ1Ew0NELhUYhWOFrJs61_vPU319U,10768
59
+ docx/oxml/customprops.py,sha256=dkeKcPBJydiCV6e9sTMlj38idO8VxBajLh806DXi-90,4977
60
+ docx/oxml/document.py,sha256=Dri6Za3_9F14uVgoP-Es2VOisixPrqBeu6QR_AqeriA,3593
61
+ docx/oxml/drawing.py,sha256=JkqiKq2HmhdC8qWX_pavEIsjmBb2ZrBkoVGnSEstSig,397
62
+ docx/oxml/exceptions.py,sha256=v4USEteepc5EldWkA2jhb503rLTDLCr8ZdR1IbIKMdc,261
63
+ docx/oxml/ns.py,sha256=oLRWMkNoqx0I5jGsfT5zbKqzlUNBYkXrBDUg3xMqZIQ,3934
64
+ docx/oxml/numbering.py,sha256=_LDiz7xbTI-UUnfBZSH5tQ76f4ju2m1eHnwfCJ9-PCw,3965
65
+ docx/oxml/parser.py,sha256=Zm53GoWo6KvIYIyq64s8kny_VzUoozvGrq6WsWUTqxU,2324
66
+ docx/oxml/section.py,sha256=ny6fhO5p4XE16CjmXgsV2f_LUhyI_d0vfnxyYznq3I4,20395
67
+ docx/oxml/settings.py,sha256=eayU_BPA6_SGvIE-u7lnWuuK5esSVrBi6X5UnqaHlHs,4264
68
+ docx/oxml/shape.py,sha256=9v1x1Un6SawEAjkHLxkC0LyA8TDmT7xplWIYleQJt-0,13476
69
+ docx/oxml/shared.py,sha256=iAqDOcy-DnOm5GGsSZXLSemNejSqCjlzhB86lPEtDYM,1857
70
+ docx/oxml/simpletypes.py,sha256=2pD4vgEZThJpCB4M-L8hP7uTIXglndlZRdNruvDZwm0,13019
71
+ docx/oxml/styles.py,sha256=1U24kcC9hhzMPzNcg19RVCUJl1_qWauXCJIHG_Kp0Io,10643
72
+ docx/oxml/table.py,sha256=qS46a_Ts3KzNygUNeUxaTIVNDJZbbWNJqMseo3ZVaRA,33610
73
+ docx/oxml/xmlchemy.py,sha256=QFJNxaM6YQeozA238LNhRu_1j_NqZgta7aiPxCsQ0Rs,26192
74
+ docx/oxml/dml/CT_ExtensionList.py,sha256=drQvDl9Zo10H1JMtHdI8AUxlX0U0NFPKwIyHAlUhDTk,1216
75
+ docx/oxml/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ docx/oxml/text/font.py,sha256=s5MJwoei24s1xdhtsI1P02wqI6mLpvkLTCXr73EWNWI,11900
77
+ docx/oxml/text/hyperlink.py,sha256=tx6SQiYaa123-a0JfUS80mtACOYwNoy24Trga2Shgn8,1467
78
+ docx/oxml/text/pagebreak.py,sha256=1iK12GAowZpFRjVAmnZ_Mpqn7O0PqPSrVc2myUc4KM4,11192
79
+ docx/oxml/text/paragraph.py,sha256=op4Cy4LjcSIxDD1CQIKeRbUsBL5ABVR8cYKb3KynlmQ,3538
80
+ docx/oxml/text/parfmt.py,sha256=5TYCf-QfcwlECXUkrLSYFfewFA1JieKGTtm3X01fu64,12221
81
+ docx/oxml/text/run.py,sha256=W8vwOomvk1oGzAq2BqDgyVftKsSi5LK9_vlADVcMgpg,11238
82
+ docx/parts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ docx/parts/comments.py,sha256=Dmxh_i8ADRo-wLfO9LV0Lyho5XC_76oU1NJN8itw8lc,1760
84
+ docx/parts/customxml.py,sha256=SdfLQFLPi3I8lcTXNoTmtsy9dC6kIyvsSAViqO-bVJk,1675
85
+ docx/parts/document.py,sha256=bvfXPkJet0RZhRuD9O6etefPNFo-rfi3DX2-HFBYmeI,7443
86
+ docx/parts/hdrftr.py,sha256=_U0PCjVkK6EWwkyZb9oTunlNb6x55rECD1xFDzwUlPM,1709
87
+ docx/parts/image.py,sha256=c-DF5YFvp1qVTx7Zon-xOXw0qPc_3LoeX9qMSFPs6mo,2739
88
+ docx/parts/numbering.py,sha256=rrVIiRoBQIy6j8eWGhWyhcJvNx6RRaItWVDhorwrVyo,1715
89
+ docx/parts/settings.py,sha256=lqcDzDNLEc8ElxmNMKwy6uNgOesfYcvBDhKz7uUMnb4,1717
90
+ docx/parts/story.py,sha256=WgsvzLkfZ7DigCE9MVSGPfajzennxdPvOtIdoSxmeuk,4577
91
+ docx/parts/styles.py,sha256=Ly7aJyPgtwQ2TRIwuUtHz_x1Z0FH9JTtsNohml1-ykM,1391
92
+ docx/styles/__init__.py,sha256=aCJqhH4JhG_cIm3iwVJGtWpWW0AXJx3QMag7MORmrdI,1406
93
+ docx/styles/latent.py,sha256=EDBcgd-1jKmW-wGz64GvcGSopnOuPQG1inU0pnHRsQA,7211
94
+ docx/styles/style.py,sha256=BoGXQRSyODmPI38bAEWPgTXEPwhXyVYZZ9nSYxRSHPM,8051
95
+ docx/styles/styles.py,sha256=jq6_Hzgn3XiF-No10kwqvDHTYHobX380939sQWqkwGI,5608
96
+ docx/templates/default-comments.xml,sha256=sjwuBPWGUH9WHjxVeHa1LuqOm3o-lNiZAwzVV0kajIw,734
97
+ docx/templates/default-footer.xml,sha256=V9Gkf2J3fxHVNphYHX2FfxuSdHUh1_tArHv1ZlUHAxU,1395
98
+ docx/templates/default-header.xml,sha256=oMHJ5mr6Sd1PZkmEQEJ4lmr7VCwZiFOAvmJSsOKK4UI,1395
99
+ docx/templates/default-numbering.xml,sha256=TzAxljZY68alX5nKV4re53yqTf5k4nzpjOiEM2Fi_KI,1294
100
+ docx/templates/default-settings.xml,sha256=eXOLlF4o4eqDOLeEi5qjwTv5mmDk3V5CMseQD7_bCug,1640
101
+ docx/templates/default-styles.xml,sha256=WnjtOZLsCnP4hYSaYhMfR7JW4ixDxRcr3eBPI8QRx94,15823
102
+ docx/templates/default.docx,sha256=IJS1vd_-nPlz1h_gM4hBOATwNBYHGElKZdt-mNpA010,38116
103
+ docx/templates/default-docx-template/[Content_Types].xml,sha256=iIp82dldCZhDakmXWfMFMDUM4az4TTwH70ftarpInp4,1782
104
+ docx/templates/default-docx-template/_rels/.rels,sha256=-Lwgt-HVkmKrvcSPn_pqyldGhoi71A3GJ4F3MnMlJrM,748
105
+ docx/templates/default-docx-template/customXml/item1.xml,sha256=qGCG_8XY6D69bHGlXR0u-qMbE3l39fOnUjZuECNhIUQ,262
106
+ docx/templates/default-docx-template/customXml/itemProps1.xml,sha256=xUIwexPsKai1RiF7s3k2q0gi4ESyZdKVKYXsPWr-0k4,354
107
+ docx/templates/default-docx-template/customXml/_rels/item1.xml.rels,sha256=Mvpt31vf_e7JfnfQgFko9NJBHyOjM10e4ESbdAzh2E0,300
108
+ docx/templates/default-docx-template/docProps/app.xml,sha256=vmZJgcMUHN38WTYr6yh-vyDQdzZg4t1vqsWWilkwoIE,1132
109
+ docx/templates/default-docx-template/docProps/core.xml,sha256=EL_SDqXZyKsCNqL05J-ZzbIHqsZxHkeAz3o5CzIqHUA,753
110
+ docx/templates/default-docx-template/docProps/thumbnail.jpeg,sha256=ljZxONxEzgm_LI8Pjkk0ihR40sXAr2m7wrvDi2PNzq0,8324
111
+ docx/templates/default-docx-template/word/document.xml,sha256=9RVLPF2udJq7DjgeEOoC4Z4TdlAGXEsfEbBZxtdTQL8,1594
112
+ docx/templates/default-docx-template/word/fontTable.xml,sha256=eThft_YCR1B-yv_Ckunr1S6gZXuGNPYpum_MxUAR1rs,2811
113
+ docx/templates/default-docx-template/word/numbering.xml,sha256=ymBdZOm6Iy_Y_0AdcAZp97XENRhlscFrkf1aSqyb4kk,6747
114
+ docx/templates/default-docx-template/word/settings.xml,sha256=MVItLTw2auxXFMkhzlVrSDjKf6oz-nlaZtwyV1xxCyc,2749
115
+ docx/templates/default-docx-template/word/styles.xml,sha256=CeNQuV4SHntjhBSFpq2s8vrNSWwYkpey26Y0u7KJiog,438677
116
+ docx/templates/default-docx-template/word/stylesWithEffects.xml,sha256=Rjrgkozw2Ed12_jPGNbDAp9nB8gb9ZD21t2HV6XpPxU,438131
117
+ docx/templates/default-docx-template/word/webSettings.xml,sha256=NJ023nQ00J-GmH_2cdiBSWSgWIweYwwG5WLNp-den5U,438
118
+ docx/templates/default-docx-template/word/_rels/document.xml.rels,sha256=Tyt7R9in0Q1E47rW0Dgpui51XMiymi01pJ7vee17EdY,1253
119
+ docx/templates/default-docx-template/word/theme/theme1.xml,sha256=46irfbnKevylb18oIKVui2YAFsZHdzVVsGCwoCrHaUE,10939
120
+ docx/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ docx/text/font.py,sha256=AJI05dO5nUSXsutxHNsquZkqdCA33x68ovi3IV4C1nc,14854
122
+ docx/text/hyperlink.py,sha256=H7YGCH85i7EDcPQcYoLh4MOx_w-xNSucA5bAgI3HtVQ,5257
123
+ docx/text/pagebreak.py,sha256=sI1yMVotkBtn1u5DJ9L04FkC01QoAwcyVSdgGPAkJIY,4950
124
+ docx/text/paragraph.py,sha256=N3F62_JRQZYaumuoaJXKCDnRSw2DIiOwzyMPV2Jd7GI,6828
125
+ docx/text/parfmt.py,sha256=70M75HFo7ydpqmIdZjkV711muyrsBGdr4WZscF3YVJY,10339
126
+ docx/text/run.py,sha256=tsW8dXOE4VnqEM7cJz_uU2Vq3qgdnrMGzyDq9x5jvE4,10800
127
+ docx/text/tabstops.py,sha256=bJN98GWW22f4Sqg0dQbyUcnuOn65fHsNZuCGswI03_c,3896
128
+ python_docx_oss-0.1.0.dist-info/licenses/LICENSE,sha256=lf2yZv-riPwFeah3IMDeG0zqI6fXcV9T9YOToeG54NM,1164
129
+ python_docx_oss-0.1.0.dist-info/METADATA,sha256=T0xhPa_ODKKhJx7g8nPdhE4mJ2G7SEzgBN8VL6FgPM0,2593
130
+ python_docx_oss-0.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
131
+ python_docx_oss-0.1.0.dist-info/top_level.txt,sha256=zkbrD3gmyqHpD_XhHe7lCbr2M5vT229nJ4UFqF5VjIs,5
132
+ python_docx_oss-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+ Copyright (c) 2022 Ethan St. Lee, https://github.com/lsaint
3
+ Copyright (c) 2013 Steve Canny, https://github.com/scanny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1 @@
1
+ docx