Reality Check: Fremddatenuebernahme mit Cut&Paste

Thomas Berger ThB at gymel.com
Do Jan 3 15:11:46 CET 2002


Liebe Liste, lieber Herr Eversberg,

ich habe spasseshalber einmal einen Flex geschrieben (unten angehaengt),
der die Uebernahme von Fremddaten realisiert, wenn diese sich in
der Zwischenablage befinden oder leicht dorthin befoerdern lassen,
Beispiele sind http://www.rezensionen.at oder die MAB-Anzeige des
BVB-OPACs.

Der Flex sammelt also die Zwischenablage ein und speichert sie weg,
damit import.exe darauf losgelassen werden kann, der ins adt-Format
konvertierte Satz wird dann als Neusatz eingelesen und zur Ergaenzung
angeboten.

Folgendes fiel mir auf:

- Die Clipboard-Funktionen ccopy, cpaste etc. haben es noch nicht
  in die allgemeine flex-Dokumentation flex/flex1/flex2ger.rtf
  geschafft, nur ueber das "Alphabetische Register" findet man 
  Dokumentation

- cpaste (kopiert Clipboard in die iV) bringt auch durchrauschenden
  Text ins Schreibfeld (vgl. "cpaste w"), genau wie bei cpaste w
  ist der Text dort aber nicht unbedingt zugaenglich, wenn/weil? 
  er ungeeignete Zeilenvorschuebe enthaelt

- Je nach Fremddatenquelle und Browser haben die Daten DOS-Zeilen-
  umbrueche (13 10), oder Unix-Zeilenumbrueche (10) oder in einem
  Fall sogar Macintosh-Zeilenumbrueche (13), die meisten vorhandenen
  Importparameter verfuegen aber nur die DOS-Umsetzung
_ 13 10
_ 0
  obwohl die Ergaenzung
