56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
export_blockpatterns.py - Liest Blockname-Muster aus cfg/export.cfg.
|
|
|
|
Einzige Quelle fuer die Blockname-Klassifikation, die sowohl von
|
|
Lisp/export.lsp (csv:collect-export-blocks, ueber export:pattern) als auch
|
|
von den Python-Export-Skripten (export_csv.py, export_sivas.py) genutzt
|
|
wird. Vermeidet, dass Blockname-Praefixe/-Wildcards in mehreren Dateien
|
|
unabhaengig voneinander gepflegt werden und dabei auseinanderlaufen.
|
|
|
|
cfg/export.cfg deklariert fuer Lisp kombinierte Kategorien (z.B.
|
|
pattern_kreisel deckt Kreisel UND Eckrad ab, weil Lisp beim Sammeln der
|
|
Bloecke nur "gehoert das ueberhaupt zum Export" wissen muss). Python
|
|
braucht dagegen feinere Kategorien (Kreisel und Eckrad sind unterschied-
|
|
liche TeileArt-Zeilen) - dafuer gibt es zusaetzliche, feinere Keys
|
|
(pattern_eckrad, pattern_strecke_compound, pattern_strecke_module), die
|
|
inhaltlich Teilmengen der groben Lisp-Kategorien sind.
|
|
"""
|
|
|
|
import configparser
|
|
import fnmatch
|
|
import os
|
|
|
|
|
|
def cfg_path_from_env(default_dir=None):
|
|
"""Pfad zu export.cfg ermitteln: DXFM_CFG env var, sonst <repo>/cfg."""
|
|
dxfm_cfg = os.environ.get("DXFM_CFG")
|
|
if dxfm_cfg:
|
|
return os.path.join(dxfm_cfg, "export.cfg")
|
|
base = default_dir or os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
return os.path.join(base, "cfg", "export.cfg")
|
|
|
|
|
|
def load_patterns(cfg_path=None):
|
|
"""Liest [blockpattern] aus export.cfg.
|
|
|
|
Rueckgabe: dict key -> list[str] (Wildcard-Muster, wcmatch-kompatibel:
|
|
"*" = beliebig viele Zeichen). Bei fehlender Datei/Sektion: leeres dict.
|
|
"""
|
|
if cfg_path is None:
|
|
cfg_path = cfg_path_from_env()
|
|
parser = configparser.ConfigParser()
|
|
parser.read(cfg_path, encoding="utf-8")
|
|
patterns = {}
|
|
if parser.has_section("blockpattern"):
|
|
for key, value in parser.items("blockpattern"):
|
|
patterns[key] = [p.strip() for p in value.split(",") if p.strip()]
|
|
return patterns
|
|
|
|
|
|
def matches_any(bname, patterns):
|
|
"""True, wenn bname (case-insensitiv) zu mindestens einem Muster passt."""
|
|
upper = bname.upper()
|
|
return any(fnmatch.fnmatchcase(upper, p.upper()) for p in patterns)
|