OS X JavaScript for Applications识别哪些剪贴板类型类字符串?

时间:2015-08-05 12:59:24

标签: javascript macos applescript javascript-automation jxa

StandardAdditions.sdef表示可以使用键'as'从剪贴板中检索特定数据类型。

enter image description here

clipboardInfo()函数显示这些键对于Applescript是什么,但在Yosemite JavaScript的情况下则不那么有说服力。 (我没试过10.11)

enter image description here

“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习惯用法......

2 个答案:

答案 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 stringUnicode 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 textdocumentyes / no / ask等。(即类型type classconstant) - 的值。由于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"]