_ 10
_ 0
_ 13
_ 0
  absolut gefahrlos waeren (dies betrifft die in der aktuellen Form
  kaum brauchbaren "ZACK"-Schnittstellen z39.aim, z39i.aim aber auch 
  mab2.aim und mab2cd.aim). Im unten angefuegten Flex ist durch
  !(3)! Code markiert, der Zeilenumbrueche repariert, mangels geeigneter
  Ersetzungsbefehle fuer die iV wird dies durch einen zusaetzlichen
  Wegschreibe- und Wiedereinleseprozess realisiert (eigentlich waeren
  sogar zwei noetig: der Beispielcode repariert Isolierte Zeichen 13,
  also ^M, und er muesste symmetrisch noch einmal angefuegt werden,
  um isolierte Zeichen 10, also ^J, ebenfalls umzusetzen.

- Der Import wird mit cAll ausgeloest, auffaellig war, dass danach
  a99 nicht immer im Vordergrund ist, geloest habe ich dies mit einem
  eigentlich ueberfluessigen weiteren "activate", dabei faellt jedoch
  stoerend auf, dass manchmal ein anderes DOS-Fenster (das nichts
  mit a99 zu tun hat) minimiert wird...

- Weil die URL's von rezensionen.at recht guenstig hierfuer geeignet
  sind, wollte ich eine ISBN-Suche dortselbst mit der "Tuer zur Welt"
  realisieren, das ist aber gescheitert: Der Uebergabeparameter %1
  an door.bat ist nur dann belegt (also nicht ""), wenn der letzte
  Find-Befehl *erfolgreich* war (und das ist bei Fremddatenuebernahme
  die Situation, in der man eigentlich nicht woanders weiter suchen
  moechte)

- Nun bietet ja auch Windows die Moeglichkeit, mittels "start" Dateien
  mit bekannten Extensions oder URL's mit der Windows bekannten 
  Standardanwendung zu starten, ohne dass man wissen muesste, dass
  der installierte Browser Netscape heisst und wo er installiert ist.
  Der unten angefuehrte Flex definiert Strg-s auf folgenden Flex:

ask |9ISBN f. rezensionen.at:=#uIS
if cancel end
ins #uIS
get env COMSPEC
if %cmd.exe% var "cmd /c start "
if not %start% var "start "
var +"http://www.biblio.at/rezensionen/list.php3?isbn=" #uIS
CAll

  Eigentlich soll einfach der Aufruf
start http://www.biblio.at/rezensionen/list.php3?isbn=...
  ans Betriebssystem abgesetzt werden, dieser Aufruf funktioniert so
  aber nur fuer Win'9x, wo "start" ein externes Kommando ist, fuer
  WinNT muss es "cmd /c start" heissen, weil "start" ein interner
  Befehl des Kommandointerpreters ist. Durch das "CAll" entsteht nun
  auch zusaetzlich kurzzeitig eine DOS-Box, aus der der Aufruf dann
  abgesetzt wird.
  Mein Vorschlag waere, a99 bzw. die Flex-Sprache um ein geeignetes
  "start"-Kommando zu erweitern, dass betriebssystemabhaengig stets
  einen korrekten Aufruf bewirkt, auch ohne den Umweg ueber eine
  DOS-Box, vermutlich koennte man hierdurch auch den etwas
unuebersichtlichen
  Zoo "call", "cAll", "Call", "CAll" etwas zaehmen.

Der unten angefuehrte Beispiel-Flex funktioniert uebrigens
tadellos, viel Spass damit.

viele Gruesse
Thomas Berger

--%<schnipp--
 % rezat.flx
 % Uebernahme von MAB-Daten per Cut&Paste, etwa von rezensionen.at
 % (http://www.rezensionen.at)
 % Besonderheiten: - Zeichensatz ist Latin 1
 %                 - Zeilenumbrueche sind schwer kontrollierbar

 % Anpassen:
 % !(1)!: Automatische Belegung der Phrase Strg-r beim ersten Aufruf
 % !(2)!: Umwandlung von Windows-ANSI nach DOS-ASCII zur Vorbereitung
 %        des Imports
 % !(3)!: MSIE 4.0 liefert ^M (ohne ^J) als Zeilentrenner
 % !(4)!: Name der Importparameter (eingestellt: mab2)
 % !(5)!: Name des Bearbeitungsformulars (eingestellt: [Buch: Teil 1])

 % 0. Verarbeitungsschritt: Daten sind im Browser mit der Maus markiert,
 % (etwa durch Strg-A) und dann in die Zwischenablage ueberfuehrt
 % (etwa durch Strg-C)

 % 1. Verarbeitungsschritt: Dieser Flex wird ausgeloest,
 % etwa durch Windows-Hotkey, der ueber eine .BAT-Datei flex.exe
 % aufruft, oder aber durch eine Aktion mit a99-Phrasen (das geht
 % auch mit Strg-irgendwas) oder ganz zur Not durch Eingabe von
 % X rezat
 % im Schreibfeld (bei entsprechenden Rechten)

 % !(1)! Wenn durch den ersten Aufruf gleichzeitig die Aktivierung auf
die 
 % Phrase Strg-R gelegt werden soll, die folgende Zeile aktivieren
phrase ^r X rezat.flx
 % !(1)! Wenn mit Strg-s eine ISBN-Suche ausgeloest werden soll:
var '^s x '
var +'ask |9ISBN f. rezensionen.at:=#uIS\\'
var +'if cancel end\\'
var +'ins #uIS\\'
var +'get env COMSPEC\\'
var +'if %cmd.exe% var "cmd /c start "\\'
var +'if not %start% var "start "\\'
var +'var +"http://www.biblio.at/rezensionen/list.php3?isbn=" #uIS\\'
var +'CAll'
phrase

 % 2. Verarbeitungsschritt:
 %    a - Zwischenablage wird in die iV gesammelt
cpaste 
 %    b - Plausibilitaetstest
if "### " jump istmab
mess Kein MAB-Datensatz in der Zwischenablage?
end

:istmab
 %    c - aktuelle Ausgabedatei retten nach #uRE (iV wird zerstoert)
var E
insert #uRE
 %    d - neue Ausgabedatei oeffnen
open x rezat.mab
if ok jump kannexport
mess Ausgabedatei rezat.mab kann nicht geoeffnet werden!
end

:kannexport
 %    e - Zwischenablage wird erneut in die iV gesammelt
cpaste
 %    f - nach ASCII wandeln
 % !(2)! folgende Zeile ggfls. deaktivieren, falls Importparameter ANSI
wollen
ascii
 %    g - wegschreiben, Datei schliessen
write
close xport

 !(3)! %    h - erneut einlesen, dabei Zeilenumbrueche reparieren
 !(3)! var ""
 !(3)! insert #ucx
 !(3)! open rezat.mab
 !(3)! :loop
 !(3)! fetch ^13
 !(3)! if cancel jump rereadok
 !(3)! insert #ucc
 !(3)! var #ucx "^J" #ucc(B"^J")
 !(3)! insert #ucx
 !(3)! jump loop
 !(3)! 
 !(3)! :rereadok
 !(3)! close
 !(3)!  %    i - erneut wegschreiben
 !(3)! open x rezat.mab
 !(3)! var #ucx
 !(3)! write ^
 !(3)! close xport
 %    j - Alte Ausgabedatei wiederherstellen
var #uRE
open x
var ""
insert #uRE
 !(3)! insert #ucc
 !(3)! insert #ucx

 % 3. Umwandlung anstossen
 %    a - Ergebnisdatei sicherheitshalber loeschen
fsize rezat.adt
if not no delete rezat.adt
 %    b - Importbefehl bauen (Importparameter MAB2.cIM) und minimiert
ausfuehren
 %    !(4)!: Anpassen: -i*mab2*
var P "import -f5 -imab2 -drezat.mab -ee-1/rezat.adt -P" P " -k" K " -v0
-s0"
cAll

 % 4. Ergebnis einlesen als neuen Datensatz
new
read rec rezat.adt
 %    b - Anzeige im Anzeigefenster und im Auswahlfenster aktualisieren
display
show record
 %    c - Formular hochjagen
activate
 %    !(5)!: in folgender Zeile den Namen des Formulars anpassen:
var "Buch: Teil 1"
form
if cancel end
 % 5. Speichern?
Put

 % fertig




Mehr Informationen über die Mailingliste Allegro