Плагин HtmlInLine - Вытягиваем html в 1 строчку (версии для Evo и Revo)

Создаем плагин HTML2Line и вешаем его на событие OnWebPagePrerender. После этого HTML код страниц будет вытягиваться в строку.

Но если нам вдруг понадобится на какой-то страничке отключить сжатие, то в настройках этой страницы снимаем галочку: «Доступен для поиска».

/**************************************/
/** HtmlInLine plugin for MODX Revo
*
* @version 1.1
* @author Borisov Evgeniy aka Agel Nash (agel-nash@xaker.ru)
*
* @category plugin
* @internal @event OnWebPagePrerender
* @internal @modx_category HTML-code
*
*/
/*************************************/
$e =&$modx->event;
switch ($e->name) {
    case "OnWebPagePrerender":{
        if($modx->documentObject['searchable']==1){
            $content = $modx->documentOutput;
            $content= preg_replace('|\s+|', ' ', $content);
            $modx->documentOutput = $content;
        }
        break;
    }
}


При желании можно повесить переключатель на TV-параметр. заменив проверку $modx->documentObject['searchable'] на свою. Единственное, данный плагин вытягивает в 1 строчку все страницы (даже с шаблоном blank).

Для Revolution я как раз так и сделал, т.к. там проект этого требовал.

После того, как создали TV-параметр в свойства плагина добавляем параметр tvHtmlInLine и указываем там ID TV-параметра.
<?php
/**************************************/
/** HtmlInLine plugin for MODX Revo
*
* @version 1.2
* @author Borisov Evgeniy aka Agel Nash (agel-nash@xaker.ru)
* @date 20.07.2012
*
* @category plugin
* @internal @event OnWebPagePrerender
* @internal @properties &tvHtmlInLine=ID TV;integer;1
* @internal @modx_category HTML-code
*
*
*
* INSTALL
*        1) Создать новый шаблон который только будет выводить содержимое документа: [[*content]]
*        2) К шаблону привязать новый TV параметр:
*              - Тип ввода: список (одиночный выбор).
*              - Возможные варианты: Да==1||Нет==0 
*              - Значение по умолчанию: 1
*        3) Создать параметр к плагину с именем tvHtmlInLine
*               - Значение параметра: id TV параметра
*		- Тип ввода: Целое
*/
/*************************************/

if($modx->event->name=='OnWebPagePrerender'){
  $flag=true;
  if(isset($tvHtmlInLine) && (int)$tvHtmlInLine>0){
     $id = $modx->resource->get('id');
     $tvs = $modx->getObject('modTemplateVarResource',array('tmplvarid'=>(int)$tvHtmlInLine, 'contentid'=>$id));
     if($tvs && 0==$tvs->get('value')){
           $flag=false;
     }
  }
  if($flag){
      $html = &$modx->resource->_output;
      $html = preg_replace('|\s+|', ' ', $html);
  }
}

53 комментария

avatar
что-то похожее было под эво вот токо найти не могу этот плагин
avatar
) это же и было. Это мой плагин, просто все мои топики были удалены с одного сайта. А на этом я еще не успел все статьи свои восстановить из архива.
avatar
плагин класный, реально скорость реактивная… только вопрос как поисковики воспринимают такой код? ведь там если посмотреть в исходный код выстраивается в одну строку так как вырезаются все пробелы и отступы
avatar
А что не так? Зачем поисковикам пробелы? В них информативности 0. Попробуйте даже в строку поиска вбить
"             "
эта строчка сократиться до " ". И это все при учете, что вбивали мы точный запрос (закавыченный).
avatar
Согласен, пробелы и концы строк нужны человеку. Роботам пофик. Как и вашему браузеру
avatar
Спасибо за плагин.
P.S.Для Evo условие дописал так:
if($modx->event->name=='OnWebPagePrerender'){
    $flag=true;
  if(isset($tvHtmlInLine) && (int)$tvHtmlInLine>0){
     $tv=$modx->getTemplateVarOutput(array($tvHtmlInLine));
     if($tv['HtmlInLine']==0){
           $flag=false;
     }
  }
  if($flag){
      $content = $modx->documentOutput;
      $content= preg_replace('|\s+|', ' ', $content);
      $modx->documentOutput = $content;
  }
}

По идее работает)
Комментарий отредактирован 2012-12-15 22:34:43 пользователем Actek
avatar
У меня вопрос на мильон. Я уважаю твой труд. Но зачем он вообще нужен, этот плагин? =) Ну реально, сэкономить 1кб?
Комментарий отредактирован 2012-12-16 01:17:41 пользователем Redjik
avatar
У меня вопрос на 2 мульена. Я уважаю твое желание показаться умным, но кому это вообще нужно кроме тебя? Ну реально. Намек ясен?

Хотя не, не буду хамить:-) Я никому не навязываю его. Нужен — бери. Не нужен — лесом. Кому нужен — тот знает зачем использует этот плагин. Кому нет — тот спрашивает для чего я экономлю 1кб.
Комментарий отредактирован 2012-12-16 01:57:10 пользователем Agel_Nash
avatar
Ага, понял, ладно.
avatar
Agel_Nash, а сколько байт сохраняет плагин при включенном mod_deflate(в обоих случаях)? Сдается мне что там и килобайта не набежит. Если же у тебя счет на байты, то тут нужны инструменты по-мощнее, которые умеют сокращать имена классов и id. Хотя так то да, легкий способ еще немного выжать код. Но все-равно, хотелось бы видеть сравнительную табличку. И еще желательно замерить время работы плагина :)
avatar
Ага — я вот это юзаю github.com/mrclay/minify для js.
Хотя html разметку я не трогаю — гуглы и фейсбуки тоже не трогают… Gzip вполне хватает.

ЗЫ. жаль, что у ТС обсуждение плагина вызывает столько агрессии
Комментарий отредактирован 2012-12-16 16:44:00 пользователем Redjik
avatar
откройте гугл и посмотрите. Помимо того, что они вытягивают все в 1 строку, они еще и все CSS и JS сжимают и добавляют сразу в HTML, чтобы меньше реквестов было. Т.е. вместо 3 файлов отдают пользователю 1 файл. Херней наверное страдают? Аааа, да, у них же трафик ого-го, не то, что визитка васи пупкина. Но почему картинка 800х600 отображаемая как 100px считается дурным тоном на равне с вытягиванием HTML-контента в 1 строчку? Хотя знаю, видимо потому, что в первом случае скорость загрузки резко снижается, а во втором это не заметно. Да и серверу же вроде как пофигу сколько байт отправить при низкой посещаемости 100 или 105…

Я никого не заставляю пользоваться своим плагином. Просто заметил, что ко мне на сайт приходят по запросам

плагин вытягивающий контент в 1 строчку modx
вытягиваем html в 1 строчку [evo]
и т.п.

А плагин то реально нигде не опубликован. Вот решил по новой опубликовать. Если кому-то это кажется бесполезным — не вопрос.
avatar
Я плагин написал на CKeditor, который при ресайзе картинки, реально ресайзит ее на сервере.

При загрузке на сервер в папку .original, кидается Оригинальная картинка. И уже ее скрипт ресайзит в зависимости от параметров. Width и height при этом к тегу img не добавляются.
avatar
мы тут письками будем мериться или плагин обсуждать?
avatar
Плагин включен
Рендер: 0,3765
Размер страницы: 23 870 байт
При включеном модуле длина заголовка: 7532 байт

Плагин выключен
Рендер: 0,3692
Размер страницы: 25 179 байт
При включеном модуле длина заголовка: 7780 байт

Селектел берет по 64 копейки за 1 отправленный гигабайт (1073741824 байт). Разница в байтах 248. Таким образом, страницу должны просмотреть 4329604 раз.

На испытуемом сайте за вчера, например, было совершено 9900 просмотров.

