Возможность создания блок-файлов (или блок-листов, списков) - одна из самых мощных новых возможностей 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