Scripts discussion (4)

Discuss and announce AkelPad plugins
  • Author
  • Message
YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

AZJIO wrote:YuS
я добавил рег.выр. для поиска с помощью FindReplaceEx.js

Code: Select all

QuotesRE:
1	"^  \[\d+, \d+, \d+, \d+:\d+\]"	"\0=(0,#AFE7B3,0)"
Но как бы добавить аналог меток типа

Code: Select all

"Бирюзовым" Call("Coder::HighLight", 2, "#00B096", 0, 1, 0, 11) Icon("%a\AkelFiles\Plugs\Coder.dll", 6)
только для результатов поиска, чтобы подсветить в строках где находится найденный текст.
Так FindReplaceEx.js умеет расставлять маркеры... не цветом, правда, а в поле с номерами строк. Нажатие на кнопку "Найти все...", делает доступным доп. меню, там интуитивно понятны названия.

Или можно использовать TextMarker.js, он умеет подсвечивать конкретный текст во всем документе, с помощью регэкспов тоже.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

YuS wrote:Нажатие на кнопку "Найти все...", делает доступным доп. меню, там интуитивно понятны названия. .
я надеялся что из моего вопроса станет понятно, что я именно так и делаю, ведь я говорю что у меня есть результат в консоли, как он там появился, ну не важно как, наверно нажатием "Найти все" с выбором "Показать лог, целые строки. Но самое теперь суть вопроса, в Notepad++ в этом логе всё подсвечено, номера строк, путь к файлу, заголовок поиска и подсвеченный искомый текст в строках, что можно видеть где он нашёл, соответствует ли это тому что хотелось в контексте содержимого строки. И получается либо нужно чтобы сам скрипт подсветил, либо сделать команду, выделив некоторый текст подсветить его в результатах поиска, а не в текущем документе.
Image

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Попробовал меню делать Menu_by_type.js, оказывается очень всё просто. Назначил на F8, так как F6 не переназначается.
Last edited by AZJIO on Wed Aug 14, 2019 2:42 pm, edited 1 time in total.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Для SortLines.js

Code: Select all

if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0419) //RU
{
  var sTxtCaption   = "Сортировка строк";
  var sTxtRange     = "Диапазон строк";
  var sTxtFrom      = "От";
  var sTxtTo        = "До";
  var sTxtLines     = "Строки:";
  var sTxtColumns   = "&Колонки:";
  var sTxtKeys      = "Сортировать по ключам";
  var sTxtKey1      = "Ключ &1 - По длине строки";
  var sTxtKey2      = "Ключ &2 - По содержимому";
  var sTxtRTL       = "Читать справа налево";
  var sTxtEntLine   = "Вычислять всю &строку";
  var sTxtDesc      = "&По убыванию";
  var sTxtIgCase    = "&Игнор регистр";
  var sTxtString    = "&Строка";
  var sTxtLocale    = "&По алфавиту";
  var sTxtNum       = "&По номерам";
  var sTxtSortAnd   = "Сортировать, и далее:";
  var sTxtRemoDuKey = "&Удалить строки с дубль-ключами";
  var sTxtExtrDuKey = "&Оставить строки только с дубль-ключами";
  var sTxtExtrUnKey = "Оставить строки с уникальными ключами";
  var sTxtNoSort    = "Не сортировать, но:";
  var sTxtReverse   = "&Обратный порядок строк";
  var sTxtCopyToCB  = "Результат в буфер обмена, не изменяя документ";
  var sTxtUsePlug   = "Использовать плагин &Format";
  var sTxtSort      = "Сортировать";
  var sTxtUndo      = "&Отменить"; 
  var sTxtRedo      = "&Вернуть";
  var sTxtNoRangeL  = "Нет диапазона строк.";
  var sTxtNoKey2    = "Нет диапазона колонок во 2-м ключе сортировки.";
}

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

AZJIO

Thank you very much for your translation.

SortLines.js
Added Russian translation.

