left menu mob button

Новое на канале:

Если любишь жизнь, не трать время зря, потому что жизнь состоит из времени. (Б. Франклин)

только нужной информации

(серия статей):

Локализованное меню: приключения продолжаются

Проблема получения доступа к скрипту из контекстного меню разных локализаций была подробно рассмотрена в статье «Доступ к скрипту из локализованного меню» и конкретизирована годом позже. Предлагаемые в этих материалах методы решения, мягко говоря, далеки от совершенства: в них предлагается вручную искать индекс нужного меню и указывать его в скрипте. Понятно, что при таком подходе, в случае переноса скрипта на другой компьютер, на котором установлена другая версия программы, с другой локализацией и набором обновлений, пользователю каждый раз нужно будет заново выполнять поиск индекса и исправлять скрипт.

На днях тема вновь была затронута на форуме. В одном из обсуждений Виталий Батушев, автор скриптов, среди которых известный многим sZam, поделился своим решением:

Локализация меню-2

Перебор объектов — 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 — строка, составленная так, чтобы она могла содержаться в имени только нужного меню.

Скрипты на сайте, которые встраиваются в различные меню, обновлены. Если вы скачали их ранее, и попытка встраивания в меню у вас успехом не увенчалась, скачайте новые версии, попробуйте ещё раз и, по возможности, сообщите в комментариях о результатах.


Скрипты, доступные на сайте, которые встраиваются в различные меню:

Комментариев нет.

Оставить комментарий:

Имя*:
E-mail*:
Текст комментария*:
Код безопасности*: