Замечания и предложения по нему, а также их обсуждение. Предыдущий тред >>1000000.
Как-то так на моей лисе. Наверное, действительно течёт где-то. >>1000404 > но единственное отличие 0141 от 014 в нём Не единственное же. Есть изменения в kusaba.js.
>>1000405 Это очень долгий замер! У меня за пять минут все улетает. Ну и в "лисе", а надо на хромиум-подобных!
>>1000406 Или не течёт. Проверю в хромиуме чуть позже.
На TaskManager-е в Хромиуме memory footprint действительно растёт, но и периодически сбрасывается. Наверное, дело в сборке мусора.
Memory Snapshot за 5 минут, однако, ничего интересного не показывает.
>>1000391 Новости. У меня депрессия. tokenize → fix_integrity → print почти готово, оставалось бы только отдебажить, но поскольку [nofmt] и [code] сами по себе являются escaper'ами, для них нужно будет делать предобработку отдельным циклом и таки с lookahead'ом, и уже потом дотокенезировать гарантированно непокрытый активными [nofmt] или [code] блоками текст. Завис пока на этом. Иначе, как пока сейчас у меня в черновике, будет вывод «every mark after unclosed ` is **ignored** ». А должно быть «every mark after unclosed ` is ignored"». Also, погодя возник вопрос, что делать, если, скажем, для незакрытого [code] встречаются за-escape'ленные и escape-блоком другого типа, и тильдою [/code], например «[code] This is `NOW ~[/code]`». Думаю резолвить такой ввод как «[code] This is NOW ~[/code]» всё-таки. Другие заметки по надвигающемуся. Будет пофикшена ситуация (±костыльно, но можно будет включить и цитирование в обобщённую обработку)List end.> Citation Будет пофикшена ситуация %% - Bug. %% ↓↓↓↓↓↓↓ Bug.
NOW ~[/code]
>>1000410 Поправляйтесь. Ради развлечения, попробовал чисто теоретически сформулировать грамматикой. Выходит как-то не очень: Message => List\nMessage|Quote\nMessage|Paragraph\nMessage|EOF List => OrderedList|UnorderedList OrderedList => OLElement\nOrderedListContinuation|OLElement OrderedListContinuation => OLElement\nOrderedListContinuation|OLElement OLElement => +InlineParagraph|#InlineParagraph UnrderedList => ULElement\nUnorderedListContinuation|ULElement UnorderedListContinuation => ULElement\nUnorderedListContinuation|ULElement ULElement => -InlineParagraph|*InlineParagraph InlineParagraph => Line|Line~\nInlineParagraph Line => NoFmtLine,Line|CodeLine,Line|BoldLine,Line|ItalicLine,Line|UnderscoreLine,Line|StrikethroughLine,Line|AsciiLine,Line|SpoilerLine,Line|URL,Line|Text,Line|<empty> NoFmtLine => [nofmt]Text,NoEscape[/nofmt]|``Text,NoEscape`` CodeLine => [code]Text,NoEscape[/code]|`Text,NoEscape` BoldLine => [b]Line,NoEscape[/b]|**Line,NoEscape** ItalicLine => [i]Line,NoEscape[/i]|**Line,NoEscape** UnderscoreLine => [u]Line,NoEscape[/u] StrikethroughLine => [s]Line,NoEscape[/s]|^^Line,NoEscape^^ AsciiLine => [aa]Line,NoEscape[/aa] SpoilerLine => [spoiler]Line,NoEscape[/spoiler]|%%Line,NoEscape%% NoEscape => (~~)*|Text,(~~)* Text => [^\n]*? URL => (http|https|ftp|sftp|mailto)://[^, \n]+ Paragraph => NoFmtParagraph,Paragraph|CodeParagraph,Paragraph|BoldParagraph,Paragraph|ItalicParagraph,Paragraph|UnderscoreParagraph,Paragraph|StrikethroughParagraph,Paragraph|AsciiParagraph,Paragraph|SpoilerParagraph,Paragraph|Line,Paragraph|<empty> NoFmtParagraph => [nofmt]MLText,NoEscape[/nofmt]\n? CodeParagraph => [code]MLText,NoEscape[/code]\n? BoldParagraph => [b]\n?Paragraph\n?,NoEscape[/b]\n? ItalicParagraph => [i]\n?Paragraph\n?,NoEscape[/i]\n? UnderscoreParagraph => [u]\n?Paragraph\n?,NoEscape[/u]\n? StrikethroughParagraph => [s]\n?Paragraph\n?,NoEscape[/s]\n? AsciiParagraph => [aa]\n?Paragraph\n?,NoEscape[/aa]\n? SpoilerParagraph => [spoiler]\n?Paragraph\n?,NoEscape[/spoiler]\n? MLText => Text\nMLText|Text|\n|<empty> Хорошо что мы вложенные списки пока не даём.
>>1000411 А, ну и >>ссылки забыл добавить на одном уровне с урл и определить Quote как >Line. (или InlineParagraph?)
>>1000410 Готово. parse.class.php и markdown.html в архиве. Запилено, как оговорено, Кусаба-подобное поведение, пофикшено упомянутое в >>1000410 и >>/b/1004023 пофикшено тоже. Обработка (">", "\r\n") обобщённым токенизатором привела к конфликту с >>post_id, который был решён запихиванием обработки этого >>post_id в общий же токенизатор: как следствие, внутренние ссылки теперь подлежат escape-у. Возможно, стоит запихать в него же и обработку внешних ссылок, что может быть удобно, если хочется поместить ссылку под спойлер. InterboardQuoteCheck и InterthreadQuoteCheck я не трогал. Наверное, можно как-то красиво сжать определения констант, но я не стал заморачиваться. Часть debug_* функций я не стал удалять. Вдруг пригодятся.
> Поправляйтесь Спасибо. > чисто теоретически сформулировать грамматикой Тоже вот думалось, можно ли как-то это дело формально определить и скормить Bison-у, и чтобы оно само всё сгенерировало. Но у нас, вполне возможно, не context-free grammar. > Хорошо что мы вложенные списки пока не даём Scary.
>>1000413 It's up!
>>1000410 Мужик сказал — мужик сделал. Круто и ответственно!
Добавил URLы в обобщённую обработку. Теперь можно escape-ить начало URLа по ~. Условия, по которым терминируется URL, отличаются от оригинала.Пробельный символ;~ (поглощается);.,:;?!«»“”’… перед пробельным символом или в конце строки;Текст, соответствующий любому из тэгов разметки.То бишь, нет терминации по скобкам: чтобы отправить "Автобус (https://410chan.org/b/)" нужно будет набрать "Автобус (https://410chan.org/b/~)". Убрал возможность делать ссылки с ftp://-дескриптором, потому что FTP выпилен из современных браузеров, но там легко в url_start_subregex и в mark_to_mark_type по аналогии добавить. >> у >>post_link теперь тоже опознаётся через mark_to_mark_type, и токенизируется тем же, что и внешние ссылки, кодом. На будущее, должно быть легко g://here_goes_gelbooru_hash и p://pixiv_artwork_id добавить. Можно даже без префиксов-дескрипторов сделать. [nofmt] и `` теперь не превращают пробелы в неразрывные. Файлы в архиве.
.,:;?!«»“”’…
Also, надо бы поменять тип message столбца с text, на mediumtext. И на Чио тоже. Когда длина сообщения будет считаться по mb_strlen, вызвать переполнение будет даже проще, чем сейчас.
>>1000417>Firefox 90 will no longer support the FTP protocolОднако.
>>1000419 https://kb.mozillazine.org/Register_protocol Но есть такое вот. Так что, наверное, стоит поддержку ftp:// вернуть. Заодно ftps и sftp добавить. Может, ещё что-то? Также, если есть возможность как-то проверять, есть у протокола handler или нет, можно будет добавить в kusaba.js, чтобы по клику на ссылку происходило её копирование в случае, если нет.
>>1000417 Добавлено, но: 1. Оставил mailto, ftp, news 2. Оставил декодирование ссылок как было чтобы не нарваться на XSS из прошлого года >>1000418 TODO. Как и обновить код на кодберге. Ещё надо наверное проверить есть ли изменения в рендере от смены пробелов неразрывных на обычные в коде.
>>1000423 2. Я там убрал htmlspecialchars decode, потому что теперь не вызывается htmlspecialchars encode перед parsing-ом, prettify_url оставив тем же. Иначе получается, как на приложенной картинке. > есть ли изменения в рендере от смены пробелов неразрывных на обычные в коде.Я только для [nofmt] и для `` убрал. Не для [code] и `. Если убрать их и для [code], оно съест отступы.
BTW, если по запилу кодоподсветки оформлять развод, то, наверное, стоит и [nbsp] добавить.
Перетащу сюда всякое в видный пост чтобы не терялось. >>1000340 якорь добавить-перекрасить. >>1000344 sodane отдельным скриптом(?) >>1000402 попробовать это отладить. При желании можно костыль-версию добавить и включать или одно или другое по каким настройкам... Было бы ещё неплохо для модерки какой экран просмотра анимапчи...
>>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.
Докрасил таки.
Против добавления всех сразу ничего не имею.