Scripts collection

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

FileOpenDialog

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1585#p1585
// Description(1033): Opening a file with a choice of extensions from the list
// Description(1049): Открытие файла с возможностью выбора расширения из списка файла параметров
// Version: 4.0 (2015.04.29)
// Author: VladSh
// 
// Usage:
// 	-"Открыть..." Call("Scripts::Main", 1, "OpenEx.js")                                - открывает файл из последнего места открытия без установки фильтра по расширению  (обычный диалог открытия)
// 	-"Открыть из папки..." Call("Scripts::Main", 1, "OpenEx.js", `-dir="%d\"`)         - открывает из папки файла без установки фильтра по расширению
// 	-"Открыть по файлу..." Call("Scripts::Main", 1, "OpenEx.js", `-file="%f"`)         - открывает из папки файла; расширение для фильтра определяется по файлу
// 	-"Открыть [ini]..." Call("Scripts::Main", 1, "OpenEx.js", `-file="%f" -ext="ini"`) - открывает из папки файла с фильтром по указанному расширению

if (!AkelPad.Include("CommonFunctions.js")) WScript.Quit();

var pInitialFile = AkelPad.GetArgValue("file", "");
var pInitialDir = AkelPad.GetArgValue("dir", "") || getParentClosed(pInitialFile);
var pInitialExt = AkelPad.GetArgValue("ext", "") || getFileExt(pInitialFile);
pInitialFile = "";

pInitialFile = fileDialogDefault(true, pInitialDir, pInitialFile, pInitialExt);
if (pInitialFile) {
	//Проверка на существование файла с введенным в диалоге именем
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	if (fso.FileExists(pInitialFile) == true)
		AkelPad.OpenFile(pInitialFile);
	else
		AkelPad.MessageBox(AkelPad.GetMainWnd(), "File '" + pInitialFile + "' not found.", "AkelPad", 64);
}
N.B.: Для работы данного кода обязателен CommonFunctions.js.

Моделирование своей кнопки тулбара "Открыть...":

Code: Select all

-"Открыть..." Call("Scripts::Main", 1, "OpenEx.js", `-dir="%d\"`) Menu("OPEN") Icon(2)
Вызываемое подменю:

Code: Select all

"OPEN"
{
  RECENTFILES
  SEPARATOR
 "Удалить несуществующие" Call("RecentFiles::DeleteNonExistent")
}
Last edited by VladSh on Fri Jun 19, 2015 6:46 pm, edited 25 times in total.

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

общий функционал для работы с выделением и текстом

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1607#p1607
// Description(1033): Works with text. Script implemented as the library for using in other scripts.
// Description(1049): Библиотека функций для работы с текстом
// Version: 4.11 (2015.01.16)
// Author: VladSh

//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 nSelect = (this.rCaret == null) ? -1 : 0;
			AkelPad.ReplaceSel(this.Text, nSelect);
			if (!nSelect)
				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#p11382
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)
	{
		return replacebyBorders(pText, pBStart, pBEnd, "");
	},
	
	replacebyBorders: function(pText, pBStart, pBEnd, pNewText)
	{
		//При создании объекта RegExp в паттерне все слэши д.б. экранированы! Передавать тоже экранированные!
		return pText.replace(new RegExp(pBStart + "*?[\\s\\S]*?" + pBEnd, this.flags), pNewText);
	},
	
	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;
}

// ------------------------------------------------------

// Functions for working with each row of selected text.
// Функции для организации обработки каждой строки текста
// 	(бывший ProcessRowText.js)
function processRowText(pSelText, pBreakLine, pJoinLine) {
	var arrOutput = [];											// output array of strings
	
	if (pSelText.length > 0) {
		var arrInput = pSelText.split(pBreakLine);		// input array of strings; универсальный "символ разрыва" для внутренних и внешних файлов: /\r\n|\n|\r/, но в виде "\r\n|\n|\r" в split это не работает
		var vResult;											// the result of processing row
		
		var index = -1;
		for (index = 0; index < arrInput.length; index++) {
			vResult = processString(arrInput[index]); // process each string
			addToResult(arrOutput, vResult);
		}
	}
	
	if (!pJoinLine)
		pJoinLine = pBreakLine;
	pSelText = arrOutput.join(pJoinLine);
	return pSelText;
}

// User-defined function; copy into your script, decomment and modify it

//function processString(s) {
//	var pResult;
//	//code modify the string s...
//	return pResult;
//}

//function addToResult(arrOutput, vResult) {
//	//condition and code added value in the resulting array
//	arrOutput[arrOutput.length] = vResult;		//by default return all values (with empty)
//}

Code: Select all

//Возвращает основную информацию о строке (отображаемой редактором) по переданной позиции в окне редактирования; поддерживаются значения -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 Fri Jan 16, 2015 2:31 pm, edited 47 times in total.

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

Формирование, перенос и раскрытие символов блока {}

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1608#p1608
// Description(1033): Formation, carrying over and disclosing of symbols of the block {}
// Description(1049): Проставка символов скрипт-блока {}
// Version: 4.0 (2020.01.06)
// Author: VladSh
//
// Arguments:
// 	-style:
// 		[0] - allman (old c-style)
// 		1 - java
// 
// A preferred combination of keys: Ctrl+Down

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();
	var nStyle = AkelPad.GetArgValue("style", 0);
	var leftPartEndStyle = (nStyle) ? " " : pBreak;
	
	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(pTab + sbOpen);
		if (pozOpen > 0) {                                                                       //Действия, выполняемые, если в текущей строке есть открывающая скобка
			existentLeft = oStr.rtrim(oCh.Text.slice(0, pozOpen), smbNull);                       //Остающиеся символы выделения перед открывающей скобкой
			if (existentLeft) {
				existentLeft += leftPartEndStyle;
			}
			
			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) {
					existentLeft = existentShift + existentLeft + leftPartEndStyle;
			}
			
			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.
Old name of this script - CtrlDown.js.


| - simbol of cursor

Var 1 - In line there is no symbol of the beginning of the block (в строке нет символа начала блока):
1.1.
not left symbols

Code: Select all

|
or

Code: Select all

<condition>|
Result:

Code: Select all

<condition>
{
   |
}
1.2.

Code: Select all

condition |expression
Result:

Code: Select all

condition 
{
   expression|
}
1.3:

Code: Select all

condition
|
Result:

Code: Select all

condition
{
   |
}
1.4:

Code: Select all

|condition
Result:

Code: Select all

{
   |condition
}
Var 2 - In line there is a symbols of the block (в строке есть символы блока)
2.1.

Code: Select all

condition {|
or

Code: Select all

condition| {
or

Code: Select all

condition {|}
Result:

Code: Select all

condition 
{
   |
}
2.2.

Code: Select all

condition| {expression
or

Code: Select all

condition {|expression}
Result:

Code: Select all

condition 
{
   |expression
}
NB: The condition should not contain block symbols { }. (условие не должно содержать символов блока)

Var 3 - Some lines are selected (выделено несколько строк):

Code: Select all

code line 1;
code line 2 (selected);
code line 3 (selected);
code line 4;
Result:

Code: Select all

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 Mon Jan 06, 2020 12:19 pm, edited 29 times in total.

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

Скрипты для комментирования/раскомментирования текстблоков

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1653#p1653
// Description(1033): Commented text or block of text
// 	variants comments see included CommentsExt.js
// Description(1049): Комментирование строки или текстового блока
// Version: 3.11 (2015.04.22)
// Author: VladSh
// 
// Arguments:
// 	-forceSingle = [true]/false
// 
// 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 && !cSimple) {
		//если простые комменты не поддерживаются - пытаемся выделить строку целиком и заключить в блочные
		oCh.setCompleteLineText();
	}
	if (oCh.Text.length) {
		nCaretPos = setMultylineComment();
	}
	if (!nCaretPos) {
		nCaretPos = setSinglelineComment();
	}
	
	oCh.setSelCaret(nCaretPos);		//в этом скрипте восстанавливаем первоначальное положение каретки
}

function setMultylineComment() {
	if (cBlockOpen && !(AkelPad.GetArgValue("forceSingle", true) && cSimple)) {
		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;
		return oCh.rBegin[0] + (pBreakValue + cBlockOpen).length;
	}
}

function setSinglelineComment() {
	if (!cSimple) WScript.Quit();
	
	oCh.setCompleteLineText();
	
	var lines = oCh.Text.split(pBreak);
	for (var i = 0; i < lines.length; i++) {
		lines[i] = cSimple + lines[i];
	}
	oCh.Text = lines.join(pBreak);
	return oCh.rBegin[0] + cSimple.length;
}
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.


Code: Select all

// Description(1033): Decommented text or block of text
// Description(1049): Раскомментирование строки или текстового блока
// 	variants comments see included CommentsExt.js
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1653#p1653
// Version: 3.9 (2014.12.06)
// Author: VladSh
// 
// Usage:
// 	1. By Hotkeys-plugin: proposed to use a keyboard shortcut in Scripts-plugin box: Ctrl + \
// 	2. With arguments:
// 		• smbStart - start symbols for declose
// 		• smbEnd - end symbols for declose
// 		Example: -"Убрать кавычки «_|_»" Call("Scripts::Main", 1, "CommentsDel.js", `-smbStart="«" -smbEnd="»"`)

if (! AkelPad.Include("CommentsExt.js")) WScript.Quit();
if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();

if (WScript.Arguments.length) {
	cBlockOpen = AkelPad.GetArgValue("smbStart", "");
	cBlockClose = AkelPad.GetArgValue("smbEnd", "");
}
else {
	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();
}
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.


Используемый обоими скрипт

Code: Select all

///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#p1653
// Version: 3.13 (2014.12.19)

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],
	sql: ["/*", "*/", "--"],
	tpl: ["{*", "*}", "//"],
	ini: [null, null, ";"],
	asm: "ini",
	ahk: "ini",
	mnu: "ini",		//AkelPad menu file
	highlight: "ini",
	coder: "ini",
	spck: "ini",
	au3: ["#cs", "#ce", ";"],
	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 Jun 19, 2015 8:42 pm, edited 38 times in total.

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

