Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Infocatcher,
Вот тут маленький эксперимент, если интересно:
Слово пример сохранил в трёх разных кодировках: cp1251,cp866,utf8.
В cp1251 - при открытии кодировка документа определилась правильно.
HexSel с включённым флагом "Автоматически" - порядок байт исходный (как в файле).
Image

В cp866 - при открытии кодировка не определилась, документ открылся как cp1251.
HexSel с включённым флагом "Автоматически" - порядок байт исходный (как в файле).
Image

В utf-8 - специально открыл документ как cp1251.
HexSel с включённым флагом "Автоматически" - порядок байт исходный (как в файле).
Image

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

В cp866 - при открытии кодировка не определилась, документ открылся как cp1251.
Не правильно определенная кодировка - отдельный разговор. И тем не менее, для Акела это уже не "пример" а шесть других символов.
Вообще-то хеш работает с произвольным набором байт, потому в контексте чистого текстового редактора говорить о хешах можно только с огромными оговорками.

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

Post by Infocatcher »

Fr0sT wrote:Да, см. у меня в Base64, вроде бы нормально работает.
Еще бы памяти поменьше кушало...
Причем странно – если попробовать разбить строку на части, то начинает падать. Или я что-то не так делаю.

getHash-test.js
Пытается перекодировать в текущую кодировку (и никак не обрабатывает возможные ошибки).

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

Post by Deim0s »

Infocatcher,
getHash-test.js
Спасибо! Отличная работа.
Погонял его в трёх кодировках (cp1251, cp866, utf-8 ), правда на небольших выделениях - ни разу не ошибся. Где, если что, ошибки искать :)?

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Где, если что, ошибки искать
На многострочных выделениях на разных типах переноса строк.

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

Post by Fr0sT »

Infocatcher
если попробовать разбить строку на части, то начинает падать
По идее, при перекодировке из utf16 всё должно быть более-менее нормально, там даже если суррогатная пара будет разорвана - ничего страшного (хотя не уверен, преобразует ли WCtoMB строку, начинающуюся со второй половины суррогатной пары?). Видимо, где-то вылезаешь за границу буфера или перепутал символы с байтами.

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

Post by Infocatcher »

Fr0sT
Видимо, где-то вылезаешь за границу буфера или перепутал символы с байтами.
Я про нулевой символ в конце строки забыл.

getHash-test.js
Исправлено перекодирование, добавлен расчет CRC32 (вроде бы, считает правильно, но пришлось угадывать, как получить «общепринятую» шестнадцатеричную строку.

AESCrypt.js
Все-таки сделал оба варианта запроса пароля модальными, предупреждение об отсутствии текста теперь выдается до обоих вариантов диалога.

insertEval.js
Исправлено определение специальных выражений вида «=expression».

Infocatcher wrote:Может быть, есть смысл заменить replace/match на разбивку на строки и последующую проверку – тогда можно будет оперировать флагом начала строки, например «/(^|\s)something/».
Тогда для регулярных выражений можно просто отключать галочки, определяющие добавление «^.*» и «.*$» (и не добавлять флаги начала/окончания вообще).
Как-то так: LinesFilter_mod2.js
Плюс реализовано получение текста без его предварительного выделения.

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

getHash-test.js
Я то туда заглянул, но только от этого понятнее не стало(даже по ссылке внутри скрипта прошел): какой образующий полном используется в данной реализации CRC32? (матчасть: "порождающий или образующих 32битных полиномов" есть минимум 4 + Adler который не являясь CRC32 постоянно вертится вокруг остальных CRC32-проверок их равноправная полиномиальная разновидность.)

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

Post by Infocatcher »

FeyFre
Матчасть я как-то читал, ага.
Результат совпадает с тем, что выдает Total Commander.
Last edited by Infocatcher on Sat Dec 18, 2010 2:38 am, edited 1 time in total.

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

Post by Deim0s »

Infocatcher,
По converter.js ("URI", "URIComponent"):
Есть ссылки вида:

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
Должно получится:

Code: Select all

ftp://primer.servera.ru/VIDEO/+Uploaded/P.S. Я люблю тебя - P.S. I Love You (2007, DVDRip).avi
Не раскодирует, пишет "Обнаружена недопустимая кодировка...".

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

Post by Infocatcher »

Deim0s wrote:Не раскодирует, пишет "Обнаружена недопустимая кодировка...".
Встроенные decodeURI и decodeURIComponent ожидают UTF-8, а получают windows-1251.
http://ru.wikipedia.org/wiki/URL#.D0.9A ... .D0.B5_URL

Можно заменить decodeURIComponent на

Code: Select all

function decodeURIComponentWrapper(str) {
	try {
		return decodeURIComponent(str);
	}
	catch(e) {
		return str.replace(
			/%([0-9a-f]{4}|[0-9a-f]{2})/ig,
			function(s, hex) {
				return String.fromCharCode(parseInt(hex, 16));
			}
		);
	}
}
, а потом угадывать кодировку:

Code: Select all

ftp://primer.servera.ru/VIDEO/+Uploaded/P.S. ß ëþáëþ òåáÿ - P.S. I Love You (2007,VDRip).avi

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

Post by Deim0s »

Infocatcher,
Можно заменить decodeURIComponent на:
Если можно, чуть подробнее.

В Firefox есть опция по этому поводу (network.standard-url.encode-utf8 - false), сложно её реализовать в этом скрипте (тоже в качестве опции)?

Ещё несколько вопросов по HTML Entities:
Добавлять свои можно сюда?

.replace(/своё/g, "своё")

Есть ли какие ограничения? На количество (ну там не стабильно работать начнёт и т.д.)? Если к примеру добавить всё от сюда?
Извиняюсь если плохо искал, но сразу не нашёл, в каких кодировках AkelPad прочтёт скрипты (utf-16le, utf-8 )? Это, если я к примеру добавлю:

.replace(/♣/g, "")

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

Post by Infocatcher »

Deim0s
Если можно, чуть подробнее.
Приблизительно так: converter-test.js
Но я пока не понял, как раскодировать полученный результат. :)
В Firefox есть опция по этому поводу (network.standard-url.encode-utf8 - false), сложно её реализовать в этом скрипте (тоже в качестве опции)?
http://kb.mozillazine.org/Network.stand ... ncode-utf8
IE and Opera, contrary to the specification, encode the path part of the URL in UTF-8 but encode the query string part of the URL in the encoding of the referring page.
Звучит довольно муторно. :D
Там же еще network.standard-url.encode-query-utf8 и network.standard-url.escape-utf8 есть.

