Funktionalitätserweiterungen beim Multilingualen Hypertext MLHT

A2E-Textprogrammierung kommt wieder in Fahrt
English

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.

yusiao_santcasing_siandzy

Mechanismen zur Untergruppierung innerhalb einer Zeile

Normalerweise 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 m in Felder getrennt wird.

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 split in Felder getrennt wird.

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 split in Felder getrennt wird, wobei der von dem linken umklammerten Teilausdruck gefundene Teil des Trenners an das jeweils linke Feld angehängt und der rechte Teil dem jeweils rechten Feld vorangestellt wird. Beispielsweise kann auf diese Weise ein Absatz in Sätze getrennt werden, deren abschließendes Interpunktionszeichen (z.B. Punkt) dann an dem links davon gefundenen Satz, von dem es genommen wurde, wieder angehängt wird, und deren eröffnender Großbuchstabe dem rechts davon gefundenen Satz wieder vorangestellt wird. Analog hierzu gibt es die Versionen lsplit und rsplit, bei denen jeweils nur ein Teilausdruck links bzw rechts den gefundenen Gliedern entnommen und zurückgegeben wird.

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 machen

We have legacy notation in /sig/oas/15/01/spez/_dok.oas_spez1501.txt and the like that is dependent on Deplate and activated with make dbput, looking roughly like this:

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 dabagrup. Moreover we provide an attribute field sub_dabagrup to be used in the parent section so that we can have a list of subsections that all enter the database automatically. Finally, we replace this notation with a more robust notation such as

(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 $m->grupfill expansion.

(_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 Tmplfil.pm process. The dabagrup itself would have to have been defined and registered in the internal _dabagrups_ variable by a command like special dabagrup adrdb |person+adr+tel|tit+des|. This _dabagrups_ registry would in a separate step be used by dokdata2db as the starting point for finding the records and writing them to the database.

Verschieben von Inhalten unterstützen

Bestimmte 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 Leerzeichen

Es 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 grup_add_grupvars, der dem aktuellen Block alle lokalen Variablen bereitstellt, wäre durch einen Mechanismus zu ersetzen oder ergänzen, der die Variablen bei Bedarf in der Gruppenhierarchie von unten nach oben sucht, wobei ganz oben die globale Ebene wäre.

Aktivierung von Formatierungsvariablen durch bloße Textblocknamen

Durch 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 einlesen

Wir 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 mapcall zu transformieren, der ähnlich wie das vorhandene foreach funktionieren aber mit Listenausdrücken operieren würde.

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
)
netzplanet_fachkraefteverladung
[ phm | 2015 | Januar | Hypertext
Gültiges XHTML 1.0! Gültiges CSS! deplate
http://a2e.de/dok/phm_pub_mlht1501
© 2006-02-19 Hartmut PILCH