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 

Форматтер кода XML и С++
Goto page 1, 2, 3, 4, 5  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian)
View previous topic :: View next topic  
Author Message
CleriC



Joined: 27 Mar 2012
Posts: 34

PostPosted: Tue Mar 27, 2012 4:29 pm    Post subject: Форматтер кода XML и С++ Reply with quote

Существуют ли для AkelPad плагины, которые форматируют код документов XML (расставляют отступы и пр.)?
Существуют ли плагины, которые делают тоже самое с кодом С++?
Back to top
View user's profile Send private message
VladSh



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

PostPosted: Tue Mar 27, 2012 5:32 pm    Post subject: Reply with quote

Смотрите сюда. На сколько я понимаю, Вам нужны HTML Tidy и AStyle.
Back to top
View user's profile Send private message Visit poster's website
CleriC



Joined: 27 Mar 2012
Posts: 34

PostPosted: Wed Mar 28, 2012 5:17 am    Post subject: Reply with quote

Что-то у меня не получилось, подскажите, пожалуйста.
По поводу HTML TiDy:
Положил HTMLTidy.js и reformat.cfg в папку AkelPad\AkelFiles\Tools\HTMLTidy\ (как было указано в описании) но скрипт отказался вызываться, написал что должен лежать в \AkelFiles\Plugs\Scripts\ перенес файлы туда.
Еще положил ShowMenuEx.js в папку скриптов и ShowMenuCommon.js в папку AkelFiles\Plugs\Scripts\Include\ - без них тоже не работал.
Еще вот этот файл положил \AkelFiles\Plugs\Scripts\Params\HTMLTidy.param
tidy.exe скачал и положил в в \AkelFiles\Tools\HTMLTidy\

Открыл XML файл, запустил скрипт через эту менюшку: http://s2.ipicture.ru/uploads/20120328/a7RbZyTu.png
Написано - работает.
При первом запуске скрипта программа выдает контекстное меню:
http://s2.ipicture.ru/uploads/20120328/bK3AnqPn.png
Нажимаю Custom, вроде как скрипт запускается.
Подвесил команды на хоткей:
http://s2.ipicture.ru/uploads/20120328/1R44p6Uf.png
Вызываю - но форматирования не происходит. Вообще ничего не происходит.

С AStyle примерно тоже самое.
AStyle.js в скрипты, AStyle.param в параметры, AStyle.exe в AkelPad\AkelFiles\Tools\AStyle\
Запускаю скрипт, появляется контекстное меню. Нажимаю хоткей: курсор убегает в конец документа но с кодом не происходит никаких изменений, как был сдвинут к левому краю, так и остался.

Что я делаю не так? Судя по всему скрипт то запускается, но как сделать так что бы он сработал? Возможно что-то с настройками не так? AkelPad 4.7.3 x86.
Back to top
View user's profile Send private message
DV



Joined: 16 Nov 2006
Posts: 851
Location: Kyiv, Ukraine

PostPosted: Wed Mar 28, 2012 9:29 am    Post subject: Reply with quote

Как по мне, то jsBeautifier.js отлично справляется. И не требует внешних программ.
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1629

PostPosted: Wed Mar 28, 2012 9:55 am    Post subject: Reply with quote

Еще есть tabifier.js, отложенный до создания окошка с галочками, только вот что-то все никак не собраться.
А так мне хватает jsBeautifier.js, вот и ленюсь. Very Happy
Back to top
View user's profile Send private message Visit poster's website
VladSh



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

PostPosted: Wed Mar 28, 2012 10:04 am    Post subject: Reply with quote

CleriC
Наверное se7h не перепилил скрипты под Include, т.к. ShowMenuEx.js должен находиться в ..\Scripts\Include\.
Вот рабочая (в т.ч. и с использованием меню) версия скрипта AStyle.js
Code:
/// Process current file in AStyle http://astyle.sourceforge.net/astyle.html
// Version 1.2
//
// Usage:
// Call("Scripts::Main", 1, "AStyle.js", "`flags`")
//
// Or support ShowMenuEx.js if you do not specify a flags in argument:
// Call("Scripts::Main", 1, "AStyle.js")

