from pydantic import BaseModel, Field
from typing import Optional, List, TYPE_CHECKING
from docx_parser_converter.docx_parsers.models.paragraph_models import Paragraph
# if TYPE_CHECKING:
# from docx_parsers.models.document_models import Paragraph
[docs]
class BorderProperties(BaseModel):
"""
Represents the border properties for a table cell.
Example:
The following is an example of border properties in a table cell properties element:
.. code-block:: xml
<w:tcBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/>
</w:tcBorders>
"""
color: Optional[str] = Field(None, description="The color of the border.")
size: Optional[int] = Field(None, description="The size of the border.")
space: Optional[int] = Field(None, description="The space between the border and the text.")
val: Optional[str] = Field(None, description="The style of the border.")
[docs]
class ShadingProperties(BaseModel):
"""
Represents the shading properties for a table cell.
Example:
The following is an example of shading properties in a table cell properties element:
.. code-block:: xml
<w:shd w:val="clear" w:color="auto" w:fill="FFFF00"/>
"""
fill: Optional[str] = Field(None, description="The fill color.")
val: Optional[str] = Field(None, description="The shading pattern.")
color: Optional[str] = Field(None, description="The color of the shading.")
[docs]
class MarginProperties(BaseModel):
"""
Represents the margin properties for a table cell.
Example:
The following is an example of margin properties in a table cell properties element:
.. code-block:: xml
<w:tcMar>
<w:top w:w="100" w:type="dxa"/>
<w:left w:w="100" w:type="dxa"/>
<w:bottom w:w="100" w:type="dxa"/>
<w:right w:w="100" w:type="dxa"/>
</w:tcMar>
"""
top: Optional[float] = Field(None, description="The top margin in points.")
left: Optional[float] = Field(None, description="The left margin in points.")
bottom: Optional[float] = Field(None, description="The bottom margin in points.")
right: Optional[float] = Field(None, description="The right margin in points.")
[docs]
class TableWidth(BaseModel):
"""
Represents the width of a table or table cell.
Example:
The following is an example of a table width element in a table properties element:
.. code-block:: xml
<w:tblW w:type="dxa" w:w="5000"/>
"""
type: Optional[str] = Field(None, description="The type of width (e.g., 'dxa').")
width: Optional[float] = Field(None, description="The width in points.")
[docs]
class TableIndent(BaseModel):
"""
Represents the indent of a table.
Example:
The following is an example of a table indent element in a table properties element:
.. code-block:: xml
<w:tblInd w:type="dxa" w:w="200"/>
"""
type: Optional[str] = Field(None, description="The type of indent (e.g., 'dxa').")
width: Optional[float] = Field(None, description="The indent width in points.")
[docs]
class TableLook(BaseModel):
"""
Represents the look settings for a table.
Example:
The following is an example of a table look element in a table properties element:
.. code-block:: xml
<w:tblLook w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
"""
firstRow: Optional[bool] = Field(None, description="Indicates if the first row has special formatting.")
lastRow: Optional[bool] = Field(None, description="Indicates if the last row has special formatting.")
firstColumn: Optional[bool] = Field(None, description="Indicates if the first column has special formatting.")
lastColumn: Optional[bool] = Field(None, description="Indicates if the last column has special formatting.")
noHBand: Optional[bool] = Field(None, description="Indicates if horizontal banding is disabled.")
noVBand: Optional[bool] = Field(None, description="Indicates if vertical banding is disabled.")
[docs]
class TableCellBorders(BaseModel):
"""
Represents the border properties for a table cell.
Example:
The following is an example of table cell borders in a table cell properties element:
.. code-block:: xml
<w:tcBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:insideH w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:insideV w:val="single" w:sz="4" w:space="0" w:color="000000"/>
</w:tcBorders>
"""
top: Optional[BorderProperties] = Field(None, description="The top border properties.")
left: Optional[BorderProperties] = Field(None, description="The left border properties.")
bottom: Optional[BorderProperties] = Field(None, description="The bottom border properties.")
right: Optional[BorderProperties] = Field(None, description="The right border properties.")
insideH: Optional[BorderProperties] = Field(None, description="The inside horizontal border properties.")
insideV: Optional[BorderProperties] = Field(None, description="The inside vertical border properties.")
[docs]
class TableCellProperties(BaseModel):
"""
Represents the properties of a table cell.
Example:
The following is an example of table cell properties in a table cell element:
.. code-block:: xml
<w:tc>
<w:tcPr>
<w:tcW w:w="5000" w:type="dxa"/>
<w:tcBorders>...</w:tcBorders>
<w:shd w:val="clear" w:color="auto" w:fill="FFFF00"/>
<w:tcMar>...</w:tcMar>
<w:textDirection w:val="btLr"/>
<w:vAlign w:val="center"/>
<w:gridSpan w:val="2"/>
</w:tcPr>
<w:p>...</w:p>
</w:tc>
"""
tcW: Optional[TableWidth] = Field(None, description="The width of the table cell.")
tcBorders: Optional[TableCellBorders] = Field(None, description="The borders of the table cell.")
shd: Optional[ShadingProperties] = Field(None, description="The shading properties of the table cell.")
tcMar: Optional[MarginProperties] = Field(None, description="The margin properties of the table cell.")
textDirection: Optional[str] = Field(None, description="The text direction of the table cell.")
vAlign: Optional[str] = Field(None, description="The vertical alignment of the table cell.")
hideMark: Optional[bool] = Field(None, description="Indicates if the cell contains hidden marks.")
cellMerge: Optional[str] = Field(None, description="The cell merge properties.")
gridSpan: Optional[int] = Field(None, description="The number of grid columns spanned by the table cell.")
[docs]
class TableCell(BaseModel):
"""
Represents a table cell in a table row.
Example:
The following is an example of a table cell element:
.. code-block:: xml
<w:tc>
<w:tcPr>...</w:tcPr>
<w:p>...</w:p>
</w:tc>
"""
properties: Optional[TableCellProperties] = Field(None, description="The properties of the table cell.")
paragraphs: List['Paragraph'] = Field(..., description="The list of paragraphs within the table cell.")
[docs]
class TableRowProperties(BaseModel):
"""
Represents the properties of a table row.
Example:
The following is an example of table row properties in a table row element:
.. code-block:: xml
<w:trPr>
<w:trHeight w:val="240"/>
<w:tblHeader/>
<w:jc w:val="center"/>
<w:tblBorders>...</w:tblBorders>
<w:shd w:val="clear" w:color="auto" w:fill="FFFF00"/>
</w:trPr>
"""
trHeight: Optional[str] = Field(None, description="The height of the table row.")
trHeight_hRule: Optional[str] = Field(None, description="The height rule for the table row.")
tblHeader: Optional[bool] = Field(None, description="Indicates if the row is a table header.")
justification: Optional[str] = Field(None, description="The justification for the row content.")
tblBorders: Optional[TableCellBorders] = Field(None, description="The borders for the table row.")
shd: Optional[ShadingProperties] = Field(None, description="The shading properties for the table row.")
[docs]
class TableRow(BaseModel):
"""
Represents a row within a table.
Example:
The following is an example of a table row element:
.. code-block:: xml
<w:tr>
<w:trPr>...</w:trPr>
<w:tc>...</w:tc>
</w:tr>
"""
properties: Optional[TableRowProperties] = Field(None, description="The properties of the table row.")
cells: List[TableCell] = Field(..., description="The list of cells in the table row.")
[docs]
class TableProperties(BaseModel):
"""
Represents the properties of a table.
Example:
The following is an example of table properties in a table element:
.. code-block:: xml
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="5000" w:type="dxa"/>
<w:tblInd w:w="200" w:type="dxa"/>
<w:tblBorders>...</w:tblBorders>
<w:shd w:val="clear" w:color="auto" w:fill="FFFF00"/>
<w:tblLayout w:type="fixed"/>
<w:tblLook w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
"""
tblStyle: Optional[str] = Field(None, description="The style of the table.")
tblW: Optional[TableWidth] = Field(None, description="The width of the table.")
justification: Optional[str] = Field(None, description="The justification for the table.")
tblInd: Optional[TableIndent] = Field(None, description="The indent of the table.")
tblCellMar: Optional[MarginProperties] = Field(None, description="The cell margins of the table.")
tblBorders: Optional[TableCellBorders] = Field(None, description="The borders of the table.")
shd: Optional[ShadingProperties] = Field(None, description="The shading properties of the table.")
tblLayout: Optional[str] = Field(None, description="The layout of the table.")
tblLook: Optional[TableLook] = Field(None, description="The look settings of the table.")
[docs]
class TableGrid(BaseModel):
"""
Represents the grid structure of a table.
Example:
The following is an example of a table grid element:
.. code-block:: xml
<w:tblGrid>
<w:gridCol w:w="5000"/>
<w:gridCol w:w="5000"/>
</w:tblGrid>
"""
columns: List[float] = Field(..., description="The list of column widths in points.")
[docs]
class Table(BaseModel):
"""
Represents a table in the document.
Example:
The following is an example of a table element in a document:
.. code-block:: xml
<w:tbl>
<w:tblPr>...</w:tblPr>
<w:tblGrid>...</w:tblGrid>
<w:tr>...</w:tr>
</w:tbl>
"""
properties: Optional[TableProperties] = Field(None, description="The properties of the table.")
grid: Optional[TableGrid] = Field(None, description="The grid structure of the table.")
rows: List[TableRow] = Field(..., description="The list of rows in the table.")