LINUX.ORG.RU

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

 , myhtml


1

6

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

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

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

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

anonymous

Проверено: Klymedy ()
Последнее исправление: Klymedy (всего исправлений: 3)

принципального нового 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
()
Ответ на: комментарий от anonymous

А в README.md

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

anonymous
()
 C 76.2%	 C++ 23.0%	 Other 0.8%

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

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

slon
()

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

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

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

Deleted
()

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

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

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

Deleted
()

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

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

И этот успешно справляется.

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

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

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

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

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

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

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

Int64 ★★★
()
Ответ на: комментарий от 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
()

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

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

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

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

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

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

anonymous
()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

anonymous
()

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

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

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

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

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

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

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

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

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

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