Scripts discussion (4)

Discuss and announce AkelPad plugins
  • Author
  • Message
DV
Offline
Posts: 1291
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

CommandPalette.js
Версия 0.4:
- новое поколение скрипта с существенно переработанной структурой файла "CommandPalette.lng";
- теперь "CommandPalette.lng" содержит секции [AkelPad], [Plugins], [Scripts] и [Exec], как было предложено AZJIO;
- в связи с чем скрипт и сам файл "CommandPalette.lng" стали похожи на справочник :) ;
- а также: теперь ширина окна Command Palette подстраивается под выбранный шрифт.

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

Post by AZJIO »

Попробовал заменить табуляцию в начале строк, не получилось.

Code: Select all

var flag = 0x00480001; // FRF_DOWN|FRF_SELECTION|FRF_REGEXP
var sSelText = AkelPad.GetSelText();
if (sSelText == "") {
	flag = 0x00280001; // FRF_DOWN|FRF_BEGINNING|FRF_REGEXP
}

//......
		case 107:
			var nTabSize = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/ , 52 /*FI_TABSTOPSIZE*/ , 0);
			var sSpace = ""
			var res = 0
			// sSpace = "                                        ".substr(0, nTabSize);
			for (var i = 1; i <= nTabSize; i++) {
				sSpace += " ";
			};
			BeginUndoAction()
			do {
				res = AkelPad.TextReplace(0, "^([\t ]*)\t", "\1" + sSpace, flag, 0x1 /*RRF_ALL*/ );
				// res = AkelPad.TextReplace(0, "(?<=[\r\n])([ ]*)\t", "\1" + sSpace, flag, 0x1 /*RRF_ALL*/ );
				// res = AkelPad.TextReplace(0, "^[ ]*\K\t", sSpace, flag, 0x1 /*RRF_ALL*/ );
			} while (res)
			StopUndoAction()
			break;


Code: Select all

function Tab2SpaceBeginning() {
	// var re = /^[\t ]*\K\t/gm;
	// var re = /^([\t ]*?)\t/gm;
	var re = new RegExp("^([\t ]*?)\t", "gm");
	// var sSpace = "                    ";
	var sSpace = "    ";
	if (flag==0x00280001) {
		sSelText = AkelPad.GetTextRange(0, -1);
		do {
			sSelText = sSelText.replace(re,  "$1" + sSpace);
		} while (re.test(sSelText))
		AkelPad.SetSel(0, -1);
		AkelPad.ReplaceSel(sSelText);
	} else {
		do {
			sSelText = sSelText.replace(re,  "$1" + sSpace);
		} while (re.test(sSelText))
		AkelPad.ReplaceSel(sSelText);
	}
}

так как у регвыра нет возврата назад, или есть но я не знаю как, но он находит одну партию и если запустить повторно, то опять находит, но уже второй уровень табов, поэтому я сделал цикл, если ещё не всё удалено и тест дает true, то опять сделать замены, что равносильно запустить повторно, до тех пор пока не удалит все. Но почему то тест даёт false и не делает повторных замен, причину не пойму.
получилось без "g" - глобального поиска

Разгадал проблему. При наличии флага "g" объект запоминает позицию, и когда выполнены замены позиция в конце текста и функция test ищет от конца и ничего не находит. Я добавил пересоздание объекта регвыра и всё заработало с "g". А причина того что я не мог отказаться от "g" в том что искать всегда от начала не экономично, в данном случае пересоздание объекта имеет меньше потерь.

Code: Select all

		do {
			sSelText = sSelText.replace(re, "$1" + sSpace);
			re = new RegExp("^([\t ]*?)\t", "gm");
		} while (re.test(sSelText))
Last edited by AZJIO on Sat Nov 30, 2019 3:10 pm, edited 2 times in total.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

AZJIO wrote:Попробовал заменить табуляцию в начале строк, не получилось.
Имеющиеся рассматривали?
TabsToSpaces.js.
TabsToSpaces_mod.js
SpacesToTabs.js

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

Post by AZJIO »

