Commit cecfaf10 authored by di68kap's avatar di68kap

- Syntax-Highlighting: Autoren von Primärquellen werden nun farblich hervorgehoben

parent 14ae7033
......@@ -23,7 +23,7 @@ STRUKTUR
VERWECHSELBAR
confunditur c.:
imperitus: {=> imperator80m_1}
BEDEUTUNG iussum, praeceptum, mandatum -- Befehl, Anweisung, Auftrag:
......
DHParser-submodule @ 90aa9fc2
Subproject commit 6c236e48ba91308f0fd646a428a1d800b6d9a64a
Subproject commit 90aa9fc29431ebe83862b33a4628c3a38ea8c261
- Kein abschließender Punkt nach Fragezeichen (oder Ausrufezeichen). ERLEDIGT
- Sekundärtexte: Wie Primärquellen Autornamen komplett groß geschrieben. Bestimmung der Sekundärquellen als solche anhand von Listen. Auflösung von Mehrdeutigkeiten mit $-Zeichen.
- Sekundärtexte: Wie Primärquellen Autornamen komplett groß geschrieben.
Bestimmung der Sekundärquellen als solche anhand von Listen. Auflösung von Mehrdeutigkeiten mit $-Zeichen.
- Autornamen bei Primärquellen nach einer Liste einfärben
- Autornamen bei Primärquellen nach einer Liste einfärben. ERLEDIGT
- Opera-Majora-Liste in Excel-Tabelle wandeln und auf Sync&Share hinterlegen.
......
......@@ -11,4 +11,21 @@ angegebenen Aufgaben in Visual Studio Code verfügbar gemacht, wenn das
Hauptverzeichnis in VSCode (im Beispiel `MLW`) geöffnet wird.
Vgl.: https://github.com/sourcegraph/python-langserver
\ No newline at end of file
Syntax-Highlighting
-------------------
<https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide>
<https://macromates.com/manual/en/language_grammars#naming-conventions>
Language Server
---------------
Vgl.: <https://github.com/sourcegraph/python-langserver>
Code Map
--------
(Code map evtl. überflüssig, besser eingebaute Baum-Sichten von VSC verwenden.)
<https://github.com/oleg-shilo/codemap.vscode/wiki/Adding-custom-mappers>
This diff is collapsed.
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "MLWQuelle",
"patterns": [
{
"include": "#keyword"
},
{
"include": "#string"
},
{
"include": "#comment"
},
{
"include": "#opera_majora_author_name"
}
],
"repository": {
"keyword": {
"patterns": [{
"name": "keyword.secondary.mlw",
"match": "\\b(LATEINISCH|DEUTSCH|LAT|DEU)\\b"
},
{
"name": "keyword.mlw",
"match": "\\b(LEMMA|SUB_LEMMA|GRAMMATIK|ETYMOLOGIE|SCHREIBWEISE|STRUKTUR|GEBRAUCH|METRIK|VERWECHSELBAR|BEDEUTUNG|UNTER_BEDEUTUNG|UNTER_UNTER_BEDEUTUNG|UNTER_UNTER_UNTER_BEDEUTUNG|U_BEDEUTUNG|UU_BEDEUTUNG|UUU_BEDEUTUNG|UUUU_BEDEUTUNG|UUUUU_BEDEUTUNG|UUUUUU_BEDEUTUNG|UUUUUUU_BEDEUTUNG|ANHÄNGER|BELEGE|VERWEISE|AUTORIN|AUTOR|STELLENVERZEICHNIS|SINE)\\b"
}]
},
"strins": {
"name": "string.quoted.double.mlw",
"begin": "\"",
"end": "\"",
"patterns": [
{
"name": "constant.character.escape.mlw",
"match": "\\\\."
}
]
},
"comment": {
"name": "comment.mlw",
"patterns": [{
"name": "comment.block.mlw",
"begin": "/\\*",
"end": "\\*/"
},
{
"name": "comment.line.mlw",
"match": "(//).*$\\n?"
}]
},
"opera_majora_author_name": {
"name": "opera_majora_author_name.mlw",
"patterns": [{
"name": "constant.numeric.mlw",
"match": ""
}]
}
},
"scopeName": "source.mlw"
}
......@@ -14,11 +14,12 @@ import json
import openpyxl
import os
import re
from typing import NamedTuple
from typing import NamedTuple, Tuple, List, Dict, Union, Optional
opera_majora_pfad = os.path.join('Zusatzdaten', 'MLW-opera_majora.xlsx')
schnipsel_pfad =reduce(os.path.join, ['VSCode', 'mlwquelle', 'snippets', 'mlw.snippets.json'])
schnipsel_pfad = os.path.join('VSCode', 'mlwquelle', 'snippets', 'mlw.snippets.json')
tmLanguage_pfad = os.path.join('VSCode', 'mlwquelle', 'syntaxes', 'mlw.tmLanguage.json')
def hole_re(ebnf, symbol):
......@@ -86,10 +87,16 @@ class OperaMajoraZeile(NamedTuple):
hinweis: str = ''
def lade_opera_majora_tabelle() -> dict:
def lade_opera_majora_tabelle(autoren_menge: set = []) -> dict:
"""Liest die Opera-Majora-Tabelle ein und liefert ein Verzeichnis
von Schnipseln für die Visual-Studio-Code-Kontextunterstützung zurück.
Wird an den Parameter "autoren_menge" die Referenz auf eine Menge
übergeben, so werden in diese Menge alle gefundenen Autornamen
eingetragen.
"""
assert not autoren_menge, "An `autoren_liste` sollte die Referenz auf eine LEERE Liste " \
"übergeben werden, nicht: " + str(autoren_menge)
print("Lese Opera-Majora_Tabelle ein...")
wb = openpyxl.load_workbook(opera_majora_pfad)
blatt = wb.get_sheet_by_name(wb.get_sheet_names()[0])
......@@ -121,7 +128,9 @@ def lade_opera_majora_tabelle() -> dict:
seitenangabe = korrigiere_seitenangabe(zeile.seitenangabe
if len(zeile.seitenangabe) <= 32 else zeile.seitenangabe[:30] + '...')
schlüssel = ("%s %s" % (passe_autor_an(zeile.autor_abkürzung),
autor_angepasst = passe_autor_an(zeile.autor_abkürzung)
autoren_menge.add(autor_angepasst.rstrip('.'))
schlüssel = ("%s %s" % (autor_angepasst,
passe_werk_an(zeile.werk_abkürzung))).rstrip()
autor_werk = [element for element
in (zeile.autor_ausführlich, zeile.werk_ausführlich) if element]
......@@ -146,7 +155,74 @@ def schreibe_schnipsel_json(opera_majora: dict):
datei.write(json.dumps(opera_majora, ensure_ascii=False, sort_keys=True, indent=2))
def rxchk(s: str) -> str:
"""Escapes regular expression characters."""
return s.replace('.', r'\.').replace('[', r'\[')
def spalte(l: List[str], countdown: int=1) -> Dict[str, Union[List[str], Dict]]:
"""Sortiert alphabetisch und spaltet dann eine Liste von Zeichenketten
ungefähr in der Mitte in zwei Hälften, so dass die Einträge der zweiten
Hälfte auf mit einem anderen Buchstaben beginnen als die der ersten Hälfte.
Zurückgegeben wird ein Verzeichnis mit zwei Einträgen, dass als Schlüssel
Bereiche möglicher Anfangsbuchstaben der Zeichnketten der ersten bzw.
der zweiten Liste enthält und als Werte Listen der jeweils um das
erste Zeichen verkürzten Zeichenketten.
`countdown` gibt die Rekursionstiefe an.
Beispiel:
>>> spalte(['AY', 'BX', 'CW', 'DV'])
{'[A-B]': ['Y', 'X'], '[C-D]': ['W', 'V']}
"""
def R(s: str) -> str:
return s.replace('[', r'\[').replace(']', r'\]')
l.sort()
if countdown <= 0:
return l
L = len(l)
k = L // 2 + L % 2
while 1 <= k < L and l[k-1][0] == l[k][0]:
k -= 1
return {f'[{R(l[0][0])}-{R(l[k - 1][0])}]': spalte([s[1:] for s in l[:k]], countdown - 1),
f'[{R(l[k][0])}-{R(l[-1][0])}]': spalte([s[1:] for s in l[k:]], countdown - 1)}
def erzeuge_autoren_regex(autoren_menge: set) -> str:
"""Erzeugt aus der übergebenen Menge von Autoren einen regulären Ausdruck, der
auf alle Autorennamen passt."""
def R(s: str) -> str:
return s.replace(']', r'\]').replace('[', r'\[').replace('.', r'\.')
def re_block(data: Union[Dict, List]) -> str:
if isinstance(data, list):
return '|'.join(R(autor) for autor in data)
else:
assert isinstance(data, dict)
keys = list(data.keys())
return f'(?:{keys[0]}(?:' + re_block(data[keys[0]]) + '))' + \
f'|(?:{keys[1]}(?:' + re_block(data[keys[1]]) + '))'
autoren = list(autoren_menge)
autoren.sort()
return r'\b((?<![$])' + re_block(spalte(autoren, 2)) + r')\b'
# return r'\b(' + '|'.join(autoren) + r')\b'
def schreibe_autoren_syntax_hilighting(restr: str):
with open(tmLanguage_pfad, 'r', encoding='utf-8') as f:
tmLanguage = json.load(f)
tmLanguage['repository']['opera_majora_author_name']['patterns'][0]['match'] = restr
with open(tmLanguage_pfad, 'w', encoding='utf-8') as f:
json.dump(tmLanguage, f, indent=4)
if __name__ == "__main__":
opera_majora = lade_opera_majora_tabelle()
autoren = set()
opera_majora = lade_opera_majora_tabelle(autoren)
# autoren = {'AY', 'BX', 'CW', 'DV', 'EU'}
restr = erzeuge_autoren_regex(autoren)
schreibe_autoren_syntax_hilighting(restr)
# rx = re.compile(restr)
# print(rx.match('LIGURINUS'))
# import timeit
# print(timeit.timeit("rx.match('LIGURINUS')", number=1_000_000, globals=globals()))
schreibe_schnipsel_json(opera_majora)
print('fertig :-)')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment