You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
8.1 KiB
272 lines
8.1 KiB
2 years ago
|
<?php
|
||
|
// This file is part of Moodle - http://moodle.org/
|
||
|
//
|
||
|
// Moodle is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU General Public License as published by
|
||
|
// the Free Software Foundation, either version 3 of the License, or
|
||
|
// (at your option) any later version.
|
||
|
//
|
||
|
// Moodle is distributed in the hope that it will be useful,
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
// GNU General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU General Public License
|
||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
class cssparser {
|
||
|
private $css;
|
||
|
private $html;
|
||
|
|
||
|
public function __construct($html = true) {
|
||
|
// Register "destructor"
|
||
|
core_shutdown_manager::register_function(array(&$this, "finalize"));
|
||
|
$this->html = ($html != false);
|
||
|
$this->Clear();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Old syntax of class constructor. Deprecated in PHP7.
|
||
|
*
|
||
|
* @deprecated since Moodle 3.1
|
||
|
*/
|
||
|
public function cssparser($html = true) {
|
||
|
debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
|
||
|
self::__construct($html);
|
||
|
}
|
||
|
|
||
|
function finalize() {
|
||
|
unset($this->css);
|
||
|
}
|
||
|
|
||
|
function Clear() {
|
||
|
unset($this->css);
|
||
|
$this->css = array();
|
||
|
if($this->html) {
|
||
|
$this->Add("ADDRESS", "");
|
||
|
$this->Add("APPLET", "");
|
||
|
$this->Add("AREA", "");
|
||
|
$this->Add("A", "text-decoration : underline; color : Blue;");
|
||
|
$this->Add("A:visited", "color : Purple;");
|
||
|
$this->Add("BASE", "");
|
||
|
$this->Add("BASEFONT", "");
|
||
|
$this->Add("BIG", "");
|
||
|
$this->Add("BLOCKQUOTE", "");
|
||
|
$this->Add("BODY", "");
|
||
|
$this->Add("BR", "");
|
||
|
$this->Add("B", "font-weight: bold;");
|
||
|
$this->Add("CAPTION", "");
|
||
|
$this->Add("CENTER", "");
|
||
|
$this->Add("CITE", "");
|
||
|
$this->Add("CODE", "");
|
||
|
$this->Add("DD", "");
|
||
|
$this->Add("DFN", "");
|
||
|
$this->Add("DIR", "");
|
||
|
$this->Add("DIV", "");
|
||
|
$this->Add("DL", "");
|
||
|
$this->Add("DT", "");
|
||
|
$this->Add("EM", "");
|
||
|
$this->Add("FONT", "");
|
||
|
$this->Add("FORM", "");
|
||
|
$this->Add("H1", "");
|
||
|
$this->Add("H2", "");
|
||
|
$this->Add("H3", "");
|
||
|
$this->Add("H4", "");
|
||
|
$this->Add("H5", "");
|
||
|
$this->Add("H6", "");
|
||
|
$this->Add("HEAD", "");
|
||
|
$this->Add("HR", "");
|
||
|
$this->Add("HTML", "");
|
||
|
$this->Add("IMG", "");
|
||
|
$this->Add("INPUT", "");
|
||
|
$this->Add("ISINDEX", "");
|
||
|
$this->Add("I", "font-style: italic;");
|
||
|
$this->Add("KBD", "");
|
||
|
$this->Add("LINK", "");
|
||
|
$this->Add("LI", "");
|
||
|
$this->Add("MAP", "");
|
||
|
$this->Add("MENU", "");
|
||
|
$this->Add("META", "");
|
||
|
$this->Add("OL", "");
|
||
|
$this->Add("OPTION", "");
|
||
|
$this->Add("PARAM", "");
|
||
|
$this->Add("PRE", "");
|
||
|
$this->Add("P", "");
|
||
|
$this->Add("SAMP", "");
|
||
|
$this->Add("SCRIPT", "");
|
||
|
$this->Add("SELECT", "");
|
||
|
$this->Add("SMALL", "");
|
||
|
$this->Add("STRIKE", "");
|
||
|
$this->Add("STRONG", "");
|
||
|
$this->Add("STYLE", "");
|
||
|
$this->Add("SUB", "");
|
||
|
$this->Add("SUP", "");
|
||
|
$this->Add("TABLE", "");
|
||
|
$this->Add("TD", "");
|
||
|
$this->Add("TEXTAREA", "");
|
||
|
$this->Add("TH", "");
|
||
|
$this->Add("TITLE", "");
|
||
|
$this->Add("TR", "");
|
||
|
$this->Add("TT", "");
|
||
|
$this->Add("UL", "");
|
||
|
$this->Add("U", "text-decoration : underline;");
|
||
|
$this->Add("VAR", "");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function SetHTML($html) {
|
||
|
$this->html = ($html != false);
|
||
|
}
|
||
|
|
||
|
function Add($key, $codestr) {
|
||
|
$key = strtolower($key);
|
||
|
$codestr = strtolower($codestr);
|
||
|
if(!isset($this->css[$key])) {
|
||
|
$this->css[$key] = array();
|
||
|
}
|
||
|
$codes = explode(";",$codestr);
|
||
|
if(count($codes) > 0) {
|
||
|
$codekey=''; $codevalue='';
|
||
|
foreach($codes as $code) {
|
||
|
$code = trim($code);
|
||
|
$this->assignValues(explode(":",$code),$codekey,$codevalue);
|
||
|
if(strlen($codekey) > 0) {
|
||
|
$this->css[$key][trim($codekey)] = trim($codevalue);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private function assignValues($arr,&$val1,&$val2) {
|
||
|
$n = count($arr);
|
||
|
if ($n > 0) {
|
||
|
$val1=$arr[0];
|
||
|
$val2=($n > 1) ? $arr[1] : '';
|
||
|
}
|
||
|
}
|
||
|
function Get($key, $property) {
|
||
|
$key = strtolower($key);
|
||
|
$property = strtolower($property);
|
||
|
$tag='';$subtag='';$class='';$id='';
|
||
|
$this->assignValues(explode(":",$key),$tag,$subtag);
|
||
|
$this->assignValues(explode(".",$tag),$tag,$class);
|
||
|
$this->assignValues(explode("#",$tag),$tag,$id);
|
||
|
$result = "";
|
||
|
$_subtag=''; $_class=''; $_id='';
|
||
|
foreach($this->css as $_tag => $value) {
|
||
|
$this->assignValues(explode(":",$_tag),$_tag,$_subtag);
|
||
|
$this->assignValues(explode(".",$_tag),$_tag,$_class);
|
||
|
$this->assignValues(explode("#",$_tag),$_tag,$_id);
|
||
|
|
||
|
$tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0);
|
||
|
$subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0);
|
||
|
$classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0);
|
||
|
$idmatch = (strcmp($id, $_id) == 0);
|
||
|
|
||
|
if($tagmatch & $subtagmatch & $classmatch & $idmatch) {
|
||
|
$temp = $_tag;
|
||
|
if((strlen($temp) > 0) & (strlen($_class) > 0)) {
|
||
|
$temp .= ".".$_class;
|
||
|
} elseif(strlen($temp) == 0) {
|
||
|
$temp = ".".$_class;
|
||
|
}
|
||
|
if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
|
||
|
$temp .= ":".$_subtag;
|
||
|
} elseif(strlen($temp) == 0) {
|
||
|
$temp = ":".$_subtag;
|
||
|
}
|
||
|
if(isset($this->css[$temp][$property])) {
|
||
|
$result = $this->css[$temp][$property];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
function GetSection($key) {
|
||
|
$key = strtolower($key);
|
||
|
$tag='';$subtag='';$class='';$id='';
|
||
|
$_subtag=''; $_class=''; $_id='';
|
||
|
|
||
|
$this->assignValues(explode(":",$key),$tag,$subtag);
|
||
|
$this->assignValues(explode(".",$tag),$tag,$class);
|
||
|
$this->assignValues(explode("#",$tag),$tag,$id);
|
||
|
$result = array();
|
||
|
foreach($this->css as $_tag => $value) {
|
||
|
$this->assignValues(explode(":",$_tag),$_tag,$_subtag);
|
||
|
$this->assignValues(explode(".",$_tag),$_tag,$_class);
|
||
|
$this->assignValues(explode("#",$_tag),$_tag,$_id);
|
||
|
|
||
|
$tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0);
|
||
|
$subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0);
|
||
|
$classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0);
|
||
|
$idmatch = (strcmp($id, $_id) == 0);
|
||
|
|
||
|
if($tagmatch & $subtagmatch & $classmatch & $idmatch) {
|
||
|
$temp = $_tag;
|
||
|
if((strlen($temp) > 0) & (strlen($_class) > 0)) {
|
||
|
$temp .= ".".$_class;
|
||
|
} elseif(strlen($temp) == 0) {
|
||
|
$temp = ".".$_class;
|
||
|
}
|
||
|
if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
|
||
|
$temp .= ":".$_subtag;
|
||
|
} elseif(strlen($temp) == 0) {
|
||
|
$temp = ":".$_subtag;
|
||
|
}
|
||
|
foreach($this->css[$temp] as $property => $value) {
|
||
|
$result[$property] = $value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
function ParseStr($str) {
|
||
|
$this->Clear();
|
||
|
// Remove comments
|
||
|
$str = preg_replace("/\/\*(.*)?\*\//Usi", "", $str);
|
||
|
// Parse this damn csscode
|
||
|
$parts = explode("}",$str);
|
||
|
if(count($parts) > 0) {
|
||
|
foreach($parts as $part) {
|
||
|
$keystr='';$codestr='';
|
||
|
$this->assignValues(explode("{",$part),$keystr,$codestr);
|
||
|
$keys = explode(",",trim($keystr));
|
||
|
if(count($keys) > 0) {
|
||
|
foreach($keys as $key) {
|
||
|
if(strlen($key) > 0) {
|
||
|
$key = str_replace("\n", "", $key);
|
||
|
$key = str_replace("\\", "", $key);
|
||
|
$this->Add($key, trim($codestr));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//
|
||
|
return (count($this->css) > 0);
|
||
|
}
|
||
|
|
||
|
function Parse($filename) {
|
||
|
$this->Clear();
|
||
|
if(file_exists($filename)) {
|
||
|
return $this->ParseStr(file_get_contents($filename));
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function GetCSS() {
|
||
|
$result = "";
|
||
|
foreach($this->css as $key => $values) {
|
||
|
$result .= $key." {\n";
|
||
|
foreach($values as $key => $value) {
|
||
|
$result .= " $key: $value;\n";
|
||
|
}
|
||
|
$result .= "}\n\n";
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
}
|