Page Menu
Home
DevCentral
Search
Configure Global Search
Log In
Files
F36151217
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
Referenced Files
None
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
// yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124
$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 );
$_offset
=
0
;
if
(
preg_match_all
(
'#@!@SMARTY:([0-9]+):SMARTY@!@#is'
,
$source
,
$matches
,
PREG_OFFSET_CAPTURE
|
PREG_SET_ORDER
))
{
foreach
(
$matches
as
$match
)
{
$_length
=
strlen
(
$match
[
0
][
0
]);
$replace
=
$store
[
$match
[
1
][
0
]];
$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
Thu, Jul 16, 15:08 (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3874482
Default Alt Text
outputfilter.trimwhitespace.php (3 KB)
Attached To
Mode
rOBSIDIAN Obsidian Workspaces
Attached
Detach File
Event Timeline
Log In to Comment