Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 3
Joined: Sat May 02, 2009 11:07 am

SearchReplase - вопросы чайника

Post by popo »

Спасибо автору за плодотворный труд!

Пару вопросов по SearchReplase.
1. при копировании из полей Что | Чем символы кириллицы нечитаемы (Возможно у меня WinXP "расстроенный")
2. непонятки с выражением ([^\n]+), прим ожидаю, Что
мат _([^\n]+)_ Чем мат $1 изменит
ОфисБанкомат _5-я Соколиной горы_ 5-я ул. Соколиной горы
на
ОфисБанкомат 5-я Соколиной горы 5-я ул. Соколиной горы
а получаю
ОфисБанкомат 5-я Соколиной горы_ 5-я ул. Соколиной горы

Спасибо если кто растолкует. Мало инфы для новичков по дополнениям, как делать вертикальные выделения? На этом форуме лишь вопр-ы прог-я.!?

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

На второй вопрос ответ такой: используйте в качестве символа новой строки не \n, а \r.

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

Re: Дискуссия по поводу NewFilebyExt.js (из лички)

Post by Infocatcher »

VladSh wrote:Какой всё-таки вариант предпочтительнее для данного скрипта? Делаем всё-таки через ReadFile и eval?
Вот, для тестов:
newFileTemplate.js

Настройки:
var templatesDir = "%a\\AkelFiles\\Plugs\\templates\"; – папка с шаблонами
var templateFileName = "template"; – имя файла шаблона
var selStartFlag = "<AkelPad:selStart/>"; – будет заменено на начало выделения
var selEndFlag = "<AkelPad:selEnd/>"; – будет заменено на окончание выделения

Запуск:

Code: Select all

Call("Scripts::Main", 1, "newFileTemplate.js", "html", 0)
Или

Code: Select all

Call("Scripts::Main", 1, "newFileTemplate.js", "", 0)
– будет использовано расширение текущего файла.

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

Re: newFileTemplate vs NewFilebyExt

Post by VladSh »

Infocatcher wrote:Вот, для тестов:
newFileTemplate.js
Ок, всё работает!

Предложения по скрипту:

1. Директорию делать "%a\\AkelFiles\\Plugs\\Scripts\\Params\\newFileTemplate\", т.к. это относится к плагинам (Scripts) и скриптам, (потому в папке Scripts).
Папка Params на будущее - для того, чтобы сохранять параметры и для других скриптов.
Папка newFileTemplate - параметры для текущего скрипта (можно получить програмно).
Получится, что во всех скриптах можно написать общую функцейку для получения параметров.

2. Сделать финальную установку курсора также, как это сделано в AutoComplete-плагин.
/не понял по поводу "<AkelPad:selStart/>" и "<AkelPad:selEnd/>"/

3. Из функции getTemplate вынести в основной код скрипта вставку содержимого файла, т.к. оно не ассоциируется с получением шаблона. Или переименовать тогда getTemplate во что-то более подходящее.

4. Ну и мелочи - для повышения читабельности кода:
- между if и скобкой вставлять пробел;
- после символа }, завершающего функцию, всегда вставлять пустую строку, отделяющую эту функцию от другой.

А так - всё супер! 8) :D

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

Post by Infocatcher »

В связи с вот этим обновлены:

undoNoScroll.js
redoNoScroll.js
highlighter.js (+ для txt-файлов, у которых в имени есть «log», будет предложено расширение «log»)
encodeHTML.js
decodeHTML.js
convertHTML.js


Также обновлены:

_punctuationFixer.js
scriptToBookmarklet.js
scriptToBookmarklet_w2k.js
getLinks.js

toggleComments.js
+ Если выставлено var preferLineComments = true, то для вот такого выделенного текста

Code: Select all

code
code /*comment*/ code
code
получится примерно следующее (зависит от настроек):

Code: Select all

//code
//code /*comment*/ code
//code
+ Добавлено задание метода (пока особо не тестировалось):

Code: Select all

var method = 0;
– для только добавления или только удаления комметирования (или через передачу аргумента – см. комментарии в коде скрипта).

Уфф! :D

P.S. Про newFileTemplate.js – чуть позже. :)

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

Re: newFileTemplate vs NewFilebyExt

Post by Infocatcher »

