Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 767
Joined: Mon Sep 28, 2009 10:03 am
Location: Minsk, Belarus

Post by se7h »

Tony wrote:se7h
Данный скрипт "LanguageHelp" работает немного неправильно, упращённо. И поэтому поддерживаются далеко не все CHM документации (например по PHP). Правильно былол бы указывать ключевое слово для поиска в разделе "Указатель". Возможно такое реализовать?
к сожалению нет

скрипт обновился до версии 1.3

для решения проблемы почитайте здесь
Last edited by se7h on Wed Jul 21, 2010 11:31 pm, edited 1 time in total.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh wrote:Просто смешивать данные с кодом это ещё хуже, чем смешивать бизнеслогику с интерфейсом. В идеале данные должны быть в отдельном файле, чтобы любой ОБЫЧНЫЙ пользователь мог преспокойно менять данные, не боясь что-то зацепить.
Тогда кому-то придется придумывать человекопонятный формат и писать парсер. :)
И это с учетом того, что обрабатывать выбор пунктов на основании зависящего от локализации текста нехорошо, а кроме числа-идентификатора, вроде бы (?), больше ничего подходящего у выбранного пункта меню не спросить.
А если меню описывается в том же скрипте, то такой проблемы нет – можно завести для идентификатора константу с осмысленным именем.

Отсюда вопрос: можно ли хранить в пункте меню какие-нибудь (невидимые для пользователя) данные? Чтобы потом по этим данным скрипт определял, что делать.

А без этого, кроме самых простых случаев, придется хранить меню там же, где и обработчик выбора пунктов.
VladSh wrote:Наблюдение:
- для скрипта, который получает текст из выделения методом GetSelText(), преобразование содержимого в массив строк производится так:
var arrContent = strContent.split('\r');
- для скрипта, который получает текст путём чтения другого файла методом ReadFile(), преобразование содержимого в массив строк производится так:
var arrContent = strContent.split('\r\n');
Думается, это может зависеть от формата новой строки в читаемом файле. Но проверять лень. :P
Так что надежнее как-то так:

Code: Select all

var arrContent = strContent.split(/\r\n|\n|\r/);

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Отсюда вопрос: можно ли хранить в пункте меню какие-нибудь (невидимые для пользователя) данные? Чтобы потом по этим данным скрипт определял, что делать.
Да, можно ассоциировать с пунктом данные размером равным размеру указателя в архитектуре системы(4 байта), т.е. можно ассоциировать всё что угодно при условии самостоятельной чистки памяти.
Но это практически не используется по простой причине: в большинстве случаев реакция на выбранный пункт происходит в обработчике команды указанного при создании меню окна, а в этом обработчике доступна только команда, ничего больше(даже меню, которое её породило не известно).
И даже если известно само меню, то не всегда можно найти по команде какой именно пункт её породило, ибо:
1. Пункты меню не обязаны обладать уникальной командой.
2. Любое из вложенных подменю могут повторять любую команду.
Так что в общем случае пункта, а значит и данные не найти. Потому просто используют уникальное значение команды. И обработчик знает что с ней делать и как.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher wrote:Тогда кому-то придется придумывать человекопонятный формат и писать парсер. :)
Да, не проблема, раз уж я сам за это дело впрягся :) Вставлю сюда ответ из лички по newFileTemplate.js.

----------
Infocatcher wrote:
1. Заменил InputBox на выбор из меню.

Code: Select all

var ext = getSelectedMenuItem(POS_CURSOR) || regVal("lastExt");
Обычные меню так себя не ведут. :)
Если ничего не выбрано, то и делать ничего не надо.
Это я неуклюже хотел ничего не потерять из предыдущего варианта)))
Тогда так:

Code: Select all

