Skip to content

Commit a47aecb

Browse files
committed
Output correct size unit in lenient mode; fail if unit not valid
1 parent 3bc5ded commit a47aecb

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

lib/Sabberworm/CSS/Value/Size.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Sabberworm\CSS\Value;
44

55
use Sabberworm\CSS\Parsing\ParserState;
6+
use Sabberworm\CSS\Parsing\UnexpectedTokenException;
67

78
class Size extends PrimitiveValue {
89

@@ -38,11 +39,21 @@ public static function parse(ParserState $oParserState, $bIsColorComponent = fal
3839

3940
$sUnit = null;
4041
$aSizeUnits = self::getSizeUnits();
41-
foreach($aSizeUnits as $iLength => &$aValues) {
42+
$sUnit = strtolower($oParserState->parseIdentifier());
43+
$oParserState->backtrack(strlen($sUnit));
44+
45+
foreach($aSizeUnits as $iLength => $aValues) {
46+
$iConsumeLength = $iLength;
4247
$sKey = strtolower($oParserState->peek($iLength));
4348
if(array_key_exists($sKey, $aValues)) {
49+
if ($sUnit !== $sKey) {
50+
if (!$oParserState->getSettings()->bLenientParsing) {
51+
throw new UnexpectedTokenException('Unit', $sUnit, 'identifier', $oParserState->currentLine());
52+
}
53+
$iConsumeLength = strlen($sUnit);
54+
}
4455
if (($sUnit = $aValues[$sKey]) !== null) {
45-
$oParserState->consume($iLength);
56+
$oParserState->consume($iConsumeLength);
4657
break;
4758
}
4859
}

tests/Sabberworm/CSS/ParserTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,4 +787,22 @@ function testLonelyImport() {
787787
$sExpected = "@import url(\"example.css\") only screen and (max-width: 600px);";
788788
$this->assertSame($sExpected, $oDoc->render());
789789
}
790+
791+
function testTurnUnitLenient() {
792+
$sText = ".foo {transform: rotate(1turn);}\n.bar {transform: rotate(1turns);}";
793+
$sExpected = ".foo {transform: rotate(1turn);}\n.bar {transform: rotate(1turn);}";
794+
795+
$oParser = new Parser($sText);
796+
$this->assertSame($sExpected, $oParser->parse()->render());
797+
}
798+
799+
function testTurnUnitStrict() {
800+
$sText = ".foo {transform: rotate(1turn);}\n.bar {transform: rotate(1turns);}";
801+
802+
$oParser = new Parser($sText, Settings::create()->beStrict());
803+
804+
// Line 2 contains the invalid unit and so should be reported.
805+
$this->setExpectedException( 'Sabberworm\CSS\Parsing\UnexpectedTokenException', 'Identifier expected. Got “turns” [line no: 2]' );
806+
$oParser->parse();
807+
}
790808
}

0 commit comments

Comments
 (0)