支持可编写脚本的Mac应用程序中的“样式文本”(Cocoa Scripting)

时间:2016-04-01 18:47:42

标签: macos cocoa applescript cocoa-scripting

我的应用支持使用Applescript编写脚本。

我正在尝试将存储在NSAttributedString对象中的样式化文本内容提供给Applescript用户。

我以为我可以简单地使用NSAttributedString类传递样式文本,就像我使用NSString类传递纯文本一样,但这不起作用 - 然后Cocoa Scripting报告它无法转换或强制数据。

我想知道我是否遗漏了某些东西,或者这对于Cocoa Scripting支持的标准类是否完全不可能?

AppleScript确实知道“样式文本”类型,如下例所示:

set stxt to "foo" as styled text

因此,如果AppleScript默认情况下知道这种类型,那么Cocoa脚本引擎是否应该以某种方式支持它呢?

2 个答案:

答案 0 :(得分:1)

与往常一样,解决AS问题有很多选择。 在我的脚本文本编辑器(Ted)中,我实现了Text Suite,它基于富文本(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是富文本,因此第二个文档最后会同时显示第一个文档第一段的文本和格式。

您还可以询问一段文本的属性,我已经实现了常用的Text Suite属性,以及"样式"段落样式的属性(由NSParagraphStyle支持,因为我希望能够编写制表位的脚本):

properties of paragraph 1 of doc2       

结果: {height:60.0,italic:false,size:24,style:{段间距后:0.0,头部缩进:0.0,换行模式:0,对齐:4,行间距:0.0,最小行高:0.0,第一行head indent:0.0,段前间距:0.0,制表符:{" 28L"," 56L"," 84L"," 112L", " 140L"," 168L"," 196L"," 224L"," 252L"," 280L& #34;," 308L"," 336L"},尾部缩进:0.0,最大行高:0.0,行高倍数:0.0,默认制表符间隔:0.0},颜色:蓝色,宽度:164.109375,字体:" Helvetica",粗体:false,类:属性运行}

这适用于在我的应用程序中传递富文本,但对于将样式化文本传递给其他应用程序可能没那么有用,这可能是您想要做的。我认为添加一种"风格"属性(类型记录)可能是传达样式信息以便在其他可编写脚本的应用程序中使用的最佳方式。然后在第二个应用程序中,脚本编写者可以使用第二个应用程序理解的样式记录中的任何属性。

答案 1 :(得分:0)

看起来AppleScript中没有对样式文本的隐式支持。传递样式文本也没有通用的交换记录类型。

AppleScript是在OSX之前的日子里开发的,当时样式文本通常由纯文本(在System或MacRoman编码中)和styl资源的组合表示。随着Unicode出现了ustl样式格式的替代格式。这些仍然与今天的Carbon Pasteboard API(PasteboardCreate等)一起使用。然而,这些似乎都没有与AppleScript一起使用。

AppleScript知道样式文本类型的事实没有特别的意义。即使它的类只是 text

<强>更新

我刚刚发现Matt Neuburg的书&#34; AppleScript The Definitive Guide&#34;提到样式文本并举例说明它确实显示包含纯文本(类ktxt)和样式数据(类ksty)的记录和数据类型为styl,正如我上面所预期的那样。他还指出,大多数应用程序都不会使用这种格式。

因此,看起来使用带有样式资源数据的记录确实是预期的方式,只有几乎没有人知道它。去图。

相关问题