Совместимость с хабраредактором для MODx Evo

в 14:14, , рубрики: modx, php, Веб-разработка, велосипеды, метки: ,

В процессе переноса своих статей с хабра или сайтов на LiveStreet я стаолкнулся с проблемой верстки.
Редактор хабра воспринимает переносы в исходном тексте именно как переносы, т.е. в HTML они будут выглядеть как

<br>

А все доступные редакторы для modx в режиме редактирования не воспринимают ссылки и картинки, и текст будет выглядеть как в редакторе:

Под катом вы найдете: макро-фотографии экрана, разборка, тест аккумулятора, камеры, опыт использования.
<a href="https://picasaweb.google.com/lh/photo/DWXbDrGSQrrqY2TJM_UhydMTjNZETYmyPJy0liipFm0?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-vrs2uZgIzqQ/UJPFgBkWr-I/AAAAAAAAKxg/FS0DcyCkW0w/s640/Samsung%2520Note%2520II-001.jpg" height="107" width="640" /></a>
<habrаcut text="У вас точно есть полчаса на чтение?" />

<ul>
	<li><a href="#pack">Упаковка и комплектация</a></li>
	<li><a href="#view">Качество сборки и внешний вид</a></li>
	<li><a href="#screen">Экран</a></li>
	<li><a href="#inside">Внутренности, моды и ремонтопригодность</a></li>


А если вставить текст в режиме редактирования — то он превратится в текст без переносов:

Сначала я хотел сделать из них часы, идущие в обратную сторону, но ошибся в задержках и получил звук "Зз-Зз-Зз-ЗЗЗЗЗ", который показался мне интересным.Дальше были выходные и неспешное ковыряние в коде, который претерпел несколько изменений, был потерян и переписан для MSP430 и Wiring вместо BASCOM(потому что мне было ленивее набирать программу второй раз, нежели написать ее на другом языке), и в итоге принял такой вид:ОСТОРОЖНО! Быдлокод!<source lang="cpp">
#include <Servo.h> //Подключаем бибилотекуServo myservo1;//Определяем именаServo myservo2;    int x = 0; //Разные еременные    int y = 0;    int z = 0;    int w = 0;    int g = 0;        int h = 0;    int q = 0;    

Что тоже неудобно. Нет, можно было конечно настроить замену в любом текстовом редакторе — /n на br, но проблема в том, что тогда мы получим две разные версии текста, что обернется проблемами с редактированием. Пришлось сделать заказать фрилансеру велосипед.

Плагин для автоматической замены /n на br при сохранении текста и обратной замены при его редактировании:

global $content;
$e = &$modx->Event;
switch ($e->name) {
case "OnDocFormPrerender":
$content["content"]=trim(preg_replace("/<br>/i","rn",$content["content"])); //Замена при открытии на текстовые переносы
 break;
case "OnBeforeDocFormSave":
$content=preg_replace("/(\\r\\n)/","<br>",$content); //Замена при сохранении
$content=preg_replace("/(\\n)/","<br>",$content);
$content=preg_replace("/(\\r)/","<br>",$content); //Совместимость для разных систем
$content=preg_replace("/</li>s*(<br>)+s*<li/i","</li>\\r\\n<li",$content);
$content=preg_replace("/<ul>s*(<br>)+s*<li/i","<ul>\\r\\n<li",$content);
$content=preg_replace("/</li>s*(<br>)+s*</ul/i","</li>\\r\\n</ul",$content);
$content=preg_replace("/s*(<br>)+s*<ul/i","\\r\\n<ul",$content);
$content=preg_replace("/</ul>s*(<br>)+s*/i","</ul>\\r\\n",$content);//Устранение двойного переноса в нумерованных списках
 break;
default :
return; 
 break;
}

Установка обычна — Управление элементами — плагины — создать плагин.
Копируем код в поле, потом переходим на вкладку системные события и отмечаем OnBeforeDocFormSave и OnDocFormPrerender — запускать при открытии и сохранении документа.

Автор: vvzvlad

Источник

Поделиться

* - обязательные к заполнению поля