Компания Google представила (http://google-opensource.blogspot.ru/2013/08/gumbo-c-library...) новую открытую библиотеку Gumbo (https://github.com/google/gumbo-parser), предоставляющую набор функций для разбора HTML, построенных на реализации алгоритма парсинга, описанного (http://www.whatwg.org/specs/web-apps/current-work/multipage/...) в стандарте HTML5. Код опубликован под лицензией Apache 2.0.В отличие от прошлых спецификаций HTML, стандарт HTML5 определяет единый алгоритм разбора HTML, позволяющий унифицировать работу парсера в различных браузерах. Проблема заключается в том, что существующие реализации алгоритма HTML5 либо привязаны к конкретным реализациям браузеров или движков рендеринга, что затрудняет их обособленное использование, либо написаны на скриптовых языках, что не позволяет добиться приемлемой производительности. Реализованный в Gumbo парсер проходит все тесты html5lib-0.95 (https://github.com/html5lib/html5lib-tests)) и готов для использования в качестве отдельного продукта.
Библиотека написана на языке Си и не требует для своей работы внешних зависимостей, что делает её интересным решением для использования в качестве основы для построения различных инструментов для проверки корректности, рафакторинга и анализа HTML, создания шаблонизаторов и других программ, манипулирующих разметкой HTML. Предоставляемый Gumbo API предельно прост и может использоваться для создания обёрток для различных языков программирования. Библиотека позиционируется как стабильная - код уже используется в промышленной эксплуатации для работы с поисковыми индексами Google.
Особенностью Gumbo также является изначально поддерживаемые средства отслеживания местонахождения узлов в дереве парсинга и их сопоставление с позицией в оригинальном тексте. Из планов на будущее отмечается реализация функций для разбора отдельных фрагментов, предоставление полноценных средств генерации отчётов о выявленных ошибках в разметке, создание биндингов для различных языков программирования.URL: http://google-opensource.blogspot.ru/2013/08/gumbo-c-library...
Новость: http://www.opennet.me/opennews/art.shtml?num=37658
Забавно, что выложілі на гітхаб, а не на свой гуглокод.
Они давно туда выкладывают свой код
Очевидно же - гуглокод нафиг никому не сдался, ибо чтобы там запостить банальный баг нужно подписывать гугловскую EULA, никто в здравом уме этого делать не будет.
гугл не отбирает у своих разработчиков возможность использовать те инструменты, которые им удобны.linux//windows/macosx/etc, vim/emacs/eclipse/netbeans/etc. Что угодно.
от windows они отказались вроде официальная инфа была
Вот за что я люблю google для python сразу есть обертка.
> Вот за что я люблю google для python сразу есть обертка.Хвалю, вот бы и все остальные владельцы собак так поступали
чёрт, действительно на чистом си! надо присмотреться. а то libsgml ночами ссытся в постель, хоть и старается изо всех сил чтобы «как у взрослых».
Лицензия, как всегда.
А что с ней не так?
> А что с ней не так?GPL лучше была бы. но дареной библиотеке в лицензии не заглядывают.
я так понимаю с невалидным html будет тяжко.
> я так понимаю с невалидным html будет тяжко.ты бы правила разбора html5 почитал, что ли… «пониматель».
посоны, аккуратно, там ошибка! ну, то есть, в библиотеке. нефатальная, но при некоторых условиях можете получить бредовые имена атрибутов.
Ссылку на репорт можно?
> Ссылку на репорт можно?нет. у меня нет и не будет аккаунта на гитхабе, а нормального багтрекера, куда пускают анонимусов, люди не дают.
хинт: два атрибута с одинаковым именем и значением, идущие подряд друг за другом, дают забавный результат в attribute->name.
> хинт: два атрибута с одинаковым именем и значением, идущие подряд друг за
> другом, дают забавный результат в attribute->name.в смысле: attr="value" attr="value" another_attr="another_value"
будет маленькая забавка.
Это ты об анонимности так печёшься или просто нечего класть? :-)
> Это ты об анонимности так печёшься или просто нечего класть? :-)алё, дурилка, ты тесткейз и патч видел? прямо в этой теме. уж наверное можно проверить.
>> Это ты об анонимности так печёшься или просто нечего класть? :-)
> алё, дурилка, ты тесткейз и патч видел? прямо в этой теме. уж
> наверное можно проверить.Да не переживай ты так :-)) Вон, видишь, даже забыл, на какой вопрос отвечаешь.
Rasch abkochen, dann Vormarsch nach Sokal.
багфикс, котаны:
diff --git a/src/tokenizer.c b/src/tokenizer.c
index c5547bd..ec19d8b 100644
--- a/src/tokenizer.c
+++ b/src/tokenizer.c
@@ -815,6 +815,7 @@ static void finish_attribute_value(GumboParser* parser) {
// Duplicate attribute name detected in an earlier state, so we have to
// ignore the value.
tag_state->_drop_next_attr_value = false;
+ reinitialize_tag_buffer(parser);
return;
}
Пофиксили
https://github.com/google/gumbo-parser/commit/3068711413b52c...
> Пофиксилиугу. молодцы, хорошо работают. а могли бы ещё лучше.
пару дней назад решил попробовать эту либу в проекте mosync, сборка и использование без всяких вопросов за счет c99, чистенько :)
грязненько, потому что целых два варнинга.
а если точнее, то у меня 3 warnings было
> а если точнее, то у меня 3 warnings былоа третий-то откуда? один — из-за отсутствия return после switch'а (хотя туда и не дойдёт никогда). второй — из-за забытой переменной node. а третий?
>> а если точнее, то у меня 3 warnings было
> а третий-то откуда? один — из-за отсутствия return после switch'а (хотя туда
> и не дойдёт никогда). второй — из-за забытой переменной node. а
> третий?parser.c:3049: warning: array subscript has type `char'
parser.c:1550: warning: control reaches end of non-void function
tag.c:205: warning: array subscript has type `char'
это что у тебя за компилятор такой, милчеловек, который неиспользованое значение переменной провтыкал, а на совершенно нормальный код ругается не по делу, как пьяный извозчик? O_Oинтересно просто.
p.s. нечто gcc древний какой?
> это что у тебя за компилятор такой, милчеловек, который неиспользованое значение переменной
> провтыкал, а на совершенно нормальный код ругается не по делу, как
> пьяный извозчик? O_O
> интересно просто.
> p.s. нечто gcc древний какой?да, древний )
gcc version 3.4.6
в clear_stack_to_table_body_context() ребята явно хотели использовать node, но забыли. мой gcc удивился.
p.s. багфикс накати.
> пару дней назад решил попробовать эту либу в проекте mosync, сборка и
> использование без всяких вопросов за счет c99, чистенько :)а вообще, после libsgml несколько напрягает отсутствие ссылок на sibling'ов. пришлось, чтобы логику программы не особо ломать, кидаться не просто указателем на ноду, а структурой «нода, индекс в родителе».