Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Misha Verbitsky ([info]tiphareth)
@ 2017-07-04 11:01:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
верхний пост - 2014
Архив верхнего поста.

Архивы:
[ 2013 | 2012 | 2011 | 2007-2010 | 2006 ]


(Читать комментарии) - (Добавить комментарий)


[info]weary
2015-11-10 02:33 (ссылка)
В общем, стало ясно, что есть проблема с S1 и bml. Совершенно не понимаю, что они там внутри такое делают, но при наличии в выводе utf-строки, пропущенной через тот Encode (который ничего не меняет, а только ставит внутренний флаг), всё ломается к чертям. Видимо, видя юникодную строку они начинают делать ещё одну перекодировку, но где - не могу сказать. На S2, который выводится в другом месте, флаг юникода вроде бы отрицательно не влияет.

Пока что получилось обойти так: оставить то, что есть в load_comments (предыдущий коммент), и в файле /htdocs/talkread.bml на строке 448 перед my $cleansubject = LJ::ehtml($post->{'subject'}); воткнуть

if ($post->{'posterid'} == 0) {
Encode::_utf8_off($post->{'body'});
Encode::_utf8_off($post->{'subject'});
}

В данном случае флаг юникода снимается с того текста, что был ранее обработан в load_comments (subject и body для posterid == 0), и с контентом ничего плохого не происходит. После этого у меня вывод портиться перестал. Хотя, возможно, где-то, где в bml ещё выводятся комменты, проблема осталась. Вроде на вид в bml больше нигде load_comments не используется, но я ни в чём не уверен. В recent_comments.bml комменты есть, но достаются они иначе.

Но всё это похоже на большой хак в плохом смысле, конечно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]maxmornev
2015-11-10 02:55 (ссылка)
Как вариант, можно сразу после регекспов выше добавить Encode::_utf8_off.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]weary
2015-11-10 03:16 (ссылка)
Ох, действительно, что-то я совсем отупел к ночи.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tiphareth
2015-11-10 14:10 (ссылка)
поставил, спасибо
пока не помогло, ибо надо вбить проверку на OpenID, у них-то posterid ненулевой

(Ответить) (Уровень выше)


[info]tiphareth
2015-11-10 14:23 (ссылка)
не уверен, что какой-то эффект был достигнут (даже с аноном):
http://lj.rossia.org/users/chaos_soyuz/2052.html
вбил я туда следующее
# anti-zalgo measure (makaka)
# https://lj.rossia.org/users/tiphareth/1761692.html?thread=97284764#t97284764
if ($posts->{$talkid}->{'posterid'} == 0) {
Encode::_utf8_on($posts->{$talkid}->{'subject'});
Encode::_utf8_on($posts->{$talkid}->{'body'});
$posts->{$talkid}->{'subject'} =~ s/[\p{Mn}\p{Me}]{5,}//g;
$posts->{$talkid}->{'body'} =~ s/[\p{Mn}\p{Me}]{5,}//g;
Encode::_utf8_off($posts->{$talkid}->{'subject'});
Encode::_utf8_off($posts->{$talkid}->{'body'});
}

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]weary
2015-11-10 14:29 (ссылка)
>не уверен, что какой-то эффект был достигнут (даже с аноном):

Я там с аноном попробовал - у меня эффект есть: https://lj.rossia.org/users/chaos_soyuz/2052.html?thread=100868

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tiphareth
2015-11-10 14:31 (ссылка)
у меня все те же вертикальные палочки
там надо вверх-вниз пару раз окно продернуть, иначе их не видно

(Ответить) (Уровень выше)


[info]weary
2015-11-10 14:31 (ссылка)
Вот как выглядит: https://i.imgur.com/6ZRXHUU.png

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tiphareth
2015-11-10 14:32 (ссылка)
так вертикальные палочки на картинке налицо, нет?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]weary
2015-11-10 14:33 (ссылка)
Так то от соседнего коммента под юзером, а в коде же проверяется posterid == 0. А в комменте анона всё чисто.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tiphareth
2015-11-10 14:34 (ссылка)
а, я осел, пардон
действительно