Скрипты для работы с HTML

Post by VladSh »

Code: Select all

// Description(1033): Insert line feed after <br />, replace <br> on <br /> (XHTML)
// Description(1049): Вставка переводов строк после <br>, замена <br> на <br /> (стандарт XHTML)
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1854#p1854
// Version: 3.5 (2011.03.22)
// Author: VladSh

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')
	}
}


Code: Select all

// Description(1033): Remove unnecessary (heavier page) HTML tags
// Description(1049): Удаление ненужных (перегружающих страницу) тегов HTML
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1854#p1854
// Version: 3.5 (2011.03.22)
// Author: VladSh

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');	//гасим ненужные переводы строк
}


Code: Select all

// Description(1033): Remove all HTML tags...
// Description(1049): Удаляет все тэги, превращая HTML-документ в простой текстовый файл
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1854#p1854
// Version: 3.5 (2011.03.22)
// Author: VladSh

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 script used selCompleteLine.js.
Last edited by VladSh on Wed Jan 14, 2015 9:42 pm, edited 20 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Wrap lines in specified format.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1908#p1908
// Version: 1.7
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Wrap lines in specified format.
// Description(1049): Перенести строки по заданному формату.
//
// Arguments:
// -ParaIndent="    "          -Paragraph indent (default is "    ").
// -LineIndent="  "            -Line indent (default is "").
// -MaxLength=40               -Maximum line length is 40 (default is 80). Special values:
//                               -1 Wrap limit value.
//                               -2 Marker value.
// -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);

//Variables
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 (nMaxLength == -1)
  nMaxLength=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 63 /*FI_WRAPLIMIT*/, 0);
else if (nMaxLength == -2)
  nMaxLength=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 64 /*FI_MARKER*/, 0);
if (bShowInput)
  nMaxLength=AkelPad.InputBox(hMainWnd, WScript.ScriptName, GetLangString(0), nMaxLength);

if (hWndEdit && 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);

  if (nMaxLength - pParaIndent.length <= 0 ||
      nMaxLength - pLineIndent.length <= 0)
  {
    AkelPad.MessageBox(hMainWnd, GetLangString(1), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
    WScript.Quit();
  }

  //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*/, 0x1 /*AECO_READONLY*/);
      AkelPad.SendMessage(hWndEdit, 3234 /*AEM_EXSETOPTIONS*/, 2 /*AECOOP_OR*/, 0x2 /*AECOE_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 (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*/, 0x1 /*AECO_READONLY*/);
      AkelPad.SendMessage(hWndEdit, 3234 /*AEM_EXSETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x2 /*AECOE_LOCKSELECTION*/);
    }
    if (nLineMaxLength >= 0)
      AkelPad.ReplaceSel(pSelText, -2);
  }
}

