Page 41 of 97
Posted: Fri Dec 10, 2010 5:58 pm
by FeyFre
Зачем LinesFilter.js создает модальное окно?
Как ни странно, но для экономии нервов пользователей.
Представим что окно не модально. Тогда:
1. Открыли большой файл(лог на пару млн строк)
2. Запустили фильтр.
3. Как работает фильтр:
1) Взять текст из окна
2) Выполнить задачу(Долгая атомарная операция)
3) Положить текст обратно в окно
4. Ну работает себе скрипт, никому не мешает. А тут пользователь взял и закрыл окно с которым работает скрипт. Или закрыл другое. Или просто переключил вкладку в PMDI режиме. Скрипт добросовестно туда положит новый текст, а старый и забудет. Или ещё хуже, хендл закрытого окна будет использован повторно но уже в другом приложении, а скрип продолжает думать что это AkelEdit/RichEdit и давай туда данные слвать. А то приложение возьми и упади(ведь ждет что дадут хороший указатель, а дали черт знает что).
В общем придумать как такая ситуация может по-ерить систему не тяжело.
Posted: Fri Dec 10, 2010 6:05 pm
by Infocatcher
FeyFre
Не вижу проблемы. Можно блокировать главное окно только на время работы с текстом.
Или окно должно как-то сообщать скрипту, что оно закрылось, или что-то там поменялось. Но первое гораздо проще. И логичнее.
P.S. Так и сделал. Файл обновил. И converter.js обновил, там тоже может быть не быстро.
P.P.S. По этой же логике SearchReplace.js тоже может долго думать.
Posted: Fri Dec 10, 2010 7:40 pm
by FeyFre
Infocatcher
Как? Операция обработки - атомарная, т.е. делает не отвлекаясь ни на что(не отвлекаясь на цикл прокачки сообщений): вошло в object.match и сидит там(а так как оно не наше - оттуда мы его не выбьем).
Уведомлять скрипты Акел в принципе не может, ибо такого понятия как скрипт не знает. Уведомляет только собственными путями и самого себя(подробнее смотри AkelDLL.h и AkelEdit.h). И до сих пор для подобных задачи(нетривиальные, фоновые задачи) писались только плагины.
Posted: Fri Dec 10, 2010 8:29 pm
by Infocatcher
Как? Операция обработки - атомарная
Эээ... Получить текст – обработать – вставить обратно. Уже минимум три операции.
Конкретно
4. Ну работает себе скрипт, никому не мешает. А тут пользователь взял и закрыл окно с которым работает скрипт. Или закрыл другое.
вполне решается.
Если закрыть AkelPad, то скрипт тоже завершится. Если скрипт начал что-то делать с текстом, он блокирует окно, пока не закончит свои дела. А окошко, ничего никуда не записывающее, нормально переносит переключение/закрытие вкладок.
Posted: Fri Dec 10, 2010 9:04 pm
by FeyFre
обработать - атомарная с точки зрения скрипта. В скрипте это
Code: Select all
if(pArray=pSelText.match(oPattern))
- рабочая лошадка. И минимум пока она не отработает - никто ничего скрипту сказать не сможет(точнее скрипт не сможет принять во внимание). У меня на файле малых(!) размеров эта операция работает 7 секунд +- 0.5 сек(и это у меня ещё достаточно хорошая машина). За такое время да на слабой/загруженной машине, да на большом файле можно и покрашить всё что угодно(хотя этот скрипт написан достаточно хорошо что-бы так просто загнуть им систему, эму это не так страшно).
Posted: Fri Dec 10, 2010 9:23 pm
by FeyFre
Если закрыть AkelPad, то скрипт тоже завершится.
Акел добросовестно ждет завершения скриптов. Например следующий скрипт никогда не даст закрыться Акелу.
Code: Select all
while(!exitcond)
{
//! Do tasks1
AkelPad.WindowGetMessage();
//! Do tasks2
}
Posted: Fri Dec 10, 2010 10:03 pm
by Infocatcher
Акел добросовестно ждет завершения скриптов. Например следующий скрипт никогда не даст закрыться Акелу.
SearchReplace.js при закрытии редактора возьмет и завершится.
У меня на файле малых(!) размеров эта операция работает 7 секунд +- 0.5 сек(и это у меня ещё достаточно хорошая машина).
Можно какой-нибудь пример файла? У меня все куда быстрее – секунды 4 на 38-мегабайтный файл. Ядра – чистый изумруд™

