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

What clipboard type class strings does OS X JavaScript for Applications recognise?

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

clipboardInfo() 函数揭示了这些键用于 Applescript,但在 Yosemite JavaScript 的情况下较少 eloquent。 (我没试过 10.11)

"text" 和 "string" 似乎有效,但是 none 我已经尝试过 public.html public.rtf «class HTML » «class RTF » rtf html 等等

有没有人找到在这里工作的键(假设剪贴板上存在特定内容类型?)

(与此同时,当然还有一些适用于 JXA 的可用 ObjC() 替代方案:

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 习语会更好...

四字符代码(又名 OSType,又名 UInt32)were/are Apple 活动和其他 classic Mac OS APIs,其中极度紧凑和机器效率远比开发人员的便利性或可读性重要。 (请注意,System 7 必须 运行 在 8MHz 68030 机器上使用几 MB RAM。)大多数旧 API 早已被取出并射击,或者至少被更多的人严重抽象化了现代的(例如 UTI APIs 不仅提供本机 UTI 字符串支持,而且还封装所有旧的 MIME 类型和 4CC 废话)。

只有在使用像 clipboard info 一样古老的硬皮 API 时,旧的废话才会泄露出来,这在当今非常痛苦和过时。事实上,它返回的某些类型名称在 AS 的 'chevron' 语法中显示为原始 4CC(«class weba»«class RTF » 等与 stringUnicode text ) 仅仅反映了 AppleScript 自己的内置字典中该代码缺少相应的关键字(仅限于 AS 开发人员手动定义的关键字代码映射)。即使您确实以其中一种替代格式检索文本剪贴板数据,它通常对您也无用,因为 AS 无论如何都无法对这种类型的数据做任何事情,除非您能找到另一个同样古老的 API 可以也明白了。

UTI 系统功能强大且成熟,自 10.6 左右以来已得到广泛支持,因此没有理由在可用时不使用它,并且有充分的理由避免使用他们长期以来使用的古老、粗糙、残缺的方案自从被取代。否则就是在自取其辱:AS 中仍然存在这样的 API 仅仅反映了 AS 团队未能 deprecate/modernize/replace 它们与 Apple 的其他部分同步;不建议使用它们。

..

关于 JXA 和一般符号 AE 类型的问题...

JXA 根本无法代表 4CC,这是因为它的作者是业余爱好者,在应用程序自动化方面没有实际经验,而且他们多次未能对自己的技术(Scripting Bridge、JXA 等)进行测试或聘请专家来自 those of us who do.

的建议

事实上,JXA 无法表示类型和枚举名称 - Unicode textdocumentyes/no/ask 等(即类型 type classconstant) 的值 - 全部 。由于 JS 没有原生的 Symbol 类型,它的作者认为他们会很聪明,只使用 String,并让桥梁决定是否将这些字符串打包为 typeType/typeEnum 而不是 typeUnicodeText 描述符,然后根据命令的字典定义要求的值类型在 Apple 事件中发送它们。

这适用于微不足道的情况,例如close saving [yes|no|ask],其中字典定义包含确定所需 actual 类型所需的所有信息,但毫不奇怪,一旦您开始处理更复杂的用例,其中无法从字典中推断出所需的类型,或者字典不够完整或不正确。对AE技术有深入了解的人应该已经意识到:应用词典的AETE/SDEF格式从来就不是完整、全面、准确的界面描述语言;仅用于将人类可读名称(aka 'application keywords')从相应的低级 4CC 映射到 and/or 的翻译表,其他所有内容都只是作为用户文档存在,不保证完整性或正确性;因此,尝试使用后者做任何其他事情与您期望的一样可靠。

有趣的是,JXA 的 10.11 预发行版说明他们已经默认禁用了这种 'magical' 转换行为(毫无疑问,因为它以其作者未能预料到的许多其他令人兴奋的方式咬住用户) .这些注释中没有迹象表明他们添加了 Symbol class 来在 JS 中正确表示 AE 类型和枚举名称,因此接下来看看还有什么问题应该很有趣。

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"]