<?php
//Function to seperate multiple tags one line
function fix_newlines_for_clean_html($fixthistext)
{
$fixthistext_array = explode("\n", $fixthistext);
foreach ($fixthistext_array as $unfixedtextkey => $unfixedtextvalue)
{
//Makes sure empty lines are ignores
if (!preg_match("/^(\s)*$/", $unfixedtextvalue))
{
$fixedtextvalue = preg_replace("/>(\s|\t)*</U", ">\n<", $unfixedtextvalue);
$fixedtext_array[$unfixedtextkey] = $fixedtextvalue;
}
}
return implode("\n", $fixedtext_array);
}
function clean_html_code($uncleanhtml)
{
//Set wanted indentation
$indent = " ";
//Uses previous function to seperate tags
$fixed_uncleanhtml = fix_newlines_for_clean_html($uncleanhtml);
$uncleanhtml_array = explode("\n", $fixed_uncleanhtml);
//Sets no indentation
$indentlevel = 0;
foreach ($uncleanhtml_array as $uncleanhtml_key => $currentuncleanhtml)
{
//Removes all indentation
$currentuncleanhtml = preg_replace("/\t+/", "", $currentuncleanhtml);
$currentuncleanhtml = preg_replace("/^\s+/", "", $currentuncleanhtml);
$replaceindent = "";
//Sets the indentation from current indentlevel
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
//If self-closing tag, simply apply indent
if (preg_match("/<(.+)\/>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If doctype declaration, simply apply indent
else if (preg_match("/<!(.*)>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If opening AND closing tag on same line, simply apply indent
else if (preg_match("/<[^\/](.*)>/", $currentuncleanhtml) && preg_match("/<\/(.*)>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If closing HTML tag or closing JavaScript clams, decrease indentation and then apply the new level
else if (preg_match("/<\/(.*)>/", $currentuncleanhtml) || preg_match("/^(\s|\t)*\}{1}(\s|\t)*$/", $currentuncleanhtml))
{
$indentlevel--;
$replaceindent = "";
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If opening HTML tag AND not a stand-alone tag, or opening JavaScript clams, increase indentation and then apply new level
else if ((preg_match("/<[^\/](.*)>/", $currentuncleanhtml) && !preg_match("/<(link|meta|base|br|img|hr)(.*)>/", $currentuncleanhtml)) || preg_match("/^(\s|\t)*\{{1}(\s|\t)*$/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
$indentlevel++;
$replaceindent = "";
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
}
else
//Else, only apply indentation
{$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;}
}
//Return single string seperated by newline
return implode("\n", $cleanhtml_array);
}
//Get and clean the prerendered modx page
$modx->documentOutput = clean_html_code($modx->documentOutput);
?>

<?php /* REMOVE! Only for syntax highlightning */
function fix_newlines_for_clean_html($fixthistext)
{
$fixthistext_array = explode("\n", $fixthistext);
foreach ($fixthistext_array as $unfixedtextkey => $unfixedtextvalue)
{
//Makes sure empty lines are ignores
if (!preg_match("/^(\s)*$/", $unfixedtextvalue))
{
$fixedtextvalue = preg_replace("/>(\s|\t)*</U", ">\n<", $unfixedtextvalue);
$fixedtext_array[$unfixedtextkey] = $fixedtextvalue;
}
}
return implode("\n", $fixedtext_array);
}
function clean_html_code($uncleanhtml)
{
//Set wanted indentation
$indent = " ";
//Uses previous function to seperate tags
$fixed_uncleanhtml = fix_newlines_for_clean_html($uncleanhtml);
$uncleanhtml_array = explode("\n", $fixed_uncleanhtml);
//Sets no indentation
$indentlevel = 0;
foreach ($uncleanhtml_array as $uncleanhtml_key => $currentuncleanhtml)
{
//Removes all indentation
$currentuncleanhtml = preg_replace("/\t+/", "", $currentuncleanhtml);
$currentuncleanhtml = preg_replace("/^\s+/", "", $currentuncleanhtml);
$replaceindent = "";
//Sets the indentation from current indentlevel
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
//If self-closing tag, simply apply indent
if (preg_match("/<(.+)\/>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If doctype declaration, simply apply indent
else if (preg_match("/<!(.*)>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If opening AND closing tag on same line, simply apply indent
else if (preg_match("/<[^\/](.*)>/", $currentuncleanhtml) && preg_match("/<\/(.*)>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If closing HTML tag or closing JavaScript clams, decrease indentation and then apply the new level
else if (preg_match("/<\/(.*)>/", $currentuncleanhtml) || preg_match("/^(\s|\t)*\}{1}(\s|\t)*$/", $currentuncleanhtml))
{
$indentlevel--;
$replaceindent = "";
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If opening HTML tag AND not a stand-alone tag, or opening JavaScript clams, increase indentation and then apply new level
else if ((preg_match("/<[^\/](.*)>/", $currentuncleanhtml) && !preg_match("/<(link|meta|base|br|img|hr)(.*)>/", $currentuncleanhtml)) || preg_match("/^(\s|\t)*\{{1}(\s|\t)*$/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
$indentlevel++;
$replaceindent = "";
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
}
else
//Else, only apply indentation
{$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;}
}
//Return single string seperated by newline
return implode("\n", $cleanhtml_array);
}
$e = &$modx->Event;
switch ($e->name) {
case "OnWebPagePrerender":
$modx->documentOutput = clean_html_code($modx->documentOutput);
break;
default :
return; // stop here.
break;
}
function fix_newlines_for_clean_html($fixthistext)
{
$fixthistext_array = explode("\n", $fixthistext);
foreach ($fixthistext_array as $unfixedtextkey => $unfixedtextvalue)
{
//Makes sure empty lines are ignores
if (!preg_match("/^(\s)*$/", $unfixedtextvalue))
{
$fixedtextvalue = preg_replace("/>(\s|\t)*</U", ">\n<", $unfixedtextvalue);
$fixedtext_array[$unfixedtextkey] = $fixedtextvalue;
}
}
return implode("\n", $fixedtext_array);
}
function clean_html_code($uncleanhtml)
{
//Set wanted indentation
$indent = " ";
//Uses previous function to seperate tags
$fixed_uncleanhtml = fix_newlines_for_clean_html($uncleanhtml);
$uncleanhtml_array = explode("\n", $fixed_uncleanhtml);
//Sets no indentation
$indentlevel = 0;
foreach ($uncleanhtml_array as $uncleanhtml_key => $currentuncleanhtml)
{
//Removes all indentation
$currentuncleanhtml = preg_replace("/\t+/", "", $currentuncleanhtml);
$currentuncleanhtml = preg_replace("/^\s+/", "", $currentuncleanhtml);
$replaceindent = "";
//Sets the indentation from current indentlevel
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
//If self-closing tag, simply apply indent
if (preg_match("/<(.+)\/>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If doctype declaration, simply apply indent
else if (preg_match("/<!(.*)>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If opening AND closing tag on same line, simply apply indent
else if (preg_match("/<[^\/](.*)>/", $currentuncleanhtml) && preg_match("/<\/(.*)>/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If closing HTML tag or closing JavaScript clams, decrease indentation and then apply the new level
else if (preg_match("/<\/(.*)>/", $currentuncleanhtml) || preg_match("/^(\s|\t)*\}{1}(\s|\t)*$/", $currentuncleanhtml))
{
$indentlevel--;
$replaceindent = "";
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
}
//If opening HTML tag AND not a stand-alone tag, or opening JavaScript clams, increase indentation and then apply new level
else if ((preg_match("/<[^\/](.*)>/", $currentuncleanhtml) && !preg_match("/<(link|meta|base|br|img|hr)(.*)>/", $currentuncleanhtml)) || preg_match("/^(\s|\t)*\{{1}(\s|\t)*$/", $currentuncleanhtml))
{
$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;
$indentlevel++;
$replaceindent = "";
for ($o = 0; $o < $indentlevel; $o++)
{
$replaceindent .= $indent;
}
}
else
//Else, only apply indentation
{$cleanhtml_array[$uncleanhtml_key] = $replaceindent.$currentuncleanhtml;}
}
//Return single string seperated by newline
return implode("\n", $cleanhtml_array);
}
$e = &$modx->Event;
switch ($e->name) {
case "OnWebPagePrerender":
$modx->documentOutput = clean_html_code($modx->documentOutput);
break;
default :
return; // stop here.
break;
}$e = &$modx->Event;
switch ($e->name) {
case "OnWebPagePrerender":
$modx->documentOutput = clean_html_code($modx->documentOutput);
break;
default :
return; // stop here.
break;
}
$modx->documentOutput = clean_html_code($modx->documentOutput); return;
I’m not to sure what you mean goldsky. I’ve got this running on several sites with various containers nested with each other and it still formats correctly. Could you give me an example link?
but i believe, this does not work well for nested divs?
and restarted its process if pass by a ’}’ bracket.
Very nice.
But since you’re only responding to one event, you can replace this:
$e = &$modx->Event; switch ($e->name) { case "OnWebPagePrerender": $modx->documentOutput = clean_html_code($modx->documentOutput); break; default : return; // stop here. break; }
with this:
$modx->documentOutput = clean_html_code($modx->documentOutput); return;