Локализованное меню: приключения продолжаются
Проблема получения доступа к скрипту из контекстного меню разных локализаций была подробно рассмотрена в статье «Доступ к скрипту из локализованного меню» и конкретизирована годом позже. Предлагаемые в этих материалах методы решения, мягко говоря, далеки от совершенства: в них предлагается вручную искать индекс нужного меню и указывать его в скрипте. Понятно, что при таком подходе, в случае переноса скрипта на другой компьютер, на котором установлена другая версия программы, с другой локализацией и набором обновлений, пользователю каждый раз нужно будет заново выполнять поиск индекса и исправлять скрипт.
На днях тема вновь была затронута на форуме. В одном из обсуждений Виталий Батушев, автор скриптов, среди которых известный многим sZam, поделился своим решением:
Перебор объектов — cпособ, конечно, не самый скоростной, а, по словам, Виталия, «к сожалению, весьма медленный». Тем не менее, он позволяет одним махом решить имеющуюся проблему сразу для всех версий и локализаций InDesign.
Ниже приведен один из примеров того, как можно осуществить поиск индекса нужного меню, как контекстного, так и главного, независимо от версии и локализации. Следует иметь ввиду, что под тем или иным индексом может «скрываться» совсем не то, что мы можем преполагать. Например, нужный в данном случае объект из главного меню («Таблица») будет содержать строку: «$ID/Table,$ID/kTablePanelTitle,$ID/kPreflightOD_Table,$ID/XML_TableName». А при попытке получить контекстное меню «$ID/RtMouseTable» помехой может выступить, например, «$ID/RtMouseTableStrokeWidget». Код ниже составлен с учётом этих особенностей.
var menuName = "Новый пункт меню таблиц"; var myMenuItem = app.scriptMenuActions.add(menuName); myMenuItem.addEventListener('onInvoke', function(){main();}); function getCurMenu(m, mn){ //Нужный нам объект находится в коллекции объектов m и называется mn var mi = 0; var s = app.findKeyStrings(m[mi].name).toString(); while (!(s.match(mn))){ mi++; s = app.findKeyStrings(m[mi].name).toString(); } return mi; //Возвращаем индекс найденного меню } var mnu = app.menus[0].submenus[getCurMenu(app.menus[0].submenus, "kTablePanelTitle")]; //Главное меню var rMouseMnu = app.menus[getCurMenu(app.menus, "RtMouseTable$")]; //Контекстное меню mnu.menuItems.add(myMenuItem); rMouseMnu.menuSeparators.add(); rMouseMnu.menuItems.add(myMenuItem);
При таком алгоритме, для встраивания скрипта в меню достаточно один раз подобрать регулярное выражение для строки s.match(mn), где s — полное имя текущего пункта меню (как в примерах выше), mn — строка, составленная так, чтобы она могла содержаться в имени только нужного меню.
Скрипты на сайте, которые встраиваются в различные меню, обновлены. Если вы скачали их ранее, и попытка встраивания в меню у вас успехом не увенчалась, скачайте новые версии, попробуйте ещё раз и, по возможности, сообщите в комментариях о результатах.
Скрипты, доступные на сайте, которые встраиваются в различные меню:
- Точное выравнивание таблицы
- Разбить текст на фреймы по абзацам
- Выравнивание фрейма через контекстное меню
Комментариев нет.
Ещё статьи:
- Быстрое форматирование
- Быстрое вращение разворота
- Перекрёстная ссылка в два клика
- Доступ к скрипту из локализованного меню
- Экспорт из InDesign в html: тегируем символьные стили
- Экспорт из InDesign в html-2: тегируем абзацы
- Экспорт из InDesign в html-3: таблицы
- Скрипт не появился в меню, или Ещё раз о локализации
- Экспорт из InDesign в html-4: работа с изображениями и гиперссылками
- Как организовать доступ к списку стилей через Пользовательский интерфейс
Ещё статьи:
- Быстрое форматирование
- Быстрое вращение разворота
- Перекрёстная ссылка в два клика
- Доступ к скрипту из локализованного меню
- Экспорт из InDesign в html: тегируем символьные стили
- Экспорт из InDesign в html-2: тегируем абзацы
- Экспорт из InDesign в html-3: таблицы
- Скрипт не появился в меню, или Ещё раз о локализации
- Экспорт из InDesign в html-4: работа с изображениями и гиперссылками
- Как организовать доступ к списку стилей через Пользовательский интерфейс