function GetLangString(nStringID)
{
  var nLangID=AkelPad.GetLangId(1 /*LANGID_PRIMARY*/);

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439\u0020\u0440\u0430\u0437\u043C\u0435\u0440\u0020\u0441\u0442\u0440\u043E\u043A\u0438:";
    if (nStringID == 1)
      return "\u041E\u0442\u0441\u0442\u0443\u043F\u0020\u0431\u043E\u043B\u044C\u0448\u0435\u0020\u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0439\u0020\u0434\u043B\u0438\u043D\u044B\u0020\u0441\u0442\u0440\u043E\u043A\u0438\u002E";
  }
  else
  {
    if (nStringID == 0)
      return "Maximum line length:";
    if (nStringID == 1)
      return "Indents are more than line limit.";
  }
  return "";
}


Lines unwrap.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1908#p1908
// Version: 1.2
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Lines unwrap.
// Description(1049): Убрать перенос строк.
//
// Arguments:
// -Delim=".?!"     -Line delimiters (default is ".?!:;").
//
// Usage:
// Call("Scripts::Main", 1, "LinesUnwrap.js", `-Delim=".?!"`)

//Arguments
var pDelim=AkelPad.GetArgValue("Delim", ".?!:;");

//Variables
var hWndEdit=AkelPad.GetEditWnd();
var oPattern;

if (hWndEdit)
{
  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
  oPattern=new RegExp("([^" + pDelim + "\n])\n[ \t]*([^\n])", "g");
  pSelText=pSelText.replace(oPattern, "$1 $2");

  AkelPad.ReplaceSel(pSelText, -2);
}
Last edited by Instructor on Sun Dec 13, 2015 11:33 am, edited 14 times in total.

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

Вставка инетовских уголков перед каждой строкой

Post by VladSh »

Настраиваемая вставка указанного текста перед строками.
Бывает полезно, т.к. иногда на письма отвечаю в AkelPad'е (без аргументов вставляет "> ") :mrgreen:

Code: Select all

// Description(1033): Insert any values before each line
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1976#p1976
// Version: 3.8 (2011.10.18)
// Author: VladSh
// 
// Arguments:
// 	text							- вставляемый перед выделенным текст
// 	fillEmpty	(0/1)	- вставлять ли в пустые строки
// 	selAll			(1/0)	- выделять всё (обрабатывать ли все строки), если ничего не выделено
// 
// Usage:
// 	-"> ..." Call("Scripts::Main", 1, "InsertBefore.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 Wed Jan 14, 2015 8:52 pm, edited 17 times in total.

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

Удаление файла без запроса о подтверждении

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1988#p1988
// Description(1033): Delete file
// Description(1049): Удаляет файл (текущий открытый на экране либо из списка свежих либо др.)
///	если в это время открыта панель Explorer-плагина, то дополнительно производится обновление списка файлов
// Version: 2.6 (2015.10.17)
// Author: VladSh
// 
// Arguments:
// 	-file - deleted file
// 	-warn ([false]/true) - show warning to confirm deletion
// 	-updRecent ([false]/true) - update recent list
// 
// Usage:
// 	-"Delete file" Call("Scripts::Main", 1, "DeleteFile.js", `-file="%f" -warn=true -updRecent=true`) Icon("%a\AkelFiles\Plugs\ToolBar.dll", 25)		- delete file from recent list with warning
// 	-"Delete file" Call("Scripts::Main", 1, "DeleteFile.js") Icon("%a\AkelFiles\Plugs\ToolBar.dll", 25)		- delete current file without warning

var hWndMain = AkelPad.GetMainWnd()

var pFileCurrent = AkelPad.GetEditFile(0);
var pFileFullName = AkelPad.GetArgValue("file", pFileCurrent);

var fso = new ActiveXObject("Scripting.FileSystemObject");
var bFileExist = fso.FileExists(pFileFullName)

if (bFileExist && AkelPad.GetArgValue("warn", false)) {
	if (AkelPad.MessageBox(hWndMain, 'Delete this file ' + pFileFullName + '?', WScript.ScriptName, 4 /*MB_YESNO*/ + 48 /*MB_ICONEXCLAMATION*/) == 7 /*IDNO*/)
		WScript.Quit();
}

if (pFileFullName == pFileCurrent) {
	AkelPad.SendMessage(hWndMain, 1229 /*AKD_SETMODIFY*/, 0, false);
	
	AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
	AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
}

