2017-03-21 2 views
0

Ich versuche, problematische Schriftarten in Keynote zu finden/ersetzen, und gefunden this script, um Schriftarten mit JXA ändern, aber jedes Zeichen und Textobjekt für die beanstandete Schriftart zu scannen.Ersetzen Sie Schriftarten in Keynote mit JXA

Ich habe versucht, dies zu starten, aber die Bedingung funktioniert nicht. Hilfe!

PROBLEM_FONT = 'Arial' 
REPLACEMENT_FONT = 'Helvetica' 

document = Application('Keynote').documents[0] 
for slide in document.slides 
    for textItem in slide.textItems 
    if textItem.objectText.font == PROBLEM_FONT 
     textItem.objectText.font = REPLACEMENT_FONT 

Antwort

1

Das GitHub-Stichwort, auf das Sie sich beziehen, ist in CoffeeScript geschrieben, nicht in JavaScript. Es muss in JavaScript kompiliert (konvertiert) werden. Ihr Skript, das ein Auszug des anderen Skripts ist, wird ebenfalls in CoffeeScript geschrieben.

Hier ist eine schnelle Vanille JS Version des Skripts:

var PROBLEM_FONT = 'Arial'; 
var REPLACEMENT_FONT = 'Helvetica'; 
var slides = Application('Keynote').documents[0].slides; 

for (var i = 0; i < slides.length; i++) { 
    var slide = slides[i]; 
    for (var j = 0; j < slide.textItems.length; j++) { 
     var textItem = slide.textItems[j]; 
     if (textItem.objectText.font === PROBLEM_FONT) { 
      textItem.objectText.font = REPLACEMENT_FONT; 
     } 
    } 
} 

Wichtiger Hinweis: Der Name Schriftart Arial ist anders ‚unter der Haube‘; Beispielsweise wird kursiv geschriebener Arial als "Arial-ItalicMT" aufgelistet. Ihr Skript berücksichtigt dies nicht, weshalb die bedingte Anweisung möglicherweise fehlschlägt.

Sie möchten vielleicht wie so eine Teilprüfung hinzuzufügen:

(ungetestet, aber hoffentlich bekommen Sie die Idee)

var PROBLEM_FONT = 'Arial'; 
var REPLACEMENT_FONT = 'Helvetica'; 
var slides = Application('Keynote').documents[0].slides; 

for (var i = 0; i < slides.length; i++) { 
    var slide = slides[i]; 
    for (var j = 0; j < slide.textItems.length; j++) { 
     var textItem = slide.textItems[j]; 
     if (textItem.objectText.font.indexOf(PROBLEM_FONT) !== -1) { 
      textItem.objectText.font = REPLACEMENT_FONT; 
     } 
    } 
} 

Falls es hier hilft, ist eine reine Apple Version, die enthält eine Teilzeichenfolgeprüfung für den Schriftartnamen. Das habe ich mit Keynote 7.0.5 auf macOS Sierra erfolgreich getestet.

tell application "Keynote" 

    if (front document exists) then 
     tell every slide of front document 

      -- Targeting body text 
      tell every text item 
       if (the font of its object text as text) contains "Arial" then 
        set the font of its object text to "Monaco" 
       end if 
      end tell 

      -- Targeting slide titles 
      tell default title item 
       if (the font of its object text as text) contains "Arial" then 
        set the font of its object text to "Monaco" 
       end if 
      end tell 

      -- Targeting text boxes within groups 
      tell every group 

       tell every text item 
        if (the font of its object text as text) contains "Arial" then 
         set the font of its object text to "Monaco" 
        end if 
       end tell 

      end tell 

     end tell 
    end if 

end tell 

(I verwendet Monaco für dieses Beispiel so, dass Sie schnell, wenn das Skript gearbeitet sagen kann, da Helvetica und Arial schwer zu unterscheiden sind.)

+0

Wow das ist fantastisch danke! Eines der Dinge, die ich noch zu verstehen versuche, ist die Verwendung des PostScript-Namens in Keynote. Insbesondere versuche ich, alle "diese Schriftarten fehlen in diesem Dokument" Warnungen zu beseitigen und diese zu verwenden, um die Schriftarten zu finden und zu ersetzen. Zum Beispiel möchte ich "HelveticaNeue-Bold" mit "TimesNewRoman-Italic" finden und ersetzen, aber aus irgendeinem Grund funktioniert es bei einigen Schriftarten, aber nicht bei anderen. – James

+0

Froh, dass es geholfen hat. Postscript-Namen sind immer etwas mühsam, keine einfache Lösung. Deshalb habe ich eine partielle Namensuche verwendet. Wenn die obige Antwort für Sie funktioniert, markieren Sie sie bitte als "richtig". Vielen Dank! – pipwerks

+0

Eine kleine Sache, mit der ich kämpfe, ist, dass es scheint, einige Textelemente zu überspringen? Ich schaue mir die Applescript-Dokumentation an und sehe nur "text item", "default title item", "default body item" als Textobjekte, aber selbst wenn ich diese hinzufüge, gibt es einige Textobjekte, die davon nicht betroffen sind. Irgendwelche Ideen? – James

Verwandte Themen