Scripts discussion (1)
- Author
- Message
-
Offline
- Posts: 3
- Joined: Sat May 02, 2009 11:07 am
SearchReplase - вопросы чайника
Спасибо автору за плодотворный труд!
Пару вопросов по SearchReplase.
1. при копировании из полей Что | Чем символы кириллицы нечитаемы (Возможно у меня WinXP "расстроенный")
2. непонятки с выражением ([^\n]+), прим ожидаю, Что
мат _([^\n]+)_ Чем мат $1 изменит
ОфисБанкомат _5-я Соколиной горы_ 5-я ул. Соколиной горы
на
ОфисБанкомат 5-я Соколиной горы 5-я ул. Соколиной горы
а получаю
ОфисБанкомат 5-я Соколиной горы_ 5-я ул. Соколиной горы
Спасибо если кто растолкует. Мало инфы для новичков по дополнениям, как делать вертикальные выделения? На этом форуме лишь вопр-ы прог-я.!?
Пару вопросов по SearchReplase.
1. при копировании из полей Что | Чем символы кириллицы нечитаемы (Возможно у меня WinXP "расстроенный")
2. непонятки с выражением ([^\n]+), прим ожидаю, Что
мат _([^\n]+)_ Чем мат $1 изменит
ОфисБанкомат _5-я Соколиной горы_ 5-я ул. Соколиной горы
на
ОфисБанкомат 5-я Соколиной горы 5-я ул. Соколиной горы
а получаю
ОфисБанкомат 5-я Соколиной горы_ 5-я ул. Соколиной горы
Спасибо если кто растолкует. Мало инфы для новичков по дополнениям, как делать вертикальные выделения? На этом форуме лишь вопр-ы прог-я.!?
-
Offline
- Posts: 1873
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Re: Дискуссия по поводу NewFilebyExt.js (из лички)
Вот, для тестов: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
Ок, всё работает!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 и скобкой вставлять пробел;
- после символа }, завершающего функцию, всегда вставлять пустую строку, отделяющую эту функцию от другой.
А так - всё супер!


-
Offline
- Posts: 1873
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
В связи с вот этим обновлены:
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, то для вот такого выделенного текста
получится примерно следующее (зависит от настроек):
+ Добавлено задание метода (пока особо не тестировалось):
– для только добавления или только удаления комметирования (или через передачу аргумента – см. комментарии в коде скрипта).
Уфф!
P.S. Про newFileTemplate.js – чуть позже.
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;
Уфф!

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

-
Offline
- Posts: 1873
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Re: newFileTemplate vs NewFilebyExt
Гм, положить в папку скриптов – разумно.VladSh wrote:1. Директорию делать "%a\\AkelFiles\\Plugs\\Scripts\\Params\\newFileTemplate\", т.к. это относится к плагинам (Scripts) и скриптам, (потому в папке Scripts).
А вот плодить кучу папок смысла не вижу – по-моему, лучше параметры скрипта помещать в папку имени скрипта.
Самый обычный XML с пространством имен2. Сделать финальную установку курсора также, как это сделано в AutoComplete-плагин.
/не понял по поводу "<AkelPad:selStart/>" и "<AkelPad:selEnd/>"/

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

Кстати, ссылка «чтобы было»: http://jsbeautifier.org/ – вдруг пригодится.
Спасибо.А так - всё супер!![]()

newFileTemplate.js (особо не тестировал)
По умолчанию ищет шаблоны в папке %a\AkelFiles\Plugs\Scripts\%scriptName%\
Метка курсора как в плагине AutoComplete: «%|». Если таких меток будет две, текст между ними будет выделен.
А вот с положением прокрутки не совсем понятно. Пока что – как после Ctrl+Home – в самом верху.
[UPD]
Code: Select all
Call("Scripts::Main", 1, "newFileTemplate.js", "html", 0)
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
Я хотел папки с параметрами положить в папку Scripts\Params для того, чтобы не захламлять папку со скриптами. Когда параметров будет много, то скрипты будет неудобно искать... особенно для тех случаев, когда для перечня параметров не нужно создавать отдельные файлы, а достаточно одного файла; например хранить список часто используемых команд с параметрами для командной строки или тот же список разрешений файлов, чтобы не вводить разрешение вручную. Т.е. файлы с параметрами будут идти вперемешку со скриптами, поэтому и лучше для параметров отдельная папка Params, а уже в ней либо папки либо достаточно одного файла по названию скрипта.Infocatcher wrote:Гм, положить в папку скриптов – разумно.VladSh wrote:1. Директорию делать "%a\\AkelFiles\\Plugs\\Scripts\\Params\\newFileTemplate\", т.к. это относится к плагинам (Scripts) и скриптам, (потому в папке Scripts).
А вот плодить кучу папок смысла не вижу – по-моему, лучше параметры скрипта помещать в папку имени скрипта.
Для одного файла с параметрами можно использовать такой принцип наименования файла: scriptname.param
Знаю об этом. Но если пробелы не вставлять - код плохо читается.Infocatcher wrote:А это уже без меня – у мну привычка.VladSh wrote:4. Ну и мелочи - для повышения читабельности кода:
- между if и скобкой вставлять пробел;Строго говоря, большинство пробелов не нужно – хотя бы вот между символами арифметических операций.
Кстати, ссылка «чтобы было»: http://jsbeautifier.org/ – вдруг пригодится.
Вижу, что Вы в своём коде используете правила пунктуации. Исключение только: между оператором условия и скобкой нет пробела. Я когда-то тоже писал стандарты для кода, так у меня всё было однообразно, по моему - удобно. Но это уже, наверное, у каждого свои предпочтения


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

