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
или новый файл сохраняется полностью как оригинальный (выделение при этом запоминается).
где проблема?
Posted: Sun Jul 06, 2014 6:23 pm
by opk44
kadvlad wrote:Сохранить выделение в файл
...
или новый файл сохраняется полностью как оригинальный (выделение при этом запоминается).
где проблема?
Про ошибки выполнения JScript ничего не скажу, но вот, судя по описанию, скрипт и не должен "сохранять выделение в файл". Выделение используется только чтобы получить предполагаемое имя файла (из первой строки выделения). Т.е. то, что при удачном запуске сохраняется все содержимое вкладки, а не только выделение никак не ошибка и, соответственно, не проблема.
Posted: Mon Jul 07, 2014 4:10 pm
by kadvlad
opk44 wrote:никак не ошибка и, соответственно, не проблема.
opk44
спасибо.
Собственно ошибка меня не беспокоит (ввиду невостребованности этого функционала).
Нашёл в комментарии к CommonFunctions.js:
а значит, должна быть возможность сохранять только выделенный фрагмент
(напр., добавить в окно "Сохранить как.." чекбокс "только выделенный фрагмент")
/?
Posted: Mon Jul 07, 2014 9:36 pm
by opk44
kadvlad wrote:Ведь существует функция ... а значит, должна быть возможность сохранять только выделенный фрагмент...
/?
Не уверен (что должна быть).
Здесь вообще очень непростое отношение к словам "должен", "должна"...
Возможно для SDI-режима это и актуально, но сам я работаю в MDI-режиме, и потому не вижу проблемы в том, чтобы создать новую вкладку, вставить в неё выделенный фрагмент и, тем самым, свести задачу сохранения "фрагмента" к стандартной.
Но у автора скрипта вполне может быть иное мнение.
Posted: Mon Jul 07, 2014 10:08 pm
by kadvlad
Я тоже предпочитаю MDI, но при множестве файлов красивее делать это не руками, а головой ))
Здесь ведь простая последовательность команд?
Приблизительно что-то вроде такого:
AkelPad.GetSelText();
AkelPad.Command(4101); или Function CreateNewTab()
AkelPad.Command(4106);
// а вот дальше при необходиомсти можно воспользоваться и функционалом SaveAs.js
Подождём мнения других специалистов..
..или попробуем через плагин Macros..
Posted: Tue Jul 08, 2014 7:06 am
by Instructor
kadvlad
Для сохранения выделения достаточно использовать флаг SD_SELECTION метода SaveFile:
а есть ли возможность сделать так, чтобы просто при выделении фрагмента и вызове команды "Сохранить как.." в окне последней появлялся чекбокс "только выделенный фрагмент", без автоматизации подстановки пути/имени/расширения и без автосохранения? Ну, или опционально выводить диалог для сохранения фрагмента?
Т.е. чтоб был универсальный выбор: сохранять весь файл либо только фрагмент.
К сожалению, сам я не справлюсь с такой задачей.
Спасибо.
Posted: Tue Jul 08, 2014 3:33 pm
by Instructor
kadvlad
Добавить галочку в стандартный диалог Windows - это гораздо больше работы, чем может показаться.
Проще добавить пункт в меню или панель инструментов для вызова следующего скрипта:
//// 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;
}
Posted: Tue Jul 08, 2014 5:07 pm
by kadvlad
Instructor
большое Вам спасибо.
Надеюсь, этот скрипт окажется полезен многим. Честно говоря, я немного смущён, что задача оказалась сложнее, чем мне думалось.
Тем приятнее видеть, что программа обладает такими богатыми возможностями.
Posted: Tue Jul 08, 2014 8:20 pm
by Skif_off
Infocatcher
Подскажите, пожалуйста, как можно заставить jsBeautifier.js не обрезать строки? После 255го символа сносит на новую строку, в параметрах ничего похожего. Это ограничение HTML?
Posted: Wed Jul 09, 2014 4:03 am
by Infocatcher
Skif_off wrote:Подскажите, пожалуйста, как можно заставить jsBeautifier.js не обрезать строки? После 255го символа сносит на новую строку, в параметрах ничего похожего. Это ограничение HTML?
-wrapLineLength=0
Только есть тонкость: это задаст "wrap_line_length" для оригинального кода и для HTML выставится ограничение в 32786 символов.
Но, в принципе, -wrapLineLength=1000000 тоже должен работать.
Posted: Wed Jul 09, 2014 7:32 am
by Skif_off
Infocatcher
Как сделать правильнее? Не могу ничего внятного нагуглить, откуда эти числа? Скрипт, так понимаю, не делает различия между PHP, HTML или XML, для XML нагуглил максимальный размер переменной - 2 гига.
Не будет ли разумным оставить как есть (делалось определенно более опытными, чем я ) и просто добавить еще один пункт меню для FB2 с -wrapLineLength=1000000? С другой стороны в сохраненных страницах не раз видел что весь код в одну строку, HTMLTidy так не делает (для XML).
Posted: Wed Jul 09, 2014 10:50 am
by kadvlad
Instructor
TabSwitch.js
постепенно просматриваю скрипты, приглянулся этот.
настроил: CTRL-TAB = вперёд / CTRL-SHIFT-TAB = назад
появляется список табов, но для переключения на выбранный таб нужно жать ENTER.
1) возможно ли автоматически переключаться на выбранный таб при отпускании клавиши CTRL?
2) возможно ли настроить переключение мышью, по аналогии с веб-браузерами: ПКМ+скролл вверх/вниз?
3) возможно ли настроить фиксированный размер шрифта в списке табов, без привязки к текущему размеру в осн.окне?
4) возможно ли настроить формирование списка табов по аналогии с Окно>Вкладки>Правая-Левая, а не в порядке их открытия?
Спасибо.
Posted: Wed Jul 09, 2014 5:06 pm
by Infocatcher
Skif_off wrote:Как сделать правильнее? Не могу ничего внятного нагуглить, откуда эти числа? Скрипт, так понимаю, не делает различия между PHP, HTML или XML, для XML нагуглил максимальный размер переменной - 2 гига.
Не будет ли разумным оставить как есть (делалось определенно более опытными, чем я ) и просто добавить еще один пункт меню для FB2 с -wrapLineLength=1000000? С другой стороны в сохраненных страницах не раз видел что весь код в одну строку, HTMLTidy так не делает (для XML).
Числа исключительно из исходного кода... вроде бы как.
Сейчас там вот такое: /js/lib/beautify.js#L272
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-образные штуки идут бонусом из-за схожести структуры.
Posted: Wed Jul 09, 2014 5:30 pm
by Skif_off
Infocatcher
Подумал, что есть ограничения языков, теперь все понятно, спасибо, думаю, добавлю еще один пункт меню