[GastForen Programmierung/Entwicklung AppleScript Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

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

Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

Martin Fischer
Beiträge gesamt: 12783

14. Okt 2004, 22:19
Beitrag # 1 von 7
Bewertung:
(3367 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ab und an kommt es vor, daß ich in InDesign CS die Zeichenfolge in einzelnen hebräischen Wörtern umkehren muß:
alt : 123 4567 89
neu: 98 7654 321

Unten sind zwei Skripte, ein AppleScript und ein VBScript, die beide die ausgewählten Zeichen durch die Umkehrung derselben ersetzen.

Diese Skipte machen, was sie tun sollen, so lange 8-bit Zeichen ausgewählt sind. Sobald UniCode-Zeichen ausgewählt sind, erzeugt das Script Unsinn (z.B. ">4D50").

Das Events- und Ergebnisprotokoll des ScriptEditor (AppleScript) zeigt mir folgendes:
[code:1]
tell application "InDesign CS"
 get selection
  {text from character 12 to character 20 of text flow id 141 of document "test.indd"}
 get text from character 12 to character 20 of story id 141 of document "test.indd"
  "<05E1><05E4><05E8> <05D9><05E6><05D9><05E8><05D4>"
 set contents of selection to ">4D50<>8E50<>9D50<>6E50<>9D50< >8E50<>4E50<>1E50<"
end tell 
[/code:1]
"<05E1><05E4><05E8> <05D9><05E6><05D9><05E8><05D4> ", das ist die Darstellung der Unicode Hex Werte. Und meine Skripte machen Datensalat draus.

Hat jemand ne Idee, wie ich die einzelnen Unicode-Zeichen - und nicht die Unicode Hex Werte - umkehren kann?

Das AppleScript:
[code:1]
--ReverseCharacters.as
-- myOldText = selected text
-- myNewText = selected text backwards; will replace old text
-- myList = old text as list &#40;itemized&#41;

tell application "InDesign CS"
 set myOldText to selection as string
 set myNewText to my theConversion&#40;myOldText&#41;
 set contents of selection to myNewText
end tell

on theConversion&#40;myText&#41;
 set myList to every character of myText
 -- Conversion
 set myZText to reverse of myList
 -- convert list to string
 set myText to myZText as string
end theConversion
[/code:1]


VBScript:
[code:1]
'ReverseCharacters.vbs
myOldText = ""
myNewText = ""
Set myIndesign = CreateObject&#40;"InDesign.Application.CS"&#41;
Set myDocument = myInDesign.ActiveDocument 
Set mySelection = myDocument.Selection&#40;1&#41;

myOldText = mySelection.contents
myLaenge = Len&#40;myOldText&#41;

For myCounter = myLaenge to 1 step -1
    myNewText = myNewText + Mid&#40;myOldText,myCounter,1&#41;
Next

mySelection.contents=myNewText
'end ReverseCharacters.vbs
[/code:1]
X

Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

Hans Haesler
  
Beiträge gesamt: 5826

15. Okt 2004, 08:46
Beitrag # 2 von 7
Beitrag ID: #419121
Bewertung:
(3366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

ein interessantes Problem. Die Lösung ist: Der String muss in eine Liste verwandelt werden. Und
zwar nicht buchstabenweise, sondern immer sechs Zeichen. Dabei sind aber die Wortzwischenräume
"Störenfriede". Ich schlage vor, diese ebenfalls im Unicode-Format einzusetzen und zwar mit
Hilfe der 'text item delimiter':
---
set myOldText to "<05E1><05E4><05E8> <05D9><05E6><05D9><05E8><05D4>"
set AppleScript's text item delimiters to {" "}
set tmpList to every text item of myOldText as list
set AppleScript's text item delimiters to {"<0020>"}
set myOldText to every text item of tmpList as string
set AppleScript's text item delimiters to {""}
myOldText
-->"<05E1><05E4><05E8><0020><05D9><05E6><05D9><05E8><05D4>"

Dann kann man eine leere Liste definieren und mit einer Repeat-Schleife im Sechserschritt
die Element daran anfügen:
---
set aList to {}
repeat with i from 1 to (count of myOldText) by 6
  set end of aList to text i thru (i + 5) of myOldText
end repeat
aList
-->{"<05E1>", "<05E4>", "<05E8>", "<0020>", "<05D9>", "<05E6>", "<05D9>", "<05E8>", "<05D4>"}

Im Ergebnis kann man die Reihenfolge umkehren und wieder zurück in einen String verwandeln:
---
set revList to (reverse of aList) as string
-->"<05D4><05E8><05D9><05E6><05D9><0020><05E8><05E4><05E1>"

Soviel zur Theorie. Umgesetzt in Dein Script könnte es etwa so aussehen:
---
tell application "InDesign CS"
  set myOldText to selection as string
  set myNewText to my theConversion(myOldText)
  set contents of selection to myNewText
end tell

on theConversion(myText)
  set AppleScript's text item delimiters to {" "}
  set tmpList to every text item of myText as list
  set AppleScript's text item delimiters to {"<0020>"}
  set myText to every text item of tmpList as string
  set AppleScript's text item delimiters to {""}
  set myList to {}
  repeat with i from 1 to (count of myText) by 6
    set end of myList to text i thru (i + 5) of myText
  end repeat
  set myNewText to (reverse of myList) as string
end theConversion
---

Wie Du siehst, habe ich die Schreibweise der Variablen Deinem Muster angepasst. Ich habe
aber grosse Mühe mit all diesen 'my' und 'the'. Gut, ich weiss, dass _sämtliche_ InDesign-Scripts
in diesem Stil geschrieben sind. Leider.

Ich bin nicht sicher, ob dieses Script funktioniert, denn ich habe es nicht ausprobiert. Dies
überlasse ich gerne Dir &#133;

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#419120]

Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

Martin Fischer
Beiträge gesamt: 12783

15. Okt 2004, 09:12
Beitrag # 3 von 7
Beitrag ID: #419122
Bewertung:
(3366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

das war der entscheidende Schritt, der mir gefehlt hat: wie zerstückele ich die jeweils 6-stelligen Unicode-Einheiten.

Zitat von Hans Haesler set aList to {}
repeat with i from 1 to (count of myOldText) by 6
  set end of aList to text i thru (i + 5) of myOldText
end repeat
aList


Einfach klasse!

Zitat Ich habe aber grosse Mühe mit all diesen 'my' und 'the'. Gut, ich weiss, dass _sämtliche_ InDesign-Scripts in diesem Stil geschrieben sind. Leider.


Ich habe über Aufgabenstellungen aus InDesign angefangen, AppleScripts zu schreiben. Und mangels anderer Anleitung für Anfänger stürzte ich mich auf Beispielskripte für InDesign.
Jetzt werde ich mir Deine "InDesign"-reine Schreibung mal genauer ansehen. ;-)

Zitat Ich bin nicht sicher, ob dieses Script funktioniert, denn ich habe es nicht ausprobiert. Dies überlasse ich gerne Dir &#133;


Es tut, was es tun soll - und das sehr schnell - und ich bin mit dem Zerstückelungs-Handler einen großen Schritt weiter gekommen.

Herzlichen Dank Hans.

Zum Abschluß hier noch eine Alternative, bei der die Formatierung der vertauschten Zeichen erhalten bleibt (eignet sich aber nur für eine kleinere Auswahl - von ein paar Worten, sonst wird's zu langsam):

[code:1]
--ReverseCharacters.as
--by move

tell application "InDesign CS"
 set myLength to count of characters of selection
 repeat with myCounter from 1 to myLength - 1
  move character 1 of selection to character -&#40;myCounter&#41; of selection
 end repeat
end tell
[/code:1]


als Antwort auf: [#419120]

Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

Hans Haesler
  
Beiträge gesamt: 5826

15. Okt 2004, 10:15
Beitrag # 4 von 7
Beitrag ID: #419123
Bewertung:
(3366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

bitteschön.
Zitat Jetzt werde ich mir Deine "InDesign"-reine Schreibung mal genauer ansehen.

So etwas habe ich nicht. Aber mich stört dieser Stil, welcher reservierte Worte wie 'my' und 'the' als Präfix
der Variablennamen werwendet. Doch wie gesagt: Alle InDesign-Beispiel-Scripts sind so geschrieben.
Beim Beta-Test für die Version 1.0 habe ich den verantwortlichen Techniker darauf angesprochen.
Er meinte, Anfänger könnten dadurch ein Script besser lesen &#133;

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#419120]

Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

Hans Haesler
  
Beiträge gesamt: 5826

15. Okt 2004, 22:21
Beitrag # 5 von 7
Beitrag ID: #419124
Bewertung:
(3366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

ich habe vergessen zu erwähnen, dass mein Vorschlag nur das absolute Minimum enthält.
Es muss dringend etwas Error-Handling eingebaut werden. Auch wenn das Script nur für den
eigenen Gebrauch entwickelt wird und besonders wenn man glaubt, die Auswahl immer
korrekt vorzunehmen &#133;

Eine erste Kontrolle sollte die Länge des Textstrings sein, nachdem die Unicode-
Zwischenräume eingefügt worden sind. Die Anzahl Zeichen sollte durch 6 teilbar sein.
Dies prüft man mit dem Modulo-Operatoren, mit welchem das Resultat der Restwert nach
der Division ist. Dieser muss also Null sein, sonst stimmt die Rechnung nicht.

Zwei Beispiele: 36 mod 6 = 0 (okay); 34 mod 6 = 4 (nicht okay).

Diesen Test kann man im Conversion-Handler einfügen, nach dieser Zeile:
---
set myText to every text item of tmpList as string
set myCount to count of myText
if myCount mod 6 is not 0 then
  display dialog "Die Anzahl ausgewählter Zeichen (= " & myCount & ")
ist nicht durch 6 teilbar." buttons "OK" default button 1 with icon 0
  error number -128
end if
---

Dann sollten die einzelnen Zeichen unter die Lupe genommen werden:
---
repeat with i from 1 to myCount
  set myChar to character i of myText
  if myChar is not in "<0123456789ABCDEF>" then
    display dialog "Das Zeichen |" & myChar & "| gehört nicht
in einen Unicode-Wert." buttons "OK" default button 1 with icon 0
    error number -128
  end if
end repeat
---

Und schliesslich kann man noch prüfen, ob die Zeichen "<>" richtig plaziert sind:
---
repeat with i from 1 to myCount by 6
  if character i of myText is not "<" or character (i + 5) of myText is not ">" then
    display dialog "Die Zeichen '<' und '>' sind nicht korrekt positioniert." buttons "OK" default button 1 with icon 0
    error number -128
  end if
end repeat
---

Damit hat man aber immer noch nicht Gewissheit, dass die Elemente korrekte Unicode-Werte
sind. Aber ich meine, man kann es dabei bewenden lassen. Doch wenn Du gerne noch mehr
Sicherheit hättest, dann müsste man einen HexToDec-Konverter einsetzen.

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#419120]

Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

Martin Fischer
Beiträge gesamt: 12783

21. Okt 2004, 23:40
Beitrag # 6 von 7
Beitrag ID: #419125
Bewertung:
(3366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ich soll Dich übrigens noch Shane Stanley von grüßen:
Zitat von Shane Stanley Give my regards to Hans, but tell him his method it too slow ;-)

(http://www.adobeforums.com/...qdQoRdur.7@.3bb65c34)


My response:
But his method works. Yours doesn't yet. ;-)

Kennt ihr Euch?
Würde mich nicht wundern.


als Antwort auf: [#419120]

Arbeiten mit UniCode-Zeichen: Umkehrung der Zeichenfolge

Hans Haesler
  
Beiträge gesamt: 5826

21. Okt 2004, 23:58
Beitrag # 7 von 7
Beitrag ID: #419126
Bewertung:
(3366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

danke für den Gruss. Ja, natürlich "kenne" ich Shane. Wir hatten jahrelang einen regen
E-mail-Austausch. Und Olav und Dave "kenne" ich auch.

Dass meine Methode zu langsam ist, glaube ich gerne. Doch habe ich mangels Testdokument
nur Deinen Ergebnis-String behandelt.

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#419120]
X