Если яндекс не забанит этот сайт и число просмотров всегда будет таким, то через 438 дней я сэкономлю 64 копейки с этого сайта.
avatar
Это ты на стороне сервера посчитал?
А что браузер говорит, при приеме, после сжатия?
avatar
Размер заголовка я узнал из браузера как раз. Content-Length подсмотрел;-)
avatar
А при чем тут Content-Length?

Сколько по факту скачивает браузер с сервера?
В заголовок можно что угодно вставить.

Firebug или панель Хрома скажет тебе точную цифру.

На примере сайта modx.com.

Открываем в гугле.
Видим — 7.59 KB размер скаченной инфы.
Размер контента — 22.25 KB.
Это и есть Gzip.

Открывай исходный код через ctrl+u — сохраняем его в блокноте и видим — реально 22 KB.

Проверяем дальше — открываем в фаербаге тот же самый сайт. И смотрим вкладку Net.
Наводим на 7,2 KB и видим детальную инфу по скаченой странице.

Скачено — 7 764 B включая заголовки.

После этого проверь свои скрипты по идее они должны одинаковый размер выдавать.

Далее минусуем мой пост… ну и по стандартной схеме…
avatar
Хватит тролить. Content-Length это и есть размер скачаной инфы.
После этого проверь свои скрипты по идее они должны одинаковый размер выдавать.
С чего это они одинаковый размер должны отдавать? Размер контента страницы с плагином один, размер контента без плагина — друой. Хватит уже умничать.
avatar
Ну и чтобы стандартную схему врубить безогаворочно и за дело читай иди изучай размер скачаной инфы www.aerodesigne.ru/ng2013.html?redjik и www.aerodesigne.ru/ng2013.html
avatar
Ага, сравнил, профит 0,3 кб, все понял, молчу, а то забаниш еще, медальку уже выдал.

Бритва Оккама, KISS…

ЗЫ. похохотал, ага
avatar
нука покажи мне, где ты 0,3 кб увидел? 1,3КБ.
А медальку тебе выдали еще вчера, и далеко не за заслуги в этом топике.
Комментарий отредактирован 2012-12-16 22:30:36 пользователем Agel_Nash
avatar
Пфф



И хлебные крошки поправь.
avatar
И хлебные крошки поправь.
Приспичит — поправлю.

С тобой я уже запутался о каких данных мы говорим. Но раз ты пфыкаешь, то не поленись, прочитай в сотый раз мое сообщение
Плагин включен
Рендер: 0,3765
Размер страницы: 23 870 байт
При включеном модуле длина заголовка: 7532 байт

Плагин выключен
Рендер: 0,3692
Размер страницы: 25 179 байт
При включеном модуле длина заголовка: 7780 байт
Переведи байты в килобайты. И увидишь, что ответ был дан сразу.

Ну раз уж ты сливаешься, то вот краткие ответы на твои вопросы.
А что браузер говорит, при приеме, после сжатия?
Допустим заголовок — 150 байт.
Контент: 2000 байт. Итого, браузер получает 2150 байт.
Сжимем контент до 1800 в итоге браузер получает 1950 байт. Зачем мне смотреть, какой объем с заголовками, если я влияю только на контент. Таким образом длинна заголовоков это контстанта ± 1 байт при моих сжатиях.

Этот заголовок генерит СЕРВЕР, а не БРАУЗЕР
И что? Я изменяю размер контента и ТОЛЬКО. То, что отдает браузер еще учитывает заголовки, мне на это плевать, т.к. плагин на них не влияет.

В заголовок можно что угодно вставить.
Зачем мне это?

Как-то так получается…
avatar
Последний раз объясняю тебе элементарные вещи.

Nginx по дефолту не отдает content-length, а заголовок может все что угодно выставить (в зависимости от того, что крутиться на сервере), потом Nginx сделает gzip контента и ты на выходе получаешь разные цифры.
В твоем случае, я могу только предположить, но думаю, что modx в конце рендера выставляет content-length. Сжатие происходить после.

И не надо хамит, ни куда я не сливаюсь — не вали с больной головы на здоровую, если ты сам не понимаешь сам, что пишешь.