VladSh wrote:1. Директорию делать "%a\\AkelFiles\\Plugs\\Scripts\\Params\\newFileTemplate\", т.к. это относится к плагинам (Scripts) и скриптам, (потому в папке Scripts).
Гм, положить в папку скриптов – разумно.
А вот плодить кучу папок смысла не вижу – по-моему, лучше параметры скрипта помещать в папку имени скрипта.

2. Сделать финальную установку курсора также, как это сделано в AutoComplete-плагин.
/не понял по поводу "<AkelPad:selStart/>" и "<AkelPad:selEnd/>"/
Самый обычный XML с пространством имен :D – я про <AkelPad:*/>.
Именно это они и делали – определяли положение выделения.
Впрочем, наверное, удобнее, когда метки совпадают.
3. Из функции getTemplate вынести в основной код скрипта вставку содержимого файла, т.к. оно не ассоциируется с получением шаблона. Или переименовать тогда getTemplate во что-то более подходящее.
Можно, можно...
4. Ну и мелочи - для повышения читабельности кода:
- между if и скобкой вставлять пробел;
- после символа }, завершающего функцию, всегда вставлять пустую строку, отделяющую эту функцию от другой.
А это уже без меня – у мну привычка. :P Строго говоря, большинство пробелов не нужно – хотя бы вот между символами арифметических операций.
Кстати, ссылка «чтобы было»: http://jsbeautifier.org/ – вдруг пригодится.
А так - всё супер! 8) :D
Спасибо. :)


newFileTemplate.js (особо не тестировал)
По умолчанию ищет шаблоны в папке %a\AkelFiles\Plugs\Scripts\%scriptName%\
Метка курсора как в плагине AutoComplete: «%|». Если таких меток будет две, текст между ними будет выделен.

А вот с положением прокрутки не совсем понятно. Пока что – как после Ctrl+Home – в самом верху.

[UPD]

Code: Select all

Call("Scripts::Main", 1, "newFileTemplate.js", "html", 0)
– использовать шаблон для "html"

Code: Select all

Call("Scripts::Main", 1, "newFileTemplate.js", "", 0)
– использовать шаблон для расширения текущего файла

Code: Select all

Call("Scripts::Main", 1, "newFileTemplate.js", "?", 0)
(добавлено)
– спросить расширение у пользователя

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

Re: newFileTemplate vs NewFilebyExt

Post by VladSh »

Infocatcher wrote:
VladSh wrote:1. Директорию делать "%a\\AkelFiles\\Plugs\\Scripts\\Params\\newFileTemplate\", т.к. это относится к плагинам (Scripts) и скриптам, (потому в папке Scripts).
Гм, положить в папку скриптов – разумно.
А вот плодить кучу папок смысла не вижу – по-моему, лучше параметры скрипта помещать в папку имени скрипта.
Я хотел папки с параметрами положить в папку Scripts\Params для того, чтобы не захламлять папку со скриптами. Когда параметров будет много, то скрипты будет неудобно искать... особенно для тех случаев, когда для перечня параметров не нужно создавать отдельные файлы, а достаточно одного файла; например хранить список часто используемых команд с параметрами для командной строки или тот же список разрешений файлов, чтобы не вводить разрешение вручную. Т.е. файлы с параметрами будут идти вперемешку со скриптами, поэтому и лучше для параметров отдельная папка Params, а уже в ней либо папки либо достаточно одного файла по названию скрипта.
Для одного файла с параметрами можно использовать такой принцип наименования файла: scriptname.param
Infocatcher wrote:
VladSh wrote:4. Ну и мелочи - для повышения читабельности кода:
- между if и скобкой вставлять пробел;
А это уже без меня – у мну привычка. :P Строго говоря, большинство пробелов не нужно – хотя бы вот между символами арифметических операций.
Кстати, ссылка «чтобы было»: http://jsbeautifier.org/ – вдруг пригодится.
Знаю об этом. Но если пробелы не вставлять - код плохо читается.
Вижу, что Вы в своём коде используете правила пунктуации. Исключение только: между оператором условия и скобкой нет пробела. Я когда-то тоже писал стандарты для кода, так у меня всё было однообразно, по моему - удобно. Но это уже, наверное, у каждого свои предпочтения :) Видимо надо будет сделать PunctuationFixer специально для кода :D, т.к. у каждого свои привычки, а разбираться в новом коде удобнее, когда он написан по личным правилам - как будто сам писал )))
Infocatcher wrote:newFileTemplate.js (особо не тестировал)
По умолчанию ищет шаблоны в папке %a\AkelFiles\Plugs\Scripts\%scriptName%\
Метка курсора как в плагине AutoComplete: «%|». Если таких меток будет две, текст между ними будет выделен.
Всё работает! 8)
Хотелось бы ещё параметр %s, который так хотелось в AutoComplete.., т.е. выделенный текст в текущем файле. Например я выделяю какую-то функцию или любой кусок кода в текущем файле и жму на создание нового файла, скрипт определяет шаблон, считывает его и определяет, что в нём есть параметр %s, т.е. выделенный текст в текущем файле нужно будет скопировать в место %s. Ну а если в файле ещё есть и %|, то установить курсор в место %|. Если нету %|, то оставить его в месте вставки %s.
Ещё бы содержимое буфера восстанавливать, но это ладно... можно пережить))) Достаточно %s - удобная штука!
Infocatcher wrote:А вот с положением прокрутки не совсем понятно. Пока что – как после Ctrl+Home – в самом верху.
Народ что-то посоветует. Хотя, я думаю, вряд ли кто-то будет с этим заморачиваться... и так всё гут 8)

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

Post by VladSh »

Ув. Infocatcher практически даёт уроки :D по использованию RegExp.

VladSh wrote:

Code: Select all

текст<hr "какие-то параметры">текст
нужно, чтобы после отработки скрипта стало так:

Code: Select all

текст
<hr "какие-то параметры">
текст
Infocatcher wrote:Примерно так.


Перевод строки перед «<hr>».

С галочкой на esc-последовательностях:
Что: (\S)[ \t]*(<hr([ \t][^<>]*)?>)
Чем: $1\n$2

(\S)[ \t]*
Находим любой непробельный символ \S (и «запоминаем» его) + любое количество пробелов « » или табов «\t».

<hr
(
[ \t] – пробел или таб, одна штука
[^<>]* – любые символы, кроме < и > в любом количестве (за количество отвечает звездочка)
)? – то, что в скобках, должно встречаться ровно один раз или не встречаться вообще
>


Перевод строки после «<hr>».

С галочкой на esc-последовательностях:
Что: (<hr([ \t][^<>]*)?>)[ \t]*(\S)
Чем: $1\n$3

Работает аналогично, но (\S) – уже третья по счету скобка, поэтому $3.

Хотя можно делать незапоминающие скобки:
Что: (<hr(?:[ \t][^<>]*)?>)[ \t]*(\S)
Чем: $1\n$2
но они работают не везде.
VladSh wrote:Чего-то не получается пока...

Пробовал так:

Code: Select all

Content = Content.replace(/(\S)[ \t]*(<hr([ \t][^<>]*)?>)/g, '$1\n$2');
Content = Content.replace(/(<hr([ \t][^<>]*)?>)[ \t]*(\S)/g, '$1\n$3');
Infocatcher wrote:Да, нужно /.../g.
g – для множественной замены.

Примерно вот так:

Code: Select all

with(new ActiveXObject("AkelPad.document")) {
	var txt = GetSelText() || SetSel(0, -1) || GetSelText();
	txt = txt
		.replace(/(\S)[ \t]*(<hr([ \t][^<>]*)?>)/g, "$1\n$2")
		.replace(/(<hr([ \t][^<>]*)?>)[ \t]*(\S)/g, "$1\n$3");
	ReplaceSel(txt);
}
Только с with нужно очень аккуратно работать... И иногда лучше вообще от него отказаться в пользу коротких переменных (var a = new ActiveXObject("AkelPad.document"); ...).

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

Post by VladSh »

А теперь по объектам, функциям и "классам" в JS!

Infocatcher wrote:
VladSh wrote:Про with не понял, что оно даёт?
http://javascript.ru/tutorial/basic/syntax-switch#with
«Коротко - with берет объект и делает из него новую вложенную область видимости.»

Примерно вот так:

Code: Select all

var obj = {
	m: function() {
		WScript.Echo(
			"function:\n" + arguments.callee
			+ "\n\nthis == obj: " + (this == obj)
		);
		return this;
	}
};
// Т.е. у нас есть объект obj с методом m.
with(obj) {
	m();
}
obj.m();
var x = obj.m;
var res = x(); // А вот при таком вызове this внутри m() будет такой же, как и вот прямо здесь:
WScript.Echo(
	"res == this: " + (res == this)
	+ "\nres == obj: " + (res == obj)
);
Не уверен, что понятно :), но про this тоже можно почитать:
http://javascript.ru/tutorial/object/thiskeyword
VladSh wrote:Что-то здесь похожее на классы чувствую)))
Ну, есть прототипы и прототипное наследование.

