Было бы неплохо сделать конвертер MODX в Fenom. Я начал, но вряд ли смогу доделать
Надо как-то обрабатывать &параметры=значения,: модификаторы и чтобы при этом все работало слаженно, поэтому чувствую лично для меня уйдет на него много времени на то, чтобы учесть все моменты. Если эта тема конвертера тоже интересна, вот моя недоработанная наработка:
fenom.php:
fenom.php:
<?php
header('Content-Type: text/html; charset=utf-8');
$fenom = '';
if (isset($_POST['modx'])) {
function process_params($p) {
$r = preg_replace('/\&([A-Za-z0-9а-яА-ЯёЁ_\-]+)(\r\n\t\s)?\=(\r\n\t\s)?\`(.*?)\`(.*?)/u', '\'\\1\' => \'\\4\',\\5', $p);
return $r;
}
function process_chunk($m) {
$r = '{include \''.$m[1].'\'';
if (isset($m[2])) {
$p = ltrim($m[2]);
if (isset($p[0]) && $p[0] == '?')
$r .= ' : ['.process_params(substr($p[0], 1)).']';
}
return $r.'}';
}
function process_snippet($m) {
if (empty($m) || !isset($m[1])) return false;
$r = '{\''.$m[1].'\' | snippet';
if (isset($m[2])) {
$p = ltrim($m[2]);
if (isset($p[0]) && $p[0] == '?')
$r .= ' : ['.process_params(substr($p[0], 1)).']';
}
return $r.'}';
}
function process_tv($m) {
return false;
}
function process_link($m) {
return false;
}
function process_lang($m) {
return false;
}
function process_setting($m) {
return false;
}
function process_placeholder($m) {
return false;
}
function convert($matches) {
$m = $matches[1];
$r = null;
if ($m[0] == '-')
return '{*'.substr($m, 1).'*}';
if ($m[0] == '+') {
if ($m[1] == '+') $r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_setting', substr($m, 2));
else $r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_placeholder', substr($m, 1));
}
else if ($m[0] == '*') {
$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_tv', substr($m, 1));
}
else if ($m[0] == '%') {
$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_lang', substr($m, 1));
}
else if ($m[0] == '~') {
$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_link', substr($m, 1));
}
else if ($m[0] == '$') {
$r = preg_replace_callback('/^([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_chunk', substr($m, 1));
}
else {
$snippet = preg_replace_callback('/^(\!?[a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)/u', 'process_snippet', $m);
if ($snippet) $r = $snippet;
}
return $r ? $r : ($m ? '[['.$m.']]' : $matches[0]);
}
$fenom = preg_replace_callback('/\[\[(.*?)\]\]/u', 'convert', $_POST['modx']);
}
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MODX to Fenom</title>
<meta name="robots" content="noindex, nofollow">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="padding: 20px; margin: 0; font: 12px/normal 'SFMono-Regular','Menlo','Consolas','Liberation Mono','Courier New',monospace;">
<style>
textarea { width: 100%; height: 500px; font: inherit; }
</style>
<form action="" method="post">
<textarea name="modx"><?php if (isset($_POST['modx'])) echo $_POST['modx']; else echo '
[[$asd?
¶m=`val`
¶m=`val`
]]
[[+placeholder]]
[[*template:is=`3`:then=`a`:else=`b`]]
[[- comment ]]
'; ?></textarea>
<button type="submit">Конвертировать</button>
</form>
<?php
if (isset($_POST['modx'])) echo '
<hr>
<textarea>' . $fenom . '</textarea>';
?>
</body>
</html> Комментарии: 40
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
1. Заменяем сначала чисто все &параметры=…
2. Потом заменяем названия сниппетов, чанков и т.д. на Fenom'овские
3. Заменяем все ]] на }
А вот с условиями надо пока подумать… О них бы просто сообщать (например номер строки), а дальше они бы уже вручную менялись. Так как их автоматизация не так уж целесообразна. Если нет условных модификаторов, то обрабатываем. Если есть условные модификаторы — пишем об этом в результате конвертации
Если у кого то есть предложения по более лучшему варианту, велком с пуллреквестом))) github.com/alexsoin/modx2fenom
И если можно, цвет фона менее душераздирающий. )
Могу поверстать если требуется помощь.
Чем так цвет фона душу раздерает?) Мне в дизайне всё нравится))
Сразу в одном месте, все по теме)
Про цвет, это так))
Иногда нужны пустые параметры, они вырезаются:
Ссылки вида [[~123]] не конвертируются.
Параметры сниппетов и чанков Fenom было бы лучше конвертировать с одинарными кавычками ' вместо двойных ".
Параметры [[+modx_setting]] должны преобразовываться в {'modx_setting' | option}.
Плейсхолдеры надо не {'pholder' | placeholder}, а просто {$pholder}, но если в его имени есть точки, то {$_pls['pholder']}.
Также было бы круто, чтобы можно было вставлять целый HTML-шаблон с тегами MODX и чтобы конвертировались только они, а не вставлять каждое по отдельности
Если есть: конструкции=`условий`, то просто писать о их наличии (и номерах строк), но не блокировать все конвертирование.
[[+modx_setting]] — плейсхолдер, с чего вдруг он должен стать опцией? если имелось ввиду [[++modx_setting]] то он преобразуется в {'modx_setting' | config}
В любом случае, сказать точно что понадобится из вариантов вывода плейсхолдеров не получится, это надо уже самому смотреть и по ситуации применять один из выводов.
Точно нет, не хватало потом выслушивать жалобы, что закинули в конвертер шаблон, а потом сайт не работает, надо смотреть, что именно правишь на сайте, а не бездумно пихать весь шаблон страницы и смотреть что получится.
Если имеется ввиду модификаторы, то повторяюсь, тотже :default уже не имеет смысла использовать в fenom заместо него надо использовать {if ...}.
Какой практический смысл в этом? Я пользуюсь всегда двойными кавычками.
Там же можно подсмотреть, как MODX определяет тип элемента — в методе processTag
По мне удобнее работать с родным парсером из коробки!
У Fenom больше возможностей. Например, в параметрах можно указать число, массив, сделать конкатенацию. Также различные управляющие конструкции. Этого нет в MODX синтаксисе.
А банальный перевод тега на Fenom (просто чтоб было) ничего не даёт. Даже хуже — MODX теги работают лучше и меньше нагружают парсер.
Ну тут всё таки односторонний конвертер из стандартного в феном, так что это не проблема
Ещё раз повторю — феном имеет смысл использовать только ради его функциональных возможностей. Простая смена синтаксиса вызовов чанка или сниппета не только лишние затраты по времени, но и негативно сказывается на производительности сайта.
На чистом модикс и чистом феном.
В быстродействии, тем более из Кеша победил парсер модикса.
Перевес не значительный, но есть.
Дело в том что при запуске фенома тратятся ресурсы на срабатывание фенома и смешанный режим будет примерно как феномовских ну и + сюрпризы Кеша и доступности плейсов.
Ну и парсеры работают по очереди. Сначала один потом второй ( не помню в какой последовательности) Сергей Шлоков писал об этом по-моему.
Срабатывают только при первой загрузке страницы, а потом пропадают…
Ну и плюс ещё разные неувязки. Я уже много раз о них писал.
Да, это вопрос к Михаилу.
Простите. )
Вставлю сюда обновленный код:
fenom.php:
Вместо странного символа должен быть знак & (амперсанда)
Ресурс однозначно в закладки кучу времени экономит. Подскажите а от обратного как перевести синтаксис Fenom на Modx, как синтаксисом Modx записать и