[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