Вообще, твои примеры, да и сам плагин, уж очень напоминает толстый троллинг.

Тема обсосана уже 100ни раз
stackoverflow.com/questions/728260/html-minification/1102101#1102101
avatar
Вообще, твои примеры, да и сам плагин, уж очень напоминает толстый троллинг.
и мое самое первое сообщение
Я никому не навязываю его. Нужен — бери. Не нужен — лесом. Кому нужен — тот знает зачем использует этот плагин. Кому нет — тот спрашивает для чего я экономлю 1кб.
кто кого тролит еще. особенно учитывая вот это
молчу, а то забаниш еще, медальку уже выдал.
Бритва Оккама, KISS…
ЗЫ. похохотал, ага
В твоем случае, я могу только предположить, но думаю, что modx в конце рендера выставляет content-length. Сжатие происходить после.
MODX вообще не устанавливает content-length

Nginx по дефолту не отдает content-length, а заголовок может все что угодно выставить (в зависимости от того, что крутиться на сервере), потом Nginx сделает gzip контента и ты на выходе получаешь разные цифры.
о0 понемногоу переходим к серверам и их настройкам. Осталось поднять тему для чего нужен Content-Length и как на него реагируют браузеры. Затем чтобы поставить жирную точку — обмусолим конфиг моего сервера и все ради чего? Чтобы друг другу доказать у кого лоб крепче?

И не надо хамит, ни куда я не сливаюсь — не вали с больной головы на здоровую, если ты сам не понимаешь сам, что пишешь.
Интересно, где это там хамство.

Если в слове сливаюсь, то ты сам сказал
молчу
отвечу твоими же словами. Не нужно валить с больной головы на здоровую. Скажу больше твои комментарии уже выбешивают не только меня, но многих других участников этого форума. Во всех темах, где ты вставляешь свои 5 коппер разговор переходит абсолютно в другое русло. Начинают с разговора про скорость загрузки сайта — заканчивают ООП и программированием. Тупо выложен исходник плагина без всяких навязываний — разговор заканчиваем настройками серверов (закончили ли? или будем дальше продолжать выяснять кто круче в чем разбирается?). и т.д. и т.п.
Комментарий отредактирован 2012-12-17 00:33:21 пользователем Agel_Nash
avatar
Ой и правда, чего это я?
Ненужный спор, который отнимает кучу времени.

+1 к списку людей, с которыми не стоит делиться опытом или указывать на ошибки — не оценит, а жаль…

Спасибо, на этом откланиваюсь, сливаюсь, сдаюсь. Чтобы не продолжать ненужный, никчемный спор — Плагин ОГОНЬ, с друзьями пользуемся — очень довольны!
avatar
Опытом делятся тогда, когда дают развернутый ответ. А сухие отвечты в стиле «смотри там» или того круче «у меня работает» — нифига не дележка опытом. Это стеб над всеми, кто понимает где нужно смотреть и корявые понты перед теми, кто не понимает где нужно смотреть.
avatar
+1 к списку людей, с которыми не стоит делиться опытом или указывать на ошибки — не оценит
-1 из списка адекватных собеседников.

Спасибо, на этом откланиваюсь, сливаюсь, сдаюсь.
Вот и правильно. Глядишь быстрее обещанная разоблачительная статья появится.

Плагин ОГОНЬ, с друзьями пользуемся — очень довольны!
Спасибо. Дэнчику с валерой привет.
avatar
Цитата с твоего любимого PHPClub
Content-Length — количество байт, пересылаемых в Entity-Body


Выше по ветке был конкретный вопрос: на сколько байт сжимает данный плагин и сколько байт экономится в итоге при пересылке пользователю. На примере продакшин сайта я показал, что с 1 страницы экономится 1309 байт. При дополнительном серверном сжатии 248.

Почему-то я был лучшего мнения о тебе. Видимо редко раньше с тобой пересекался в комментариях…
avatar
stackoverflow.com/questions/9728269/content-length-and-other-http-headers

