Создание блок-файлов

Возможность создания блок-файлов (или блок-листов, списков) - одна из самых мощных новых возможностей Proxomitron. В принципе, название "блок-лист" не совсем отражает его сущность, поскольку он может делать значительно больше, чем просто "блокировать". Фактически, это расширение регулярных выражений.

Чаще всего вы увидите их в поле "URL match", но их возможности не ограничиваются только URL. Блок-лист может содержать любые команды, даже вызов других блок-листов!

Чаще всего, блок-лист это просто текстовый файл, содержащий список элементов для сравнения. Проверяется каждая строка списка до тех пор, пока не будет найдено совпадение, в противном случае будет выдано значение "False".
Каждый блок-файл имет псевдоним (задается в диалоге настроек) и может быть включен в любом месте регулярного выражения. Для этого используется команда "$LST(listname)".

Вы можете создать до 255 списков и использовать их в любом месте. В общем случае они включают список для блокировки URL, сайты с разрешенной загрузкой cookies, страницы с включенной/отключенной JAVA и т.д. Для создания нового списка надо проделать следующие действия:

1. Сначала, используя любой текстовый редактор (например, Блокнот), создайте новый файл и сохраните его как "Только текст".
2. Далее, в диалоге настроек, на вкладке Bloklists нажмите кнопку "Add", выберите созданный вами файл и дайте ему псевдоним (колонка List Name). Это дает вам возможность заменять файл, не меняя ничего в фильтрах.
3. И наконец, для использования блок-файла, поместите команду $LST(псевдоним) в ваш фильтр.
Например, вы имеете выражение:

(Keitarou|Naru|Suu|Mitsune|Motoko|Shinobu|Mutsumi|Kame)

Вы можете создать файл вида:

#
# Sample List LoveHina.txt
#

Keitarou
Naru
Suu
Mitsune
Motoko
Shinobu
Mutsumi
Kame

Затем назовите блок-файл как-нибудь вроде "LoveHina" и поместите $LST(LoveHina) в выражение вместо "(...|...|...)". Очевидно, что это будет очень полезно для большого числа элементов. Причем такие списки не только удобнее обслуживать, но они могут использоваться из разных фильтров!

Исключения из правил

Вы также можете добавить строки-исключения, предваряя строку символом "~". Они могут использоваться для ограничения уже совпавших значений, и будет проверяться только в том случае, если ранее было найдено обычное совпадение. Список будет возвращать значение "Истина" только том случае, если не было совпадения со строкой-исключением. Например, список:

#
# Another sample list 
# an example of using `~` to exclude
#

*.gif
~*/gamera.gif

Первая строка будет совпадать со всем, что заканчивается на ".gif", однако во второй строке совпадает также с "/gamera.gif". В этом случае можно быть уверенным, что этот Gamera никогда не будет пойман этим списком :)

Работаем чище

