- 1
- 2
- 3
- 4
- 5
_RE_DESCRIPTION_TAG_OPEN = re.compile(r'<p\s+class="description">'.encode('utf-8'))
_RE_DESCRIPTION_TAG_CLOSE = re.compile(r'</p>\s*<p\s+class="author">'.encode('utf-8'))
def replace_description_tag(content, new_tag):
content = _RE_DESCRIPTION_TAG_OPEN .sub(f'<{new_tag} class="description">'.encode('utf-8'), content)
return _RE_DESCRIPTION_TAG_CLOSE.sub(f'</{new_tag}><p class="author">'.encode('utf-8'), content)
Парсить HTML регулярками — нельзя. Но если HTML невалидный — то можно!
А дело в том, что ГК генерирует говно, которое пришлось фиксить таким вот диким образом, см. https://govnokod.ru/26373#comment522056.
Любой формат с тегами используют только идиоты.
HTML имеет смысл только для страницы браузера, читаемой человеком.
Очевидно, что всё остальное - ненужно.
На базе этого говна ты ничего нормального не сделаешь.
Любой теговый формат - мусор.
Любая обработка тегов - мусор.
Любые данные в теговом виде - мусор.
Ровно с тех пор, как разработчики браузеров осознали, что переучивать веб-макак (а среди них программистов практически не было) писать валидное говно - себе дороже. Проще напидорасить костылей. Тут забыли закрыть тег? Похуй, где-нибудь сами закроем. Незаэскейпленный амперсанд в урле? Сами заэскейпим. Макака не знает про doctype? Ну и хуй с ним, нам тоже не особо-то и нужен. Невалидный CSS? Проигнорим, и без него что-то отображается. Макака передала не все аргументы в JS-функцию? Ну пусть будет undefined, вдруг прокатит.
Так и живем, и теперь это хуйня пиздит уже самих веб-макак -- надо теперь зубрить, в каком браузере что и как закостылено, и отлавливать примитивные баги всю ночь, оставаясь в офисе на неоплачиваемый овертайм.
https://www.setwalls.ru/pic/201304/2560x1440/setwalls.ru-19347.jpg
Может, проблема в том, что веб стал решать совсем не те проблемы, для которых изначально создавался? Что HTML, CSS и тем более JS это в принципе не лучшие инструменты для SPA с кучей медиа и канвасами?
Они начинаются с тегов <script> <link> <iframe>
<img src="javascript:scriptushok.koko()">
Но с появления вёба, таких трюков придумали миллионы.
И каждый раз в браузеры впиливают всё новые костыли, проверки и говнотехнологии типа corsов, js-only кукисов, SameSite.
говно. ЧТД
HTML говно выглядит как говно, и работает как говно.
Поскольку является ёбанным, неортогональным, избыточным, оверхедным, ансекьюрным говном.
То есть оригинальный HTML это что-то типа сегодняшнего мракдауна (ну ок, чуть сложнее, но не суть). Достаточно простая штука для элементарных вещей. Ну как заметку добавить. А потом кто-то решил, что ПОРА: вебдваноль, виджеты-хуиджеты, спа, анимации и фейерверки, резиновый дизайн, мобильные версии, вебсокеты.
Представим себе, что браузеры начали нативно поддерживать маркдаун. И уже через полгода в нём: img, svg, call, angularMd, MarkDart...
И вообще, макаке всё равно на каком языке говнометать, на простом для обучения или на сложном. А вот царю нужна простота и эффективность и массив
> неосуществимо
Осуществимо, просто нужно идти не от требований макак, а от требований людей и далее упрощать интерфейс между человеком и машиной, делать его удобней. А также набираться духу и вовремя сливать старые версии в унитаз и создавать язык с нуля, оставляя интерпретатор старой версии в браузере только с правками безопасности.
Например, foreach делает работу удобной, UB - неудобной и непредсказуемой, автокасты - удобной до какой-то степени, исключения - удобной и непредсказуемой и т.п.
Python 3.
Не взлетит.
Компилим всё под ВМ, а там уже оптимизации и жиды.
Ну вот Жабу уже стандартизировали.
Почему-то jvm-ололоязычки не особо взлетели.
Самый жопулярным жвм-языком остаётся эта самая жаба.
>оставляя интерпретатор старой версии в браузере только с правками безопасности
И что это даст? Мало того что в старых браузерах не работает новая хипстерская срань, так ещё и новые будут пухнуть от кучи разных интепретаторов старья.
Тот же Котлин занял свою нишу и в ней потихоньку становится стандартом. С Жабой в целом сравнивать смешно, но - повторюсь - ниша застолблена.
Кроме jvm есть ещё пример llvm. Вопрос же в целесообразности и политической воле. Почему нельзя встроить в браузеры интерпретатор байткода llvm или что там у него?
Кресты, Кресты, Кресты.
Написан крестовиками на крестах, как бекэнд для clang (компилятор крестов).
>Почему нельзя встроить в браузеры интерпретатор байткода llvm или что там у него?
Царь недавно всё объяснил.
https://tsar1997.blogspot.com/2019/10/wasm.html
Так царь типа за wasm?
Как раньше не работала - так и потом не работает. Сейчас ровно то же самое. Даже страница Гугла (одно сраное поле ввода) уже скорее всего в IE5 нормально не откроется.
> новые будут пухнуть от кучи разных интепретаторов старья
Сейчас они всё равно пухнут от интерпретаторов новья и реализации хаков для использования хаков в стандарте для борьбы с предыдущими хаками для предыдущих хаков в стандарте. Что проще, реализовать новый продуманный язык без говна, или впиливать питушню для поддержки "use script", править код в неожиданных местах, который уже никто не помнит, что делает, вставлять затычки для новых багов?
Хаха. Да в мире кодинга, пожалуй нету задачи сложнее, чем реализовать такой язык «без говна».
https://xkcd.com/927
Опять же не понят мой исходный коммент.
Не передать сколько боли было в питух сообществе при портировании сырцов с 2ки на 3ку.
Иначе можно было оставить старые классы на 2, а новые писать на 3. Вот NodeJS поддерживает и свои модули CommonJS, и модули новомодных версий JS, можно элементарным образом в одном сервере использовать сразу и старое говно, и новое говно.
Есть же питухизация типов, чтобы JS поднять в TypeScript без переписывания? Есть же сишные библиотеки, которые работают в питоне без переписывания алгоритма? Так почему с C на Python переписывать не надо было, а с Python на Python - надо?
Ну вот работает же оно как-то вместе. У меня под Windows с интелловским процессором можно запускать как Python2, так и Python3. Работают на одном и том же железе.
И вообще, я же писал про C. Почему модули на C, языке без ГЦ, обязательных табов и с указателями вместо ссылок, смогли прокинуть в python? Почему в C++, где имена функций компилятся в совершенно другие иероглифы, чем было бы в C, в стандарте описывается несовместимая питушня, и где было норм, стало УБ, смогли прокинуть сишную питушню?
Это потому, что и «Python2», и «Python3» — это программы, написанные на «C» и переведённые на мышиные коды одного и того же ISA.
> Почему модули на C смогли прокинуть в python?
Аналогично, потому что интерпретатор «Python», сконпелированный в мышиные коды, позволяет дёргать другие мышиные коды.
Да, идея создания единой ВМ с едиными инструкциями и полной совместимостью всех со всеми а-ля asm выглядит круто, но у этого подхода есть несколько крупных подводных камней.
1. Неизменность ВМ. Мы не можем вносить изменения в то, как работают уже задокументированные инструкции — иначе сломается вообще всё. Да, перекомпиляция может быть частичным выходом — но, будь у нас полный и тотальный опенсорс, жить вообще было бы легче.
2. Несовместимость высокоуровневых абстракций. Любые структуры данных и уникальные концепции языка придётся переводить сначала в термины ВМ, а потом — обратно, причём делать это по каким-то сложным правилам. Эти правила тоже могут (а на длительном отрезке времени — будут) меняться, и в результате мы получим, что в одной версии языка какая-нибудь UTF-строка будет с квадратиками, а в другой — со смайликами. Всё, потеря совместимости, цирк, пиздец.
3. Сложность межязыковых и межверсионных вызовов. Далеко ходить не надо, достаточно попробовать сделать библиотеку с функцией, возвращающей std::string. Спойлер: работать будет только с модулями, скомпилированными одной и той же версией компилятора, на одной и той же машине и с одними и теми же флагами. И то не факт. С сишкой всё было куда проще, потому что по факту в ней не нет никаких высокоуровневых абстракций, а всё что есть — плюс-минус идеально ложится на x86. Она, по сути, просто удобный ассемблер с хорошим препроцессором
Питон сочетает лучшее из двух миров: портабельность сишки и скорость интерпретируемой скриптухи.
Поломаются только компиляторы старых версий языка, и их заставят компилировать код под новую ВМ. Может быть, это будет медленней, но это не важно, т.к. рост производительности восполнит эту потерю, а свежее производительное говно будут клепать под новые версии. Но ничего из пользовательского кода переписывать не надо будет.
Совсем старые версии будут медленно отмирать как отмерла сейчас 16битная питушня. Но это будет всё равно лучше, чем сейчас, когда твой код не отмирает явно и сразу по чьему-то приказу о конце поддержки, а постепенно становится невалидным из-за множества мелких изменений.
Почему?
Для связки языков нужны некие интерфейсы.
Вызовы старых кодов js (как стандарта де-факто) будут возвращать «новым» «улучшеным» версиям языка jsные объекты. Потому что ничего другого там нет.
А это старые-добрые костыльные мапы с valueOf и toString.
То есть из «нового» языка всегда будут торчать уши старого.
Потому сишка до сих пор — основа. Минималистичная и божественная.
Если baseline язык использует исключения, придётся везде иметь исключения (-fno-exceptions никто не будет пилить).
Если там есть рефлексия или рантайм инфа по типам, то и её нужно везде поддерживать.
Если есть именованные аргументы — без них ABI опять поломаются.
Добавлю ещё всякой ООП-питушни.
Множественное наследование, наследование реализации, интерфейсы, миксины;
Поддержка свободных функций. В «Java», например, нет никаких «функций» (только «методы»), и именно поэтому в «JVM» у инструкций invoke* есть обязательный параметр объекта/класса. Хочешь компилить под «JVM» язык со свободными функциями — изволь городить ёбанные костыли со скрытыми классами-пространствами имён.
Модификаторы доступа — начиная тем, что в каких-то языках могут быть более хитрые модификаторы, типа недавно обсуждавшегося на «ГК» «strict_private» (поля, к которым есть доступ только из «private» методов), и заканчивая языками с полным их отсутствием.
В общем, так можно продолжать до бесконечности, а решение всех этих проблем было придумано давным-давно: спуститься на несколько уровней ниже, где ничего, кроме байтов, и нет. А над всеми этими питушарскими абстракциями пусть конпеляторы пыхтят.
Ах да, и чтоб гомоиконы!
Что это такое?
В каждом треде какой-то ФП-мемчик, который я пропустил.
Сепульки какие-то нетрадиционной ориентации?
А вот — главный артефакт гомоиконистов, Первая Гомоикона:
ЛООООЛ. Вот теперь всё стало ясно.
Картинка вместо тысячи слов.
>Это Философский Камень и Великая Мечта j123123
Н-н-н-нооо тут есть логическое противоречие.
В сиподобных языках, реализация гомоиконности мне кажется принципиально невозможной. Это как постройка вечного двигателя.
Именно в силу царской императивности и нерегулярности синтаксиса.
Скорее как поиск девяти миллиардов имён Бога. Стремление к Абсолюту, к Вечности.
https://ru.wikipedia.org/wiki/Девять_миллиардов_имён_Бога
У Аллаха, мир Ему, C99 имён.
>Стремление к Абсолюту, к Вечности.
Так это и есть С++. Должен быть миллион парадигм. Одновременно ноль, одна, сто, девять миллиардов и бесконечность.
Это помогает понять суть и даёт умение облекать её в произвольные формы.
Разные парадигмы, в которых можно сказать одно и том же.
С++ учит мыслить шире и не привязываться к синтаксической конкретике, помогает уйти от операторов к голым идеям и архетипам.
Как учил Платон, который доработал сишный идеализм Сократа, в объективный идеализм.
А заедушники увязли в балаболии, так и не научившись абстрагировать идею от формы.
https://ru.wikipedia.org/wiki/99_имён_Аллаха
Так а в чём проблем? Дать доступ пргорамме к своему АСТ.
Или можно сделать как в форте, дать программе доступ к исходнику, переменным и подпрограммам транслятора и конпелятора, дать доступ к мискоуровневому коду.
Наипервейшая проблема в том что нотация инфиксная. То есть код невозможно выразить как формат данных.
Это не лисп где нотация префиксная, и не форт, где она постфиксная.
>Дать доступ пргорамме к своему АСТ.
Это не будет гомоиконность. Мы должны манипулировать не АСТ, а исходными кодом-данными. Должен быть так сказать self-eval.
А если делать гомоиконы по образу форта, то уже будет реальный доступ и к исходному, и к скомпилированному коду, ибо гомоиконы там царские, императивные и низкоуровневые: в нём есть доступ к сырому исходнику, как к байтам в памяти, такой же доступ к скомпилированному коду, к записям в словаре и т.д. Вдобавок форт могут парсить сами же фортовские определения по мере исполнения, т.е. в форте нотация постфиксная только для начального набора слов, и то не для всех, многие слова являются префиксными, особенно определяющие слова, так же есть слова берущие аргументы сразу и из стека, и из исходного кода — эти слова вполне можно считать инфиксными. Т.е. в отличии от лиспа и всех прочих языков в форте нет ни какого-то фиксированного синтаксиса, ни даже фиксированного лексического строения, в программе на форте можно встретить абсолютно любую конструкцию и охуеть, я даже встречал интерпретатор васика на форте, который являлся просто набором форт-слов, такую же питушню можно проделать и для си-подобного синиаксиса.
>Гомоиконных фортраноподобных языков не может быть по определению (т.как в доисторические времена, люди которые планировали Алгол считали, что язык должен состоять из трех уровней, "машинного кода", т.е. непосредственно набора инструкций, "обобщенного представления", т.е. непосредственно правил языка, "конкретных интерпретаций" правил языка, например, локализаций, экстрапозиций и т.д.)
Реально за все эти годы я осознал, что Философский Камень всегда был у нас в кармане — и это С++
Лисп-машины остались лишь фантазиями wvxvw. Может какая-то извращённая форма AOT. Однако неизбежно остаётся интерпретируемый eval.
Если под гомоиконностью понимается простота, что я могу за день написать парсер и тормозной, но рабочий интерпретатор байт-кода вм (в отличие от жабы или питона), то это ок.
Но опять же... Слишком широкое понятие.
Думаю, обратно тоже можно прокинуть, если нужно.
А уж сделать такое, когда вся логика компиляторов подчиняется тебе, вполне реально.
* Исключения - обернуть try-catch и кодом возврата,
* кодам возврата сгенерировать исключения,
* имена классов вписать в имена методов, если классы были, не не стало,
* сгенерировать класс по имени файла, если классов не было, но появились,
Главное - чтобы старый код внешне работал как раньше, а новый уже может в случае смены парадигмы приспосабливаться и вызывать fileX_Pitux22E1_kokok(&p) из старой библиотеки вместо p.kokok();
Да нихера не удалось. Точнее удалось вызвать менее мудрённый язык из более мудрённого.
Но для этого не надо много ума.
Питух вызывает Сишку, но не наоборот.
Сишка — основа.
Питух не может быть основой, ибо это анскильная скриптуха.
В противном случае питух3 пилился бы на основе питуха2.
Не хотелось разрушать ваши фантазии, но дело в том что совершенно разные языки не смогут гладко взаимодействовать между собой.
Это профанский взгляд человека, который никогда не линковал/перелинковывал разные abi с разными вызовами.
У нас есть бибилотека собранная под процессор интел. Она написана на языке с определённой фичей (например exceptions).
Мы пытаемся слиниковать её с другим языком где этой фичи нет.
Какой выход из ситуации?
Или у нас есть исключения, но на уровне VM реализованы они с разной семантикой (dwarf, sjlj).
Гладкое взаимодействие не нужно. Старый код должен работать как раньше, новый код может использовать костыли для вызова старого.
Старый код может вызываться через дополнительные абстракции, т.к. он был написан под старые машины, которые требовали меньше.
ABI не нужно. У нас же браузер, компилятору все исходники доступны. Совместимость версий проверена авторами компилятора, код просто компилируется новым компилятором и работает.
Да, будут ситуации, когда какой-то пидор использовал недокументированную питушню, и его код сломался, но его предупреждали.
Эээ. Изначально речь, насколько я помню была о VM.
Там уже не будет исходников, а будет скомплированная в байт-код новомодная скриптуха. Причём совершенно произвольная.
В теории много разных скриптух, оперирующих разными парадигмами будут конпелироваться в единый байт-код.
Идея была в том, чтобы иметь возможность перегонять исходники в VM всё более и более свежими компиляторами, а байткод под VM уже единообразно оптимизировать/исполнять/кобенировать каким-нибудь мощным питуизатором. Так, чтобы компиляторы в байткод были наиболее простыми, и всякая сложная питушня, связанная со строением VM и алгоритмами питуизации, менялась редко и мало.
Говно это.
Есть такое. Но мало того.
Они же в последних версиях сломали компиляцию старых исходников. Write once — ебись everytime.
Если раньше был валидный ява-код, использующий например переменную-подчёркивание _
То в новых версиях явы он тупо не скомпилится.
Потому что получилось говно непортабельное. Есть ВМ машина, и есть нативные костыли из сишных либ.
Реально единственная вещь где ничего не нужно было переписывать с сишки — это кресты. И то, здесь их все регулярно обсирают.
Ну и если макака уже научилась нагугливать работающий код на SO, научилась вставлять его в нужные места, это говорит о её потенциале и способности учиться.
Оно изначально нацеливалось на заедушников.
В самом прямом смысле этого слова.
HTML делали для биомусора, который «пишет» «сайты» за жратву.
Питушня теоретиков, оторванных от жизни. Уууух, как бесит!
Вариант 1. В Perl, PHP, boost::regex можно рекурсивными питухами описывать ко-ко-контекстно-свободную питушню.
https://www.boost.org/doc/libs/1_64_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html#boost_regex.syntax.perl_syntax.recursive_expressions
Вариант 2. Часто, как и в обсуждаемом коде, регулярки используются внутри кода под машину Питуринга, который уже может парсить всё, что угодно.
Вариант 3. Используется не сам HTML, а его подмножество.
Вариант 4. Парсить надо не весь HTML, а его подмножество.
https://cs.pikabu.ru/post_img/2013/07/10/0/1373402952_1118716031.jpg
https://edge.alluremedia.com.au/m/g/2013/03/ggrave.jpg
http://www-bgr-com.vimg.net/wp-content/uploads/2011/11/7723.Google_Graveyard2.jpg-550x0.jpg
>предельно быстрый, очень простой и совершенно не перегруженный ненужным говном
Geeqie
Xnview-mp
Нет, я не спорю, что эти комбайны наверняка дают куда больше возможностей по организации галерей, систематизации гигабайт фотографий и тому подобное — но вот этого предельного функционального минимализма, который был (увы, в прошедшем времени) визитной карточкой «Гугла», у них нет.
Мерзкая питушня. Привязывать что-то такое к колёсику - грешновато. В самой Windows есть настройка, сколько у.е. значит один щелчок колеса. Но есть ведь ещё и тачпады, где собственное ПО может оверрайдить эту настройку и накручивать какую-то логику. Но что важно, если даже на мыши можно легко прокрутить больше, чем надо, на тачпаде ты вовсе не чувствуешь, что есть один щелчок, а что - много.
Колёсико мыши - зло.
Это настраивается.
В нём оч. удобно сразу редактировать фотки, типа обрезать JPEG без потерь.
Да, это я заметил, когда пытался сдвинуть фотку к краю экрана.
Это как в ворде, когда посылаешь резюме с твоим фото по грудь, а ихний админ вдруг узнаёт всех твоих друзей-бухариков и обстановку вашего гаража?
Надо будет орнуть и так сделать в следующий раз.
Короче, не происходит Generation loss. То есть не проводится iQ+iDCT => raw => DCT+Q.
2. https://jpegclub.org/losslessapps.html
3. https://www.betterjpeg.com/crop.htm
Оно также умеет делать loseless rotate 90/180/270
И resize 1 к 8.
Какой скилл )))
Спасибо!
Так же и Google+
Когда нормальный человек регистрирует почту, он подразумевает, что с ней связаны имя-фамилия, которые будут стоять в поле From. Обычно это Иван Иванов <[email protected]> Иначе заводить почту не требуется, т.к. теряется вся суть. И если кто-то узнал, что [email protected] принадлежит Ивану Иванову, то это просто удобно, и удобно как для Ивана Иванова, так и для его адресантов.
Когда человек хочет остаться анонимным, он создаёт учётную запись почты с логином, который не напоминает о его имени и вводит фэйковые имя-фамилию. Разве не логично?
На сайтах гугла ещё почему-то иногда скидку предлагают.
• «iGoogle» — это самый настоящий проект «веб-джва-ноль». Ты мог собирать страницу из виджетов. Что-то типа расшаренного рабочего стола. Таких проектов было немного. У «Яндекса» и у «Яху» было что-то аналогичное, были отдельные проекты «Pageflakes» и «Netvibes». Последний вроде даже живой.
Всё прочее, что называют «вебджванольным», на самом деле не передаёт суть «Web 2.0».
• «KNOL» — было столько шума. Называли убийцей «Википедии».
• «Google Buzz» — предок «Твиттера» и «Гуглоплюса». Его создатели потом создали «Friendfeed», который был выкуплен и закрыт «Фейсбуком».
• «Jaiku» — ещё один «Твиттур».
• «Google Answers» — «Ответы@Mail.ru», только другого поставщика.
• «Google Talk» — по сути сервер «XMPP» («Jabber»).
Помню, что много шума было про «Google Wave», но его закрыли сразу после бета-тестирования, так что я даже не успел узнать, что это такое.
>я даже не успел узнать, что это такое
Что-то похожее на гуглдок, с совместным редактированием.
Оно ж появилось раньше гитхаба. И было гораздо удобнее svn-sourceforge.
Ещё у них была воистину охуенная задумка, сделать поиск по соц. сетям типа Яндекс.Блогов. Google Blog Search. Но её закрыли.
Теперь даже в гугловом ютубе хер найдёшь нужный коммент.
Слава богам! Там обычно пишут такое, что не то что найти не хочется, но наоборот - только развидеть и больше никогда не встречать.
Такое ощущение, что аудитория Ютуба по большей части - идиоты. И тут даже не надо говорить о "давайте зарядем мобильник автора адин лайк адин працент". Даже к приличным видео популярны метакомментарии "а что просмотров меньше, чем лайков" или "90% комментариев про А, 10% про Б" или "никто: абсолютно никто: автор: <какая-то херня>" и подобное. И все они повторяются. Отдельный шик - повторять одну и ту же быдлошутку по быдломему.
Потому поиск по комментам ГК «нинужен»
Плюс там у них дебильный по своей природе принцип по умолчанию показывать первыми самые залайканные комментарии.
Компания, имя которой мутировало в глагол, обозначающий интернет-поиск, не может сделать нормальную индексацию текстовых комментариев НА СВОЁМ же сайте.
Мне одному кажется, что здесь какой-то подвох?
>что не то что найти не хочется, но наоборот - только развидеть и больше никогда не встречать
Просто не надо искать такое.
>или "никто: абсолютно никто: автор: <какая-то херня>" и подобное
Меньше надо смотреть видео «в трендах».
Не знаю, но лично мне такие коменты почти не попадаются.
А когда-то было ещё несколько автономных поисковых систем по блогам и по форумам, но их тоже закрыли.
Да. После того как Волож умер они скурвились.
Раньше Яндекс помнил по 10 лет, всё. Даже удаленные посты и записи.
А теперь остался только ljsear.ch
iGoogle стилизация странички поиска.
Зачем они берут труд миллионов людей, а потом просто всё закрывают?
Неужели у гугла места мало? Я уверен что они всю поступившую к ним инфу сохраняют и не стирают ничего вообще.
- 90% индустрии так работают. Дурные деньги, сэр.
Например, x = /<b>(.*?)<\/b>/ легче понять, чем раздутую грамматику XML или даже возню с нодами после парсинга стандартным парсером.
Регулярка для этого будет выглядеть пиздецом и, наверняка, тормозить.
А я при чём? Это к разработчикам «f-строк». А r да, надо на rb заменить.
> lxml пробовал?
>>> Я даже больше скажу: сейчас содержимое [code] — тег <pre> — в постах вываливается внутрь описания, которое из себя представляет элемент <p>. А внутри <p> использовать блочные теги нельзя. Такой HTML — невалидный. Умный же браузер (и столь же, мать его, умный lxml.etree.HTMLParser) просто тихо закрывает тег <p> перед <pre> — поэтому в сток и попадал только текст.
> Я там вроде написал
Не нашёл, проверь.
> тестовыми данными
HTML-код https://govnokod.ru/26373.
> рабочий проблемный кусок
«parse_post» в NGK до последнего коммита. Ну или можешь открыть https://govnokod.ru/26373 в браузере и в «Инспекторе элементов» полюбоваться на <p>, закрытый сразу перед <pre>. И на «<p></p>» в конце.
pip install --upgrade %
Какой багор )))
Кстати, почему в первом сообщении об ошибке кавычки двойные, а во втором — одинарные? Почему первое с маленькой буквы, а второе — с большой? Почему двоеточие только во втором сообщении? Разные люди писа́ли обработку ошибок?
ARB — наименьшая строка произвольных символов
*TAG — отложенное вычисление, значение TAG получают только при обращении к TAG_CONTENT, это нужно чтоб работала рукурсия в паттерне
| — наверное и так понятно, что это "или"
SOURCE TAG — собсно сам паттерн матчинг.
Точка присваивает совпадение в переменную справа, OUTPUT — "переменная" для вывода.
По «СНОБОЛу» вычислять надёжнее.
База обновляется вручную?
Начнём с хорошей: тебе не светит угодить в суп, так что кип ю чен ап!
Новость №2: жаркое из тебя получится вкусным...