<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) https://max-3000.com/
*
*/
// хук на обработку шорткодов в тексте
function mso_shortcode_content($content = '')
{
global $MSO;
foreach ($MSO->shortcode as $name => $func) {
if (function_exists($func)) {
// [toc][/toc] и [toc]text[/toc]
$pattern = '~\[' . $name . '()\](.*?)\[\/' . $name . '\]~si';
if (preg_match($pattern, $content) === 1) {
$content = preg_replace_callback($pattern, $func, $content);
}
// [toc param][/toc] и [toc=param]text[/toc]
$pattern = '~\[' . $name . '[= ]+(.*?)\](.*?)\[\/' . $name . '\]~si';
if (preg_match($pattern, $content) === 1) {
$content = preg_replace_callback($pattern, $func, $content);
}
/* // старый вариант
if (strpos($content, '[' . $name) !== false) // есть вхождения
{
$content = preg_replace_callback('~\[' . $name . '[= ]?(.*?)\](.*?)\[\/' . $name . '\]~si', $func, $content);
}
*/
}
}
return $content;
}
// добавляет для шорткода функцию
// [class t-red bold]text page[/class]
// или [class=t-red bold]text page[/class]
// mso_shortcode_add('class', 'my_class');
// функция my_class определяется на уровне шаблона или плагина - в ней вся обработка
function mso_shortcode_add($shortcode, $function)
{
global $MSO;
// проверка — защита от "дурака"
if ($shortcode and $function) $MSO->shortcode[$shortcode] = $function;
}
// функция, если нужно расспарсить шорткод вида:
// [shortcode par=val par1=val1 par2="val val val"]text page[/shortcode]
// Array:
// [par] => val
// [par1] => val1
// [par2] => val val val
// [content] => text page
function mso_shortcode_parse($attr, $def = [], $sep = ' ')
{
$par = [];
$par['content'] = $attr[2];
// замена атрибутов в кавычках
$attr[1] = preg_replace_callback('!\=\"(.*?)\"!', function ($matches) {
return '=' . str_replace(' ', '__NBSP__', $matches[1]);
}, $attr[1]);
if ($sep)
$s = explode($sep, trim($attr[1]));
else
$s = array(trim($attr[1]));
$s = array_map('trim', $s);
foreach ($s as $p) {
$p = str_replace('__NBSP__', ' ', $p);
$p1 = explode('=', $p);
if (count($p1) == 2)
$par[$p1[0]] = $p1[1];
else
$par[] = $p;
}
$par = array_merge($def, $par);
return $par;
}
// вывод произвольного шорткода
// $shortcode — имя шорткода
// $func — функция обработчик шорткода
// $content — текст содержащий сам шорткод
function mso_shortcode($shortcode, $func, $content)
{
if (function_exists($func)) {
// [toc][/toc] и [toc]text[/toc]
$pattern = '~\[' . $shortcode . '()\](.*?)\[\/' . $shortcode . '\]~si';
if (preg_match($pattern, $content) === 1)
$content = preg_replace_callback($pattern, $func, $content);
// [toc param][/toc] и [toc=param]text[/toc]
$pattern = '~\[' . $shortcode . '[= ]+(.*?)\](.*?)\[\/' . $shortcode . '\]~si';
if (preg_match($pattern, $content) === 1)
$content = preg_replace_callback($pattern, $func, $content);
/*
if (strpos($content, '[' . $shortcode) !== false) // есть вхождения
{
$content = preg_replace_callback('~\[' . $shortcode . '[= ]?(.*?)\](.*?)\[\/' . $shortcode . '\]~si', $func, $content);
}
*/
}
return $content;
}
# end of file