На данный момент все явные шаблоны URL в текущей текстовой строке были
обозначены и заменены пронумерованными маркерами. Последующий анализ не должен быть разрешен
чтобы увидеть эти узоры. Этот пример также освобождает фрагменты JavaScript от синтаксиса.
разбор.
$код = '';
с/*\ с*§/<р>/
ScSc($ код !
•= "...··); # пустая/пробельная строка
/"\с/
ScSc($body:=&EmitCode('PRE', 1));
с/^(\* + ) /<li>/
ScSc ($body!'.= &EmitCade('UL', длина $1));
1
β/ Λ (\#+)/<li>/
ScSc ($body . = &EmitCode (' OL , длина $1));
$код
| | ($body . = &EmitC0de (' · , 0) ) ; # тег завершения
Этот раздел блочного тега идентифицирует шаблоны, соответствующие абзацу.
разметка — в этом базовом случае: «пустая» строка для нового абзаца, пробелы для
«предварительный формат», маркированные списки и нумерованные списки. Использование подпрограммы (показана
позже) и кажущийся сложным синтаксис позволяет автоматически отслеживать вложенные и
РАЗБИРАЕМ QUICKIWIKI
215
смешанные форматы. Эти теги добавляются к ранее обработанному абзацу,
таким образом, они стоят перед текстом текущего абзаца.
Следующий раздел кода касается встроенной разметки и других замен.
Например, форма поиска.
с/-
*/<час>/;
s/' {3} (.*?) '{3}/<strong>$l<\/strong>/g;
s/'{2}(.*?)'{2}/<em>$l<\/em>/g;
s/\[Поиск\]/$SearchForm/;
# легче изменить
Затем идет активация ссылки.
s/\b$ссылка\b/&AsAnchor($&)/geo;
# $& = вся совпавшая строка
s/$mark(\d+)$mark/&InPlaceUrl($1)/geo;
Сначала идентифицированные ссылки на страницы преобразуются в гиперссылки, а затем ранее
идентифицированные URL-адреса восстанавливаются как активные ссылки.
Когда текущая строка готова, результат добавляется к переменной body,
и циклы обработки для анализа следующей строки содержимого.
$тело
"$_\n";
} #-- конец foreach
Цикл заканчивается, когда больше нет строк для обработки.
В качестве меры предосторожности все оставшиеся теги абзаца обрываются и
их теги добавлены, затем процедура завершается. Возвращаемое значение - это визуализированный
основной текст.
$body .= &EmitCode(" M ,
вернуть $тело;
}
0);
В этот момент управление возвращается к родительскому коду, проанализированному ранее. Другой
вызываемые подпрограммы идут после этого. В первую очередь это EmitCode.
суб-эмиткод {
моя $глубина;
($ код, $ глубина) =
мои $теги .= "" ;
в то время как (@код > $глубина) {
216
ИЗУЧЕННЫЕ КОМПОНЕНТЫ ВИКИ
$теги .= "</" . (поп @код)1! . ">\n";
}
в то время как (@код <$глубина) {
нажать ©код, $код;
$tags .= "\n<$code>";
}
если ($код[$#код] не $код) {
$tags .= "</$code[$#code]>\n<$code>";
$код[$#код] = $код;
}
вернуть $теги;
}
Как видно, у нас есть три возможных условия разметки абзаца. Это может быть
новый тег (опционально на более высоком уровне вложенности), другой тег (на том же уровне),
или окончание тега (или уровня). Каждый кейс обновляет составной список тегов.
отслеживаемая и (неявно указанная) переменная, которая сообщит родительской процедуре
был ли обработан код абзаца.
суб
мой
-е
?
:
АсАнкор {
$название = сдвиг
н
страницы/$название"
"<a href=wiki.cgi?$title>$title<\/a>"
"<a href=edit.cgi?$title>?<\/a>$title";
}