Code: Select all

function F() {}
var f = new F();
WScript.Echo(f.m); // Вообще говоря, тут должно быть undefined
WScript.Echo(f.m + ""); // У undefined нету метода .toString(), так что схитрим
F.prototype.m = 1;
WScript.Echo(f.m); // Ага, наследует!
f.m = 2;
WScript.Echo(new F().m); // А тут у нас новый объект, поэтому по-прежнему 1
Infocatcher wrote:
VladSh wrote:Сделал на основе своего предыдущего опыта программирования на васикоподобном языке. Но что-то мне всё это кажется не совсем здраво. Может можно здесь что-то улучшить? :)
Во-первых, все переменные лучше в явном виде объявлять через var.
http://www.dklab.ru/chicken/nablas/39.html (там дальше про замыкания – знать полезно, но с первого раза навряд ли понятно :D, но они есть и при неправильном приготовлении могут случиться утечки памяти)
Насколько я вижу, там в коде Content нигде не объявляется.
В нашем случае это проверяется примерно так:

Code: Select all

x = "...";
WScript.Echo(this.x);
А вот

Code: Select all

function f(a) { ... }
и так создаст переменную «a» и присвоит ей undefined.
Так что, например, можно писать так:

Code: Select all

function f(a) {
  a = a || "defaultValue";
}
И вместо «if (Content != "")» в большинстве случаев достаточно if(Content).

И prototype можно менять не только через

Code: Select all

obj.prototype.meth = ...;
но и вот так:

Code: Select all

obj.prototype = {
  prop0: "...",
  meth0: function() { ... },
  meth1: function() { ... }
};
И я бы попробовал сделать что-то вроде

Code: Select all

function BaseContentChanger(fnc, args, context) {
  this.fnc = fnc;
  this.args = args || [];
  this.context = context || this;
}
BaseContentChanger.prototype.run = function() {
  this.fnc.apply(this.context, this.args); // Вызываем this.fnc в контексте this.context и с аргументами this.args
};

new BaseContentChanger( function() { ... } ).run();
Вообще, в том и фишка, что функции – тоже объекты.
Неплохая статья на тему.

Возможно (скажем, для win 2000), потребуется определить Function.apply:

Code: Select all

if(typeof Function.prototype.apply == "undefined") // Based on code of Prototype JavaScript framework 1.3.1
	Function.prototype.apply = function(_this, args) {
		_this = _this || window;
		args = args || new Array();
		var argsStr = new Array();
		for(var i = 0; i < args.length; i++)
			argsStr[i] = "args[" + i + "]";
		_this.__apply__ = this;
		var res = eval("_this.__apply__(" + argsStr.join(", ") + ")");
		_this.__apply__ = null;
		return res;
	};
P.S. И таки «Insert line feed after <br>» проще делать на регулярных выражениях. И, скорее всего, быстрее в плане скорости работы.
Infocatcher wrote:
VladSh wrote:Хотел сказать Вам огромное спасибо за отличные точки входа! Я давно искал хорошую литературу по JS, но все мануалы, что я видел до сих пор, по сравнению с тем, что дали Вы, - это трэш! Я уже забыл даже что такое получение удовольствия от чтения технической литературы! :D От первой ссылки я вообще был в восторге! 8) Читал до глубокой ночи)))
Да, есть такое дело – что-то хорошо, но без определенных начальных познаний не понятно, а что-то – базовое, но плохо написано.
Поэтому я всегда любил иметь дело с работающими примерами, которые можно поковырять и посмотреть на результат. :)
VladSh wrote:Очень понятно. Не скажу, что я увидел область применения тех же замыканий и смысл создания горы функций (это ещё надо осмысливать), но уже стало гораздо проще ориентироваться)
Про замыкания ничего кроме

Code: Select all

