# HTML Parser Tarasenko
## Опис
Цей проект є базовим HTML-парсером, написаним на Rust із використанням `Pest` для синтаксичного аналізу. Парсер розбирає HTML-документи, виділяючи основні компоненти, такі як теги, атрибути та текстові вузли, створюючи деревоподібну структуру для представлення розмітки HTML.
### Мета проекту
Метою цього проекту є створення синтаксичного аналізатора, здатного розпізнавати HTML-структури, включаючи вкладені елементи, атрибути тегів, текстові вузли, а також перевіряти правильність відкриття і закриття тегів.
## Технічний опис синтаксичного аналізу
### Що саме аналізується
Парсер аналізує наступні основні компоненти HTML-документа:
1. **Теги елементів**: Відкриваючі та закриваючі теги розбираються як єдині вузли в дереві синтаксичного аналізу. Наприклад, тег `
` розпізнається як елемент із вкладеними дочірніми елементами, тоді як самозакриваючі теги на кшталт `
` обробляються окремо.
2. **Атрибути тегів**: Кожен тег може містити атрибути, записані у форматі `name="value"`. Вони додаються до відповідного елемента як список пар "ім'я-значення".
3. **Вкладені елементи**: Парсер підтримує вкладення елементів, що дозволяє розбирати HTML-структури будь-якої глибини, наприклад, `
`.
4. **Текстові вузли**: Будь-який текст між тегами обробляється як текстовий вузол і додається як дочірній елемент відповідного батьківського вузла.
### Процес аналізу
Синтаксичний аналіз здійснюється за допомогою граматики, визначеної у файлі `HTML.pest`, яка розділяє HTML-код на основні компоненти: `element`, `self_closing_element`, `attribute`, `text` тощо. Граматика побудована таким чином, щоб дозволити рекурсивну обробку вкладених тегів.
Для забезпечення коректності структури HTML, після парсингу відбувається валідація збігу імен у відкриваючих і закриваючих тегах. Наприклад, для `
...
` парсер перевірить, що ім'я тега в кінцевому тегу відповідає імені в початковому. Якщо відбувається помилка (наприклад, `
...`), програма повертає повідомлення про помилку.
### Використання результатів аналізу
Результати синтаксичного аналізу зберігаються у вигляді дерева, де кожен вузол представляє HTML-елемент із потенційними дочірніми елементами. Дерево може бути використане для різних цілей:
- **Генерація або модифікація HTML**: Оброблене дерево можна перетворити назад у HTML або модифікувати, додаючи чи видаляючи вузли.
- **Конвертація у формат XML або JSON**: Це дозволяє імпортувати HTML-контент у програми, які працюють із структурованими даними.
- **Аналіз вмісту HTML**: Можливість обробляти та витягувати текстові та атрибутивні дані дозволяє використовувати парсер для аналітичних задач, таких як аналіз контенту або пошук певних елементів.
### Граматика
- html = { SOI ~ elements ~ EOI }
- elements = { (element | self_closed_tag)* }
- element = { opening_tag ~ content ~ closing_tag }
- opening_tag = { "<" ~ tag_name ~ attribute_list ~ ">" }
- closing_tag = { "" ~ tag_name ~ ">" }
- self_closed_tag = { "<" ~ tag_name ~ attribute_list ~ "/>" }
- tag_name = @{ ASCII_ALPHA+ ~ ASCII_DIGIT? }
- attribute_list = { attribute* }
- attribute = { identifier ~ "=" ~ quoted_string }
- identifier = { ASCII_ALPHA+ }
- quoted_string = { "\"" ~ (!"\"" ~ ANY)* ~ "\"" }
- content = { (element | text | self_closed_tag)* }
- text = @{ (!"<" ~ ANY)+ }
- WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
### Як використовувати
cargo run --release -- parse <Назва файлу>
### Crate
https://crates.io/crates/html_parser_tarasenko