用 JXA 替换 Keynote 中的字体

Replace fonts in Keynote with JXA

我正在尝试 find/replace Keynote 中有问题的字体,发现 this script 可以使用 JXA 更改字体,但需要扫描每个字符和文本对象以查找有问题的字体。

我试过这个开始,但条件不起作用。求助!

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

您提到的 GitHub 要点是用 CoffeeScript 编写的,而不是 JavaScript。它需要被编译(转换)为 JavaScript。您的脚本是另一个脚本的摘录,也是用 CoffeeScript 编写的。

这是脚本的快速 vanilla JS 版本:

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;
        }
    }
}

重要提示:Arial 的字体名称不同'under the hood';例如,斜体 Arial 列为 "Arial-ItalicMT"。您的脚本没有考虑到这一点,这可能是条件语句失败的原因。

您可能想像这样添加子字符串检查:

(未经测试,但希望您明白)

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;
        }
    }
}

如果有帮助,这里有一个纯 AppleScript 版本,其中包括对字体名称的子字符串检查。我已经在 macOS Sierra 上使用 Keynote 7.0.5 成功测试了这一点。

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

(我在此示例中使用了 Monaco,以便您可以快速判断脚本是否有效,因为 Helvetica 和 Arial 很难区分。)