Available also via AkelUpdater and here: http://akelpad.sourceforge.net/files/pl ... ts/KDJ.zip

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Скрипт Calculator.js при вызове имеет 2 кнопки, но обе просто закрывают скрипт. Что если либо через настройки в ini, либо хотя бы кнопками (3 шт закрытие, ок и отмена) задавать разное поведение, допустим после выделенного вставляем ответ, например 3+2 выделяем, жмём хоткей, потом Enter, получаем 3+2=5. Другой вариант - отправка в буфер обмена, в ini можно сделать флаг "без мессаги", чтобы сразу вставлял "=5" или в буфер, не показывая лишних окон. В буфер, если значение нужно для другого документа, но при этом не приходилось закрывать каждый раз окно и Ctrl+C, чтобы копировать. В качестве сигнала, что операция выполнена для нового значения можно вывести подсказку всплывающую в месте курсора, типа 3+2=5, при этом пользователь будет знать, что он уверенно нажал клавишу и в буфере новое значение.

Мне пришлось выполнить сложение чисел в пару десятках строк. При это мне пришлось сначала с помощью рег.выр. поставить плюсы между числами (в копии документа), а потом сложить, а результат перенести в оригинальный документ. И тут сразу идея, что если сделать формулу с помощью регулярных выражений, допустим формула для поиска (\d+) (\d+) (\d+) и формула для вычислений \1+\2+\3 = ${res}. Возможно это редкая разовая вещь.

https://pastebin.com/mDew9E43
Добавил изменение в Calculator.js, добавил вставку результата (ОК, Enter) и копирование в буфер обмена (Отмена, Esc)

https://pastebin.com/pnBKk75T - тут полностью изменил поведение, этот скрипт ищет числа в выделенном тексте и предлагает их сложить или умножить, разделить вычесть. Это полезно к примеру подсчитать чеки оплаты, таблицу, список, где заранее не стоит знак +, и чтобы просчитать в калькуляторе придётся либо копировать числа либо вставлять +

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Посмотрел скрипт CodePoster, там есть флаг -BR="<br>", это как я понимаю удобно при использовании без <pre>, но тогда было бы удобно заменить отступы в начале строки на  
Также вместо цвета в каждый тег лучше использовать классы и стили в заголовке, также цвет фона, шрифт добавить в общий для body. По умолчанию отключить подсветку ссылок, они в чёрной теме подсвечиваются стандартными цветами, ну или тогда копировать в том числе реальный цвет заданный в настройках AkelPad.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Пользуюсь FindReplaceEx.js но в Notepad++ сделали уже вместо мессаги, которую каждый раз надо закрывать вывод в результата в строку состояния окна поиска если ничего не найдено.

Ещё проблема, если закрываю AkelPad с открытым окном поиска скрипта FindReplaceEx, то во первых теряю сессию, так как документы закрываются, а окно нет и во вторых далее окно не реагирует на закрытие кнопкой закрытия окна, но реагирует если сделать это через меню "Файл - Выход".

При выделении многострочного текста он не попадает в строку поиска. В Notepad++ раньше переносы выглядели квадратами, сейчас они не показываются квадратами, но многострочный поиск работает
Пометить строки
Снять пометки строк
как в Notepad++, так и в описании "LineBoard-Rus.txt" данные пометки являются закладками, как и названия команд "bookmark". Было бы логично перевести их не как пометки, а как закладки, то есть "Установить закладки", "Снять закладки с найденных". У себя подправил FindReplaceEx_1049.lng.
sTxtCheckInSel = 'Отметить "В выделении" если есть выделение';
вроде раньше опция работала, сейчас нет. То есть выделяю текст, жму "Найти", флажок не ставиться на чекбокс "В выделении", и ищет по правилам текущего выбора (сначала или вверх или вниз).

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Пытаюсь разобраться со скриптом CreateDialog.js (автор KDJ), хотел чекбоксы оставить, вырезав всё остальное. Скрипт иногда перестаёт запускаться в случае ошибки, надо перезапустить AkelPad и, конечно, избавиться от ошибки. Отображение, клик, чтение состояния работает.

Code: Select all

// Вырезано всё оставив чекбокс... из скрипта-примера CreateDialog.js от KDJ
//
//
// Требуется в папке include: CreateDialog_functions.js

