在可编写脚本的 Mac 应用程序中支持 "styled text"(Cocoa 脚本)
Support "styled text" in a scriptable Mac application (Cocoa Scripting)
我的应用程序支持使用 Applescript 编写脚本。
我正在尝试使存储在 NSAttributedString 对象中的样式化文本内容可供 Applescript 用户使用。
我想我可以简单地使用 NSAttributedString class 提供样式文本,就像我使用 NSString class 提供纯文本一样,但这不起作用 - Cocoa 然后编写脚本报告它无法转换或强制数据。
我想知道我是否遗漏了什么,或者这对于 Cocoa 脚本支持的标准 classes 来说是不可能的吗?
AppleScript 确实知道 "styled text" 类型,如本例所示:
set stxt to "foo" as styled text
那么,如果 AppleScript 默认知道这种类型,Cocoa 脚本引擎不应该以某种方式支持它吗?
AppleScript 中似乎没有对样式文本的隐式支持。并且也没有用于传递样式文本的通用交换记录类型。
AppleScript 是在 OSX 之前开发的,当时样式文本通常由纯文本(系统或 MacRoman 编码)和 styl
资源的组合表示。 Unicode 带来了 ustl
样式格式的替代格式。今天,这些仍然与 Carbon Pasteboard API(PasteboardCreate
等)一起使用。然而,其中 none 似乎已与 AppleScript 一起使用。
AppleScript 知道 样式文本 类型这一事实没有特殊意义。甚至它的 class 也只是 text.
更新
我刚刚发现 Matt Neuburg 的书 "AppleScript The Definitive Guide" 提到了 样式文本 并给出了一个示例,它确实显示了包含纯文本 (class ktxt
) 和样式数据 (class ksty
) 以及 styl
类型的数据,正如我上面预期的那样。不过,他还指出大多数应用程序不使用该格式。
所以,看起来使用样式资源数据的记录确实是预期的方式,只是几乎没有人知道它。去图吧。
一如既往,解决 AS 问题有很多选择。
在我的脚本文本编辑器 (Ted) 中,我实现了基于富文本的文本套件(NSTextStorage,NSMutableAttributedString 的子类)。我希望能够在我的段落中编写制表符,所以我添加了一个样式记录,其中包含所有段落样式信息。这让我可以编写这样的脚本:
tell application "Ted"
set doc1 to make new document at beginning with properties {name:"Document One"}
tell doc1
set p1 to make new paragraph at end with data "Paragraph One" with properties {size:24, color:maraschino}
set p2 to make new paragraph at end with data "Paragraph Two" with properties {style:style of paragraph 1}
set color of paragraph 1 to blue
end tell
set doc2 to make new document at beginning with properties {name:"Document Two"}
copy p1 to beginning of doc2
properties of paragraph 1 of doc2
end tell
由于 p1 是富文本,因此第二个文档以第一个文档第一段的文本和格式结束。
您还可以询问一段文本的属性,我已经实现了常用的文本套件属性,以及 "style" 属性 段落样式(由 NSParagraphStyle 支持,因为我希望能够编写制表位脚本):
properties of paragraph 1 of doc2
结果:
{height:60.0, italic:false, size:24, style:{段落间距after:0.0, head indent:0.0, line break mode:0, alignment:4,行spacing:0.0,最小行height:0.0,首行头indent:0.0,段落间距before:0.0,tabs:{"28L", "56L", "84L", "112L", "140L", "168L", "196L", "224L", "252L", "280L", "308L", "336L"},尾[=28= .0, 最大行 height:0.0, 行高 multiple:0.0, 默认制表符 interval:0.0}, color:blue, width:164.109375, 字体:"Helvetica", bold:false, class:attribute 运行}
这对于在我的应用程序中传递富文本很有效,但对于将带样式的文本传递到其他应用程序可能没那么有用,而这可能正是您想要做的。我认为添加 "style" 属性(记录类型)可能是传达样式信息以用于其他可编写脚本的应用程序的最佳方式。然后在第二个应用程序中,脚本编写者可以使用第二个应用程序理解的样式记录中的任何属性。
我的应用程序支持使用 Applescript 编写脚本。
我正在尝试使存储在 NSAttributedString 对象中的样式化文本内容可供 Applescript 用户使用。
我想我可以简单地使用 NSAttributedString class 提供样式文本,就像我使用 NSString class 提供纯文本一样,但这不起作用 - Cocoa 然后编写脚本报告它无法转换或强制数据。
我想知道我是否遗漏了什么,或者这对于 Cocoa 脚本支持的标准 classes 来说是不可能的吗?
AppleScript 确实知道 "styled text" 类型,如本例所示:
set stxt to "foo" as styled text
那么,如果 AppleScript 默认知道这种类型,Cocoa 脚本引擎不应该以某种方式支持它吗?
AppleScript 中似乎没有对样式文本的隐式支持。并且也没有用于传递样式文本的通用交换记录类型。
AppleScript 是在 OSX 之前开发的,当时样式文本通常由纯文本(系统或 MacRoman 编码)和 styl
资源的组合表示。 Unicode 带来了 ustl
样式格式的替代格式。今天,这些仍然与 Carbon Pasteboard API(PasteboardCreate
等)一起使用。然而,其中 none 似乎已与 AppleScript 一起使用。
AppleScript 知道 样式文本 类型这一事实没有特殊意义。甚至它的 class 也只是 text.
更新
我刚刚发现 Matt Neuburg 的书 "AppleScript The Definitive Guide" 提到了 样式文本 并给出了一个示例,它确实显示了包含纯文本 (class ktxt
) 和样式数据 (class ksty
) 以及 styl
类型的数据,正如我上面预期的那样。不过,他还指出大多数应用程序不使用该格式。
所以,看起来使用样式资源数据的记录确实是预期的方式,只是几乎没有人知道它。去图吧。
一如既往,解决 AS 问题有很多选择。 在我的脚本文本编辑器 (Ted) 中,我实现了基于富文本的文本套件(NSTextStorage,NSMutableAttributedString 的子类)。我希望能够在我的段落中编写制表符,所以我添加了一个样式记录,其中包含所有段落样式信息。这让我可以编写这样的脚本:
tell application "Ted"
set doc1 to make new document at beginning with properties {name:"Document One"}
tell doc1
set p1 to make new paragraph at end with data "Paragraph One" with properties {size:24, color:maraschino}
set p2 to make new paragraph at end with data "Paragraph Two" with properties {style:style of paragraph 1}
set color of paragraph 1 to blue
end tell
set doc2 to make new document at beginning with properties {name:"Document Two"}
copy p1 to beginning of doc2
properties of paragraph 1 of doc2
end tell
由于 p1 是富文本,因此第二个文档以第一个文档第一段的文本和格式结束。
您还可以询问一段文本的属性,我已经实现了常用的文本套件属性,以及 "style" 属性 段落样式(由 NSParagraphStyle 支持,因为我希望能够编写制表位脚本):
properties of paragraph 1 of doc2
结果: {height:60.0, italic:false, size:24, style:{段落间距after:0.0, head indent:0.0, line break mode:0, alignment:4,行spacing:0.0,最小行height:0.0,首行头indent:0.0,段落间距before:0.0,tabs:{"28L", "56L", "84L", "112L", "140L", "168L", "196L", "224L", "252L", "280L", "308L", "336L"},尾[=28= .0, 最大行 height:0.0, 行高 multiple:0.0, 默认制表符 interval:0.0}, color:blue, width:164.109375, 字体:"Helvetica", bold:false, class:attribute 运行}
这对于在我的应用程序中传递富文本很有效,但对于将带样式的文本传递到其他应用程序可能没那么有用,而这可能正是您想要做的。我认为添加 "style" 属性(记录类型)可能是传达样式信息以用于其他可编写脚本的应用程序的最佳方式。然后在第二个应用程序中,脚本编写者可以使用第二个应用程序理解的样式记录中的任何属性。