refactor: excel parse
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
# Copyright (c) 2021-2022, Manfred Moitzi
|
||||
# License: MIT License
|
||||
from __future__ import annotations
|
||||
from typing import Iterable, Iterator, Sequence
|
||||
from .mtext import MText, MTextColumns
|
||||
|
||||
__all__ = [
|
||||
"make_static_columns_r2000",
|
||||
"make_dynamic_auto_height_columns_r2000",
|
||||
"make_dynamic_manual_height_columns_r2000",
|
||||
"make_static_columns_r2018",
|
||||
"make_dynamic_auto_height_columns_r2018",
|
||||
"make_dynamic_manual_height_columns_r2018",
|
||||
]
|
||||
|
||||
COLUMN_BREAK = "\\N"
|
||||
|
||||
|
||||
def add_column_breaks(content: Iterable[str]) -> Iterator[str]:
|
||||
content = list(content)
|
||||
for c in content[:-1]:
|
||||
if not c.endswith(COLUMN_BREAK):
|
||||
c += COLUMN_BREAK
|
||||
yield c
|
||||
yield content[-1] # last column without a column break
|
||||
|
||||
|
||||
def make_static_columns_r2000(
|
||||
content: Sequence[str],
|
||||
width: float,
|
||||
gutter_width: float,
|
||||
height: float,
|
||||
dxfattribs=None,
|
||||
) -> MText:
|
||||
if len(content) < 1:
|
||||
raise ValueError("no content")
|
||||
columns = MTextColumns.new_static_columns(
|
||||
len(content), width, gutter_width, height
|
||||
)
|
||||
mtext = MText.new(dxfattribs=dxfattribs)
|
||||
mtext.setup_columns(columns, linked=True)
|
||||
content = list(add_column_breaks(content))
|
||||
mtext.text = content[0]
|
||||
for mt, c in zip(columns.linked_columns, content[1:]):
|
||||
mt.text = c
|
||||
return mtext
|
||||
|
||||
|
||||
def make_dynamic_auto_height_columns_r2000(
|
||||
content: str,
|
||||
width: float,
|
||||
gutter_width: float,
|
||||
height: float,
|
||||
count: int = 1,
|
||||
dxfattribs=None,
|
||||
) -> MText:
|
||||
if not content:
|
||||
raise ValueError("no content")
|
||||
mtext = MText.new(dxfattribs=dxfattribs)
|
||||
mtext.dxf.width = width
|
||||
columns = MTextColumns.new_dynamic_auto_height_columns(
|
||||
count, width, gutter_width, height
|
||||
)
|
||||
set_dynamic_columns_content(content, mtext, columns)
|
||||
return mtext
|
||||
|
||||
|
||||
def make_dynamic_manual_height_columns_r2000(
|
||||
content: str,
|
||||
width: float,
|
||||
gutter_width: float,
|
||||
heights: Sequence[float],
|
||||
dxfattribs=None,
|
||||
) -> MText:
|
||||
if not content:
|
||||
raise ValueError("no content")
|
||||
mtext = MText.new(dxfattribs=dxfattribs)
|
||||
mtext.dxf.width = width
|
||||
columns = MTextColumns.new_dynamic_manual_height_columns(
|
||||
width, gutter_width, heights
|
||||
)
|
||||
set_dynamic_columns_content(content, mtext, columns)
|
||||
return mtext
|
||||
|
||||
|
||||
def set_dynamic_columns_content(
|
||||
content: str, mtext: MText, columns: MTextColumns
|
||||
):
|
||||
mtext.setup_columns(columns, linked=True)
|
||||
# temp. hack: assign whole content to the main column
|
||||
mtext.text = content
|
||||
# for mt, c in zip(mtext.columns.linked_columns, content[1:]):
|
||||
# mt.text = c
|
||||
return mtext
|
||||
|
||||
|
||||
# DXF version R2018
|
||||
|
||||
|
||||
def make_static_columns_r2018(
|
||||
content: Sequence[str],
|
||||
width: float,
|
||||
gutter_width: float,
|
||||
height: float,
|
||||
dxfattribs=None,
|
||||
) -> MText:
|
||||
if len(content) < 1:
|
||||
raise ValueError("no content")
|
||||
columns = MTextColumns.new_static_columns(
|
||||
len(content), width, gutter_width, height
|
||||
)
|
||||
mtext = MText.new(dxfattribs=dxfattribs)
|
||||
mtext.setup_columns(columns, linked=False)
|
||||
mtext.text = "".join(add_column_breaks(content))
|
||||
return mtext
|
||||
|
||||
|
||||
def make_dynamic_auto_height_columns_r2018(
|
||||
content: str,
|
||||
width: float,
|
||||
gutter_width: float,
|
||||
height: float,
|
||||
count: int,
|
||||
dxfattribs=None,
|
||||
) -> MText:
|
||||
columns = MTextColumns.new_dynamic_auto_height_columns(
|
||||
count, width, gutter_width, height
|
||||
)
|
||||
return _make_dynamic_columns_r2018(content, columns, dxfattribs or {})
|
||||
|
||||
|
||||
def make_dynamic_manual_height_columns_r2018(
|
||||
content: str,
|
||||
width: float,
|
||||
gutter_width: float,
|
||||
heights: Sequence[float],
|
||||
dxfattribs=None,
|
||||
) -> MText:
|
||||
columns = MTextColumns.new_dynamic_manual_height_columns(
|
||||
width, gutter_width, heights
|
||||
)
|
||||
return _make_dynamic_columns_r2018(content, columns, dxfattribs or {})
|
||||
|
||||
|
||||
def _make_dynamic_columns_r2018(
|
||||
content: str, columns: MTextColumns, dxfattribs
|
||||
) -> MText:
|
||||
if not content:
|
||||
raise ValueError("no content")
|
||||
# column count is not required for DXF R2018
|
||||
mtext = MText.new(dxfattribs=dxfattribs)
|
||||
mtext.setup_columns(columns, linked=False)
|
||||
mtext.text = content
|
||||
return mtext
|
||||
Reference in New Issue
Block a user