In den letzten Wochen ist das System, mit dem wir seit Jahren aus abstrakt strukturierten Daten heraus konkrete Dokumente in verschiedenen Sprachen und Formaten erzeugen, erneut in Bewegung geraten. Während ich neue Funktionalitäten plane und implementiere, nutze ich das System, um alte zu dokumentieren. |
||
![]()
Mechanismen zur Untergruppierung innerhalb einer ZeileNormalerweise nimmt jeder Textblock eine Zeile ein. So erreichen wir die maximale Überschreibbarkeit, die wir für Mehrsprachigkeit/Pluriversionalität brauchen. Hin und wieder wollen wir dennoch mehrere Felder in eine Zeile schreiben. Dafür stehen jetzt mehrere Modifikatoren zu, die wir jeweils an das Ende der Formatierungsargumentliste der aktuellen Ebene schreiben. Mit dem Modifikator +lvlmax+1 in der Formatierungsargumentliste der aktuellen Ebene sagen wir, dass der Zeileninhalt eine 1-dimensionale Listenstruktur ist. Genau wie bei Variabeldefinitionen sind auch mehrdimensionale Strukturen möglich, die Syntax ist die gleiche. @tab = /proc+table/proc+row+lvlmax+1/ (_tb @tab |a|1| |b|2| ) Mit dem Modfikator +match+mrex verweisen wir auf die Textblockvariable mrex, deren Wert ein Perl-Musterausdruck wie \R{(.*)}{(.*)} ist, mit dem der Zeileninhalt dann mithilfe der Perl-Funktion mrex = \\R\{(.*)\}\{(.*)\} @tab = /proc+table/proc+row+match+mrex/ (_tb @tab \R{a}{1} \R{b}{2} ) Mit dem Modfikator +split+srex verweisen wir auf die Textblockvariable srex, deren Wert ein Perl-Musterausdruck wie s*&s* ist, mit dem als Argument der Zeileninhalt dann mithilfe der Perl-Funktion srex = \s*\&\s* @tab = /proc+table/proc+row+split+srex/ (_tb @tab a & 1 a & 2 ) Mit dem Modfikator +lrsplit+lrex verweisen wir auf die Textblockvariable lrex, deren Wert ein Perl-Musterausdruck wie ([.?!:])s+(:upper:) ist, mit dem als Argument der Zeileninhalt dann mithilfe der Perl-Funktion lrex = ([.?!:])\s+([[:upper:]]) @sent = /proc+lines+lrsplit+lrex/ (_tb @sent Odi et amo. Quare id faciam? Fortasse requiris. Nescio! Sed fieri sentio. Et excrucior! ) Schreiben in die Datenbank aus MLHT-Texten heraus möglich machenWe have legacy notation in /sig/oas/15/01/spez/_dok.oas_spez1501.txt and the like that is dependent on Deplate and activated with person id=lyre nom="Lyre" typ=frm rol=adr lok=ham plz=24057 str="Bierbauch" dom=19 mail="sme@lyre.com" person id=ldapaper nom="LDA Paper UK LLP" typ=frm rol=adr lok=fra plz=63207 str="Nordkaiplatz" dom=1 mail="fabius.fairmayor@ldapaper.com" ag dok=memoS1 nom="Memorandum Quintus Baum GmbH Deutsch-Chinesisch" des="90 Zeilen a 1,40 EUR" mon=126 ust=00 odat=2015-01-08 fdat=2015-01-12 de=lingoserv rkod="Auftrag 1501023" status=f:Rechnung stellen. ag dok=imibS1 nom="Gesamt" des="ADV-Dokumente ins Chinesische und Japanische" odat=2015-01-09 fdat=2015-01-13 rkod="" de=lingoserv pre=imibS1b status=f:Rechnung stellen. Replace this with something like (_adr @ul//adrdb (lyre dabagrup = adrdb typ = frm rol = adr lok = ham plz = 24057 str = Bierbauch dom = 19 mail = sme@lyre.com Lyre ) (ldapaper/adrdb dabagrup = adrdb typ = frm rol = adr lok = fra plz = 63207 str = Nordkaiplatz dom = 1 mail = fabius.fairmayor@ldapaper.com LDA Paper UK LLP ) ) and (_spz @ul//spzdb (memoS1 dabagrup = spzdb %flds = ||mon|126||ust|00||odat|2015-01-08||fdat|2015-01-12||de|lingoserv||rkod|Auftrag 1501023||status|f| Memorandum Quintus Baum GmbH Deutsch-Chinesisch 90 Zeilen a 1,40 EUR ) (imibS1 dabagrup = spzdb ||odat|2015-01-09||fdat|2015-01-13||rkod|||de|lingoserv||pre|imibS1b||status|f| Gesamt ADV-Dokumente ins Chinesische und Japanische ) ) such that the program dokdata2db program can then from the dbm file find internal special textchunks such as _dabagrups_ = +spzdb+adrdb+ _dabagrup_spzdb_rellits_ = +imibS1+memoS1+ _dabagrup_adrdb_rellits_ = +ldapaper+lyre+ Going on from there, dokdata2db should be able use rellits2putrek or similar to write the subelements of the identified rellits to the database. The _dabagrup_ info |+person+adr+tel|+tit+des+| consists of two lists: (1) names of involved dabarels, (2) shorthands of the fields that constitute initial lines of the textchunk body. To simplify, we first specify the data that each record uses with an attribute field (imibS1 @ll/spzdb odat = 2015-01-09 fdat = 2015-01-13 rkod = de = lingoserv pre = imibS1b status =f Gesamt ADV-Dokumente ins Chinesische und Japanische ) or, for additional notational simplicity, we allow specification of attributes by hash notation alongside with the plain attribute notation. The hash notation would imply that we are specifying final values that are not subjected to (_spz @ll/spzdb ||odat|2015-01-09||fdat|2015-01-13||de|lingoserv||pre|imibS1b||status|f| rkod = Gesamt ADV-Dokumente ins Chinesische und Japanische ) For the parent section we would specify an shorthand of sub_dabagrup by an extra slash, suggesting an extra hierarchy level. (_adr @ll//adrdb (memoS1 ... ) ... ) These would set the internal dabagrup attribute or dabagrup attribute respectively. This attribute would then trigger the pushing of the lit onto the internal _dabagrup__rellits_ list at the end of the Verschieben von Inhalten unterstützenBestimmte Sektionen, deren Inhalt wandern könnte, wie hier ‘mlhtdok_elal’ müssen als DOK-URI verfügbar werden. Die letzte aktuelle Version bekäme ein Sternsuffix, hinter dem noch ein mögliches Präfix stehen könnte, unter dem die DOK-URI bekannt gemacht würde, z.B. elal*mlhtdok würde zu dok:mlhtdok_elal führen. Ferner könnte man mit el_dok auf das letzte Herkunftsdokument und mit al_dok auf das nächste Auswanderungsziel verweisen. Eine DOK-URI-fähige dokumentinterne Stern-Sektion würde ähnlich wie eine datenbankeintragsfähige Sektion (s. dabarel_dbput) von Tmplfil in eine spezielle interne Variable _virtdoks_ o.ä. eingetragen und dann von dokdata2db ausgelesen und in die Datenbank geschrieben. Über die Darstellung solcher URIs in mlhtdok oder einer anderen Tabelle ist noch nachzudenken. Kurzform des Gruppenöffners ohne LeerzeichenEs gibt kaum einen Grund für die Trennung zwischen dem Gruppenöffner mit Blocknamen und dem nächsten Argument (Formatierungsstruktur) durch ein Leerzeichen. Insbesondere dort, wo es keine weiteren Argumente gibt, wäre eine leerraumlose Gruppenöffnung oft eleganter. (@vrb (_v@vrb+1 (_tb@tab+tabregex (oas_adr*@ulsekt//adrdb Dokumentvariable %indproc und %sfxfun außerhalb des Dokumentes definierbar machen%indproc = ||enumlist|1||itemlist|1||ilinioi|1||minitrivlist|1| %sfx2fun = ||url|+call+ahurlval_verb+||dok|+call+ahdokval_verb+| Umgekehrt wäre es wünschenswert, Formatstrukturvariablen wie @vrb textblock-lokal definierbar werden. Der Mechanismus mit Aktivierung von Formatierungsvariablen durch bloße TextblocknamenDurch Einrichtung der folgenden Zuweisungstabelle könnte man dafür sorgen, dass mit _ula und _ulb bereits die Formatierungsform @ul impliziert und somit nicht mehr im Text angegeben wird. %litjung = ||_vb|@vrb||_ct|@cit||_ol|@ol||_ul|@ul| So könnten Dokumente noch etwas schlanker werden. Zugleich würden sie aber auch starrer, da man in der Benennung festgelegt wäre. Angesichts dieses Nachteils ist die Umsetzung nicht vorrangig. Textblöcke aus externen Quellen einlesenWir können jetzt schon Textblöcke aus anderswo definierten Textblöcken zusammensetzen. Es gibt dabei noch Bedarf nach weiteren Varianten. Z.B. könnte es nötig sein, die von außen eingelesenen Textblöcke mit einem Aufruf In /adv/perl/A2E/Tmplfil.pm.tmpl#ELGRUP hinzu-entwickeln, was nötig ist, um Dateien wie /sig/oas/_lng.oas.txt gut zum Funktionieren zu bringen. Die in ELGRUP vorgeschlagenen Konstrukte sind oftmals weniger sinnvoll als die unten angeführte Umsetzung mit proc/call-Aufrufen, da letztere keine Textvariablen erzeugt. M.a.W. die ELGRUP-Konstrukte sind nur dann optimal, wenn man die Möglichkeit haben will, in anderen Sprachen Textvariablen zu überschreiben. Solche Situationen dürften eher selten vorkommen. (_lst @ul ! vals) @alin = /proc+alineas/proc+linioi/ (intro @alin ! +swpat+eupla+lisboa+) # warn: for backward compatibility only @litsvar = +swpat+eupla+lisboa+ (intro @alin ! lits) (_lst @ul mapcall) Besser ist vermutlich folgendes (_in /proc+include/ dbmvals_log.txt ) oder folgendes (_ir /call+include_re/ tabregex dbmvals_log.txt ) bzw (_mc /call+mapcall/ ahval_verb valsvar ) ![]() |