User Tools

Site Tools


juick:база_регэкспов_плагинов_im-клиентов

This is an old revision of the document!


База регулярных выражений для плагинов im-клиентов

Официальные регулярные выражения

Авторы: @freefd, @ugnich
Язык разработки: Perl

Используются в скрипте парсинга web-интерфейса Джуика.
Регулярные выражения приведены в качестве параметров perl'овской функции замены в тексте по регулярному выражению
s{regexp}{subst_text}[modificators];

Параметр Описание
regexp Регулярное выражение, по которому производится замена.
subst_text Текст замены. В $n доступны сохраннёные группы из regexp.
modificators Модификаторы регулярного выражения.

Ссылки

s{((?<=\s)|(?<=\A))((?:ht|f)tps?://(?:www\.)?([^\/\s\n\"]+)/?[^\s\n\"]*)}{$1<a href="$2" rel="nofollow">$3</a>}go;

Преобразовывает http://juick.com/last?page=2 в <a href="http://juick.com/last?page=2" rel="nofollow">juick.com</a>

Ссылки в скобках

s{((?<=\s)|(?<=\A))([\(\[\{]|&lt;)((?:ht|f)tps?://(?:www\.)?([^\/\s\n\"\)\!]+)/?[^\s]*)([\)\]\}]|&gt;)}{$1$2<a href="$3" rel="nofollow">$4</a>$5}go;

Преобразовывает (http://juick.com/last?page=2) в (<a href="http://juick.com/last?page=2" rel="nofollow">juick.com</a>)

Id сообщений

s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))#(\d+)((?=\s)|(?=\Z)|(?=\))|(?=\.)|(?=\,))}{$1<a href="http://juick.com/$2">#$2</a>$3}g;

Преобразовывает #12345 в <a href="http://juick.com/12345">#12345</a>

Id сообщений + id комментариев

s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))#(\d+)/(\d+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="http://juick.com/$2#$3">#$2/$3</a>$4}g;

Преобразовывает #12345/65 в <a href="http://juick.com/12345#65">#12345/65</a>

Форматирование (жирный)

s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))\*([^\*\n<>]+)\*((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<b>$2</b>$3}g;

Преобразовывает *bold* в <b>bold</b>

Форматирование (курсив)

s{((?<=\s)|(?<=\A))/([^\/\n<>]+)/((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<i>$2</i>$3}g;

Преобразовывает /italic/ в <i>italic</i>

Форматирование (подчёркнутый)

s{((?<=\s)|(?<=\A))_([^\_\n<>]+)_((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<span class="u">$2<\/span>$3}g;

Преобразовывает _underline_ в <span class="u">underline</span>

Id комментариев

s{((?<=\s)|(?<=\A))\/(\d+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="#$2">/$2</a>$3}g;

Преобразовывает /12 в <a href="#12">/12</a>

Jid'ы

s{((?<=\s)|(?<=\A))\@([\w\-\|\.]+\@[\w\-\.]+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="http://juick.com/$2/">\@$2<\/a>$3}g;

Преобразовывает @username@jabber.org в <a href="http://juick.com/username@jabber.org/">@username@jabber.org</a>

Ники

s{((?<=\s)|(?<=\A))\@([\w\-]+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="http://juick.com/$2/">\@$2<\/a>$3}g;

Преобразовывает @username в <a href="http://juick.com/username/">@username</a>

BombusMod

Автор плагина: @Totktonada
Язык разработки: J2ME

Собственно, регулярных выражений как таковых тут нет. Есть метод viewJuickThings в который передаётся тело сообщения и потом перебирается по одному символу в цикле. В итоге номера сообщений, ники и теги (далее — “сущности”) оказываются прямо в Vector'е things.

viewJuickThings (частично && по кусочкам)

    public void viewJuickThings(String str) {
...
        char[] valueChars = str.toCharArray();
        int msg_length = valueChars.length;
        Vector things = new Vector();
        for (int i = 0; i < msg_length; i++) {
            if ((i == 0) || isCharBeforeJuickThing(valueChars[i - 1])) {
                switch (valueChars[i]) {
                    case '#':
                    case '@':
                    case '*':
                        char firstSymbol = valueChars[i];
                        String thing = "" + firstSymbol;

Здесь мы “находимся” в начале “сущности”. Прибавляем к ней по символу, пока не встретится конец сообщения или какой-нибудь символ, который не может присутствовать в “сущности” (например, пробел).

                        while (i < (msg_length - 1) && isCharFromJuickThing(valueChars[++i], firstSymbol)) {
                            thing = thing + valueChars[i];
                        }

Убираем точки с конца.

                        while (thing.charAt(thing.length() - 1) == '.') {
                            thing = thing.substring(0, thing.length() - 1);
                        }

Если в “сущности” не только знак '#', '@' или '*' и она не встречалась ранее в этом же сообщении, то добавляем её к Vector'у. При условии, что это не тег, после которого идёт '*' (по идее это жирное выделение).

                        if ((thing.length() > 1) && (things.indexOf(thing) < 0)) {
                            if (i < msg_length && ((firstSymbol == '*') && (valueChars[i] == '*'))) {
                                continue;
                            }
                            things.addElement(thing);
                        }
                        if (i > 0) {
                            i--;
                        }
                        break;
                }
            }
        }
...
    }

isCharBeforeJuickThing

Символы, которые могут предшествовать “сущности”.

    public boolean isCharBeforeJuickThing(char ch) {
        switch(ch) {
            case '\u0020': // space
            case '\u0009': // tab
            case '\u000C': // formfeed
            case '\n': // newline
            case '\r': // carriage return
            case '(':
                return true;
        }
        return false;
    }

isCharFromJuickThing

Символы, которые могут присутствовать в “сущности”.

    public boolean isCharFromJuickThing(char ch, char type) {
        boolean result = false;
        switch(type) {
            case '#': // #number
                result = (ch>46) && (ch<58); // [0-9/]
                break;
            case '@': // @username
                result = ((ch>47)&&(ch<58)) || ((ch>63)&&(ch<91)) || ((ch>96)&&(ch<123)) || ((ch=='_')||(ch=='|')) || ((ch>44)&&(ch<47)); // [a-zA-Z0-9-.@_|]
                break;
            case '*': // *tag
                result = ((ch>42)&&(ch<58)) || ((ch>64)&&(ch<91)) || ((ch>96)&&(ch<123)) || ((ch>1039)&&(ch<1104)) || ((ch=='_')||(ch=='|')||(ch=='?')||(ch=='!')||(ch==39)) || ((ch>44)&&(ch<47)); // [a-zA-ZА-Яа-я0-9-.,/+_|?!'])
                break;
        }
        return result;
    }

Miranda IM

Название плагина: Miranda Juick Plugin (mjp)
Автор плагина: @longedok
Язык разработки: JavaScript
Регулярные выражения:

Все слеши в следующих регулярных выражениях заэкранированы бэкслешем (\/).

Номера сообщений

#123456, #123456/12
Регулярное выражение: \B((#\d+)(\/\d+)?)\b

Сохранённые группы для строки "#123456/123":

Группа Содержание
$1 #123456/123
$2 #123456
$3 /123

Ники

@username, @username@server.ru
Регулярное выражение: \B(@[a-zA-Z0-9-.@_|]+)\b

Сохранённые группы для строки "@username":

Группа Содержание
$1 @username

Теги

 *tag1, *tag!, *?
Регулярное выражение: (?<=<br>\B(@[a-zA-Z0-9-.@_|]+)\b:( ?(\*\S+?)(?=<br>| \*))*) (\*\S+?)(?=<br>| \*)

Из-за недостатков реализации регулярных выражений в JavaScript, данное выражение на практике не используется. Но, в то же время оно позволяет очень точно определять теги именно там, где нужно и не совпадает ни с чем лишним. Также, это выражение разрабатывалось с учётом специфики плагина IEView, для Miranda IM, поэтому вместо обработки переводов строк, в нём учитываются html-теги <br>.

Tkabber

Название плагина: Tkabber4Juick
Авторы плагина: @roche, @Totktonada
Язык разработки: tcl/tk

Номера сообщений, ники, теги

    set matched [regexp -indices -start $at -- \
    {(?:\s|\n|\A|\(|\>)(#\d+(/\d+)?|@[\w@.-]+|\*[\w?!+'/.-]+)(?:(\.(\s|\n))?)} $what -> bounds]

Цитаты

    set matched [regexp -indices -start $at -- \
    {(?:\n|\A)(>[^\n]+)} $what -> bounds]

Прочее

Пост, в комментариях которого сообщения, могущие быть проблемными при обработке плагинами: #168322.

jabber juick

juick/база_регэкспов_плагинов_im-клиентов.1300776435.txt.gz · Last modified: 2014/04/13 19:20 (external edit)