Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Реализация HTML5 валидатора на чистом яваскрипте? (https://javascript.ru/forum/misc/39807-realizaciya-html5-validatora-na-chistom-yavaskripte.html)

danik.js 12.07.2013 20:10

Реализация HTML5 валидатора на чистом яваскрипте?
 
Думаю такой инструмент был бы очень кстати.
Основное применение - контроль качества html кода при его написании в web-based HTML-редакторах.
Дополнительное - использование в NodeJS окружении.

Тремуебого валидатора как я понимаю в природе не существует.
Поэтому я начал подбирать полезные материалы.

Возможно у кого-то есть интерес к разработке или полезная инфа - буду рад.

pikko 12.07.2013 22:12

могу пописать регулярки в свободное время, если чё =)

danik.js 12.07.2013 22:23

Боюсь регулярки придется писать всю оставшуюся жизнь. К тому же в JS какая то урезанная имплементация регулярок, так что скорее всего это и вовсе невозможно..

pikko 12.07.2013 22:35

невозможен валидатор, или юзать для этого регулярки?

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

ты планируешь валидировать в процессе написания, или уже готовую разметку?

sexyQuery 12.07.2013 23:59

Карма: +1488

sexyQuery 13.07.2013 00:00

регулярками и не сделаешь. нужно парсер писать

mta88 13.07.2013 04:16

есть идея
выдираем парсер из firefox или chrome (он на C++ или C)
компилируем в js с помощью emscripten
используем где хотим

правда тяжелый будет
и тормозить будет наверно

nerv_ 13.07.2013 12:10

<div id="test"></div>

<script>
    var case1 = '123123 <b>7</b> asdads';
    var case2 = ' <div> asdnaslklj ';

    var box = document.getElementById( 'test' );
    
    box.innerHTML = case1;
    alert( case1 === box.innerHTML );

    box.innerHTML = case2;    
    alert( case2 === box.innerHTML );
</script>

:)

danik.js 13.07.2013 13:03

Цитата:

Сообщение от mta88
есть идея
выдираем парсер из firefox или chrome (он на C++ или C)
компилируем в js с помощью emscripten
используем где хотим

Насколько я знаю Firefox использует парсер, исходники которого на Java. Они просто транслируют код в C вроде бы.
Ну а с Java поможет GWT. Вот кстати рабочий результат: http://livedom.validator.nu/

Но парсер - это только начало. Парсер может указать только на ошибки синтаксиса HTML. Это уже не мало, но этого недостаточно. Важно проверять вложенность элементов и корректность типов атрибутов/элементов. Вот это уже будет посложнее.

mta88 13.07.2013 13:26

Цитата:

Сообщение от danik.js (Сообщение 262051)
Но парсер - это только начало.

так я шутил насчет emscripten :)
мне так кажется
а еще нашел исходники валидатора w3c вот здесь (не смотрел, что там внутри)

melky 13.07.2013 15:38

Цитата:

Сообщение от danik.js (Сообщение 261968)
Думаю такой инструмент был бы очень кстати.
Основное применение - контроль качества html кода при его написании в web-based HTML-редакторах.
Дополнительное - использование в NodeJS окружении.

Тремуебого валидатора как я понимаю в природе не существует.
Поэтому я начал подбирать полезные материалы.

Возможно у кого-то есть интерес к разработке или полезная инфа - буду рад.

велосипед или просто практика для повышения скилла?

danik.js 13.07.2013 15:50

Велосипед предполагает повторную реализацию уже существующего решения. Я что-то пропустил? Можно ссылку на работающий в браузере валидатор HTML? Скомпилированный в яваскрипт htmltidy не в счет.

melky 14.07.2013 00:40

Цитата:

Сообщение от danik.js
Я что-то пропустил?

вроде такого ещё не видел. но они есть не в браузере - т.е. не на JS.
Цитата:

Сообщение от danik.js
работающий в браузере валидатор HTML

а чем он отличается от не работающего в браузере? если привязки к DOM нет, то различий нет никаких.

danik.js 14.07.2013 10:27

Цитата:

Сообщение от melky
а чем он отличается от не работающего в браузере? если привязки к DOM нет, то различий нет никаких.

Ну так то да. Я просто имел ввиду полная реализация на JS. Потому что например для NodeJS можно в общем-то использвовать обертку над экзешником.

Схемы для валидации HTML представляют собой формат Relax NG плюс схема Schematron.

Я разбирал как работает validator.nu. Он использует HTML парсер (либо XML для application/xhtml+xml), который используется в Firfefox. Причем именно как SAX-интерфейс. В качестве контент-хэндлера (обработчика "событий" startElement, startDocument, characters и тд) устанавливается специальный обработчик, получаемый из валидатора. Валидатор по получаемым SAX-событиям делает проверку. Сам валидатор представляет из себя цепочку комбинаций валидаторов. То есть он состоит из валидатора RelaxNG, Schematron, спец-оберток, например, обертки удаляющей data-атрибут, так как он не соответствует схеме RelaxNG. Плюс еще различные checker-ы, проверяющие устаревшие атрибуты, неподдерживаемые фичи и тд.

Реализацию RelaxNG валидатора на JS я нашел. Работает очень хреново и медленно но думаю допилить можно. С Schematron схемой все сложней. По идее она трансформируется в специальный xslt-шаблон, который нужно применить к проверяемому документу. То есть нужна голая имплементация XSLT на JS. Так как валидатор будет работать внутри web-worker'а, а всяких DOM-примочек там нету.

danik.js 16.07.2013 12:32

Запаковал этот html5 парсер испольуя browserify.
В итоге имеем живую проверку синтаксиса в редакторе: http://www.new-era63.ru/ace/kitchen-sink.html (выбрать HTML документ сначала)


Часовой пояс GMT +3, время: 08:39.