Mit AppleScript Hyperlinks erzeugen

Ich sollte für ein grösseres Buch, das als E-Book publiziert werden soll, hunderten von Indexinträgen je einen Hyperlink zuweisen. Es ist mir gelungen, die Namen (also die Link-Ziele) per AppleScript zu erzeugen. Beim Script für die Erzeugung der Hyperlinks stosse ich dagegen auf Schwierigkeiten.

Ausgangslage: Der Index wurde zwar ursprünglich mit den RagTime-Bordwerkzeugen erstellt, aber danach in ein Rechenblatt übertragen. In Spalte A befindet sich der Text und ab Spalte B folgt in jeder Rechenblattzelle je eine Seitennummer. Die Index-Einträge sollen somit je einen Hyperlink zu allen für den Eintrag im Index aufgeführten Seiten erhalten, z.B.:

  A50        B50  C50  D50
  Mehrwert   123  211  258

Frage 1: Wie wähle ich einen Text in einer bestimmten Rechenblattzelle aus, um ihm einen Hyperlink zuordnen zu können?
Um einen Hyperlink erstellen zu können muss ich den Text in der Zelle auswählen. Ich habe nicht herausgefunden, wie das geht. Beim Aufzeichnen mit dem Skripteditor ergibt sich nichts Sinnvolles, z.B.:

  	select text from character 3 to character 5 of document 1

Also keinerlei Referenz zur Rechenblattzelle, sondern nur zum ganzen Dokument. Selbst wenn die Referenz sinnvoll wäre, so lässt sie sich nicht in eine Schleife einbauen, in welcher ich den zu verlinkenden Text auswählen kann. Ich stelle mir also etwas vor wie:

  	select contents of cell "B50" of table "R Index" of document 1

Aber das ist meine Phantasie und nicht AppleScript-tauglich.

Frage 2: Wie erstelle ich für einen ausgewählten Text einen Hyperlink?
Wenn ich mit dem Scripteditor die Erstellung des Hyperlinks aufzeichne, so ergibt sich ein Code, der mit Kopieren/Ensetzen nur unvollständig in das Scriptfenster von RagTime übertragen wird, der aber auch nicht im Scripteditor ausgeführt werden kann - Ausgangspunkt beim Aufzeichnen ist der ausgewählte Text, dem der Hyperlink zugeordnet werden soll:

  	make selection new «class » with data selection at end of selection
	set «class » of selection to "Mehrwert_123"

Das Zeichen nach "class" verhält sich dabei merkwürdig: Ab dort wird die Zeile beim Kopieren/Einsetzen unterdrückt.

Alles mit RT 6.5.2 unter OS X 10.6.6

Danke für Tipps!
Gruss, Thomas

Re: Mit AppleScript Hyperlinks erzeugen

#9990 On 23 Januar, 2011 15:00 Lutz-Dieter Bornemann said,

Hallo Thomas,

leider nur auf die Schnelle:

select text from character 1 to character 2 of cell "C1" of table "Rechenblatt 1" of document 1

funktioniert in Umbruchzellen.

Vielleicht hilft "Verlinken von Textstellen" bei den RT-Experts an anderen Stellen weiter.

Gruß
Lutz

Am 23.01.2011 um 15:36 schrieb Thomas Kaegi:

