AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Scripts collection
Goto page Previous  1, 2, 3, ... 17, 18, 19  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Mon Aug 06, 2007 12:55 pm    Post subject: FileOpenDialog Reply with quote

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
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Wed Aug 08, 2007 8:45 am    Post subject: общий функционал для работы с выделением и текстом Reply with quote

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.9 (2014.06.06)

//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)
   {
      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;
}

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 Fri Jun 06, 2014 7:31 pm; edited 44 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Wed Aug 08, 2007 8:50 am    Post subject: Формирование, перенос и раскрытие символов блока {} Reply with quote

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
Code:
|
or
Code:
<condition>|

Result:
Code:
<condition>
{
   |
}

1.2.
Code:
condition |expression

Result:
Code:
condition
{
   expression|
}

1.3:
Code:
condition
|
Result:
Code:
condition
{
   |
}

1.4:
Code:
|condition
Result:
Code:
{
   |condition
}

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

Result:
Code:
condition
{
   |
}

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
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Fri Aug 10, 2007 2:04 pm    Post subject: Скрипты для комментирования/раскомментирования текстблоков Reply with quote

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.9 (2013.11.22)
//
// 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) {
         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;
      }
   }
   if (nCaretPos == 0) {
      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);
      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.10 (2014.04.21)

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",
   au3: "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 Mon Apr 21, 2014 3:00 pm; edited 28 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Thu Sep 27, 2007 4:01 pm    Post subject: Перевод строки после <br> в сплошном тексте Reply with quote

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
View user's profile Send private message Visit poster's website
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Tue Oct 16, 2007 11:06 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Tue Nov 13, 2007 1:47 pm    Post subject: Вставка инетовских уголков перед каждой строкой Reply with quote

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

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
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Wed Nov 14, 2007 12:37 pm    Post subject: Удаление файла без запроса о подтверждении Reply with quote

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



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

Updated: Exclamation Оказалось, наоборот! Очень полезным оказался! Главное на Shift+Del не назначать Wink


Last edited by VladSh on Thu Jul 21, 2011 1:18 pm; edited 6 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Fri Nov 16, 2007 4:15 pm    Post subject: Чтобы не хранить лишнее барахло Reply with quote

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(/&nbsp;/g, ' ');
   oCh.Text = oCh.Text.replace(/&quot;/g, '"');
   oCh.Text = oCh.Text.replace(/&amp;/g, '&');
   oCh.Text = oCh.Text.replace(/&lt;/g, '<');
   oCh.Text = oCh.Text.replace(/&gt;/g, '>');
   
   oCh.Text = oCh.Text.replace(/&ndash;/g, '-');
   oCh.Text = oCh.Text.replace(/&mdash;/g, '—');
   
   oCh.Text = oCh.Text.replace(/&lsquo;/g, '‘');      //левая одиночная кавычка
   oCh.Text = oCh.Text.replace(/&rsquo;/g, '’');      //правая одиночная кавычка
   oCh.Text = oCh.Text.replace(/&sbquo;/g, '‚');      //нижняя одиночная кавычка
   oCh.Text = oCh.Text.replace(/&ldquo;/g, '“');      //левая двойная кавычка
   oCh.Text = oCh.Text.replace(/&rdquo;/g, '”');      //правая двойная кавычка
   oCh.Text = oCh.Text.replace(/&bdquo;/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
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2614
Location: Киев, Русь

PostPosted: Fri Dec 07, 2007 3:33 pm    Post subject: Убираем переводы строк в тексте Reply with quote

Бывает полезно, когда пришёл текст по инету, разрезанный переводами строк:
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.7 (2014.08.05)
//
// 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);      //убираем переводы строк по краям
}

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 Aug 05, 2014 12:02 pm; edited 17 times in total
Back to top
View user's profile Send private message Visit poster's website
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Sat Jan 26, 2008 2:44 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Thu Feb 07, 2008 5:14 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Tue Sep 23, 2008 1:12 pm    Post subject: Reply with quote

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:
// Name: CloseUnnamedAll.js
// Site: http://akelpad.sourceforge.net/forum/viewtopic.php?p=3370#3370
// Version: 1.5
// Authors: Shengalts Aleksander aka Instructor
//
//
//// 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).
// -Prompt=true          -Prompt save document (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);
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 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 && pFile && oSys.Call("kernel32::GetFileAttributes" + _TCHAR, pFile) == -1))
    {
      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 (dwState & 0x8 /*MF_CHECKED*/)
    AkelPad.Command(4253 /*IDM_OPTIONS_WATCHFILE*/);
}



Last edited by Instructor on Mon Oct 13, 2014 6:26 am; edited 16 times in total
Back to top
View user's profile Send private message Send e-mail
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Thu Dec 11, 2008 12:45 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5396

PostPosted: Wed Jan 28, 2009 5:54 pm    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3, ... 17, 18, 19  Next
Page 2 of 19

 
Jump to:  
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


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group