Version 4.0.13.1
This commit is contained in:
1 parent
f9e857d255
commit
c6a86f0d9b
7517 files changed
+597400
-668041
No files matched your search
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
require_once '../../../../init.php';
|
||||
|
||||
if ( \IPS\IN_DEV !== true AND ! \IPS\Theme::designersModeEnabled() )
|
||||
{
|
||||
exit();
|
||||
}
|
||||
|
||||
/* The CSS is parsed by the theme engine, and the theme engine has plugins, and those plugins need to now which theme ID we're using */
|
||||
if ( \IPS\Theme::designersModeEnabled() )
|
||||
{
|
||||
\IPS\Session\Front::i();
|
||||
}
|
||||
|
||||
$needsParsing = FALSE;
|
||||
|
||||
if( strstr( \IPS\Request::i()->css, ',' ) )
|
||||
{
|
||||
$contents = '';
|
||||
foreach( explode( ',', \IPS\Request::i()->css ) as $css )
|
||||
{
|
||||
if ( mb_substr( $css, -4 ) !== '.css' )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$css = str_replace( '../', '../', $css );
|
||||
$file = file_get_contents( \IPS\ROOT_PATH . '/' . $css );
|
||||
$params = processFile( $file );
|
||||
|
||||
if ( $params['hidden'] === 1 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$contents .= "\n" . $file;
|
||||
|
||||
if ( needsParsing( $css ) )
|
||||
{
|
||||
$needsParsing = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( mb_substr( \IPS\Request::i()->css, -4 ) !== '.css' )
|
||||
{
|
||||
exit();
|
||||
}
|
||||
|
||||
$contents = file_get_contents( \IPS\ROOT_PATH . '/' . str_replace( '../', '../', \IPS\Request::i()->css ) );
|
||||
|
||||
$params = processFile( $contents );
|
||||
|
||||
if ( $params['hidden'] === 1 )
|
||||
{
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( needsParsing( \IPS\Request::i()->css ) )
|
||||
{
|
||||
$needsParsing = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $needsParsing )
|
||||
{
|
||||
if ( \IPS\Theme::designersModeEnabled() )
|
||||
{
|
||||
/* If we're in designer's mode, we need to reset the theme ID based on the CSS path as we could be in the ACP which may have a different theme ID set */
|
||||
preg_match( '#themes/(\d+)/css/(.+?)/(.+?)/(.*)\.css#', \IPS\Request::i()->css, $matches );
|
||||
|
||||
if ( $matches[1] and $matches[1] !== \IPS\Theme::$memberTheme->id )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\Theme::$memberTheme = \IPS\Theme\Advanced\Theme::load( $matches[1] );
|
||||
}
|
||||
catch( \OutOfRangeException $ex ) { }
|
||||
}
|
||||
}
|
||||
|
||||
$functionName = 'css_' . uniqid();
|
||||
$contents = str_replace( '\\', '\\\\', $contents );
|
||||
\IPS\Theme::makeProcessFunction( $contents, $functionName );
|
||||
$functionName = "IPS\Theme\\{$functionName}";
|
||||
|
||||
\IPS\Output::i()->sendOutput( $functionName(), 200, 'text/css' );
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->sendOutput( $contents, 200, 'text/css' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether this file needs parsing or not
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
function needsParsing( $fileName )
|
||||
{
|
||||
if( \IPS\IN_DEV === TRUE AND ! \IPS\Theme::designersModeEnabled() )
|
||||
{
|
||||
preg_match( '#applications/(.+?)/dev/css/(.+?)/(.*)\.css#', $fileName, $matches );
|
||||
}
|
||||
else
|
||||
{
|
||||
preg_match( '#themes/(?:\d+)/css/(.+?)/(.+?)/(.*)\.css#', $fileName, $matches );
|
||||
}
|
||||
|
||||
return count( $matches );
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the file to extract the header tag params
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function processFile( $contents )
|
||||
{
|
||||
$return = array( 'module' => '', 'app' => '', 'pos' => '', 'hidden' => 0 );
|
||||
|
||||
/* Parse the header tag */
|
||||
preg_match_all( '#^/\*<ips:css([^>]+?)>\*/\n#', $contents, $params, PREG_SET_ORDER );
|
||||
foreach( $params as $id => $param )
|
||||
{
|
||||
preg_match_all( '#([\d\w]+?)=\"([^"]+?)"#i', $param[1], $items, PREG_SET_ORDER );
|
||||
|
||||
foreach( $items as $id => $attr )
|
||||
{
|
||||
switch( trim( $attr[1] ) )
|
||||
{
|
||||
case 'module':
|
||||
$return['module'] = trim( $attr[2] );
|
||||
break;
|
||||
case 'app':
|
||||
$return['app'] = trim( $attr[2] );
|
||||
break;
|
||||
case 'position':
|
||||
$return['pos'] = intval( $attr[2] );
|
||||
break;
|
||||
case 'hidden':
|
||||
$return['hidden'] = intval( $attr[2] );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
Reference in new issue
Block a user