![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Хочу сделать облегченную разметку, вроде markdown. Но, в отличии от Text::Markdown хотелось бы сделать обработку ошибок, и валидный код на выходе.
Есль примеры подобных вещей на перле, или статьи, как это можно сделать? |
|||
|
||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
1. Написать грамматику для языка разметки. Но в этом случае ограничены возможности по коррекции неправильного ввода. Если хватает диагностики "а у вас тут тег не правильный", без коррекции, - то это оптимальный вариант. Хотя можно попытаться сделать грамматику более лёгкой и строить html по дереву разбора с коррекцией. Но не уверен в результатах такого подхода.
2. Спуститься уровнем ниже, и писать свой конечный автомат по разбору текста. В этом случае можно и вносить исправления, и выдавать любую диагностику. Минус - количество переходов между состояниями растёт очень быстро. У меня есть простой парсер bb-кодов, сделанный вручную как автомат, могу показать. |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Да, достатоточно "а у вас тут тег не правильный", но только сразу найти все ошибки в тексте. И желательно сказать, почему не правильный.
Грамматики мне показались сложноватыми, кроме того, в разметке присуствует неодназначность -
Block может быть воспринят как абзац с пробелами для удобочитаемости - абзацы разделяются пустыми строками. Но если каждая строка "абзаца" начинается с пробелных символов, то это другая синтаксическая конструкция. Да, хотелось бы взглянуть на парсер bb-кодов. |
|||
|
||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
А есть где-нибудь полное описание этой разметки? По ссылке в Text::Markdown на родной сайт - очень мутное описание. Отделить блок от "блока, начинающегося с пробелов" - достаточно просто. Вот пример грамматики для разметки, содержащей только блоки из строк, возможно начинающихся с пробелов, разделённых переводами строк. Капсом выделены терминалы:
text = | block CRLF text block = with_spaces | without_spaces with_spaces = | SPACE line with_spaces without_spaces = | line without_spaces line = NO_START_SPACE_LINE CRLF Почему неправильный - сказать сможет. Выдать сразу все ошибки - нет. Считайте, что это компилятор, работает до 1го сбоя в исходниках) Исходники парсера завтра скину. Это сообщение отредактировал(а) DurRandir - 15.9.2010, 23:58 |
|||
|
||||
Logo |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Разметка своя, из markdown и других взяты идеи. Некоторые вещи специфичны для проекта.
Разметка ориентированна на автоматическую верстку, с минимальным участием редактора. На счет строгости, еще окончательно не решил, пока думаю лучше сообщать о возможных ошибках, чем выводить текст как есть. Имею ввиду такие вещи, как
Для упрощения конструкции вроде *жирный ~жирный курсивный* курсивный~ не допускаются, т.е. все корректно вложенное. inline элементы (цитата, оформление текста) нельзя разрывать блочными (абзац, диалоги, заголовок). Некоторые теги запрещены внутри других. Например нельзя вставить картинку в заголовок, цитату в имя автора в диалоге. |
||||
|
|||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
http://dur-randir.ru/bbcode.parser.rar
Ключевые куски - это lexer() и BBCode::FSM, неформальное описание автомата - в BBCode::FSM_scheme, остальное занимается генерацией html'я. |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Правильно я понимаю, при разборе по грамматикам, возможным будет некоторое нарушение:
Одиночный превод строки не будет иметь специального значения внутри inline элементов (т.к. это необходимо в обычных абзацах). В результате включение inline элемента в блок, где перевод строки важен, будет скрывать смысл перевода строки от анализатора. Это сообщение отредактировал(а) Logo - 19.10.2010, 17:07 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |