Skip to content

Commit

Permalink
fix(core): update the CSS parser
Browse files Browse the repository at this point in the history
Fix #446
  • Loading branch information
mgechev committed Jan 8, 2018
1 parent bc71331 commit a31c6d2
Show file tree
Hide file tree
Showing 5 changed files with 583 additions and 416 deletions.
8 changes: 5 additions & 3 deletions src/angular/styles/chars.ts
@@ -1,3 +1,5 @@
/* tslint:disable */

/**
* @license
* Copyright Google Inc. All Rights Reserved.
Expand Down Expand Up @@ -73,17 +75,17 @@ export const $AT = 64;
export const $BT = 96;

export function isWhitespace(code: number): boolean {
return (code >= $TAB && code <= $SPACE) || (code === $NBSP);
return (code >= $TAB && code <= $SPACE) || code == $NBSP;
}

export function isDigit(code: number): boolean {
return $0 <= code && code <= $9;
}

export function isAsciiLetter(code: number): boolean {
return code >= $a && code <= $z || code >= $A && code <= $Z;
return (code >= $a && code <= $z) || (code >= $A && code <= $Z);
}

export function isAsciiHexDigit(code: number): boolean {
return code >= $a && code <= $f || code >= $A && code <= $F || isDigit(code);
return (code >= $a && code <= $f) || (code >= $A && code <= $F) || isDigit(code);
}
90 changes: 61 additions & 29 deletions src/angular/styles/cssAst.ts
Expand Up @@ -7,9 +7,9 @@
* found in the LICENSE file at https://angular.io/license
*/

import {ParseLocation, ParseSourceSpan} from './parseUtil';
import { ParseLocation, ParseSourceSpan } from './parseUtil';

import {CssToken, CssTokenType} from './cssLexer';
import { CssToken, CssTokenType } from './cssLexer';

