Exemplo n.º 1
0
/**
 * Remove the 'at' keyword from -x-radial-gradient() for legacy implementations.
 */
function postalias_fix_radial_gradients($declaration_copies)
{
    // Create new paren tokens based on the first prefixed declaration.
    // Replace the new syntax with the legacy syntax.
    static $fn_patt;
    if (!$fn_patt) {
        $fn_patt = Regex::make('~{{ LB }}{{ vendor }}(?:repeating-)?radial-gradient{{ parens }}~iS');
    }
    $original_parens = array();
    $replacement_parens = array();
    foreach (Regex::matchAll($fn_patt, $declaration_copies[0]->value) as $m) {
        $original_parens[] = $m['parens'][0];
        $replacement_parens[] = preg_replace('~\\bat +(top|left|bottom|right|center)\\b~i', '$1', $m['parens'][0]);
    }
    foreach ($declaration_copies as $prefixed_copy) {
        $prefixed_copy->value = str_replace($original_parens, $replacement_parens, $prefixed_copy->value);
    }
}
Exemplo n.º 2
0
 public function apply($str, \stdClass $context = null)
 {
     if (strpos($str, '(') === false) {
         return $str;
     }
     if (!$this->pattern) {
         $this->setPattern();
     }
     if (!preg_match($this->pattern, $str)) {
         return $str;
     }
     $matches = Regex::matchAll($this->pattern, $str);
     while ($match = array_pop($matches)) {
         if (isset($match['function']) && $match['function'][1] !== -1) {
             list($function, $offset) = $match['function'];
         } else {
             list($function, $offset) = $match['simple_function'];
         }
         if (!preg_match(Regex::$patt->parens, $str, $parens, PREG_OFFSET_CAPTURE, $offset)) {
             continue;
         }
         $openingParen = $parens[0][1];
         $closingParen = $openingParen + strlen($parens[0][0]);
         $rawArgs = trim($parens['parens_content'][0]);
         // Update the context function identifier.
         if ($context) {
             $context->function = $function;
         }
         $returns = '';
         if (isset($this->register[$function])) {
             $fn = $this->register[$function];
             if (is_array($fn) && !empty($fn['parse_args'])) {
                 $returns = $fn['callback'](self::parseArgs($rawArgs), $context);
             } else {
                 $returns = $fn($rawArgs, $context);
             }
         }
         $str = substr_replace($str, $returns, $offset, $closingParen - $offset);
     }
     return $str;
 }
Exemplo n.º 3
0
 protected function resolveInBlocks()
 {
     $matches = $this->string->matchAll('~@in\\s+(?<selectors>[^{]+)\\{~iS');
     while ($match = array_pop($matches)) {
         $selectorsMatch = trim($match['selectors'][0]);
         $curlyMatch = new BalancedMatch($this->string, $match[0][1]);
         if (!$curlyMatch->match || empty($selectorsMatch)) {
             continue;
         }
         $rawSelectors = Util::splitDelimList($selectorsMatch);
         foreach (Regex::matchAll(Regex::$patt->r_token, $curlyMatch->inside()) as $ruleMatch) {
             Crush::$process->tokens->get($ruleMatch[0][0])->selectors->merge($rawSelectors);
         }
         $curlyMatch->unWrap();
     }
 }
Exemplo n.º 4
0
 public function collate()
 {
     $process = $this->process;
     $options = $process->options;
     $regex = Regex::$patt;
     $input = $process->input;
     $str = '';
     // Keep track of all import file info for cache data.
     $mtimes = array();
     $filenames = array();
     // Resolve main input; a string of css or a file.
     if (isset($input->string)) {
         $str .= $input->string;
         $process->sources[] = 'Inline CSS';
     } else {
         $str .= file_get_contents($input->path);
         $process->sources[] = $input->path;
     }
     // If there's a parsing error go no further.
     if (!$this->prepareImport($str)) {
         return $str;
     }
     // This may be set non-zero during the script if an absolute @import URL is encountered.
     $search_offset = 0;
     // Recurses until the nesting heirarchy is flattened and all import files are inlined.
     while (preg_match($regex->import, $str, $match, PREG_OFFSET_CAPTURE, $search_offset)) {
         $match_len = strlen($match[0][0]);
         $match_start = $match[0][1];
         $import = new \stdClass();
         $import->url = $process->tokens->get($match[1][0]);
         $import->media = trim($match[2][0]);
         // Protocoled import urls are not processed. Stash for prepending to output.
         if ($import->url->protocol) {
             $str = substr_replace($str, '', $match_start, $match_len);
             $process->absoluteImports[] = $import;
             continue;
         }
         // Resolve import path information.
         if ($import->url->isRooted) {
             $import->path = realpath($process->docRoot . $import->url->value);
         } else {
             $import->path = realpath("{$input->dir}/{$import->url->value}");
         }
         $import->dir = dirname($import->path);
         // If unsuccessful getting import contents continue with the import line removed.
         $import->content = @file_get_contents($import->path);
         if ($import->content === false) {
             notice("Import file '{$import->url->value}' not found");
             $str = substr_replace($str, '', $match_start, $match_len);
             continue;
         }
         // Import file exists so register it.
         $process->sources[] = $import->path;
         $mtimes[] = filemtime($import->path);
         $filenames[] = $import->url->value;
         // If the import content doesn't pass syntax validation skip to next import.
         if (!$this->prepareImport($import->content)) {
             $str = substr_replace($str, '', $match_start, $match_len);
             continue;
         }
         // Resolve a relative link between the import file and the host-file.
         if ($import->url->isRooted) {
             $import->relativeDir = Util::getLinkBetweenPaths($import->dir, $input->dir);
         } else {
             $import->relativeDir = dirname($import->url->value);
         }
         // Alter all embedded import URLs to be relative to the host-file.
         foreach (Regex::matchAll($regex->import, $import->content) as $m) {
             $nested_url = $process->tokens->get($m[1][0]);
             // Resolve rooted paths.
             if ($nested_url->isRooted) {
                 $link = Util::getLinkBetweenPaths(dirname($nested_url->getAbsolutePath()), $import->dir);
                 $nested_url->update($link . basename($nested_url->value));
             } elseif (strlen($import->relativeDir)) {
                 $nested_url->prepend("{$import->relativeDir}/");
             }
         }
         // Optionally rewrite relative url and custom function data-uri references.
         if ($options->rewrite_import_urls) {
             $this->rewriteImportedUrls($import);
         }
         if ($import->media) {
             $import->content = "@media {$import->media} {{$import->content}}";
         }
         $str = substr_replace($str, $import->content, $match_start, $match_len);
     }
     // Save only if caching is on and the hostfile object is associated with a real file.
     if ($input->path && $options->cache) {
         $process->cacheData[$process->output->filename] = array('imports' => $filenames, 'datem_sum' => array_sum($mtimes) + $input->mtime, 'options' => $options->get());
         $process->io->saveCacheData();
     }
     return $str;
 }
Exemplo n.º 5
0
 public function matchAll($patt, $offset = 0)
 {
     return Regex::matchAll($patt, $this->raw, $offset);
 }