[ Index ] |
PHP Cross Reference of Textpattern 4.0.8 |
[Summary view] [Print] [Text view]
1 <?php 2 3 /* 4 $HeadURL: https://textpattern.googlecode.com/svn/releases/4.0.8/source/textpattern/include/txp_css.php $ 5 $LastChangedRevision: 3081 $ 6 */ 7 8 if (!defined('txpinterface')) die('txpinterface is undefined.'); 9 10 if ($event == 'css') { 11 require_privs('css'); 12 13 switch ($step) { 14 case '': css_edit(); break; 15 case 'css_edit_raw': css_edit(); break; 16 case 'css_edit_form': css_edit(); break; 17 case 'pour': css_edit(); break; 18 case 'css_save': css_save(); break; 19 case 'css_copy': css_copy(); break; 20 case 'css_save_as': css_save_as(); break; 21 case 'css_save_posted': css_save_posted(); break; 22 case 'css_delete': css_delete(); break; 23 case 'css_edit': css_edit(); break; 24 case 'del_dec': css_edit(); break; 25 case 'add_dec': css_edit(); break; 26 case 'add_sel': css_edit(); 27 } 28 } 29 30 //------------------------------------------------------------- 31 32 function css_list($current, $default) { 33 $out[] = startTable('list', 'left'); 34 35 $rs = safe_rows_start('name', 'txp_css', "1=1"); 36 37 if ($rs) { 38 while ($a = nextRow($rs)) { 39 extract($a); 40 41 $edit = ($current != $name) ? eLink('css', '', 'name', $name, $name) : htmlspecialchars($name); 42 $delete = ($name != $default) ? dLink('css', 'css_delete', 'name', $name) : ''; 43 44 $out[] = tr(td($edit).td($delete)); 45 } 46 47 $out[] = endTable(); 48 49 return join('', $out); 50 } 51 } 52 53 //------------------------------------------------------------- 54 function css_edit($message='') 55 { 56 pagetop(gTxt("edit_css"),$message); 57 global $step,$prefs; 58 if (!$step or $step == 'css_save'){ 59 60 if ($prefs['edit_raw_css_by_default']) { 61 css_edit_raw(); 62 } else { 63 css_edit_form(); 64 } 65 66 } else { 67 68 if ($step=='css_edit_raw' or $step=='pour' or ($step=='css_delete' && $prefs['edit_raw_css_by_default'])) { 69 css_edit_raw(); 70 } else { 71 css_edit_form(); 72 } 73 } 74 } 75 76 // ------------------------------------------------------------- 77 78 function css_edit_form() { 79 global $step; 80 81 $name = gps('name'); 82 83 $default_name = safe_field('css', 'txp_section', "name = 'default'"); 84 85 $name = (!$name or $step == 'css_delete') ? $default_name : $name; 86 87 if (gps('copy') && trim(preg_replace('/[<>&"\']/', '', gps('newname'))) ) 88 $name = gps('newname'); 89 $css = base64_decode(fetch("css",'txp_css','name',$name)); 90 $css = parseCSS($css); 91 92 $css = ($step == 'add_dec') ? add_declaration($css) : $css; 93 $css = ($step == 'del_dec') ? delete_declaration($css) : $css; 94 $css = ($step == 'add_sel') ? addSel($css) : $css; 95 96 $right = 97 hed(gTxt('all_stylesheets'),2). 98 css_list($name, $default_name); 99 100 $left = graf(gTxt('you_are_editing_css').br.strong(htmlspecialchars($name))). 101 graf(eLink('css', 'css_edit_raw', 'name', $name, gTxt('edit_raw_css'))). 102 graf(sLink('css', 'pour', gTxt('bulkload_existing_css'))); 103 104 $out[] = startTable('css-edit', '', '', 3); 105 106 $out[] = 107 tr( 108 td(strong(gTxt('css_selector'))). 109 td(strong(gTxt('css_property_value'))) 110 ); 111 112 $i = -1; 113 foreach($css as $selector=>$propvals) { 114 $out[] = n.'<tr>'.n. 115 td(fInput('text',++$i,$selector,'css') 116 .' '.aLink('css','add_dec','selector',$selector,'name',$name) 117 ,'', 'selector','s'.$i); 118 if(is_array($propvals)) 119 { 120 $out[] = n.t.'<td class="selector2">'; 121 $ii = -1; 122 foreach($propvals as $property=>$value) 123 { 124 $out[] = fInput('text',$i.'-'.++$ii.'p',$property,'css'). ' ' 125 .fInput('text',$i.'-'.$ii.'v',ltrim($value),'css').' ' 126 .dLink('css','del_dec','declaration',$i.'-'.$ii,'','name',$name,1).br; 127 } 128 $out[] = '</td>'.n.'</tr>'; 129 } 130 } 131 132 $out[] = tr(tdcs(fInput('submit','',gTxt('save'),'publish'),2)). 133 endTable().eInput('css').sInput('css_save_posted').hInput('name',$name); 134 135 echo 136 startTable('edit'). 137 tr( 138 tdtl( 139 $left 140 ). 141 td( 142 form( 143 graf( 144 gTxt('add_new_selector').': '.sp. 145 fInput('text','selector','','css').sp. 146 fInput('submit','add_sel',gTxt('submit'),'smallerbox'). 147 eInput('css') . sInput('add_sel') . hInput('name',$name) 148 ) 149 ). 150 form(join('',$out)). 151 152 form( 153 graf( 154 gTxt('copy_css_as').sp.fInput('text', 'newname', '', 'edit').sp. 155 fInput('submit', 'copy', gTxt('copy'), 'smallerbox'). 156 eInput('css'). 157 sInput('css_copy'). 158 hInput('oldname', $name). 159 hInput('name', $name) 160 ) 161 ) 162 ). 163 tdtl( 164 $right 165 ) 166 ). 167 endTable(); 168 169 } 170 171 //------------------------------------------------------------- 172 173 function css_edit_raw() { 174 global $step; 175 176 $name = gps('name'); 177 178 $default_name = safe_field('css', 'txp_section', "name = 'default'"); 179 180 $name = (!$name or $step == 'css_delete') ? $default_name : $name; 181 182 if (gps('copy') && trim(preg_replace('/[<>&"\']/', '', gps('newname'))) ) 183 $name = gps('newname'); 184 185 if ($step=='pour') 186 { 187 $buttons = 188 gTxt('name_for_this_style').': ' 189 .fInput('text','newname','','edit','','',20). 190 hInput('savenew','savenew'); 191 $thecss = ''; 192 193 } else { 194 $buttons = ''; 195 $thecss = base64_decode(fetch("css",'txp_css','name',$name)); 196 } 197 198 if ($step!='pour') { 199 200 $left = graf(gTxt('you_are_editing_css').br.strong(htmlspecialchars($name))). 201 graf(eLink('css', 'css_edit_form', 'name', $name, gTxt('edit_css_in_form'))). 202 graf(sLink('css', 'pour', gTxt('bulkload_existing_css'))); 203 204 $copy = gTxt('copy_css_as').sp.fInput('text', 'newname', '', 'edit').sp. 205 fInput('submit', 'copy', gTxt('copy'), 'smallerbox'); 206 } else { 207 $left = ' '; 208 $copy = ''; 209 } 210 211 $right = 212 hed(gTxt('all_stylesheets'),2). 213 css_list($name, $default_name); 214 215 echo 216 startTable('edit'). 217 tr( 218 tdtl( 219 $left 220 ). 221 td( 222 form( 223 graf($buttons). 224 '<textarea id="css" class="code" name="css" cols="78" rows="32">'.htmlspecialchars($thecss).'</textarea>'.br. 225 fInput('submit','',gTxt('save'),'publish'). 226 eInput('css').sInput('css_save'). 227 hInput('name',$name) 228 .$copy 229 ) 230 ). 231 tdtl( 232 $right 233 ) 234 ). 235 endTable(). 236 n.'<script type="text/javascript">'. 237 n.'if(jQuery.browser.mozilla){$("#css").attr("spellcheck", false);}'. 238 n.'</script>'; 239 } 240 241 // ------------------------------------------------------------- 242 function parseCSS($css) // parse raw css into a multidimensional array 243 { 244 $css = preg_replace("/\/\*.+\*\//Usi","",$css); // remove comments 245 $selectors = preg_replace('/\s+/',' ',explode("}",strip_rn($css))); 246 foreach($selectors as $selector) { 247 if(trim($selector)) { 248 list($keystr,$codestr) = explode("{",$selector); 249 if (trim($keystr)) { 250 $codes = explode(";",trim($codestr)); 251 foreach ($codes as $code) { 252 if (trim($code)) { 253 list($property,$value) = explode(":",$code,2); 254 $out[trim($keystr)][trim($property)] = trim($value); 255 } 256 } 257 } 258 } 259 } 260 return (isset($out)) ? $out : array(); 261 } 262 263 // ------------------------------------------------------------- 264 function parsePostedCSS() //turn css info delivered by editor form into an array 265 { 266 $post = (MAGIC_QUOTES_GPC) ? doStrip($_POST) : $_POST; 267 foreach($post as $a=>$b){ 268 if (preg_match("/^\d+$/",$a)) { 269 $selector = $b; 270 } 271 if (preg_match("/^\d+-\d+(?:p|v)$/",$a)) { 272 if(strstr($a,'p')) { 273 $property = $b; 274 } else { 275 if(trim($property) && trim($selector)) { 276 $out[$selector][$property] = $b; 277 } 278 } 279 } 280 } 281 return (isset($out)) ? $out : array(); 282 } 283 284 // ------------------------------------------------------------- 285 286 function css_copy() 287 { 288 extract(gpsa(array('oldname', 'newname'))); 289 290 $css = doSlash(fetch('css', 'txp_css', 'name', $oldname)); 291 292 $rs = safe_insert('txp_css', "css = '$css', name = '".doSlash($newname)."'"); 293 294 css_edit( 295 gTxt('css_created', array('{name}' => $newname)) 296 ); 297 } 298 299 // ------------------------------------------------------------- 300 301 function css_save_posted() 302 { 303 $name = gps('name'); 304 $css = parsePostedCSS(); 305 $css = doSlash(base64_encode(css_format($css))); 306 307 safe_update('txp_css', "css = '$css'", "name = '".doSlash($name)."'"); 308 309 // update site last mod time 310 update_lastmod(); 311 312 $message = gTxt('css_updated', array('{name}' => $name)); 313 314 css_edit($message); 315 } 316 317 //------------------------------------------------------------- 318 319 function css_save() 320 { 321 extract(gpsa(array('name','css','savenew','newname','copy'))); 322 $css = doSlash(base64_encode($css)); 323 324 if ($savenew or $copy) 325 { 326 $newname = doSlash(trim(preg_replace('/[<>&"\']/', '', gps('newname')))); 327 328 if ($newname and safe_field('name', 'txp_css', "name = '$newname'")) 329 { 330 $message = gTxt('css_already_exists', array('{name}' => $newname)); 331 } 332 333 elseif ($newname) 334 { 335 safe_insert('txp_css', "name = '".$newname."', css = '$css'"); 336 337 // update site last mod time 338 update_lastmod(); 339 340 $message = gTxt('css_created', array('{name}' => $newname)); 341 } 342 343 else 344 { 345 $message = gTxt('css_name_required'); 346 } 347 348 css_edit($message); 349 } 350 351 else 352 { 353 safe_update('txp_css', "css = '$css'", "name = '".doSlash($name)."'"); 354 355 // update site last mod time 356 update_lastmod(); 357 358 $message = gTxt('css_updated', array('{name}' => $name)); 359 360 css_edit($message); 361 } 362 } 363 364 // ------------------------------------------------------------- 365 function css_format($css,$out='') 366 { 367 foreach ($css as $selector => $propvals) { 368 $out .= n.$selector.n.'{'.n; 369 foreach($propvals as $prop=>$val) { 370 $out .= t.$prop.': '.$val.';'.n; 371 } 372 $out .= '}'.n; 373 } 374 return trim($out); 375 } 376 377 // ------------------------------------------------------------- 378 function addSel($css) 379 { 380 $selector = gps('selector'); 381 $css[$selector][' '] = ''; 382 return $css; 383 } 384 385 // ------------------------------------------------------------- 386 function add_declaration($css) 387 { 388 $selector = gps('selector'); 389 $css[$selector][' '] = ''; 390 return $css; 391 } 392 393 // ------------------------------------------------------------- 394 function delete_declaration($css) 395 { 396 $thedec = gps('declaration'); 397 $name = gps('name'); 398 $i = 0; 399 foreach($css as $a=>$b) { 400 $cursel = $i++; 401 $ii = 0; 402 foreach($b as $c=>$d) { 403 $curdec = $ii++; 404 if(($cursel.'-'.$curdec)!=$thedec) { 405 $out[$a][$c]=$d; 406 } 407 } 408 } 409 $css = base64_encode(css_format($out)); 410 safe_update("txp_css", "css='".doSlash($css)."'", "name='".doSlash($name)."'"); 411 412 // update site last mod time 413 update_lastmod(); 414 415 return parseCSS(base64_decode(fetch('css','txp_css','name',$name))); 416 } 417 418 //------------------------------------------------------------- 419 420 function css_delete() 421 { 422 $name = ps('name'); 423 $count = safe_count('txp_section', "css = '".doSlash($name)."'"); 424 425 if ($count) 426 { 427 $message = gTxt('css_used_by_section', array('{name}' => $name, '{count}' => $count)); 428 } 429 430 else 431 { 432 safe_delete('txp_css', "name = '".doSlash($name)."'"); 433 434 $message = gTxt('css_deleted', array('{name}' => $name)); 435 } 436 437 css_edit($message); 438 } 439 440 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu May 21 23:03:01 2009 | Cross-referenced by PHPXref 0.7 |