var ext = getSelectedMenuItem(POS_CURSOR);
:)
Infocatcher wrote:Мне с этими менюшками не нравится, что нельзя (?) задать какой-нибудь осмысленный невидимый параметр.
А мне бы хотелось чего-нибудь в духе
<menuitem label="JavaScript" value="js" />
<menuitem label="Выбрать расширение..." value="?" />
– чтобы пользователь видел label, а скрипт обрабатывал «понятное» value вместо идентификаторов в виде цифр.
Так что отдельно хранящиеся меню без таких вот дополнительных данных имеют довольно ограниченное применение. :?
В большинстве случаев (простой выбор типа ListBox) этого достаточно. Я уже это встроил в кучу своих скриптов.. - без каких бы то ни было проблем.
Вообще, зачем сейчас label "Выбрать расширение..."? Ведь оно выбирается из меню? Скрипт работает чётко, уже без этого.

Code: Select all

<menuitem label="JavaScript" value="js" />
Мне не нравится так это хранить - это неудобно пользователю.
Можно хранить так:

Code: Select all

js = JavaScript
? = Выбрать расширение...
Это уже более-менее... и привычно многим, - как будто обычный ini'шник.
Infocatcher wrote:Или нужно при создании меню из шаблона запоминать ассоциацию «label => value», но тогда нельзя делать пункты с одинаковыми названиями.
Подумаю, как это можно сделать, чтобы и функциональность настраивалась и было попроще. И чтобы этого ограничения не было.
Infocatcher wrote:
2. Откорректировал применение шаблона подсветки/автодополнения.

Code: Select all

if( 
   ext 
   && (
      AkelPad.IsPluginRunning("Coder::HighLight")
      || AkelPad.IsPluginRunning("Coder::AutoComplete")
      || AkelPad.IsPluginRunning("Coder::CodeFold")
   ) 
)
Тогда есть смысл проверять и остальные составляющие – AutoComplete и CodeFold:...
Я вначале так и делал, но так, как HighLight включен почти у всех, то чтобы применить шаблон достаточно включённого HighLight'а. Но вообще - это личное дело каждого))
Infocatcher wrote:Ну, и в данном случае нет особого смысла сравнивать возвращаемое значение «напрямую».
Не знаю почему, но некоторые функции раньше (при старом Scripts) не воспринимали результат без прямого сравнения с boolean... конечно может сейчас это неактуально.. надо пробовать)
----------
Infocatcher wrote:
VladSh wrote:Наблюдение:...
Думается, это может зависеть от формата новой строки в читаемом файле. Но проверять лень. :P
Так что надежнее как-то так:

Code: Select all

var arrContent = strContent.split(/\r\n|\n|\r/);
У меня во всех файлах формат новой строки одинаков.
Хотя вариант интересный, т.к. он универсален. Спасибо! 8)

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh wrote:Вообще, зачем сейчас label "Выбрать расширение..."? Ведь оно выбирается из меню? Скрипт работает чётко, уже без этого.
Ну, тогда «создать новый шаблон» с диалогом выбора расширения. :D


VladSh wrote:

Code: Select all

<menuitem label="JavaScript" value="js" />
Мне не нравится так это хранить - это неудобно пользователю.
Пример не мой. :D И он в основном для пояснения про удобные для обработки данные.
Впрочем, должен быть какой-нибудь встроенный XML-парсер, а для вложенных меню так обычно нагляднее.
VladSh wrote:Это уже более-менее... и привычно многим, - как будто обычный ini'шник.
Как-то так:

Code: Select all

js=JavaScript
-
Разное
{
	cpp=C++
}
-
?=Выбрать расширение...
Но все равно нужно как-то передать обработчику все эти «js», «cpp» и «?».
Правда, можно использовать уже готовый код из ShowMenu.js, но в массивы добавлять 4-й элемент с «понятными» данными.
VladSh wrote:Не знаю почему, но некоторые функции раньше (при старом Scripts) не воспринимали результат без прямого сравнения с boolean... конечно может сейчас это неактуально.. надо пробовать)
Интересно, что же там такое возвращалось. :D
Сферический пример:

Code: Select all

var o = {
	valueOf: function() {
		return false;
	}
};
WScript.Echo(o == true); // false
WScript.Echo(o == false); // true
if(o)
	WScript.Echo("if => true"); // выполнится

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Help me. I am a beginner and I do not know.
Methods AkelPad.GetSelStart() and AkelPad.GetSelEnd() return the beginning and the end of the selection.
How to read the cursor position? The cursor can be at the beginning or the end of the selection.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