Списки могут быть вызваны и в тексте замены. В этом случае они не используются для сравнения с чем-либо, но играют роль значения для некоторой переменной. Например, используя $CON(#,#) совместно с командой $SET(#=...), переменные в тексте замены могут меняться в зависимости от номера соединения, например (как, например, различные User-Agent или версии броузера). Такой список:

#
# A sample value rotation list (named "MyList")
#

$CON(1,3)$SET(0=Value One)
$CON(2,3)$SET(0=Value Two)
$CON(3,3)$SET(0=Value Three)

будет помещать следующее из трех значений в переменную \0 при каждом вызове. Вы можете использовать это в тексте замены так:

$LST(...)\0

Сначала мы вызываем список для установки \0, а затем выводим значение \0 в текст замены.

Разбивать теперь не так сложно

Нормально, каждая строка интерпретируется как независимое выражение. Однако, длинные выражения могут быть разбиты на несколько строк, путем выноса продолжения строки на символ вперед. Например:

taste (this|that|these|those|the other thing)

может быть записана так:

taste (
  this|
  that|
  these|
  those|
  the other thing)

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

Комментарий о комментариях

Также, как вы уже, возможно, заметили по примерам, строка списка может быть комментарием, если начать строку с символа "#". Комментарии игнорируются при обработке, за исключением нескольких ключевых слов, находящихся в нескольких первых строках. Сейчас таких слов пять: "NoAddURL", "JunkBuster", "NoHash", "NoUrlHash" и "NoPreHash".

"NoAddURL" прячет блок-файл из меню "Add to Blokfile" в системной панели. Это удобно, поскольку меню не загромождается лишними списками, не предназначенными для добавления в них URL.

"JunkBuster" - если найдено это слово, то Proxomitron будет пытаться интерпретировать список как тип "JunkBuster". Возможно, это менее, чем хорошо, но должно работать с большинством списков JunkBuster'a.

Имейте в виду, что вследствие различия методов, использование такого типа списков менее эффективно. В частности, JunkBuster обрабатывает имена хостов в обратном порядке (с корня). Proxomitron интерпретирует URL как случайный текст, так что лучше не использовать подстановочных символов. Например, "(www.|)somehost.com" будет работать значительно быстрее, чем "*somehost.com". Если вам нужны подстановочные символы в начале выражения, используйте их в виде "[^/]++somehost.com". Это несколько лучше, чем "*", поскольку URL сканируется только до первого "/".

"NoHash", "NoURLHash", "NoPreHash" используются для отключения различных хеширующих (индексирующих) алгоритмов, использемых при работе со списками. "NoHash" отключает все алгоритмы, сохраняя память, использется в тех случаях, когда обращения к списку редки или скорость работы не имеет значения. "NoURLHash" и "NoPreHash" отключают два типа индексирования по отдельности.

Индексирование блок-листов

Другое преимущество списков в отличие от нагромождения операторов ИЛИ - это скорость. Proxomitron умеет делать индексы для допустимых элементов списка. Не все элементы могут быть проиндексированы, но для тех, которые это допускают, скорость поиска совпадений намного повышается. В принципе, вас не должны беспокоить основы работы индексирования, но если вы хотите получить гарантированно быстрый блок-лист, учтите некоторые советы:

Сначала Proxomitron проверяет каждый элемент списка на индексируемость. Если результат положительный, то он добавляется в индексируемый список, если отрицательный - в неиндексируемый. Разумеется, индексированный предпочтительней.

Proxomitron оперирует двумя типами индексов - фиксированный префикс и индекс URL-типа. Каждый элемент в списке проверяется, может ли он индексироваться тем или иным способом, и если да, то используется метод, индексирующий больше символов в данном элементе. Общий список может представлять собой смесь из обоих типов.

Фиксированный префикс - простейший случай, когда любое выражение имеет фиксированное число символов без любых подстановочных символов. Чем дальше префикс отстоит от подстановочных символов, тем лучше он индексируется. Большинство URL, добавляемых пользователем, попадают в эту категорию, но этот метод также полезен и для некоторых других списков, не основанных на URL. Неколько примеров допустимых выражений:

www.somewhere.com
127.0.0.
shonen(kinfe|)
foo(bar|bat)*bear

Операторы И аналогичны выражению "this*&*that", однако операторы ИЛИ вне скобок не индексируются, так как совпадение может начинаться с двух различных значений. В этом случае лучше поместить каждое слово в отдельную строку.

Индексы URL-типа в основном предназначены для списков URL. Цель этого введения - разрешить использование подстановочных символов в начале строки, поскольку это часто необходимо для задания совпадения с частичными именами хостов. В этом случае происходит просмотр выражения и находится конец имени хоста (обозначаемый как ":" и "/" ), затем индексируется в обратном порядке. Чтобы все это работало, необходимо чтобы между концом имени хоста и подстановочными символами не было других подстановочных символов. Разрешенные подстановочные символы включают: "*", "\w", "[...]+", "[...]++", and "(...|)". Несколько примеров:

*somehost.com/(anything|after|here|is|fine)/\w.html
\wsomehost.com/
[^.]+.somehost.com/
[^/]++somehost.com/
(www.|)somehost.com:[0-9]+/
([^/]++.|)somehost.com/

К сожалению, выражения:

([^/]++.|)somehost.*/
([^/]++.|)somehost.(com|net)/

не будут индексироваться. В этом случае лучше записать их так:

([^/]++.|)somehost.com/
([^/]++.|)somehost.net/

Еще одно замечание, которое должны учесть авторы собственных блок-файлов. Очень важно использовать полное имя хоста, включая "/". Раньше в этом не было необходимости, теперь же выражение:

([^/]++.|)microsoft.

лучше записать так:

([^/]++.|)microsoft.com/

или, при необходимости, в несколько строк. Это также означает, что нет особой нужды писать выражения типа:

www.(ad(server|engine|banner)|banner(site|click|)).(com|net)

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

Ограничения

Списки имеют некоторые ограничения, что делает работу с ними несколько отличной от работы со списком элементов, разделенных оператором ИЛИ. Например, вы имеете выражение вида:

www.$LST(hosts).com

и список типа:

#
# Host list
#

adsite
adsite-2

В этом случае имя хоста "www.adsite-2.com" не будет давать совпадения, несмотря на то, что теоретически должно. Это происходит потому, что в списке сначало будет найдено совпадение с "adsite", но, в силу особенностей списка, не будет просматриваться дальше, так как еще необходимо слово ".com". Для исключения этой ситуации важно сделать выражение согласованным. Например, путем перемещения точки в список:

www.$LST(hosts)com

#
# Host list
#

adsite.
adsite-2.

Также имейте в виду, что символ "*" в конце элемента списка будет давать совпадение со всеми символами до конца. Это требуется нечасто, но в случае неообходимости просто поместите "*" в выражение.

www.$LST(hosts)*.com