UverseWiki

Интеграция разметки

Table Of Contents
Интеграция разметки
  1. 1. Простейший пример
  2. 2. FluxBB

Разметка UverseWiki практически не имеет зависимостей — ей нужна версия 5 PHP и установленный mb_string (функции которого можно попытаться переписать с вызовами стандартных аналогов вроде mb_substr()substr(), но неанглийские тексты будут работать с глюками).

Простейший пример

Интергировать разметку очень просто — форматирование текста можно выполнить всего парой вызовов, если достаточно настроек по умолчанию:

PHP
function WikiToHTML($text) {
  require_once 
'uversewiki.php';
  if (
$doc UWikiDocument::TryParsing($text'wacko')) {
    return 
$doc->ToHTML();
  }
}

// Использование:
echo WikiToHTML('**жирный** текст');  // => '<p...><strong>жирный</strong> текст</p>

Если нужно больше контроля, то можно создать документ самому и настроить его перед вызовом Parse():

PHP
$doc = new UWikiDocument('((#Длинный якорь))');
$doc->settings->inlineAnchors false;
$doc->Parse();
echo 
$doc->ToHTML();  // => <a name="Длинный якорь"></a>

Хотя есть нужно просто изменить настройки, то всё равно можно использовать TryParsing():

PHP
$settings = new UWikiSettings;
$settings->inlineAnchors false;
if (
$doc UWikiDocument::TryParsing($text$settings'wacko')) {
  return 
$doc->ToHTML();  // результат тот же, что и в предыдущем примере.
}

Полная информация есть в API документации — см. классы UWikiDocument, UWikiSettings и функции UWikiDocument->Parse(), ToHTML(), ::TryParsing().

FluxBB

FluxBB — легковестный форумный движок. Как водится, на форумах используют BB-код, и FluxBB не исключение. Однако его можно быстро привести к поддержке нашей вики-разметки
Здесь описывается процедура для последней на момент написания версии FluxBB — 1.4.2.

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

/wiki/doc/ru/Integration - FluxBB.png

Очень кратко опишем структуру include/parser.php — это как раз тот файл, который форматирует текст. Нас в нём интересует 3 функции (все остальные вне его не вызываются):

  1. preparse_bbcode (самая первая в файле);
  2. parse_message (предпоследняя);
  3. parse_signature (последняя).

Первая чистит исходник, приводит BB-теги к нижнему регустру, оповещает об ошибках и т.д. Вторая форматирует «сообщение» (форумное, а может и ещё какие-то). Третья, как следует из названия, форматирует подпись.
Мы не будем углубляться в такие разделы, как чтение настроек профиля пользоввателя перед форматированием сообщения (для отключения смайликов и картинок, например).

Вот как должен выглядеть parser.php для работы с вики-разметкой:

PHP
<?php
function preparse_bbcode($text, &$errors$is_signature false) { return $text; }

function 
parse_message($text$hide_smilies) {
  
defined('UWikiRootPath') or define('UWikiRootPath'PUN_ROOT.'uwiki');
  require_once 
UWikiRootPath.'/uversewiki.php';

  
$doc = new UWikiDocument($text);
  
$doc->settings->LoadFrom(UWikiRootPath.'/config');
  
$doc->LoadMarkup('wacko');
  
$doc->Parse();

  return 
$doc->ToHTML();;
}

function 
parse_signature($text) { return parse_message($textfalse); }

Функция подготовки BB-кода нам ни к чему, хотя если хочется, то подключение UverseWiki можно вынести туда и выводить ошибку в $errors, если оно не удалось.
Функция форматирования подписи здесь просто форматирует её как сообщение. При желании туда можно добавить проверку на большие картинки или слишком многострочные абзацы, чтобы подпись была вменяемых размеров.

В parse_message мы делаем вот что:

  1. Если не определена, то определяем константу для UverseWiki, задающую расположение всей системы. В примере выше она находится в папке uwiki в корне движка FluxBB (PUN_ROOT устанавливается самим движком форума).
    • UWikiRootPath не должна содержать последнего слэша.
  2. Подключаем собственно главный скрипт UverseWiki, который уже инициализирует систему.
  3. Создаём новый документ, загружаем настройки из config/, загружаем вики-разметку и строим дерево (Parse()).
  4. Выводим получившееся дерево в HTML.

Что здесь можно улучшить?

  • для ускорения форматирования можно один раз создавать объект настроек и затем его клонировать — вместо того, чтобы загружать настройки каждый раз. Пример *.
  • очевидно, что темы оформления FluxBB не содержит всего нужного для UverseWiki — например, маркеры и подчёркивание (оно сделано через HTML style) никак не выделяются, поэтому их нужно будет немного доработать.
  • можно добавить учёт настроек из профиля и отключать смайлики.
  • после построения дерева можно просмотреть его на предмет «лишних» элементов — например, заголовков 1-го уровня или очень больших картинок.
PHP
...
$doc = new UWikiDocument($text);
static 
$settings;
if (!
$settings) {
  
$settings $doc->settings;
  
$settings->LoadFrom(UWikiRootPath.'/config');
} else {
  
$doc->settings = clone $settings;
}
$doc->Parse();
...