Было бы неплохо сделать конвертер MODX в Fenom. Я начал, но вряд ли смогу доделать

Надо как-то обрабатывать &параметры=значения,: модификаторы и чтобы при этом все работало слаженно, поэтому чувствую лично для меня уйдет на него много времени на то, чтобы учесть все моменты. Если эта тема конвертера тоже интересна, вот моя недоработанная наработка:

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>
Fullstack
09 января 2022, 03:20
modx.pro
873
+5

Комментарии: 37

Fullstack
09 января 2022, 03:28
0
Хотя сейчас пришла мысль, как сделать подход полегче:

1. Заменяем сначала чисто все &параметры=…
2. Потом заменяем названия сниппетов, чанков и т.д. на Fenom'овские
3. Заменяем все ]] на }

А вот с условиями надо пока подумать… О них бы просто сообщать (например номер строки), а дальше они бы уже вручную менялись. Так как их автоматизация не так уж целесообразна. Если нет условных модификаторов, то обрабатываем. Если есть условные модификаторы — пишем об этом в результате конвертации
    Сергей Шлоков
    09 января 2022, 15:15
    +2
    Это нереально и бессмысленно. Если только в качестве сервиса — ввёл тег MODX, получил варианты на Fenom. Потом вставил куда надо.
    Алексей Соин
    10 января 2022, 11:03
    3
    +10
    На скорую руку накидал свой вариант m2f.zencod.ru/

    Если у кого то есть предложения по более лучшему варианту, велком с пуллреквестом))) github.com/alexsoin/modx2fenom
      Fullstack
      13 января 2022, 17:59
      0
      Круто! Единственное, он преобразует только сниппеты
        Алексей Соин
        13 января 2022, 19:21
        +6
        Выводится сниппет если не понять что за тег, а так пока переводит чанки, сниппеты, системные значения. Доработать даный конвертер не трудно, но не хотелось бы тратить время на сервис, который никому не нужен. Хотелось бы услышать, нужен ли он кому-то (например лайк/дизлайк вот этого моего коммента, или в гитхабе плюсами). Если нужно, выделю время на доработки.
          Наумов Алексей
          14 января 2022, 10:24
          +2
          Мне часто приходится делать подобную работу, когда достается старый сайт, обычно почти всегда при его обновлении я перехожу на Fenom. Так что с меня плюсик)
            Misha Bulic
            14 января 2022, 10:59
            +2
            Однозначно будет в закладках, просто не так часто будет он нужен
            Алексей Соин
            13 января 2022, 23:16
            +4
            Поправил, единственное пока не придумал, как получше обрабатывать комменты и на подумать остается обработка фильтров/модификаторов и свойств, но скорее всего в дальнейшем буду просто выводить предупреждение, что фильтр :default нужно вручную править для fenom синтаксиса и т.д.

              Andrew
              15 января 2022, 11:56
              -1
              Вот сюда бы еще добавить доку по феному (ссылкой на гит как вариант) и шпаргалку по самым часто исп вещам.

              И если можно, цвет фона менее душераздирающий. )

              Могу поверстать если требуется помощь.
                Алексей Соин
                15 января 2022, 19:32
                +1
                Как мне кажется, переполнять моносервис множеством доп функционала не очень хорошая идея, тем кому данный сервис нужен и так знают, где доки находятся, а ссылку на доку я добавил пока только при наличии в теге модификаторов и набором свойств.

                Чем так цвет фона душу раздерает?) Мне в дизайне всё нравится))
                  Andrew
                  16 января 2022, 18:59
                  0
                  Идея была, чтоб при необходимости можно было новичкам в чате ссыль давать.)
                  Сразу в одном месте, все по теме)

                  Про цвет, это так))
            Fullstack
            17 января 2022, 21:03
            0
            Уже лучше, супер! Нужны маленькие доработочки:

            Иногда нужны пустые параметры, они вырезаются:


            Ссылки вида [[~123]] не конвертируются.

            Параметры сниппетов и чанков Fenom было бы лучше конвертировать с одинарными кавычками ' вместо двойных ".

            Параметры [[+modx_setting]] должны преобразовываться в {'modx_setting' | option}.

            Плейсхолдеры надо не {'pholder' | placeholder}, а просто {$pholder}, но если в его имени есть точки, то {$_pls['pholder']}.

            Также было бы круто, чтобы можно было вставлять целый HTML-шаблон с тегами MODX и чтобы конвертировались только они, а не вставлять каждое по отдельности

            Если есть: конструкции=`условий`, то просто писать о их наличии (и номерах строк), но не блокировать все конвертирование.
              Алексей Соин
              17 января 2022, 21:42
              0
              Ссылки вида [[~123]] не конвертируются.
              а что же с ними происходит?)) [[~123]] -> {'123' | url}



              Параметры [[+modx_setting]] должны преобразовываться в {'modx_setting' | option}.
              [[+modx_setting]] — плейсхолдер, с чего вдруг он должен стать опцией? если имелось ввиду [[++modx_setting]] то он преобразуется в {'modx_setting' | config}

              Плейсхолдеры надо не {'pholder' | placeholder}, а просто {$pholder}, но если в его имени есть точки, то {$_pls['pholder']}.
              В любом случае, сказать точно что понадобится из вариантов вывода плейсхолдеров не получится, это надо уже самому смотреть и по ситуации применять один из выводов.

              Также было бы круто, чтобы можно было вставлять целый HTML-шаблон с тегами MODX
              Точно нет, не хватало потом выслушивать жалобы, что закинули в конвертер шаблон, а потом сайт не работает, надо смотреть, что именно правишь на сайте, а не бездумно пихать весь шаблон страницы и смотреть что получится.

              Если есть: конструкции=`условий`, то просто писать о их наличии (и номерах строк), но не блокировать все конвертирование.
              Если имеется ввиду модификаторы, то повторяюсь, тотже :default уже не имеет смысла использовать в fenom заместо него надо использовать {if ...}.



              Параметры сниппетов и чанков Fenom было бы лучше конвертировать с одинарными кавычками ' вместо двойных ".
              Какой практический смысл в этом? Я пользуюсь всегда двойными кавычками.
            Илья Уткин
            10 января 2022, 15:20
            2
            +5
            Есть же метод parsePropertyString — он как раз составит массив из MODX-синтаксиса. То есть что-то типа такого

            <?php
            $parser = $modx->getParser();
            $html = '[[!pdoResources?
            	&parents=`1`
            	&depth=`0`
            	&tpl=`ListRowTpl`
            	&tplWrapper=`@INLINE [[+output]]`
            	&includeTVs=`image`
            ]]';
            
            $properties = $parser->parsePropertyString($html);

            Там же можно подсмотреть, как MODX определяет тип элемента — в методе processTag
              vectorserver
              12 января 2022, 11:17
              -3
              Думаю, это бессмыслено конвертировать одно в другое, тем более код!
              По мне удобнее работать с родным парсером из коробки!
                Fullstack
                13 января 2022, 17:57
                +1
                Он не на всех сайтах применим. На простых — да. А что-то более менее гибкое уже не разработаешь. Или когда стоит (особенно ребром) вопрос скорости сайта
                  Сергей Шлоков
                  15 января 2022, 19:10
                  +1
                  Fenom, даже если и влияет на скорость сайта, то совсем не в положительную сторону. Вот сам pdoTools да. Там много чего оптимизировано по сравнению с кодом MODX.
                Сергей Шлоков
                16 января 2022, 08:28
                0
                По-моему, просто достаточно примера как перевести теги чанка, сниппета и плейсхолдера из MODX формата в Fenom. Что-то типа cheat sheet. Ибо данный вариант сервиса способен переводить только простые конструкции.

                У Fenom больше возможностей. Например, в параметрах можно указать число, массив, сделать конкатенацию. Также различные управляющие конструкции. Этого нет в MODX синтаксисе.

                А банальный перевод тега на Fenom (просто чтоб было) ничего не даёт. Даже хуже — MODX теги работают лучше и меньше нагружают парсер.
                  Misha Bulic
                  16 января 2022, 20:59
                  0
                  Ну тут он будет полезен новичкам, или если нашёл где то решение в интернете или в документации, а там родной синтаксис, быстро его перевёл.

                  У Fenom больше возможностей. Например, в параметрах можно указать число, массив, сделать конкатенацию. Также различные управляющие конструкции. Этого нет в MODX синтаксисе.
                  Ну тут всё таки односторонний конвертер из стандартного в феном, так что это не проблема
                    Сергей Шлоков
                    17 января 2022, 06:46
                    +1
                    Ну тут он будет полезен новичкам, или если нашёл где то решение в интернете или в документации, а там родной синтаксис, быстро его перевёл.
                    Хотел бы я посмотреть на такого новичка. Уверен, такого не найдётся.

                    Ещё раз повторю — феном имеет смысл использовать только ради его функциональных возможностей. Простая смена синтаксиса вызовов чанка или сниппета не только лишние затраты по времени, но и негативно сказывается на производительности сайта.
                      Misha Bulic
                      17 января 2022, 08:45
                      0
                      Где то была статья и там сравнивали работу смешанного режима и чистого фенома, и вроде как был вывод что лучше писать всё на феноме. С тех пор стараюсь так и делать. Это бессмысленно? Я как то не интересовался больше
                        Алексей Смирнов
                        17 января 2022, 08:52
                        0
                        Я сравнивал главную страницу простого сайта.
                        На чистом модикс и чистом феном.
                        В быстродействии, тем более из Кеша победил парсер модикса.
                        Перевес не значительный, но есть.
                          Misha Bulic
                          17 января 2022, 09:02
                          0
                          а смешанный? и то и то если использовать? Как тут выше писали феном для сложных условий для шаблонов и файловых чанков, а для вызова полей или ещё чего простого стандартный парсер.
                            Алексей Смирнов
                            17 января 2022, 09:07
                            +2
                            Проблема смешанного в том, что очень хорошо нужно понимать что делаешь, потому что при передачах плейсов, переменных начинаются проблемы того что переменная ещё не запарсена модиксом, например или наоборот.
                            Дело в том что при запуске фенома тратятся ресурсы на срабатывание фенома и смешанный режим будет примерно как феномовских ну и + сюрпризы Кеша и доступности плейсов.

                            Ну и парсеры работают по очереди. Сначала один потом второй ( не помню в какой последовательности) Сергей Шлоков писал об этом по-моему.
                              Сергей Шлоков
                              17 января 2022, 10:46
                              0
                              Смешанный режим — это зло. Даже опытные разработчики путают последовательность при работе в этом режиме. Сначала работает феном, потом стандартный.
                                Fullstack
                                17 января 2022, 20:24
                                0
                                Плейсы в микс-режиме это проблема, да.
                                Срабатывают только при первой загрузке страницы, а потом пропадают…
                            Сергей Шлоков
                            17 января 2022, 10:45
                            0
                            Вроде была статья. Но в ней как раз и писали, что феном не даёт прирост скорости. В документации есть тест по pdoTools. Вот он даёт. А феном — это лишняя нагрузка. Он не заменяет стандартный шаьлонизатор, а дополняет. Т.е. работают 2 шаблонизатора. Кроме того, кэшируемые теги MODX, написанные на феном, MODX переводит в свой формат (дополнительная нагрузка). Чтобы было понятно — кэшируемый тег MODX на странице превращается в результат и при следующем запросе страницы уже не вызывается (он распарсен). А феном тег остаётся и MODX должен дополнительно его обработать, перевести в MODX формат и проверить кэш.
                            Ну и плюс ещё разные неувязки. Я уже много раз о них писал.
                              Misha Bulic
                              17 января 2022, 10:59
                              0
                              Ну в итоге то что? Что лучше? Совсем плохо если используешь где то стандартный парсер? Ведь сейчас писать шаблон без фенома даже и мыслей нет. Сайт до 500 страниц не ощутит этот смешанный режим? У меня вот сейчасс не получается на феноме вывести [[!+ss_meta]] из дополнения Seo Suite, и он у меня один в шаблоне. Из за этого одного тега я ведь ничего особо не теряю?
                                Алексей Соин
                                17 января 2022, 11:57
                                +1
                                У меня вот сейчасс не получается на феноме вывести [[!+ss_meta]] из дополнения Seo Suite
                                {'ss_meta' | placeholder}
                                  Алексей Смирнов
                                  17 января 2022, 12:13
                                  0
                                  Варианты с $_pls $_modx->getPlace… Пробовали?
                                    Алексей Соин
                                    17 января 2022, 12:15
                                    0
                                    точно ко мне вопрос?)))
                                      Алексей Смирнов
                                      17 января 2022, 12:32
                                      0
                                      блин. промазал по кнопке… перепутал цитату с сообщением — плохо видно было.
                                      Да, это вопрос к Михаилу.
                                      Простите. )
                                    Misha Bulic
                                    17 января 2022, 13:17
                                    0
                                    Спасибо, так помогло. Пробывал до этого через m2f.zencod.ru/ не вышло. Сейчас нормально. Кстати есть ли возможность проверить используется ли на странице где то стандартный парсер?
                                      Сергей Шлоков
                                      17 января 2022, 21:28
                                      0
                                      Кстати есть ли возможность проверить используется ли на странице где то стандартный парсер?
                                      Он используется всегда.
                        Fullstack
                        17 января 2022, 22:49
                        0
                        В принципе у меня начало получаться новым путем делать мой конвертер. Еще предстоят работы, но вот это уже неплохо так действует:

                        $r = $_POST['modx'];
                        //$r = mb_convert_encoding($_POST['modx'], 'utf-8', mb_detect_encoding($r));
                        
                        // [[- Комментарий ]]
                        $r = mb_ereg_replace('\[\[\-(.*?)\]\]', '{*\1*}', $r);
                        // [[~URL]]
                        $r = mb_ereg_replace('\[\[\~([0-9]+)\]\]', '{\1 | url}', $r);
                        // [[++системная_настройка]]
                        $r = mb_ereg_replace('\[\[\+\+([a-zA-Z0-9\._]+)\]\]', '{\'\1\' | option}', $r);
                        // [[+плейс.холдер]]
                        $r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+\.[a-zA-Z0-9\._]+)\]\]', '{$_pls[\'\2\']}', $r);
                        // [[+плейсхолдер]]
                        $r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+)\]\]', '{$\2}', $r);
                        // [[$чанк]]
                        $r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\]\]', '{include \'\1\'}', $r);
                        $r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\?', '{\'\1\' | chunk : [', $r);
                        // &параметр=`значение`
                        $r = mb_ereg_replace('\&([a-zA-Z0-9\._]+)=`?([^\[\]\&]+)`', '\'\1\' => \'\2\',', $r);
                        $r = str_replace('=> \'`\'', '=> \'\'', $r);
                        $r = mb_ereg_replace('\',([\r\n\s\t]+)?\]\]', '\'\1]}', $r);
                        $r = mb_ereg_replace('\=\> \'(.*?)\'\]\}', '=> \'\1\' ]}', $r);
                        
                        $r = str_replace('&', '&', $r);
                          Fullstack
                          18 января 2022, 00:33
                          0
                          Блин, из-за вставленного кода в данный топик в самом его начале (в первом посте), не могу изменить этот пост… Верстка modx.pro едет.

                          Вставлю сюда обновленный код:

                          fenom.php:
                          <?php
                          	header('Content-type: text/html; charset=utf-8');
                          	$r = '';
                          	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).'*}';
                          
                          			$r = preg_replace('/\&([a-zA-Zа-яА-ЯёЁ0-9_\-\.]+)(.*?)\=(.*?)\`(.*?)\`/u', '\'\1\'\2 => \3\'\4\',', $m);
                          
                          			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]);
                          		}
                          		$r = preg_replace_callback('/\[\[(.*?)\]\]/u', 'convert', $_POST['modx']);*/
                          
                          		$r = $_POST['modx'];
                          		//$r = mb_convert_encoding($_POST['modx'], 'utf-8', mb_detect_encoding($r));
                          
                          		// [[- Комментарий ]]
                          		$r = mb_ereg_replace('\[\[\-(.*?)\]\]', '{*\1*}', $r);
                          		// [[~URL]]
                          		$r = mb_ereg_replace('\[\[\~([0-9]+)\]\]', '{\1 | url}', $r);
                          		// [[%язык]]
                          		$r = mb_ereg_replace('\[\[\%([a-zA-Z0-9\._]+)\]\]', '{$_modx->lexicon(\'\1\')}', $r);
                          		// [[++системная_настройка]]
                          		$r = mb_ereg_replace('\[\[\+\+([a-zA-Z0-9\._]+)\]\]', '{\'\1\' | option}', $r);
                          		// [[+плейс.холдер]]
                          		$r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+\.[a-zA-Z0-9\._]+)\]\]', '{$_pls[\'\2\']}', $r);
                          		// [[+плейсхолдер]]
                          		$r = mb_ereg_replace('\[\[(\!)?\+([a-zA-Z0-9\._]+)\]\]', '{$\2}', $r);
                          		// [[*поле_ресурса]]
                          		$r = mb_ereg_replace('\[\[\*([a-zA-Z0-9\._]+)\]\]', '{$_modx->resource.\1}', $r);
                          		// [[$чанк]]
                          		$r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\]\]', '{include \'\1\'}', $r);
                          		$r = mb_ereg_replace('\[\[\$([a-zA-Z0-9\._]+)\?', '{\'\1\' | chunk : [', $r);
                          		// [[сниппет]]
                          		$r = mb_ereg_replace('\[\[(\!)?([a-zA-Z0-9\._]+)\]\]', '{\'\1\2\' | snippet}', $r);
                          		$r = mb_ereg_replace('\[\[(\!)?([a-zA-Z0-9\._]+)\?', '{\'\1\2\' | snippet : [', $r);
                          		// &параметр=`значение`
                          		$r = mb_ereg_replace('\&([a-zA-Z0-9\._]+)=`?([^\[\]\&]+)`', '\'\1\' => \'\2\',', $r);
                          		$r = str_replace('=> \'`\'', '=> \'\'', $r);
                          		$r = mb_ereg_replace('\',([\r\n\s\t]+)?\]\]', '\' \1]}', $r);
                          		//$r = mb_ereg_replace('\=\> \'(.*?)\'\]\}', '=> \'\1\' ]}', $r);
                          
                          		$r = str_replace('&', '&', $r);
                          	}
                          ?><!DOCTYPE html>
                          <html lang="ru">
                          <head>
                          	<meta charset="utf-8">
                          	<meta http-equiv="Content-Type" content="text/html; 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">
                          </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 echo ''; echo str_replace('&', '&', isset($_POST['modx']) ? $_POST['modx'] :
                          '[[$chunk_name]]
                          [[$asd? ¶m=`value`]]
                          [[$asd?
                          	¶m=`Hello`
                          	&a_s_d=`ыфавыавыа`
                          ]]
                          
                          [[!+ph]]
                          [[!+place.holder]]
                          
                          [[*parent]]
                          [[*template:is=`3`:then=`a`:else=`b`]]
                          
                          [[- comment ]]
                          
                          [[!uncached]]
                          [[cached]]
                          [[phpcode? ¶m=`Значение`]]
                          [[!snipp?
                          	¶m=`Привет`
                          	&PARAM=`Здравствуй`
                          ]]
                          
                          [[~123]]
                          [[%lang_var]]'); ?></textarea>
                          		<button type="submit">Конвертировать</button>
                          	</form>
                          	<?php
                          		if ($r) echo '
                          <hr>
                          <textarea>' . $r . '</textarea>';
                          	?>
                          </body>
                          </html>


                          Вместо странного символа должен быть знак & (амперсанда)
                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                          37