opk44
Я как раз начал просматривать имеющиеся за минуту до вашего сообщения по критерию "пробел". Там есть что посмотреть, потому что я в комплексе хотел сделать несколько пунктов по работе с пробелами - вот
Ваши предложения не совсем подходящие, потому что заменяют табы не только в начале строки как я хочу, но и по тексту. То есть в программном коде могут быть явно указаны пробелы и табы, а те что в начале строки не могут быть ими и являются гарантированными отступами форматирования текста для удобства чтения.
И, кстати, тестируя функции я разгадываю их поведение, о чём я написал выше, не зря я мучил это регвыр пока не понял что он сохраняет позицию.

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

Post by DV »

CommandPalette.js
Версия 0.5:
- Окно Command Palette использует (наследует) цветовую тему окна редактирования AkelPad.

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

Post by DV »

CommandPalette.js
Версия 0.5.1:
- Исправлено: команда 4102 (File: New Window) не срабатывала.

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

Post by AZJIO »

Code: Select all

var nSelStart = AkelPad.GetSelStart();
var nSelEnd = AkelPad.GetSelEnd();
if (nSelStart !== nSelEnd) {
	WScript.Echo("не выделяйте текст.");
	WScript.Quit();
}
var pClipboardText = AkelPad.GetClipboardText(true); // можно без true
if (/->\d+/g.test(pClipboardText)) {
	// var re = new RegExp('^->(\d+)', 'm');
	// num = re.exec(pClipboardText);
	var num = pClipboardText.match(/^->(\d+)/m);
	num = parseInt(num[1]);
	// WScript.Echo(nSelStart + '\n' + num[1]);
	// WScript.Echo(typeof(nSelStart) + '\n' + typeof(num));
	AkelPad.SetSel(nSelStart, num, 0x008 /* AESELT_LOCKSCROLL */ );
	AkelPad.SetClipboardText('');
} else {
	AkelPad.SetClipboardText('->' + nSelStart);
}
- тестовый пример выделения текста в 2 шага. Перед тем как добавить его в коллекцию, есть идеи улучшения? Скрипт работает используя буфер обмена, хотелось бы без этого, в файл тоже не хотелось бы писать.
1. Ставим курсор и вызываем скрипт - запоминает позицию. Нельзя пользоваться буфером обмена до 2-го шага.
2. Ставим курсор в другую позицию и вызываем скрипт - происходит выделение. Удобно при выделение больших кусков текста с использованием прыжков по закладкам.

добавил "не прокручивать текст"
можно усложнить, добавив проверку выделенного с вопросом расширить или сузить выделение.
Нашёл аналог через сохранение в файл SelPoint.js

Offline
Posts: 4
Joined: Sat Dec 21, 2019 1:32 am

TranslateWithGoogleAPI.js

Post by Krtec »

Не работает скрипт TranslateWithGoogleAPI. Сообщает: «Unable to retrieve data (Unknown)!»
Проверил адрес запроса из скрипта

Code: Select all

http://translate.google.com/translate_a/t?client=qlt&langpair=auto/ru&q=translate
в ответ получил текстовый двухбайтовый файл, состоящий из двух кавычек. *(Ошибка в параметрах, см. ниже)

Попробовал заменить адрес запроса в скрипте таким:

Code: Select all

var url = "http://translate.googleapis.com/translate_a/single";
var params = "dt=t&client=gtx&sl=" + langSource + "&hl" + langTarget + "&tl" + langTarget + "&q=" + selection;
Тогда при использовании получаю уже другое сообщение: «There is no error output object, possibly changed API format»

Может кто-нибудь поможет в восстановлении работоспособности скрипта?
Авось автор ещё бывает на форуме...

Добавлено

*Ошибся в параметрах когда проверял адрес из скрипта — «auto|ru», а не «auto/ru».
На правильный запрос через браузер приходит текстовый файл с переводом.
Похоже проблема локальная, вопрос — как выявить?

Akelpad Version: 4.9.8 (x86)
TranslateWithGoogleAPI.js Version: 3.1 (2016.02.15)
Win7 SP1 32bit

Добавлено

Проверил Translator.js — работает, но слишком он монструозный для меня.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Krtec
1. В сводном архиве VladSh.zip находится версия скрипта 3.2

