See Release Notes
Long Term Support Release
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 class cssparser { 18 private $css; 19 private $html; 20 21 public function __construct($html = true) { 22 // Register "destructor" 23 core_shutdown_manager::register_function(array(&$this, "finalize")); 24 $this->html = ($html != false); 25 $this->Clear(); 26 } 27 28 /** 29 * Old syntax of class constructor. Deprecated in PHP7. 30 * 31 * @deprecated since Moodle 3.1 32 */ 33 public function cssparser($html = true) { 34 debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); 35 self::__construct($html); 36 } 37 38 function finalize() { 39 unset($this->css); 40 } 41 42 function Clear() { 43 unset($this->css); 44 $this->css = array(); 45 if($this->html) { 46 $this->Add("ADDRESS", ""); 47 $this->Add("APPLET", ""); 48 $this->Add("AREA", ""); 49 $this->Add("A", "text-decoration : underline; color : Blue;"); 50 $this->Add("A:visited", "color : Purple;"); 51 $this->Add("BASE", ""); 52 $this->Add("BASEFONT", ""); 53 $this->Add("BIG", ""); 54 $this->Add("BLOCKQUOTE", ""); 55 $this->Add("BODY", ""); 56 $this->Add("BR", ""); 57 $this->Add("B", "font-weight: bold;"); 58 $this->Add("CAPTION", ""); 59 $this->Add("CENTER", ""); 60 $this->Add("CITE", ""); 61 $this->Add("CODE", ""); 62 $this->Add("DD", ""); 63 $this->Add("DFN", ""); 64 $this->Add("DIR", ""); 65 $this->Add("DIV", ""); 66 $this->Add("DL", ""); 67 $this->Add("DT", ""); 68 $this->Add("EM", ""); 69 $this->Add("FONT", ""); 70 $this->Add("FORM", ""); 71 $this->Add("H1", ""); 72 $this->Add("H2", ""); 73 $this->Add("H3", ""); 74 $this->Add("H4", ""); 75 $this->Add("H5", ""); 76 $this->Add("H6", ""); 77 $this->Add("HEAD", ""); 78 $this->Add("HR", ""); 79 $this->Add("HTML", ""); 80 $this->Add("IMG", ""); 81 $this->Add("INPUT", ""); 82 $this->Add("ISINDEX", ""); 83 $this->Add("I", "font-style: italic;"); 84 $this->Add("KBD", ""); 85 $this->Add("LINK", ""); 86 $this->Add("LI", ""); 87 $this->Add("MAP", ""); 88 $this->Add("MENU", ""); 89 $this->Add("META", ""); 90 $this->Add("OL", ""); 91 $this->Add("OPTION", ""); 92 $this->Add("PARAM", ""); 93 $this->Add("PRE", ""); 94 $this->Add("P", ""); 95 $this->Add("SAMP", ""); 96 $this->Add("SCRIPT", ""); 97 $this->Add("SELECT", ""); 98 $this->Add("SMALL", ""); 99 $this->Add("STRIKE", ""); 100 $this->Add("STRONG", ""); 101 $this->Add("STYLE", ""); 102 $this->Add("SUB", ""); 103 $this->Add("SUP", ""); 104 $this->Add("TABLE", ""); 105 $this->Add("TD", ""); 106 $this->Add("TEXTAREA", ""); 107 $this->Add("TH", ""); 108 $this->Add("TITLE", ""); 109 $this->Add("TR", ""); 110 $this->Add("TT", ""); 111 $this->Add("UL", ""); 112 $this->Add("U", "text-decoration : underline;"); 113 $this->Add("VAR", ""); 114 } 115 } 116 117 function SetHTML($html) { 118 $this->html = ($html != false); 119 } 120 121 function Add($key, $codestr) { 122 $key = strtolower($key); 123 $codestr = strtolower($codestr); 124 if(!isset($this->css[$key])) { 125 $this->css[$key] = array(); 126 } 127 $codes = explode(";",$codestr); 128 if(count($codes) > 0) { 129 $codekey=''; $codevalue=''; 130 foreach($codes as $code) { 131 $code = trim($code); 132 $this->assignValues(explode(":",$code),$codekey,$codevalue); 133 if(strlen($codekey) > 0) { 134 $this->css[$key][trim($codekey)] = trim($codevalue); 135 } 136 } 137 } 138 } 139 140 private function assignValues($arr,&$val1,&$val2) { 141 $n = count($arr); 142 if ($n > 0) { 143 $val1=$arr[0]; 144 $val2=($n > 1) ? $arr[1] : ''; 145 } 146 } 147 function Get($key, $property) { 148 $key = strtolower($key); 149 $property = strtolower($property); 150 $tag='';$subtag='';$class='';$id=''; 151 $this->assignValues(explode(":",$key),$tag,$subtag); 152 $this->assignValues(explode(".",$tag),$tag,$class); 153 $this->assignValues(explode("#",$tag),$tag,$id); 154 $result = ""; 155 $_subtag=''; $_class=''; $_id=''; 156 foreach($this->css as $_tag => $value) { 157 $this->assignValues(explode(":",$_tag),$_tag,$_subtag); 158 $this->assignValues(explode(".",$_tag),$_tag,$_class); 159 $this->assignValues(explode("#",$_tag),$_tag,$_id); 160 161 $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0); 162 $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0); 163 $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0); 164 $idmatch = (strcmp($id, $_id) == 0); 165 166 if($tagmatch & $subtagmatch & $classmatch & $idmatch) { 167 $temp = $_tag; 168 if((strlen($temp) > 0) & (strlen($_class) > 0)) { 169 $temp .= ".".$_class; 170 } elseif(strlen($temp) == 0) { 171 $temp = ".".$_class; 172 } 173 if((strlen($temp) > 0) & (strlen($_subtag) > 0)) { 174 $temp .= ":".$_subtag; 175 } elseif(strlen($temp) == 0) { 176 $temp = ":".$_subtag; 177 } 178 if(isset($this->css[$temp][$property])) { 179 $result = $this->css[$temp][$property]; 180 } 181 } 182 } 183 return $result; 184 } 185 186 function GetSection($key) { 187 $key = strtolower($key); 188 $tag='';$subtag='';$class='';$id=''; 189 $_subtag=''; $_class=''; $_id=''; 190 191 $this->assignValues(explode(":",$key),$tag,$subtag); 192 $this->assignValues(explode(".",$tag),$tag,$class); 193 $this->assignValues(explode("#",$tag),$tag,$id); 194 $result = array(); 195 foreach($this->css as $_tag => $value) { 196 $this->assignValues(explode(":",$_tag),$_tag,$_subtag); 197 $this->assignValues(explode(".",$_tag),$_tag,$_class); 198 $this->assignValues(explode("#",$_tag),$_tag,$_id); 199 200 $tagmatch = (strcmp($tag, $_tag) == 0) | (strlen($_tag) == 0); 201 $subtagmatch = (strcmp($subtag, $_subtag) == 0) | (strlen($_subtag) == 0); 202 $classmatch = (strcmp($class, $_class) == 0) | (strlen($_class) == 0); 203 $idmatch = (strcmp($id, $_id) == 0); 204 205 if($tagmatch & $subtagmatch & $classmatch & $idmatch) { 206 $temp = $_tag; 207 if((strlen($temp) > 0) & (strlen($_class) > 0)) { 208 $temp .= ".".$_class; 209 } elseif(strlen($temp) == 0) { 210 $temp = ".".$_class; 211 } 212 if((strlen($temp) > 0) & (strlen($_subtag) > 0)) { 213 $temp .= ":".$_subtag; 214 } elseif(strlen($temp) == 0) { 215 $temp = ":".$_subtag; 216 } 217 foreach($this->css[$temp] as $property => $value) { 218 $result[$property] = $value; 219 } 220 } 221 } 222 return $result; 223 } 224 225 function ParseStr($str) { 226 $this->Clear(); 227 // Remove comments 228 $str = preg_replace("/\/\*(.*)?\*\//Usi", "", $str); 229 // Parse this damn csscode 230 $parts = explode("}",$str); 231 if(count($parts) > 0) { 232 foreach($parts as $part) { 233 $keystr='';$codestr=''; 234 $this->assignValues(explode("{",$part),$keystr,$codestr); 235 $keys = explode(",",trim($keystr)); 236 if(count($keys) > 0) { 237 foreach($keys as $key) { 238 if(strlen($key) > 0) { 239 $key = str_replace("\n", "", $key); 240 $key = str_replace("\\", "", $key); 241 $this->Add($key, trim($codestr)); 242 } 243 } 244 } 245 } 246 } 247 // 248 return (count($this->css) > 0); 249 } 250 251 function Parse($filename) { 252 $this->Clear(); 253 if(file_exists($filename)) { 254 return $this->ParseStr(file_get_contents($filename)); 255 } else { 256 return false; 257 } 258 } 259 260 function GetCSS() { 261 $result = ""; 262 foreach($this->css as $key => $values) { 263 $result .= $key." {\n"; 264 foreach($values as $key => $value) { 265 $result .= " $key: $value;\n"; 266 } 267 $result .= "}\n\n"; 268 } 269 return $result; 270 } 271 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body