Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Зачем LinesFilter.js создает модальное окно?
Как ни странно, но для экономии нервов пользователей.
Представим что окно не модально. Тогда:
1. Открыли большой файл(лог на пару млн строк)
2. Запустили фильтр.
3. Как работает фильтр:
1) Взять текст из окна
2) Выполнить задачу(Долгая атомарная операция)
3) Положить текст обратно в окно
4. Ну работает себе скрипт, никому не мешает. А тут пользователь взял и закрыл окно с которым работает скрипт. Или закрыл другое. Или просто переключил вкладку в PMDI режиме. Скрипт добросовестно туда положит новый текст, а старый и забудет. Или ещё хуже, хендл закрытого окна будет использован повторно но уже в другом приложении, а скрип продолжает думать что это AkelEdit/RichEdit и давай туда данные слвать. А то приложение возьми и упади(ведь ждет что дадут хороший указатель, а дали черт знает что).
В общем придумать как такая ситуация может по-ерить систему не тяжело.

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

Post by Infocatcher »

FeyFre
Не вижу проблемы. Можно блокировать главное окно только на время работы с текстом.
Или окно должно как-то сообщать скрипту, что оно закрылось, или что-то там поменялось. Но первое гораздо проще. И логичнее. :)

P.S. Так и сделал. Файл обновил. И converter.js обновил, там тоже может быть не быстро.

P.P.S. По этой же логике SearchReplace.js тоже может долго думать.

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

Post by FeyFre »

Infocatcher
Как? Операция обработки - атомарная, т.е. делает не отвлекаясь ни на что(не отвлекаясь на цикл прокачки сообщений): вошло в object.match и сидит там(а так как оно не наше - оттуда мы его не выбьем).
Уведомлять скрипты Акел в принципе не может, ибо такого понятия как скрипт не знает. Уведомляет только собственными путями и самого себя(подробнее смотри AkelDLL.h и AkelEdit.h). И до сих пор для подобных задачи(нетривиальные, фоновые задачи) писались только плагины.

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

Post by Infocatcher »

Как? Операция обработки - атомарная
Эээ... Получить текст – обработать – вставить обратно. Уже минимум три операции.

Конкретно
4. Ну работает себе скрипт, никому не мешает. А тут пользователь взял и закрыл окно с которым работает скрипт. Или закрыл другое.
вполне решается.
Если закрыть AkelPad, то скрипт тоже завершится. Если скрипт начал что-то делать с текстом, он блокирует окно, пока не закончит свои дела. А окошко, ничего никуда не записывающее, нормально переносит переключение/закрытие вкладок.

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

Post by FeyFre »

обработать - атомарная с точки зрения скрипта. В скрипте это

Code: Select all

if(pArray=pSelText.match(oPattern))
- рабочая лошадка. И минимум пока она не отработает - никто ничего скрипту сказать не сможет(точнее скрипт не сможет принять во внимание). У меня на файле малых(!) размеров эта операция работает 7 секунд +- 0.5 сек(и это у меня ещё достаточно хорошая машина). За такое время да на слабой/загруженной машине, да на большом файле можно и покрашить всё что угодно(хотя этот скрипт написан достаточно хорошо что-бы так просто загнуть им систему, эму это не так страшно).

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

Post by FeyFre »

Если закрыть AkelPad, то скрипт тоже завершится.
Акел добросовестно ждет завершения скриптов. Например следующий скрипт никогда не даст закрыться Акелу.

Code: Select all

while(!exitcond)
{
	//! Do tasks1
	AkelPad.WindowGetMessage();
	//! Do tasks2
}

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

Post by Infocatcher »

Акел добросовестно ждет завершения скриптов. Например следующий скрипт никогда не даст закрыться Акелу.
SearchReplace.js при закрытии редактора возьмет и завершится.
У меня на файле малых(!) размеров эта операция работает 7 секунд +- 0.5 сек(и это у меня ещё достаточно хорошая машина).
Можно какой-нибудь пример файла? У меня все куда быстрее – секунды 4 на 38-мегабайтный файл. Ядра – чистый изумруд™ :D

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

Post by FeyFre »

SearchReplace.js при закрытии редактора возьмет и завершится.
Ну дык он немного другой чем фильтр линий.
Можно какой-нибудь пример файла?
Ну так навскидку, результат работы комманды dir /s /b >tree.txt в корне какого-нибудь диска. Хотя это скверный пример. Доги какие-нибудь возьмите большие.

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

Post by Infocatcher »

Предложения по SearchReplace.js
  • Опционально после замены выделять результат, а не следующую найденную фразу, потому что иногда требуется контролировать, правильно ли осуществляется замена.
  • Еще можно добавить предустановки в виде выпадающего списка справа от «что:», например, «найти ссылки». И предусмотреть добавление предустановок пользователем.
  • Обработка ошибок.*
Например, для тех же окошек в скриптах иногда требуется подвигать контролы внутри, а делать это проще заменой координаты/параметра на выражение – его потом проще найти и подкорректировать, если требуется. Соответственно, потом хорошо бы как-то все это вычислить. Например, так:
Что: -?\(*(\d+|\d*\.\d+)([ \t()*/+-]+(\d+|\d*\.\d+))+\)*
Чем: return eval($0);
[+] Заменять на функцию
(Регулярное выражение не претендует на полноту и написано просто для примера, обычно можно обойтись гораздо более простым навроде «\d+([*/+-]\d+)+»).
А недостаток тут в том, что надо бы где-то хранить сочиненное выражение, если оно более или менее универсальное, а не под какой-то совершенно конкретный случай.
И, раз уж в примере так вышло, что остальные параметры тоже должны быть строго определенными, то нужна возможность «привязать» их к предустановке.

[Upd]
*Впрочем, вроде бы, при возникновении ошибки можно выбрать «продолжить».

[Upd – 2]
А вот в модифицированном LinesFilter.js нужна особая обработка, обновил: LinesFilter_mod.js

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

Post by Infocatcher »

И снова экспериментальное: getHash.js
Считает хэш-сумму выделенного/всего текста: MD5, SHA1, SHA256.
Image

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Infocatcher,
А нельзя заставить его работать с не латинскими символами в разных кодировках, не только в UTF-8? Высчитывать хеш по hex-значениям?
И ещё, если можно, вариант без этого:

Code: Select all

- allow store last used type in registry
- allow store last window position in registry

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

Post 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 "";
:lol:

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

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

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

Post 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 и прочих вредоносных частей в ссылке), а то у меня наша доблестная система контроля редиректит запрос на гугл :)

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

Post by Infocatcher »

Deim0s wrote:
Можно пример?
С отрытыми исходниками не встречал [...]
Мне интереснее понять, что должно быть на входе, и как оно должно обрабатываться.
FeyFre wrote:kernel32::WideCharToMultiByte
Ну да, я уже видел пример в base64.js.
FeyFre wrote:Под руками есть TotalCommander? В нем есть функция вычисления хеша файла.
Что-то я не подумал, что для всего текста будет то же самое, что и для файла. :D
FeyFre wrote:ЗЫ: плз, выложите скрипт куда-нибудь в другой место(без ucoz ad и прочих вредоносных частей в ссылке), а то у меня наша доблестная система контроля редиректит запрос на гугл :)
Одно время (а может и до сих пор) ucoz-ссылки нельзя было отправить на mail.ru. Довольно глупо на самом деле.
А сюда пускает?


textStatistics.js
Исправлено определение самой длинной строки для текста из одних переводов строк.

AESCrypt.js
Расширены параметры командной строки, добавлена возможность выбора направления (зашифровать/расшифровать) в диалоге запроса пароля.
Locked