Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Продолжаем :)
LinesFilter_mod2.js
Добавлен подхват выделенного текста, если в выделении нет переводов строки.

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Infocatcher,
Нет, именно с BOM, без BOM кодировка не определится.
Ясно, я не правильно понял это:
Вроде бы, сейчас AkelPad сам читает файлы скриптов, потому как wscript.exe не понимает UTF-8 с BOM, тогда как такие скрипты можно запускать.
Сохранил в utf-16le (из расчёта, что 9* винды не встретятся), дополню "не латинскими" сущностями, погоняю, посмотрим :).

Пока по обновлённому скрипту такой момент:
Если закодировать выше приведённую ссылку вида:

Code: Select all

http://ru.wikipedia.org/wiki/Рекорд_мира_по_прыжкам_в_высоту_(мужчины)
в:

Code: Select all

http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D0%BE%D1%80%D0%B4_%D0%BC%D0%B8%D1%80%D0%B0_%D0%BF%D0%BE_%D0%BF%D1%80%D1%8B%D0%B6%D0%BA%D0%B0%D0%BC_%D0%B2_%D0%B2%D1%8B%D1%81%D0%BE%D1%82%D1%83_(%D0%BC%D1%83%D0%B6%D1%87%D0%B8%D0%BD%D1%8B)
Получается валидная ссылка.

А если вида, как я привёл выше:

Code: Select all

ftp://primer.servera.ru/VIDEO/+Uploaded/P.S. Я люблю тебя - P.S. I Love You (2007, DVDRip).avi
в:

Code: Select all

ftp://primer.servera.ru/VIDEO/+Uploaded/P.S.%20%D0%AF%20%D0%BB%D1%8E%D0%B1%D0%BB%D1%8E%20%D1%82%D0%B5%D0%B1%D1%8F%20-%20P.S.%20I%20Love%20You%20(2007,%20DVDRip).avi
Ссылка получается не валидная (550 ошибка - файл не сушествует)
Вот как выглядит валидная:

Code: Select all

ftp://primer.servera.ru/VIDEO/+Uploaded/P.S.%20%DF%20%EB%FE%E1%EB%FE%20%F2%E5%E1%FF%20-%20P.S.%20I%20Love%20You%20(2007,%20DVDRip).avi

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

Post by Infocatcher »

Deim0s
Ссылка получается не валидная (550 ошибка - файл не сушествует)
Это сервер получается не валидный – UTF-8 не понимает. :D

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Infocatcher
Да :D, таких полно к сожалению, вот тут бы подобие выше обсуждаемой опции, решило бы проблемы (наверное :) ?) .

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

Post by Infocatcher »

Deim0s
Ну, допустим, функция для перекодирования уже есть, получить "%" + hex-код – не проблема, но нужно знать, какие из символов следует кодировать.
Интересно, на win 98 encodeURI() в какой кодировке работает? :D Впрочем, не думаю, что будет очень страшно, если там не заработает – уже на win 2000 JScript не умеет заменять на функции и не понимает кое-какие фишки регулярных выражений. А то можно было бы закодировать встроенным методом, а потом обработать пары %xx%xx.

[Upd]
А, нет, все равно пробел (%20) кратко кодируется.

[Upd – 2]
В общем, все работает, но нужно знать диапазон символов, которые следует кодировать.
Хотя и тут можно схитрить – прогнать весь юникод через encodeURI() и посмотреть, что кодируется, а что – нет.

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Infocatcher,
...но нужно знать, какие из символов следует кодировать.
Получается, если не в utf-8, все не латинские символы кодируются в cp1252 (или ISO-8859-1?) по таблице.

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

Post by Infocatcher »

прогнать весь юникод через encodeURI() и посмотреть, что кодируется, а что – нет.
Вот так получается:

Code: Select all

var shouldEnc = [];
var buggy = [];
for(var i = 0; i < 0x10000; i++) {
	var chr = String.fromCharCode(i);
	try {
		if(encodeURI(chr) != chr)
			shouldEnc.push(i);
	}
	catch(e) {
		buggy.push(i);
	}
}
var shouldEncCleared = [];
for(var i = 0, l = shouldEnc.length; i < l; i++) {
	var n = shouldEnc[i];
	if(
		i
		&& n - 1 == shouldEnc[i - 1]
		&& n + 1 == shouldEnc[i + 1]
	) {
		if(shouldEncCleared[shouldEncCleared.length - 1] != "-")
			shouldEncCleared.push("-");
	}
	else
		shouldEncCleared.push(n);
}
ReplaceSel(shouldEncCleared.join("\n"));


encodeURI:
0
-
32
34
37
60
62
91
-
94
96
123
-
125
127
-
55295
57344
-
65535

encodeURIComponent:
0
-
32
34
-
38
43
44
47
58
-
64
91
-
94
96
123
-
125
127
-
55295
57344
-
65535

Еще есть смысл кидать ошибки

55296
-
57343



