jxa — получение метрик шрифта NSAttributedString в JavaScript для автоматизации

В macOS Sierra JavaScript for Automation мы можем написать:

// helvetica12Width :: String -> Num
function helvetica12Width(str) {
    return $.NSAttributedString.alloc.init.initWithString(
            str
        )
        .size.width;
}

чтобы получить метрики для конкретной строки в Helvetica 12 по умолчанию. Чего мне еще не удалось сделать, так это передать атрибуты для других шрифтов и размеров шрифтов и получить для них соответствующие метрики.

Кто-нибудь обнаружил идиому/синтаксис, который работает здесь из JXA или AppleScript?

Обновление: это то, с чем я экспериментировал, но явно не по адресу, поскольку изменение значений размера/имени шрифта не влияет на возвращаемое значение:

(() => {
    'use strict';

    ObjC.import('AppKit');

    return $.NSAttributedString.alloc.init.initWithStringAttributes(
            "Substantiation", {
                'NSFontAttributeName': $.NSFont.fontWithNameSize('Helvetica', 24)
            }
        )
        .size.width
})();

person houthakker    schedule 07.04.2017    source источник


Ответы (1)


Ах ... это, кажется, делает это:

(function () {
    'use strict';

    ObjC.import('AppKit');

    // show :: a -> String
    const show = x => JSON.stringify(x, null, 2);

    // stringSizeInFontAtPointSize :: String -> String -> Num
    //                                  -> {width:Num, height:Num}
    function stringSizeInFontAtPointSize(str, fontName, points) {
        return $.NSAttributedString.alloc.init.initWithStringAttributes(
            str, $({
                'NSFont': $.NSFont.fontWithNameSize(fontName, points)
            })
        )
        .size;
    }

    // TEST -------------------------------------------------------------------
    return show([
        stringSizeInFontAtPointSize("hello World", "Geneva", 32),
        stringSizeInFontAtPointSize("hello World", "Geneva", 64),
        stringSizeInFontAtPointSize("hello World", "Helvetica", 64),
    ]);
})();
person houthakker    schedule 07.04.2017