Write rtf with Applescript or bash

Atalantia

Atalantia

Aktives Mitglied
Thread Starter
Dabei seit
26.11.2009
Beiträge
1.894
Reaktionspunkte
432
Hallo,
ich habe meine Finger bereits erfolglos wundgegoogelt. Vielleicht weiss hier jemand wie man einen rtf formatierten Text mit bash oder Applescript ausgeben kann. Wohlgemerkt ohne ein GUI Programm wie TextEdit zu bemühen. Das Ziel ist es einen Text aus einer Variablen in roter Farbe als rtf Text auszugeben.
 
da musst du wohl halt den rich text code direkt aus dem script in eine datei schreiben.
eine rtf datei ist ja auch nur eine text datei (jetzt apples rtfd variante mal außen vor).
 
Ich habe ein Beispiel gefunden:

{\rtf1\ansi\deff0
{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}
This line is the default color\line
\cf2
This line is red\line
\cf1
This line is the default color
}

Aber sobald ich das in eine Variable reinpacken will sind die back slashes ein Problem.

Code:
do shell script "echo {\rtf1\ansi\deff0
{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}
This line is the default color\line
\cf2
This line is red\line
\cf1
This line is the default color
} > ~/Desktop/Test.rtf"
 
die musst du quasi in applescript dann doppelt escapen, als halt \\ statt nur \
 
Ok, ich habe folgendes versucht:
Code:
set var to "{\\rtf1\\ansi\\deff0
{\\colortbl;\\red0\\green0\\blue0;\\red255\\green0\\blue0;}
This line is the default color\\line
\\cf2
This line is red\\line
\\cf1
This line is the default color
}"

do shell script "echo " & quoted form of var & " > ~/Desktop/Test.rtf"

aber wenn ich in das File hineinschaue kommt nur
{
tf1nsi\deff0
{
an.
PS: Doppelter back slash wird als Zeilenumbruch interpretiert?
 
ja, der macht halt aus dem \\r und \\n newline steuerzeichen.
guck gerade mal, wie man das verhindert.
 
Das funktioniert:
Code:
#!/bin/bash
echo "{\rtf1\ansi\deff0
{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}
This line is the default color\line
\cf2
This line is red\line
\cf1
This line is the default color
}" > ~/Desktop/Test.rtf
Aber in bash weiss ich nicht wie man die Variablen einfügt, speziell weil diese aus einer Ordneraktion kommen.
 
es geht noch einfacher
do shell script "/bin/echo " & quoted form of var & " >~/Desktop/Test.rtf"
dann übersetzt der das \\r nicht mehr als neue zeile …
 
  • Gefällt mir
Reaktionen: Atalantia
Das ganze ist mir über den Kopf gewachsen. Das Script sollte einen Text erzeugen, bei dem gelegentlich eine schwarze oder rote Zeile hinzukommen, getriggert von einer Folder Action. Wenn etwas in den Ordner gelegt wird, soll eine schwarze Zeile mit Datum und Name des Objektes in das rtf File geschrieben, wenn etwas aus demselben Ordner gelöscht wird soll eine rote Zeile in dasselbe File geschrieben werden. Aber mit der Formatierung ist das zu kompliziert. Applescript scheint dafür nicht geeignet zu sein.
 
#einfache anführungszeichen verwenden
set var to 'blabla mit rich text' usw.
---
#variablen einfügen
schau mal was bei $* oder $@ mitkommt.
 
Applescript ist nicht geeignet für diese Aufgabe, weil das Dokument jedes mal neu geparst werden muss. Aber vielleicht eines von den UNIX Programmen?
VIM, PICO, NANO, EMACS, TROFF welches ist am ehesten für diese Aufgabe geeignet?
 
Hast Du eine Idee oder einen Vorschlag mit sed oder awk? Ich bin mit diesen beiden nicht besonders vertraut. Und die MAN's... naja, jeder der schon mal etwas gemacht hat weiss was ich meine.
 
bei sed würdest du quasi den gesuchten inhalt/zeile durch die zeile selber plus den code für rot ersetzen.
den richtext header am anfang einfügen nicht zu vergessen.

für sed gibt es ja tausend hilfe seiten, da findest du schnell die syntax für das suchen/ersetzen.
 
Also ich frage mal so: Wie ersetzt man das letzte Zeichen eines Strings mit bash. Ich schaffe es nicht den neuen String vor dem } als letztes Zeichen der Formatierung in rtf, einzusetzen.
 
mal eine ganz grundsätzliche frage, willst du es jetzt dateibasiert mit sed/awk machen oder stringbasiert in bash und alles am ende in eine datei schreiben?
und zeig mal, was du bisher gebaut hast?
 
Wäre es für dich eventuell interessant das ganze in einem anderen/einfacheren Dateiformat zu machen und hinterher eine Konvertierung zu RTF mittels z.B. pandoc durchzuführen?
 
Also... bis jetzt habe ich folgendes Geskriptel zusammengebastelt.
Code:
--check ob das File vorhanden ist
set removedItems to choose file multiple selections allowed yes
try
    (path to desktop as string) & "Test.rtf" as alias
on error
    --neues rtf schreiben
    do shell script "/bin/echo '{\\rtf1\\ansi\\ansicpg1252\\cocoartf1265\\cocoasubrtf210
{\\fonttbl\\f0\\fcharset0 Monaco;}
{\\colortbl;\\red255\\green255\\blue255;\\red217\\green11\\blue0;}
\\paperw11900\\paperh16840\\margl1440\\margr1440\\vieww19520\\viewh12600\\viewkind0
\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural
}' >> ~/Desktop/Test.rtf"
end try
--name und pfad des files das dem ordner entfernt wurde
tell application "System Events"
    set thisFolder to container of beginning of removedItems
    set nameInfo to name of beginning of removedItems
end tell
--einlesen des bereits vorhandenen rtf files und abschneiden des letzten steuerzeichens (})
set editList to do shell script "cat -v ~/Desktop/Test.rtf | tail -r -1"
--die neue zeile klarmachen
set toAdd to "-" & (do shell script "date +%d.%m.%Y—%T" & quoted form of space & nameInfo)
set newList to editList & "\\cf2 " & toAdd & "
}"
--das fertige file ausgeben
do shell script "/bin/echo " & quoted form of newList & " > ~/Desktop/Test.rtf"
Eigentlich ist es eine Ordneraktion aber zum Testen habe ich es als normale Funktion geschrieben. Die Kopfzeile wird am Schluss so aussehen:
Code:
on removing folder items from thisFolder after losing removedItems
 
Zuletzt bearbeitet:
Code:
do shell script "/bin/echo '{\\rtf1\\ansi\\ansicpg1252\\cocoartf1265\\cocoasubrtf210
{\\fonttbl\\f0\\fcharset0 Monaco;}
{\\colortbl;\\red255\\green255\\blue255;\\red217\\green11\\blue0;}
\\paperw11900\\paperh16840\\margl1440\\margr1440\\vieww19520\\viewh12600\\viewkind0
\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural
}' | head -n -1"
funktioniert auch nicht. Zum kotzen.
 
Zuletzt bearbeitet:
Ich hab's geschafft. Danke.
 
Zurück
Oben Unten