PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/www/libs/components/WebLoader/CssLoader.php

https://github.com/bazo/Mokuji
PHP | 124 lines | 72 code | 14 blank | 38 comment | 6 complexity | cad18fd904ab12638700ed52a2b6ec61 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
  1. <?php
  2. /**
  3. * Css loader
  4. *
  5. * @author Jan Marek
  6. * @license MIT
  7. */
  8. class CssLoader extends WebLoader
  9. {
  10. /** @var string */
  11. public $media;
  12. /** @var bool */
  13. public $absolutizeUrls = true;
  14. /**
  15. * Make relative url absolute
  16. * @param string $url
  17. * @param string $quote
  18. * @param string $file
  19. * @param string $sourceUri
  20. * @return string
  21. */
  22. public static function absolutizeUrl($url, $quote, $file, $sourceUri) {
  23. // is already absolute
  24. //($url, $quote, $file, $sourceUri);
  25. if (@ereg("^([a-z]+:/)?/", $url)) return $url;
  26. $lastPos = strrpos($file, "/");
  27. $fileFolder = $lastPos === false ? "" : "/" . substr($file, 0, $lastPos);
  28. //$path = $sourceUri . $fileFolder . "/" . $url;
  29. $path = $sourceUri . "/" . $url;
  30. $pathPieces = explode("/", $path);
  31. $piecesOut = array();
  32. //var_dump($pathPieces);exit;
  33. foreach ($pathPieces as $piece) {
  34. if ($piece === ".") continue;
  35. if ($piece === "..") {
  36. array_pop($piecesOut);
  37. continue;
  38. }
  39. $piecesOut[] = $piece;
  40. }
  41. $out = implode("/", $piecesOut);
  42. if ($quote === '"') $out = addslashes($out);
  43. return $out;
  44. }
  45. private function absolutizeUrls($s, $file) {
  46. // thanks to kravco
  47. //var_dump($file);exit;
  48. $regexp = '~
  49. (?<![a-z])
  50. url\( ## url(
  51. \s* ## optional whitespace
  52. ([\'"])? ## optional single/double quote
  53. ( (?: (?:\\\\.)+ ## escape sequences
  54. | [^\'"\\\\,()\s]+ ## safe characters
  55. | (?(1) (?!\1)[\'"\\\\,() \t] ## allowed special characters
  56. | ^ ## (none, if not quoted)
  57. )
  58. )* ## (greedy match)
  59. )
  60. (?(1)\1) ## optional single/double quote
  61. \s* ## optional whitespace
  62. \) ## )
  63. ~xs';
  64. return preg_replace_callback(
  65. $regexp,
  66. create_function(
  67. '$matches',
  68. 'return "url(\'" . CssLoader::absolutizeUrl($matches[2], $matches[1], "' .
  69. addslashes($file) . '", "' . addslashes($this->sourceUri) .
  70. '") . "\')";'
  71. ),
  72. $s
  73. );
  74. }
  75. /**
  76. * Load file
  77. * @param string $path
  78. * @return string
  79. */
  80. protected function loadFile($file) {
  81. $content = parent::loadFile($file);
  82. //var_dump($this->absolutizeUrls, !empty($this->sourceUri));exit;
  83. if ($this->absolutizeUrls && !empty($this->sourceUri)) {
  84. $content = $this->absolutizeUrls($content, $file);
  85. }
  86. return $content;
  87. }
  88. /**
  89. * Filename of generated CSS file
  90. * @param array $files
  91. * @return string
  92. */
  93. public function getGeneratedFilename(array $files = null)
  94. {
  95. return parent::getGeneratedFilename($files) . ".css";
  96. }
  97. /**
  98. * Get link element
  99. * @param string $source
  100. * @return Html
  101. */
  102. public function getElement($source)
  103. {
  104. return Html::el("link")
  105. ->rel("stylesheet")
  106. ->type("text/css")
  107. ->media($this->media)
  108. ->href($source);
  109. }
  110. }