Доступ к свойствам объекта с использованием JXA

Я пытаюсь получить доступ к свойствам объекта в приложении Papers3, используя JXA. Я новичок в JXA, и это оказалось сложной задачей, особенно из-за отсутствия документации.

Вот снимок словаря для объекта, на который я пытаюсь взглянуть

введите здесь описание изображения

Я пытаюсь получить идентификаторы для отображаемых в данный момент окон в приложении.

Моя попытка:

var Papers = Application('Papers');
Papers.includeStandardAdditions = true
Papers.libraryWindow.displayedPublications()

Запуск выдает ошибку и вывод:

Error on line 4: TypeError: Papers.libraryWindow.displayedPublications is not a function. (In 'Papers.libraryWindow.displayedPublications()', 'Papers.libraryWindow.displayedPublications' is undefined)

Error -2700: Script error.

Кроме того, если я позвоню просто Papers.libraryWindow

Результат:

  [function anonymous] {
  "name":"", 
  "prototype":{"constructor":[function anonymous]}
}

Я не знаю, что делать.


person Alex    schedule 15.01.2018    source источник


Ответы (3)


Думаю, это маленькая деталь. libraryWindow должно быть во множественном числе, и необходимо указать, какое именно. Вы можете использовать несколько форм:

  • Форма указателя, например. libraryWindows[0]

  • По имени, например. libraryWindows.byName('Papers')

    Итак, чтобы получить доступ к первому окну библиотеки, вы используете: libraryWindows[0].

Попробуй это:

(() => {
    'use strict'

    const app = Application('Papers');
    const oWin = app.libraryWindows[0]

    return oWin.displayedPublications()
})();
person unlocked2412    schedule 15.01.2018

Что ж, JXA — сломанный обфусцированный умирающий хлам, и AS тоже ненамного лучше, но ключевой момент, который нужно понять здесь, это то, что IPC событий Apple — это не ООП, это RPC + простой первоклассный реляционные запросы. Несмотря на синтаксический сахар, его ближайшим родственником на самом деле является программирование базы данных SQL, а не манипулирование DOM в браузере, поэтому, как только вы разберетесь с этим, [надеюсь] это начнет иметь немного больше смысла.

Приложение «AppleScriptable» представляет свои данные в виде сильно абстрагированного реляционного графа — «объектной модели событий Apple», — где каждый узел связан с другими узлами отношениями «один к одному» и/или «один ко многим». Не существует таких вещей, как «классы» или «объекты» в объектно-ориентированном смысле; это просто жаргон, который был добавлен для целей документации. Таким образом, то, что словарь приложения называет «свойством», представляет собой либо простой атрибут, содержащий примитивное значение (число, строку, список и т. д., например, свойство name Finder file), либо отношение «один к одному» (например, свойство current track). из iTunes' application), а то, что он называет "элементами", представляет собой отношение "один ко многим" (в вашем случае это libraryWindows элементы объекта Papers application).

Например, Papers.libraryWindows.displayedPublications.get() должен возвращать список отображаемых публикаций каждого окна библиотеки в Papers (хотя то, работает ли это на практике, зависит от того, насколько хорошо реализована AEOM приложения, не говоря уже о собственных проблемах реализации JXA). ); или вы можете использовать различные справочные формы (по индексу, по имени и т. д., хотя некоторые из них не работают/не поддерживаются в JXA), чтобы сузить свой запрос, скажем, только до первого окна библиотеки, например. Papers.libraryWindows[0].displayedPublications.get().

Вы можете получить некоторую информацию, просмотрев документацию NodeAutomation, которая включает в себя приблизительный обзор AEOM и как собирать запросы, которые вы затем отправляете в него с помощью команд (удаленных вызовов процедур) для разрешения и обработки по своему усмотрению. Синтаксис JXA не такой красивый, и различные операции, которые отлично работают в AS, не работают в JXA, но это даст вам приблизительное представление.

Тем не менее, я настоятельно рекомендую придерживаться AppleScript. Язык бестолковый, но, по крайней мере, у него есть какая-то документация и сообщество пользователей, которые помогут вам сориентироваться в нем (даже если они не очень хорошо в нем разбираются).

person has    schedule 15.01.2018

Примеры JXA для Papers 3 см. в разделе:
mac-scripting – сценарии автоматизации для macOS.

Для получения более общей информации см.:
Ресурсы JXA

person JMichaelTX    schedule 15.01.2018