36 lines
1.5 KiB
Swift
36 lines
1.5 KiB
Swift
import AppKit
|
|
|
|
// macOS clipboard reader for `react-grab watch`. React Grab's custom MIME type
|
|
// is not exposed directly by Chromium-based browsers: the legacy
|
|
// execCommand("copy") + dataTransfer.setData path lands as a base::Pickle under
|
|
// "org.chromium.web-custom-data"; the async Clipboard API path lands as raw
|
|
// bytes referenced by "org.w3.web-custom-format.map". This reader emits the
|
|
// pickle as base64 (the CLI decodes it, shared with Linux/Windows) and the W3C
|
|
// payload as a resolved string, plus changeCount for cheap idle polling.
|
|
|
|
let GRAB_MIME = "application/x-react-grab"
|
|
let pasteboard = NSPasteboard.general
|
|
var result: [String: Any] = ["changeCount": pasteboard.changeCount]
|
|
|
|
if let text = pasteboard.string(forType: .string) {
|
|
result["text"] = text
|
|
}
|
|
|
|
if let data = pasteboard.data(forType: NSPasteboard.PasteboardType("org.chromium.web-custom-data")) {
|
|
result["pickleBase64"] = data.base64EncodedString()
|
|
}
|
|
|
|
if let mapData = pasteboard.data(
|
|
forType: NSPasteboard.PasteboardType("org.w3.web-custom-format.map")),
|
|
let mapString = String(data: mapData, encoding: .utf8),
|
|
let mapJson = try? JSONSerialization.jsonObject(with: Data(mapString.utf8)) as? [String: String],
|
|
let pasteboardType = mapJson["web " + GRAB_MIME] ?? mapJson[GRAB_MIME],
|
|
let raw = pasteboard.data(forType: NSPasteboard.PasteboardType(pasteboardType)),
|
|
let value = String(data: raw, encoding: .utf8)
|
|
{
|
|
result["grab"] = value
|
|
}
|
|
|
|
let outData = (try? JSONSerialization.data(withJSONObject: result, options: [])) ?? Data("{}".utf8)
|
|
FileHandle.standardOutput.write(outData)
|