(Ответить) (Уровень выше)


[info]tiphareth
2015-11-10 14:39 (ссылка)
осталось понять, как бы там резать openid, а не одних анонов

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]weary
2015-11-10 15:28 (ссылка)
Где-то здесь на 1014-й внутри цикла достаётся полное описание юзера из базы, и в том массиве ($post->{'upost'}) может лежать что-то, что показывает, что юзер пришел через openid. У меня локально openid вообще не работает почему-то, проверить не могу, потому предположу, что определить можно то ли по имени юзера (если там есть какой-нибудь ext_), то ли по какому-нибудь свойству из данного массива.

Если на том этапе получится определить openid, то можно будет воткнуть туда похожий код.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tiphareth
2015-11-10 16:50 (ссылка)
openid определяется такой проверкой
но это ад, конечно

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]weary
2015-11-10 23:35 (ссылка)
Похоже, что openid - это $user->{'journaltype'} == 'I', а у обычного юзера там 'P'. 'I' включает в себя всех, в том числе и ЖЖ, хотя в некоторых местах оно обрабатывается по-разному, например, в userinfo.bml.

Соответственно, если пользователя уже вытащили из базы, то достаточно проверять journaltype. В talklib.pl это можно сделать на 1017-й, где $up это тот юзер, а не-юзеры уже пропущены в next unless $up строчкой выше.

if ($up->{'journaltype'} == 'I') {
Encode::...
$post->{'body'} =~ ....
# etc
}

Либо, как вариант, чтобы не размазывать всё это по коду, можно воткнуть между my $up и next unless что-то вроде такого, что сработает и на анонимуса, и ликвидировать вставленный ранее блок:

if (($post->{'posterid'} == 0) || ($up && ($up->{'journaltype'} == 'I'))) {
#...
}

По идее второй вариант адекватнее, хотя начать можно с первого (если оно вообще заработает).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tiphareth
2015-11-11 00:48 (ссылка)
Спасибо! Сделаю

(Ответить) (Уровень выше)


[info]tiphareth
2015-11-13 14:26 (ссылка)
туплю несколько
а чего писать в #... ?

Encode::_utf8_on($posts->{$talkid}->{'subject'});
Encode::_utf8_on($posts->{$talkid}->{'body'});
$posts->{$talkid}->{'subject'} =~ s/[\p{Mn}\p{Me}]{5,}//g;
$posts->{$talkid}->{'body'} =~ s/[\p{Mn}\p{Me}]{5,}//g;
$posts->{$talkid}->{'body'} =~ s/\n{8,}//g;
Encode::_utf8_off($posts->{$talkid}->{'subject'});
Encode::_utf8_off($posts->{$talkid}->{'body'});

Или encode-decode на этом этапе ненужно?
опасаюсь засрать что-то постороннее, поэтому спрашиваю

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]weary
2015-11-13 15:03 (ссылка)
Да, вроде так.

Перед применением того юникодного регэкспа всегда нужно делать utf8_on, а после - utf8_off. По идее, даже если сделать это два раза, то ничего не сломается (не проверю сейчас, увы).

(Ответить) (Уровень выше)


[info]weary
2015-11-13 15:13 (ссылка)
И тут тоже в условии $up->{'journaltype'} eq 'I' вместо ==, иначе всегда срабатывать будет.

(Ответить) (Уровень выше)


[info]tiphareth
2015-11-10 14:24 (ссылка)
все это было в талклиб.пл, после 448

(Ответить) (Уровень выше)


[info]tiphareth
2015-11-10 14:27 (ссылка)
вроде бы, да, никакого эффекта: добил туда к этим регекспам
$posts->{$talkid}->{'body'} =~ s/z//g;
но никаких букв z ниоткуда убрать не удалось

(Ответить) (Уровень выше)


(Читать комментарии) -