> Ich sollte für ein grösseres Buch, das als E-Book publiziert werden soll, hunderten von Indexinträgen je einen Hyperlink zuweisen. Es ist mir gelungen, die Namen (also die Link-Ziele) per AppleScript zu erzeugen. Beim Script für die Erzeugung der Hyperlinks stosse ich dagegen auf Schwierigkeiten.
>
> Ausgangslage: Der Index wurde zwar ursprünglich mit den RagTime-Bordwerkzeugen erstellt, aber danach in ein Rechenblatt übertragen. In Spalte A befindet sich der Text und ab Spalte B folgt in jeder Rechenblattzelle je eine Seitennummer. Die Index-Einträge sollen somit je einen Hyperlink zu allen für den Eintrag im Index aufgeführten Seiten erhalten, z.B.:
>
> A50 B50 C50 D50
> Mehrwert 123 211 258
>
> Frage 1: Wie wähle ich einen Text in einer bestimmten Rechenblattzelle aus, um ihm einen Hyperlink zuordnen zu können?
> Um einen Hyperlink erstellen zu können muss ich den Text in der Zelle auswählen. Ich habe nicht herausgefunden, wie das geht. Beim Aufzeichnen mit dem Skripteditor ergibt sich nichts Sinnvolles, z.B.:
>
> select text from character 3 to character 5 of document 1
>
> Also keinerlei Referenz zur Rechenblattzelle, sondern nur zum ganzen Dokument. Selbst wenn die Referenz sinnvoll wäre, so lässt sie sich nicht in eine Schleife einbauen, in welcher ich den zu verlinkenden Text auswählen kann. Ich stelle mir also etwas vor wie:
>
> select contents of cell "B50" of table "R Index" of document 1
> Aber das ist meine Phantasie und nicht AppleScript-tauglich.
>
> Frage 2: Wie erstelle ich für einen ausgewählten Text einen Hyperlink?
> Wenn ich mit dem Scripteditor die Erstellung des Hyperlinks aufzeichne, so ergibt sich ein Code, der mit Kopieren/Ensetzen nur unvollständig in das Scriptfenster von RagTime übertragen wird, der aber auch nicht im Scripteditor ausgeführt werden kann - Ausgangspunkt beim Aufzeichnen ist der ausgewählte Text, dem der Hyperlink zugeordnet werden soll:
>
> make selection new «class » with data selection at end of selection
> set «class » of selection to "Mehrwert_123"
>
> Das Zeichen nach "class" verhält sich dabei merkwürdig: Ab dort wird die Zeile beim Kopieren/Einsetzen unterdrückt.
>
> Alles mit RT 6.5.2 unter OS X 10.6.6
>
> Danke für Tipps!
> Gruss, Thomas
>
>
>

Re: Mit AppleScript Hyperlinks erzeugen

#9991 On 23 Januar, 2011 16:20 Thomas Kaegi said,

Danke Lutz

Das hilft schon mal einen Schritt weiter. Da die zu verlinkende Seitenzahl 1-3 Sellen haben kann, habe ich deinen Vorschlag leicht abgeändert.

	select text from character 1 to end of text of cell "B1" of table "Rechenblatt 1" of document 1

Test erfolgreich! In einer Schlaufe müsste dann natürlich die Adresse der Zelle berechnet werden. Das kenne ich aus anderen Skripts.

Es wäre schön, wenn es auch für das zweite Problem eine Lösung geben würde, evtl. mit GUI-Scripting. Damit komme ich leider noch gar nicht zurecht.

Gruss, Thomas

Re: Mit AppleScript Hyperlinks erzeugen

#9992 On 23 Januar, 2011 17:31 Thomas Kaegi said,

Hallo Lutz

Ich hab im Forum einen alten Beitrag von dir gefunden:
http://experts.ragtime.de/experts/node/2738

Dieser Beitrag half mir mit dem GUI-Scripting. Es ist mir gelungen, einem vorgängig markierten Text in einer Rechenblattzelle den Link auf einen bestimmten Namen (Variable "linkname") per Script zuzuweisen.

Dieser Teil des Skripts lautete:

	tell application "System Events"
		tell process "RagTime" -- Beginn von GUI-Scripting
			click menu item "Als Verknüpfung markieren" of menu 1 of menu bar item "Extras" of menu bar 1
			delay 0.5 -- kann man u. U. auch weglassen
			keystroke "	" -- Tabulatortaste
		end tell
	end tell
	set selection to linkname
	tell application "System Events"
		tell process "RagTime"
			click button "OK" of window "Rechenblattinformation"
		end tell
	end tell

Aber - verflixt und zugenäht! Nachdem ich deinen ersten Beitrag gelesen habe, hatte ich ihn gleich getestet und war dabei - wie bereits gemeldet - erfolgreich. Jetzt wollte ich die beiden Scripts zusammenfügen und da funktioniert die Textauswahl nicht mehr. So habe ich den erfolgreichen Test zu reporduzieren versucht, nach Neustart von RagTime ein neues Dokument angelegt und deinen Tipp 1:1 als Skript eingegeben. Aber es funktioniert einfach nicht mehr. "RagTime 6.5" hat einen Fehler erhalten: '"text from character 1 to character 2 of cell "C1" of table "Rechenblatt 1 " of document 1" kann nicht gelesen werden.' Mehrmals habe ich es versucht - immer mit dem gleichen Misserfolg. Jetzt bin ich ratlos - wie hatte ich denn wohl deinen Tipp erfolgreich testen können?

Gruss, Thomas

Re: Mit AppleScript Hyperlinks erzeugen

