Page Menu
Home
Code
Search
Configure Global Search
Log In
Files
F392311
outputfilter.trimwhitespace.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Subscribers
None
outputfilter.trimwhitespace.php
View Options
<?php
/**
* Smarty plugin
*
* @package Smarty
* @subpackage PluginsFilter
*/
/**
* Smarty trimwhitespace outputfilter plugin
*
* Trim unnecessary whitespace from HTML markup.
*
* @author Rodney Rehm
* @param string $source input string
* @param Smarty_Internal_Template $smarty Smarty object
* @return string filtered output
* @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail!
*/
function
smarty_outputfilter_trimwhitespace
(
$source
,
Smarty_Internal_Template
$smarty
)
{
$store
=
array
();
$_store
=
0
;
$_offset
=
0
;
// Unify Line-Breaks to \n
$source
=
preg_replace
(
"/
\0
15
\0
12|
\0
15|
\0
12/"
,
"
\n
"
,
$source
);
// capture Internet Explorer Conditional Comments
if
(
preg_match_all
(
'#<!--
\[
[^
\]
]+
\]
>.*?<!
\[
[^
\]
]+
\]
-->#is'
,
$source
,
$matches
,
PREG_OFFSET_CAPTURE
|
PREG_SET_ORDER
))
{
foreach
(
$matches
as
$match
)
{
$store
[]
=
$match
[
0
][
0
];
$_length
=
strlen
(
$match
[
0
][
0
]);
$replace
=
'@!@SMARTY:'
.
$_store
.
':SMARTY@!@'
;
$source
=
substr_replace
(
$source
,
$replace
,
$match
[
0
][
1
]
-
$_offset
,
$_length
);
$_offset
+=
$_length
-
strlen
(
$replace
);
$_store
++;
}
}
// Strip all HTML-Comments
$source
=
preg_replace
(
'#<!--.*?-->#ms'
,
''
,
$source
);
// capture html elements not to be messed with
$_offset
=
0
;
if
(
preg_match_all
(
'#<(script|pre|textarea)[^>]*>.*?</
\\
1>#is'
,
$source
,
$matches
,
PREG_OFFSET_CAPTURE
|
PREG_SET_ORDER
))
{
foreach
(
$matches
as
$match
)
{
$store
[]
=
$match
[
0
][
0
];
$_length
=
strlen
(
$match
[
0
][
0
]);
$replace
=
'@!@SMARTY:'
.
$_store
.
':SMARTY@!@'
;
$source
=
substr_replace
(
$source
,
$replace
,
$match
[
0
][
1
]
-
$_offset
,
$_length
);
$_offset
+=
$_length
-
strlen
(
$replace
);
$_store
++;
}
}
$expressions
=
array
(
// replace multiple spaces between tags by a single space
// can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
'#(:SMARTY@!@|>)
\s
+(?=@!@SMARTY:|<)#s'
=>
'
\1
\2
'
,
// remove spaces between attributes (but not in attribute values!)
'#(([a-z0-9]
\s
*=
\s
*(["
\'
])[^
\3
]*?
\3
)|<[a-z0-9_]+)
\s
+([a-z/>])#is'
=>
'
\1
\4
'
,
// note: for some very weird reason trim() seems to remove spaces inside attributes.
// maybe a \0 byte or something is interfering?
'#^
\s
+<#Ss'
=>
'<'
,
'#>
\s
+$#Ss'
=>
'>'
,
);
$source
=
preg_replace
(
array_keys
(
$expressions
),
array_values
(
$expressions
),
$source
);
// note: for some very weird reason trim() seems to remove spaces inside attributes.
// maybe a \0 byte or something is interfering?
// $source = trim( $source );
// capture html elements not to be messed with
$_offset
=
0
;
if
(
preg_match_all
(
'#@!@SMARTY:([0-9]+):SMARTY@!@#is'
,
$source
,
$matches
,
PREG_OFFSET_CAPTURE
|
PREG_SET_ORDER
))
{
foreach
(
$matches
as
$match
)
{
$store
[]
=
$match
[
0
][
0
];
$_length
=
strlen
(
$match
[
0
][
0
]);
$replace
=
array_shift
(
$store
);
$source
=
substr_replace
(
$source
,
$replace
,
$match
[
0
][
1
]
+
$_offset
,
$_length
);
$_offset
+=
strlen
(
$replace
)
-
$_length
;
$_store
++;
}
}
return
$source
;
}
?>
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Feb 22, 20:27 (2 d, 10 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25822
Default Alt Text
outputfilter.trimwhitespace.php (3 KB)
Attached To
rZED Zed
Event Timeline
Log In to Comment