Форматтер кода XML и С++

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 41
Joined: Tue Mar 27, 2012 4:25 pm

Форматтер кода XML и С++

Post by CleriC »

Существуют ли для AkelPad плагины, которые форматируют код документов XML (расставляют отступы и пр.)?
Существуют ли плагины, которые делают тоже самое с кодом С++?

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

Post by VladSh »

Смотрите сюда. На сколько я понимаю, Вам нужны HTML Tidy и AStyle.

Offline
Posts: 41
Joined: Tue Mar 27, 2012 4:25 pm

Post by CleriC »

Что-то у меня не получилось, подскажите, пожалуйста.
По поводу 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.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Как по мне, то jsBeautifier.js отлично справляется. И не требует внешних программ.

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

Post by Infocatcher »

Еще есть tabifier.js, отложенный до создания окошка с галочками, только вот что-то все никак не собраться.
А так мне хватает jsBeautifier.js, вот и ленюсь. :D

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

Post by VladSh »

CleriC
Наверное se7h не перепилил скрипты под Include, т.к. ShowMenuEx.js должен находиться в ..\Scripts\Include\.
Вот рабочая (в т.ч. и с использованием меню) версия скрипта

Code: Select all

/// 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: Select all

-b -N -o -t -S -w -Y -M -H -U -p = Custom 
-A1 = Allman Style
Я вообще файл параметров для данного скрипта не использую, т.к. мне надо всегда лишь 1 вариант, и я задаю его в аргументах при вызове скрипта:

Code: Select all

-"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: Select all

eval(AkelPad.ReadFile(AkelPad.GetAkelDir() + "\\AkelFiles\\Plugs\\Scripts\\ShowMenuEx.js")); 
надо заменить на

Code: Select all

if (! AkelPad.Include("ShowMenuEx.js")) WScript.Quit();
И, возможно (я его просто не использую, потому точно не знаю), параметры передать по другому. Тут поэкспериментировать придётся или se7h как-то потрусить))


DV
Возможно, я не пробовал.

Offline
Posts: 41
Joined: Tue Mar 27, 2012 4:25 pm

Post by CleriC »

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

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

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

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

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

Post by Infocatcher »

Можно настроить таким образом, что бы после форматирования документа он не выделял текст и оставлял курсор на том месте где он и был? А то весь текст выделен и теряешь место где стоял курсор.
Положение прокрутки должно сохраняться.
С восстановлением курсора сложнее. Теоретически – сделать можно, надо пробовать.
Только вот для точного восстановления надо или метки добавлять (а чтобы не сломать парсер, надо при этом учитывать синтаксис, так что восстановится в пределах «слова»), или запоминать, что находится слева (причем или без пробелов, или с заменой группы пробелов на один). Во втором случае это дополнительное выделение памяти. Впрочем, кого это сейчас волнует? :D
При форматировании текста С++ ...
С этим ничего не поделаешь – все же скрипт предназначен для JavaScript. Все-таки это всего лишь побочный эффект от схожего синтаксиса.
Умеет ли jsBeautifier проверять целостность кода? Хотя бы предупреждать, если какой-то тег не закрыт?
Не умеет, но можно оформить предложение – вдруг добавит кто.

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

Post by Instructor »

C++:
1. Скачиваем AStyle.
2. Помещаем файл AStyle.exe в папку "[AkelPad]\AkelFiles\Tools".
3. Создаем вызов в ToolBar или ContextMenu или HotKeys плагине:

Code: Select all

-"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: Select all

-"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)

Code: Select all

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

Code: Select all

-"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)

Code: Select all

-"XML tester" Call("Log::Output", 1, `"%a\AkelFiles\Tools\Tidy.exe" -utf8 -xml --indent auto --quiet yes --wrap 0 -errors`, "", "^line (\d+) column (\d+)", "/GOTOLINE=\1:\2", 65001, 65001, 4096) Icon(0)
Требуется Log плагин версии 2.4 или выше.
Last edited by Instructor on Sun Jan 25, 2015 10:23 am, edited 5 times in total.

Offline
Posts: 41
Joined: Tue Mar 27, 2012 4:25 pm

Post by CleriC »

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 очень длинная, но мне нужно видеть ее на экране. При этом сбивается выравнивание по тегам (то, чего я собственно добивался от бьютифаера). Можно ли настроить так, что бы текст шел от нарисованной красной линии?

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

Post by Infocatcher »

что бы содержимое внутри тега не переносилось на следующиую строку
Можно, надо запустить с дополнительным аргументом
-maxChar=число
При особом желании можно даже
-maxChar=Infinity
возможно не к бьютифаеру, а к настройкам самого акельпада
Пожалуй, было бы удобно. Лишь бы отключить можно было. :D
Впрочем, ни AkelPad, ни jsBeautifier такого не умеют.

Offline
Posts: 41
Joined: Tue Mar 27, 2012 4:25 pm

Post by CleriC »

Infocatcher wrote: Можно, надо запустить с дополнительным аргументом
-maxChar=число
При особом желании можно даже
-maxChar=Infinity
Поэкспериментирую.
Впрочем, ни AkelPad, ни jsBeautifier такого не умеют.
Жалко, ну да ладно.

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

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

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

Post by Infocatcher »

что бы курсор переводился не на начало строки, а выравнивался по тегу внутри которого он находится
меню Настройки – Сохранять отступы слева
Где в AkelPad-е можно посмотреть путь до открытого файла? (в заголовке только имя)
Если включить (P)MDI-режим, в заголовке будет путь:
Настройки – Оконный режим

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

Post by Infocatcher »

CleriC wrote:Если с курсором все так сложно - фиг с ним.
Вроде, получилось подкрутить исходный скрипт: https://github.com/einars/js-beautify/pull/109

Осталось понять, как в AkelPad'е не просто восстанавливать положение прокрутки, а пересчитывать с учетом изменений.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Кстати насчет maxChar. Можно ли сделать, чтобы по дефолту разбивка была отключена? Либо чтобы срабатывала установкой значения в 0.
Post Reply