diff --git a/README.md b/README.md index b572d0f..38fc388 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Ein in NetBox integriertes Markdown-Wiki für Betriebsdokumentationen und Anleit ## Kompatibilität -Die Version `0.5.2` zielt auf NetBox 4.x (mindestens 4.0). Vor einem produktiven Rollout sollte das Plugin gegen die konkret eingesetzte NetBox-Minor-Version in einer Testinstanz geprüft werden. +Die Version `0.5.3` zielt auf NetBox 4.x (mindestens 4.0). Vor einem produktiven Rollout sollte das Plugin gegen die konkret eingesetzte NetBox-Minor-Version in einer Testinstanz geprüft werden. ## Installation @@ -125,7 +125,7 @@ Alte binäre `.doc`- und `.xls`-Dateien müssen vorher in `.docx` bzw. `.xlsx` k Für große Excel-Dateien kann auf der Importseite **„Excel mit mehreren Arbeitsblättern – je Blatt eine Dokumentation“** aktiviert werden. Dazu ist ein Zielordner verpflichtend. Jedes nicht leere Arbeitsblatt wird als eigene Dokumentation mit dem Blattnamen als Titel angelegt und erhält eine eigene Kopie der Original-Exceldatei als Anhang. Normale eingebettete PNG-, JPEG-, GIF- und WebP-Bilder werden dem jeweiligen Dokument als Medienanhang hinzugefügt. Diagramme, SmartArt, Steuerelemente und extern verknüpfte Bilder können nicht zuverlässig übernommen werden. -Mit **„Excel-Tabellen glätten“** wird jede Datenzeile statt als breite Tabelle als kompakter Textblock aus Feldnamen und Wert importiert. Nicht geglättete Tabellen werden in der Dokumentansicht automatisch kompakt dargestellt und bei Bedarf innerhalb des Inhalts horizontal scrollbar, ohne das NetBox-Layout zu verbreitern. +Mit **„Excel-Tabellen glätten“** werden die Zellen ohne künstliche Datensatz- oder Feldbezeichnungen in ihrer Lesereihenfolge übernommen. Zellen einer Excel-Zeile erscheinen als einzelne Textzeilen eines Absatzes; zwischen Excel-Zeilen wird ein Absatz eingefügt. Das Ergebnis ähnelt damit einer Übertragung nach Word ohne Tabelle. Nicht geglättete Tabellen werden in der Dokumentansicht automatisch kompakt dargestellt und bei Bedarf innerhalb des Inhalts horizontal scrollbar, ohne das NetBox-Layout zu verbreitern. ## REST-API diff --git a/netbox_documentation/__init__.py b/netbox_documentation/__init__.py index 2b6e32b..9311ba2 100644 --- a/netbox_documentation/__init__.py +++ b/netbox_documentation/__init__.py @@ -5,7 +5,7 @@ class DocumentationConfig(PluginConfig): name = "netbox_documentation" verbose_name = "NetBox Dokumentation" description = "Wiki und Office-Dokumentation direkt in NetBox" - version = "0.5.2" + version = "0.5.3" author = "LKE" base_url = "documentation" min_version = "4.0.0" diff --git a/netbox_documentation/forms.py b/netbox_documentation/forms.py index 34d962d..4c68a14 100644 --- a/netbox_documentation/forms.py +++ b/netbox_documentation/forms.py @@ -134,7 +134,7 @@ class ImportForm(forms.Form): required=False, label=help_label( "Excel-Tabellen glätten", - "Wandelt jede Tabellenzeile in einen lesbaren Textblock aus Feldnamen und Wert um, statt eine Tabelle zu erzeugen.", + "Übernimmt alle Zellen ohne Tabelle in Lesereihenfolge als dokumentartigen Text. Es werden keine Datensatz- oder Feldbezeichnungen erzeugt.", ), ) category = forms.ModelChoiceField( diff --git a/netbox_documentation/importers.py b/netbox_documentation/importers.py index 79c9bcb..2afb2ee 100644 --- a/netbox_documentation/importers.py +++ b/netbox_documentation/importers.py @@ -60,17 +60,22 @@ def _render_excel_rows(rows, flatten=False): header, body = rows[0], rows[1:] if not flatten: return tabulate(body, headers=header, tablefmt="github") + # Document-style flattening: retain every cell in reading order without + # inventing record headings or field/value labels. Cells in one Excel row + # become lines in one paragraph; Excel rows are separated by a blank line. blocks = [] - for number, row in enumerate(body, 1): - values = [] - for column, value in zip(header, row): - if value == "": - continue - label = column or "Feld" - values.append(f"**{label}:** {value}") + for row in rows: + values = [_escape_markdown_text(value) for value in row if value != ""] if values: - blocks.append(f"### Datensatz {number}\n\n" + " \n".join(values)) - return "\n\n".join(blocks) or "_Keine Datensätze_" + blocks.append(" \n".join(values)) + return "\n\n".join(blocks) or "_Keine Inhalte_" + + +def _escape_markdown_text(value): + value = str(value).replace("\\", "\\\\") + for character in ("*", "_", "[", "]", "<", ">", "#", "|"): + value = value.replace(character, f"\\{character}") + return value.replace("\r\n", " \n").replace("\r", " \n").replace("\n", " \n") def _xlsx(content, flatten=False): diff --git a/pyproject.toml b/pyproject.toml index 07b4419..d2238e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "netbox-documentation" -version = "0.5.2" +version = "0.5.3" description = "Integrated Markdown wiki and office document importer for NetBox" readme = "README.md" requires-python = ">=3.10" diff --git a/tests/test_importers.py b/tests/test_importers.py index d43fea9..5ee76f7 100644 --- a/tests/test_importers.py +++ b/tests/test_importers.py @@ -67,7 +67,7 @@ def test_excel_multi_sheet_import_creates_one_result_per_sheet(): assert "Leitstelle" in results[1].markdown -def test_excel_flatten_turns_rows_into_field_value_blocks(): +def test_excel_flatten_turns_cells_into_document_flow(): workbook = Workbook() sheet = workbook.active sheet.append(["Name", "IP"]) @@ -77,7 +77,7 @@ def test_excel_flatten_turns_rows_into_field_value_blocks(): results = import_excel_sheets(Upload(stream.getvalue(), "server.xlsx"), flatten=True) - assert "### Datensatz 1" in results[0].markdown - assert "**Name:** db01" in results[0].markdown - assert "**IP:** 10.0.0.2" in results[0].markdown + assert results[0].markdown == "Name \nIP\n\ndb01 \n10.0.0.2" + assert "Datensatz" not in results[0].markdown + assert "Feld" not in results[0].markdown assert "|" not in results[0].markdown