jxa - 在 JavaScript 中为自动化获取 NSAttributedString 字体指标
jxa - Getting NSAttributedString font metrics in JavaScript for Automation
在 macOS Sierra JavaScript 中,对于自动化,我们可以这样写:
// helvetica12Width :: String -> Num
function helvetica12Width(str) {
return $.NSAttributedString.alloc.init.initWithString(
str
)
.size.width;
}
获取默认 Helvetica 12 中特定字符串的指标。我还没有设法为其他字体和字体大小传递属性,并获取相应的指标。
有没有人从 JXA 或 AppleScript 中发现 idiom/syntax 在这里工作?
Update:这是我尝试过的那种东西——不过显然不合时宜,因为字体 size/name 值的变化不会影响return 值:
(() => {
'use strict';
ObjC.import('AppKit');
return $.NSAttributedString.alloc.init.initWithStringAttributes(
"Substantiation", {
'NSFontAttributeName': $.NSFont.fontWithNameSize('Helvetica', 24)
}
)
.size.width
})();
啊……这个好像可以:
(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),
]);
})();
在 macOS Sierra JavaScript 中,对于自动化,我们可以这样写:
// helvetica12Width :: String -> Num
function helvetica12Width(str) {
return $.NSAttributedString.alloc.init.initWithString(
str
)
.size.width;
}
获取默认 Helvetica 12 中特定字符串的指标。我还没有设法为其他字体和字体大小传递属性,并获取相应的指标。
有没有人从 JXA 或 AppleScript 中发现 idiom/syntax 在这里工作?
Update:这是我尝试过的那种东西——不过显然不合时宜,因为字体 size/name 值的变化不会影响return 值:
(() => {
'use strict';
ObjC.import('AppKit');
return $.NSAttributedString.alloc.init.initWithStringAttributes(
"Substantiation", {
'NSFontAttributeName': $.NSFont.fontWithNameSize('Helvetica', 24)
}
)
.size.width
})();
啊……这个好像可以:
(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),
]);
})();