Разве что делать выборочное кодирование типа вот такого:
http://ru.wikipedia.org/wiki/Рекорд_мира_по_прыжкам_в_высоту_%28мужчины%29
и
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_%28%D0%BC%D1%83%D0%B6%D1%87%D0%B8%D0%BD%D1%8B%29
Ещё несколько вопросов по HTML Entities:
Добавлять свои можно сюда?
Ну да, можно добавлять в function encodeHTML(str) и function decodeHTML(str).
Deim0s wrote:Есть ли какие ограничения? На количество (ну там не стабильно работать начнёт и т.д.)? Если к примеру добавить всё от сюда?
Ну, чем больше замен, тем медленнее. Но все равно должно быть быстрее, чем всякие там хэши вычислять.
Можно из Firefox утянуть:
Mozilla Firefox\res\dtd\
Mozilla Firefox\res\entityTables\

Это можно. Плюс, обязательно опция для кодирования. И, пожалуй, для декодирования.
Извиняюсь если плохо искал, но сразу не нашёл, в каких кодировках AkelPad прочтёт скрипты (utf-16le, utf-8 )?
viewtopic.php?p=10324#p10324:
Infocatcher wrote:И хорошо бы вот это исследовать. Гораздо практичнее хранить скрипты в UTF8/16.
Вроде бы, сейчас AkelPad сам читает файлы скриптов, потому как wscript.exe не понимает UTF-8 с BOM, тогда как такие скрипты можно запускать. А вот UTF-16 уже работает и там, и там, но это все в юникодных ОС. Так что пусть лучше автор сам ответит. :)
.replace(/♣/g, "")
Универсальнее всего – \u2663 ("♣".charCodeAt(0).toString(16)) или, для двузначных кодов, – \xab для "«". Примерно это и происходит при -type="Escapes", но с некоторыми исключениями – см. function encodeEscapes(str) { ... }.


[Upd]
Собственно, чего уж там, вот прототип, конвертирующий entities (пока только xhtml11.dtd): converter-test.js
Сущности задаются в объекте

Code: Select all

var specialEntities = {
    entity0: "char0",
    entity1: "char1"
};
Плюс параметры/аргументы -decodeSpecialEntities и -encodeSpecialEntities.

[Upd – 2]
Заодно подправил, чтобы  и &#0xffff; декодировались, а 𐀀 и 𐀀 – уже нет.
Last edited by Infocatcher on Sat Dec 18, 2010 10:30 pm, edited 1 time in total.

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

Post by Deim0s »

Infocatcher,
Но я пока не понял, как раскодировать полученный результат.
Если получится раскодировать - наверное, самый хороший вариант.
Разве что делать выборочное кодирование типа вот такого:
Ну как вариант, лучше чем ничего :). Потом, можно пройтись ещё раз, в "нормальном" режиме. Ещё, посмотрите PSPad, он вроде раскодирует всё что угодно (URL -> ANSI), исходники закрыты правда.
Вроде бы, сейчас AkelPad сам читает файлы скриптов, потому как wscript.exe не понимает UTF-8 с BOM, тогда как такие скрипты можно запускать. А вот UTF-16 уже работает и там, и там, но это все в юникодных ОС. Так что пусть лучше автор сам ответит.
Я так понял, сейчас, в UTF-8 без BOM можно смело сохранять? В принципе этого и достаточно почти для всех нужд. А так конечно в utf-16le получше было бы, да и с сигнатурой ИМХО понадёжней как то.
Универсальнее всего –
Пойду пробовать.

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

Post by Infocatcher »

Deim0s
Я так понял, сейчас, в UTF-8 без BOM можно смело сохранять?
Нет, именно с BOM, без BOM кодировка не определится.
А вот wscript.exe все равно будет ругаться в обоих случаях:
Ошибка: 'AkelPad' - определение отсутствует
Правда, это понятнее, чем
Ошибка: 'п»ї' - определение отсутствует
для UTF-8 c BOM.
Locked