StandardAdditions.sdef表示可以使用键'as'从剪贴板中检索特定数据类型。
clipboardInfo()函数显示这些键对于Applescript是什么,但在Yosemite JavaScript的情况下则不那么有说服力。 (我没试过10.11)
“text”和“string”似乎有效,但我没有尝试过public.html public.rtf «class HTML » «class RTF » rtf html
等等的排列。
有没有人找到在这里工作的密钥(假设剪贴板上存在特定的内容类型?)
(与此同时,当然还有一些可行的ObjC()替代JXA:
ObjC.import('AppKit');
// Types: 'public.rtf', 'public.html' etc
function pboardUnpacked(strType) {
return ObjC.unwrap(
$.NSPasteboard.generalPasteboard.stringForType(
strType
)
)
}
// Types: 'com.apple.webarchive' etc
function pboardPlist(strType) {
return ObjC.deepUnwrap(
$.NSPasteboard.generalPasteboard.propertyListForType(
strType
)
)
}
但是也可以使用简洁的StandardAdditions习惯用法......
答案 0 :(得分:4)
四字符代码(又名OSType
,又名UInt32
)是Apple活动和其他经典Mac OS API的基本构建块,其中极端紧凑性和机器效率远比开发人员重要方便或可读性。 (Mind,System 7必须在带有几个MB RAM的8MHz 68030盒子上运行。)大多数旧的API早已被取出并被拍摄,或者至少被更现代的API大量抽象(例如UTI API不能和# 39; t只提供本机UTI字符串支持,但也封装了所有旧的MIME类型和4CC垃圾)。
旧垃圾泄漏的唯一时间是使用同样古老的硬壳API,如clipboard info
,现在非常痛苦和过时。事实上,它返回的某些类型名称在AS' chevron'中显示为原始4CC。语法(«class weba»
,«class RTF »
等等vs string
,Unicode text
)仅反映AppleScript内置的代码缺少相应的关键字字典(仅限于AS开发人员手动定义的关键字代码映射)。即使您确实以其中一种替代格式检索文本剪贴板数据,但无论如何它通常对您无用,因为AS无论如何都无法对该类型的数据执行任何操作,除非您可以找到另一个同样古老的API也可以理解它。
UTI系统能够成熟,并且自10.6左右以来得到广泛支持,所以没有理由不在可用的情况下使用它,并且有足够的理由避免古老的,粗糙的,残废的计划他们&# 39;早已被取代。否则就是为自己制造一根杆:AS中仍然存在这样的API仅仅反映了AS团队未能及时弃用/现代化/替换它们与Apple的其他部分同步;它不是建议使用它们。
...
关于JXA和符号AE类型的问题一般......
JXA根本无法代表4CC,因为它的作者是dilettantes,在应用程序自动化方面没有实际经验,并且一再未能熟悉他们自己的技术(Scripting Bridge,JXA等)或者从专家的建议those of us who do
事实上,JXA无法代表类型和枚举名称 - Unicode text
,document
,yes
/ no
/ ask
等。(即类型type class
和constant
) - 的值。由于JS没有原生的Symbol类型,因此作者认为他们很聪明并只使用String,并让桥梁决定是否将这些字符串打包为typeType
/ typeEnum
在根据命令的字典定义所需的值类型在Apple事件中发送它们之前,而不是typeUnicodeText
描述符。
这适用于琐碎的情况,例如: close saving [yes|no|ask]
,其中字典定义包含确定所需的实际类型所需的所有信息,但是当您开始处理所需类型不能处理的更复杂的用例时,毫不奇怪地会崩溃从字典推断,或字典不够完整或正确的地方。对AE技术有深刻理解的人已经意识到这一点:应用词典' AETE / SDEF格式从未打算成为完整,全面,准确的接口描述语言;只是用于将人类可读名称(也称为应用程序关键字')映射到相应的低级别4CC和/或从相应的低级别4CC映射的转换表,其他所有内容都只是用户文档,不保证完整性或正确性;因此,试图用后者做任何其他事情就像你期望的那样可靠。
有趣的是,JXA的10.11预发行说明表明他们已经禁用了这个“神奇的”#39;默认情况下的转换行为(毫无疑问,因为它以其作者未能预料到的许多其他激动人心的方式咬住了用户)。这些说明中没有任何迹象表明他们已经添加了一个Symbol
类来正确表示JS中的AE类型和枚举名称,所以看看下一步会发生什么其他方面应该很有趣。
答案 1 :(得分:2)
mklement0找到的正确答案(请参阅问题末尾的评论)是JXA使用Apple的统一类型标识符字符串来识别剪贴板中保存的文本类型。
例如:
(function() {
ObjC.import('AppKit');
return ObjC.deepUnwrap(
$.NSPasteboard.generalPasteboard.pasteboardItems.js[0].types
);
})();
// e.g. -->
["public.rtf", "public.utf8-plain-text",
"public.utf16-external-plain-text", "dyn.ah62d4rv4gk81n65yru",
"com.apple.traditional-mac-plain-text", "dyn.ah62d4rv4gk81g7d3ru"]