cache_styles.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: cache_styles.php 36353 2017-01-17 07:19:28Z nemohou $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. function build_cache_styles() {
  12. global $_G;
  13. $stylevars = $styledata = array();
  14. $defaultstyleid = $_G['setting']['styleid'];
  15. foreach(C::t('common_stylevar')->range() as $var) {
  16. $stylevars[$var['styleid']][$var['variable']] = $var['substitute'];
  17. }
  18. foreach(C::t('common_style')->fetch_all_data(true) as $data) {
  19. $data['tpldir'] = $data['directory'];
  20. $data = array_merge($data, (array)$stylevars[$data['styleid']]);
  21. $datanew = array();
  22. $data['imgdir'] = $data['imgdir'] ? $data['imgdir'] : STATICURL.'image/common';
  23. $data['styleimgdir'] = $data['styleimgdir'] ? $data['styleimgdir'] : $data['imgdir'];
  24. foreach($data as $k => $v) {
  25. if(substr($k, -7, 7) == 'bgcolor') {
  26. $newkey = substr($k, 0, -7).'bgcode';
  27. $datanew[$newkey] = setcssbackground($data, $k);
  28. }
  29. }
  30. $data = array_merge($data, $datanew);
  31. if(strstr($data['boardimg'], ',')) {
  32. $flash = explode(",", $data['boardimg']);
  33. $flash[0] = trim($flash[0]);
  34. $flash[0] = preg_match('/^(https?:)?\/\//i', $flash[0]) ? $flash[0] : $data['styleimgdir'].'/'.$flash[0];
  35. $data['boardlogo'] = "<embed src=\"".$flash[0]."\" width=\"".trim($flash[1])."\" height=\"".trim($flash[2])."\" type=\"application/x-shockwave-flash\" wmode=\"transparent\"></embed>";
  36. } else {
  37. $data['boardimg'] = preg_match('/^(https?:)?\/\//i', $data['boardimg']) ? $data['boardimg'] : $data['styleimgdir'].'/'.$data['boardimg'];
  38. $data['boardlogo'] = "<img src=\"$data[boardimg]\" alt=\"".$_G['setting']['bbname']."\" border=\"0\" />";
  39. }
  40. $data['bold'] = $data['nobold'] ? 'normal' : 'bold';
  41. $contentwidthint = intval($data['contentwidth']);
  42. $contentwidthint = $contentwidthint ? $contentwidthint : 600;
  43. if($data['extstyle']) {
  44. list($data['extstyle'], $data['defaultextstyle']) = explode('|', $data['extstyle']);
  45. $extstyle = explode("\t", $data['extstyle']);
  46. $data['extstyle'] = array();
  47. foreach($extstyle as $dir) {
  48. if(file_exists($extstylefile = DISCUZ_ROOT.$data['tpldir'].'/style/'.$dir.'/style.css')) {
  49. if($data['defaultextstyle'] == $dir) {
  50. $data['defaultextstyle'] = $data['tpldir'].'/style/'.$dir;
  51. }
  52. $content = file_get_contents($extstylefile);
  53. if(preg_match('/\[name\](.+?)\[\/name\]/i', $content, $r1) && preg_match('/\[iconbgcolor](.+?)\[\/iconbgcolor]/i', $content, $r2)) {
  54. $data['extstyle'][] = array($data['tpldir'].'/style/'.$dir, $r1[1], $r2[1]);
  55. }
  56. }
  57. }
  58. }
  59. $data['verhash'] = random(3);
  60. $styledata[] = $data;
  61. }
  62. foreach($styledata as $data) {
  63. savecache('style_'.$data['styleid'], $data);
  64. if($defaultstyleid == $data['styleid']) {
  65. savecache('style_default', $data);
  66. }
  67. writetocsscache($data);
  68. }
  69. }
  70. function setcssbackground(&$data, $code) {
  71. $codes = explode(' ', $data[$code]);
  72. $css = $codevalue = '';
  73. for($i = 0; $i < count($codes); $i++) {
  74. if($i < 2) {
  75. if($codes[$i] != '') {
  76. if($codes[$i]{0} == '#') {
  77. $css .= strtoupper($codes[$i]).' ';
  78. $codevalue = strtoupper($codes[$i]);
  79. } elseif(preg_match('/^(https?:)?\/\//i', $codes[$i])) {
  80. $css .= 'url("'.$codes[$i].'") ';
  81. } else {
  82. $css .= 'url("'.$data['styleimgdir'].'/'.$codes[$i].'") ';
  83. }
  84. }
  85. } else {
  86. $css .= $codes[$i].' ';
  87. }
  88. }
  89. $data[$code] = $codevalue;
  90. $css = trim($css);
  91. return $css ? 'background: '.$css : '';
  92. }
  93. function writetocsscache($data) {
  94. global $_G;
  95. $dir = DISCUZ_ROOT.'./template/default/common/';
  96. $dh = opendir($dir);
  97. $data['staticurl'] = STATICURL;
  98. while(($entry = readdir($dh)) !== false) {
  99. if(fileext($entry) == 'css') {
  100. $cssfile = DISCUZ_ROOT.'./'.$data['tpldir'].'/common/'.$entry;
  101. !file_exists($cssfile) && $cssfile = $dir.$entry;
  102. $cssdata = @implode('', file($cssfile));
  103. if(file_exists($cssfile = DISCUZ_ROOT.'./'.$data['tpldir'].'/common/extend_'.$entry)) {
  104. $cssdata .= @implode('', file($cssfile));
  105. }
  106. if(is_array($_G['setting']['plugins']['available']) && $_G['setting']['plugins']['available']) {
  107. foreach($_G['setting']['plugins']['available'] as $plugin) {
  108. if(file_exists($cssfile = DISCUZ_ROOT.'./source/plugin/'.$plugin.'/template/extend_'.$entry)) {
  109. $cssdata .= @implode('', file($cssfile));
  110. }
  111. }
  112. }
  113. writetocsscache_callback_1($data, 1);
  114. $cssdata = preg_replace_callback("/\{([A-Z0-9]+)\}/", 'writetocsscache_callback_1', $cssdata);
  115. $cssdata = preg_replace("/<\?.+?\?>\s*/", '', $cssdata);
  116. $cssdata = !preg_match('/^(https?:)?\/\//i', $data['styleimgdir']) ? preg_replace("/url\(([\"'])?".preg_quote($data['styleimgdir'], '/')."/i", "url(\\1$_G[siteurl]$data[styleimgdir]", $cssdata) : $cssdata;
  117. $cssdata = !preg_match('/^(https?:)?\/\//i', $data['imgdir']) ? preg_replace("/url\(([\"'])?".preg_quote($data['imgdir'], '/')."/i", "url(\\1$_G[siteurl]$data[imgdir]", $cssdata) : $cssdata;
  118. $cssdata = !preg_match('/^(https?:)?\/\//i', $data['staticurl']) ? preg_replace("/url\(([\"'])?".preg_quote($data['staticurl'], '/')."/i", "url(\\1$_G[siteurl]$data[staticurl]", $cssdata) : $cssdata;
  119. if($entry == 'module.css') {
  120. $cssdata = preg_replace('/\/\*\*\s*(.+?)\s*\*\*\//', '[\\1]', $cssdata);
  121. }
  122. $cssdata = preg_replace(array('/\s*([,;:\{\}])\s*/', '/[\t\n\r]/', '/\/\*.+?\*\//'), array('\\1', '',''), $cssdata);
  123. if(@$fp = fopen(DISCUZ_ROOT.'./data/cache/style_'.$data['styleid'].'_'.$entry, 'w')) {
  124. fwrite($fp, $cssdata);
  125. fclose($fp);
  126. } else {
  127. exit('Can not write to cache files, please check directory ./data/ and ./data/cache/ .');
  128. }
  129. }
  130. }
  131. }
  132. function writetocsscache_callback_1($matches, $action = 0) {
  133. static $data = null;
  134. if($action == 1) {
  135. $data = $matches;
  136. } else {
  137. return $data[strtolower($matches[1])];
  138. }
  139. }
  140. ?>