Я пытаюсь написать сценарий JXA в редакторе сценариев Apple, который сжимает строку с использованием алгоритма LZ и записывает ее в текстовый (JSON) файл:
var story = "Once upon a time in Silicon Valley..."
var storyC = LZString.compress(story)
var data_to_write = "{\x22test\x22\x20:\x20\x22"+storyC+"\x22}"
app.displayAlert(data_to_write)
var desktopString = app.pathTo("desktop").toString()
var file = `${desktopString}/test.json`
writeTextToFile(data_to_write, file, true)
Все работает, за исключением того, что сжатая строка LZ просто преобразуется в набор "?" к тому времени, когда он достигнет выходного файла test.json.
Это должно выглядеть так:
{"test" : "㲃냆Њޱᐈ攀렒삶퓲ٔ쀛䳂䨀푖㢈Ӱນꀀ"}
Вместо этого это выглядит так:
{"test" : "????????????????????"}
У меня такое ощущение, что преобразование происходит в команде app.write, используемой функцией writeTextToFile() (которую я взял из примера в Руководство Apple по созданию сценариев автоматизации Mac а>):
var app = Application.currentApplication()
app.includeStandardAdditions = true
function writeTextToFile(text, file, overwriteExistingContent) {
try {
// Convert the file to a string
var fileString = file.toString()
// Open the file for writing
var openedFile = app.openForAccess(Path(fileString), { writePermission: true })
// Clear the file if content should be overwritten
if (overwriteExistingContent) {
app.setEof(openedFile, { to: 0 })
}
// Write the new content to the file
app.write(text, { to: openedFile, startingAt: app.getEof(openedFile) })
// Close the file
app.closeAccess(openedFile)
// Return a boolean indicating that writing was successful
return true
}
catch(error) {
try {
// Close the file
app.closeAccess(file)
}
catch(error) {
// Report the error is closing failed
console.log(`Couldn't close file: ${error}`)
}
// Return a boolean indicating that writing was successful
return false
}
}
Есть ли заменяющая команда для app.write, которая поддерживает сжатую строку LZ/лучший способ выполнить то, что я пытаюсь сделать?
Кроме того, я использую функцию readFile() (также из Руководство по созданию сценариев), чтобы загрузить строку LZ обратно в сценарий:
function readFile(file) {
// Convert the file to a string
var fileString = file.toString()
// Read the file and return its contents
return app.read(Path(fileString))
}
Но вместо возврата:
{"test" : "㲃냆Њޱᐈ攀렒삶퓲ٔ쀛䳂䨀푖㢈Ӱນꀀ"}
Он возвращается:
"{\"test\" : \"㲃냆੠Њޱᐈ攀렒삶퓲ٔ쀛䳂䨀푖㢈Ӱນꀀ\"}"
Кто-нибудь знает исправление для этого тоже?
Я знаю, что можно использовать Cocoa в сценариях JXA, так может разгадка кроется в этом?
Я только начинаю разбираться с JavaScript, поэтому я признаю, что пытаться понять Objective-C или Swift сейчас мне не по силам.
Я с нетерпением жду любых решений и / или указателей, которые вы могли бы мне предоставить. Заранее спасибо!