Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 27
Joined: Sun Mar 16, 2008 10:26 pm

Post by kadvlad »

Сохранить выделение в файл

AkelPad v4.8.4 x86
SaveAs.js v2.17
CommonFunctions.js v2.11
Call("Scripts::Main", 1, "SaveAs.js")

получаю ошибки:
Не удается прочитать файл "D:\AkelFiles\piugs\Scripts\SaveAs.js"
или
Скрипт: D:\AkelFiles\plugs\Scripts\Include\CommonFunctions.js
Строка: 106
Символ: 10
Ошибка: "undefined"- есть null или не является объектом
Код: 800A138F
Источник: Ошибка выполнения Microsoft JScript
вот эта строка:

Code: Select all

arrFTypeInfo = arrExts[result.filterIndex].split(";"); 
или новый файл сохраняется полностью как оригинальный (выделение при этом запоминается).

где проблема?

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

kadvlad wrote:Сохранить выделение в файл
...
или новый файл сохраняется полностью как оригинальный (выделение при этом запоминается).

где проблема?
Про ошибки выполнения JScript ничего не скажу, но вот, судя по описанию, скрипт и не должен "сохранять выделение в файл". Выделение используется только чтобы получить предполагаемое имя файла (из первой строки выделения). Т.е. то, что при удачном запуске сохраняется все содержимое вкладки, а не только выделение никак не ошибка и, соответственно, не проблема.

Offline
Posts: 27
Joined: Sun Mar 16, 2008 10:26 pm

Post by kadvlad »

opk44 wrote:никак не ошибка и, соответственно, не проблема.
opk44
спасибо.

Собственно ошибка меня не беспокоит (ввиду невостребованности этого функционала).
Нашёл в комментарии к CommonFunctions.js:

Code: Select all

AkelPad.Command(4101 /*IDM_FILE_NEW*/); //создание (закладки) для сохранения выделения отдельным файлом 
и решил, что в принципе это возможно сделать с помощью SaveAs.js.

Ведь существует функция

Code: Select all

AkelPad.GetSelText();

а значит, должна быть возможность сохранять только выделенный фрагмент
(напр., добавить в окно "Сохранить как.." чекбокс "только выделенный фрагмент")

/?

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

kadvlad wrote:Ведь существует функция ... а значит, должна быть возможность сохранять только выделенный фрагмент...
/?
Не уверен (что должна быть). :roll:
Здесь вообще очень непростое отношение к словам "должен", "должна"...
Возможно для SDI-режима это и актуально, но сам я работаю в MDI-режиме, и потому не вижу проблемы в том, чтобы создать новую вкладку, вставить в неё выделенный фрагмент и, тем самым, свести задачу сохранения "фрагмента" к стандартной.
Но у автора скрипта вполне может быть иное мнение.

Offline
Posts: 27
Joined: Sun Mar 16, 2008 10:26 pm

Post by kadvlad »

Я тоже предпочитаю MDI, но при множестве файлов красивее делать это не руками, а головой ))

Здесь ведь простая последовательность команд?
Приблизительно что-то вроде такого:

Code: Select all

AkelPad.GetSelText();
AkelPad.Command(4101); или Function CreateNewTab()
AkelPad.Command(4106);
// а вот дальше при необходиомсти можно воспользоваться и функционалом SaveAs.js
Подождём мнения других специалистов..

..или попробуем через плагин Macros..

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

Post by Instructor »

kadvlad
Для сохранения выделения достаточно использовать флаг SD_SELECTION метода SaveFile:

Code: Select all

AkelPad.SaveFile(0, "C:\\1.txt", -1, -1, 0x3 /*SD_UPDATE|SD_SELECTION*/);
или как новую вкладку:

Code: Select all

if (AkelPad.SaveFile(0, "C:\\1.txt", -1, -1, 0x2 /*SD_SELECTION*/) == 0 /*ESD_SUCCESS*/)
  AkelPad.OpenFile("C:\\1.txt");
Last edited by Instructor on Tue Jul 08, 2014 3:28 pm, edited 1 time in total.

Offline
Posts: 27
Joined: Sun Mar 16, 2008 10:26 pm

Post by kadvlad »

Instructor,

а есть ли возможность сделать так, чтобы просто при выделении фрагмента и вызове команды "Сохранить как.." в окне последней появлялся чекбокс "только выделенный фрагмент", без автоматизации подстановки пути/имени/расширения и без автосохранения? Ну, или опционально выводить диалог для сохранения фрагмента?
Т.е. чтоб был универсальный выбор: сохранять весь файл либо только фрагмент.