var myObj = {
  m0: function() { ... },
  m1: function() {
    var _this = this;
    window.setTimeout(
      function() { _this.m0(); },
      someDelay
    );
  },
};
myObj.m1();
так вот сразу не вспоминается.
Удобство в том, что myObj проще переименовывать – «внутри» имя объекта не используется. :D
А myObj – как некое пространство имен – очень полезно, если имеется много разных функций (которые могут писаться разными людьми независимо друг от друга).
Хотя кое-где можно передавать в setTimeout параметры, но IE такого не умеет.
VladSh wrote:А почему всё-таки не так, как в последнем примере (функция внутри конструктора)?
Наверное я ещё плохо ловлю все достоинства и недостатки... - буду разбираться.
Я примерно вот такое предлагал:
textUtils.js + textUtils_test.js
Infocatcher wrote:Да, забыл.
Вот еще пара ссылок на закуску:
http://www.dklab.ru/chicken/nablas/38.html
http://www.dklab.ru/chicken/nablas/40.html

Впрочем, на них можно было выйти с http://www.dklab.ru/chicken/nablas/39.html. :)
P.S. Infocatcher'у ещё раз респект! 8)

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

Post by Infocatcher »

Исправлена ошибка при декодировании, подкорректировано описание:
encodeHTML.js
decodeHTML.js
convertHTML.js

VladSh wrote:Я хотел папки с параметрами положить в папку Scripts\Params для того, чтобы не захламлять папку со скриптами.
Ну, может, так и лучше...
т.е. выделенный текст в текущем файле нужно будет скопировать в место %s. Ну а если в файле ещё есть и %|, то установить курсор в место %|. Если нету %|, то оставить его в месте вставки %s.
Разбираться со случаем наличия в выделении символов «%|» пока что лень, а так все просто.
И, опять же из лени, – %|%s%| :D
newFileTemplate.js
Ещё бы содержимое буфера восстанавливать, но это ладно... можно пережить))) Достаточно %s - удобная штука!
А вот это не понял.


P.S.
VladSh wrote:Ув. Infocatcher практически даёт уроки :D по использованию RegExp.
Тут главное придерживаться точки зрения, что всегда можно написать лучше. :)

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

Post by VladSh »

Infocatcher wrote:
VladSh wrote:Ещё бы содержимое буфера восстанавливать, но это ладно... можно пережить))) Достаточно %s - удобная штука!
А вот это не понял.
Ну это если передавать выделенный текст через буфер, то тогда затрётся содержимое буфера. Т.е. сначала нужно сбросить содержимое буфера куда-то, потом скопировать туда выделенный текст, вставить его, а потом скопировать в буфер то, что мы сохраняли, т.е. то, что там раньше было.

Вы же это сделали проще (без буфера) - сразу сохраняете содержимое выделения в спец.переменную :D 8)
Infocatcher wrote:
VladSh wrote:Ув. Infocatcher практически даёт уроки :D по использованию RegExp.
Тут главное придерживаться точки зрения, что всегда можно написать лучше. :)
Есть такая тенденция :) и даже больше - постоянно совершенствовать тот же код :mrgreen:
Здесь главное вовремя остановиться (особенно когда работаешь не ради собственного удовольствия, а на проект), т.к. стремление к совершенству бесконечно))) Вот и у Вас "лень" - это то самое необходимое и достаточное 8)

Upd: Ещё по newFileTemplate.js.
Чтобы полностью заменить NewFilebyRecent.js необходим ещё 1 параметр - %d.

P.S. как бы при сохранении уже знать, что файл определённого расширения?.. И как его подсунуть в диалог сохранения... как по моему - интересная задача.
Last edited by VladSh on Mon Jan 31, 2011 9:24 am, edited 2 times in total.

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

Post by Infocatcher »

VladSh wrote:Только как бы при сохранении уже знать, что файл определённого расширения?.. И как его подсунуть в диалог сохранения... как по моему - интересная задача.
Полагаю, общаться с редактором должен уметь автор редактора. :)
Кстати, да – было бы весьма полезно.

Upd: Ещё по newFileTemplate.js.
Чтобы полностью заменить NewFilebyRecent.js необходим ещё 1 параметр - %d.
Не уловил пользу.
И на что должно заменяться %d? На содержимое последнего открытого файла?


newFileTemplate.js
При вызове

Code: Select all

Call("Scripts::Main", 1, "newFileTemplate.js", "", 0)
или

Code: Select all

Call("Scripts::Main", 1, "newFileTemplate.js", "?", 0)
можно отменить создание новой вкладки.
И добавлено запоминание последнего выбранного расширения.


