[GastForen Programmierung/Entwicklung AppleScript Erstellen eine Droplets zur Konvertierung einer Textdatei

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Erstellen eine Droplets zur Konvertierung einer Textdatei

huckebein1954
Beiträge gesamt: 11

19. Apr 2011, 12:31
Beitrag # 1 von 13
Bewertung:
(5896 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Tag zusammen,

ich bin ein Neuling in Sachen „Apple Srcipt" und habe folgendes Problem. Es existiert ein kleines Perl-Script, dass die in einer Textdatei enthaltenen XPress-Tags in InDesign-Tags umwandelt. Dieses Script funktioniert auch wunderbar wenn ich es händisch bediene.
Jetzt hätte ich gern ein Droplet oder einen Hotfolder mit einem Workflow der das ganze automatisiert. Das heißt, wenn eine Datei mit der Endung txt in einen Ordner geschoben wird, wird das Perl-Script automatisch ausgeführt und die Datei entweder unter einem neuen Namen im gleichen Ordner gespeichert, oder – noch besser – in einem anderen Ordner gespeichert.

Ich bin für jede Hilfe dankbar

Das Perl-Script hänge ich einmal an




#!/usr/bin/perl

$infile = $ARGV[0];

unless ( defined ($infile)) { die "Keine Quelldatei angegeben..."; }

open(SOURCE, "< $infile") or die "\nDatei $infile existiert nicht\n\n";

# Local Block that ignores line endings...
{
local $/;
undef $/;
$input = <SOURCE>;
}

close(SOURCE);

$input =~ s/\@bl\:/<ParaStyle:bl>/gs;
$input =~ s/\@sperren\:/<ParaStyle:sperren>/gs;
$input =~ s/\@e\:/<ParaStyle:e>/gs;
$input =~ s/\@zahlen\:/<ParaStyle:zahlen>/gs;
$input =~ s/\@r\:/<ParaStyle:r>/gs;

$input =~ s/<B>/<ct:Bold>/gs;
$input =~ s/<P>/<ct:Roman>/gs;

$input =~ s/\$/<0x2005>/gs;
$input =~ s/<\\\!q>/<0x2005>/gs;

$input =~ s/<\+>(.*?)<\+>/<cp:Superscript>$1<cp:Normal>/gs;
$input =~ s/<->(.*?)<->/<cp:Subscript>$1<cp:Normal>/sg;

$input =~ s/<\\<>/\\</gs;
$input =~ s/<\\>>/\\>/gs;

$input =~ s/<\\h>/<0x00AD>/gs;

# Halbgeviertstrich
$input =~ s/--/\xD0/gs;

# <\@> in @
$input =~ s/<\\@>/@/gs;

$input =~ s/#//gs;

# Kopfzeile schreiben
$output = "<ASCII-MAC>\x0B".$input;

# Zeilenumbrüche korrigieren...
$output =~ s/\x0B/\r/gs;

open(OUTPUT, "> converted_".$infile) or die "Kann die Zieldatei nicht anlegen";
print OUTPUT $output;
close (OUTPUT);
X

Erstellen eine Droplets zur Konvertierung einer Textdatei

Hans Haesler
  
Beiträge gesamt: 5826

19. Apr 2011, 13:06
Beitrag # 2 von 13
Beitrag ID: #469510
Bewertung:
(5881 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo huckebein1954,

herzlich willkommen im AppleScript-Forum auf HDS! :-)

Es sollte möglich sein, die Aktionen des Perl-Scripts in reines AppelScript zu portieren. Vielleicht könnte auch ganz einfach das Perl-Script ausgeführt werden. Aber damit kenne ich mich zuwenig aus.

Bevor ich mich an die Arbeit mache: Welches Mac OS wird eingesetzt? Auf welchem Maschinentyp? (PowerPC oder Intel).

Ich muss gleich weg und kann es erst im Laufe des Abends anpacken. Vielleicht kommt mir ja jemand zuvor ...

Gruss, Hans


als Antwort auf: [#469501]

Erstellen eine Droplets zur Konvertierung einer Textdatei

huckebein1954
Beiträge gesamt: 11

19. Apr 2011, 13:14
Beitrag # 3 von 13
Beitrag ID: #469514
Bewertung:
(5872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die schnelle Antwort.

Eingesetzt wird Mac OS X, Version 10.6.7, mit einem Intel-Prozessor.

Die Variante mit dem ausgeführten Perl-Script wäre mir sympathischer, da dann dieses Script bei Bedarf angepasst werden könnte.

Noch einmal, vielen Dank für die schnelle Antwort


als Antwort auf: [#469510]

Erstellen eine Droplets zur Konvertierung einer Textdatei

Hans Haesler
  
Beiträge gesamt: 5826

19. Apr 2011, 23:14
Beitrag # 4 von 13
Beitrag ID: #469587
Bewertung:
(5834 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo huckebein1954,

bitteschön.

Der Code des Droplets kann ebenfalls bei Bedarf angepasst werden. :-)

In dieser ersten Version werden die neuen Textdateien, mit "_mod" ergänzt, im gleichen Ordner gespeichert.

Einen speziellen Zielordner können wir festlegen, sobald das Script funktioniert.

Wenn nicht beim Austauschen der <+> und <-> in die Tags für hoch- und tiefgestellt für den von den Marken umschlossenen Text eine RegEx-Wildcard benutzt werden müsste, könnte das gesamte Suchen und Ersetzen mit reinem AppleScript gemacht werden.

Deshalb muss für die verwendeten Befehle die Scripting Addition "Satimag.osax" installiert werden. Erhältlich hier: http://www.satimage.fr/...ompanion_osaxen.html

Den folgenden Code auswählen, kopieren und in ein leeres Skripteditor-Fenster einsetzen. Dann auf das Icon "Übersetzen" klicken (der Text sollte Schwarz und Grün und Blau und Grau eingefärbt werden).

Schliesslich als Droplet speichern: Menü "Ablage", Artikel "Speichern". Im Dialog einen Namen eintippen (z.B. TagsErsetzen_01d), einen Zielordner für das Droplet wählen und im unteren Teil im lokalen Menü "Dateiformat" den Artikel "Programm" einstellen. Die drei Checkboxen nicht aktivieren. Und "Sichern" klicken.

Code
(* 
TagsErsetzen_02d
In einer Textdatei die Tags durch InDesign-Tags ersetzen.
© 20.04.2011 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

-- einen Dialog zeigen, falls der Anwender einen Doppelklick auf das Droplet macht
on run
display dialog "Dateien und Ordner auf dem Icon
dieses Droplets deponieren." buttons "OK" default button 1 with icon 0
end run

-- der 'open handler', welcher auf das Fallenlassen von Objekten reagiert
on open allObjects
set ctr to 0
-- Wiederholschleife, welche alle gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat
-- den Anwender über das Ergbenis der Aktion informieren
display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
end open

-- im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist.
-- Bei Ordnern wird eine Liste des Inhalts erstellt und die Elemente rekursiv behandelt
-- (d.h. zum aktuellen Handler geschickt)
-- Dateien werden zum Handler 'processFile' gesandt
on processObject(aObject)
-- wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner
if (aObject as string) ends with ":" then
-- die Liste des Inhalts wird erstellt (ohne unsichtbare Dateien)
set contentsList to list folder aObject without invisibles
-- der Finder öffnet den Ordner, damit man sieht, dass etwas geschieht
tell application "Finder" to open folder aObject

-- dies ist das rekursive Teil: die Wiederholschleife schickt alle Objekte zum Handler,
-- in welchem sie sich selbst befindet
repeat with anItem in contentsList
set objPath to ((aObject as Unicode text) & anItem)
processObject(objPath as alias)
end repeat
-- der Finder schliesst den Ordner (dieses Öffnen/Schliessen zeigt
-- dem Anwender, was gerade geschieht)
tell application "Finder" to close window of folder aObject

-- wenn das Objekt eine Datei ist, dann wird der Pfad dem Handler 'processFile' übergeben
else
processFile(aObject as Unicode text)
end if
end processObject

-- in diesem Handler wird die Datei eingelesen, die Tags werden ersetzt
on processFile(curFile)
-- den Namen der Datei speichern
tell application "Finder" to set curName to name of file curFile
-- wenn es eine Text-Datei ist
if curName ends with ".txt" then
-- den Ordner-Pfad speichern
tell application "Finder" to set folderPath to (container of file curFile) as Unicode text
--die Datei einlesen
set curString to read file curFile
-- testen, ob die Datei nicht schon behandelt worden ist
if not (curString contains "<ASCII-MAC>") then

-- die Austausch-Befehle (benötigen die Scripting Addition "Satimage.osax")
set curString to change "@bl:" into "<ParaStyle:bl>" in curString
set curString to change "@sperren:" into "<ParaStyle:sperren>" in curString
set curString to change "@e:" into "<ParaStyle:e>" in curString
set curString to change "@zahlen:" into "<ParaStyle:zahlen>" in curString
set curString to change "@r:" into "<ParaStyle:r>" in curString

set curString to change "<B>" into "<ct:Bold>" in curString
set curString to change "<P>" into "<ct:>" in curString

set curString to change "$" into "<0x2005>" in curString
set curString to change "<\\!q>" into "<0x2005>" in curString

set curString to change "<\\+>(.*?)<\\+>" into "<cp:Superscript>\\1<cp:>" in curString with regexp
set curString to change "<->(.*?)<->" into "<cp:Subscript>\\1<cp:>" in curString with regexp

set curString to change "<\\<>" into "\\<" in curString
set curString to change "<\\>>" into "\\>" in curString

set curString to change "<\\h>" into "<0x00AD>" in curString

-- Halbgeviertstrich
set curString to change "--" into "<0x2013>" in curString

-- <\@> in @
set curString to change "<\\@>" into "@" in curString

-- Zeilenumbrüche korrigieren...
set curString to change "# " into "
" in curString

-- Zeilenumbrüche korrigieren...
set curString to change " " into "
" in curString

-- Kopfzeile einfügen
set newString to "<ASCII-MAC>" & return & curString

-- den neuen Dateinamen zusammensetzen (5 Zeichen plus ".pdf")
set newName to (text 1 thru -5 of curName) & "_mod.txt"
set newFile to (folderPath & newName) as string

-- den Handler aufrufen, welcher in die neue Datei erzeugt
writeFile(newFile, newString)
end if
end if
end processFile

-- die neue Datei schreiben
on writeFile(newFile, newString)
try
open for access file newFile with write permission
write newString to file newFile starting at eof
close access file newFile
on error
try
close access file newFile
end try
end try
end writeFile

Es kann eine einzelne Textdatei auf das Icon des Droplets gezogen werden, oder mehrere Textdateien, oder ein Ordner, welcher die Textdateien enthält.

Falls es nicht auf Anhieb klappen sollte: Würdest Du mir bitte eine Textdatei und das entsprechende InDesign-Dokument zustellen? Bitte stuffen oder zippen, damit nichts verändert wird.

Edit: Ich habe soeben den Code ergänzt und einen Test eingefügt, welcher prüft, ob die Datei nicht schon "<ASCII-MAC>" enthält. Sonst würde sie erneut behandelt.

Edit 2: Noch eine Änderung ... In den Zeilen mit Superscript und Subscript muss das Fragezeichen innerhalb der Klammern stehen. So: (.*?), damit bei mehreren Vorkommen auch jedes richtig behandelt wird.

Edit 3: Letzte (?) Änderung ... Weil die Textdatei nicht "rein" ist, müssen die Returns ersetzt werden.

Gruss, Hans


als Antwort auf: [#469514]
(Dieser Beitrag wurde von Hans Haesler am 20. Apr 2011, 23:07 geändert)

Erstellen eine Droplets zur Konvertierung einer Textdatei

huckebein1954
Beiträge gesamt: 11

20. Apr 2011, 08:20
Beitrag # 5 von 13
Beitrag ID: #469598
Bewertung:
(5815 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen, vielen Dank für deine schnelle Hilfe.

Spätestens heute nachmittag, wenn ich meine normale Arbeit erledigt habe, werde ich das Ergebnis deiner Arbeit ausprobieren. Ich werde mich an deine Anweisungen halten und alles so installieren wie von dir beschrieben.

Danach werde ich mich wieder melden.

Nochmals vielen Dank an dieses Forum und ganz speziell an dich für diesen schnellen und engagierten Einsatz.

Gruß huckebein


als Antwort auf: [#469587]

Erstellen eine Droplets zur Konvertierung einer Textdatei

Hans Haesler
  
Beiträge gesamt: 5826

20. Apr 2011, 08:46
Beitrag # 6 von 13
Beitrag ID: #469600
Bewertung:
(5810 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo huckebein,

bitteschön.

Ich bin zuversichtlich, dass Du das Droplet zum Laufen bringen wirst. Wir sind gespannt auf Deinen Bericht.

Bei den InDesign-Tags habe ich ein paar Änderungen gemacht, weil beim Import in ein CS5-InDesign-Dokument Fehler gemeldet wurden. Nachdem ein Zeichenformat zugewiesen wurde (z.B. <ct:Bold>) wird für das Zurücksetzen auf die aktuelle Formatierung nur <ct:> benötigt. Und nicht ein weiteres Zeichenformat.

Gruss, Hans


als Antwort auf: [#469598]

Erstellen eine Droplets zur Konvertierung einer Textdatei

huckebein1954
Beiträge gesamt: 11

20. Apr 2011, 11:04
Beitrag # 7 von 13
Beitrag ID: #469615
Bewertung:
(5781 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

gerade habe ich etwas Luft und einmal versucht deine Anweisungen zu befolgen. Leider funktioniert der Download-Link zu „Satimage.osax" bei mir nicht.

(Browser: Google Chrome und Firefox)

Vielleicht kannst du mir noch eine andere Quelle nennen.

Gruß Huckebein


als Antwort auf: [#469600]

Erstellen eine Droplets zur Konvertierung einer Textdatei

Hans Haesler
  
Beiträge gesamt: 5826

20. Apr 2011, 13:18
Beitrag # 8 von 13
Beitrag ID: #469636
Bewertung:
(5752 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Huckebein,

ja, stimmt, der offizielle Satimage-Server scheint ein Problem zu haben.

Hier ist ein anderer Link, welcher funktionieren sollte: http://download.cnet.com/...351.html?tag=mncol;1

Gruss, Hans


als Antwort auf: [#469615]

Erstellen eine Droplets zur Konvertierung einer Textdatei

Hans Haesler
  
Beiträge gesamt: 5826

20. Apr 2011, 23:14
Beitrag # 9 von 13
Beitrag ID: #469678
Bewertung:
(5717 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Huckebein,

Respekt: Du hast unaufgefordert einen Mitgliedsbeitrag einbezahlt. Das ist vorbildlich. Im Namen des Forum-Gründers: Herzlichen Dank!

Ich bedanke mich für die Testdateien. Schade, dass es nicht auf Anhieb klappte. Aber weil die zu verwendende Textdatei nicht "rein" ist, müssen auch die Returns durch "richtige" ersetzt werden. Die entsprechenden Befehle habe ich soeben oben im Script eingefügt. Aber weil die Serversoftware sehr wahrscheinlich die FM-Returns weggeputzt hat, sende ich Dir das Droplet per E-Mail.

Gruss, Hans


als Antwort auf: [#469636]

Erstellen eine Droplets zur Konvertierung einer Textdatei

huckebein1954
Beiträge gesamt: 11

21. Apr 2011, 08:40
Beitrag # 10 von 13
Beitrag ID: #469691
Bewertung:
(5681 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für deine Mühe,

leider verschwindet die Fehlermeldung nicht.

Ich habe Satimage.osax m. E. in das richtige Verzeichnis kopiert (siehe Screenshot). Es liegt auf dem Startvolume im Ordner „Library" im Ordner „ScriptingAdditions".

Ich habe die Aktion auch auf einem anderen Rechner ausprobiert, das gleiche Ergebnis.

Gruß huckebein


als Antwort auf: [#469678]
Anhang:
Bildschirmfoto 2011-04-21 um 08.33.34.png (281 KB)

Erstellen eine Droplets zur Konvertierung einer Textdatei

Hans Haesler
  
Beiträge gesamt: 5826

21. Apr 2011, 09:09
Beitrag # 11 von 13
Beitrag ID: #469694
Bewertung:
(5674 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Huckebein,

ja, die Satimage.osax ist am richtigen Ort. Ich vermute, dass es nicht die zum Mac OS passende Version ist.

Ich werde Dir eine neuere Version zustellen, welche hoffentlich funktionieren wird.

Gruss, Hans


als Antwort auf: [#469691]
(Dieser Beitrag wurde von Hans Haesler am 21. Apr 2011, 09:19 geändert)

Erstellen eine Droplets zur Konvertierung einer Textdatei

huckebein1954
Beiträge gesamt: 11

21. Apr 2011, 11:02
Beitrag # 12 von 13
Beitrag ID: #469713
Bewertung:
(5648 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

es funktioniert, ich bin glücklich.

Es ist genau so wie ich es mir vorgestellt habe.

Vielen, vielen Dank für deine nicht nachlassende Mühe die Geschichte ans Laufen zu bringen.

As Beweis hänge ich noch einmal ein PDF an. In der linken Spalte ist der Text mit dem Perl-Script konvertiert, in der rechten mit dem Apple-Script-Droplet.

Dieses Forum ist einfach Spitze und ich werde nicht aufhören es weiterzusagen.

Schöne Osterfeiertage wünscht aus dem Ruhrgebiet

huckebein


als Antwort auf: [#469694]
Anhang:
Final.pdf (62.3 KB)

Erstellen eine Droplets zur Konvertierung einer Textdatei

Hans Haesler
  
Beiträge gesamt: 5826

21. Apr 2011, 11:12
Beitrag # 13 von 13
Beitrag ID: #469715
Bewertung:
(5644 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Huckebein,

bitteschön. Wunderbar, dass es jetzt klappt.

Ich hoffe sehr, dass sich das Droplet auch in der Praxis bewähren wird.

Gruss, Hans


als Antwort auf: [#469713]
X