var oSys   = AkelPad.SystemFunction();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + AkelPad.GetInstanceDll(); // придумываем имя класса окна
var hDlg   = oSys.Call("User32::FindWindowW", sClass, 0); // Ищем это окно, FindWindowW возвращает дескриптор

if (hDlg) // Если окно с указанным классом найдено, то
{
  if (! oSys.Call("User32::IsWindowVisible", hDlg)) // если окно невидимое, то
    oSys.Call("User32::ShowWindow", hDlg, 8 /*SW_SHOWNA*/); // делаем видимым
  if (oSys.Call("User32::IsIconic", hDlg)) // если окно свёрнуто, то
    oSys.Call("User32::ShowWindow", hDlg, 9 /*SW_RESTORE*/); // разворачиваем

  oSys.Call("User32::SetForegroundWindow", hDlg); // делаем окно активным
}
else if (AkelPad.Include("CreateDialog_functions.js")) // иначе (если окно не найдено) если существует необходимый скрипт, то
{
  var hIcon      = oSys.Call("User32::LoadImageW", AkelPad.GetInstanceDll(), 101, 1 /*uType=IMAGE_ICON*/, 0, 0, 0x40 /*LR_DEFAULTSIZE*/); // загружает иконку, возвращая дескриптор
  var nCounter   = 0; // счётчик диалоговых окон
  // var IDCANCEL   = 2; // Exit в меню
  var IDCHECKB   = 2001; // идентификатор чекбокса


  if (AkelPad.WindowRegisterClass(sClass)) // если класс зарегистрирован
  {
    // Разрешить запуск других скриптов
    AkelPad.ScriptNoMutex();

    CreateDialog(false, true, AkelPad.GetMainWnd()); // Функция создания окна
    AkelPad.WindowUnregisterClass(sClass); // разрегестрировать класс после закрытия окна, то есть по завершении предыдущей функции
  }

  oSys.Call("user32::DestroyIcon", hIcon); // Удалить дескриптор значка, освободив ресурсы
}

