InDesign JavaScript: подгонка TextFrame под содержимое
Как в скриптах InDesign программно имитировать двойной клик по нижней контрольной точке TextFrame. Метод fit(FitOptions.FRAME_TO_CONTENT), autoSizingType и примеры кода для авто-размера фрейма под текст.
InDesign JavaScript: Программный аналог двойного щелчка по контрольной точке TextFrame в пользовательском интерфейсе
Как в InDesign JavaScript можно добиться того же эффекта, что и при двойном щелчке пользователя по нижней центральной контрольной точке TextFrame для автоматического изменения его размера под содержимое?
Сценарий
У меня есть TextFrame с содержимым, и в нижней части этого TextFrame есть свободное пространство. Я хочу программно изменить размер TextFrame так, чтобы его нижний край примыкал непосредственно к текстовому содержимому, аналогично тому, как пользователь дважды щелкает по нижней центральной контрольной точке в интерфейсе.
Пример кода
var testDoc = app.documents.add();
var testPage = app.activeWindow.activePage;
var tf = testPage.textFrames.add();
tf.geometricBounds = [0, 0, 250, 100];
tf.contents = "lalalalal";
Вопрос
Какой метод в скриптах InDesign программно выполняет то же действие, что и двойной щелчок по нижней центральной контрольной точке контейнера TextFrame в пользовательском интерфейсе?
Дополнительный вопрос
Существует ли простой универсальный метод для программной симуляции взаимодействий с различными объектами InDesign в пользовательском интерфейсе?
В indesign javascript (в скриптах indesign) эффект двойного щелчка по нижней центральной контрольной точке достигается вызовом метода textFrame.fit(FitOptions.FRAME_TO_CONTENT). При необходимости предварительно установите textFramePreferences.autoSizingReferencePoint = AutoSizingReferenceEnum.BOTTOM_CENTER_POINT и autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY — это заставит подстраиваться только высоту. Универсального API для «кликов» по произвольным элементам UI нет: лучше искать DOM‑аналог действия или использовать внешние средства автоматизации для имитации мыши/клавиатуры.
Содержание
- Какой метод в indesign javascript выполняет то же действие?
- Скрипты indesign: практический пример и рекомендации
- indesign javascript: autoSizingType, опорные точки и нюансы
- Есть ли универсальный метод для программной симуляции кликов UI в InDesign?
- Источники
- Заключение
Какой метод в indesign javascript выполняет то же действие?
Короткий ответ: используйте метод fit с опцией FitOptions.FRAME_TO_CONTENT. Это прямой программный аналог двойного щелчка по нижней центральной ручке — фрейм сожмётся или расширится так, чтобы его нижний край прилегал к тексту.
Пример минимального дополнения к вашему коду:
var testDoc = app.documents.add();
var testPage = app.activeWindow.activePage;
var tf = testPage.textFrames.add();
tf.geometricBounds = [0, 0, 250, 100];
tf.contents = "lalalalal";
// Программный эквивалент двойного клика по нижней центральной ручке:
tf.fit(FitOptions.FRAME_TO_CONTENT);
Этот приём показан в практических обсуждениях и примерах кода: см. пример с fit(FitOptions.FRAME_TO_CONTENT) на StackOverflow и справку Adobe по опциям подгонки текстового фрейма: https://stackoverflow.com/questions/26908750/fit-frame-to-content-after-changing-its-contents и https://helpx.adobe.com/indesign/using/text-frame-fitting.html.
Скрипты indesign: практический пример и рекомендации
Если вы хотите, чтобы только высота менялась (а ширина оставалась фиксированной) и опора была снизу по центру — сначала задайте параметры авто‑размера, затем вызовите fit() или полагайтесь на авто‑поведение:
// пример: подстроить только высоту, опора — нижний центр
tf.textFramePreferences.autoSizingReferencePoint = AutoSizingReferenceEnum.BOTTOM_CENTER_POINT;
tf.textFramePreferences.autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY;
// обновляем содержимое
tf.contents = "Новый текст, который может быть длиннее или короче.";
// подстраиваем фрейм под содержимое
tf.fit(FitOptions.FRAME_TO_CONTENT);
// если нужно — отключаем авто‑подгонку, чтобы фрейм больше не менялся автоматически
tf.textFramePreferences.autoSizingType = AutoSizingTypeEnum.OFF;
Почему иногда fit() не даёт ожидаемого результата? Бывает несколько причин: внутренние отступы (insets), специальные шрифтовые атрибуты, встроенные (inline‑) объекты или вертикальная юстировка текста. Для типовых сценариев вызов fit(FitOptions.FRAME_TO_CONTENT) сразу после изменения contents решает задачу — об этом тоже есть примеры в обсуждениях: https://stackoverflow.com/questions/61717042/fit-to-frame-with-vertical-justification-options и в руководствах по авто‑размеру: https://creativepro.com/auto-size-indesigns-text-frames/.
indesign javascript: autoSizingType, опорные точки и нюансы
Коротко о ключевых параметрах и вариантах:
FitOptions.FRAME_TO_CONTENT— принудительная подгонка рамки под контент (аналог двойного клика).textFramePreferences.autoSizingType— управляет автоматическим изменением размера:OFF,HEIGHT_ONLY,WIDTH_ONLY,HEIGHT_AND_WIDTHи т.п.textFramePreferences.autoSizingReferencePoint— точка опоры при авто‑изменении (например,BOTTOM_CENTER_POINTдля поведения, похожего на двойной щелчок по нижней центральной ручке).
Если вам нужно, чтобы фрейм всегда автоматически менял высоту при каждом изменении текста (динамическое поведение), включите HEIGHT_ONLY с опорой BOTTOM_CENTER_POINT — тогда InDesign сам будет подгонять высоту при изменении содержимого. Если же требуется разовое «подравнивание» (одно действие, как у пользователя при двойном щелчке), достаточно вызвать fit(FitOptions.FRAME_TO_CONTENT) после установки contents. Официальные варианты описаны в документации Adobe по подгонке текстовых фреймов: https://helpx.adobe.com/indesign/using/text-frame-fitting.html.
Есть ли универсальный метод для программной симуляции кликов UI в InDesign?
Коротко: универсального и безопасного API, который бы «кликал» по любой контрольной точке интерфейса (имитировал мышь/двойной клик) внутри InDesign, нет. Зато есть два основных пути:
- Правильный путь — искать эквивалентное DOM‑/скриптовое действие и вызывать его: в вашем случае это
textFrame.fit()или настройкаtextFramePreferences. Такой подход надёжен и переносим между платформами. - Если прямого скриптового аналога нет, можно применять внешние средства автоматизации интерфейса: AppleScript + System Events (macOS), AutoHotkey/WinAPI (Windows) или инструменты автоматизации тестирования. Это работает, но хрупко и зависит от разрешения экрана, локализации меню и т.д.
Иногда скрипты могут вызывать команды меню или заранее созданные ScriptMenuAction — это частичное решение, но оно не даёт универсальной «мышиной» симуляции и требует знания конкретной команды. В общем: сначала ищите DOM‑метод; если его нет — рассматривайте внешнюю автоматизацию как крайнюю меру.
Источники
- Fit Frame To Content after changing it’s contents — Stack Overflow
- Fit to frame with vertical justification options — Stack Overflow
- Adobe InDesign: Adding and Formatting Text – E-learning Help Guides
- Text frame fitting options in InDesign — Adobe HelpX
- Fit frame to text WIDTH (not just height) – Adobe UserVoice
- Fit Options - frame to content - Extendscript — Adobe Community
- Fit Text to Frame – Id-Extras.com
- Auto-Size InDesign’s Text Frames — CreativePro
Заключение
Итог: в indesign javascript (скрипты indesign) программный аналог двойного щелчка по нижней центральной ручке — это textFrame.fit(FitOptions.FRAME_TO_CONTENT), а при желании поддерживать автоподгонку только по высоте — включите autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY с autoSizingReferencePoint = AutoSizingReferenceEnum.BOTTOM_CENTER_POINT. Для имитации произвольных кликов UI универсального встроенного метода нет; в таких случаях ищите DOM‑аналог операции или используйте внешние средства автоматизации.