Code: Select all

// Version: 3.2 (2016.09.10)
в ней откорректированы строки 34,35,48.
2. Обновлять скрипты (из коллекций VladSh, KDJ, Instructor, Infocatcher) удобнее при помощи AkelUpdater
3. Не в силах понять, каким образом "монструозность" скрипта является препятствием для его использования.
+ работает с 3-мя сервисами вместо одного;
+ интерактивный выбор языка и направления перевода;
+ отдельное окно (с возможностью редактирования) для перевода вместо клипборда.
Ну а то что "слишком большой", так вам же его не кормить.

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

Post by YuS »

opk44 wrote: + отдельное окно (с возможностью редактирования) для перевода вместо клипборда.
Добавлю ещё плюс к этому, возможность запуска без отображения родительского окна (то бишь без AP)

Code: Select all

"AkelPad.exe" /NewInstance /MainClass("MyAkelPad4(%d)") /Show(0) /Call("Scripts::Main", 1, "Translator.js", "auto ru") /Quit

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

Post by VladSh »

opk44 wrote: 3. Не в силах понять, каким образом "монструозность" скрипта является препятствием для его использования.
+ работает с 3-мя сервисами вместо одного;
+ интерактивный выбор языка и направления перевода;
+ отдельное окно (с возможностью редактирования) для перевода вместо клипборда.
Потому что куча кода незачем. Да и все эти окна неудобны. В моём скрипте можно вывести результат в MsgBox и выделенный английский текст при нажатии "Yes" заменится на переведённый, либо жёстко задать resType=0 и произойдёт то же самое без диалога.
Короче, на вкус и цвет... Я не люблю из пушки по воробьям, и где это можно оставляю воробьёв в покое.

Offline
Posts: 4
Joined: Sat Dec 21, 2019 1:32 am

Post by Krtec »

opk44
Спасибо большое!
А я всегда проверял по ссылке в скрипте последнюю версию, оказывается последняя версия может быть не опубликована в профильной теме.

Монструозность как раз в массе не нужного мне функционала, нужно просто перевод выделенного текста в консоли и всё.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

VladSh
1. Но скрипт-то подновить в теме вы не забудете?
2. (оффтоп) к слову о воробьях. Давайте не забудем и о синичках. Камрады! На дворе холодно и голодно, так что не забываем регулярно проверять наличие семечек в кормушках!

Offline
Posts: 4
Joined: Sat Dec 21, 2019 1:32 am

TranslateWithGoogleAPI.js

Post by Krtec »

Для себя слегка модифицировал скрипт TranslateWithGoogleAPI, чтобы показывались варианты перевода слова. Может кому-то пригодится.

В версии 3.2 (2016.09.10)
Строку 35 заменить на

Code: Select all

var params = "client=qlt&dt=bd&dt=t&dj=1&sl=" + langSource + "&tl=" + langTarget + "&q=" + selection;
Строку 48 заменить на

Code: Select all

	var trns = "";
	if(resultObject['sentences']) {
		trns = trns + resultObject['sentences'][0]['trans'];
		}
	var dct = "";
	if(resultObject['dict']) {
		for(var i = 0; i < resultObject['dict'].length; i++) {
			var str = "";
			for(var j = 0; j < resultObject['dict'][i]['terms'].length; j++) {
				str += resultObject['dict'][i]['terms'][j] + "; ";
				}
			dct = dct + '\n' + resultObject['dict'][i]['pos'] +" :: " + str;
			}
		}
resultText = trns + dct;
Естественно при такой модификации проблематично будет использовать замену выделенного слова переводом (resType 0).

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

Post by AZJIO »

Krtec
QTranslate удобная, у меня постоянно в автозагрузке. Там есть хоткей замены выделенного переводом. Хоть в браузере ещё есть "Mate Translate", всё равно пользуюсь "QTranslate". Плюсом как отсутствующую фичу можно было бы сделать перевод файлов в папке, мне приходилось писать это автоматизацией окна, а в остальном много удобств, чёрный стиль, настройки шрифта, отображаемых сервисов, обратный перевод и т.д.
Post Reply