function CreateDialog(bBox, bModeless, hParent)
{
  var nTimerID = ++nCounter;
  var aDlg     = [];
  var nResult;
  var hFocus;

  aDlg.Modeless = bModeless;
  aDlg.Title    = "[" + nTimerID + "] " + (bBox ? "Dialog box " : "Dialog window ") + (bModeless ? "modeless" : "modal"); // Заголовок окна
  aDlg.Style    = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; // Стиль окна
  aDlg.Parent   = hParent; // Родитель окна (блокировать доступ к родителю или закрывать при закрытии родителя)
  aDlg.Callback = DialogCallback; // Имя функции обратного вызова принимающая события окна
  aDlg.Icon     = hIcon; // дескриптор иконки окна ранее полученный
  aDlg.X        = 20; // X-координата окна
  aDlg.W        = 650; // ширина окна
  aDlg.H        = 432; // высота окна
  aDlg.PosPar   = 3;
  aDlg.CtlFirst = IDCHECKB; // первый элемент управления
  aDlg.CtlStyle = WS_VISIBLE;

  if (bBox) // если флаг бокс-окно
  {
    aDlg.PosPix   = true;
    aDlg.CtlFontN = "MS Shell Dlg";
  }
  else
  {
    aDlg.Class   = sClass;
    aDlg.SizeClt = true;
    aDlg.CtlFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
  }

  // Задаёт характеристики чекбокс (положения и размеров, текст, стиль), чтобы потом создать функцией InitDialog()
  aDlg[IDCHECKB]  = {X:  20, Y:  30, W:  110, H:  16, Title: "Чекбокс, кликни",   Style: WS_TABSTOP | BS_AUTOCHECKBOX};

  if (bBox)
  {
    if (bModeless)
    {
      if (CreateDialogBox(aDlg))
      {
        if (nTimerID == 1)
          AkelPad.WindowGetMessage(0x2 /*WGM_NOKEYSEND*/);
      }
    }
    else
    {
      nResult = CreateDialogBox(aDlg);
    }
  }
  else
  {
    if (CreateDialogWindow(aDlg, 1))
    {
      if (! bModeless)
        oSys.Call("user32::EnableWindow", aDlg.Parent, 0);
      if (nTimerID == 1)
        AkelPad.WindowGetMessage(0x2 /*WGM_NOKEYSEND*/);
    }
  }

  // Функция обратного вызова принимающая события
  function DialogCallback(hWnd, uMsg, wParam, lParam)
  {
    if (uMsg == 1 /*WM_CREATE*/) // если пришло сообщение о создании окна
    {
      aDlg.HWND = hWnd; // Дописываем дексриптор
      CreateDialogWindow(aDlg, 2, hWnd);
      InitDialog(); // Формирует элементы в окне
      hFocus = aDlg[IDCHECKB].HWND; // Указываем дескриптор в фокусе
    }

    else if (uMsg == 272 /*WM_INITDIALOG*/)
      InitDialog(); // Формирует элементы в окне

    else if ((uMsg == 6 /*WM_ACTIVATE*/) && (wParam == 0 /*WA_INACTIVE*/) && (! bBox)) // если пришло сообщение что окно стало активным, то
      hFocus = oSys.Call("User32::GetFocus"); // Получить дескриптор элемента управления, имеющий фокус
  
    else if ((uMsg == 7 /*WM_SETFOCUS*/) && (! bBox))
      oSys.Call("User32::SetFocus", hFocus); // Устанавливаем фокус указанному дескриптору элемента управления


    if ((uMsg == 78 /*WM_NOTIFY*/) && 0) // если пришло уведомление от окна (добавил "&& 0", чтобы заблокировать)
    {
      if (AkelPad.MemRead(lParam + (_X64 ? 16 : 8), 3 /*DT_DWORD*/) == -2 /*NM_CLICK*/) // если событие клика
      {
        if (wParam == IDLW) // Если события от ссылки (уже не придёт)
        {
          AkelPad.SendMessage(aDlg[IDSBAR].HWND, 5 /*WM_SIZE*/, 0, 0); // статус бару сообщение что окно изменило размер
        }
      }
    }

    else if (uMsg == 273 /*WM_COMMAND*/) // Сообщение выполняется при клике на элементах окна
    {
      var nLowParam = LoWord(wParam); // младшее слово содержит ID элемента управления

      if (nLowParam == IDCHECKB) // если событие клик на чекбоксе, то
        AkelPad.MessageBox(hWnd, 'Клик на чекбоксе, состояние  = ' + AkelPad.SendMessage(aDlg[IDCHECKB].HWND, 240 /*BM_GETCHECK*/, 0, 0), aDlg.Title, 0x40 /*MB_ICONINFORMATION*/);
      // else if (nLowParam == IDCANCEL) // если событие IDCANCEL (Exit в меню), то
        // oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, nLowParam, 0); // высылаем окну команду закрытия
    }

    else if ((uMsg == 275 /*WM_TIMER*/) && 0) // если событие по таймеру (добавил "&& 0", чтобы заблокировать)
    {
      AkelPad.SendMessage(aDlg[IDPB].HWND, 1029 /*PBM_STEPIT*/, 0, 0); // шаг прогресса
      SetTextSBAR(AkelPad.SendMessage(aDlg[IDPB].HWND, 1032 /*PBM_GETPOS*/, 0, 0));
    }

    else if (uMsg == 16 /*WM_CLOSE*/) // если событие закрытия окна, то
    {
      if ((! bBox) && (! bModeless))
      {
        oSys.Call("user32::EnableWindow", aDlg.Parent, 1);
        oSys.Call("User32::SetForegroundWindow", aDlg.Parent);
      }

      if (bBox && (! bModeless))
        oSys.Call("User32::EndDialog", hWnd, wParam);
      else
        oSys.Call("User32::DestroyWindow", hWnd);
    }

    else if (uMsg == 2 /*WM_DESTROY*/) // если событие уничтожения окна, то
    {
      if (nTimerID == 1)
        oSys.Call("User32::PostQuitMessage", 0);
    }

    return 0;
  }

  function InitDialog()
  {
    var i;

    //Button
    AkelPad.SendMessage(aDlg[IDCHECKB].HWND, 241 /*BM_SETCHECK*/, 1 /*BST_CHECKED*/, 0);

  }

}

// вытаскивает младшее слово из двойного слова
function LoWord(nDwNum)
{
  return nDwNum & 0xFFFF;
}

