LINUX.ORG.RU

Релиз HTML-парсера MyHTML

 ,


1

6

После нескольких месяцев разработки увидел свет первый релиз быстрого и самодостаточного HTML-парсера MyHTML. Код написан на языке Си и распространяется под лицензией GNU LGPL v2.1.

Автор планирует в скором времени закончить разработку самодостаточного парсера CSS под названием MyCSS, нового HTML-рендерера, обработчика JavaScript и, возможно, других интересных штук.

В ходе тестов MyHTML уже обогнал парсер HTML из Servo — html5ever.

>>> Подробности

anonymous

Проверено: Klymedy ()

принципального нового html рендера

попахивает Дениской Поповым, не чувствуете?

anonymous ()
Ответ на: комментарий от anonymous

Это просто топикстартер объелся конфет.

anonymous ()

В ходе тестов MyHTML уже обогнал парсер HTML из Servo — html5ever.

растокапец


p.s. где доки? по css правилам теги умеет брать?

umren ★★★★★ ()

На Болдженосе не компилится, исправь.

anonymous ()

Ужасный код. size_t myhtml_tokenizer_end_state_data(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_self_closing_start_tag(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_markup_declaration_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_before_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_after_attribute_name(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_before_attribute_value(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_attribute_value_double_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_attribute_value_single_quoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_attribute_value_unquoted(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_comment_start(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_comment_start_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_comment(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_comment_end(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_comment_end_dash(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_comment_end_bang(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_bogus_comment(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); size_t myhtml_tokenizer_end_state_cdata_section(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size);

anonymous ()

Fast C/C++ HTML 5 Parser. Using threads.

Откуда там C++ взялся, интересно

anonymous ()

Невалидный html корректно обрабатывается?

static_lab ★★★★★ ()
Ответ на: комментарий от anonymous

А в README.md

MyHTML is a fast HTML Parser using Threads implemented as a pure C99 library with no outside dependencies.

anonymous ()
Ответ на: комментарий от static_lab

А как можно корректно обрабатывать невалидный html?

SZT ★★★★ ()
 C 76.2%	 C++ 23.0%	 Other 0.8%

довольно редкое явление в наши дни, успехов господину Борисову.

Я правильно понимаю, что оно быстрее, чем Nokogiri, который на тормозных джаве и руби?

slon ()

сколько весит собранный? В МК это было бы очень кстати.

SL_RU ★★★ ()
Ответ на: комментарий от anonymous

ужасный анонимус, не умеющий ставить разметку

Deleted ()

А зачем там многопоточность? Парсить в несколько потоков? Разве в этом можно много выиграть?

Кода как-то неожиданно много. Вы вручную все писали? Можно же было генерировать автомат из какого-то описания? Хотя может быть хтмл не так просто формализовать.

В целом конечно внушает. Полайкал на гитхабе. Хотелось бы посмотреть на продолжение, css и js.

Deleted ()

Автор молодец, желаю успехов, проект нужный и как инструмент для разбора реальных страниц и как потенциальный кандидат на движок браузера когда-нибудь.

ixrws ★★ ()

Очень круто, как раз что-то подобное в будущем пригодится.

Int64 ★★★ ()
Ответ на: комментарий от SZT

ну браузеры как-то справляются) 90% сайтов не проходят w3c-валидатор

boombick ★★★★★ ()
Ответ на: комментарий от SZT

А как можно корректно обрабатывать невалидный html?

без сегфолтов идыр в безопасности,за счет которых он(этот парсер) «так быстро работает»

добавить затычки всем дырам(коих там тыщи ибо сдвиги сложения букв и быстрые поиски по числовому коду символа(числовым методом а не буквенным))
убрать все сегфолты

и вуаля-новый старый вебкит на 200мб со всеми затычками чтоб html не получал рут доступ

jsi36331 ()
Ответ на: комментарий от anonymous

Нет, хочу сделать отрисовщик интерфейса на OpenGL по HTML верстке и с CSS стилями. Только чтобы это было на C++ а не в браузере.

Int64 ★★★ ()
Ответ на: комментарий от jsi36331

Так Rust же обещали делать со скоростью Си, нет?

anonymous ()
Ответ на: комментарий от slon

Учитывая, что 23% C++ - это GitHub так *.h файлы обрабатывает.

Deleted ()

MyHTML уже обогнал парсер HTML из Servo — html5ever

Парсит быстро, только такая фингя получаетася

Zubchick ()
Ответ на: комментарий от anonymous

все «скриптовые» компиляторы/интерпретаторы/трансляторы-работают «супербыстро» пока там нет лишних условий на «защиту от дурака»(невалидного кода входящего)

а как только миллионы условий появляются-все становиться такимже как вебкит

сейчасже я уверен что получить «рут доступ из html» в этом «движке» можно поковыряв первые 100строк кода функции main в этом проекте(ибо там уже будут адреса и быстрые копирования мемцпи выделения размеров...быстрое ага..и небезопасное)

jsi36331 ()
Ответ на: комментарий от jsi36331

html не получал рут доступ

Можно ссылку на уязвимость? А то, получается, Дениска прав.

Кстати, эти штуки делаются по принципу KISS и с нуля, а не на базе KHTML как webkit.

anonymous ()

А зачем делать многопоточный парсер, для каких задач это удобно?

- Для поискового бота смысла нет, проще запустить несколько потоков на парсинг разных страниц. Проще, а по скорости выхлоп тот же.

- Для рендеринга страницы со стилями опять же выигрыша не будет, парсинг наверное 3-5% времени займет. Остальные 95% уйдут на стили, позиционирование элементов и вывод на экран. А если сюда еще javascript добавить, то просто не понятен смысл.

Возникает вопрос, зачем, что я упустил?

foror ★★★★ ()
Ответ на: комментарий от jsi36331

Я заплачу тебе 2 тыщи рублей, если ты найдешь уязвимость позволяющую получить root-доступ в этом MyHTML.

anonymous ()
Ответ на: комментарий от anonymous

И да, я говорю об запуске от обычного user'а, не root.

anonymous ()

У автора плохая фантазия, вестимо.

anonymous ()
Ответ на: комментарий от anonymous

попахивает Дениской Поповым, не чувствуете?

это нормально
рендеринг html - это больная тема

kto_tama ★★★★★ ()

Спасибо, хорошая штука.

EXL ★★★★★ ()
Ответ на: комментарий от foror

Возникает вопрос, зачем, что я упустил?

Видимо твои рассчеты неверны, в огнелисе же тоже хотят со временем внедрить подобную штуку на Расте, видимо выйгрыш там значительно больше.

umren ★★★★★ ()
Ответ на: комментарий от SZT

Добро пожаловать в мир браузеров. Вообще говоря, сейчас в стандарте есть информация о том, что и как делать. Вот когда не было, это было да. Можешь винить во всём неосиляторов, которые не смогли XML.

anonymous ()

Дениска поступил в универ и ему там показали сишечку и треды.

anonymous ()
Ответ на: комментарий от jsi36331

то о чем ты рассказываешь называется переполнение буффера а не «рут доступ»

anonymous ()
Ответ на: комментарий от umren

Они хотят многопоточный рендерниг, а не парсер.

Weres ★★★ ()
Ответ на: комментарий от boombick

Это как раз плохо. Надо попросту не показывать невалидные сайты (т.е. при первом же затыке прекращать парсинг и написать что-то вроде «этот сайт с ошбиками и показывать мы его не будем»). И тогда таких сайтов попросту не будет. А т.к. браузеры, вместо того чтобы слать такие невалидные сайты на 3 буквы, пытаются их как-то худо-бедно показать, получается что

  • Любой новый браузер должен уметь эти невалидные HTML показывать, вместо того, чтобы послать на три буквы, потому что этих невалидных HTML много. А много их потому что см пункт 2.
  • Есть куча сайтов с невалидным HTML. А много их потому что см пункт 1.

Замкнутый круг

SZT ★★★★ ()
Ответ на: комментарий от SZT

Это как раз плохо. Надо попросту не показывать невалидные сайты..

Вроде была такая идея у кого-то, в итоге победили браузеры которые нормально показывают кривой хтмл.

umren ★★★★★ ()
Ответ на: комментарий от umren

Надо бы всем создателям браузеров скооперироваться

SZT ★★★★ ()
Ответ на: комментарий от SZT

Да им плевать походу. Да и это уже не особо проблема, костыли уже все написаны, а то что порог входа выше для новых браузерных движков - как это волнует гугл, мс, мозиллу и эппл? никак

umren ★★★★★ ()
Ответ на: комментарий от SZT

Жёстко проверять валидность не пойдёт — несовместимо вперёд. Но well-formedness можно было бы. Но не осилили.

anonymous ()
Ответ на: комментарий от SZT

Судя по тому, что браузеры это делают дольше, чем существует ЛОР, как-то можно.

anonymous ()
Ответ на: комментарий от anonymous

Понятие «корректно обрабатывать» неприменимо тут. Ну т.е. ни о какой корректности речи уже быть не может т.к. у каждого браузера может быть свое представление о том, как этот невалидный HTML правильно отобразить. Это примерно как UB в компиляторах

SZT ★★★★ ()
Ответ на: комментарий от SZT

Применимо или нет — вопрос философский. Факт, что современный браузер может отрендерить невалидный HTML, при чём в большинстве случаев правильно угадав, что же имел в виду автор. С точки зрения пользователя, если результат на экране соответствует ожиданиям, это можно назвать назвать «корректной обработкой».

anonymous ()
Ответ на: комментарий от SZT

Надо попросту не показывать невалидные сайты (т.е. при первом же затыке прекращать парсинг и написать что-то вроде «этот сайт с ошбиками и показывать мы его не будем»).

И стремительно потерять пользовательскую базу, которой этот пуризм не интересен, а вместе с ней и деньги? Что-то мне подсказывает, что бизнес так не работает.

anonymous ()
Ответ на: комментарий от anonymous

что не так с ним? длинные имена?

anonymous ()

самодостаточного парсера CSS под названием MyCSS, нового HTML-рендерера

Под названием MyRender.

обработчика JavaScript

Под названием MyJavaScript.

и, возможно, других интересных штук.

Главное, реляционную базу данных не делать. А то засудить могут-с.

atrus ★★★★★ ()
Ответ на: комментарий от SZT

А как можно корректно обрабатывать невалидный html?

Обыкновенно, пытаясь угадать «что хотел сказать автор». Если правильно помню, одной из фишек html5 как раз и было «мы установим одинаковые для всех правила обработки ошибок».

atrus ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.