Этот заголовок генерит СЕРВЕР, а не БРАУЗЕР… что мы по факту скачаем — надо смотреть в браузере.
avatar
Ты ссылки смотрел? И сколько твой браузер байт скачал? Или считаешь, что я из-за пары байт заголовок подделывал?
avatar
И да… я тоже был о тебе лучшего мнения…
Не понимаю как специалист по защите говорит такое…
avatar
Я вообще не понимаю к чему весь этот троллинг с заголовками и т.п. все, что мы тут обсуждаем сейчас профита никакого не несет. Ответ где и что я проверял (на стороне сревера и в браузере) дан еще тут. До твоих демагогий
avatar
Подключил систему комментариев Disqus, работает только если вытягивание кода выключено( Не подскажите можно это как то обойти? Или придётся выбирать?)
avatar
Скорее всего проблема в JavaScript и символе; который должен стоять в конце строк. Еще возможно виноваты строчные комментарии типа //
Комментарий отредактирован 2013-01-22 21:56:23 пользователем Agel_Nash
avatar
Спасибо большое! и в правду виноваты были "//")
avatar
Спасибо за плагин. Но там в начале строки портится русская буква «Р».
По этому, я поменял так:
$content= preg_replace('/[\n\r'.chr(9).chr(32).']+/', ' ', $content);
avatar
Опять не то. Скрипты перестали работать. :(
Причину не знаю. Но убрал «n» тоже:
$content= preg_replace('/[\r'.chr(9).chr(32).']+/', ' ', $content);

Так вроде нормально работает.
А как сделать, чтобы и плагины тоже упаковались? Например, «Quick Manager»?
avatar
Спасибо за плагин, я что-то подобное пытался делать, но так и не мог правильно составить регулярку.
Я еше добавил:
'/<!-- (.*?) -->/'
и
'|> *<|U'
Чтобы вырезались комментарии и пробелы между ><.
Не знаю было это упомянуто выше, но еще одно эффективно применение плагина — выравнивани display-inline элементов по центру) Не нужно в ручную в одну строку вытягивать.
avatar
Подскажите по близкой теме:
Нужен сниппет, который будет брать поле документа/TV/чанк и на выходе давать код без переносов строк.
По идее

[[if? &is=`:is:` &then=`@eval: echo str_replace('\r\n','','[*TV*]');`]]


или

[[if? &is=`:is:` &then=`@eval: echo str_replace('|\s+|','','[*TV*]');`]]


должно работать, но нифига…
avatar
Доброго времени суток? Продолжение плагин не получил? Данный вариант на версии 2.4.3 работать не хочет!

Автор может посмотреть? Спасибо!
  • LRN
  • 0
avatar
За что минус, поясните в чем ошибка?
avatar
Доброго времени суток? Продолжение плагин не получил? Данный вариант на версии 2.4.3 работать не хочет!
Я не работаю с Revo и смотреть почему не работает в версии 2.4.3 нет желания. Возможно найдутся другие альтруисты, желающие вам помочь.
avatar
Просто в заголовке написано, что "(версии для Evo и Revo)" — собственно!

Спасибо за ответ!
avatar
Просто топик создал 3 года назад — собственно!
avatar
Если кому потребуется, то для вариант для REVO


<?php
$e =&$modx->event;
switch ($e->name) {
    case "OnWebPagePrerender":{
        $content = $modx->resource->_output;
        $content= preg_replace('|\s+|', ' ', $content);
        $modx->resource->_output = $content;
        break;
    }
}
avatar
Отправил пул на гите, но и здесь отпишусь.
Предлагаю дополнить плагин регуляркой
$e =&$modx->event;
switch ($e->name) {
    case "OnWebPagePrerender":{
        if($modx->documentObject['searchable']==1){
            $content = $modx->documentOutput;
            $content= preg_replace('|\s+|', ' ', preg_replace('|(\s+)?\n(\s+)?|', '', $content));
            $modx->documentOutput = $content;
        }
        break;
    }
}
Т. е. с начало удаляем все пробелы, табы, если существуют, до переноса и после переноса строк. И уже затем заменяем двойные пробелы на один.