Добавил комментарии в скрипт.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

В скрипте CreateDialog.js (автор KDJ) есть типы окна:
Windows Modal
Windows Modeless
Box Modal
Box Modeless
Ну "модальный/не модальный" я в курсе, модальный запрещает доступ к родителю, не модальный - разрешает. А вот между Windows и Box в чём разница?

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

YuS
Как то у нас был диалог на счёт Tidy, что он в консоль с 10-к лишних ложных строк кидает, и как было бы не плохо перед выводом сделать фильтр для обработки текста. В итоге получилось.

Code: Select all

var oSys = AkelPad.SystemFunction();
var hWnd = GetOutputWindow() // получить дескриптор окна консоли
var sLogText = GetText(hWnd) // получить текст окна

var sEditFile = AkelPad.GetEditFile(0);
var sFileExt = AkelPad.GetFilePath(sEditFile, 4 /*CPF_FILEEXT*/ );

switch(sFileExt.toLowerCase()) {
	case "js": // для теста
	case "htm":
	case "html":
		sLogText = sLogText.replace(/line \d+ column \d+ - Warning: <img> lacks "alt" attribute[\r\n]+/g, '')
		sLogText = sLogText.replace(/line \d+ column \d+ - Warning: <table> lacks "summary" attribute[\r\n]+/g, '')
		// WScript.Echo(sLogText);
		AkelPad.Call("Log::Output", 4, sLogText, -1, 0); // заменить текст в консоли
		break;
};

function GetOutputWindow() {
	var lpWnd;
	var hWnd = 0;

	if(lpWnd = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(HWND)*/ )) {
		AkelPad.Call("Log::Output", 2, lpWnd);
		hWnd = AkelPad.MemRead(lpWnd, 2 /*DT_QWORD*/ );
		AkelPad.MemFree(lpWnd);
	}
	return hWnd;
}

function GetText(hWnd) {
	var nTextLen = SendMessage(hWnd, 14 /*WM_GETTEXTLENGTH*/ , 0, 0);
	var sText = "";
	var lpText;

	if(nTextLen) {
		lpText = AkelPad.MemAlloc(nTextLen * 2 + 2);
		SendMessage(hWnd, 13 /*WM_GETTEXT*/ , nTextLen + 1, lpText);
		sText = AkelPad.MemRead(lpText, 1 /*DT_UNICODE*/ );
		AkelPad.MemFree(lpText);
	}

	return sText;
}

function SendMessage(hWnd, uMsg, wParam, lParam) {
	return oSys.Call("User32::SendMessage" + _TCHAR, hWnd, uMsg, wParam, lParam);
}


В Log-Rus.txt есть пример получения дескриптора консоли, а значит остаётся найти функции чтения вставки. Поиск в коллекции WM_GETTEXT конечно дал результат, из скрипта KDJ вытащил сменил захваты текста с диалогов на SendMessage. Добавил вставку в консоль из справки ("Log::Output", 4). И в итоге вот оно. Добавил если мы находимся в HTML документе, то после Tidy для HTML вызываем команду чистки/обработки/фильтра лога и он вставляет так как мы хотим видеть.

Всё оказывается ещё проще:

Code: Select all

// AZJIO, 08.09.2019
// Фильтр консоли. Вытащить текст, удалить ненужные фрагменты текста и вставить обратно

var hWndOutput = GetOutputWindow() // получить дескриптор окна консоли
if(!hWndOutput) {
	WScript.Echo("Консоль закрыта, нечего обрабатывать");
	WScript.Quit();
};

AkelPad.SetEditWnd(hWndOutput); // устанавливает консоль окном редактирования
sLogText = AkelPad.GetTextRange(0, -1); // получает текст консоли
AkelPad.SetEditWnd(0); // возвращает окно редактирования
if(!sLogText) {
	WScript.Echo("Консоль пуста, нечего обрабатывать");
	WScript.Quit();
};

var sEditFile = AkelPad.GetEditFile(0);
var sFileExt = AkelPad.GetFilePath(sEditFile, 4 /*CPF_FILEEXT*/ );

