Merge branch 'MDL-56498-master' of git://github.com/mickhawkins/moodle
[moodle.git] / backup / cc / cc_lib / gral_lib / cssparser.php
blobfc2e3049947a78362dfdf284a151686b4873df51
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.
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/>.
17 class cssparser {
18 private $css;
19 private $html;
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();
28 /**
29 * Old syntax of class constructor. Deprecated in PHP7.
31 * @deprecated since Moodle 3.1
33 public function cssparser($html = true) {
34 debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
35 self::__construct($html);
38 function finalize() {
39 unset($this->css);
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", "");
117 function SetHTML($html) {
118 $this->html = ($html != false);
121 function Add($key, $codestr) {
122 $key = strtolower($key);
123 $codestr = strtolower($codestr);
124 if(!isset($this->css[$key])) {
125 $this->css[$key] = array();
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);
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] : '';
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);
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);
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;
173 if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
174 $temp .= ":".$_subtag;
175 } elseif(strlen($temp) == 0) {
176 $temp = ":".$_subtag;
178 if(isset($this->css[$temp][$property])) {
179 $result = $this->css[$temp][$property];
183 return $result;
186 function GetSection($key) {
187 $key = strtolower($key);
188 $tag='';$subtag='';$class='';$id='';
189 $_subtag=''; $_class=''; $_id='';
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);
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);
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;
212 if((strlen($temp) > 0) & (strlen($_subtag) > 0)) {
213 $temp .= ":".$_subtag;
214 } elseif(strlen($temp) == 0) {
215 $temp = ":".$_subtag;
217 foreach($this->css[$temp] as $property => $value) {
218 $result[$property] = $value;
222 return $result;
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));
248 return (count($this->css) > 0);
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;
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";
267 $result .= "}\n\n";
269 return $result;