Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

FeyFre wrote:В нашем случае лучше именно у екзешника:
1. Достаточно большой процент(хоть и по сути маленький) имеют по несколько копий Акела в системе(У меня лично три штуки). Если они будут пихать логи в одну дырку одновременно, они в конце концов поругаются, и пользователь просто ничего не сможет прочесть в них.
Редкая ситуация, но логично.
Сейчас, когда сессии могут храниться у пользователя в настройках, несколько Акелов разве имеют смысл?
FeyFre wrote:Запускаем второй АкелПад, открываем файл лога, запускаем плаг просмотра лога и смотрим как прокручивается
Спасибо за вариант, но... "Настроение у меня упало" (c) Панкратов-Чёрный :)


Fr0sT wrote:1. Ой, я фанат portable концепции и дико ненавижу раскидывать файлы и настройки по системе.
Portable может работать с флэшки.. создавать лог на ней??
Fr0sT wrote:2. Да, я смотрел InsertDate, но мне не показалось продуктивным в каждый вызов лога дёргать две системные функции. Так что сделал самое простое, что есть. Иначе код раздуется до сотни строк)
Также непродуктивно каждый раз внутри функции перепроверять на инициализацию.
Лучше так:

Code: Select all

var fso = new ActiveXObject("Scripting.FileSystemObject");
var logFile = fso.OpenTextFile(WScript.ScriptName + ".log", 8, true); // open for append, create if not exist;

function log(msg)
{
	logFile.WriteLine(Date() + "\t" + msg);
}
И подключать этот файл с помощью eval(ReadFile(...))



Instructor

Есть функция вставки даты, но жаль, нет функции её получения...

Code: Select all

AkelPad.SendMessage(AkelPad.GetMainWnd(), 273 /*WM_COMMAND*/, 4183, 0)
вставляет дату.
А можно сделать так, что если 2-м параметром идёт 0, то возвращать?
Типа вот так:

Code: Select all

var pDate = AkelPad.SendMessage(AkelPad.GetMainWnd(), 0, 4183, 0);
?

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

Post by FeyFre »

VladSh
Очень и очень не рекомендовано запрашивать/отправлять данные размером больше машинного слова через WM_COMMAND(как и через многие другие), ибо междупроцессный барьер, и автоматического маршалинга для этого сообщения не выполняется.

Code: Select all

function GetLocalTime()
{
	var mem = AkelPad.MemAlloc(16/*sizeof(SYSTEMTIME)*/);
	if(!mem) return false;
	AkelPad.SystemFunction().Call("kernel32::GetLocalTime",mem);
	var res ={
	"Year":       AkelPad.MemRead(mem, 4/*DT_WORD*/),
	"Month":      AkelPad.MemRead(mem+2, 4/*DT_WORD*/),
	"DayOfWeek":  AkelPad.MemRead(mem+4, 4/*DT_WORD*/),
	"Day":        AkelPad.MemRead(mem+6, 4/*DT_WORD*/),
	"Hour":       AkelPad.MemRead(mem+8, 4/*DT_WORD*/),
	"Minute":     AkelPad.MemRead(mem+10, 4/*DT_WORD*/),
	"Second":     AkelPad.MemRead(mem+12, 4/*DT_WORD*/),
	"Millisecond":AkelPad.MemRead(mem+14, 4/*DT_WORD*/)
	};
	AkelPad.MemFree(mem);
	return res;
}

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

Post by VladSh »

FeyFre
Спасибо, здорово.
Но это будет почти тоже, что и Date(), а хотелось бы дату в формате, настроеном в AkelPad'е, т.е. из DateLogFormat или DateInsertFormat.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Влад,
Portable может работать с флэшки.. создавать лог на ней??
1) Я не думаю, что кто-то будет отлаживать скрипты с флешки
2) Даже если это так, то не зря Акель запускается с флешки, и в этом случае мусорить логами в систему - еще более некошерно.
Также непродуктивно каждый раз внутри функции перепроверять на инициализацию
Лучше так:
Проверка строк - очень быстрый процесс по сравнению с запуском системной функции через Акелевскую обёртку (имхо: не замерял). Конечно, проверка на null была бы ещё быстрее, но изначально обнулять объекты не получается в выбранной структуре.
А твой вариант я конечно же рассматривал, и решил, что самодостаточная функция, все свои потроха содержащая внутри себя, - это очень хорошо, и ради этого можно пожертвовать небольшой потерей производительности при проверке на инициализированность.

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

Post by VladSh »

Fr0sT wrote:проверка на null была бы ещё быстрее, но изначально обнулять объекты не получается в выбранной структуре.
У меня
:

Code: Select all

var FSO = null;
var logFile = null;

