Замечания и предложения по нему, а также их обсуждение. Предыдущий тред >>1000000.
>>1000418>>1000425 Done.
>>1000428 Gut. >>1000427> Было бы ещё неплохо для модерки какой экран просмотра анимапчиСписок, где слева картинка, справа — имена, и можно редактировать? > При желании можно костыль-версию добавить и включать или одно или другое по каким настройкам...Есть версия, которая не использует SharedWorker, поскольку тот не реализован в мобильном Хроме. Можно if(!!window.SharedWorker) поменять на if(false) и посмотреть, в нём ли дело.
if(!!window.SharedWorker)
if(false)
>>1000429 И кнопочку аплоада/разрешения для какой доски. Или два разных экрана, один для алиасов, один для доскопринадлежности. Так можно избавиться от текстофайлов и их в БД держать.>Можно if(!!window.SharedWorker) поменять на if(false) и посмотреть, в нём ли дело.А я пожалуй так и сделаю.
> $catalog_page .= '<span class="catalogmsg">' . closeOpenTags(mb_substr(strip_tags(stripslashes($line['message'])), 0, 40)) .'</span><br />';> closeOpenTags(mb_substr(strip_tags(stripslashes($line['message'])), 0, 40))С учётом HTML Entities, получать catalogmsg можно вот так, наверное. function get_catalog_msg($msg, $max_catalog_msg_length){ $catalog_msg = ''; $msg_id = 0; $catalog_msg_len = 0; $brs = ['<br>' => 1, '<br/>' => 1, '<br />' => 1]; while($msg_id < strlen($msg) && $catalog_msg_len < $max_catalog_msg_length){ $c = $msg[$msg_id]; if($c === '<'){ $html_tag_term_id = strpos($msg, '>', $msg_id); if($html_tag_term_id === false) break; if($html_tag_term_id - $msg_id + 1 <= strlen("<br />")){ $maybe_br = substr($msg, $msg_id, $html_tag_term_id - $msg_id + 1); if(array_key_exists($maybe_br, $brs)){ $catalog_msg .= ' '; $catalog_msg++; } } $msg_id = $html_tag_term_id + 1; } else if($c === '&'){ $html_entity_term_id = strpos($msg, ';', $msg_id); if($html_entity_term_id === false) break; $html_entity = substr($msg, $msg_id, $html_entity_term_id - $msg_id + 1); $decoded = html_entity_decode($html_entity, ENT_QUOTES | ENT_HTML5); if($html_entity != $decoded){ $catalog_msg .= $html_entity; $catalog_msg_len++; } $msg_id = $html_entity_term_id + 1; } else{ $o = ord($c); // we're at the start of some UTF-8 symbol if($o > 0xDF) $bytes = $o > 0xEF ? 4 : 3; else $bytes = $o > 0x7F ? 2 : 1; $catalog_msg .= substr($msg, $msg_id, $bytes); $catalog_msg_len += 1; $msg_id += $bytes; } } return $catalog_msg; }
function get_catalog_msg($msg, $max_catalog_msg_length){ $catalog_msg = ''; $msg_id = 0; $catalog_msg_len = 0; $brs = ['<br>' => 1, '<br/>' => 1, '<br />' => 1]; while($msg_id < strlen($msg) && $catalog_msg_len < $max_catalog_msg_length){ $c = $msg[$msg_id]; if($c === '<'){ $html_tag_term_id = strpos($msg, '>', $msg_id); if($html_tag_term_id === false) break; if($html_tag_term_id - $msg_id + 1 <= strlen("<br />")){ $maybe_br = substr($msg, $msg_id, $html_tag_term_id - $msg_id + 1); if(array_key_exists($maybe_br, $brs)){ $catalog_msg .= ' '; $catalog_msg++; } } $msg_id = $html_tag_term_id + 1; } else if($c === '&'){ $html_entity_term_id = strpos($msg, ';', $msg_id); if($html_entity_term_id === false) break; $html_entity = substr($msg, $msg_id, $html_entity_term_id - $msg_id + 1); $decoded = html_entity_decode($html_entity, ENT_QUOTES | ENT_HTML5); if($html_entity != $decoded){ $catalog_msg .= $html_entity; $catalog_msg_len++; } $msg_id = $html_entity_term_id + 1; } else{ $o = ord($c); // we're at the start of some UTF-8 symbol if($o > 0xDF) $bytes = $o > 0xEF ? 4 : 3; else $bytes = $o > 0x7F ? 2 : 1; $catalog_msg .= substr($msg, $msg_id, $bytes); $catalog_msg_len += 1; $msg_id += $bytes; } } return $catalog_msg; }
キタ━━━(゚∀゚)━━━!!
>>1000434 Ахаха ох вау.
>>1000435> $to_append = strtr($to_append, [" " => " ", "\t" => " "]); Забыл ; добавить.
>>1000436 Поправлено. >>1000433 Хммм. Вообще, было бы неплохо это через formatLongMessage сделать что уже делает примерно то же самое. И парсер хтмл заново писать не надо, потому что он либу использует.
formatLongMessage
>>1000437 Теперь там просто DomDocument->loadHTML->getNode->textContent, и всё в mb_substr. Алсо, оказывается всё время с ввода нового formatLongMessage оно выводило лишние <!DOCTYPE><html><body></body></html>, лол. >>1000430 Так и сделано. >>1000402 прожмите F5 и проверьте, пожалуйста.
DomDocument->loadHTML->getNode->textContent
mb_substr
>>1000437 Стоит, думаю, и посты поправить. update posts_b set message=regexp_replace(message, ' (?!;)', '\\1 ') where postedat > unix_timestamp('2025-02-17 08:23:40') and postedat < unix_timestamp('2025-03-04 08:47:55'); update posts_d set message=regexp_replace(message, ' (?!;)', '\\1 ') where postedat > unix_timestamp('2025-02-17 08:23:40') and postedat < unix_timestamp('2025-03-04 08:47:55'); >>1000438> Теперь там просто DomDocument->loadHTML->getNode->textContent, и всё в mb_substr.В formatLongMessage или вместо closeOpenTags(...)?
update posts_b set message=regexp_replace(message, ' (?!;)', '\\1 ') where postedat > unix_timestamp('2025-02-17 08:23:40') and postedat < unix_timestamp('2025-03-04 08:47:55'); update posts_d set message=regexp_replace(message, ' (?!;)', '\\1 ') where postedat > unix_timestamp('2025-02-17 08:23:40') and postedat < unix_timestamp('2025-03-04 08:47:55');
closeOpenTags(...)
>>1000439 Не особо любо менять посты, но так как это был баг, то ладно. И да, в closeOpenTags. То есть там теперь не мешанина из striptags()stripslashes()closeopentags() а просто берётся текстовая часть хтмл и обрезается до 40 символов.
Спустя долгие месяцы разработки, анонимная кармочка наконец-то запилена! Теперь вы можете проголосовать, насколько каждый пост "девочка", "булочка" или "кот" и накрутить этот рейтинг, передёргивая роутер! Кто знает, может самые популярные посты за месяц получат настоящую булочку??
>>1000445 Жалко, что основного пропонента идеи нет. На телефоне несколько за-missalign'уто выглядят новые кнопки по вертикли по отношению ко кнопке быстрого ответа. Нету padding-а меж кнопкой быстрого ответа и девочкой, можно промахнуться. Также, custom_tags, может быть, стоит переносить целиком на следущую строку, если не влазит. Или, по крайней мере, сделать, чтобы иконка и соответствующее ей значение переносились вместе. Девочка, булочка и кот в качестве счётчиков — удачное решение. А вот с SVGшками сложнее. Кот получился довольно удачно. Или сравнительно удачно. Девочка скорее похожа на кролика. Рот крестиком, будто зашитый. Булочка не Sternsemmel. Круассан? Сложно SVGшки делать. Пытался вот для тонущего треда сделать иконку с кораблём, но хорошо не получается. В /b/ при переходе на каталог кидает сообщение про JSON parsing error.
>>1000446> Нету padding-а меж кнопкой быстрого ответа и девочкой, можно промахнуться.Вроде, достаточно поставить пробел перед custom_tags span-ом, но в ОП-постах он уже есть. Думал вот ещё, может сделать float: right для того span'а, но всё-таки при разномастной ширине постов лучше выглядит так, как есть.
>>1000446 Ну, может ещё заглянет, пока будет висеть. По css сложно~. Но перенос запретить емнип можно. Пробел в ОП-посте из-за того что там и других кнопок добавлено порядком. Попробовал ещё один для всех.>Булочка не Sternsemmel. Круассан? Да. Может попытаюсь переделать.>Пытался вот для тонущего треда сделать иконку с кораблём, но хорошо не получается.Там обычно просто якорь. Будет убрано к выходным, версия в виде юзеркрипта скорее всего попозже.
>>1000417 УРЛ в УРЛе сломан немного: >>>/b/1004405
>>1000456> УРЛ в УРЛе сломан немногоИз url_end_regex убрать '|' . 'https?:\/\/'。> >>>/b/1004405В tokenizer_regex сделать '|' . '>>(?=[\/0-9])' вместо '|' . '>>'。 По идее, должно заработать.
'|' . 'https?:\/\/'
'|' . '>>(?=[\/0-9])'
'|' . '>>'
Попытался слепить тут с кавалерийского наскоку, лол. По-моему смотрится только gold версия.
И ещё вариант.
>>1000458 Можно попробовать ротацию сделать. >>1000459 Лапы UGR, конечно, далеко тянутся...
>>1000458 Красненькое-то где.
>>1000460 Выбрать надо!>UGRUniversidad de Granada? Unified Girls Registry? >>1000461 Красненькое не нужно. Обновленные цвета отражают приверженность бренда нашей имиджборды целям построения лучших коммуникативных стратегий со своей аудиторией.
>>1000462 У нас линк на пост и кнопка ответа и пиктограмки в углу всё красненькое.
>>1000463 А gold фона и фона постов больше по площади!
>>1000461 Действительно, не по-умночански, выбивается. Но так ли это плохо? Если сделать ротацию (случайный выбор при генерации HTML), то будет смотреться хорошо, наверное. Лучше, чем если целый ряд заглушек одной картинкой представлен. Хотя вариант в цветах Умночана я бы всё же добавил. И, наверное, все заглушки кириллицей лучше подписывать.
>>/b/1004436 скобку съело.
>>1000466 В оригинале было, что можно для ссылок типа Викепедийных …Сервал_(Персонаж) скобки, но я скобки разрешил, как часть URL в целом: чтобы получить (https://pixiv.net) нужно набрать (https://pixiv.net~). Если продолжат спотыкаться об это изменение, сделаю «умную» систему терминации URL по скобке. Но можете и сами сделать. Код с регулярками в архиве по >>1000417.
(https://pixiv.net~)
Смотрю, а это в faq/markdown упомянуто. Ну ладно, раз уж документировано, то my fault.
Докрасил таки.
Против добавления всех сразу ничего не имею.
>014.cdn.ganbaranai.moe
>>1000472 годы-то_30-ые.рика_нипа.jpg
Есть тут вот у меня желание запилить-таки ротацию спойлеров (по MD5 файла, наверное) и после, может быть, отдельное поле в БД для сажи — с Соусным значком или иначе, но у меня пропала локальная копия с изменениями. В связи с чем прошу опубликовать текущую версию движка. Но может, стоит прежде смёржить текущие изменения с 410, что, правда, не без лишней мороки будет: счётчик символов Соус в репу так и не закоммитил, например. Единственно что, шрифт с засечками, может быть, оставить стоит. Ну и на счёт красной кнопки отправки я не совсем уверен. Хотя вот с учётом наличия кнопки предпросмотра, может, в цветовой диференциации будет смысл. Может быть, текст кнопок этих в будущем на значки заменить? Предпросмотр на моей мобилке на вторую строчку перелезает. С другой стороны, оно и без той кнопки перелезает: (новая на одной строчке, а нить) на другой, а с той кнопкой хотя бы словосочетание не разрывается: на телефоне, может стоит обе кнопки на новую строку тогда?
>>1000476 >>1000476 Красная кнопка имхо вырвиглазна. Но другое смержить стоит.>по MD5 файла, наверноеДа можно и по рандому после таймстампа. Я просто не очень представляю как сделать это не ломая текущий функционал. Лезть в дебри CSS3 и через image(attr())?
image(attr())
>>1000477> Я просто не очень представляю как сделать это не ломая текущий функционалА там что-то серьёзно ломается? Я когда в июне пытался приступить к делу, там такое обстоятельство было, что картинка для спойлера задаётся через ::after, который придётся сделать настоящим отдельным элементом. В остальном не помню, чтобы там какие-то ещё проблемы были. А чуть-чуть JS и стили поредактировать, чтоб заработало, — это не страшно, наверное.
>>1000479 Не хотеть ЖС, хотеть чтобы изкоробки работало.
>>1000480 Моя тоже хотеть и будет делать, но раз было сказано, что функционал ломается, я предположил, что, может, изменения DOMа что-то в kusaba.js поломали бы. Как там оно на самом деле — посмотрим.
>>1000430 >>1000402 Прошло полгода, никаких известий о том течёт или больше не течёт. Возвращено назад.
>>1000476 Изменения синхронизированы и выборочно импортированы.
>>1000483 Спасибо. Может, к воскресенью что-то уже готово будет.
>>1000477 Сделал через '<img class="spoiler-holder" src="' . TimestampToSpoiler() . '"></img>'. Патч в архиве. Варианты добавлять в директорию css/spoilers. По изменению вариантов, перегенерировать страницы. > image(attr())MDN говорит, что url(attr()) нельзя. https://developer.mozilla.org/en-US/docs/Web/CSS/attr#limitations_and_security Можно было бы, наверное, выкрутиться через background-image: if(mod(attr(), --spoiler_count), ..., ...) но писать-тестировать толпу вложенных if-ов мне лениво: насколько я понимаю, array'ев, switch'ев и map'ов в CSS нет. Как и нет substr, так что всё равно board-post.class.php менять пришлось бы. Чтобы только через CSS, можно выкрутиться через селекторы. .catalogpic.spoiler-image:has(:is(img[src*="0s."],img[src*="1s."]))::after, .spoiler-image.imglink:is(a[data-full-src*="0."],a[data-full-src*="1."])::after { background-image: url('/css/spoilers/spoiler-koromo.png'); } .catalogpic.spoiler-image:has(:is(img[src*="2s."],img[src*="3s."]))::after, .spoiler-image.imglink:is(a[data-full-src*="2."],a[data-full-src*="3."])::after { background-image: url('/css/spoilers/sp-test-gold-cyr.png'); } …и так далее. С одной стороны, централизованно всё и в случае добавления/удаления спойлеров не нужно тратить время на регенерацию всех HTML досок и тредов. С другой, не знаю, скажем, 11 разных спойлеров и 100 таких правил… Convoluted это несколько. Хотя если helper скрипт сделать, который такой spoilers.css по содержимому директории spoilers автоматически генерит, наверное, не страшно. Если CSS-only вариант нравится больше, думаю, стоит при генерации HTML добавлять отдельный attribute с timestamp'ом: поддержке :has вроде всего два года как.
'<img class="spoiler-holder" src="' . TimestampToSpoiler() . '"></img>'
css/spoilers
url(attr())
background-image: if(mod(attr(), --spoiler_count), ..., ...)
.catalogpic.spoiler-image:has(:is(img[src*="0s."],img[src*="1s."]))::after, .spoiler-image.imglink:is(a[data-full-src*="0."],a[data-full-src*="1."])::after { background-image: url('/css/spoilers/spoiler-koromo.png'); } .catalogpic.spoiler-image:has(:is(img[src*="2s."],img[src*="3s."]))::after, .spoiler-image.imglink:is(a[data-full-src*="2."],a[data-full-src*="3."])::after { background-image: url('/css/spoilers/sp-test-gold-cyr.png'); }
spoilers.css
spoilers
:has
>>/b/1004675 Думаю, стоит повесить баннер.
>>1000486 >>1000487 Обновлено, спасибо.>MDN говорит, что url(attr()) нельзя.Да, тогда ттолько оверлеем через css. >TimestampToSpoiler()Я попробую сделать что-нибудь поинтереснее, чтобы картинки не менялись от количества спойлеров. Да, базу править конечно, но щито поделать.
>>1000488> Да, базу править конечно, но щито поделать.Ну, можно отсортировать файлы-заглушки по дате-времени их создания в ФС, и выбирать по модулю только из тех заглушек, которые созданы не позже прикрепляемой картинки. Но лучше, наверное, всё-таки отдельную таблицу для этого, сделав timestamp заглушки unique. А можно никаких миграций не делать и выкрутиться, как с баннерами: заведя отдельную закртыдоску под них, скажем, spoilers. Хотя вот для баннеров Соус призывает отказаться от такого подхода. Альтернативно, можно позволить заглушкам для старых картинок обновляться и воспользоваться consistent hashing, тогда от добавления одной новой заглушки к N имеющимся вероятность того, что заглушка у картинки поменяется будет circa 1/N. Но это при условии, что порядок файлов в выдаче scandir() от добавления не поменялся. Скажем, https://arxiv.org/pdf/1406.2294 int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) { int64_t b = 1, j = 0; while (j < num_buckets) { b = j; key = key * 2862933555777941757ULL + 1; j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1)); } return b; } O(ln num_buckets) в среднем.
int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) { int64_t b = 1, j = 0; while (j < num_buckets) { b = j; key = key * 2862933555777941757ULL + 1; j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1)); } return b; }
>>/b/1004760> За-escape'ить тильдой объявление списка в данном случае нельзя. Точнее, нельзя за-escape'ить только его: вместе с ним за-escape'ится и конец цитаты. Всё-таки стоило разделить "\r\n- " и иже на два mark'а. Позволило бы более интуитивно-потятно escape'ить списки заодно, хотя, возможно, и усложнило бы кодВнезапно, всё оказалось достаточно просто. Даже проще, чем было. Теперь можно escape-ить окончание (пункта) списка и его объявление отдельно. Что позволяет escape-ить список тильдой на той же строке. >>1000411 …И что, судя по всему, без особой возни и без ввода новых элементов разметки позволяет запилить вложенные списки. Надо или нет? >>1000457 Починено. >>/b/1004763 Парсер теперь понимает и одиночные CR и LF. Надо проверить, решит ли проблему. Патч в архиве.
BTW, стоит ли вернуть GetCWebpath в inc/func/paths.php? У нас, скорее всего, из-за этого https://014chan.org/news.php ошибку 500 сейчас возвращает. Кажется, меня с manage.php тоже возникла какая-то похожая проблема, но я уже не помню точно.
>>1000492 Не стоит, проще убрать остатки использования что были пропущены в прошлый раз.
This is a test.
>>1000494Я импортировал >>1000491 но не предложенные изменения на 410.
>>1000494Должно быть починено.