PS:
Если честно, то задолбался в каждом проекте подправлять код плагина :)
Комментарий отредактирован 2016-07-03 01:37:04 пользователем ProjectSoft
avatar
Добрый день! Версия 1.2 для Evo не удаляет комментарии из кода? Без этого PageSpeed Insights продолжает ругаться «Сократите HTML». Можете допилить за небольшой donate? Спасибо.
  • Wooof
  • 0
avatar
Соответственно должен быть radio ТВ параметр HtmlInLine. И для конкретной страницы выбрано значение 1.

$e =&$modx->event;

$HtmlInLine = isset($modx->documentObject['HtmlInLine']) ? $modx->documentObject['HtmlInLine'] : '';
$HtmlInLine = (is_array($HtmlInLine) && isset($HtmlInLine[1])) ? $HtmlInLine[1] : 0;

switch ($e->name) {
    case "OnWebPagePrerender":{
        if($HtmlInLine){
            $content = $modx->documentOutput;
            $filters = array(
            	'/<!--([^\[|(<!)].*)-->/i'		=> '', // Remove HTML Comments (breaks with HTML5 Boilerplate)
	            '/(?<!\S)\/\/\s*[^\r\n]*/'	=> '', // Remove comments in the form /* */
	            '/\s{2,}/'			=> ' ', // Shorten multiple white spaces
	            '/(\r?\n)/'			=> '', // Collapse new lines
	        );

	        $content = preg_replace(array_keys($filters), array_values($filters), $content);
            $modx->documentOutput = $content;
        }
        break;
    }
}
avatar
… Только сейчас добрался до плагина. Комментарии он по-прежнему не удаляет. Bootstrap.
Комментарий отредактирован 2017-08-08 21:53:40 пользователем Wooof
avatar
$e =&$modx->event;

$HtmlInLine = isset($modx->documentObject['HtmlInLine']) ? $modx->documentObject['HtmlInLine'] : '';
$HtmlInLine = (is_array($HtmlInLine) && isset($HtmlInLine[1])) ? $HtmlInLine[1] : 0;

switch ($e->name) {
    case "OnWebPagePrerender":{
       if($HtmlInLine){
            $content = $modx->documentOutput;
			// https://asked.io/laravel-5-minify-middleware
            $filters = [
			  '/<!--([\s\S]*?)-->/'											  	  => '', // Remove HTML Comments (breaks with HTML5 Boilerplate)
			  '/(?<!\S)\/\/\s*[^\r\n]*/'										  => '', // Remove comments in the form /* */
              '/\>[^\S ]+/s'                                                      => '>',
              '/[^\S ]+\</s'                                                      => '<',
              '/([\t ])+/s'                                                       => ' ',
              '/^([\t ])+/m'                                                      => '',
              '/([\t ])+$/m'                                                      => '',
              '~//[a-zA-Z0-9 ]+$~m'                                               => '',
              '/[\r\n]+([\t ]?[\r\n]+)+/s'                                        => "\n",
              '/\>[\r\n\t ]+\</s'                                                 => '><',
              '/}[\r\n\t ]+/s'                                                    => '}',
              '/}[\r\n\t ]+,[\r\n\t ]+/s'                                         => '},',
              '/\)[\r\n\t ]?{[\r\n\t ]+/s'                                        => '){',
              '/,[\r\n\t ]?{[\r\n\t ]+/s'                                         => ',{',
              '/\),[\r\n\t ]+/s'                                                  => '),',
              '~([\r\n\t ])?([a-zA-Z0-9]+)=\"([a-zA-Z0-9_\\-]+)\"([\r\n\t ])?~s'  => '$1$2=$3$4', 
            ];
            $content = preg_replace(array_keys($filters), array_values($filters), $content);
            $modx->documentOutput = $content;
        }
        break;
    }
}

Спасибо pathologic.
avatar
Если на сайте установлен Shopkeeper то не срабатывает helper. Подскажите, как решить проблему?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.