function log(msg)
{
   if (FSO == null)
      FSO = new ActiveXObject("Scripting.FileSystemObject");
   if (logFile == null)
      logFile = FSO.OpenTextFile(WScript.ScriptName+".log", 8, true); // open for append, create if not exist
   logFile.WriteLine(Date()+"\t" + msg);
}

Fr0sT wrote:решил, что самодостаточная функция, все свои потроха содержащая внутри себя, - это очень хорошо
Дык потроха-то не все внутри..

Code: Select all

var FSO;
var logFile;
всё равно ведь снаружи)

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

VladSh
мдя, действительно... собирался ведь засунуть внутрь, но позабыл... завтра проверю, работает ли, если объявить внутри. Если нет, то в самом деле сделаю проверку на null

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

Post by Infocatcher »

Внутри:

Code: Select all

function log(msg) {
	(
		log.logFile
		|| (
			log.logFile = new ActiveXObject("Scripting.FileSystemObject")
				.OpenTextFile(WScript.ScriptName+".log", 8, true)
		)
	).WriteLine(Date()+"\t" + msg);
}
Совсем внутри:

Code: Select all

var log = (function() {
	var FSO = new ActiveXObject("Scripting.FileSystemObject");
	var logFile = FSO.OpenTextFile(WScript.ScriptName+".log", 8, true);
	return function(msg) {
		logFile.WriteLine(Date()+"\t" + msg);
	};
})();
Только вот зачем... :D

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

Post by VladSh »

Infocatcher
Варианты понятны и интересны.
Особенно второй. Это реально круто! 8)

Чтобы легче было копировать в свой код, наверное. Но я этим точно заниматься не буду /по моему лучше подключать чем копипасты разводить.../

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Infocatcher
мощные способ! Однако можно всё сделать гораздо проще: убрать
var FSO;
var logFile;
и всё))

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

Post by VladSh »

Изменился скрипт selCompleteLine.js.
В классе-объекте ch реализована логика обработки текста (выделения либо всего текста файла). Теперь достаточно описать в своём скрипте функцию process и вызвать один из двух методов: ch.run() или ch.runWithRedraw(). Всё просто и надёжно как старый советский табурет.
Подробности см. в самом скрипте - комментариев навалом.

Вследствие этих изменений откорректированы, а большинство полностью переписаны:
CtrlDown.js
CommentsAdd.js, CommentsDel.js, CommentsExt.js
HTMLlinefeed.js
InsertInetStyleQuote.js
HTMLDelRow.js, HTMLDelUselessTags.js, HTMLDelAllTags.js
DelLineFeed.js и альтернативная реализация скриптов DelEmptyLines.js, DelLeadTrailSpaces.js
CreateSubParagraph.js
DelInsideSpaces.js

Структуру скриптов и как используется класс-объект ch можно посмотреть в этих скриптах.

Добавлено:
Также в selCompleteLine.js имеется класс-объект strExt с некоторыми дополнительными функциями по работе со строками.
Last edited by VladSh on Fri Aug 06, 2010 11:56 am, edited 1 time in total.

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

Post by VladSh »

Fr0sT wrote:Однако можно всё сделать гораздо проще: убрать var FSO; var logFile; и всё))
Без var переменная сразу же попадает из локальной области видимости в глобальную.
Для AkelPad'а я не знаю, чем это "грозит" (вероятно ничем )) ), но вообще (для браузеров) это нехорошая практика.

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

Post by FeyFre »

VladSh
Дело конечно не моё, но Вы немножко неудачно обозвали Helper-объекты ch strExt.
Такие имена очень часто используют для временных переменных а значит объекты будут недоступны.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

VladSh
Этого и добивался) Да и var, описанная вне функции, и так имеет область видимости на всё пространство скрипта...

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

Post by VladSh »

FeyFre
Спасибо за замечание. Я тоже долго думал, как их назвать... :)

Исходил из того, чтобы название было:
- короткое;
- "органично", т.е. вписывалось в код, чтобы он не "рябил";
- подходило по смыслу;
- редко использовалось в других местах (уникальное) /просто мной такие идентификаторы переменных ещё не использовались ))/

Варианты вместо ch: TextChanger, TCh, и т.п. не подошли, т.к. первая буква T неорганично смотрится. А вместо strExt: я рассматривал Str, но это действительно часто используется.

to All
Предложите свои варианты, если они подойдут по "принципам", то конечно же переименую - не проблема (всем же пользоваться, не только мне).
Особенно легко это сделать сейчас, пока ещё никто не пользуется в своих скриптах.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Влад, можешь уникальный префикс добавить. Например, SCL_strExt. А то и namespace сымитировать:
var selCompleteLines {
var ch
var strExt
}

selCompleteLines.strExt.someMethod()
Locked