if (pFileFullName) {
	if (bFileExist) {
		fso.DeleteFile(pFileFullName, true);
		var pExplorer = "Explorer::Main";
		if (AkelPad.IsPluginRunning(pExplorer)) {
			AkelPad.Call(pExplorer, 2);
		}
	}
	if (AkelPad.GetArgValue("updRecent", false)) {
		deleteRecentRecord(pFileFullName);
	}
}

/* Instructor's code (from DeleteRecentFile.js) */
function deleteRecentRecord(pFile) {
	var nIndex;
	if ((nIndex = AkelPad.SendMessage(hWndMain, 1238 /*AKD_RECENTFILES*/, 7 /*RF_FINDINDEX*/, AkelPad.MemStrPtr(pFile))) >= 0) {
		if (AkelPad.SendMessage(hWndMain, 1238 /*AKD_RECENTFILES*/, 8 /*RF_DELETEINDEX*/, nIndex))
			AkelPad.SendMessage(hWndMain, 1238 /*AKD_RECENTFILES*/, 4 /*RF_SAVE*/, 0);
	}
}



Очень вредный скрипт :)

Updated: :!: Наоборот, очень полезным оказался! Главное на Shift+Del не назначать :wink:
Last edited by VladSh on Sat Oct 17, 2015 10:27 am, edited 13 times in total.

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

скрипты для работы с AnyMemo

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1994#p1994
// Description(1033): File conversion "TXT with TAB" -> "Mnemosyne XML1"
// 	To workaround the bug refusal to import a text file into AnyMemo.
// 	Works correctly for TXT-files with quotes, as is in *.csv.
// Description(1049): Конвертирование файла "TXT с TAB-разделителем" в "Mnemosyne XML1"
// 	Для обхода бага отказа импорта текстового файла в AnyMemo.
// 	Корректно работает для TXT-файлов с кавычками, как в *.csv.
// Version: 1.0 (2014.11.28)
// Author: VladSh 

if (! AkelPad.Include("ProcessRowText.js")) WScript.Quit();
if (! AkelPad.Include("CommonFunctions.js")) WScript.Quit();
var ext = "xml";
var fileNameFull = AkelPad.GetEditFile(0);
var fileName = getFileNameOnly(fileNameFull) + "." + ext;
fileNameFull = getParentClosed(fileNameFull) + fileName;

var pContent = AkelPad.GetTextRange(0, -1);
var pBreak = '\r';
//вызываем основную функцию обработчика всего файла
var pContent = processRowText(pContent, '\t""' + pBreak, pBreak);

pContent = '<?xml version="1.0" encoding="UTF-8"?>' + pBreak + '<mnemosyne core_version="1" time_of_start="946728000" >' + pBreak + '<category active="1">' + pBreak + '<name>' + fileName + '</name>' + pBreak + '</category>' + pBreak + pContent + pBreak + '</mnemosyne>'

fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(fileNameFull) == true) {
	//файл существует - открываем
	AkelPad.OpenFile(fileNameFull);
	AkelPad.SetSel(0, -1);
}
else {
	//файл не существует - создаём
	createFile(getFileFormat(0), ext);
}
AkelPad.ReplaceSel(pContent, -2);
AkelPad.SaveFile(0, fileNameFull);