[Upd]
Обновил: converter-test.js
С параметром -codePage=1251 должно кодировать ссылки в windows-1251.

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Infocatcher,
С параметром -codePage=1251 должно кодировать ссылки в windows-1251.
Кодирует. Только аргументы в коментах перепутаны, наверное наоборот:

Code: Select all

-mode=1  - encode
-mode=2  - decode
Потомучто кодирует с аргументом -mode=1.
Теперь бы ещё раскодировать :).

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

Post by Infocatcher »

Только аргументы в коментах перепутаны
А ведь они не только там перепутаны. Ох уж эта копипаста. :)

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

Post by Infocatcher »

Infocatcher wrote:а потом угадывать кодировку:

Code: Select all

ftp://primer.servera.ru/VIDEO/+Uploaded/P.S. ß ëþáëþ òåáÿ - P.S. I Love You (2007,VDRip).avi
Ага, при копировании из неюникодных программ после вставки в AkelPad иногда получаются аналогичные символы. При этом помогает «Ctrl+Shift+V, Ctrl+Shift+Ins – вставить текст как ANSI».
Соответственно, там есть какой-то алгоритм. :D
Даже можно скопировать в AkelPad, вставить в такую программу, снова скопировать и Ctrl+Shift+V в AkelPad.

P.S. За таким поведением замечен AnVir Task Manager.

P.P.S. Какой-то алгоритм:
AkelPad-4.5.1-src.zip\AkelEdit\AkelEdit.c
BOOL AE_EditPasteFromClipboard(AKELEDIT *ae, BOOL bAnsi)
=>

Code: Select all

void AE_ReplaceSelAnsi(AKELEDIT *ae, int nCodePage, const char *pText, DWORD dwTextLen, int nNewLine, BOOL bColumnSel, AECHARINDEX *ciInsertStart, AECHARINDEX *ciInsertEnd)

{
  wchar_t *wszText;
  DWORD dwUnicodeLen;

  if (dwUnicodeLen=MultiByteToWideChar(nCodePage, 0, pText, dwTextLen, NULL, 0))
  {
    if (dwTextLen == (DWORD)-1) dwUnicodeLen-=1;

    if (wszText=(wchar_t *)AE_HeapAlloc(NULL, 0, (dwUnicodeLen + 1) * sizeof(wchar_t)))
    {
      MultiByteToWideChar(nCodePage, 0, pText, dwTextLen, wszText, dwUnicodeLen + 1);
      AE_ReplaceSel(ae, wszText, dwUnicodeLen, nNewLine, bColumnSel, ciInsertStart, ciInsertEnd);

      AE_HeapFree(NULL, 0, (LPVOID)wszText);
    }
  }
}

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

Post by Infocatcher »

Infocatcher wrote:Какой-то алгоритм:
Только у нас другой случай – вместо EB FE E1 мы получаем 00 EB 00 FE 00 E1.

Странные шаманства с размерами буферов :lol:, но они делают вид, что работают: converter-test.js.

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

Post by Infocatcher »

goToLongestLine.js
Добавлено временное отключение переноса по словам на время поиска самой длинной строки (иначе ничего не работает :)).

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Infocatcher,
converter-test.js
Вроде :) всё исправно работает.
Итого получилось:

Code: Select all

-"Текст > URI (UTF-8)" Call("Scripts::Main", 1, "converter.js", `-mode=1 '-type="URI"'`)
-"Текст > URI (ANSI)" Call("Scripts::Main", 1, "converter.js", `-mode=1 '-type="URI"' -codePage=1251`)
-"Текст > URI Component (UTF-8)" Call("Scripts::Main", 1, "converter.js", `-mode=1 '-type="URIComponent"'`)
-"Текст > URI Component (ANSI)" Call("Scripts::Main", 1, "converter.js", `-mode=1 '-type="URIComponent"' -codePage=1251`)


-"URI (UTF-8) > Текст" Call("Scripts::Main", 1, "converter.js", `-mode=2 '-type="URI"'`)
-"URI (ANSI) > Текст" Call("Scripts::Main", 1, "converter.js", `-mode=2 '-type="URI"' -codePage=1251`)
-"URI Component (UTF-8) > Текст" Call("Scripts::Main", 1, "converter.js", `-mode=2 '-type="URIComponent"'`)
-"URI Component (ANSI) > Текст" Call("Scripts::Main", 1, "converter.js", `-mode=2 '-type="URIComponent"' -codePage=1251`)
Можно коротенько, про аргументы: -1 - current и -2 - don't change?

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

Post by Infocatcher »

Deim0s wrote:Можно коротенько, про аргументы: -1 - current и -2 - don't change?
При -1 берется кодировка текущего файла (AkelPad.GetEditCodePage(0)), а при -2 конвертер кодировок просто ничего не делает.

Кстати, при декодировании ссылок в любом случае сначала пробуется встроенный метод, так что достаточно задать кодировку, а раскодировать должно и UTF-8, и выбранную кодировку.

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

Post by KDJ »

In ColumnsSort.js added Undo button.
Locked