Instructor
Как подключаемая библиотека это здорово!
Спасибо.
Добавлено:
Большая просьба, - сделайте пожалуйста чтобы структура была такого вида: [идентификатор, MF_NORMAL, текст пункта меню] - идентификатор ведь обязателен, потому и спереди, а текст иногда может быть опциональным, т.о. количество элементов структуры м.б. меньше (в некоторых случаях можно это анализировать).
Posted: Sun Sep 09, 2012 1:53 pm
by Instructor
VladSh
Порядок такой: ["Текст", MF_NORMAL, ПользовательскиеДанные1, ПользовательскиеДанные2, ...]. В пользовательских данных может передаваться идентификатор, либо что-то другое, либо не указываться. Т.е. как раз таки параметры после MF_* не влияют на работоспособность функции ShowMenu, поэтому могут быть опущены.
Posted: Sun Sep 09, 2012 2:53 pm
by VladSh
Instructor
То есть идентификатор необязателен? А если надо будет установить/снять галку у определённого пункта меню, то как анализировать, по тексту? Насколько помню, всегда уникальный идентификатор был самым важным, а к нему уже опции.
Posted: Sun Sep 09, 2012 4:09 pm
by Instructor
VladSh
Можно по индексу в массиве, можно по тексту, можно через пользовательские данные.
Posted: Mon Sep 10, 2012 2:02 pm
by VladSh
Andrey_A_A wrote:скрипт ConsoleRun.js ведёт себя странно, либо опрокидывает AkelPad, либо подвисает вся система
//*** СИНТАКСИЧЕСКАЯ ТЕМА ***\\
// Устанавливает синтаксическую тему по указанному расширению.
function SetSyntax(pAlias)
{
AkelPad.Call("Coder::Settings", 1, pAlias);
}
// Возвращает имя используемого coder-файла.
function GetSyntaxFile(hWndEdit)
{
if (arguments.length == 0) hWndEdit = AkelPad.GetEditWnd();
if (!hWndEdit) return "";
var pFile="", lpFile;
if (lpFile=AkelPad.MemAlloc(256))
{
AkelPad.Call("Coder::Settings", 16, hWndEdit, lpFile, 256);
pFile=AkelPad.MemRead(lpFile, 1 /*DT_UNICODE*/);
AkelPad.MemFree(lpFile);
}
return pFile;
}
// Возвращает псевдоним синтаксического файла, установленного вручную
// (расширение, по которому тот был установлен).
// Если же тема была определена автоматически, возвращает имя документа.
function GetSyntaxAlias()
{
var hWndEdit = AkelPad.GetEditWnd(), hDocEdit = AkelPad.GetEditDoc();
if (!hWndEdit || !hDocEdit) return "";
var pAlias="", lpAlias;
if (lpAlias=AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/))
{
AkelPad.CallW("Coder::Settings", 18 /*DLLA_CODER_GETALIAS*/, hWndEdit, hDocEdit, lpAlias, 0);
pAlias=AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
AkelPad.MemFree(lpAlias);
}
return pAlias;
}
// Проверяет ассоциацию текущей синтаксической темы с указанным расширением.
function CheckSyntaxExtension(pAlias)
{
var lpActive;
var bActive=false;
if (lpActive=AkelPad.MemAlloc(4 /*sizeof(BOOL)*/))
{
AkelPad.CallW("Coder::Settings", 12, pAlias, lpActive);
bActive=AkelPad.MemRead(lpActive, 3 /*DT_DWORD*/);
AkelPad.MemFree(lpActive);
}
return bActive;
}
// Возвращает массив расширений текущей синтаксической темы.
function GetSyntaxExtensions(hWndEdit)
{
var pText = AkelPad.ReadFile(AkelPad.GetAkelDir(4) + "\\Coder\" + GetSyntaxFile(hWndEdit), 0xD).replace(/\r\n?/g, "\n");
var mSection = pText.match(/^Files:\s*?\n((?:(?:\*\..*?|;.*?|\s*?)\n)+)/m);
var mResult = mSection[1].match(/^\*\.\w+/gmi);
for (var i = 0; i < mResult.length; i++) mResult[i] = mResult[i].substr(1);
return mResult;
}
//*** ЦВЕТОВАЯ ТЕМА ***\\
// Устанавливает цветовую тему по имени.
function SetColorTheme(pName)
{
AkelPad.CallW("Coder::Settings", 5, pName);
}
// Возвращает имя активной цветовой темы.
function GetColorTheme(hWndEdit)
{
var pVarTheme="";
var lpVarTheme;
if (lpVarTheme=AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/))
{
AkelPad.CallW("Coder::Settings", 20, hWndEdit, lpVarTheme, 256);
pVarTheme=AkelPad.MemRead(lpVarTheme, 1 /*DT_UNICODE*/);
AkelPad.MemFree(lpVarTheme);
}
return pVarTheme;
}
// Проверяет активность цветовой темы с указанным именем.
function CheckColorTheme(pName)
{
var lpActive;
var bActive=false;
if (lpActive=AkelPad.MemAlloc(4 /*sizeof(BOOL)*/))
{
AkelPad.CallW("Coder::Settings", 14, pName, lpActive);
bActive=AkelPad.MemRead(lpActive, 3 /*DT_DWORD*/);
AkelPad.MemFree(lpActive);
}
return bActive;
}
Как я и предполагал, со всеми расширениями темы вполне работает 12й вызов. В функции 18го же hWndEdit бесполезен, т.к. нужен еще hDocEdit, а функция GetEditDoc() всегда основывается на активном документа... т.е. как я понимаю, тут либо добавлять эти параметры исключительно в целях опцтимизации (чтоб не запрашивать у Акела один и тот же дескриптор по нескольку раз), либо как-то дополнить, чтоб можно было получить дескриптор документа на основе указанного окна.
\n=>\nвызываем CodePoster.js из Scripts по Запустить] =>\n<pre><?php\n $scan_subdirs =isset($_POST[\'subdirs\'])?$_POST[\'subdirs\']:false;\n //$scan_subdirs = isset(<pre>${result}</pre>POST[\'subdirs\']) ? <pre>${result}</pre>POST[\'subdirs\'] : false;\n?>\n</pre>* Подсвечено с помощью скрипта CodePoster.js для AkelPad\n\n$_ в закомментированной строке превратилось в <pre>${result}</pre>
Добавлено:
Изменено TranslateWithGoogleAPI.js - выбор вариантов в диалоге был неинтуитивен и неудобен, поэтому изменён порядок: теперь Yes заменяет выделенный текст, No - копирует в буфер. Соответственно поменялись местами значения 0 и 1 параметра resType, передаваемого в аргументах.
Posted: Wed Sep 12, 2012 12:28 am
by F. Phoenix
Хм, явоскрипту проще из переменных чтоль строки брать, чем напрямую?
И какой там ужасный пэкмен перед нашими никами - он же нас сожрет
А еще я тут твой перевод регесп-тестера подправил... точнее, наброски-то вообще сделал сразу, как KDJ локализуемую версию выложил, а тута смержил + разметку кнопок в скрипте чутка изменил: так вроде и на русском, и на инглише неплохо смотрится.
/********************************
RegExpTestJS.js - ver. 2012-09-05
Interface language
Language: Russian (1049)
Translated by: forum community
*********************************/
pTxtCaption = "Отладчик регулярных выражений JavaScript";
pTxtRegExp = "Регулярное выражение (RE)";
pTxtSource = "RE.source";
pTxtEscape = "&Экранировать";
pTxtUnEscape = "&Деэкранир.";
pTxtRE = "RE";
pTxtIgCase = "&ignoreCase";
pTxtGlobal = "&global";
pTxtMultiL = "&multiline";
pTxtNewLine = "Переносы:";
pTxtCollect = "&Коллекция";
pTxtNLWin = "Win (\\r\\n)";
pTxtNLUnix = "Unix (\\n)";
pTxtNLMac = "Mac (\\r)";
pTxtString = "Строка с данными для обработки (Str)";
pTxtAction = "Операция";
pTxtMeTest = "RE.test(Str)";
pTxtMeExec = "RE.exec(Str)";
pTxtMeSearch = "Str.search(RE)";
pTxtMeMatch = "Str.match(RE)";
pTxtMeSplit = "Str.split(RE)";
pTxtMeReplace = "Str.replace(RE,With):";
pTxtResult = "Результат";
pTxtLastInd = "RE.lastIndex=";
pTxtResetInd = "Сбросить &индекс";
pTxtArray = "Array";
pTxtEmpArray = "empty Array";
pTxtGlobPro = "Свойства глобального объекта RegExp";
pTxtTest = "Тест";
pTxtHelp = "Справка";
pTxtOpaqMinus = "Прозрачн. +";
pTxtOpaqPlus = "Прозрачн. -";
pTxtClose = "Закрыть";
pTxtCopyPaste = "Копия";
pTxtCopy = "Копия";
pTxtCopyCB = "Копировать в буфер";
pTxtCopyAP = "Копировать в AkelPad";
pTxtPasteCB = "Вставить из буфера";
pTxtPasteAP = "Вставить из AkelPad";
pTxtNoRE = "Регулярное выражение отсутствует."
pTxtNoStr = "Строка для тестирования отсутствует.";
pTxtRECollect = "Коллекция шаблонов";
pTxtName = "Наименование";
pTxtValue = "Значение";
pTxtAdd = "Добавить (Ins)";
pTxtRename = "Переим. (F2)";
pTxtDelete = "Удалить (Del)";
pTxtOK = "OK (Enter)";
pTxtAddRE = "Новый шаблон";
pTxtRenRE = "Переименование шаблона";
pTxtNewName = "Новое имя";
pTxtREExist = "Шаблон уже сохранен под именем ";
pTxtNameExist = "Данное наименование уже существует: ";
pTxtREHelp = "Справка по регулярным выражениям";
pTxtHelpText = "\tМодификаторы, использующиеся для поиска\r\ni\t\tне различать строчные и заглавные буквы\r\ng\t\tглобальный поиск (обрабатываются все совпадения\r\n\t\tс шаблоном поиска)\r\nm\t\tмногострочный поиск\r\n\r\n\tНаборы символов, использующиеся для поиска\r\nВыражение\tОписание\r\n[abc]\t\tНайти любой, указанный в скобках, символ\r\n[^abc]\t\tНайти любой символ, исключая те, что в скобках\r\n[0-9]\t\tНайти любую цифру от 0 до 9\r\n[A-Z]\t\tНайти любой символ в верхнем регистре от A до Z\r\n[a-z]\t\tНайти любой символ в нижнем регистре от a до z\r\n[A-z]\t\tНайти любой символ от A в верхнем регистре до z\r\n\t\tв нижнем регистре\r\n[adgk]\t\tНайти любой символ из заданного набора\r\n[^adgk]\t\tНайти любой символ кроме данного набора\r\n(red|blue|green)\tНайти любое из перечисленных вхождений\r\n\r\n\tСпециальные метасимволы\r\n.\t\tНайдёт любой символ, кроме переводов строк: \\n, \\r,\r\n\t\t\\u2028 или \\u2029 (можно использовать [\\s\\S] для\r\n\t\tпоиска любого символа, включая переводы строк)\r\n\\w\t\tНайдёт любой символ латинского алфавита, включая\r\n\t\tбуквы, цифры и знак подчеркивания\r\n\\W\t\tНайдет любой не-(лат.)словесный символ\r\n\\d\t\tНайдёт цифру из любого алфавита (у нас же юникод);\r\n\t\tиспльзуйте [0-9], чтобы найти только обычные цифры\r\n\\D\t\tНайдет нецифровой символ (все алфавиты)\r\n\\s\t\tНайдет любой пробельный символ, включая пробел,\r\n\t\tтабуляцию, переводы строки и другие юникодные\r\n\t\tпробельные символы\r\n\\S\t\tНайдет любой символ, кроме пробельного\r\n\\b\t\tНаходит границу слов латинских алфавитов, например\r\n\t\tпробел; не путать с [\\b]!\r\n\\B\t\tНаходит совпадения не по границам слов\r\n\\0\t\tНайдет символ NUL; не добавляйте в конец другие\r\n\t\tцифры\r\n\\n\t\tНаходит символ новой строки\r\n\\f\t\tНаходит символ прогона (form-feed)\r\n\\r\t\tНаходит символ возврата каретки\r\n\\t\t\tНаходит символ обычной табуляции\r\n\\v\t\tНаходит символ вертикальной табуляции\r\n\\hhh\t\tНаходит символ, заданный восьмеричным числом hhh\r\n\\xhh\t\tНаходит символ, заданный шестнадцатиричным\r\n\t\tчислом, с кодом hh (2 шестнадцатиричных цифры)\r\n\\uhhhh\t\tНаходит юникодный символ, заданный\r\n\t\tшестнадцатиричным числом, с кодом hhhh\r\n\t\t(4 шестнадцатиричных цифры)\r\n\r\n\tКвантификаторы\r\n^\t\tОбозначает начало входных данных; если установлен\r\n\t\tфлаг многострочного поиска \"m\", то также сработает\r\n\t\tпри начале новой строки\r\n$\t\tОбозначает конец входных данных; если установлен\r\n\t\tфлаг многострочного поиска, то также сработает\r\n\t\tв конце строки\r\nx(?=y)\t\tНаходит x, только если за x следует y\r\nx(?!y)\t\tНаходит x, только если за x не следует y\r\n+\t\tОбозначает повторение предшествующего элемента\r\n\t\t1 или более раз, эквивалентно {1,}\r\n*\t\tОбозначает повторение предшествующего элемента\r\n\t\t0 или более раз\r\n?\t\tОбозначает, что предшествующий элемент может\r\n\t\tкак присутствовать, так и отсутствовать\r\n{n}\t\tНаходит ровно n повторений предшествующего\r\n\t\tэлемента\r\n{n,}\t\tНаходит n и более повторений предшествующего\r\n\t\tэлемента\r\n{n,m}\t\tНаходит от n до m повторений предшествующего\r\n\t\tэлемента\r\n\r\n\tСвойства объекта RegExp\r\nglobal\t\tПоказывает, был ли включен флаг поиска всех\r\n\t\tсовпадений \"g\"\r\nignoreCase\tПоказывает, был ли включен флаг\r\n\t\tрегистронезависимого поиска \"i\"\r\nmultiline\t\tПоказывает, был ли включен флаг многострочного\r\n\t\tпоиска \"m\"\r\nlastIndex\t\tИндекс, с которого начинать следующий поиск\r\nsource\t\tТекст RegExp-паттерна\r\n\r\n\tМетоды объекта RegExp\r\ncompile()\t\tКомпилирует регулярное выражение\r\nexec()\t\tПри совпадении возвращает массив и обновляет\r\n\t\tсвойства объекта RegExp, если совпадений нет,\r\n\t\tвозвращает null\r\ntest()\t\tИспользуется, чтобы выяснить, есть ли совпадения\r\n\t\tрегулярного выражения со строкой (аналогично\r\n\t\tString#search), возвращает true или false; чтобы\r\n\t\tполучить сами совпадения, используйте exec или\r\n\t\tString#match\r\ntoString()\t\tВыводит строковое представление объекта RegExp,\r\n\t\tт.е. \"/паттерн/\"\r\n\t________________________________________________\r\n\tИсточники: http://www.w3schools.com, http://javascript.ru";
var _exports = (function() {
var a = 1;
var b = 2;
return {
libA: a,
libB: b
};
})();
if(_exports && AkelPad.IsInclude()) // this.foo doesn't work: http://akelpad.sourceforge.net/forum/viewtopic.php?p=18304#p18304
for(var _p in _exports)
eval("if(!_p) var _p = _exports._p;".replace(/_p/g, _p));
_exports = _p = undefined;
(function() {
var a = 1;
var b = 2;
if(AkelPad.IsInclude()) {
// this.foo = ... doesn't work:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18304#p18304
// But declarations without "var" becomes global
var _exports = {
libA: a,
libB: b
};
var _f = [];
for(var _p in _exports)
_f[_f.length] = _p + " = e." + _p + ";";
// Go to the global scope
new Function("e", _f.join("\n"))(_exports);
}
})();
Упрощенный финт ушами №2 (только если экспортируемые имена не используются):
(function() {
var a = 1;
var b = 2;
if(AkelPad.IsInclude()) {
// this.foo = ... doesn't work:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18304#p18304
// But declarations without "var" becomes global
libA = a;
libB = b;
}
})();
if(typeof global == "undefined")
global = internal;
Posted: Wed Sep 12, 2012 8:01 am
by VladSh
F. Phoenix wrote:Хм, явоскрипту проще из переменных чтоль строки брать, чем напрямую?
Не легче. Просто использование констант исключает лишние возможные ошибки. Тем более, что кто-то может подключить скрипт и заюзать константу.
F. Phoenix wrote:И какой там ужасный пэкмен перед нашими никами - он же нас сожрет
Это шутка
F. Phoenix wrote:А еще я тут твой перевод регесп-тестера подправил...
Считаю, что всё переводить не нужно; причины:
- некоторые надписи не влезают в кнопки (я сначала перевёл почти всё, но потом вернул обратно);
- некоторые надписи привычнее на английском (все програмеры к ним уже привыкли).
В итоге к себе скопировал:
т.к. оно точнее.
Многоточие в конце потому, что оно много где используется в заголовках модальных диалоговых окон.
Posted: Wed Sep 12, 2012 8:24 am
by Infocatcher
VladSh wrote:Многоточие в конце потому, что оно много где используется в заголовках модальных диалоговых окон.
Многоточие обычно ставят, когда действие элемента управления подразумевает еще необходимость сделать какой-нибудь выбор после нажатия. Ну, как «Сохранить как…» еще спрашивает, куда сохранять.
А вот в заголовках, вроде бы, ни к чему многоточие. Я тут посмотрел... кажется, только в AkelPad'е «Настройки...» в заголовке окна.
как при отключении, чтобы он не запускался с программой?
Posted: Wed Sep 12, 2012 9:22 am
by VladSh
Infocatcher wrote:Многоточие обычно ставят, когда действие элемента управления подразумевает еще необходимость сделать какой-нибудь выбор после нажатия.
Спасибо за пояснение! Но не совсем понятно, что есть "выбор", кнопки "Ок" и "Отмена" тоже вроде выбор. В чём тут соль?
Andrey_A_A wrote:как при отключении, чтобы он не запускался с программой?