toggleComments.js
Изменена реализация выбора метода (переключить/добавить/убрать).
При вставке только знаков комментирования вместо выделения вставленного происходит перевод курсора в «закомментированную область».


SearchReplace_mod.js
Модифицированный SearchReplace.js.
Добавлена «замена на функцию».
Реализует

Code: Select all

.replace(
    new RegExp("what", "flags"),
    new Function("with")
)
«return» можно не писать – если его нету, он будет добавлен перед всем кодом.
Аргументы функции преобразуются к $0, $1, ... $n (впрочем, arguments тоже работает).

И немного увеличена ширина окошка.

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Модифицированный SearchReplace.js.
Добавлена «замена на функцию».
Отличная идея.

Вы планируете проводить дальнешее улучшение этого скрипта? Есть несколько пожеланий.

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

Post by VladSh »

Infocatcher wrote:Не уловил пользу.
И на что должно заменяться %d? На содержимое последнего открытого файла?
Последнее время голова туго соображает)))
Не %d, а %f!
При вызове из контекстного меню последних файлов такой командой

Code: Select all

-"New by File" Call("Scripts::Main", 1, "NewFilebyRecent.js", `"%f"`)
в Arguments передаётся имя и полный путь к файлу из списка свежих, который можно получить только если передавать `"%f"`, а не "%f"; первый вариант, IMHO, корректнее.
Т.е. применительно к нашему скрипту - выбераем файл-образец из списка свежих, из него берём содержимое и тип файла, а соотв. устанавливаем нужную подсветку и правило автоподстановки.

Infocatcher wrote:Добавлена «замена на функцию».
Реализует

Code: Select all

.replace(
    new RegExp("what", "flags"),
    new Function("with")
)
«return» можно не писать – если его нету, он будет добавлен перед всем кодом.
Это для меня что-то слишком круто, напоминает танцы с бубном :) Вроде понятно, что стандартную функцию подменили своей, но что внутри... - для меня пока большая загадка). Прошу ликвидировать мою безграмотность! :D
Если есть что-то почитать, то ссылка будет в самый раз - постараюсь и Вас не отвлекать, и сам разобраться 8)

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

Post by Infocatcher »

Xephon wrote:
Модифицированный SearchReplace.js.
Добавлена «замена на функцию».
Отличная идея.

Вы планируете проводить дальнешее улучшение этого скрипта? Есть несколько пожеланий.
Если честно, мне хотелось бы, чтобы изменения были внесены в SearchReplace.js, идущий вместе с дистрибутивом (ибо синхронизировать изменения при обновлениях оригинального скрипта как-то не радостно).
Instructor, что Вы на это скажете?

А пожелания выкладывайте.

VladSh wrote:Т.е. применительно к нашему скрипту - выбераем файл-образец из списка свежих, из него берём содержимое и тип файла, а соотв. устанавливаем нужную подсветку и правило автоподстановки.
Т.е. в сухом остатке получаем, что нужно обрабатывать аргументы вида «...\filename.ext». Это можно.
VladSh wrote:Это для меня что-то слишком круто, напоминает танцы с бубном :) Вроде понятно, что стандартную функцию подменили своей, но что внутри... - для меня пока большая загадка). Прошу ликвидировать мою безграмотность! :D
Кое-что есть здесь (на английском), но совершенно не факт, что все будет работать в реализации от MS.
И вот тут можно почитать: http://javascript.ru/tutorial/basic/reg ... -funktsiiu

Пример:

Code: Select all

var AkelPad = new ActiveXObject("AkelPad.document");
var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();

var regexp = /\d+/g; // любое количество цифр
var func = function($0) {
	var n = parseInt($0);
	return n >= 20
		? 20   // если условие выполняется
		: ++n; // если не выполняется
};

txt = txt.replace(regexp, func);

AkelPad.ReplaceSel(txt);
Или то же самое, но с учетом того, что у нас изначально строковые переменные:

Code: Select all

var AkelPad = new ActiveXObject("AkelPad.document");
var txt = AkelPad.GetSelText() || AkelPad.SetSel(0, -1) || AkelPad.GetSelText();

var _what = "\\d+";
var _with = "var n = parseInt(arguments[0]); return n >= 20 ? 20 : ++n;";

var regexp = new RegExp(_what, "g");
var func = new Function(_with);

txt = txt.replace(regexp, func);

AkelPad.ReplaceSel(txt);
Locked