#9993 On 23 Januar, 2011 17:13 Norbert Lindenthal said,
tell application "RagTime 6.5"
activate
tell application "System Events"
if not UI elements enabled then
display dialog "Dieses Script benötigt UIScripting, 
klicken Sie \"UIScripting einschalten\" zum Einschalten."
set UI elements enabled to true
end if
key code 113 -- = F15
end tell
end tell


Moin, Thomas,

mein Ansatz geht davon aus, daß dem Listenbefehl »Als Verknüpfung markieren« in RagTime das Kürzel F15 zugewiesen wurde.
Das UIScripting ist bei Dir wohl schon eingeschaltet, dann kann die if-Klammer wegbleiben.
Daumendrück,
Norbert Lindenthal

Re: Mit AppleScript Hyperlinks erzeugen

#9994 On 23 Januar, 2011 17:22 Lutz-Dieter Bornemann said,

Hallo Thomas,

wenn ich Deine Aufgabe richtig verstanden habe,
dann soll es möglich sein,
eine Seitenzahl in einer Rechenblattzelle
anzuklicken, um zu der entsprechenden Textstelle
in einer Textkomponente zu springen.

Was RT in meinem Skript nicht schafft,
ist der Rücksprung zum Text in der Rechenblattzelle.

Das liegt wahrscheinlich daran,
dass der Select-Befehl innerhalb einer Rechenblattzelle
nicht sauber arbeitet.

Er fördert nämlich nur zutage:
select text from character 1 to character 3 of document id 1

anstatt:
select text from character 1 to character 3 of cell "A1" of Rechenblatt 1 of document id 1

Der Inhalt der Variablen "theStartmarke" (in meinem Skript)
müsste also um:
cell "A1" of Rechenblatt 1 of
ergänzt werden.

Folgendes Skript könnte Dir dabei helfen:
(Voraussetzung ist hier, dass die Zelle (nicht der Text darin) ausgewählt ist)

tell application "RagTime 6.5"
activate
set theZelle to selection
delay 1 –– nur damit mann verfolgen kann, was passiert
select text from character 1 to character 3 of theZelle
end tell

Gruß
Lutz

Am 23.01.2011 um 17:36 schrieb Thomas Kaegi:

> Hallo Lutz
>
> Ich hab im Forum einen alten Beitrag von dir gefunden:
> http://experts.ragtime.de/experts/node/2738
>
> Dieser Beitrag half mir mit dem GUI-Scripting. Es ist mir gelungen, einem vorgängig markierten Text in einer Rechenblattzelle den Link auf einen bestimmten Namen (Variable "linkname") per Script zuzuweisen.
>
> Dieser Teil des Skripts lautete:
>
> tell application "System Events"
> tell process "RagTime" -- Beginn von GUI-Scripting
> click menu item "Als Verknüpfung markieren" of menu 1 of menu bar item "Extras" of menu bar 1
> delay 0.5 -- kann man u. U. auch weglassen
> keystroke " " -- Tabulatortaste
> end tell
> end tell
> set selection to linkname
> tell application "System Events"
> tell process "RagTime"
> click button "OK" of window "Rechenblattinformation"
> end tell
> end tell
>
> Aber - verflixt und zugenäht! Nachdem ich deinen ersten Beitrag gelesen habe, hatte ich ihn gleich getestet und war dabei - wie bereits gemeldet - erfolgreich. Jetzt wollte ich die beiden Scripts zusammenfügen und da funktioniert die Textauswahl nicht mehr. So habe ich den erfolgreichen Test zu reporduzieren versucht, nach Neustart von RagTime ein neues Dokument angelegt und deinen Tipp 1:1 als Skript eingegeben. Aber es funktioniert einfach nicht mehr. "RagTime 6.5" hat einen Fehler erhalten: '"text from character 1 to character 2 of cell "C1" of table "Rechenblatt 1 " of document 1" kann nicht gelesen werden.' Mehrmals habe ich es versucht - immer mit dem gleichen Misserfolg. Jetzt bin ich ratlos - wie hatte ich denn wohl deinen Tipp erfolgreich testen können?
>
> Gruss, Thomas
>
>
>

Re: Mit AppleScript Hyperlinks erzeugen

#9995 On 23 Januar, 2011 20:12 Tom Kaegi said,
Hallo Norbert

Am 23.01.2011 um 17:13 schrieb Norbert Lindenthal:

tell application "RagTime 6.5"
activate
tell application "System Events"
if not UI elements enabled then
display dialog "Dieses Script benötigt UIScripting, 
klicken Sie \"UIScripting einschalten\" zum Einschalten."
set UI elements enabled to true
end if
key code 113 -- = F15
end tell
end tell