switch(sFileExt.toLowerCase()) {
	case "js": // для теста
	case "htm":
	case "html":
		sLogText = sLogText.replace(/line \d+ column \d+ - Warning: <img> lacks "alt" attribute[\r\n]+/g, '')
		sLogText = sLogText.replace(/line \d+ column \d+ - Warning: <table> lacks "summary" attribute[\r\n]+/g, '')
		// WScript.Echo(sLogText);
		AkelPad.Call("Log::Output", 4, sLogText, -1, 0); // заменить текст в консоли
		// AkelPad.Call("Coder::HighLight", 2, "#FFFFFF", "#F54E52", 0, 0, -1, "unexpected", -1) // не работает на консоль
		// AkelPad.Call("Log::Output", 4, "", -1, 0); // очистить текст в консоли
		if(!sLogText) {
			AkelPad.Call("Log::Output", 6);
		}; // закрываем консоль если нет вывода
		break;
};

function GetOutputWindow() {
	var lpWnd;
	var hWnd = 0;

	if(lpWnd = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(HWND)*/ )) {
		AkelPad.Call("Log::Output", 2, lpWnd);
		hWnd = AkelPad.MemRead(lpWnd, 2 /*DT_QWORD*/ );
		AkelPad.MemFree(lpWnd);
	}
	return hWnd;
}
Last edited by AZJIO on Wed Oct 09, 2019 6:52 pm, edited 3 times in total.

Offline
Posts: 171
Joined: Thu Dec 01, 2011 11:15 pm
Location: Россия

Post by LonerD »

DV
KeySubst.js на последней Windows 10 ведёт себя неадекватно, неправильные символы отображает.
Можете проверить, подтвердить, подправить?

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

LonerD wrote:DV
KeySubst.js на последней Windows 10 ведёт себя неадекватно, неправильные символы отображает.
Можете проверить, подтвердить, подправить?
Может скажешь конкретно с какого на какой язык и какие символы. У меня бегло пишу "привет" вводит "ghbdtn", то есть RU->EN работает. Win10x64 18??

Кстати, начал переводить скрипты и встретился твой скрипт IndentsToTabs.js, я буквально на днях сделал на AutoIt3 для AkelPad такое конвертирование отступов, но у меня фишка - определение числа пробелов на 1 таб определяется автоматически. Я экспортировал отступы в массив, получил их длины в массив, сравнил в цикле разницу между неодинаковыми отступами получил допустим десяток и более значений. Нужно вычислить какое число преобладает, создаём именованный массив и при каждом создании ключа если он там уже есть то делаем инкремент +1 получаем массив с числом дублей, определяем ключ с наибольшим значением, его имя и есть значение для замены. Исключение: если отступ 1 пробел, то это определяется как ошибка.

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

AZJIO wrote:YuS
Как то у нас был диалог на счёт Tidy, что он в консоль с 10-к лишних ложных строк кидает, и как было бы не плохо перед выводом сделать фильтр для обработки текста.
Честно говоря, уже не помню о чем там у нас шла речь, а вникать заново - лень. :)
Но хорошо, что получилось решить вопрос...
AZJIO wrote: Всё оказывается ещё проще:
Так, со временем, всё покажется простым... обычно, сложным кажется всё новое. Просто, ни у кого ранее не возникало потребности, наверное.
Тем и хорош AP, что многие хотелки можно реализовать, не "воруя" свободное время у автора. :)

Offline
Posts: 171
Joined: Thu Dec 01, 2011 11:15 pm
Location: Россия

Post by LonerD »

AZJIO wrote:работает
Спасибо за ответ. Пересохранил файл скрипта в UTF-8, вроде корректно теперь работает.
До этого был сохранён в UTF-8 without BOM. Вчера обнаружил, что вместо некоторых букв и в RU, и в UKR и в ENG выводились неправильные символы - $# и другие. Не понял, в чём причина, скриптом последний раз пользовался давно (несколько месяцев,... год назад), но вроде всё работало правильно именно without BOM, ведь именно в таком виде я когда-то проверял и добавлял скрипт себе в сборку.
Win10 Home SL Eng x64, сейчас билд 18362.329, система не переставлялась уже года два-три. Может, что-то в региональных настройках или в реестре менял... не знаю, что могло повлиять.
Post Reply