| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Создание облегченной разметки |
| Автор: Logo 15.9.2010, 13:31 |
| Хочу сделать облегченную разметку, вроде markdown. Но, в отличии от Text::Markdown хотелось бы сделать обработку ошибок, и валидный код на выходе. Есль примеры подобных вещей на перле, или статьи, как это можно сделать? |
| Автор: DurRandir 15.9.2010, 16:30 |
| 1. Написать грамматику для языка разметки. Но в этом случае ограничены возможности по коррекции неправильного ввода. Если хватает диагностики "а у вас тут тег не правильный", без коррекции, - то это оптимальный вариант. Хотя можно попытаться сделать грамматику более лёгкой и строить html по дереву разбора с коррекцией. Но не уверен в результатах такого подхода. 2. Спуститься уровнем ниже, и писать свой конечный автомат по разбору текста. В этом случае можно и вносить исправления, и выдавать любую диагностику. Минус - количество переходов между состояниями растёт очень быстро. У меня есть простой парсер bb-кодов, сделанный вручную как автомат, могу показать. |
| Автор: Logo 15.9.2010, 19:50 | ||
| Да, достатоточно "а у вас тут тег не правильный", но только сразу найти все ошибки в тексте. И желательно сказать, почему не правильный. Грамматики мне показались сложноватыми, кроме того, в разметке присуствует неодназначность -
Block может быть воспринят как абзац с пробелами для удобочитаемости - абзацы разделяются пустыми строками. Но если каждая строка "абзаца" начинается с пробелных символов, то это другая синтаксическая конструкция. Да, хотелось бы взглянуть на парсер bb-кодов. |
| Автор: DurRandir 15.9.2010, 23:57 |
| А есть где-нибудь полное описание этой разметки? По ссылке в 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го сбоя в исходниках) Исходники парсера завтра скину. |
| Автор: Logo 16.9.2010, 11:11 | ||||
Разметка своя, из markdown и других взяты идеи. Некоторые вещи специфичны для проекта.
Разметка ориентированна на автоматическую верстку, с минимальным участием редактора. На счет строгости, еще окончательно не решил, пока думаю лучше сообщать о возможных ошибках, чем выводить текст как есть. Имею ввиду такие вещи, как
Для упрощения конструкции вроде *жирный ~жирный курсивный* курсивный~ не допускаются, т.е. все корректно вложенное. inline элементы (цитата, оформление текста) нельзя разрывать блочными (абзац, диалоги, заголовок). Некоторые теги запрещены внутри других. Например нельзя вставить картинку в заголовок, цитату в имя автора в диалоге. |
| Автор: DurRandir 16.9.2010, 11:37 |
| http://dur-randir.ru/bbcode.parser.rar Ключевые куски - это lexer() и BBCode::FSM, неформальное описание автомата - в BBCode::FSM_scheme, остальное занимается генерацией html'я. |
| Автор: Logo 19.10.2010, 17:07 | ||
Правильно я понимаю, при разборе по грамматикам, возможным будет некоторое нарушение:
Одиночный превод строки не будет иметь специального значения внутри inline элементов (т.к. это необходимо в обычных абзацах). В результате включение inline элемента в блок, где перевод строки важен, будет скрывать смысл перевода строки от анализатора. |