Code: Select all
//AutoItToolsLog.js
//
// Version: 2015-09-04
//
// Скрипт для удобства запуска утилит TidySource и Au3Check:
// - при запуске скрипта происходит проверка модифицирован файл или нет, если нет -
// предупреждает и предлагает сохранить, если Да - сохраняет, иначе - завершает работу;
// - для TidySource после завершения работы появляется окно с предложением закрыть панель вывода,
// если не была открыта до запуска;
// - автоматическое переоткрытие файла после работы TidySource;
// - для Au3Check вывод парсится на предмет строк с ошибками, добавлен переход к строке с ошибкой;
// - если Au3Check отработала без ошибок и предупреждений (код выхода равен 0), а панель вывода
// не была открыта до запуска, то панель будет автоматически закрыта и появится окно
// с сообщением, что все нормально.
//
// Параметры:
// -file="%f" - полное имя текущего файла, обязательный;
// -util="" - имя утилиты, обязательный:
// -util="TidySource"
// -util="Au3Check"
// -cmd="" - параметры запуска утилиты, необязательный.
// Если не указаны -file и -util - завершение без предупреждения.
//
// Примеры:
// -"AutoIt Tidy" Call("Scripts::Main", 1, "AutoItToolsLog.js", `-file="%f" -util="TidySource" -cmd="/NoGui /f1 /v0 /s1 /l1"`)
// -"AutoIt Tidy + BackUp" Call("Scripts::Main", 1, "AutoItToolsLog.js", `-file="%f" -util="TidySource" -cmd="/NoGui /f1 /v0 /s1 /l1 /BackUp"`)
// -"AutoIt Tidy GUI" Call("Scripts::Main", 1, "AutoItToolsLog.js", `-file="%f" -util="TidySource"`)
// -"Au3Check" Call("Scripts::Main", 1, "AutoItToolsLog.js", `-file="%f" -util="Au3Check"`)
//
// По умолчанию предполагается, что Au3Check.exe и TidySource.exe лежат в
// [AkelPad]\AkelFiles\Tools\AutoIt3Tidy\TidySource.exe
// [AkelPad]\AkelFiles\Tools\Au3Check\Au3Check.exe
// иначе необходимо исправить пути ниже на свои.
//
// Скрипт сохранить в UTF-16LE!
//
// Пути к утилитам
var TidySource = "%a\\AkelFiles\\Tools\\AutoIt3Tidy\\TidySource.exe"
var Au3Check = "%a\\AkelFiles\\Tools\\Au3Check\\Au3Check.exe"
var hMainWnd = AkelPad.GetMainWnd();
var bModified = AkelPad.GetEditModified(0);
var pFile = AkelPad.GetArgValue("file", 0);
var pUtil = AkelPad.GetArgValue("util", 0);
var pParams = AkelPad.GetArgValue("cmd", "");
var nRunning;
var nExitCode;
// Проверяем, указаны ли обязательные параметры -file и -util, если нет - выходим
if (pFile == 0 || pUtil == 0)
WScript.Quit();
// Локализация
if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 1049 /*Russian*/)
{
var sTxtFileModif = "Файл изменен. Сохранить?";
var sTxtClosePanel = "Закрыть панель вывода?";
var sTxtAu3Check = "Успешно: нет ошибок или предупреждений.";
}
else
{
var sTxtFileModif = "File is modified. Save?";
var sTxtClosePanel = "Do you want to close output panel?";
var sTxtAu3Check = "Success: no errors or warnings.";
}
// Проверяем, сохранен файл или нет, если нет - предлагаем сохранить или выходим
if (bModified)
{
if (AkelPad.MessageBox(hMainWnd, sTxtFileModif, WScript.ScriptName, 36 /*MB_ICONQUESTION|MB_YESNO*/) == 6 /*IDYES*/)
AkelPad.Command(4105 /*IDM_FILE_SAVE*/);
else
WScript.Quit();
}
// Проверяем, запущен ли плагин Log (для автоматического закрытия, если был не загружен и/или нет ошибок)
if (AkelPad.IsPluginRunning("Log::Output"))
nRunning = 1;
else
nRunning = 0;
// Запуск утилиты
if (pUtil == "TidySource")
{
if (pParams)
AkelPad.Call("Log::Output", 1, "\"" + TidySource + "\" \"" + pFile + "\" " + pParams);
else
AkelPad.Call("Log::Output", 1, "\"" + TidySource + "\" \"" + pFile + "\"");
// Если плагин не был загружен, предлагаем закрыть
if (nRunning == 0 && AkelPad.MessageBox(hMainWnd, sTxtClosePanel, "TidySource - " + WScript.ScriptName, 36 /*MB_ICONQUESTION|MB_YESNO*/) == 6 /*IDYES*/)
AkelPad.Call("Log::Output", 6);
// Посылаем команду переоткрыть файл
AkelPad.Command(4104 /*IDM_FILE_REOPEN*/);
}
else if (pUtil == "Au3Check")
{
if (pParams)
AkelPad.Call("Log::Output", 1, "\"" + Au3Check + "\" " + pParams + " \"" + pFile + "\"", "", '(?-s)^\s*"(.*)"\s*\((\d+),(\d+)\)', "/FILE=\1 /GOTOLINE=\2:\3", -1, -1, 8194);
else
AkelPad.Call("Log::Output", 1, "\"" + Au3Check + "\" \"" + pFile + "\"", "", '(?-s)^\s*"(.*)"\s*\((\d+),(\d+)\)', "/FILE=\1 /GOTOLINE=\2:\3", -1, -1, 8194);
// Получение кода выхода
while (GetExecState())
WScript.Sleep(100);
nExitCode = GetExecExitCode();
// Если плагин не был загружен и код выхода Au3Check равен 0, закрываем и сообщаем
if (nRunning == 0 && nExitCode == 0)
AkelPad.Call("Log::Output", 6);
AkelPad.MessageBox(hMainWnd, sTxtAu3Check, "Au3Check - " + WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
}
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=28999#p28999
function GetExecState()
{
var lpState;
var nState = 0;
if (lpState = AkelPad.MemAlloc(4 /*sizeof(DWORD)*/))
{
AkelPad.Call("Log::Output", 3, lpState);
nState = AkelPad.MemRead(lpState, 3 /*DT_DWORD*/);
AkelPad.MemFree(lpState);
}
return nState;
}
function GetExecExitCode()
{
var lpExitCode;
var nExitCode = 0;
if (lpExitCode = AkelPad.MemAlloc(4 /*sizeof(DWORD)*/))
{
AkelPad.Call("Log::Output", 3, 0, 0, 0, 0, lpExitCode);
nExitCode = AkelPad.MemRead(lpExitCode, 3 /*DT_DWORD*/);
AkelPad.MemFree(lpExitCode);
}
return nExitCode;
}