public function testStringReplaceMultipleInOneLine() { $map = new Kwf_SourceMaps_SourceMap(Kwf_SourceMaps_TestData::$testMap, Kwf_SourceMaps_TestData::$testGeneratedCode); $map->stringReplace('a', 'xbbbbxxxxxxxx'); //0 1 2 3 4 //1234567890123456789012345678901234567890123 // ONE.foo=function(a){return baz(a);}; $s = " ONE.foo=function(xbbbbxxxxxxxx){return bxbbbbxxxxxxxxz(xbbbbxxxxxxxx);};\n" . " TWO.inc=function(xbbbbxxxxxxxx){return xbbbbxxxxxxxx+1;};"; $this->assertEquals($map->getFileContents(), $s); $mappings = $map->getMappings(); $this->assertEquals($mappings[3], array('generatedLine' => 1, 'generatedColumn' => 18, 'originalSource' => '/the/root/one.js', 'originalLine' => 1, 'originalColumn' => 21, 'originalName' => 'bar')); $this->assertEquals($mappings[4], array('generatedLine' => 1, 'generatedColumn' => 21 + 12, 'originalSource' => '/the/root/one.js', 'originalLine' => 2, 'originalColumn' => 3, 'originalName' => null)); $this->assertEquals($mappings[5], array('generatedLine' => 1, 'generatedColumn' => 28 + 12, 'originalSource' => '/the/root/one.js', 'originalLine' => 2, 'originalColumn' => 10, 'originalName' => 'baz')); $this->assertEquals($mappings[6], array('generatedLine' => 1, 'generatedColumn' => 32 + 12 + 12, 'originalSource' => '/the/root/one.js', 'originalLine' => 2, 'originalColumn' => 14, 'originalName' => 'bar')); $this->assertEquals($mappings[10], array('generatedLine' => 2, 'generatedColumn' => 18, 'originalSource' => '/the/root/two.js', 'originalLine' => 1, 'originalColumn' => 21, 'originalName' => 'n')); $this->assertEquals($mappings[11], array('generatedLine' => 2, 'generatedColumn' => 21 + 12, 'originalSource' => '/the/root/two.js', 'originalLine' => 2, 'originalColumn' => 3, 'originalName' => null)); $this->assertEquals($mappings[12], array('generatedLine' => 2, 'generatedColumn' => 28 + 12, 'originalSource' => '/the/root/two.js', 'originalLine' => 2, 'originalColumn' => 10, 'originalName' => 'n')); }
public function filter(Kwf_SourceMaps_SourceMap $sourcemap) { $sourcemap->stringReplace('$red', '#ff0000'); $sourcemap->stringReplace('$blue', '#0000ff'); return $sourcemap; }
private static function _getOutputForUrlNoEncoding($url) { $cacheId = self::_getCacheIdByUrl($url); $ret = Kwf_Assets_Cache::getInstance()->load($cacheId); if ($ret === false) { $ret = Kwf_Assets_BuildCache::getInstance()->load($cacheId); if ($ret === false || $ret === 'outdated') { if ($ret === 'outdated' && Kwf_Config::getValue('assets.lazyBuild') == 'outdated') { Kwf_Assets_BuildCache::getInstance()->building = true; } $ret = self::_buildOutputForUrl($url); Kwf_Assets_BuildCache::getInstance()->building = false; if (substr($url, -4) != '.map') { //save generated caches for clear-cache-watcher $extension = substr($url, -(strlen($url) - strrpos($url, '/') - 1)); $fileName = 'cache/assets/output-cache-ids-' . $extension; if (!file_exists($fileName) || strpos(file_get_contents($fileName), $cacheId . "\n") === false) { file_put_contents($fileName, $cacheId . "\n", FILE_APPEND); } } } if (Kwf_Setup::getBaseUrl()) { if (substr($url, -4) == '.map') { $contentUrl = substr($url, 0, -4); $extension = substr($contentUrl, strrpos($contentUrl, '/') + 1); $replacements = self::_getBaseUrlReplacements($extension, $ret['contents']); $map = new Kwf_SourceMaps_SourceMap($ret['contents'], ''); foreach ($replacements as $i) { $map->stringReplace($i['search'], $i['replace']); } $map = $map->getMapContentsData(false); foreach ($map->sources as $k => $i) { $map->sources[$k] = Kwf_Setup::getBaseUrl() . $i; } $ret['contents'] = json_encode($map); } else { $extension = substr($url, strrpos($url, '/') + 1); $replacements = self::_getBaseUrlReplacements($extension, $ret['contents']); foreach ($replacements as $i) { $ret['contents'] = str_replace($i['search'], $i['replace'], $ret['contents']); } } } Kwf_Assets_Cache::getInstance()->save($ret, $cacheId); } return $ret; }
public function warmupCaches() { $cacheFile = $this->_getCacheFileName(); $useCache = false; if (file_exists("{$cacheFile}.sourcetimes")) { $useCache = true; $sourceTimes = unserialize(file_get_contents("{$cacheFile}.sourcetimes")); foreach ($sourceTimes as $i) { if ($i['mtime']) { if (!file_exists($i['file']) || filemtime($i['file']) != $i['mtime']) { //file was modified or deleted $useCache = false; break; } } else { if (file_exists($i['file'])) { //file didn't exist, was created $useCache = false; break; } } } } if (!$useCache) { $fileName = $this->getAbsoluteFileName(); static $loadPath; if (!isset($loadPath)) { $loadPath = array(); foreach (glob(VENDOR_PATH . '/bower_components/*') as $p) { $bowerMain = null; $mainExt = null; if (file_exists($p . '/bower.json')) { $bower = json_decode(file_get_contents($p . '/bower.json')); if (isset($bower->main) && is_string($bower->main)) { $bowerMain = $bower->main; $mainExt = substr($bowerMain, -5); } } if ($mainExt == '.scss' || $mainExt == '.sass') { $mainDir = substr($bowerMain, 0, strrpos($bowerMain, '/')); $loadPath[] = $p . '/' . $mainDir; } else { if (file_exists($p . '/scss')) { $loadPath[] = $p . '/scss'; } } } $loadPath[] = './scss'; if (KWF_PATH == '..') { $loadPath[] = substr(getcwd(), 0, strrpos(getcwd(), '/')) . '/sass/Kwf/stylesheets'; } else { $loadPath[] = KWF_PATH . '/sass/Kwf/stylesheets'; } $loadPath = escapeshellarg(implode(PATH_SEPARATOR, $loadPath)); } if (substr($fileName, 0, 2) == './') { $fileName = getcwd() . substr($fileName, 1); } $bin = Kwf_Config::getValue('server.nodeSassBinary'); if (!$bin) { $bin = getcwd() . "/" . VENDOR_PATH . "/bin/node " . dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/node_modules/node-sass/bin/node-sass'; } $cmd = "{$bin} --include-path {$loadPath} --output-style compressed "; $cmd .= " --source-map " . escapeshellarg($cacheFile . '.map'); $cmd .= " " . escapeshellarg($fileName) . " " . escapeshellarg($cacheFile); $cmd .= " 2>&1"; $out = array(); exec($cmd, $out, $retVal); if ($retVal) { throw new Kwf_Exception("compiling sass failed: " . implode("\n", $out)); } $map = json_decode(file_get_contents("{$cacheFile}.map")); $sourceFiles = array(); foreach ($map->sources as $k => $i) { //sources are relative to cache/sass, strip that if (substr($i, 0, 6) != '../../') { throw new Kwf_Exception('source doesn\'t start with ../../'); } $i = substr($i, 6); $f = self::getPathWithTypeByFileName(getcwd() . '/' . $i); if (!$f) { throw new Kwf_Exception("Can't find path for '" . getcwd() . '/' . $i . "'"); } $map->sources[$k] = $f; $sourceFiles[] = $f; if (substr($f, 0, 16) == 'web/scss/config/') { $sourceFiles[] = 'kwf/sass/Kwf/stylesheets/config/' . substr($f, 16); } else { if (substr($f, 0, 32) == 'kwf/sass/Kwf/stylesheets/config/') { $sourceFiles[] = 'web/scss/config/' . substr($f, 32); } } } $map->file = $cacheFile; file_put_contents("{$cacheFile}.map", json_encode($map)); $ret = file_get_contents($cacheFile); $ret = str_replace("@charset \"UTF-8\";\n", '', $ret); //remove charset, no need to adjust sourcemap as sourcemap doesn't include that (bug in libsass) $ret = preg_replace("#/\\*\\# sourceMappingURL=.* \\*/#", '', $ret); $map = new Kwf_SourceMaps_SourceMap(file_get_contents("{$cacheFile}.map"), $ret); if (strpos($ret, 'cssClass') !== false && (strpos($ret, '$cssClass') !== false || strpos($ret, '.cssClass') !== false)) { $cssClass = $this->_getComponentCssClass(); if ($cssClass) { if (strpos($ret, '.cssClass') !== false) { $map->stringReplace('.cssClass', ".{$cssClass}"); } if (strpos($ret, '$cssClass') !== false) { $map->stringReplace('$cssClass', ".{$cssClass}"); } } } if (strpos($ret, 'kwfup-') !== false) { if (Kwf_Config::getValue('application.uniquePrefix')) { $map->stringReplace('kwfup-', Kwf_Config::getValue('application.uniquePrefix') . '-'); } else { $map->stringReplace('kwfup-', ''); } } $usesVars = false; $assetVars = self::getAssetVariables(); foreach ($assetVars as $k => $i) { $search = 'var(' . $k . ')'; if (strpos($ret, $search) !== false) { $map->stringReplace($search, $i); $usesVars = true; } } $map->save("{$cacheFile}.map", $cacheFile); unset($map); $sourceTimes = array(); foreach ($sourceFiles as $f) { $f = new Kwf_Assets_Dependency_File($f); $f = $f->getAbsoluteFileName(); $sourceTimes[] = array('file' => $f, 'mtime' => file_exists($f) ? filemtime($f) : null); } if ($usesVars) { $files = array('assetVariables.ini', 'config.ini', KWF_PATH . '/config.ini'); if (Kwf_Config::getValue('kwc.theme')) { $files[] = Kwf_Config_Web::findThemeConfigIni(Kwf_Config::getValue('kwc.theme')); } foreach ($files as $f) { $sourceTimes[] = array('file' => $f, 'mtime' => file_exists($f) ? filemtime($f) : null); } } file_put_contents("{$cacheFile}.sourcetimes", serialize($sourceTimes)); } }