[Tustep-Liste] Endtags richtig zuordnen und aufl�sen
Kuno Sch�lkle
Schaelkle at zdv.uni-tuebingen.de
Do Jun 9 09:23:54 CEST 2005
Sehr geehrte Herr Brunschoen,
> in einer Datei werden Auszeichnungen mit <aXYZ>text</a> vorgenommen, wobei
> XYZ = <><% und <aXYZ> beliebig oft und über TUSTEP-Satzgrenzen hinweg
> ineinander verschachtelt sein kann, z.B.:
> Text <aUVW>text<aABC><aGHI>blahblah</a>blöhk<MNO>mäh</a></a></a>.
>
> Wie kann TUSTEP die Endtags richtig zuordnen und folgendermaßen auflösen:
> Text <aUVW>text<aABC><aGHI>blahblah</aGHI>blöhk<MNO>mäh</aMNO></aABC></aUVW>.
>
> vor dem geistigen Auge sehe ich ein knackiges KOPIERE mit vollwertiger
> Sprungtabelle und xx-Anweisungen,
das hat Ihnen Herr Trauth schon geliefert.
> das von einem gedrungenem $$-MAKRO mit
> einem ausgewachsenen Loop zwischen Access und Endaccess umworben wird.
das will ich versuchen:
Im folgenden Makro werden die Daten portionsweise
eingelesen. Eine neue Portion beginnt jeweils
1) mit jedem neuen Satz
2) vor jeder Anfangskennung
3) nach jeder Endekennung
Beispiel:
Anfangskennung sei [a], Endekennung sei [e].
Dann ergeben sich aus den Eingabedaten
eins [a] zwei [e] drei [a] vier [a] fuenf [e] sechs
sieben [e] acht
folgende Portionen:
eins
[a] zwei [e]
drei
[a] vier
[a] fuenf [e]
sechs
sieben [e]
acht
Als Anfangskennung und Endekennung koennten jeweils
mehrere Zeichenfolgen definiert werden. Im Makro
geschieht dies mit den Tabellen atab und etab.
Die Anfangskennung, der Text und die Endekennung
werden jeweils in eine eigene Variable abgespeichert.
Im Makro sind dies die Varialben aken, text und eken.
Die Variablen typ und anz sind syntaktisch erforderlich,
werden aber in diesem Makro nicht weiter benoetigt.
01 $$! quelle, ziel
02 $$=- []
03 MODE VARIABLE
04 SET status = CHECK (quelle, READ, TUSTEP)
05 ERROR/STOP "QUELLE: ", status
06 SET status = CHECK (ziel, WRITE, TUSTEP)
07 ERROR/STOP "ZIEL: ", status
08 BUILD S_TABLE atab = ":<<a<><%>>:"
09 BUILD S_TABLE etab = ":<</a>>:"
10 ACCESS q: READ/STREAM/RECORDS "[quelle]" ...
11 s.z/u, aken/atab + txt + eken/etab, typ
12 ACCESS z: WRITE/ERASE/STREAM "[ziel]" ...
13 s.z/u, aken + txt + eken, anz
14 SET tags = ""
15 LOOP
16 READ q
17 IF (EOF) EXIT
18 IF (aken.NE."") THEN
19 SET tags = INSERT (tags, 1, aken)
20 ENDIF
21 IF (eken.NE."") THEN
22 SET tags = REMOVE (tags, 1, eken)
23 SET eken = END_TAG (eken)
24 ENDIF
25 WRITE z
26 ENDLOOP
27 ENDACCESS q
28 ENDACCESS z
04: Quelldatei prüfen
05: Makro ggf. mit Fehlermeldung beenden
06: Zieldatei prüfen
07: Makro ggf. mit Fehlermeldung beenden
08: Tabelle mit den Anfangskennungen
09: Tabelle mit der Endekennung
10: Quelldatei öffnen
12: Zieldatei öffnen
14: Variable tags = "", d.h. keine Tags offen
16: aken+text+eken einlesen
17: Wenn Dateiende erreicht: fertig
18: Wurde eine Anfangskennung gelesen?
19: Tag in Variable tags merken
21: Wurde eine Endekennung gelesen?
22: Letztes Tag nach eken und in tags löschen
23: Aus dem Tag entspr. Endetag erzeugen
25: aken+text+eken ausgeben
27: Quelldatei schließen
28: Zieldatei schließen
Mit freundlichen Gruessen
Kuno Schaelkle
Mehr Informationen über die Mailingliste Tustep-Liste