К сожалению, сам я не справлюсь с такой задачей.
Спасибо.

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

Post by Instructor »

kadvlad
Добавить галочку в стандартный диалог Windows - это гораздо больше работы, чем может показаться.

Проще добавить пункт в меню или панель инструментов для вызова следующего скрипта:

Code: Select all

//// Save selection.

//Options
var pFilter="Text files (*.txt)\x00*.txt\x00All Files (*.*)\x00*.*\x00\x00";
var nFilterIndex=2;

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var pInitialFile=AkelPad.GetEditFile(0);
var pFile;

if (pFile=FileDialog(false, hMainWnd, pInitialFile, pFilter, nFilterIndex))
{
  if (AkelPad.SaveFile(0, pFile, -1, -1, 0x2 /*SD_SELECTION*/) == 0 /*ESD_SUCCESS*/)
    AkelPad.OpenFile(pFile);
}


//Functions
function FileDialog(bOpenTrueSaveFalse, hWnd, pInitialFile, pFilter, nFilterIndex)
{
  var nFlags=0x880804; //OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_ENABLESIZING
  var pDefaultExt="txt";
  var lpStructure;
  var lpFilterBuffer;
  var lpFileBuffer;
  var lpExtBuffer;
  var oSys;
  var pResultFile="";
  var nCallResult;

  if (lpFilterBuffer=AkelPad.MemAlloc(256 * _TSIZE))
  {
    AkelPad.MemCopy(lpFilterBuffer, pFilter.substr(0, 255), _TSTR);

    if (lpFileBuffer=AkelPad.MemAlloc(256 * _TSIZE))
    {
      AkelPad.MemCopy(lpFileBuffer, pInitialFile.substr(0, 255), _TSTR);

      if (lpExtBuffer=AkelPad.MemAlloc(256 * _TSIZE))
      {
        AkelPad.MemCopy(lpExtBuffer, pDefaultExt.substr(0, 255), _TSTR);

        if (lpStructure=AkelPad.MemAlloc(_X64?136:76))  //sizeof(OPENFILENAMEA) or sizeof(OPENFILENAMEW)
        {
          //Fill structure
          AkelPad.MemCopy(lpStructure, _X64?136:76, 3 /*DT_DWORD*/);                     //lStructSize
          AkelPad.MemCopy(lpStructure + (_X64?8:4), hWnd, 2 /*DT_QWORD*/);               //hwndOwner
          AkelPad.MemCopy(lpStructure + (_X64?24:12), lpFilterBuffer, 2 /*DT_QWORD*/);   //lpstrFilter
          AkelPad.MemCopy(lpStructure + (_X64?44:24), nFilterIndex, 3 /*DT_DWORD*/);     //nFilterIndex
          AkelPad.MemCopy(lpStructure + (_X64?48:28), lpFileBuffer, 2 /*DT_QWORD*/);     //lpstrFile
          AkelPad.MemCopy(lpStructure + (_X64?56:32), 256, 3 /*DT_DWORD*/);              //nMaxFile
          AkelPad.MemCopy(lpStructure + (_X64?96:52), nFlags, 3 /*DT_DWORD*/);           //Flags
          AkelPad.MemCopy(lpStructure + (_X64?104:60), lpExtBuffer, 2 /*DT_QWORD*/);     //lpstrDefExt

          if (oSys=AkelPad.SystemFunction())
          {
            //Call dialog
            if (bOpenTrueSaveFalse == true)
              nCallResult=oSys.Call("comdlg32::GetOpenFileName" + _TCHAR, lpStructure);
            else
              nCallResult=oSys.Call("comdlg32::GetSaveFileName" + _TCHAR, lpStructure);

            //Result file
            if (nCallResult) pResultFile=AkelPad.MemRead(lpFileBuffer, _TSTR);
          }
          AkelPad.MemFree(lpStructure);
        }
        AkelPad.MemFree(lpExtBuffer);
      }
      AkelPad.MemFree(lpFileBuffer);
    }
    AkelPad.MemFree(lpFilterBuffer);
  }
  return pResultFile;
}

Offline
Posts: 27
Joined: Sun Mar 16, 2008 10:26 pm

Post by kadvlad »