KDJ
When there is no selection - AkelPad.GetSelStart() = AkelPad.GetSelEnd().
When there is a selection - no cursor.
Last edited by VladSh on Mon Jul 19, 2010 2:22 pm, edited 2 times in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher wrote:Ну, тогда «создать новый шаблон» с диалогом выбора расширения :D
Да! Так же и работала моя версия скрипта и предыдущая версия ShowMenuEx.js! Наверное Вы просто не пробовали...)
И той версии было вполне достаточно))

Для того, чтобы возвращало идентификатор, прошу испробовать новую Version: 2.3 (2010.07.19) :D
Формат может быть разный. Сейчас поддерживается простой (вывод лейбла), и такой, как в ini, но без кавычек (чтобы проще):

Code: Select all

js = JavaScript
htm = HTML-файл
В чём прелесть - можно добавлять свои парсеры в "класс" Parser и вызывать его по имени! Т.е. все хотелки самых требовательных пользователей учтены :twisted:
Infocatcher Интересно, что же там такое возвращалось.
Я вспомнил... накололся на методах fso и проверке...
Так не работало: if (fso.method), а так работало: if (fso.method == true).
Что за методы - не помню, но лучше перебдеть, чем недобдеть :)
P.S. Что ж это за ужасы такие (код)? )))
Last edited by VladSh on Mon Jul 19, 2010 2:56 pm, edited 5 times in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

VladSh
After all, you can see the cursor.
As the selection by Ctrl+Right cursor is at the end of the selection, and how the Ctrl+Left it is at the beginning.
I think it can be done by AkelPad.SendMessage.
But I do not know what arguments to use.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

KDJ
If you have a view of the mouse position, and not caret, then watch as Instructor's function GetCursorPos() in ShowMenu.js (in archive Scripts-plugin) or ShowMenuEx.js.
For caret - GetCaretPos().

after Ctrl+Left use AkelPad.GetSelStart();
after Ctrl+Right use AkelPad.GetSelEnd().

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

VladSh wrote:Наверное Вы просто не пробовали...)
Мне редко нужны шаблоны. :)
На всякий случай: я имел в виду создание файла-шаблона.

VladSh wrote:

Code: Select all

                     arrItem = lpArrayName[nItem].split("=");

Code: Select all

var s = "abc=qwe=rty";
var indx = s.indexOf("=");
if(indx != -1) {
	var value = s.substr(0, indx);
	var label = s.substr(indx + 1);
	WScript.Echo(value + "\n" + label);
}
Только я не помню, что там в разных версиях с String.substr(startIndex). Вот с отрицательными аргументами точно не работает, хотя должно выбирать с конца строки.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

VladSh
Thank you.
But I need the number of sign, where the caret is.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

But I need the number of sign, where the caret is.
Use message for edit window EM_CHARFROMPOS

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher wrote:На всякий случай: я имел в виду создание файла-шаблона.
Если о файле параметров, т.е. где хранятся данные, то алгоритм такой:
1. Проверка на то. есть ли файл, соответствующий скрипту. Если нет - запрос на создание; скрипт прерывается.
2. Проверка на пустоту файла. Если пустой - запрос на редактирование; скрипт прерывается.
3. Вылетает менюха, где после вариантов идёт:

Code: Select all

-------
изменить...
по которой также открывается файл менюхи; скрипт прерывается.
Т.е. ни о каком сложном создании шаблонов речи не идёт - всё автоматически, прямо-таки налету! Просто и надёжно, как старый советский табурет :mrgreen:

Вот если кто-то придумает парсер для XML, то давайте, вставлю его в скрипт; не вопрос.

Или какой шаблон?


Спасибо за замечание, поправил код :D

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Вот если кто-то придумает парсер для XML, то давайте, вставлю его в скрипт; не вопрос.

Code: Select all

var xml = new ActiveXObject("Msxml2.DOMDocument");
Locked