123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858 |
- using System;
- using System.Text;
- using System.Collections.Generic;
- using ExCSS.Model;
- using ExCSS.Model.TextBlocks;
- #pragma warning disable
- namespace ExCSS
- {
- public partial class Parser
- {
- private bool ParseTokenBlock(Block token)
- {
- switch (_parsingContext)
- {
- case ParsingContext.DataBlock:
- return ParseSymbol(token);
- case ParsingContext.InSelector:
- return ParseSelector(token);
- case ParsingContext.InDeclaration:
- return ParseDeclaration(token);
- case ParsingContext.AfterProperty:
- return ParsePostProperty(token);
- case ParsingContext.BeforeValue:
- return ParseValue(token);
- case ParsingContext.InValuePool:
- return ParseValuePool(token);
- case ParsingContext.InValueList:
- return ParseValueList(token);
- case ParsingContext.InSingleValue:
- return ParseSingleValue(token);
- case ParsingContext.ValueImportant:
- return ParseImportant(token);
- case ParsingContext.AfterValue:
- return ParsePostValue(token);
- case ParsingContext.InMediaList:
- return ParseMediaList(token);
- case ParsingContext.InMediaValue:
- return ParseMediaValue(token);
- case ParsingContext.BeforeImport:
- return ParseImport(token);
- case ParsingContext.AfterInstruction:
- return ParsePostInstruction(token);
- case ParsingContext.BeforeCharset:
- return ParseCharacterSet(token);
- case ParsingContext.BeforeNamespacePrefix:
- return ParseLeadingPrefix(token);
- case ParsingContext.AfterNamespacePrefix:
- return ParseNamespace(token);
- case ParsingContext.InCondition:
- return ParseCondition(token);
- case ParsingContext.InUnknown:
- return ParseUnknown(token);
- case ParsingContext.InKeyframeText:
- return ParseKeyframeText(token);
- case ParsingContext.BeforePageSelector:
- return ParsePageSelector(token);
- case ParsingContext.BeforeDocumentFunction:
- return ParsePreDocumentFunction(token);
- case ParsingContext.InDocumentFunction:
- return ParseDocumentFunction(token);
- case ParsingContext.AfterDocumentFunction:
- return ParsePostDocumentFunction(token);
- case ParsingContext.BetweenDocumentFunctions:
- return ParseDocumentFunctions(token);
- case ParsingContext.BeforeKeyframesName:
- return ParseKeyframesName(token);
- case ParsingContext.BeforeKeyframesData:
- return ParsePreKeyframesData(token);
- case ParsingContext.KeyframesData:
- return ParseKeyframesData(token);
- case ParsingContext.BeforeFontFace:
- return ParseFontface(token);
- case ParsingContext.InHexValue:
- return ParseHexValue(token);
- case ParsingContext.InFunction:
- return ParseValueFunction(token);
- default:
- return false;
- }
- }
- private bool ParseSymbol(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.AtRule)
- {
- switch (((SymbolBlock)token).Value)
- {
- case RuleTypes.Media:
- {
- AddRuleSet(new MediaRule());
- SetParsingContext(ParsingContext.InMediaList);
- break;
- }
- case RuleTypes.Page:
- {
- AddRuleSet(new PageRule());
- //SetParsingContext(ParsingContext.InSelector);
- SetParsingContext(ParsingContext.BeforePageSelector);
- break;
- }
- case RuleTypes.Import:
- {
- AddRuleSet(new ImportRule());
- SetParsingContext(ParsingContext.BeforeImport);
- break;
- }
- case RuleTypes.FontFace:
- {
- AddRuleSet(new FontFaceRule());
- //SetParsingContext(ParsingContext.InDeclaration);
- SetParsingContext(ParsingContext.BeforeFontFace);
- break;
- }
- case RuleTypes.CharacterSet:
- {
- AddRuleSet(new CharacterSetRule());
- SetParsingContext(ParsingContext.BeforeCharset);
- break;
- }
- case RuleTypes.Namespace:
- {
- AddRuleSet(new NamespaceRule());
- SetParsingContext(ParsingContext.BeforeNamespacePrefix);
- break;
- }
- case RuleTypes.Supports:
- {
- _buffer = new StringBuilder();
- AddRuleSet(new SupportsRule());
- SetParsingContext(ParsingContext.InCondition);
- break;
- }
- case RuleTypes.Keyframes:
- {
- AddRuleSet(new KeyframesRule());
- SetParsingContext(ParsingContext.BeforeKeyframesName);
- break;
- }
- case RuleTypes.Document:
- {
- AddRuleSet(new DocumentRule());
- SetParsingContext(ParsingContext.BeforeDocumentFunction);
- break;
- }
- default:
- {
- _buffer = new StringBuilder();
- AddRuleSet(new GenericRule());
- SetParsingContext(ParsingContext.InUnknown);
- ParseUnknown(token);
- break;
- }
- }
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.CurlyBracketClose)
- {
- return FinalizeRule();
- }
- AddRuleSet(new StyleRule());
- SetParsingContext(ParsingContext.InSelector);
- ParseSelector(token);
- return true;
- }
- private bool ParseUnknown(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.Semicolon:
- CastRuleSet<GenericRule>().SetInstruction(_buffer.ToString());
- SetParsingContext(ParsingContext.DataBlock);
- return FinalizeRule();
- case GrammarSegment.CurlyBraceOpen:
- CastRuleSet<GenericRule>().SetCondition(_buffer.ToString());
- SetParsingContext(ParsingContext.DataBlock);
- break;
- default:
- _buffer.Append(token);
- break;
- }
- return true;
- }
- private bool ParseSelector(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.CurlyBraceOpen:
- {
- var rule = CurrentRule as ISupportsSelector;
- if (rule != null)
- {
- rule.Selector = _selectorFactory.GetSelector();
- }
- SetParsingContext(CurrentRule is StyleRule
- ? ParsingContext.InDeclaration
- : ParsingContext.DataBlock);
- }
- break;
- case GrammarSegment.CurlyBracketClose:
- return false;
- default:
- _selectorFactory.Apply(token);
- break;
- }
- return true;
- }
- private bool ParseDeclaration(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.CurlyBracketClose)
- {
- FinalizeProperty();
- SetParsingContext(CurrentRule is KeyframeRule ? ParsingContext.KeyframesData : ParsingContext.DataBlock);
- return FinalizeRule();
- }
- if (token.GrammarSegment != GrammarSegment.Ident)
- {
- return false;
- }
- AddProperty(new Property(((SymbolBlock)token).Value));
- SetParsingContext(ParsingContext.AfterProperty);
- return true;
- }
- private bool ParsePostInstruction(Block token)
- {
- if (token.GrammarSegment != GrammarSegment.Semicolon)
- {
- return false;
- }
- SetParsingContext(ParsingContext.DataBlock);
- return FinalizeRule();
- }
- private bool ParseCondition(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.CurlyBraceOpen:
- CastRuleSet<SupportsRule>().Condition = _buffer.ToString();
- SetParsingContext(ParsingContext.DataBlock);
- break;
- default:
- _buffer.Append(token);
- break;
- }
- return true;
- }
- private bool ParseLeadingPrefix(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.Ident)
- {
- CastRuleSet<NamespaceRule>().Prefix = ((SymbolBlock)token).Value;
- SetParsingContext(ParsingContext.AfterNamespacePrefix);
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.String || token.GrammarSegment == GrammarSegment.Url)
- {
- CastRuleSet<NamespaceRule>().Uri = ((StringBlock)token).Value;
- return true;
- }
- SetParsingContext(ParsingContext.AfterInstruction);
- return ParsePostInstruction(token);
- }
- private bool ParsePostProperty(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.Colon)
- {
- _isFraction = false;
- SetParsingContext(ParsingContext.BeforeValue);
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.Semicolon || token.GrammarSegment == GrammarSegment.CurlyBracketClose)
- {
- ParsePostValue(token);
- }
- return false;
- }
- private bool ParseValue(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.Semicolon:
- SetParsingContext(ParsingContext.InDeclaration);
- break;
- case GrammarSegment.CurlyBracketClose:
- ParseDeclaration(token);
- break;
- default:
- SetParsingContext(ParsingContext.InSingleValue);
- return ParseSingleValue(token);
- }
- return false;
- }
- private bool ParseSingleValue(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.Dimension: // "3px"
- return AddTerm(new PrimitiveTerm(((UnitBlock)token).Unit, ((UnitBlock)token).Value));
- case GrammarSegment.Hash:// "#ffffff"
- return ParseSingleValueHexColor(((SymbolBlock)token).Value);
- case GrammarSegment.Delimiter: // "#"
- return ParseValueDelimiter((DelimiterBlock)token);
- case GrammarSegment.Ident: // "auto"
- return ParseSingleValueIdent((SymbolBlock)token);
- case GrammarSegment.String:// "'some value'"
- return AddTerm(new PrimitiveTerm(UnitType.String, ((StringBlock)token).Value));
- case GrammarSegment.Url:// "url('http://....')"
- return AddTerm(new PrimitiveTerm(UnitType.Uri, ((StringBlock)token).Value));
- case GrammarSegment.Percentage: // "10%"
- return AddTerm(new PrimitiveTerm(UnitType.Percentage, ((UnitBlock)token).Value));
- case GrammarSegment.Number: // "123"
- return AddTerm(new PrimitiveTerm(UnitType.Number, ((NumericBlock)token).Value));
- case GrammarSegment.Whitespace: // " "
- _terms.AddSeparator(GrammarSegment.Whitespace);
- SetParsingContext(ParsingContext.InValueList);
- return true;
- case GrammarSegment.Function: // rgba(...)
- _functionBuffers.Push(new FunctionBuffer(((SymbolBlock)token).Value));
- SetParsingContext(ParsingContext.InFunction);
- return true;
- case GrammarSegment.Comma: // ","
- _terms.AddSeparator(GrammarSegment.Comma);
- SetParsingContext(ParsingContext.InValuePool);
- return true;
- case GrammarSegment.Semicolon: // ";"
- case GrammarSegment.CurlyBracketClose: // "}"
- return ParsePostValue(token);
- default:
- return false;
- }
- }
- private bool ParseValueFunction(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.ParenClose:
- SetParsingContext(ParsingContext.InSingleValue);
- return AddTerm(_functionBuffers.Pop().Done());
- case GrammarSegment.Comma:
- _functionBuffers.Peek().Include();
- return true;
- default:
- return ParseSingleValue(token);
- }
- }
- private bool ParseValueList(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.CurlyBracketClose:
- case GrammarSegment.Semicolon:
- ParsePostValue(token);
- break;
- case GrammarSegment.Comma:
- SetParsingContext(ParsingContext.InValuePool);
- break;
- default:
- SetParsingContext(ParsingContext.InSingleValue);
- return ParseSingleValue(token);
- }
- return true;
- }
- private bool ParseValuePool(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.Semicolon || token.GrammarSegment == GrammarSegment.CurlyBracketClose)
- {
- ParsePostValue(token);
- }
- else
- {
- SetParsingContext(ParsingContext.InSingleValue);
- return ParseSingleValue(token);
- }
- return false;
- }
- private bool ParseHexValue(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.Number:
- case GrammarSegment.Dimension:
- case GrammarSegment.Ident:
- var rest = token.ToString();
- if (_buffer.Length + rest.Length <= 6)
- {
- _buffer.Append(rest);
- return true;
- }
- break;
- }
- ParseSingleValueHexColor(_buffer.ToString());
- SetParsingContext(ParsingContext.InSingleValue);
- return ParseSingleValue(token);
- }
- private bool ParsePostValue(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.Semicolon)
- {
- FinalizeProperty();
- SetParsingContext(ParsingContext.InDeclaration);
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.CurlyBracketClose)
- {
- return ParseDeclaration(token);
- }
- return false;
- }
- private bool ParseImportant(Block token)
- {
- if (token.GrammarSegment != GrammarSegment.Ident || ((SymbolBlock)token).Value != "important")
- {
- return ParsePostValue(token);
- }
- SetParsingContext(ParsingContext.AfterValue);
- _property.Important = true;
- return true;
- }
- private bool ParseValueDelimiter(DelimiterBlock token)
- {
- switch (token.Value)
- {
- case Specification.Em:
- SetParsingContext(ParsingContext.ValueImportant);
- return true;
- case Specification.Hash:
- _buffer = new StringBuilder();
- SetParsingContext(ParsingContext.InHexValue);
- return true;
- case Specification.Solidus:
- _isFraction = true;
- return true;
- default:
- return false;
- }
- }
- private bool ParseSingleValueIdent(SymbolBlock token)
- {
- if (token.Value != "inherit")
- {
- return AddTerm(new PrimitiveTerm(UnitType.Ident, token.Value));
- }
- _terms.AddTerm(Term.Inherit);
- SetParsingContext(ParsingContext.AfterValue);
- return true;
- }
- private bool ParseSingleValueHexColor(string color)
- {
- HtmlColor htmlColor;
- if (HtmlColor.TryFromHex(color, out htmlColor))
- return AddTerm(htmlColor);
- return false;
- }
- #region Namespace
- private bool ParseNamespace(Block token)
- {
- SetParsingContext(ParsingContext.AfterInstruction);
- if (token.GrammarSegment != GrammarSegment.String)
- {
- return ParsePostInstruction(token);
- }
- CastRuleSet<NamespaceRule>().Uri = ((StringBlock)token).Value;
- return true;
- }
- #endregion
- #region Charset
- private bool ParseCharacterSet(Block token)
- {
- SetParsingContext(ParsingContext.AfterInstruction);
- if (token.GrammarSegment != GrammarSegment.String)
- {
- return ParsePostInstruction(token);
- }
- CastRuleSet<CharacterSetRule>().Encoding = ((StringBlock)token).Value;
- return true;
- }
- #endregion
- #region Import
- private bool ParseImport(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.String || token.GrammarSegment == GrammarSegment.Url)
- {
- CastRuleSet<ImportRule>().Href = ((StringBlock)token).Value;
- SetParsingContext(ParsingContext.InMediaList);
- return true;
- }
- SetParsingContext(ParsingContext.AfterInstruction);
- return false;
- }
- #endregion
- #region Font Face
- private bool ParseFontface(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.CurlyBraceOpen)
- {
- SetParsingContext(ParsingContext.InDeclaration);
- return true;
- }
- return false;
- }
- #endregion
- #region Keyframes
- private bool ParseKeyframesName(Block token)
- {
- //SetParsingContext(ParsingContext.BeforeKeyframesData);
- if (token.GrammarSegment == GrammarSegment.Ident)
- {
- CastRuleSet<KeyframesRule>().Identifier = ((SymbolBlock)token).Value;
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.CurlyBraceOpen)
- {
- SetParsingContext(ParsingContext.KeyframesData);
- return true;
- }
- return false;
- }
- private bool ParsePreKeyframesData(Block token)
- {
- if (token.GrammarSegment != GrammarSegment.CurlyBraceOpen)
- {
- return false;
- }
- SetParsingContext(ParsingContext.BeforeKeyframesData);
- return true;
- }
- private bool ParseKeyframesData(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.CurlyBracketClose)
- {
- SetParsingContext(ParsingContext.DataBlock);
- return FinalizeRule();
- }
- _buffer = new StringBuilder();
- return ParseKeyframeText(token);
- }
- private bool ParseKeyframeText(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.CurlyBraceOpen)
- {
- SetParsingContext(ParsingContext.InDeclaration);
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.CurlyBracketClose)
- {
- ParseKeyframesData(token);
- return false;
- }
- var frame = new KeyframeRule
- {
- Value = token.ToString()
- };
- CastRuleSet<KeyframesRule>().Declarations.Add(frame);
- _activeRuleSets.Push(frame);
- return true;
- }
- #endregion
- #region Page
- private bool ParsePageSelector(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.Colon || token.GrammarSegment == GrammarSegment.Whitespace)
- {
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.Ident)
- {
- CastRuleSet<PageRule>().Selector = new SimpleSelector(token.ToString());
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.CurlyBraceOpen)
- {
- SetParsingContext(ParsingContext.InDeclaration);
- return true;
- }
- return false;
- }
- #endregion
- #region Document
- private bool ParsePreDocumentFunction(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.Url:
- CastRuleSet<DocumentRule>().Conditions.Add(new KeyValuePair<DocumentFunction, string>(DocumentFunction.Url, ((StringBlock)token).Value));
- break;
- case GrammarSegment.UrlPrefix:
- CastRuleSet<DocumentRule>().Conditions.Add(new KeyValuePair<DocumentFunction, string>(DocumentFunction.UrlPrefix, ((StringBlock)token).Value));
- break;
- case GrammarSegment.Domain:
- CastRuleSet<DocumentRule>().Conditions.Add(new KeyValuePair<DocumentFunction, string>(DocumentFunction.Domain, ((StringBlock)token).Value));
- break;
- case GrammarSegment.Function:
- if (string.Compare(((SymbolBlock)token).Value, "regexp", StringComparison.OrdinalIgnoreCase) == 0)
- {
- SetParsingContext(ParsingContext.InDocumentFunction);
- return true;
- }
- SetParsingContext(ParsingContext.AfterDocumentFunction);
- return false;
- default:
- SetParsingContext(ParsingContext.DataBlock);
- return false;
- }
- SetParsingContext(ParsingContext.BetweenDocumentFunctions);
- return true;
- }
- private bool ParseDocumentFunction(Block token)
- {
- SetParsingContext(ParsingContext.AfterDocumentFunction);
- if (token.GrammarSegment != GrammarSegment.String) return false;
- CastRuleSet<DocumentRule>().Conditions.Add(new KeyValuePair<DocumentFunction, string>(DocumentFunction.RegExp, ((StringBlock)token).Value));
- return true;
- }
- private bool ParsePostDocumentFunction(Block token)
- {
- SetParsingContext(ParsingContext.BetweenDocumentFunctions);
- return token.GrammarSegment == GrammarSegment.ParenClose;
- }
- private bool ParseDocumentFunctions(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.Comma)
- {
- SetParsingContext(ParsingContext.BeforeDocumentFunction);
- return true;
- }
- if (token.GrammarSegment == GrammarSegment.CurlyBraceOpen)
- {
- SetParsingContext(ParsingContext.DataBlock);
- return true;
- }
- SetParsingContext(ParsingContext.DataBlock);
- return false;
- }
- #endregion
- #region Media
- private bool ParseMediaList(Block token)
- {
- if (token.GrammarSegment == GrammarSegment.Semicolon)
- {
- FinalizeRule();
- SetParsingContext(ParsingContext.DataBlock);
- return true;
- }
- _buffer = new StringBuilder();
- SetParsingContext(ParsingContext.InMediaValue);
- return ParseMediaValue(token);
- }
- private bool ParseMediaValue(Block token)
- {
- switch (token.GrammarSegment)
- {
- case GrammarSegment.CurlyBraceOpen:
- case GrammarSegment.Semicolon:
- {
- var container = CurrentRule as ISupportsMedia;
- var medium = _buffer.ToString();
- if (container != null)
- {
- container.Media.AppendMedium(medium);
- }
- if (CurrentRule is ImportRule)
- {
- return ParsePostInstruction(token);
- }
- SetParsingContext(ParsingContext.DataBlock);
- return token.GrammarSegment == GrammarSegment.CurlyBraceOpen;
- }
- case GrammarSegment.Comma:
- {
- var container = CurrentRule as ISupportsMedia;
- if (container != null)
- {
- container.Media.AppendMedium(_buffer.ToString());
- }
- _buffer.Length = 0;
- return true;
- }
- case GrammarSegment.Whitespace:
- {
- _buffer.Append(' ');
- return true;
- }
- default:
- {
- _buffer.Append(token);
- return true;
- }
- }
- }
- #endregion
- }
- }
- #pragma warning restore
|