export enum BlockType {
Import,
Expand Down Expand Up @@ -47,26 +47,37 @@ export interface CssAstVisitor {

export abstract class CssAst {
constructor(public location: ParseSourceSpan) {}
get start(): ParseLocation { return this.location.start; }
get end(): ParseLocation { return this.location.end; }
get start(): ParseLocation {
return this.location.start;
}
get end(): ParseLocation {
return this.location.end;
}
abstract visit(visitor: CssAstVisitor, context?: any): any;
}

export class CssStyleValueAst extends CssAst {
constructor(location: ParseSourceSpan, public tokens: CssToken[], public strValue: string) {
super(location);
}
visit(visitor: CssAstVisitor, context?: any): any { return visitor.visitCssValue(this); }
visit(visitor: CssAstVisitor, context?: any): any {
return visitor.visitCssValue(this);
}
}

export abstract class CssRuleAst extends CssAst {
constructor(location: ParseSourceSpan) { super(location); }
constructor(location: ParseSourceSpan) {
super(location);
}
}

export class CssBlockRuleAst extends CssRuleAst {
constructor(
public location: ParseSourceSpan, public type: BlockType, public block: CssBlockAst,
public name: CssToken = null) {
public location: ParseSourceSpan,
public type: BlockType,
public block: CssBlockAst,
public name: CssToken | null = null
) {
super(location);
}
visit(visitor: CssAstVisitor, context?: any): any {
Expand Down Expand Up @@ -94,23 +105,29 @@ export class CssKeyframeDefinitionAst extends CssBlockRuleAst {

export class CssBlockDefinitionRuleAst extends CssBlockRuleAst {
constructor(
location: ParseSourceSpan, public strValue: string, type: BlockType,
public query: CssAtRulePredicateAst, block: CssBlockAst) {
location: ParseSourceSpan,
public strValue: string,
type: BlockType,
public query: CssAtRulePredicateAst,
block: CssBlockAst
) {
super(location, type, block);
var firstCssToken: CssToken = query.tokens[0];
const firstCssToken: CssToken = query.tokens[0];
this.name = new CssToken(
firstCssToken.index, firstCssToken.column, firstCssToken.line, CssTokenType.Identifier,
this.strValue);
firstCssToken.index,
firstCssToken.column,
firstCssToken.line,
CssTokenType.Identifier,
this.strValue
);
}
visit(visitor: CssAstVisitor, context?: any): any {
return visitor.visitCssBlock(this.block, context);
}
}

export class CssMediaQueryRuleAst extends CssBlockDefinitionRuleAst {
constructor(
location: ParseSourceSpan, strValue: string, query: CssAtRulePredicateAst,
block: CssBlockAst) {
constructor(location: ParseSourceSpan, strValue: string, query: CssAtRulePredicateAst, block: CssBlockAst) {
super(location, strValue, BlockType.MediaQuery, query, block);
}
visit(visitor: CssAstVisitor, context?: any): any {
Expand Down Expand Up @@ -149,8 +166,7 @@ export class CssSelectorRuleAst extends CssBlockRuleAst {
}

export class CssDefinitionAst extends CssAst {
constructor(
location: ParseSourceSpan, public property: CssToken, public value: CssStyleValueAst) {
constructor(location: ParseSourceSpan, public property: CssToken, public value: CssStyleValueAst) {
super(location);
}
visit(visitor: CssAstVisitor, context?: any): any {
Expand All @@ -159,7 +175,9 @@ export class CssDefinitionAst extends CssAst {
}

export abstract class CssSelectorPartAst extends CssAst {
constructor(location: ParseSourceSpan) { super(location); }
constructor(location: ParseSourceSpan) {
super(location);
}
}

export class CssSelectorAst extends CssSelectorPartAst {
Expand All @@ -175,8 +193,12 @@ export class CssSelectorAst extends CssSelectorPartAst {

export class CssSimpleSelectorAst extends CssSelectorPartAst {
constructor(
location: ParseSourceSpan, public tokens: CssToken[], public strValue: string,
public pseudoSelectors: CssPseudoSelectorAst[], public operator: CssToken) {
location: ParseSourceSpan,
public tokens: CssToken[],
public strValue: string,
public pseudoSelectors: CssPseudoSelectorAst[],
public operator: CssToken
) {
super(location);
}
visit(visitor: CssAstVisitor, context?: any): any {
Expand All @@ -186,8 +208,12 @@ export class CssSimpleSelectorAst extends CssSelectorPartAst {

export class CssPseudoSelectorAst extends CssSelectorPartAst {
constructor(
location: ParseSourceSpan, public strValue: string, public name: string,
public tokens: CssToken[], public innerSelectors: CssSelectorAst[]) {
location: ParseSourceSpan,
public strValue: string,
public name: string,
public tokens: CssToken[],
public innerSelectors: CssSelectorAst[]
) {
super(location);
}
visit(visitor: CssAstVisitor, context?: any): any {
Expand All @@ -196,8 +222,12 @@ export class CssPseudoSelectorAst extends CssSelectorPartAst {
}

export class CssBlockAst extends CssAst {
constructor(location: ParseSourceSpan, public entries: CssAst[]) { super(location); }
visit(visitor: CssAstVisitor, context?: any): any { return visitor.visitCssBlock(this, context); }
constructor(location: ParseSourceSpan, public entries: CssAst[]) {
super(location);
}
visit(visitor: CssAstVisitor, context?: any): any {
return visitor.visitCssBlock(this, context);
}
}

/*
Expand All @@ -214,7 +244,9 @@ export class CssStylesBlockAst extends CssBlockAst {
}

export class CssStyleSheetAst extends CssAst {
constructor(location: ParseSourceSpan, public rules: CssAst[]) { super(location); }
constructor(location: ParseSourceSpan, public rules: CssAst[]) {
super(location);
}
visit(visitor: CssAstVisitor, context?: any): any {
return visitor.visitCssStyleSheet(this, context);
}
Expand All @@ -239,9 +271,9 @@ export class CssUnknownTokenListAst extends CssRuleAst {
}

export function mergeTokens(tokens: CssToken[], separator: string = ''): CssToken {
var mainToken = tokens[0];
var str = mainToken.strValue;
for (var i = 1; i < tokens.length; i++) {
const mainToken = tokens[0];
let str = mainToken.strValue;
for (let i = 1; i < tokens.length; i++) {
str += separator + tokens[i].strValue;
}

Expand Down

0 comments on commit a31c6d2

Please sign in to comment.