Posted: Fri Dec 10, 2010 11:27 pm
by FeyFre
SearchReplace.js при закрытии редактора возьмет и завершится.
Ну дык он немного другой чем фильтр линий.
Можно какой-нибудь пример файла?
Ну так навскидку, результат работы комманды dir /s /b >tree.txt в корне какого-нибудь диска. Хотя это скверный пример. Доги какие-нибудь возьмите большие.
Posted: Sat Dec 11, 2010 8:16 pm
by Infocatcher
Предложения по
SearchReplace.js
- Опционально после замены выделять результат, а не следующую найденную фразу, потому что иногда требуется контролировать, правильно ли осуществляется замена.
- Еще можно добавить предустановки в виде выпадающего списка справа от «что:», например, «найти ссылки». И предусмотреть добавление предустановок пользователем.
- Обработка ошибок.*
Например, для тех же окошек в скриптах иногда требуется подвигать контролы внутри, а делать это проще заменой координаты/параметра на выражение – его потом проще найти и подкорректировать, если требуется. Соответственно, потом хорошо бы как-то все это вычислить. Например, так:
Что:
-?\(*(\d+|\d*\.\d+)([ \t()*/+-]+(\d+|\d*\.\d+))+\)*
Чем:
return eval($0);
[+] Заменять на функцию
(Регулярное выражение не претендует на полноту и написано просто для примера, обычно можно обойтись гораздо более простым навроде «\d+([*/+-]\d+)+»).
А недостаток тут в том, что надо бы где-то хранить сочиненное выражение, если оно более или менее универсальное, а не под какой-то совершенно конкретный случай.
И, раз уж в примере так вышло, что остальные параметры тоже должны быть строго определенными, то нужна возможность «привязать» их к предустановке.
[Upd]
*Впрочем, вроде бы, при возникновении ошибки можно выбрать «продолжить».
[Upd – 2]
А вот в модифицированном LinesFilter.js нужна особая обработка, обновил:
LinesFilter_mod.js
Posted: Tue Dec 14, 2010 5:11 pm
by Infocatcher
И снова экспериментальное:
getHash.js
Считает хэш-сумму выделенного/всего текста: MD5, SHA1, SHA256.

Posted: Wed Dec 15, 2010 12:07 am
by Deim0s
Infocatcher,
А нельзя заставить его работать с не латинскими символами в разных кодировках, не только в UTF-8? Высчитывать хеш по hex-значениям?
И ещё, если можно, вариант без этого:
Code: Select all
- allow store last used type in registry
- allow store last window position in registry
Posted: Wed Dec 15, 2010 12:48 am
by Infocatcher
А нельзя заставить его работать с не латинскими символами в разных кодировках, не только в UTF-8?
Ну, нужен конвертер из UTF-16 (?) в нужную кодировку (это ладно) и образец правильного вычисления.
Сейчас там есть только Utf8.encode().
Высчитывать хеш по hex-значениям?
Можно пример?
вариант без этого
Вот, можете поддержать идею:
viewtopic.php?p=9975#p9975
А то пихать в каждый скрипт по велосипеду как-то не радостно.
Если не хочется возиться с передаваемыми аргументами, проще всего изменить значения по умолчанию:
Code: Select all
var saveOptions = getArg("saveOptions", true);
var savePosition = getArg("savePosition", true);
=>
Code: Select all
var saveOptions = getArg("saveOptions", false);
var savePosition = getArg("savePosition", false);
Или суровый, но универсальный метод:
Code: Select all
function regVal(name, val, type) {
return "";

Posted: Wed Dec 15, 2010 1:22 am
by Deim0s
Infocatcher,
Ну, нужен конвертер из UTF-16 (?) в нужную кодировку (это ладно) и образец правильного вычисления.
Сейчас там есть только Utf8.encode().
Да, работы судя по всему, много.
Можно пример?
С отрытыми исходниками не встречал, в Fsum Frontend те же проблемы. Я лично, всегда для подобных целей использую WinHex - 100% точность хэша выделенного в любой кодировке. К слову о примерах: а вот PSPad наоборот, считает только в текущей ANSI.
А то пихать в каждый скрипт по велосипеду как-то не радостно.
Ну, само по себе сохранение настроек в реестре не плохо (может)

, зато если уж кому не приемлемо, то - категорично.
...проще всего изменить значения по умолчанию:
Спасибо - то что нужно. Вот хорошо было бы, если по аналогии, все авторы выкладывали бы пояснение.
Posted: Wed Dec 15, 2010 9:18 am
by FeyFre
Code: Select all
Ну, нужен конвертер из UTF-16 (?) в нужную кодировку (это ладно)
Code: Select all
oSys.Call("kernel32::WideCharToMultiByte",nCodePage,dwFlags/*0*/, memWideSrc,numWideSrc/*-1*/, memMBDSTBuffer,sizeMBBUffer,memDefChar/*" "*/,pbDefCharUsed/*=0*/)
(в комментариях чаще всего употребляемые значения)
образец правильного вычисления.
Под руками есть TotalCommander? В нем есть функция вычисления хеша файла.
ЗЫ: плз, выложите скрипт куда-нибудь в другой место(без ucoz ad и прочих вредоносных частей в ссылке), а то у меня наша доблестная система контроля редиректит запрос на гугл

Posted: Wed Dec 15, 2010 5:16 pm
by Infocatcher
Deim0s wrote:Можно пример?
С отрытыми исходниками не встречал [...]
Мне интереснее понять, что должно быть на входе, и как оно должно обрабатываться.
FeyFre wrote:kernel32::WideCharToMultiByte
Ну да, я уже видел пример в
base64.js.
FeyFre wrote:Под руками есть TotalCommander? В нем есть функция вычисления хеша файла.
Что-то я не подумал, что для всего текста будет то же самое, что и для файла.
FeyFre wrote:ЗЫ: плз, выложите скрипт куда-нибудь в другой место(без ucoz ad и прочих вредоносных частей в ссылке), а то у меня наша доблестная система контроля редиректит запрос на гугл

Одно время (а может и до сих пор) ucoz-ссылки нельзя было отправить на mail.ru. Довольно глупо на самом деле.
А
сюда пускает?
textStatistics.js
Исправлено определение самой длинной строки для текста из одних переводов строк.
AESCrypt.js
Расширены параметры командной строки, добавлена возможность выбора направления (зашифровать/расшифровать) в диалоге запроса пароля.