function testParserImportUriMediumSeq() { $stream = new CSSStreamString('@import url("sample.css") screen, print;'); $lexer = new CSSLexer($stream); $parser = new CSSParser($lexer); $result = $parser->parse(); $this->assertTrue($result); }
function test() { $stream = new CSSStreamString(file_get_contents(dirname(__FILE__) . '/test.parser.10.css')); $lexer = new CSSLexer($stream); $parser = new CSSParser($lexer); $result = $parser->parse(); $this->assertTrue($result); }
function test() { $stream = new CSSStreamString(file_get_contents(dirname(__FILE__) . '/test.parser.error.1.css')); $lexer = new CSSLexer($stream); $parser = new CSSParser($lexer); $result = $parser->parse(); $this->assertTrue($result); $errors = $parser->get_errors(); $this->assertEquals(count($errors), 1); $this->assertEquals($errors[0]->get_line(), 1); $this->assertEquals($errors[0]->get_skipped_content(), ';'); }
function test() { $stream = new CSSStreamString(file_get_contents(dirname(__FILE__) . '/test.parser.12.css')); $lexer = new CSSLexer($stream); $parser = new CSSParser($lexer); $result = $parser->parse(); $this->assertTrue($result); $syntax_stylesheet = $parser->get_context(); $rulesets = $syntax_stylesheet->get_rulesets()->get(); $this->assertEquals(count($rulesets), 2); $this->assertEquals($rulesets[0]->get_selectors()->get(0)->get_selector(0)->get_element(), 'ol'); $this->assertEquals($rulesets[1]->get_selectors()->get(0)->get_selector(0)->get_element(), 'ul'); }
private function getFontCssRules() { if (is_null($this->fontCssRules)) { $this->fontCssRules = array(); $cssAssets = $this->epub->EpubSpine->getAssetsByType('text/css'); foreach ($cssAssets as $css) { try { $cssContent = $this->epub->getPageContent($css->relativePath); $cssParser = new CSSParser($cssContent); $objCss = $cssParser->parse(); $this->fonts = array(); foreach ($objCss->getAllRuleSets() as $cssRuleSet) { $font = array(); if (is_a($cssRuleSet, 'CSSAtRule')) { $selectorName = $cssRuleSet->getType(); if ($selectorName == 'font-face') { foreach ($cssRuleSet->getRules() as $cssRule) { $value = (string) $cssRule->getValue(); if (substr($value, 0, 1) == '"') { $value = substr($value, 1, -1); } $font[$cssRule->getRule()] = $value; } $this->fontCssRules[] = $font; } } } unset($objCss); unset($cssParser); } catch (Exception $e) { CakeLog::warning('[EpubProcessor::getFontCssRules] Error ' . $e->getMessage() . ' when parsing ' . $css->relativePath); } } } return $this->fontCssRules; }
function parsedStructureForFile($sFileName) { $sFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR . "{$sFileName}.css"; $oParser = new CSSParser(file_get_contents($sFile)); return $oParser->parse(); }
/** * Strip HTML tags, inline styles and convert input src to semantic, styled HTML and add page breaks and chapter entries to table of contents * @param $src str input HTML to be processed * @param $all bool true/false to strip ALL HTML tags * @return $str str stripped HTML */ function stripTagsAddChapters($src, $all = false) { $dom = new DOMDocument(); @$dom->loadHTML('<?xml encoding="UTF-8">' . $src); $xPath = new DOMXPath($dom); $elements = $xPath->query('//p'); foreach ($elements as $element) { if (strstr($element->getAttribute('class'), 'Heading1') !== FALSE) { $newElement = $dom->createElement('h1', $element->nodeValue); $element->parentNode->replaceChild($newElement, $element); } if (strstr($element->getAttribute('class'), 'Heading2') !== FALSE) { $newElement = $dom->createElement('h2', $element->nodeValue); $element->parentNode->replaceChild($newElement, $element); } if (strstr($element->getAttribute('class'), 'Heading3') !== FALSE) { $newElement = $dom->createElement('h3', $element->nodeValue); $element->parentNode->replaceChild($newElement, $element); } if (strstr($element->getAttribute('class'), 'Heading4') !== FALSE) { $newElement = $dom->createElement('h4', $element->nodeValue); $element->parentNode->replaceChild($newElement, $element); } } $elements = $xPath->query('//p|//span'); foreach ($elements as $element) { $oParser = new CSSParser("p{" . $element->getAttribute('style') . "}"); $oCss = $oParser->parse(); foreach ($oCss->getAllRuleSets() as $oRuleSet) { $oRuleSet->removeRule('line-'); $oRuleSet->removeRule('margin-'); $oRuleSet->removeRule('font-family'); $oRuleSet->removeRule('font-size'); $oRuleSet->removeRule('color'); if (is_array($indent) && isset($indent['text-indent'])) { $value = $indent['text-indent']->getValue(); if ($value != null) { $value->setSize('4'); $value->setUnit('mm'); } } } $css = $oCss->__toString(); $css = substr_replace($css, '', 0, 3); $css = substr_replace($css, '', -1, 1); $element->setAttribute('style', $css); } $src = $dom->saveHTML(); $search = array('@<script[^>]*?>.*?</script>@si', '@<style[^>]*?>.*?</style>@siU', '@<![\\s\\S]*?--[ \\t\\n\\r]*>@', '/(?si)<span\\s+class\\s*=\\s*"-H"\\s* style="letter-spacing: 0pt;">(.*?)<\\/span>/'); $src = preg_replace($search, array('', '', '', '$1'), $src); if ($all == false) { $src = strip_tags($src, "<p><br><img><span><strong><em><h1><h2><h3><h4>"); } else { $allow = "<p>"; $src = strip_tags($src, $allow); $src = $this->clean_inside_tags($src, $allow); $src = preg_replace('#<p[^>]*>(\\s| ?)*</p>#', '', $src); } $src = str_replace("#", "<br />", $src); $src = str_replace("***", "<br /><br />", $src); $src = preg_replace(array('/(?si)<h1(.*?)\\s*>(.*?)<\\/h1>/', '/(?si)<h2(.*?)\\s*>(.*?)<\\/h2>/', '/(?si)<h3(.*?)\\s*>(.*?)<\\/h3>/', '/(?si)<h4(.*?)\\s*>(.*?)<\\/h4>/'), array("<pagebreak /><h1>\$2<tocentry content='\$2' level='0' /></h1>", "<h2>\$2<tocentry content='\$2' level='1' /></h2>", '<h3>$2</h3>', '<h4>$2</h4>'), $src); return $src; }
function import_source($css, $url) { $this->push_base_url($url); $ruleset = new CSSRuleset(); $stream = new CSSStreamString($css); $lexer = new CSSLexer($stream); $parser = new CSSParser($lexer); $result = $parser->parse(); // Log CSS parse errors $errors = $parser->get_errors(); foreach ($errors as $error) { $error->log($url); } if (!$result) { error_log(sprintf('Unrecoverable syntax error while parsing stylesheet at "%s"', $url)); } $stylesheet = $parser->get_context(); // Process @import $imports = $stylesheet->get_imports(); foreach ($imports as $import) { $media_list = $import->get_media(); if (empty($media_list) || in_array('all', $media_list) || $this->is_allowed_media($import->get_media())) { $pipeline = $this->get_pipeline(); $full_url = $pipeline->guess_url(css_remove_value_quotes($import->get_url())); $ruleset->merge($this->import($full_url)); } } // Process @media $media = $stylesheet->get_media(); foreach ($media as $media_item) { if ($this->is_allowed_media($media_item->get_media())) { $ruleset->merge($this->import_rulesets($media_item->get_rulesets())); } } // Process usual rules $ruleset->merge($this->import_rulesets($stylesheet->get_rulesets())); $this->pop_base_url(); return $ruleset; }
/** * @dataProvider createBackgroundShorthandProvider **/ public function testCreateBackgroundShorthand($sCss, $sExpected) { $oParser = new CSSParser($sCss); $oDoc = $oParser->parse(); foreach ($oDoc->getAllDeclarationBlocks() as $oDeclaration) { $oDeclaration->createBackgroundShorthand(); } $this->assertEquals((string) $oDoc, $sExpected); }
<?php require_once dirname(__FILE__) . '/../CSSParser.php'; $oParser = new CSSParser(file_get_contents('php://stdin')); $oDoc = $oParser->parse(); echo '#### Structure (`var_dump()`)' . "\n"; var_dump($oDoc); echo '#### Output (`__toString()`)' . "\n"; print $oDoc->__toString(); echo "\n";