Instructor
большое Вам спасибо.

Надеюсь, этот скрипт окажется полезен многим.
Честно говоря, я немного смущён, что задача оказалась сложнее, чем мне думалось.
Тем приятнее видеть, что программа обладает такими богатыми возможностями.
;)

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Infocatcher
Подскажите, пожалуйста, как можно заставить jsBeautifier.js не обрезать строки? После 255го символа сносит на новую строку, в параметрах ничего похожего. Это ограничение HTML?

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

Post by Infocatcher »

Skif_off wrote:Подскажите, пожалуйста, как можно заставить jsBeautifier.js не обрезать строки? После 255го символа сносит на новую строку, в параметрах ничего похожего. Это ограничение HTML?
-wrapLineLength=0
Только есть тонкость: это задаст "wrap_line_length" для оригинального кода и для HTML выставится ограничение в 32786 символов.
Но, в принципе, -wrapLineLength=1000000 тоже должен работать.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Infocatcher
Как сделать правильнее? :) Не могу ничего внятного нагуглить, откуда эти числа? Скрипт, так понимаю, не делает различия между PHP, HTML или XML, для XML нагуглил максимальный размер переменной - 2 гига.
Не будет ли разумным оставить как есть (делалось определенно более опытными, чем я :)) и просто добавить еще один пункт меню для FB2 с -wrapLineLength=1000000? С другой стороны в сохраненных страницах не раз видел что весь код в одну строку, HTMLTidy так не делает (для XML).

Offline
Posts: 27
Joined: Sun Mar 16, 2008 10:26 pm

Post by kadvlad »

Instructor
TabSwitch.js

постепенно просматриваю скрипты, приглянулся этот.
настроил: CTRL-TAB = вперёд / CTRL-SHIFT-TAB = назад
появляется список табов, но для переключения на выбранный таб нужно жать ENTER.

1) возможно ли автоматически переключаться на выбранный таб при отпускании клавиши CTRL?
2) возможно ли настроить переключение мышью, по аналогии с веб-браузерами: ПКМ+скролл вверх/вниз?
3) возможно ли настроить фиксированный размер шрифта в списке табов, без привязки к текущему размеру в осн.окне?
4) возможно ли настроить формирование списка табов по аналогии с Окно>Вкладки>Правая-Левая, а не в порядке их открытия?

Спасибо.

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

Post by Infocatcher »

Skif_off wrote:Как сделать правильнее? :) Не могу ничего внятного нагуглить, откуда эти числа? Скрипт, так понимаю, не делает различия между PHP, HTML или XML, для XML нагуглил максимальный размер переменной - 2 гига.
Не будет ли разумным оставить как есть (делалось определенно более опытными, чем я :)) и просто добавить еще один пункт меню для FB2 с -wrapLineLength=1000000? С другой стороны в сохраненных страницах не раз видел что весь код в одну строку, HTMLTidy так не делает (для XML).
Числа исключительно из исходного кода... вроде бы как.
Сейчас там вот такое:
/js/lib/beautify.js#L272

Code: Select all

opt.wrap_line_length = (options.wrap_line_length === undefined) ? 0 : parseInt(options.wrap_line_length, 10);
0 => без ограничений

/js/lib/beautify-html.js#L107

Code: Select all

wrap_line_length =  parseInt(options.wrap_line_length, 10) === 0 ? 32786 : parseInt(options.wrap_line_length || 250, 10);
0 => ограничение в 32786

Изменено было вот тут:
https://github.com/beautify-web/js-beau ... cbd79d7L78
(и без пояснений)
А предыдущий вариант вообще мой: https://github.com/beautify-web/js-beautify/pull/110 :)

С программной точки зрения никаких проблем быть не должно, там только проверки вида
/js/lib/beautify-html.js#L201-L203

Code: Select all

                        if (this.line_char_count >= this.wrap_line_length) { //insert a line when the wrap_line_length is reached
                            this.print_newline(false, content);
                            this.print_indentation(content);
                        }
И потом это же только для удобства – разбивать или нет длинную оригинальную строку на фрагменты разумной длины.

По поводу различий. Видов обработки сейчас только три: JavaScript, HTML и CSS внутри HTML. Все прочие XML-образные штуки идут бонусом из-за схожести структуры.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Infocatcher
Подумал, что есть ограничения языков, теперь все понятно, спасибо, думаю, добавлю еще один пункт меню :)
Locked