Хотелось бы ещё параметр %s, который так хотелось в AutoComplete.., т.е. выделенный текст в текущем файле. Например я выделяю какую-то функцию или любой кусок кода в текущем файле и жму на создание нового файла, скрипт определяет шаблон, считывает его и определяет, что в нём есть параметр %s, т.е. выделенный текст в текущем файле нужно будет скопировать в место %s. Ну а если в файле ещё есть и %|, то установить курсор в место %|. Если нету %|, то оставить его в месте вставки %s.
Ещё бы содержимое буфера восстанавливать, но это ладно... можно пережить))) Достаточно %s - удобная штука!
Народ что-то посоветует. Хотя, я думаю, вряд ли кто-то будет с этим заморачиваться... и так всё гутInfocatcher wrote:А вот с положением прокрутки не совсем понятно. Пока что – как после Ctrl+Home – в самом верху.

-
Offline
- Posts: 3234
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Ув. Infocatcher практически даёт уроки
по использованию 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 – для множественной замены.
Примерно вот так:Только с with нужно очень аккуратно работать... И иногда лучше вообще от него отказаться в пользу коротких переменных (var a = new ActiveXObject("AkelPad.document"); ...).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); }
-
Offline
- Posts: 3234
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
А теперь по объектам, функциям и "классам" в JS!

Infocatcher wrote:http://javascript.ru/tutorial/basic/syntax-switch#withVladSh wrote:Про 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:Во-первых, все переменные лучше в явном виде объявлять через var.VladSh wrote:Сделал на основе своего предыдущего опыта программирования на васикоподобном языке. Но что-то мне всё это кажется не совсем здраво. Может можно здесь что-то улучшить?
http://www.dklab.ru/chicken/nablas/39.html (там дальше про замыкания – знать полезно, но с первого раза навряд ли понятно, но они есть и при неправильном приготовлении могут случиться утечки памяти)
Насколько я вижу, там в коде Content нигде не объявляется.
В нашем случае это проверяется примерно так:А вотCode: Select all
x = "..."; WScript.Echo(this.x);
и так создаст переменную «a» и присвоит ей undefined.Code: Select all
function f(a) { ... }
Так что, например, можно писать так:И вместо «if (Content != "")» в большинстве случаев достаточно if(Content).Code: Select all
function f(a) { a = a || "defaultValue"; }
И 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:P.S. И таки «Insert line feed after <br>» проще делать на регулярных выражениях. И, скорее всего, быстрее в плане скорости работы.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; };
Infocatcher wrote:Да, есть такое дело – что-то хорошо, но без определенных начальных познаний не понятно, а что-то – базовое, но плохо написано.VladSh wrote:Хотел сказать Вам огромное спасибо за отличные точки входа! Я давно искал хорошую литературу по JS, но все мануалы, что я видел до сих пор, по сравнению с тем, что дали Вы, - это трэш! Я уже забыл даже что такое получение удовольствия от чтения технической литературы!От первой ссылки я вообще был в восторге!
Читал до глубокой ночи)))
Поэтому я всегда любил иметь дело с работающими примерами, которые можно поковырять и посмотреть на результат.
Про замыкания ничего кромеVladSh wrote:Очень понятно. Не скажу, что я увидел область применения тех же замыканий и смысл создания горы функций (это ещё надо осмысливать), но уже стало гораздо проще ориентироваться)так вот сразу не вспоминается.Code: Select all
var myObj = { m0: function() { ... }, m1: function() { var _this = this; window.setTimeout( function() { _this.m0(); }, someDelay ); }, }; myObj.m1();
Удобство в том, что myObj проще переименовывать – «внутри» имя объекта не используется.
А myObj – как некое пространство имен – очень полезно, если имеется много разных функций (которые могут писаться разными людьми независимо друг от друга).
Хотя кое-где можно передавать в setTimeout параметры, но IE такого не умеет.
Я примерно вот такое предлагал:VladSh wrote:А почему всё-таки не так, как в последнем примере (функция внутри конструктора)?
Наверное я ещё плохо ловлю все достоинства и недостатки... - буду разбираться.
textUtils.js + textUtils_test.js
P.S. Infocatcher'у ещё раз респект!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.

