|
|
|||
23.04.2024 | Archiv # Recherche # Links # Kontakt # Gästebuch # Impressum | |||
Index Login Die Anzeige des Archivs erfolgt grafisch. Ändern |
GeoTools - Die TextkonvertierungDie Textkonvertierung
Wie aus Anfragen ersichtlich ist, bereitet die Logik der Textkonvertierung gelegentlich einiges Kopfzerbrechen. Deshalb möchte ich hier einige Hinweise geben, die das Ganze vielleicht etwas anschaulicher machen. Für Programmierer unter den Lesern eventuell interessant sind die Auszüge aus dem Originallisting dieses Moduls der GeoTools; sie sind kein Geheimnis und Sie können sie gern für eigene Programme benutzen. Da dieser Teil der GeoTools in PowerBASIC programmiert wurde, dürfte es wohl kaum Verständnisschwierigkeiten geben.
Ziel der Konvertierung ist, den Text in folgender Form nach GeoWrite zu bekommen, um dann mit den Möglichkeiten von GeoWrite die Formatierungen korrekt vornehmen zu können. Programmiertechnisch fällt es leicht, Zeilenendschaltungen zu entfernen: Die Ausgangsdatei wird im INPUT-Modus geöffnet und Zeile für Zeile eingelesen, wobei die Zeilenendmarken bereits rausfallen. Geschrieben wird dann die konvertierte Zeile im BINARY-Modus, mit dem man eine direkte Steuerungsmöglichkeit bezüglich der CR/LF-Codes besitzt. Listing Teil 1 OPEN datei$ FOR INPUT AS #1 'öffnen der Quelldatei OPEN dateineu$ FOR BINARY AS #2 'Anlegen der Zieldatei IF option$(6) = "J" THEN PUT$ #2, CHR$(0) 'Nullbyte für externe Konvertierung DO WHILE NOT EOF(1) 'Start der Bearbeitungsschleife LINE INPUT #1, zeile$ Wenn die Option externe Zeichenumwandlung gewählt wurde (option$(6)), muss die neue Datei mit einem Null-Byte beginnen, um die interne Konvertierung von GeoWrite auszuschalten.
Text-Konvertierungs-Optionen Zeilenschaltung entfernen J option$(1) Leerzeile zwischen Absätzen N option$(2) führende Leerschritte > Tab 0 option$(3) mittlere Leerschritte > Tab J option$(4) feste Seitenumbrüche entfernen N option$(5) externe Zeichenumwandlung J option$(6) Die einzelnen Konvertierungsoptionen sind in einer Tabelle mit der Bezeichnung Option$() abgelegt und werden vom Programm nacheinander abgefragt. Listing Teil 2 IF UPPER$(option$(3)) = "J" THEN 'führende Leerzeichen sollen zu Tabs werden leerzaehler% = 0 WHILE MID$(zeile$, leerzaehler% + 1, 1) = SPACE$(1) INCR leerzaehler% LOOP leerzaehler% = leerzaehler% \ 5 zeile$ = STRING$(leerzaehler%, 9) + LTRIM$ (zeile$) 'pro 5 Leerschritte ein Tab ELSEIF option$(3) = "0" THEN 'führende Leerzeichen sind zu eliminieren zeile$ = LTRIM$(zeile$) END IF Erst wenn störende führende Leerschritte entfernt sind, kann die Zeilenende-Prüfung einsetzen.
Listing Teil 3 IF UPPER$(option$(1)) = "J" THEN IF zeile$ = "" THEN 'Das ist offenbar eine Leerzeile. IF absatz% THEN EXIT IF 'Ausstieg, weil schon ein Absatz besteht. absatz% = -1 'Merker setzen, daß ein Absatz eingefügt wurde. zeile$ = CHR$(13, 10) 'Absatzcode wird eingefügt. IF UPPER$(option$(2)) = "J" THEN zeile$ = CHR$(13, 10) + zeile$ 'Nur in dieser Abfrage taucht die Option "Leerzeile zwischen Absätzen" auf, eingeschachtelt in das Entfernen von Zeilenschaltungen, denn nur hier ist sie sinnvoll. Es ist nicht möglich, zusätzliche Leerzeilen per Konvertierung einzuziehen. ELSEIF zeile$ = CHR$(12) THEN 'Hier ist ein fester Seitenumbruch gefunden worden. IF absatz% THEN zeile$ = "" 'Wenn schon ein Absatz eingezogen wurde, ist nichts zu veranlassen.... ELSE zeile$ = SPACE$(1) 'anderenfalls mal eben ein Leerzeichen einfügen. END IF ELSE 'Hier endlich der Normalfall. Jetzt wird geprüft, ob nicht aufgrund der folgenden Zeichen doch ein Zeilenwechsel vorzunehmen ist. zeile$ = RTRIM$(zeile$) IF RIGHT$(zeile$, 1) <> "-" THEN zeile$ = zeile$ + SPACE$(1) IF NOT absatz% THEN IF MID$(zeile$, 2, 1) = ")" OR INSTR(LEFT$(zeile$, 1), ANY CHR$(9, 32, 45)) THEN zeile$ = CHR$(13, 10) + zeile$ ELSEIF INSTR("0123456789", LEFT$(zeile$, 1)) <> 0 AND INSTR(LEFT$(zeile$, 5), ".") <> 0 THEN zeile$ = CHRS(13, 10) + zeile$ END IF END IF absatz% = 0 'Nun noch vermerken, daß die letzte Zeile nicht mit einem Absatz schloß... END IF ELSE zeile$ = CHR$(13, 10) + zeile$ 'Und zu guter Letzt die Übernahme ohne Entfernung der Zeilenschaltung, wenn option$(l) <> "J" ist. END IF Damit ist die erste Hürde schon mal genommen. Was jetzt noch kommt, ist nicht weiter problematisch und geht auch brav in der Reihenfolge der Options-Nummern vonstatten. An vierter Stelle steht die Umwandlung von Leerschritten innerhalb einer Zeile (mit der Möchtgern-Texter eine sogenannte Formatierung herzustellen gedenken) in einen Tab-Sprung. Nichts leichter als das, denn das Programm prüft eben mal, ob Folgen von Leerzeichen in der aktuellen Zeile auftreten. Die Verschachtelung der Schleifen ist notwendig, weil man ja nie weiß, wieviele blanks wie oft in einer Zeile drinsein könnten.
Listing Teil 4 IF UPPER$(option$(4)) = "J" THEN WHILE INSTR (zeile$, SPACE$(3)) leerzaehler% = INSTR(zeile$, SPACE$(3)) WHILE MID$(zeile$, leerzaehler%, 1) = SPACE$(1) zeile$ = LEFT$(zeile$, leerzaehler% -1)_ + RIGHT$(zeile$, LEN(zeile$) leerzaehler%) LOOP zeile$ = LEFT$(zeile$, leerzaehler% - 1) + CHR$(9) + RIGHT$(zeile$, LEN(zeile$) - leerzaehler% + 1) LOOP END IF Ganz simpel ist das Entfernen fester Seitenumbrüche:
Listing Teil 5 IF UPPER$(option$(5)) = "J" AND zeile$ = CHR$(12) THEN zeile$ = "" Jetzt kommt der zweite wichtige Aspekt der Konvertierung, das externe Umwandeln von Zeichen. Auslöser für die Programmierung dieser Funktion war das eigenwillige Verhalten des GeoWorks-Imports gegenüber dem §-Zeichen. Nun ja, dann kamen immer noch weitere Ideen hinzu, z.B. die in GeoWorks enthaltenen Sonderzeichen, die in ASCII fehlen und umgekehrt. Als letzte Konvertierung wurde dann noch die Schweizer-Option "angestrickt". Listing Teil 6 IF UPPER$(option$(6)) = "J" THEN REPLACE CHR$(172) WITH "1/4" IN zeile$ REPLACE CHR$(171) WITH "1/2" IN zeile$ 'Jetzt folgen einige ganz wichtige Zeilen, denn wenn die GeoWorks-Import-Funktion auf ein ASCII- Steuerzeichen stösst, wird die ganze schöne externe Konvertierung hinfällig. Deshalb müssen die benötigten Steuerzeichen mit einem Null-Byte ergänzt werden, die anderen werden gegen ein Null-Byte ausgetauscht. REPLACE CHR$(9) WITH CHR$(9, 0) IN zeile$ REPLACE CHR$(12) WITH CHR$(12, 0) IN zeile$ REPLACE CHR$(13, 10) WITH CHR$(13, 10, 0) IN zeile$ zutauschen$=CHR$(1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20, 22,23,24,25,26,27,28,29,30,31) zutauschen$ = zutauschen$ + konvertvonAscii$ tauschengegen$ = STRING$(27, 0) + konvertnachGeos$ _ + STRING$(67, ersatzzeichen$) REPLACE ANY zutauschen$ WITH tauschengegen$ IN zeile$ REPLACE "(C)" WITH CHR$(169) IN zeile$ REPLACE "(c)" WITH CHR$(169) IN zeile$ REPLACE "(R)" WITH CHRS(168) IN zeileS REPLACE "(r)" WITH CHR$(168) IN zeile$ REPLACE "%o" WITH CHR$(228) IN zeile$ REPLACE "" WITH "ss" IN zeile$ 'Das ist der Austausch von ß gegen ss, auch wenn der Befehl etwas komisch aussieht. Im String konvertvonAscii$ ist das ß (ASCII codiert) schon enthalten und wird mit konvertnachGeos$ in den richtigen GeoWorks-Code umgewandelt. Der entspricht dem ASCII-Zeichen , das nun, weil ja auf DOS-Ebene programmiert wird in ss umzuwandeln ist. Alle Klarheiten beseitigt END IF Nun sind alle Konvertierungen vorgenommen worden, die Zeile kann in die neue Datei geschrieben werden und es geht weiter mit der nächsten Zeile, bis dann (Listing Teil 1) die EOF-Bedingung erfüllt ist. Dann steigt das Programm aus der Schleife aus und schliesst die Dateien. Listing Teil 7 PUT$ #2, zeile$ LOOP CLOSE Sie müssen nun nur noch vor dem Import nach GeoWrite die richtigen Seiten-, Absatz- und Schrift-Einstellungen wählen, bevor Sie Einlesen aus ASCII-Datei aufrufen.
Burkhard Oerttel
Kurzlink hierhin: http://geos-printarchiv.de/439 |
|||
Letzte Änderung am 01.11.2019 |