Moin, Thomas,

mein Ansatz geht davon aus, daß dem Listenbefehl »Als Verknüpfung markieren« in RagTime das Kürzel F15 zugewiesen wurde.
Das UIScripting ist bei Dir wohl schon eingeschaltet, dann kann die if-Klammer wegbleiben.
Daumendrück,
Norbert Lindenthal

Für den Teil mit der Zuordnung des Hyperlinks zu einem ausgewählten Text habe ich, wie im Forumbeitrag beschrieben, die Lösung gefunden. Was nicht klappt ist die Auswahl der Seitennummer in der Rechenblattzelle. Im ersten Test funktionierte der Tipp von Lutz, dann aber nie mehr. So stehe ich nach wie vor am Berg.

Mit freundlichem Gruss
Thomas

Re: Mit AppleScript Hyperlinks erzeugen

#9996 On 23 Januar, 2011 20:35 Tom Kaegi said,

Hallo Lutz

> wenn ich Deine Aufgabe richtig verstanden habe, dann soll es möglich sein, eine Seitenzahl in einer Rechenblattzelle anzuklicken, um zu der entsprechenden Textstelle in einer Textkomponente zu springen.

Nicht ganz, aber es kommt aufs Gleiche raus. Gesprungen werden soll auf eine Marginalie, welche in einer Rechenblattzelle steht. Für den Vorgang, den Marginalien per AppleScript je einen eindeutigen Namen zuzuordnen, habe ich die Lösung bereits gefunden. Dieser Name besteht aus dem indizierten Begriff selbst, der in der Marginalie steht, gefolgt von Unterstrich und der Seitenzahl, also z.B. "Mehrwert_123".

In der Indextabelle steht in Spalte A der indizierte Begriff und in den folgenden Spalten je die Seitennummer einer der Seiten, auf welcher der Begriff in der Marginalie steht. Ziel ist es, in dieser Indextabelle auf die Seitenzahl klicken zu können und damit zur Marginalie dieses Begriffs auf der gewünschten Seite zu springen. Der Name, welcher als Hyperlink der Seitennummer zuzuordnen ist, ist also bekannt: Der Begriff in Spalte A, gefolgt von Unterstrich und der Seitennummer. Er lässt sich also aus den Daten in der Indextabelle ebenso eindeutig berechnen wie bei der Erzeugung des Namens.

> Was RT in meinem Skript nicht schafft, ist der Rücksprung zum Text in der Rechenblattzelle.
>
> Das liegt wahrscheinlich daran, dass der Select-Befehl innerhalb einer Rechenblattzelle nicht sauber arbeitet.

Das scheint leider so zu sein.

> Er fördert nämlich nur zutage:
> select text from character 1 to character 3 of document id 1
>
> anstatt:
> select text from character 1 to character 3 of cell "A1" of Rechenblatt 1 of document id 1
>
> Der Inhalt der Variablen "theStartmarke" (in meinem Skript)
> müsste also um:
> cell "A1" of Rechenblatt 1 of
> ergänzt werden.
>
> Folgendes Skript könnte Dir dabei helfen:
> (Voraussetzung ist hier, dass die Zelle (nicht der Text darin) ausgewählt ist)
>
> tell application "RagTime 6.5"
> activate
> set theZelle to selection
> delay 1 –– nur damit mann verfolgen kann, was passiert
> select text from character 1 to character 3 of theZelle
> end tell

Leider hat auch dieser Vorschlag bei mir bei Ausführung des Skripts nicht zur Auswahl des Textes in der Rechenblattzelle, sondern nur bis zur Auswahl der Zelle als Ganzes und dann zu einer Fehlermeldung geführt.

Da steh ich nun, ich armer Tor ... und suche immer noch nach einer Skript-Lösung, um den Text in einer Rechenblattzelle auswählen zu können.

Thomas

Re: Mit AppleScript Hyperlinks erzeugen

#9997 On 23 Januar, 2011 21:02 Norbert Lindenthal said,

Am 2011-01-23 um 20:35 schrieb Tom Kaegi:

> Da steh ich nun, ich armer Tor ... und suche immer noch nach einer
> Skript-Lösung, um den Text in einer Rechenblattzelle auswählen zu
> können.

Moin, Thomas,

machst Du schon UIScripting? Dann kannst Du nach der ausgewählten
Zelle Eingabetaste und »Alles auswahlen« auch noch per UIScripting
laufen lassen:

tell application "RagTime 6.5"
activate
tell application "System Events"
key code 76 -- Enter
keystroke "a" using {command down} -- alles auswählen
end tell
end tell

Daumendrück,
Norbert Lindenthal

Re: Mit AppleScript Hyperlinks erzeugen

#9998 On 23 Januar, 2011 21:47 Tom Kaegi said,

Hallo Norbert

Am 23.01.2011 um 21:02 schrieb Norbert Lindenthal:

> Am 2011-01-23 um 20:35 schrieb Tom Kaegi:
>
>> Da steh ich nun, ich armer Tor ... und suche immer noch nach einer Skript-Lösung, um den Text in einer Rechenblattzelle auswählen zu können.
>
> Moin, Thomas,
>
> machst Du schon UIScripting? Dann kannst Du nach der ausgewählten Zelle Eingabetaste und »Alles auswahlen« auch noch per UIScripting laufen lassen:
>
> tell application "RagTime 6.5"
> activate
> tell application "System Events"
> key code 76 -- Enter
> keystroke "a" using {command down} -- alles auswählen
> end tell
> end tell
>
> Daumendrück,
> Norbert Lindenthal

Das Daumendrücken scheint genützt zu haben. Wenigstens in meinem ersten Versuch hat es so geklappt. Jetzt kann ich morgen versuchen, das ganze zusammenzufügen. Ich bin optimistisch.

Danke Norbert und danke Lutz!
Gruss, Thomas

Re: Mit AppleScript Hyperlinks erzeugen

#10002 On 28 Januar, 2011 19:59 werkwelt said,

> … Wenigstens in meinem ersten Versuch hat es so geklappt. …

Thomas, ich bin nun wirklich neugierig, ob Dein AppleScript jetzt Sprungmarken bauen kann. Dasselbe nahm ich mir mal für einen ausgiebigen Index eines Buches vor. In einer html-Fassung hätte ich gerne vom Index per Klick in die Textpassagen wechseln wollen. Leider kam dann eine nichttechnische Störung dazwischen. :-(

RagTime, FileTime, FileMaker, AppleScript und Spell Catcher X geben Flügel.

Mit freundlichen Grüßen,
Norbert Lindenthal

Re: Mit AppleScript Hyperlinks erzeugen

#10003 On 28 Januar, 2011 20:53 Thomas Kaegi said,

Hallo Norbert

Ich habe das Projekt vorläufig nicht weiter bearbeitet, da ich noch nicht weiss, ob der Kunde den Auftrag erteilt. Es ging also bisher lediglich um eine Machbarkeits-Abklärung - diese ist aus meiner Sicht positiv verlaufen. Neben dem nachfolgend beschriebenen Vorgehen gibt es noch ein paar Spitzfindigkeiten, die berücksichtigt werden müssen, was mich abgehalten hat, die Arbeit ohne Auftrag anzupacken.

Allerdings handelt es sich nicht um einen normalen Index, sondern die Sache ist wie folgt aufgebaut, bzw. erzeugt worden:

1. Am Seitenrand des Buches läuft ein Rechenblatt. Dort stehen in Spalte A die Marginalien und in Spalte B (nicht sichtbar) steht die aktuelle Seitennummer. Die gleiche Marginalie kann auf mehreren Seiten vorkommen.

2. Mit einem VSuchlauf wurde in einem weiteren Rechenblatt der Index erstellt: In diesem Rechenblatt stehen in Spalte A sämtliche gefundenen Marginalein und dahinter wurden in der gleichen Rechenblattzeile alle Seitennummern eingetragen, auf denen die betreffende Marginalie vorkommt. Am Schluss wurde diese Tabelle nach Spalte A sortiert.

Gemäss den getroffenen Abklärungen führt das folgende Vorgehen zum Ziel:

1. Mit einem AppleScript 1 wird für jede Marginalie ein Namen definiert, der aus der Marginalie und der Seitennummer besteht, also wie bereits angeführt z.B. "Mehrwert_123" für die Marginalie "Mehrwert", die auf Seite 123 steht.

2. Mit einem AppleScript 2 wird die Indextabelle abgesucht und jeder Seitennummer ein Hyperlink zum Sprungziel (dem mit Script 1 erzeugten Namen) zugeordnet, das sich aus der Marginalie und der Seitennummer selbst ergibt. Ein Klick auf die Seitennummer "123" in der Rechenblattzeile, in welcher in Spalte A "Mehrwert" steht, wird also zum Namen "Mehrwert_123" führen.

Gruss, Thomas