var WshShell = new ActiveXObject("WScript.shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

var pToolPath = AkelPad.GetAkelDir() + "\\AkelFiles\\Tools\\AStyle\\AStyle.exe";
var pToolFlags = "";

if (WScript.Arguments.length)
{
   pToolFlags += WScript.Arguments(0);
}
else if (!pToolFlags)
{
   if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();
   var pFlags = getSelectedMenuItem(POS_CURSOR, "", 0);

   if (!pFlags) WScript.Quit();

   pToolFlags += pFlags;
}

var hEditWnd = AkelPad.GetEditWnd();
var pTmpFile;
var pText;

if (pTmpFile = CreateTempFile())
{
   AkelPad.SaveFile(hEditWnd, pTmpFile, 65001 /*UTF-8*/, true, false);

   pToolPath = correctCommandLine(pToolPath);
   pTmpFile = correctCommandLine(pTmpFile);

   WshShell.Run("%COMSPEC% /c " + pToolPath + " " + pToolFlags + " " + pTmpFile, 0, true);
   pText = AkelPad.ReadFile(pTmpFile);
   
   setRedraw(hEditWnd, false);
   var nCaretPos = AkelPad.GetSelStart();
   AkelPad.SetSel(0, -1);
   AkelPad.ReplaceSel(pText);
   AkelPad.SetSel(nCaretPos, nCaretPos);
   setRedraw(hEditWnd, 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 correctCommandLine(pPath)
{
   if (pPath.search(/ /) != -1)
      return "\"" + pPath + "\"";
   else
      return pPath;
}

function setRedraw(hWnd, bRedraw)
{
   var oSys = AkelPad.SystemFunction();
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

Только параметры надо правильно указывать так (в Custom используемые мной параметры):
Code:
-b -N -o -t -S -w -Y -M -H -U -p = Custom
-A1 = Allman Style

Я вообще файл параметров для данного скрипта не использую, т.к. мне надо всегда лишь 1 вариант, и я задаю его в аргументах при вызове скрипта:
Code:
-"AStyle форматирование кода" Call("Scripts::Main", 1, "AStyle.js", `"-b -N -o -t -S -w -Y -M -H -U -p"`) Icon("%a\AkelFiles\Plugs\Toolbar.dll", 28)
Такой вызов работает и со старой версией скрипта.


Что-то похожее и с HTMLTidy.js.
Строку
Code:
eval(AkelPad.ReadFile(AkelPad.GetAkelDir() + "\\AkelFiles\\Plugs\\Scripts\\ShowMenuEx.js"));
надо заменить на
Code:
if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();
И, возможно (я его просто не использую, потому точно не знаю), параметры передать по другому. Тут поэкспериментировать придётся или se7h как-то потрусить))


DV
Возможно, я не пробовал.
Back to top
View user's profile Send private message Visit poster's website
CleriC



Joined: 27 Mar 2012
Posts: 34

PostPosted: Thu Mar 29, 2012 5:04 am    Post subject: Reply with quote

jsBeautifier.js заработал - действительно самый просто вариант - всего один файл положить в папку скрипты. Посмотрю на что он способен.

Можно настроить таким образом, что бы после форматирования документа он не выделял текст и оставлял курсор на том месте где он и был? А то весь текст выделен и теряешь место где стоял курсор.

При форматировании текста С++ jsBeautifier строки с #define компонует в одну строку:
http://s2.ipicture.ru/uploads/20120329/QP0ina1r.png
Это настраивается?

Умеет ли jsBeautifier проверять целостность кода? Хотя бы предупреждать, если какой-то тег не закрыт?
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1629

PostPosted: Thu Mar 29, 2012 7:43 am    Post subject: Reply with quote

Quote:
Можно настроить таким образом, что бы после форматирования документа он не выделял текст и оставлял курсор на том месте где он и был? А то весь текст выделен и теряешь место где стоял курсор.

Положение прокрутки должно сохраняться.
С восстановлением курсора сложнее. Теоретически – сделать можно, надо пробовать.
Только вот для точного восстановления надо или метки добавлять (а чтобы не сломать парсер, надо при этом учитывать синтаксис, так что восстановится в пределах «слова»), или запоминать, что находится слева (причем или без пробелов, или с заменой группы пробелов на один). Во втором случае это дополнительное выделение памяти. Впрочем, кого это сейчас волнует? Very Happy

Quote:
При форматировании текста С++ ...

С этим ничего не поделаешь – все же скрипт предназначен для JavaScript. Все-таки это всего лишь побочный эффект от схожего синтаксиса.

Quote:
Умеет ли jsBeautifier проверять целостность кода? Хотя бы предупреждать, если какой-то тег не закрыт?

Не умеет, но можно оформить предложение – вдруг добавит кто.
Back to top
View user's profile Send private message Visit poster's website
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5397

PostPosted: Thu Mar 29, 2012 7:52 am    Post subject: Reply with quote

C++:
1. Скачиваем AStyle.
2. Помещаем файл AStyle.exe в папку "[AkelPad]\AkelFiles\Tools".
3. Создаем вызов в ToolBar или ContextMenu или HotKeys плагине:
Code:
-"C++ beautifier" Call("Log::Output", 1, `"%a\AkelFiles\Tools\AStyle.exe" --style=allman`, "", "", "", -1, -1, 1052673) Icon(0)


HTML:
1. Скачиваем HTML Tidy.
2. Помещаем файл Tidy.exe в папку "[AkelPad]\AkelFiles\Tools".
3. Создаем вызов в ToolBar или ContextMenu или HotKeys плагине:
Code:
-"HTML beautifier" Call("Log::Output", 1, `"%a\AkelFiles\Tools\Tidy.exe" -utf8 --indent auto --quiet yes --wrap 0 --show-errors 0`, "", "", "", 65001, 65001, 1052673) Icon(0)


XML:
1. Скачиваем HTML Tidy.
2. Помещаем файл Tidy.exe в папку "[AkelPad]\AkelFiles\Tools".
3. Создаем вызов в ToolBar или ContextMenu или HotKeys плагине:
Code:
-"XML beautifier" Call("Log::Output", 1, `"%a\AkelFiles\Tools\Tidy.exe" -utf8 -xml --indent auto --quiet yes --wrap 0 --show-errors 0`, "", "", "", 65001, 65001, 1052673) Icon(0)



Требуется Log плагин версии 2.4 или выше.


Last edited by Instructor on Fri Mar 30, 2012 3:02 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
CleriC



Joined: 27 Mar 2012
Posts: 34

PostPosted: Thu Mar 29, 2012 7:55 am    Post subject: Reply with quote

Infocatcher wrote:
Положение прокрутки должно сохраняться.

Да, оно действительно сохраняется. Если с курсором все так сложно - фиг с ним.

Еще пару вопросов:
Можно ли настроить jsBeautifier таким образом, что бы содержимое внутри тега не переносилось на следующиую строку.
Вот поясняющий скриншот:
http://s1.ipicture.ru/uploads/20120329/csfhHy2s.png
У меня есть длинный тег <group id="СЗ" name="Статическое зондирование" fullname="Оборудование для статического зондирования" img="" order="1">
jsBeautifier переносит кусок img="" order="1"> на следующую строку (см. скрин 4 и 5 строчки). Этого можно избежать?

Второй вопрос, возможно не к бьютифаеру, а к настройкам самого акельпада. Можно ли сделать так, что бы длинный текст в одну строчку, при включении опции "Перенос по словам", начинался не с самого левого края, а с того места какому тегу он принадлежит. Опять же скриншот:
http://s1.ipicture.ru/uploads/20120329/ZWHtxWin.png
Строка №7 очень длинная, но мне нужно видеть ее на экране. При этом сбивается выравнивание по тегам (то, чего я собственно добивался от бьютифаера). Можно ли настроить так, что бы текст шел от нарисованной красной линии?
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1629

PostPosted: Thu Mar 29, 2012 8:19 am    Post subject: Reply with quote

Quote:
что бы содержимое внутри тега не переносилось на следующиую строку

Можно, надо запустить с дополнительным аргументом
-maxChar=число
При особом желании можно даже
-maxChar=Infinity

Quote:
возможно не к бьютифаеру, а к настройкам самого акельпада

Пожалуй, было бы удобно. Лишь бы отключить можно было. Very Happy
Впрочем, ни AkelPad, ни jsBeautifier такого не умеют.
Back to top
View user's profile Send private message Visit poster's website
CleriC



Joined: 27 Mar 2012
Posts: 34

PostPosted: Thu Mar 29, 2012 8:43 am    Post subject: Reply with quote

Infocatcher wrote:

Можно, надо запустить с дополнительным аргументом
-maxChar=число
При особом желании можно даже
-maxChar=Infinity

Поэкспериментирую.

Quote:
Впрочем, ни AkelPad, ни jsBeautifier такого не умеют.

Жалко, ну да ладно.

Вот еще вопрос. Когда работаешь файлами где есть какая-то отбивка справа (например XML), хотелось, что бы курсор переводился не на начало строки, а выравнивался по тегу внутри которого он находится.
Вот скриншот:
http://s1.ipicture.ru/uploads/20120329/AZYb7XAe.png
Находясь на строчке 253 я нажимаю Enter и курсор переводится на новую строку - в начало 254. А хотелось бы что бы он переводился на уровень тега (помечено красным). Такое возможно?

Где в AkelPad-е можно посмотреть путь до открытого файла? (в заголовке только имя)
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1629

PostPosted: Thu Mar 29, 2012 9:35 am    Post subject: Reply with quote

Quote:
что бы курсор переводился не на начало строки, а выравнивался по тегу внутри которого он находится

меню Настройки – Сохранять отступы слева

Quote:
Где в AkelPad-е можно посмотреть путь до открытого файла? (в заголовке только имя)

Если включить (P)MDI-режим, в заголовке будет путь:
Настройки – Оконный режим
Back to top
View user's profile Send private message Visit poster's website
Infocatcher



Joined: 06 Aug 2007
Posts: 1629

PostPosted: Thu Mar 29, 2012 10:45 am    Post subject: Reply with quote

CleriC wrote:
Если с курсором все так сложно - фиг с ним.

Вроде, получилось подкрутить исходный скрипт: https://github.com/einars/js-beautify/pull/109

Осталось понять, как в AkelPad'е не просто восстанавливать положение прокрутки, а пересчитывать с учетом изменений.
Back to top
View user's profile Send private message Visit poster's website
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Thu Mar 29, 2012 11:14 am    Post subject: Reply with quote

Кстати насчет maxChar. Можно ли сделать, чтобы по дефолту разбивка была отключена? Либо чтобы срабатывала установкой значения в 0.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian) All times are GMT
Goto page 1, 2, 3, 4, 5  Next
Page 1 of 5

 
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