| View previous topic :: View next topic |
| Author |
Message |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Mon Aug 06, 2007 12:55 pm Post subject: FileOpenDialog |
|
|
OpenEx.js
| Code: | ///Opening a file dialog with a choice of extensions from the list
///Открытие файла с возможностью выбора расширения из списка файла параметров
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1585#1585
// Version: 3.0 (2012.12.20)
//
// -"Открыть..." Call("Scripts::Main", 1, "OpenEx.js") - открывает файл из последнего места открытия без установки фильтра по расширению (обычный диалог открытия)
// -"Открыть из папки..." Call("Scripts::Main", 1, "OpenEx.js", `-source="%d\"`) - открывает из папки файла без установки фильтра по расширению
// -"Открыть по файлу..." Call("Scripts::Main", 1, "OpenEx.js", `-source="%f"`) - открывает из папки файла; расширение для фильтра определяется по файлу
// -"Открыть [ini]..." Call("Scripts::Main", 1, "OpenEx.js", `-source="%f" -ext="ini"`) - открывает из папки файла с фильтром по указанному расширению
if (!AkelPad.Include("CommonFunctions.js")) WScript.Quit();
var pInitial = AkelPad.GetArgValue("source", "");
var fileExt = AkelPad.GetArgValue("ext", "") || GetFileExt(pInitial);
pInitial = FileDialogDefault(true, GetParentClosed(pInitial), fileExt);
if (pInitial) {
//Проверка на существование файла с введенным в диалоге именем
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(pInitial) == true)
AkelPad.OpenFile(pInitial);
else
AkelPad.MessageBox(AkelPad.GetMainWnd(), "File '" + pInitial + "' not found.", "AkelPad", 64);
} | N.B.: Для работы данного кода обязателен CommonFunctions.js.
Моделирование своей кнопки тулбара "Открыть...":
| Code: | | -"Открыть..." Call("Scripts::Main", 1, "OpenEx.js") Menu("OPEN") Icon(2) | Вызываемое подменю:
| Code: | "OPEN"
{
RECENTFILES
SEPARATOR
"Удалить несуществующие" Call("RecentFiles::DeleteNonExistent")
} |
,
Last edited by VladSh on Thu Dec 20, 2012 2:20 pm; edited 22 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Wed Aug 08, 2007 8:45 am Post subject: общий функционал для работы с выделением и текстом |
|
|
selCompleteLine.js
| Code: | ///Script "library" for working with text
// must be placed in ...\Scripts\Include\
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1607#1607
// Version: 4.8 (2012.11.05)
//GLOBAL VARIABLES
var pBreak = "\r"; //by default
var pTab = "\t";
var sShift; //shift definition (\t for Tab or Spaces)
var sbOpen = "{";
var sbClose = "}";
var nEndLineOfFile = -1; //индекс доступа к последней строке файла; (на -2 с наскока не удалось переделать, т.к. в correctRangebyBorders сложные условия)
var pContent = ""; //содержимое всего изменяемого файла; определяется и используется внутри данного скрипта, извне вручную не менять!
//"Класс"-объект модификации текста
var oCh =
{
rBegin: [], //Границы выделения при запуске скрипта - позиции символов в файле для начала и окончания выделения
Text: "", //Обработанная строка - результат работы скрипта
rResult: [], //Границы выделения изменяемого текста
rCaret: [], //Границы для установки выделения после работы скрипта
saveSelRange: function() //Запоминает границы выделения при запуске скрипта (вспомогательный Private-метод)
{
if (typeof(rBegin) == "undefined")
{
this.rBegin[0] = AkelPad.GetSelStart();
this.rBegin[1] = AkelPad.GetSelEnd();
this.rCaret = [this.rBegin[0], this.rBegin[0]]; //по умолчанию по окончании работы ставим каретку в начало выделения, которое в начале сделал пользователь
}
},
getSelTextEmpty: function() //Если текст не выделен, возвращает пустую строку
{
this.rResult = this.rBegin;
if (this.rBegin[0] == this.rBegin[1])
return "";
else
return getTextbyRange(this.rBegin);
},
getSelTextAll: function() //Если текст не выделен, возвращает всё содержимое файла
{
if (this.rBegin[0] == this.rBegin[1])
{
this.rResult = getTextAll();
return pContent;
}
else
{
this.rResult = this.rBegin;
return getTextbyRange(this.rResult);
}
},
getTextAll: function() //Возвращает всё содержимое файла вне зависимости, выделено что-то или нет
{
this.rResult = getTextAll();
return pContent;
},
setCompleteLineText: function() //Работает автоматически по выделению
{
this.rResult = getRangeCompleteLine(this.rBegin[0], this.rBegin[1]);
this.Text = getTextbyRange(this.rResult);
},
setCompleteLineRange: function(nPosStart, nPosEnd) //Используется в сложних случаях, когда необходимо самому просчитать и передать границы
{
this.rResult = getRangeCompleteLine(nPosStart, nPosEnd);
this.Text = getTextbyRange(this.rResult);
},
run: function() //Основной метод запуска (без отключения прорисовки)
{
this.start();
this.modify();
},
runWithRedraw: function() //Основной метод запуска (с отключением прорисовки)
{
this.start();
var hWndEdit = AkelPad.GetEditWnd();
AutoRedrawOff(hWndEdit);
this.modify();
AutoRedrawOn(hWndEdit);
},
start: function() //Вспомогательный "Private"-метод
{
this.saveSelRange();
process(); //Определяется внутри вызывающего скрипта!
},
setSelCaret: function(nCaretStart, nCaretEnd) //Установка параметров выделения; 2-й параметр необязателен
{
if (nCaretStart != null) //Если в nCaretStart передан null - оставляем выделение в ReplaceSel (см. метод modify)
{
this.rCaret[0] = nCaretStart;
this.rCaret[1] = nCaretEnd || nCaretStart; //Если nCaretEnd не задан - устанавливаем курсор в позицию nCaretStart
}
else
this.rCaret = null;
},
modify: function() //Окончание работы скрипта: установка и замена выделения + установка курсора (вспомогательный Private-метод)
{
if (this.rResult != null)
{
AkelPad.SetSel(this.rResult[0], this.rResult[1]);
var bSelect = (this.rCaret == null);
AkelPad.ReplaceSel(this.Text, bSelect);
if (!bSelect)
AkelPad.SetSel(this.rCaret[0], this.rCaret[1]);
}
},
testSetSelResult: function() //Тестирование установки выделения заменяемого текста
{
if (this.rResult != null)
AkelPad.SetSel(this.rResult[0], this.rResult[1]);
else
AkelPad.MessageBox(AkelPad.GetEditWnd(), " this.rResult = null", "oCh.testSetSelResult() function", 0 /*MB_OK*/);
AutoRedrawOn(AkelPad.GetEditWnd()); //если вдруг работу начинали с вызова runWithRedraw
WScript.Quit();
}
};
//FUNCTIONS
//Берёт текст чисто по указанным границам; вынесена, чтобы сделать "класс" более абстрактным
function getTextbyRange(Range)
{
return AkelPad.GetTextRange(Range[0], Range[1]);
}
//Нужно для простых случаев, когда надо сразу выделить захваченые строки; иначе пользуемся алгоритмами с GetTextRange
function selCompleteLine(nCaretPosStart, nCaretPosEnd)
{
var Range = getRangeCompleteLine(nCaretPosStart, nCaretPosEnd);
AkelPad.SetSel(Range[0], Range[1]);
}
//Возвращает границы выделенных полных строк с учётом ограничивающих переводов строк; также поддерживаются значения -1 и -2.
function getRangeCompleteLine(nCaretPosStart, nCaretPosEnd)
{
var hWndEdit = AkelPad.GetEditWnd();
var Range = [];
Range[0] = getOffset(hWndEdit, 18 /*AEGI_WRAPLINEBEGIN*/, nCaretPosStart);
Range[1] = getOffset(hWndEdit, 19 /*AEGI_WRAPLINEEND*/, nCaretPosEnd);
return Range;
//return getRangebyBorders(nCaretPosStart, nCaretPosEnd, pBreak, pBreak, false); //старая рабочая; закоментил на всякий случай, вдруг придётся открывать...
}
//Возвращает смещение объекта, определяемого nType (см. ScriptConsts.js в папке документации).
//by Instructor function: http://akelpad.sourceforge.net/forum/viewtopic.php?p=11382#11382
function getOffset(hWndEdit, nType /*AEGI_*/, nOffset)
{
var lpIndex;
if (lpIndex = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/))
{
if (nOffset != -1)
AkelPad.SendMessage(hWndEdit, 3137 /*AEM_RICHOFFSETTOINDEX*/, nOffset, lpIndex);
AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, nType, lpIndex);
nOffset = AkelPad.SendMessage(hWndEdit, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
AkelPad.MemFree(lpIndex);
}
return nOffset;
}
//Получает весь текст; при работе с "классом" перед её вызовом желателен вызов saveSelRange, чтобы запомнить границы выделения
function getTextAll()
{
var rResult = [0, nEndLineOfFile];
pContent = pContent || getTextbyRange(rResult); //берём весь текст в бэкграунде в глобальную переменную
if (pContent)
return rResult;
}
//Простое определение границ по открывающему и закрывающему тэгу
function getRangebyBorders(nMinSel, nMaxSel, pBOpen, pBClose, bIncludeBorders)
{
var Range = [];
if (getTextAll())
{
Range[1] = pContent.indexOf(pBClose, nMaxSel); //Ищем вниз
Range[0] = pContent.lastIndexOf(pBOpen, nMinSel); //Ищем вверх
Range = correctRangebyBorders(nMinSel, pBOpen, pBClose, bIncludeBorders, Range);
}
return Range;
}
//Определение границ по открывающему и закрывающему тэгу с учётом возможности их вложенности
function getRangebyBordersEx(iCursor, pBOpen, pBClose, bIncludeBorders)
{
var Range = [];
var iStart;
var cBOpen;
var cBClose;
if (!getTextAll())
return null;
var iBOpen = pContent.lastIndexOf(pBOpen, iCursor); //ищем вверх индекс открывающего тэга
var iBClose = pContent.lastIndexOf(pBClose, iCursor); //ищем вверх индекс закрывающего тэга
if (iBOpen < iBClose) //если закрывающий тэг ниже открывающего, значит продолжаем искать открывающий тэг выше
{
do
{
iStart = iBOpen - 1;
iBOpen = pContent.lastIndexOf(pBOpen, iStart); //индекс открывающего тэга
if (iBOpen == -1)
return null; //защита от зацикливания при передаче неправильных или несуществующих в файле тэгов
cBOpen = substringCount(pContent, iBOpen, iCursor, pBOpen); //количество открывающих тэгов
cBClose = substringCount(pContent, iBOpen, iCursor, pBClose); //количество закрывающих тэгов
}
while (cBOpen - 1 != cBClose);
iBClose = iBOpen - 1; //чтобы зайти в следующее условие (поиск последнего закрывающего тэга)
}
if (iBOpen > iBClose) //если закрывающий тэг выше открывающего, значит ищем закрывающий тэг ниже курсора
{
iStart = iCursor;
do
{
iBClose = pContent.indexOf(pBClose, iStart); //индекс закрывающего тэга
if (iBClose == -1)
return null; //защита от зацикливания при передаче неправильных или несуществующих в файле тэгов
cBOpen = substringCount(pContent, iBOpen, iBClose, pBOpen);
cBClose = substringCount(pContent, iBOpen, iBClose, pBClose);
iStart = iBClose + 1;
}
while (cBOpen - 1 != cBClose);
}
Range[0] = iBOpen;
Range[1] = iBClose;
Range = correctRangebyBorders(iCursor, pBOpen, pBClose, bIncludeBorders, Range);
return Range;
}
function correctRangebyBorders(nMinSel, pBOpen, pBClose, bIncludeBorders, Range)
{
if ((Range[0] == -1 && pBOpen != pBreak) || (Range[1] == -1 && pBClose != pBreak))
return null;
else if (Range[0] == Range[1]) //Конец строки
{
if (Range[0] != 0)
Range[0] = pContent.lastIndexOf(pBOpen, nMinSel - 1); //Повторно ищем вверх
else
bIncludeBorders = null;
}
if (bIncludeBorders != null)
{
if (bIncludeBorders)
Range[1] += (pBClose.length);
else
Range[0] += pBOpen.length;
}
return Range;
}
//Возвращает границы блока текста ограниченный разделителями
//поиск производится снизу вверх
//nMaxSel - позиция в файле, с которой будет начинаться поиск;
// для внешнего цикла будет быстрее; по умолчанию передавать длину строки
function getRangebyBordersBack(pContent, pBOpen, pBClose, nMaxSel)
{
var Range = [];
var nMaxSelTmp = pContent.lastIndexOf(pBClose, nMaxSel);
if ( !(nMaxSelTmp == -1 && pBClose == pBreak) )
nMaxSel = nMaxSelTmp;
if (nMaxSel != -1)
{
Range[1] = nMaxSel + pBClose.length;
Range[0] = pContent.lastIndexOf(pBOpen, nMaxSel);
var nMaxSel = Range[0];
if (nMaxSel != -1)
return Range;
}
return null;
}
//Возвращает границы строки, в которой находится искомое вхождение
//3-й элемент результирующего массива - nMaxSel для следующей итерации
function getTextLineRange(pContent, pText, nMaxSel)
{
var Range = [];
// находим вхождение строки
nMaxSel = pContent.lastIndexOf(pText, nMaxSel);
if (nMaxSel != -1)
{
// ищем её окончание
Range[1] = pContent.indexOf(pBreak, nMaxSel);
if (Range[1] == -1)
Range[1] = pContent.length;
// ищем её начало
Range[0] = pContent.lastIndexOf(pBreak, nMaxSel);
if (Range[0] == -1)
Range[0] = 0;
var nMaxSel = Range[0];
return Range;
}
return null;
}
//Удаляет строку, в которой находится искомое вхождение;
//Возвращает массив:
// - 1-й элемент - содержимое строки;
// - 2-й - nMaxSel, т.е. точка отсчёта, откуда начинать поиск в следующей итерации
function removeTextLine(pContent, pText, nMaxSel)
{
var iRange = getTextLineRange(pContent, pText, nMaxSel)
if (iRange != null)
{
var sRange = splitbyBorders(pContent, iRange[0], iRange[1]);
sRange[0] = sRange[0] + sRange[1];
sRange[1] = iRange[0];
return sRange;
}
return null;
}
//Удаляет все строки, в которых находится искомое вхождение
function removeTextLineAll(pContent, pTextRemove)
{
var nMaxSel = pContent.length;
do
{
var Range = removeTextLine(pContent, pTextRemove, nMaxSel);
if (Range == null)
return pContent;
pContent = Range[0];
nMaxSel = Range[1];
}
while (true);
}
//Разбивка строки: слева "пустые" символы начала строки, справа все остальные значащие
//by Infocatcher code
function separateRow(line)
{
var sNull = line.match(/^\s*/)[0];
return {
left: sNull, //начальные "пустые" символы текущей строки
right: line.substr(sNull.length) //все символы текущей строки, идущие после "пустых"
};
}
//Количество вхождений в определённом диапазоне
function substringCount(pContent, nStart, nEnd, pTextSearch)
{
var pTextSource = pContent.substring(nStart, nEnd);
return pTextSource.split(pTextSearch).length - 1;
}
//Разбивка строки в массив исключая участок, ограниченный номерами позиций;
//массив будет содержать 2 элемента
function splitbyBorders(pText, nStart, nEnd)
{
var arrTmp = [];
arrTmp[0] = pText.substring(0, nStart);
arrTmp[1] = pText.substr(nEnd);
return arrTmp;
}
//Замена участка, ограниченного номерами позиций, на подстроку;
//при nStart = nEnd будет, естественно, производиться вставка
function replacebyBorders(pText, nStart, nEnd, pTextIns)
{
return splitbyBorders(pText, nStart, nEnd).join(pTextIns);
}
//STOP redraw window (by code of the Instructor)
function AutoRedrawOff(hWndEdit)
{
AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, false, 0);
}
//START redraw window (by code of the Instructor)
function AutoRedrawOn(hWndEdit)
{
AkelPad.SendMessage(hWndEdit, 11 /*WM_SETREDRAW*/, true, 0);
var oFunction = AkelPad.SystemFunction();
oFunction.Call("user32::InvalidateRect", hWndEdit, 0, true);
}
//Определение символа(-ов) сдвига из настроек
function getShift()
{
if (sShift == undefined)
{
var bTabStopAsSpaces = AkelPad.SendMessage(AkelPad.GetMainWnd(), 1223 /*AKD_GETFRAMEINFO*/, 53 /*FI_TABSTOPASSPACES*/, 0);
if (bTabStopAsSpaces)
{
var nTabStop = AkelPad.SendMessage(AkelPad.GetEditWnd(), 3239 /*AEM_GETTABSTOP*/, 0, 0); //Number of Spaces in Tabs (take from the program settings)
sShift = oStr.repeat(" ", nTabStop);
}
else
sShift = pTab;
}
return sShift;
}
function shiftRightText(pText)
{
getShift();
return sShift + pText.replace(/\r/g, pBreak + sShift);
}
//"Класс"-объект расширенного функционала по работе со строками
var oStr =
{
flags: "g", //by default
ltrim: function(pText, chars)
{
chars = chars || "\\s";
return pText.replace(new RegExp("^[" + chars + "]+", this.flags), "");
},
rtrim: function(pText, chars)
{
chars = chars || "\\s";
return pText.replace(new RegExp("[" + chars + "]+$", this.flags), "");
},
trim: function(pText, chars)
{
return this.ltrim(this.rtrim(pText, chars), chars);
},
left: function(pText, pSep)
{
var poz = pText.indexOf(pSep);
if (poz > 0)
return pText.slice(0, poz);
else
return "";
},
right: function(pText, pSep)
{
var poz = pText.indexOf(pSep);
if (poz > 0)
return pText.slice(poz + 1, pText.length);
else
return "";
},
leftback: function(pText, pSep)
{
var poz = pText.lastIndexOf(pSep);
if (poz > 0)
return pText.slice(0, poz);
else
return "";
},
rightback: function(pText, pSep)
{
var poz = pText.lastIndexOf(pSep);
if (poz > 0)
return pText.slice(poz + 1);
else
return "";
},
cleanbyBorders: function(pText, pBStart, pBEnd)
{
//При создании объекта RegExp в паттерне все слэши д.б. экранированы! Передавать тоже экранированные!
return pText.replace(new RegExp(pBStart + "*?[\\s\\S]*?" + pBEnd, this.flags), "");
},
repeat: function(pText, nCount)
{
return (new Array(nCount + 1)).join(pText);
}
};
//Обработка Esc-последовательностей
function escSequencesProcessing(pText)
{
if (pText)
{
pText = pText.replace(/\\\\/g, "\0");
// if (pText.search(/\\[^rnt]/g) != -1)
// {
pText = pText.replace(/\\r\\n|\\r|\\n/g, "\r");
pText = pText.replace(/\\t/g, pTab);
pText = pText.replace(/\0/g, "\\");
// }
}
return pText;
} |
Old SelCompleteLine function only (for history)
• SelCompleteLine (AkelPad 3.x.x variant)
| Code: | ///Old Select complite lines (by code of the Instructor) for AkelPad 3.x.x and more (works correctly with the SmartSel::NoSelEOL function)
function SelCompleteLine(hWndEdit, nMinSel, nMaxSel)
{
var nMinLine;
var nMaxLine;
var nMinLineIndex = 0;
var nMaxLineIndex;
var nMaxLineLength;
if (nMinSel <= nMaxSel)
{
nMinLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMinSel);
nMaxLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMaxSel);
nMinLineIndex = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nMinLine, 0);
nMaxLineIndex = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nMaxLine, 0);
nMaxLineLength = AkelPad.SendMessage(hWndEdit, 193 /*EM_LINELENGTH*/, nMaxLineIndex, 0);
if (nMaxLineIndex == nMaxSel & nMinSel != nMaxSel) --nMaxLine;
else if (nMaxLineLength) nMaxSel = nMaxLineIndex + nMaxLineLength + 1;
nMinSel = nMinLineIndex;
if (nMinSel != nMaxSel) nMaxSel = nMaxSel - 1; //Добавил эту строку
AkelPad.SetSel(nMinSel, nMaxSel);
return nMaxLine - nMinLine + 1;
}
return 0;
} |
• SelCompleteLine (AkelPad >= 4.x.x variant)
| Code: | ///Old Select complite lines (by code of the Instructor) for AkelPad 4.x.x and more
function SelCompleteLine(hWndEdit, nMinSel, nMaxSel)
{
var nMinLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMinSel);
var nMinLineIndex = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nMinLine, 0);
var nMaxLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nMaxSel);
var nMaxLineIndex = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nMaxLine, 0);
var bNormalOrder = (nMinLine < nMaxLine);
var nMinIndex = (bNormalOrder ? nMinLineIndex : nMaxLineIndex);
var nMaxIndex = (bNormalOrder ? nMaxLineIndex : nMinLineIndex);
var nMaxLineLength = AkelPad.SendMessage(hWndEdit, 193 /*EM_LINELENGTH*/, nMaxIndex, 0);
AkelPad.SetSel(nMinIndex, nMaxIndex + nMaxLineLength);
} |
Примеры вызова:
| Code: | SelCompleteLine(AkelPad.GetEditWnd(), AkelPad.GetSelStart(), AkelPad.GetSelEnd());
SelCompleteLine(AkelPad.GetEditWnd(), -1, -2); //от текущей строки и до конца файла |
getLineInfo | Code: | //Возвращает основную информацию о строке (отображаемой редактором) по переданной позиции в окне редактирования; поддерживаются значения -1 и -2 /оставлено для истории/
function getLineInfo(hWndEdit, nPos)
{
if (!hWndEdit) hWndEdit = AkelPad.GetEditWnd();
var nLine = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nPos);
var nLineIndex = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, nLine, 0);
var nLineLength = AkelPad.SendMessage(hWndEdit, 193 /*EM_LINELENGTH*/, nLineIndex, 0);
return {
number: nLine,
start: nLineIndex,
len: nLineLength
};
} |
Last edited by VladSh on Mon Nov 05, 2012 12:48 pm; edited 42 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Wed Aug 08, 2007 8:50 am Post subject: Формирование, перенос и раскрытие символов блока {} |
|
|
CtrlDown.js
| Code: | ///Formation, carrying over and disclosing of symbols of the block
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1608#1608
// Version: 3.6 (2011.03.29)
if (AkelPad.GetMainWnd() && AkelPad.IsAkelEdit())
{
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
}
function process()
{
var existentShift = "";
var existentLeft = "";
var existentRight = "";
var smbNull = " \t";
getShift();
oCh.setCompleteLineText();
if (oCh.Text)
existentShift = oCh.Text.slice(0, oCh.Text.lastIndexOf(oStr.trim(oCh.Text, smbNull))); //Определяем существующий отступ 1-го значащего символа от начала строки
if (oCh.rBegin[0] == oCh.rBegin[1]) //Если нет выделения
{
pozOpen = oCh.Text.lastIndexOf(" " + sbOpen);
if (pozOpen == -1)
pozOpen = oCh.Text.lastIndexOf("\t" + sbOpen);
if (pozOpen > 0) //Действия, выполняемые, если в текущей строке есть открывающая скобка
{
existentLeft = oStr.rtrim(oCh.Text.slice(0, pozOpen), smbNull); //Остающиеся символы выделения перед открывающей скобкой
if (existentLeft.length)
existentLeft += pBreak;
existentRight = oStr.trim(oCh.Text.slice(pozOpen + 2), smbNull); //Кусок выделения после открывающей скобки, т.е. который должен быть внутри блока; 2 - размер искомого блока: " " + sbOpen
}
else
{
existentLeft = oStr.trim(AkelPad.GetTextRange(oCh.rResult[0], oCh.rBegin[0]), smbNull);
if (existentLeft.length)
existentLeft = existentShift + existentLeft + pBreak;
existentRight = oStr.trim(AkelPad.GetTextRange(oCh.rBegin[0], oCh.rResult[1]), smbNull);
}
if (existentRight.charAt(existentRight.length - 1) == sbClose) //Если закрывающая скобка есть - удаляем, так проще, - потом всё равно проставляем
existentRight = existentRight.substr(0, existentRight.length - 1);
existentRight = existentShift + sShift + existentRight;
}
else
{
existentRight = sShift + oCh.Text.replace(/\r/g, pBreak + sShift);
}
oCh.Text = existentLeft + existentShift + sbOpen + pBreak + existentRight + pBreak + existentShift + sbClose;
oCh.setSelCaret(oCh.rResult[0] + oCh.Text.length - (existentShift.length + 2)); //Устанавливаем каретку в конец блока
} |
NB: This script used selCompleteLine.js.
Algorithms of work of a script (алгоритмы работы скрипта)
| - simbol of cursor
Var 1 - In line there is no symbol of the beginning of the block (в строке нет символа начала блока):
1.1.
not left symbols
or
Result:
1.2. | Code: | | condition |expression |
Result:
| Code: | condition
{
expression|
} |
1.3:
Result:
1.4:
Result:
Var 2 - In line there is a symbols of the block (в строке есть символы блока)
2.1.
or
or
Result:
2.2.
| Code: | | condition| {expression | or
| Code: | | condition {|expression} |
Result:
| Code: | condition
{
|expression
} |
NB: The condition should not contain block symbols { }. (условие не должно содержать символов блока)
Var 3 - Some lines are selected (выделено несколько строк):
| Code: | code line 1;
code line 2 (selected);
code line 3 (selected);
code line 4; |
Result:
| Code: | code line 1;
{
code line 2;
code line 3;|
}
code line 4; |
P.S.
EN: I wish to allocate algorithm of shift in single function and to place it in SelCompleteLine.js which could be caused both from ShiftRight.js, and from CtrlDown.js.
RU: Хочу выделить алгоритм сдвига в отдельную функцию и поместить её в SelCompleteLine.js, которую можно было бы вызывать как из ShiftRight.js, так и из CtrlDown.js.
Last edited by VladSh on Tue Mar 29, 2011 3:02 pm; edited 27 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Fri Aug 10, 2007 2:04 pm Post subject: Скрипты для комментирования/раскомментирования текстблоков |
|
|
CommentsAdd.js
| Code: | ///Commented text or block of text
// variants comments see included CommentsExt.js
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1653#1653
// Version: 3.8 (2013.05.10)
//
// Proposed to use a keyboard shortcut in Scripts-plugin box: Ctrl + /
if (! AkelPad.Include("CommentsExt.js")) WScript.Quit();
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
if (! AkelPad.Include("CoderFunctions.js")) WScript.Quit();
setComments(GetSyntaxAliasExtension());
oCh.run();
function process() {
var nCaretPos = 0;
oCh.Text = oCh.getSelTextEmpty();
if (oCh.Text.length) {
if (!cBlockOpen)
WScript.Quit(); //если блочные комменты не поддерживаются - выходим
var tmpText = oStr.rtrim(oCh.Text, pBreak);
var nDiff = oCh.Text.length - tmpText.length;
if (nDiff) { //если перевод строки в конце выделения захвачен
oCh.Text = tmpText;
oCh.rBegin[1] -= nDiff; //для возможного дальнейшего полного выделения строк (если их выбрано несколько) с помощью setCompleteLineText
}
var pBreakValue = "";
if (oCh.Text.indexOf(pBreak) !== -1) { //если выделенный текст в несколько строк
oCh.setCompleteLineText();
if (!nDiff) pBreakValue = pBreak; //специфика при отключенном NoSelEOL - переводы строк вокруг текста не вставляются
}
oCh.Text = cBlockOpen + pBreakValue + oCh.Text + pBreakValue + cBlockClose;
nCaretPos = oCh.rBegin[0] + (pBreakValue + cBlockOpen).length;
}
else {
if (!cSimple)
WScript.Quit(); //если простые комменты не поддерживаются - выходим
oCh.setCompleteLineText();
oCh.Text = cSimple + oCh.Text;
nCaretPos = oCh.rBegin[0] + cSimple.length;
}
oCh.setSelCaret(nCaretPos); //в этом скрипте восстанавливаем первоначальное положение каретки
} | Старое наименование скрипта JCommentAdd.js.
1. Назначить комбинацию клавиш Ctrl + /
2. Выделить блок текста программы и нажать вышеуказанную комбинацию.
1. To appoint a combination of keys Ctrl + /
2. To select the block of the text of the program and to press the above-stated combination.
CommentsDel.js
| Code: | ///Decommented text or block of text
// variants comments see included CommentsExt.js
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1653#1653
// Version: 3.8 (2013.05.10)
//
// Proposed to use a keyboard shortcut in Scripts-plugin box: Ctrl + \
if (! AkelPad.Include("CommentsExt.js")) WScript.Quit();
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
if (! AkelPad.Include("CoderFunctions.js")) WScript.Quit();
setComments(GetSyntaxAliasExtension());
oCh.run();
function process() {
var bSimple = false;
var nCaretPos = AkelPad.GetSelEnd();
var pSelText = "";
if (cSimple != null) {
//Проверка: строчный или блочный комментарий
oCh.setCompleteLineText();
if (oCh.Text.indexOf(cSimple) != -1) //работа со СТРОЧНЫМИ комментариями
{
pSelText = oCh.Text; //запоминаем для корректировки позиции курсора на количество убранных комментариев
var arrText = oCh.Text.split(pBreak);
for (var nLine = 0; nLine < arrText.length; nLine++)
arrText[nLine] = arrText[nLine].replace(cSimple, "");
oCh.Text = arrText.join(pBreak);
nCaretPos -= (pSelText.length - oCh.Text.length);
if (nCaretPos < oCh.rResult[0]) nCaretPos = oCh.rResult[0]; //когда каретка изначально стоит прямо на комментарии вводим коррективы..
bSimple = true;
}
}
if (!bSimple && cBlockOpen) { //работа с БЛОЧНЫМ комментарием
oCh.rResult = getRangebyBorders(nCaretPos, nCaretPos, cBlockOpen, cBlockClose, true);
if (oCh.rResult == null)
quitIsNotComment(); //если хоть какая-то часть коммента не найдена, значит неверно установлена каретка
oCh.Text = getTextbyRange(oCh.rResult);
oCh.Text = oCh.Text.substr(cBlockOpen.length, oCh.Text.length - cBlockOpen.length - cBlockClose.length - (oCh.Text.charAt(oCh.Text.length) == pBreak)); //берём строку без переднего и заднего комментов; последняя часть в скобках - захват перевода строки в многострочных комментариях
if (oCh.Text.indexOf(cBlockOpen) != -1 || (oCh.Text.indexOf(cBlockClose) != -1))
quitIsNotComment(); //если внутри текста найден противоположный коммент, считаем что неверно установлена каретка
pSelText = oCh.Text; //запоминаем для корректировки позиции курсора на количество съедаемых вначале переводов строк
//продолжение корректировки текста: гасим ненужные переводы строк
oCh.Text = oStr.ltrim(oCh.Text, pBreak);
nCaretPos -= (cBlockOpen.length + (pSelText.length - oCh.Text.length)); //вычисляем здесь, т.к. для сдвига каретки нужна только верхняя часть: размер открывающего коммента и возможный перевод строки
oCh.Text = oStr.rtrim(oCh.Text, pBreak);
}
oCh.setSelCaret(nCaretPos);
}
function quitIsNotComment() {
AkelPad.MessageBox(AkelPad.GetEditWnd(), "Курсор установлен не в строке, где есть комментарий, либо за пределами блока комментария.", WScript.ScriptName, 64 /*MB_INFORMATION*/);
WScript.Quit();
} | Старое наименование скрипта JCommentDel.js.
1. Назначить комбинацию клавиш Ctrl + \
2. Установить курсор внутрь закомментированного блока текста программы и нажать вышеуказанную комбинацию.
1. To appoint a combination of keys Ctrl + \
2. To set the cursor inside commented block of the text of the program and to press the above-stated combination.
используемый обоими скрипт CommentsExt.js
| Code: | ///Auxiliary script; needed to determine the type of commentary for the current file.
// must be placed in ...\Scripts\Include\
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1653#1653
// Version: 3.8 (2013.05.10)
var cBlockOpen;
var cBlockClose;
var cSimple;
var commentsSets = {
// (c) Infocatcher
//= extension: [
//= [blockCmmStart0, blockCmmStart1],
//= [blockCmmEnd0, blockCmmEnd1],
//= [lineCmm]
//= ]
// Or
//= otherExtension: "extension"
//= "extension" must be already defined!
// Use 'null' (without commas) for unavailable comments type.
// First string will be used for comments adding (blockCmmStart0 and blockCmmEnd0 in example).
c: ["/*", "*/", "//"],
cpp: "c",
h: "c",
js: "c",
jsm: "c",
java: "c",
php: "c",
dpr: ["{", "}", "//"],
pas: "dpr",
html: ["<!--", "-->", "//"], //добавил возможность коментить js-код внутри html
xhtml: "html",
shtml: "html",
htm: "html",
xml: "html",
xsl: "html",
xul: "html",
xbl: "html",
rdf: "html",
dtd: "html",
css: ["/*", "*/", null],
tpl: ["{*", "*}", "//"],
ini: [null, null, ";"],
asm: "ini",
ahk: "ini",
mnu: "ini", //AkelPad menu file
highlight: "ini",
coder: "ini",
spck: "ini",
bat: [null, null, "rem "],
vbs: [null, null, "'"],
lss: ["%REM", "%END REM", "'"],
manifest: [null, null, "#"],
properties: "manifest",
htaccess: "manifest",
py: [null, null, "#"],
pyw: "py"
};
function setComments(ext) {
if (ext == "")
ext = "c"; //by default
var cmmSet = commentsSets[ext];
if (typeof(cmmSet) == "string")
cmmSet = commentsSets[cmmSet];
if (cmmSet == undefined) {
AkelPad.MessageBox(AkelPad.GetEditWnd(), 'Для расширения "' + ext + '" комментарии не заданы!', WScript.ScriptName, 48 /*MB_EXCLAMATION*/);
WScript.Quit();
}
cBlockOpen = cmmSet[0];
cBlockClose = cmmSet[1];
cSimple = cmmSet[2];
} |
p.s.: Instructor, Fr0sT, Infocatcher, [Yustas.NeO], se7h, Lenchik thanks!
Last edited by VladSh on Fri May 10, 2013 9:27 am; edited 25 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Thu Sep 27, 2007 4:01 pm Post subject: Перевод строки после <br> в сплошном тексте |
|
|
HTMLlinefeed.js
| Code: | ///Insert line feed after <br />, replace <br> on <br /> (XHTML)
///Вставка переводов строк после <br>, замена <br> на <br /> (стандарт XHTML)
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1854#1854
// Version: 3.5 (2011.03.22)
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
function process()
{
oCh.Text = oCh.getSelTextAll();
var poz = oCh.Text.indexOf('<br');
if (poz != -1)
{
oCh.Text = oCh.Text.replace(/<br>/g, '<br />');
var br = new RegExp('<br />', "g");
oCh.Text = oCh.Text.replace(br, '<br />\n');
oCh.Text = oCh.Text.replace(/></g, '>\n<');
oCh.Text = oCh.Text.replace(/(\S)[ \t]*(<hr([ \t][^<>]*)?>)/, "$1\n$2");
oCh.Text = oCh.Text.replace(/(<hr([ \t][^<>]*)?>)[ \t]*(\S)/, "$1\n$3");
}
else
{
oCh.Text = oCh.Text.replace(/\r/g, '<br />\r')
}
} |
This script used selCompleteLine.js.
Last edited by VladSh on Thu Jul 21, 2011 11:00 am; edited 18 times in total |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4637
|
Posted: Tue Oct 16, 2007 11:06 pm Post subject: |
|
|
LinesWrap.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=1908#1908
// Version v1.3
//
//
//// Wrap lines in specified format.
//
// Arguments:
// -ParaIndent=" " -Paragraph indent (default is " ").
// -LineIndent=" " -Line indent (default is "").
// -MaxLength=40 -Maximum line length is 40 (default is 80).
// -KeepFirstLineIndent=false -Keep first line indent (default is true).
// -ShowInput=false -Show input dialog (default is true).
//
// Usage:
// Call("Scripts::Main", 1, "LinesWrap.js", `-ParaIndent="" -LineIndent=" " -MaxLength=40 -ShowInput=false`)
//Arguments
var pParaIndent=AkelPad.GetArgValue("ParaIndent", " ");
var pLineIndent=AkelPad.GetArgValue("LineIndent", "");
var nMaxLength=AkelPad.GetArgValue("MaxLength", 80);
var bKeepFirstLineIndent=AkelPad.GetArgValue("KeepFirstLineIndent", true);
var bShowInput=AkelPad.GetArgValue("ShowInput", true);
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var hWndStatus=0;
var hWndProgress=0;
var pFirstLineIndent="";
var pSelText;
var lpResultArray=[];
var lpMatchArray=[];
var lpLinesArray=[];
var pLineCut;
var pLineEnd;
var nLine;
var nLineMaxLength=0;
var bParagraph;
var nCharInLine;
var pContinueLineEnd;
var dwOptions;
if (bShowInput)
nMaxLength=AkelPad.InputBox(hMainWnd, WScript.ScriptName, "Maximum line length:", nMaxLength);
if (nMaxLength)
{
if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
AkelPad.SetSel(0, -1);
pSelText=AkelPad.GetSelText(2 /*\n*/);
if (bKeepFirstLineIndent)
{
if (pFirstLineIndent=pSelText.match(/^[ \t]+/))
pFirstLineIndent=pFirstLineIndent[0];
else
pFirstLineIndent="";
}
pParaIndent=pFirstLineIndent + pParaIndent;
pLineIndent=pFirstLineIndent + pLineIndent;
nMaxLength=parseInt(nMaxLength);
//Trim leading and trailing spaces
pSelText=pSelText.replace(/(^[ \t]+)|([ \t]+$)/gm, "");
//Unwrap lines
pSelText=pSelText.replace(/([^.?!:;\n\(\)\[\]\-\=])\n[ \t]*([^\n])/g, "$1 $2");
if (lpLinesArray=pSelText.split("\n"))
{
//Lock edit window and show progress bar
dwOptions=AkelPad.SendMessage(hWndEdit, 3227 /*AEM_GETOPTIONS*/, 0, 0);
if (!(dwOptions & 0x1 /*AECO_READONLY*/))
AkelPad.SendMessage(hWndEdit, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x100001 /*AECO_READONLY|AECO_LOCKSELECTION*/);
if (hWndStatus=oSys.Call("user32::GetDlgItem", hMainWnd, 10002 /*ID_STATUS*/))
{
if (hWndProgress=oSys.Call("user32::GetDlgItem", hWndStatus, 10004 /*ID_PROGRESS*/))
{
AkelPad.SendMessage(hWndProgress, 1030 /*PBM_SETRANGE32*/, 0, lpLinesArray.length);
AkelPad.SendMessage(hWndProgress, 1026 /*PBM_SETPOS*/, 0, 0);
oSys.Call("user32::ShowWindow", hWndProgress, 5 /*SW_SHOW*/);
}
}
pSelText="";
lpResultArray[0]=pParaIndent;
nLineMaxLength=nMaxLength - pParaIndent.length;
bParagraph=true;
for (nLine=0; nLine < lpLinesArray.length; ++nLine)
{
if (hWndProgress)
AkelPad.SendMessage(hWndProgress, 1026 /*PBM_SETPOS*/, nLine, 0);
pLineEnd=nLine < lpLinesArray.length - 1?"\n":"";
if (nLineMaxLength < 0)
{
AkelPad.MessageBox(hMainWnd, "Indents are more than line limit.", WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
break;
}
if (lpLinesArray[nLine].length > nLineMaxLength)
{
for (nCharInLine=0; nCharInLine < lpLinesArray[nLine].length;)
{
pLineCut=lpLinesArray[nLine].substr(nCharInLine, nLineMaxLength);
if (pLineCut.length == nLineMaxLength && (lpMatchArray=pLineCut.match(/[ \t]+/g)))
{
lpResultArray[nLine]+=(bParagraph?"":pLineIndent) + pLineCut.substr(0, lpMatchArray.lastIndex) + "\n";
nCharInLine+=lpMatchArray.lastIndex;
}
else
{
if (pLineCut.length != nLineMaxLength && nLine == lpLinesArray.length - 1)
pContinueLineEnd="";
else
pContinueLineEnd="\n";
lpResultArray[nLine]+=(bParagraph?"":pLineIndent) + pLineCut + pContinueLineEnd;
nCharInLine+=pLineCut.length;
}
nLineMaxLength=nMaxLength - pLineIndent.length;
bParagraph=false;
}
}
else
{
if (lpLinesArray[nLine])
{
lpResultArray[nLine]+=(bParagraph?"":pLineIndent) + lpLinesArray[nLine] + pLineEnd;
nLineMaxLength=nMaxLength - pLineIndent.length;
bParagraph=false;
}
else
{
lpResultArray[nLine]+=pLineEnd + pParaIndent;
nLineMaxLength=nMaxLength - pParaIndent.length;
bParagraph=true;
}
}
lpResultArray[nLine + 1]="";
lpLinesArray[nLine]="";
}
lpLinesArray=[];
pSelText=lpResultArray.join("");
lpResultArray=[];
if (pLineIndent || pParaIndent)
pSelText=pSelText.replace(/[ \t]+$/gm, "");
//Hide progress bar and unlock edit window
if (hWndProgress)
oSys.Call("user32::ShowWindow", hWndProgress, 0 /*SW_HIDE*/);
if (!(dwOptions & 0x1 /*AECO_READONLY*/))
AkelPad.SendMessage(hWndEdit, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x100001 /*AECO_READONLY|AECO_LOCKSELECTION*/);
if (nLineMaxLength >= 0)
AkelPad.ReplaceSel(pSelText, true);
}
}
|
LinesUnwrap.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=1908#1908
// Version v1.1
//
//
//// Lines unwrap.
var hMainWnd=AkelPad.GetMainWnd();
if (hMainWnd)
{
if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
AkelPad.SetSel(0, -1);
pSelText=AkelPad.GetSelText(2 /*\n*/);
//Trim leading and trailing spaces
pSelText=pSelText.replace(/[ \t]+$/gm, "");
//Unwrap lines
pSelText=pSelText.replace(/([^.?!:;\n])\n[ \t]*([^\n])/g, "$1 $2");
AkelPad.ReplaceSel(pSelText, true);
}
|
Last edited by Instructor on Fri Aug 12, 2011 7:15 pm; edited 10 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Tue Nov 13, 2007 1:47 pm Post subject: Вставка инетовских уголков перед каждой строкой |
|
|
Настраиваемая вставка указанного текста перед строками.
Бывает полезно, т.к. иногда на письма отвечаю в AkelPad'е (без аргументов вставляет "> ")
InsertBefore.js
| Code: | ///Insert any values before each line
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1976#1976
// Version: 3.8 (2011.10.18)
//
// Аргументы:
// text - вставляемый перед выделенным текст
// fillEmpty (0/1) - вставлять ли в пустые строки
// selAll (1/0) - выделять всё (обрабатывать ли все строки), если ничего не выделено
//
// Примеры вызовов:
//
// -"> ..." Call("Scripts::Main", 1, "InsertBefore.js") - вставит "уголки" для ответа на письмо в "интернет"-стиле (работает как старый скрипт InsertInetStyleQuote.js)
// -"Вставить символ списка" Call("Scripts::Main", 1, "InsertBefore.js", `-text="• " -selAll=0`)
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
function process()
{
var txtInserted = AkelPad.GetArgValue("text", "> ");
var bFillEmptyString = AkelPad.GetArgValue("fillEmpty", 0);
var bSelAllisNoSelected = AkelPad.GetArgValue("selAll", 1);
var nCaret = -1;
if (oCh.rBegin[0] == oCh.rBegin[1])
{
if (bSelAllisNoSelected)
oCh.Text = oCh.getSelTextAll(); //выделяем весь текст
else
{
//простая вставка в позицию курсора
oCh.rResult = oCh.rBegin;
oCh.Text = txtInserted;
nCaret = getOffset(AkelPad.GetEditWnd(), 19 /*AEGI_WRAPLINEEND*/, oCh.rResult[0]) + oCh.Text.length;
oCh.setSelCaret(nCaret);
return;
}
}
if (!oCh.Text)
oCh.setCompleteLineText(); //выделяем затронутые строки
if (oCh.Text.length)
{
var arrRow = oCh.Text.split(pBreak);
var r = 0; //2 цикла: выносим условие за цикл - ускоряем работу скрипта
if (bFillEmptyString)
{
for (; r < arrRow.length; r++)
arrRow[r] = txtInserted + arrRow[r];
}
else
{
for (; r < arrRow.length; r++)
if (oStr.trim(arrRow[r], " \t")) arrRow[r] = txtInserted + arrRow[r];
}
var tmpVar = arrRow.join(pBreak);
if (oCh.Text.length != tmpVar.length)
oCh.Text = tmpVar;
else
oCh.Text = tmpVar + txtInserted; //это одна строка (допустим, лидирующие табуляции), и к ним ничего в цикле не добавилось
//удаление повторных отступов после вставляемого текста
tmpVar = oStr.rtrim(oStr.repeat(txtInserted, 2), " ");
var oR = new RegExp(tmpVar, "g");
tmpVar = tmpVar.replace(/ /g, "");
tmpVar = tmpVar.replace(/\t/g, "");
oCh.Text = oCh.Text.replace(oR, tmpVar);
nCaret = oCh.Text.indexOf(pBreak);
}
else
oCh.Text = txtInserted;
//Устанавливаем каретку сразу же за первой строкой: сразу видно, где было начало вставки, и при необходимости удобно перевести каретку на другую строку (например с помощью скрипта CreateSubParagraph.js)
nCaret = oCh.rResult[0] + (nCaret != -1 ? nCaret : oCh.Text.length);
oCh.setSelCaret(nCaret);
} | Примечание: старое название скрипта InsertInetStyleQuote.js.
This script used selCompleteLine.js.
Last edited by VladSh on Tue Oct 18, 2011 9:30 am; edited 15 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Wed Nov 14, 2007 12:37 pm Post subject: Удаление файла без запроса о подтверждении |
|
|
DeleteFile.js
| Code: | ///Delete current opened file
///Удаляет текущий, открытый на экране, файл
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1988#1988
// Version: 2.2 (2011.07.21)
//
// -"Delete file" Call("Scripts::Main", 1, "DeleteFile.js") Icon("%a\AkelFiles\Plugs\ToolBar.dll", 25) - without warning
// -"Delete file" Call("Scripts::Main", 1, "DeleteFile.js", "1") Icon("%a\AkelFiles\Plugs\ToolBar.dll", 25) - with warning
var iCloseWithWarning = parseInt(AkelPad.GetArgLine() || 0);
var hWndMain = AkelPad.GetMainWnd()
var pFileFullName = AkelPad.GetEditFile(0);
if (iCloseWithWarning)
{
if (AkelPad.MessageBox(hWndMain, 'Delete this file ' + pFileFullName + '?', WScript.ScriptName, 4 /*MB_YESNO*/ + 48 /*MB_ICONEXCLAMATION*/) == 7 /*IDNO*/)
WScript.Quit();
}
AkelPad.SendMessage(hWndMain, 1229 /*AKD_SETMODIFY*/, 0, false);
AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
if (pFileFullName) //File already exist on fisical disk
{
fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(pFileFullName))
fso.DeleteFile(pFileFullName, true);
} |
Очень вредный скрипт
Updated: Оказалось, наоборот! Очень полезным оказался! Главное на Shift+Del не назначать 
Last edited by VladSh on Thu Jul 21, 2011 1:18 pm; edited 6 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Fri Nov 16, 2007 4:15 pm Post subject: Чтобы не хранить лишнее барахло |
|
|
HTMLDelUselessTags.js
| Code: | ///Remove unnecessary (heavier page) HTML tags
///Удаление ненужных (перегружающих страницу) тегов HTML
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1994#1994
// Version: 3.5 (2011.03.22)
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
function process()
{
oCh.Text = oCh.getSelTextAll();
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<script', '\\/script>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<link', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<img', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<span', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<\\/span', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<body ', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<noscript>', '<\\/noscript>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<form method="get"', '\\/form>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<iframe', 'iframe>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<form method="post"', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<\\/form', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<select', '\\/select>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<input', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a href="#top"', '\\/a>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a name', '\\/a>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a href="profile', '\\/a>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a href="privmsg', '\\/a>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a href="posting', '\\/a>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a class="maintitle', '\\/a>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a href="javascript', '>');
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<a href="viewtopic', '\\/a>');
oCh.Text = oCh.Text.replace(/\r{3,}/gm, '\r\r'); //гасим ненужные переводы строк
} |
HTMLDelAllTags.js
| Code: | ///Remove all HTML tags...
///Удаляет все тэги, превращая HTML-документ в простой текстовый файл
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1994#1994
// Version: 3.5 (2011.03.22)
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
function process()
{
oCh.Text = oCh.getSelTextAll();
oCh.Text = oStr.cleanbyBorders(oCh.Text, '<script', '\\/script>'); //корректно чистим скрипты, чтобы не оставались хвосты
oCh.Text = oCh.Text.replace(/<[^>]*>/g, ''); //чистим другие HTML-тэги
oCh.Text = oCh.Text.replace(/ /g, ' ');
oCh.Text = oCh.Text.replace(/"/g, '"');
oCh.Text = oCh.Text.replace(/&/g, '&');
oCh.Text = oCh.Text.replace(/</g, '<');
oCh.Text = oCh.Text.replace(/>/g, '>');
oCh.Text = oCh.Text.replace(/–/g, '-');
oCh.Text = oCh.Text.replace(/—/g, '—');
oCh.Text = oCh.Text.replace(/‘/g, '‘'); //левая одиночная кавычка
oCh.Text = oCh.Text.replace(/’/g, '’'); //правая одиночная кавычка
oCh.Text = oCh.Text.replace(/‚/g, '‚'); //нижняя одиночная кавычка
oCh.Text = oCh.Text.replace(/“/g, '“'); //левая двойная кавычка
oCh.Text = oCh.Text.replace(/”/g, '”'); //правая двойная кавычка
oCh.Text = oCh.Text.replace(/„/g, '„');
oStr.flags = "gm";
oCh.Text = oStr.trim(oCh.Text, " \t"); //чистим строки от кучи пустых пробелов и табуляций
oCh.Text = oCh.Text.replace(/\r{3,}/gm, '\r\r'); //гасим ненужные переводы строк
} |
This scripts used selCompleteLine.js.
Last edited by VladSh on Wed Jan 11, 2012 12:13 pm; edited 18 times in total |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2507 Location: Киев, Русь
|
Posted: Fri Dec 07, 2007 3:33 pm Post subject: Убираем переводы строк в тексте |
|
|
Бывает полезно, когда пришёл текст по инету, разрезанный переводами строк:
DelLineFeed.js
| Code: | ///Delete lines feed
///Убирает переводы строк
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2023#2023
// Version: 3.7 (2011.07.21)
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
function process()
{
oCh.Text = oCh.getSelTextAll();
if (oCh.Text)
{
oStr.flags = "gm"; //выставляем флаг обработки всех строк, а не только первой
oCh.Text = oStr.rtrim(oCh.Text, " \t");
oCh.Text = oCh.Text.replace(/-\r/g, ""); //удаляем знак переноса (спорная вещь, т.к. это может быть слово, состоящее из 2-х слов)
oCh.Text = oCh.Text.replace(/\r/g, " "); //склеиваем, оставшиеся не соединёнными, строки через пробел
oCh.Text = oCh.Text.replace(/ /g, " "); //убираем повторяющиеся пробелы
oCh.setSelCaret(oCh.rBegin[0] + oCh.Text.length); //ставим каретку - в конец текста
}
} |
Благодарности: Dashout за точную постановку задачи, в результате которой скрипт был усовершенствован до настоящего состояния.
Альтернативная реализация скриптов (поддерживает работу с выделением; установку курсора):
DelEmptyLines.js
| Code: | ///Delete empty lines
///Удаляет пустые строки
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2023#2023
// Version: 3.6 (2011.03.22)
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
function process()
{
oCh.Text = oCh.getSelTextAll().replace(/\r{2,}/g, pBreak); //убираем 2 и более переводов строк внутри
oCh.Text = oStr.trim(oCh.Text, pBreak); //убираем переводы строк по краям
} |
DelLeadTrailSpaces.js
| Code: | ///Delete leading and trailing spaces selected or all text
///Убирает пустые символы по краям текста
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5577#5577
// Version: 3.5 (2011.03.22)
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();
function process()
{
oCh.Text = oCh.getSelTextAll();
oCh.Text = oCh.Text.replace(/\ {2,}/g, ' '); //Убираем повторяющиеся пробелы
oCh.Text = oCh.Text.replace(/\t{2,}/g, '\t'); //Убираем повторяющиеся табуляции
} |
This scripts used selCompleteLine.js.
Last edited by VladSh on Tue Jul 26, 2011 4:14 pm; edited 16 times in total |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4637
|
Posted: Sat Jan 26, 2008 2:44 pm Post subject: |
|
|
ExecConsole.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=2150#2150
// Version v1.0
//
//
//// Exec console program without DOS-box and capture output.
var WshShell=new ActiveXObject("WScript.shell");
var fso=new ActiveXObject("Scripting.FileSystemObject");
//Options
var pDelimiter="\n========================================\n";
var bEraseEdit=false;
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var pCommand;
var pTmpFile;
var pText;
var nSelStart;
if (hWndEdit)
{
if (WScript.Arguments.length)
pCommand=WScript.Arguments(0);
else
pCommand=AkelPad.InputBox(hMainWnd, WScript.ScriptName, "Command:", "ipconfig");
if (pCommand)
{
if (pTmpFile=CreateTempFile())
{
if (pTmpFile.search(/ /) != -1)
pTmpFile="\"" + pTmpFile + "\"";
WshShell.Run("%COMSPEC% /c " + pCommand + ">" + pTmpFile, 0, true);
pText=AkelPad.ReadFile(pTmpFile);
pText=pDelimiter + pText;
SetRedraw(hWndEdit, false);
if (bEraseEdit)
AkelPad.SetSel(0, -1);
else
AkelPad.SetSel(0x7FFFFFFF, 0x7FFFFFFF);
nSelStart=AkelPad.GetSelStart();
AkelPad.ReplaceSel(pText);
AkelPad.SetSel(nSelStart + 1, nSelStart + 1);
SetRedraw(hWndEdit, true);
fso.DeleteFile(pTmpFile);
}
}
}
//Functions
function CreateTempFile()
{
var oTmpFolder;
var oTmpFile;
var pTmpName;
if (oTmpFolder=fso.GetSpecialFolder(2 /*TemporaryFolder*/))
{
pTmpName=fso.GetTempName();
if (oTmpFile=oTmpFolder.CreateTextFile(pTmpName))
oTmpFile.Close();
return (oTmpFolder.Path + "\\" + pTmpName);
}
return "";
}
function SetRedraw(hWnd, bRedraw)
{
AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
} |
Last edited by Instructor on Fri Mar 25, 2011 6:09 pm; edited 8 times in total |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4637
|
Posted: Thu Feb 07, 2008 5:14 pm Post subject: |
|
|
ExecTool.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=2168#2168
// Version v1.0
//
//
//// Process current file in external tool.
var WshShell=new ActiveXObject("WScript.shell");
var fso=new ActiveXObject("Scripting.FileSystemObject");
var pToolPath="c:\\Incoming\\tidy.exe";
var pToolFlags="-utf16le";
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var pTmpFile1;
var pTmpFile2;
var pText;
if (hWndEdit)
{
if (pTmpFile1=CreateTempFile())
{
if (pTmpFile2=CreateTempFile())
{
AkelPad.SaveFile(hWndEdit, pTmpFile1, 1200, true, false);
if (pToolPath.search(/ /) != -1)
pToolPath="\"" + pToolPath + "\"";
if (pTmpFile1.search(/ /) != -1)
pTmpFile1="\"" + pTmpFile1 + "\"";
WshShell.Run("%COMSPEC% /c " + pToolPath + " " + pToolFlags + " " + pTmpFile1 + ">" + pTmpFile2, 0, true);
SetRedraw(hWndEdit, false);
AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true);
pText=AkelPad.ReadFile(pTmpFile2);
AkelPad.SetSel(0, -1);
AkelPad.ReplaceSel(pText);
AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
SetRedraw(hWndEdit, true);
fso.DeleteFile(pTmpFile2);
}
fso.DeleteFile(pTmpFile1);
}
}
//Functions
function CreateTempFile()
{
var oTmpFolder;
var oTmpFile;
var pTmpName;
if (oTmpFolder=fso.GetSpecialFolder(2 /*TemporaryFolder*/))
{
pTmpName=fso.GetTempName();
if (oTmpFile=oTmpFolder.CreateTextFile(pTmpName))
oTmpFile.Close();
return (oTmpFolder.Path + "\\" + pTmpName);
}
return "";
}
function SetRedraw(hWnd, bRedraw)
{
AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
} |
Last edited by Instructor on Fri Mar 25, 2011 6:08 pm; edited 3 times in total |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4637
|
Posted: Tue Sep 23, 2008 1:12 pm Post subject: |
|
|
Delete trailing whitespaces in all MDI documents.
DelTrailSpacesAll.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=3370#3370
// Version v1.2
//
//
//// Delete trailing whitespaces in all MDI documents.
var hMainWnd=AkelPad.GetMainWnd();
var lpFrameInit;
var lpFrameCur;
if (hMainWnd)
{
//Initial MDI frame
lpFrameInit=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
lpFrameCur=lpFrameInit;
for (;;)
{
AkelPad.Command(4174 /*IDM_EDIT_DELETE_TRAILING_WHITESPACES*/);
//Next MDI frame
lpFrameCur=AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
if (!lpFrameCur || lpFrameCur == lpFrameInit)
break;
}
}
|
Close all unnamed or unexisted MDI documents.
CloseUnnamedAll.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=3370#3370
// Version v1.3
//
//
//// Close all unnamed or unexisted MDI documents.
//
// Arguments:
// -CloseUnnamed=false -Close document without name (default is true).
// -CloseUnexisted=true -Close document if file is deleted (default is false).
//
// Example:
// -"Close only unexisted" Call("Scripts::Main", 1, "CloseUnnamedAll.js", `-CloseUnnamed=false -CloseUnexisted=true`)
//Arguments
var bCloseUnnamed=AkelPad.GetArgValue("CloseUnnamed", true);
var bCloseUnexisted=AkelPad.GetArgValue("CloseUnexisted", false);
//Variables
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var lpFrameInit=0;
var lpFrameCur=0;
var bFrameClose=false;
var pFile;
var dwState=0;
if (AkelPad.IsMDI())
{
//Turn off watch file
if (hMenuMain=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 21 /*MI_MENUMAIN*/, 0))
{
dwState=oSys.Call("user32::GetMenuState", hMenuMain, 4253 /*IDM_OPTIONS_WATCHFILE*/, 0 /*MF_BYCOMMAND*/);
if (dwState & 0x8 /*MF_CHECKED*/)
AkelPad.Command(4253 /*IDM_OPTIONS_WATCHFILE*/);
}
for (;;)
{
if (!lpFrameCur) lpFrameCur=AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
if (!lpFrameInit) lpFrameInit=lpFrameCur;
//Is frame must be closed
pFile=AkelPad.GetEditFile(0);
if ((bCloseUnnamed && !pFile) ||
(bCloseUnexisted && oSys.Call("kernel32::GetFileAttributes" + _TCHAR, pFile) == -1))
{
bFrameClose=true;
}
if (bFrameClose)
{
//Close MDI frame
if (AkelPad.GetEditModified(0))
AkelPad.SendMessage(hMainWnd, 1229 /*AKD_SETMODIFY*/, 0, false);
if (!AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/))
break;
if (lpFrameInit == lpFrameCur)
lpFrameInit=0;
lpFrameCur=0;
bFrameClose=false;
}
else
{
//Next MDI frame
lpFrameCur=AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
if (!lpFrameCur || lpFrameCur == lpFrameInit)
break;
}
}
//Turn on watch file
if (dwState & 0x8 /*MF_CHECKED*/)
AkelPad.Command(4253 /*IDM_OPTIONS_WATCHFILE*/);
}
|
Last edited by Instructor on Wed Nov 16, 2011 4:10 pm; edited 14 times in total |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4637
|
Posted: Thu Dec 11, 2008 12:45 pm Post subject: |
|
|
SelNextWord.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=3751#3751
// Version v1.0
//
//
//// Select next word
var hMainWnd=AkelPad.GetMainWnd();
if (hMainWnd)
{
if (AkelPad.IsAkelEdit())
{
AkelPad.SendMessage(AkelPad.GetEditWnd(), 3044 /*AEM_KEYDOWN*/, 0x27 /*VK_RIGHT*/, 0x02|0x04 /*AEMOD_SHIFT|AEMOD_CONTROL*/);
}
else
{
var WshShell=new ActiveXObject("WScript.Shell");
//Wait for release all virtual keys
AkelPad.SendMessage(hMainWnd, 1312 /*AKD_WAITKEYBOARD*/, 0, 0);
WshShell.SendKeys("^+{RIGHT}");
}
} |
Last edited by Instructor on Fri Mar 25, 2011 4:39 pm; edited 5 times in total |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4637
|
Posted: Wed Jan 28, 2009 5:54 pm Post subject: |
|
|
UndoAll.js
| Code: | // http://akelpad.sourceforge.net/forum/viewtopic.php?p=4050#4050
// Version v1.0
//
//
//// Undo all changes
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
if (hMainWnd && hWndEdit)
{
if (AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0))
{
SetRedraw(hWndEdit, false);
AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true);
while (AkelPad.SendMessage(hWndEdit, 3075 /*AEM_CANUNDO*/, 0, 0))
{
if (!AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0))
break;
AkelPad.SendMessage(hWndEdit, 3077 /*AEM_UNDO*/, 0, 0);
}
AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
SetRedraw(hWndEdit, true);
}
}
function SetRedraw(hWnd, bRedraw)
{
AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
} |
Last edited by Instructor on Fri Mar 25, 2011 4:39 pm; edited 5 times in total |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|