//функция обработки отдельной строки
function processString(row) {
	var pResult = "";
	row = row.replace(/"/g, '');
	var arr = row.split('\t');
	if (arr != null) {
		if (!arr[2])
			arr[2] = fileName;
		pResult = "<cat>" + arr[2] + "</cat>" + pBreak;
		pResult = pResult + "<Q>" + arr[0] + "</Q>" + pBreak;
		pResult = pResult + "<A>" + arr[1] + "</A>" + pBreak;
		pResult = '<item id="' + (index + 1) + '">' + pBreak + pResult + "</item>";
	}
	return pResult;
}

function addToResult(arrOutput, vResult) {
	//condition and code added value in the resulting array
	arrOutput[arrOutput.length] = vResult;		//by default return all values (with empty)
}


Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1994#p1994
// Description(1033): Mnemosyne_XML1 file correction, for easy its processing:
// 	- remove all attributes from <item ...>
// 	- conversion of an apostrophe in a readable form
// Description(1049): Корректировка Mnemosyne_XML1-файла, полученного из AnyMemo, для удобства обработки:
//		- удаление всех атрибутов из <item ...>
//		- преобразование апострофа в читаемый вид
// Version: 1.0 (2014.11.28)
// Author: VladSh 

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process() {
   oCh.Text = oCh.getTextAll();
   oCh.Text = oStr.replacebyBorders(oCh.Text, '<item', '>', '<item>');
   oCh.Text = oCh.Text.replace(/&apos;/g, "'");
}


Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1994#p1994
// Description(1033): Conversion of an apostrophe in its symbol
// 	(for Mnemosyne_XML1-file received from AnyMemo)
// Description(1049): Преобразование кода апострофа в его символ
// 	(для Mnemosyne_XML1-файла, полученного из AnyMemo)
// Version: 1.0 (2014.11.28)
// Author: VladSh 

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process() {
   oCh.Text = oCh.getTextAll();
   oCh.Text = oCh.Text.replace(/&apos;/g, "'");
}


Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=1994#p1994
// Description(1033): Changing the direction of Q <-> A
// 	(for Mnemosyne_XML1-file received from AnyMemo)
// Description(1049): Изменение направления Вопрос <-> Ответ
// 	(для Mnemosyne_XML1-файла, полученного из AnyMemo)
// Version: 1.1 (2015.10.08)
// Author: VladSh 

if (!AkelPad.Include("CommonFunctions.js")) WScript.Quit();

var bSave = false;

var pContent = AkelPad.GetSelText();
if (!pContent) {
	pContent = AkelPad.GetTextRange(0, -1);
	bSave = true;
}

pContent = pContent.replace(/Q>/g, "#>");
pContent = pContent.replace(/A>/g, "Q>");
pContent = pContent.replace(/#>/g, "A>");

var pFileName = AkelPad.GetEditFile(0);
bSave = (bSave && pFileName) ? true : false;
if (bSave) {
	var oFileFormat = getFileFormat(AkelPad.GetEditWnd());
	createFile(oFileFormat, "xml");
}
AkelPad.ReplaceSel(pContent);

if (bSave) {
	var pPrefix = AkelPad.GetArgValue("fileprefix", "Rev ");
	var oFile = separateFile(pFileName);
	oFile.name = pPrefix + oFile.name;
	pFileName = joinFile(oFile);
	AkelPad.SaveFile(AkelPad.GetEditWnd(), pFileName);
	closeFile();
}

closeFile();
Last edited by VladSh on Thu Oct 08, 2015 2:39 pm, edited 24 times in total.

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

Убираем переводы строк в тексте

Post by VladSh »

Бывает полезно, когда пришёл текст по инету, разрезанный переводами строк:

Code: Select all

// Description(1033): Delete lines feed
// Description(1049): Убирает переводы строк
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2023#p2023
// Version: 3.7 (2011.07.21)
// Author: VladSh

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 за точную постановку задачи, в результате которой скрипт был усовершенствован до настоящего состояния.


Альтернативная реализация скриптов (поддерживает работу с выделением; установку курсора):

Code: Select all

// Description(1033): Delete empty lines
// Description(1049): Удаляет пустые строки
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2023#p2023
// Version: 3.7 (2014.08.05)
// Author: VladSh
// 
// Usage:
// 	Call("Scripts::Main", 1, "DelEmptyLines.js") - удалит пустые строки
// 	Call("Scripts::Main", 1, "DelEmptyLines.js", `-delSpaces=1`) - удалит пустые строки в т.ч. состоящие из "пустых" символов

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process() {
	oCh.Text = oCh.getSelTextAll();
	if (AkelPad.GetArgValue("delSpaces", 0)) {
		oCh.Text = oCh.Text.replace(/^[ \t]+$/mg, "");
	}
	oCh.Text = oCh.Text.replace(/\r{2,}/g, pBreak);		//убираем 2 и более переводов строк внутри
	oCh.Text = oStr.trim(oCh.Text, pBreak);		//убираем переводы строк по краям
}

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2023#p2023
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2023#p2023
// Description(1033): Delete trailing spaces selected or all text
// Description(1049): Убирает пустые символы в конце текста
// Version: 1.1 (2016.01.09)
// Author: VladSh
// 
// Arguments:
// 	-delSpaces:
// 		[0 or without arguments] - will delete spaces and/or Tabs from lines that contains text;
// 		1 - will delete spaces and/or Tabs from all lines (it is the analog of the command 4174)
// 
// Usage:
// 	Call("Scripts::Main", 1, "DelTrailSpaces.js") - удалит концевые пробелы и табуляции только в строках содержащих какой-либо текст
// 	Call("Scripts::Main", 1, "DelTrailSpaces.js", `-delSpaces=1`) - удалит концевые пробелы и табуляции во всех строках

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process() {
	if (AkelPad.GetArgValue("delSpaces", 0) == 0) {
		oCh.Text = oCh.getSelTextAll();
		oCh.Text = oCh.Text.replace(/(\S)([ \t])+$/gm, "$1");
	}
	else {
		AkelPad.Command(4174 /*IDM_EDIT_DELETE_TRAILING_WHITESPACES*/);
	}
}

Code: Select all

// Description(1033): Delete leading and trailing spaces selected or all text
// Description(1049): Убирает пустые символы по краям текста
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2023#p2023
// Version: 3.5 (2011.03.22)
// Author: VladSh

if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();
oCh.runWithRedraw();

function process() {
	oCh.Text = oCh.getSelTextAll();
	oStr.flags = "gm";
	oCh.Text = oStr.trim(oCh.Text, " \t");
}


This scripts used selCompleteLine.js.
Last edited by VladSh on Sat Jan 09, 2016 10:06 am, edited 20 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2150#p2150
// 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.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=2168#p2168
// 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.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Delete trailing whitespaces in all documents.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=3370#p3370
// Version: 1.3
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Delete trailing whitespaces in all documents.
// Description(1049): Удалить пробелы в конце во всех документах.

var hMainWnd=AkelPad.GetMainWnd();
var lpFrameInit;
var lpFrameCur;

//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/unexisted MDI/PMDI documents.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=3370#p3370
// Version: 1.6
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Close all unnamed/unexisted MDI/PMDI documents.
// Description(1049): Закрыть все безымянные/несуществующие документы MDI/PMDI.
//
// Arguments:
// -CloseUnnamed=false   -Close document without name (default is true).
// -CloseUnexisted=true  -Close document if file is deleted (default is false).
// -Prompt=true          -Prompt save document (default is false).
//
// Usage:
// Call("Scripts::Main", 1, "CloseUnnamedAll.js", `-CloseUnnamed=false -CloseUnexisted=true`)

//Arguments
var bCloseUnnamed=AkelPad.GetArgValue("CloseUnnamed", true);
var bCloseUnexisted=AkelPad.GetArgValue("CloseUnexisted", false);
var bPrompt=AkelPad.GetArgValue("Prompt", false);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var lpFrameInit=0;
var lpFrameCur=0;
var bFrameClose=false;
var pFile;
var bWatchFile=false;

if (AkelPad.IsMDI())
{
  //Turn off watch file
  if (bWatchFile=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 147 /*MI_WATCHFILE*/, 0))
    AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 147 /*MIS_WATCHFILE*/, false);

  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 && pFile && !IsFileExist(pFile)))
    {
      bFrameClose=true;
    }

    if (bFrameClose)
    {
      //Close MDI frame
      if (!bPrompt && 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 (bWatchFile)
    AkelPad.SendMessage(hMainWnd, 1219 /*AKD_SETMAININFO*/, 147 /*MIS_WATCHFILE*/, true);
}

function IsFileExist(pFile)
{
  if (oSys.Call("kernel32::GetFileAttributes" + _TCHAR, pFile) == -1)
    return false;
  return true;
}
Last edited by Instructor on Thu Dec 18, 2014 6:08 pm, edited 17 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Select next word.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=3751#p3751
// Version: 1.0
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Select next word.
// Description(1049): Выделить следующее слово.

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();

if (hWndEdit)
{
  if (AkelPad.IsAkelEdit())
  {
    AkelPad.SendMessage(hWndEdit, 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 Thu Dec 18, 2014 5:43 pm, edited 6 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Undo all changes.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=4050#p4050
// Version: 1.1
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Undo all changes.
// Description(1049): Отменить все изменения.

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();

if (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, 3077 /*AEM_UNDO*/, 0, 0))
    {
      if (!AkelPad.SendMessage(hWndEdit, 3086 /*AEM_GETMODIFY*/, 0, 0))
        break;
    }
    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 Thu Dec 18, 2014 6:15 pm, edited 6 times in total.
Post Reply