-
Offline
- Posts: 1873
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Исправлена ошибка при декодировании, подкорректировано описание:
encodeHTML.js
decodeHTML.js
convertHTML.js
И, опять же из лени, – %|%s%|
newFileTemplate.js
P.S.
encodeHTML.js
decodeHTML.js
convertHTML.js
Ну, может, так и лучше...VladSh wrote:Я хотел папки с параметрами положить в папку Scripts\Params для того, чтобы не захламлять папку со скриптами.
Разбираться со случаем наличия в выделении символов «%|» пока что лень, а так все просто.т.е. выделенный текст в текущем файле нужно будет скопировать в место %s. Ну а если в файле ещё есть и %|, то установить курсор в место %|. Если нету %|, то оставить его в месте вставки %s.
И, опять же из лени, – %|%s%|

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

-
Offline
- Posts: 3234
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Ну это если передавать выделенный текст через буфер, то тогда затрётся содержимое буфера. Т.е. сначала нужно сбросить содержимое буфера куда-то, потом скопировать туда выделенный текст, вставить его, а потом скопировать в буфер то, что мы сохраняли, т.е. то, что там раньше было.Infocatcher wrote:А вот это не понял.VladSh wrote:Ещё бы содержимое буфера восстанавливать, но это ладно... можно пережить))) Достаточно %s - удобная штука!
Вы же это сделали проще (без буфера) - сразу сохраняете содержимое выделения в спец.переменную


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


Здесь главное вовремя остановиться (особенно когда работаешь не ради собственного удовольствия, а на проект), т.к. стремление к совершенству бесконечно))) Вот и у Вас "лень" - это то самое необходимое и достаточное

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:
Полагаю, общаться с редактором должен уметь автор редактора.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")
)
Аргументы функции преобразуются к $0, $1, ... $n (впрочем, arguments тоже работает).
И немного увеличена ширина окошка.
-
Offline
- Posts: 3234
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Последнее время голова туго соображает)))Infocatcher wrote:Не уловил пользу.
И на что должно заменяться %d? На содержимое последнего открытого файла?
Не %d, а %f!
При вызове из контекстного меню последних файлов такой командой
Code: Select all
-"New by File" Call("Scripts::Main", 1, "NewFilebyRecent.js", `"%f"`)
Т.е. применительно к нашему скрипту - выбераем файл-образец из списка свежих, из него берём содержимое и тип файла, а соотв. устанавливаем нужную подсветку и правило автоподстановки.
Это для меня что-то слишком круто, напоминает танцы с бубномInfocatcher wrote:Добавлена «замена на функцию».
Реализует«return» можно не писать – если его нету, он будет добавлен перед всем кодом.Code: Select all
.replace( new RegExp("what", "flags"), new Function("with") )


Если есть что-то почитать, то ссылка будет в самый раз - постараюсь и Вас не отвлекать, и сам разобраться

-
Offline
- Posts: 1873
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Если честно, мне хотелось бы, чтобы изменения были внесены в SearchReplace.js, идущий вместе с дистрибутивом (ибо синхронизировать изменения при обновлениях оригинального скрипта как-то не радостно).Xephon wrote:Отличная идея.Модифицированный SearchReplace.js.
Добавлена «замена на функцию».
Вы планируете проводить дальнешее улучшение этого скрипта? Есть несколько пожеланий.
Instructor, что Вы на это скажете?
А пожелания выкладывайте.
Т.е. в сухом остатке получаем, что нужно обрабатывать аргументы вида «...\filename.ext». Это можно.VladSh wrote:Т.е. применительно к нашему скрипту - выбераем файл-образец из списка свежих, из него берём содержимое и тип файла, а соотв. устанавливаем нужную подсветку и правило автоподстановки.
Кое-что есть здесь (на английском), но совершенно не факт, что все будет работать в реализации от MS.VladSh wrote:Это для меня что-то слишком круто, напоминает танцы с бубномВроде понятно, что стандартную функцию подменили своей, но что внутри... - для меня пока большая загадка). Прошу ликвидировать мою безграмотность!
И вот тут можно почитать: 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);