public void AddExtension(Selector selector, Extend extends, Env env) { foreach (var extending in extends.Exact) { Extender match = null; if ((match = Extensions.OfType<ExactExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null) { match = new ExactExtender(extending, extends); Extensions.Add(match); } match.AddExtension(selector, env); } foreach (var extending in extends.Partial) { Extender match = null; if ((match = Extensions.OfType<PartialExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null) { match = new PartialExtender(extending, extends); Extensions.Add(match); } match.AddExtension(selector, env); } }
public List<Closure> Find(Env env, Selector selector, Ruleset self) { self = self ?? this; var rules = new List<Closure>(); var key = selector.ToCSS(env); if (_lookups.ContainsKey(key)) return _lookups[key]; foreach (var rule in Rulesets().Where(rule => rule != self)) { if (rule.Selectors && rule.Selectors.Any(selector.Match)) { if (selector.Elements.Count > 1) { var remainingSelectors = new Selector(new NodeList<Element>(selector.Elements.Skip(1))); var closures = rule.Find(env, remainingSelectors, self); foreach (var closure in closures) { closure.Context.Insert(0, rule); } rules.AddRange(closures); } else rules.Add(new Closure { Ruleset = rule, Context = new List<Ruleset> { rule } }); } } return _lookups[key] = rules; }
public override void Accept(IVisitor visitor) { Selector = VisitAndReplace(Selector, visitor); foreach (var a in Arguments) { a.Value = VisitAndReplace(a.Value, visitor); } }
public void AddExtension(Selector selector, Env env) { var path = new List<Selector>(); path.Add(selector); foreach (var f in env.Frames.Skip(1)) { var partialSelector = f.Selectors.FirstOrDefault(); if (partialSelector != null) { path.Add(partialSelector); } } ExtendedBy.Add(new Selector(new[] { new Element(null, path.Select(p => p.ToCSS(env)).Reverse().JoinStrings("").Trim()) })); }
public override Node Evaluate(Env env) { NodeList<Element> evaldElements = new NodeList<Element>(); foreach (Element element in Elements) { if (element.NodeValue is Extend) { if (env.MediaPath.Any()) { env.MediaPath.Peek().AddExtension(this, (Extend)(((Extend)element.NodeValue).Evaluate(env)),env); } else //Global extend { env.AddExtension(this, (Extend)(((Extend)element.NodeValue).Evaluate(env)), env); } } else { evaldElements.Add(element.Evaluate(env) as Element); } } var evaluatedSelector = new Selector(evaldElements).ReducedFrom<Selector>(this); if (evaluatedSelector.Elements.All(e => e.NodeValue == null)) { return evaluatedSelector; } parser.Tokenizer.SetupInput(evaluatedSelector.ToCSS(env), ""); var result = new NodeList<Selector>(); Selector selector; while (selector = parsers.Selector(parser)) { selector.IsReference = IsReference; result.Add(selector.Evaluate(env) as Selector); if (!parser.Tokenizer.Match(',')) { break; } } return result; }
public override Node Evaluate(Env env) { var newExact = new List<Selector>(); foreach (var e in Exact) { var childContext = env.CreateChildEnv(); e.AppendCSS(childContext); var selector = new Selector(new []{new Element(e.Elements.First().Combinator,childContext.Output.ToString().Trim())}); selector.IsReference = IsReference; newExact.Add(selector); } var newPartial = new List<Selector>(); foreach (var e in Partial) { var childContext = env.CreateChildEnv(); e.AppendCSS(childContext); var selector = new Selector(new[] { new Element(e.Elements.First().Combinator, childContext.Output.ToString().Trim()) }); selector.IsReference = IsReference; newPartial.Add(selector); } return new Extend(newExact,newPartial) { IsReference = IsReference, Location = Location }; }
public void AddExtension(Selector selector, Env env) { var selectorPath = new List<IEnumerable<Selector>> {new [] {selector} }; selectorPath.AddRange(env.Frames.Skip(1).Select(f => f.Selectors.Where(partialSelector => partialSelector != null))); ExtendedBy.Add(GenerateExtenderSelector(env, selectorPath)); }
private static bool _AnyMatch(NodeList<Selector> selectors, Selector other) { for (var i = 0; i < selectors.Count; i++) { if (selectors[i].Match(other)) { return true; } } return false; }
public PartialExtender(Selector baseSelector, Extend extend) : base(baseSelector, extend) { }
public Extender(Selector baseSelector) { BaseSelector = baseSelector; ExtendedBy = new List<Selector>(); IsReference = baseSelector.IsReference; }
public MixinCall(NodeList<Element> elements, List<NamedArgument> arguments) { Selector = new Selector(elements); Arguments = arguments; }
public List<Closure> Find(Env env, Selector selector, Ruleset self) { self = self ?? this; var rules = new List<Closure>(); var key = selector.ToCSS(env); if (_lookups.ContainsKey(key)) return _lookups[key]; for(var x = 0; x < Rulesets.Count; x++) { var rule = Rulesets[x]; if (rule == self) continue; if(rule.Selectors && _AnyMatch(rule.Selectors, selector)) { if (selector.Elements.Count > 1) { var remainingSelectors = new Selector(new NodeList<Element>(selector.Elements.Skip(1))); var closures = rule.Find(env, remainingSelectors, self); for (var i = 0; i < closures.Count; i++) { var closure = closures[i]; closure.Context.Insert(0, rule); } rules.AddRange(closures); } else { rules.Add(new Closure { Ruleset = rule, Context = new List<Ruleset> { rule } }); } } } return _lookups[key] = rules; }
public MixinCall(NodeList<Element> elements, List<NamedArgument> arguments, bool important) { Important = important; Selector = new Selector(elements); Arguments = arguments; }
public ExactExtender(Selector baseSelector):base(baseSelector) { }
public Extender(Selector baseSelector, Extend extend) : this(baseSelector) { Extend = extend; }
public PartialExtender(Selector baseSelector):base(baseSelector) { }
public Extender(Selector baseSelector) { BaseSelector = baseSelector; ExtendedBy = new List<Selector>(); }
public MixinCall(NodeList<Element> elements, NodeList<Expression> arguments) { Selector = new Selector(elements); Arguments = arguments; }
public ExactExtender(Selector baseSelector) : this(baseSelector, null) { }
public ExactExtender(Selector baseSelector, Extend extend) : base(baseSelector, extend) { }
public PartialExtender(Selector baseSelector) : this(baseSelector, null) { }
public bool Match(Selector other) { return other.Elements.Count <= Elements.Count && Elements[0].Value == other.Elements[0].Value; }
public bool Match(Selector other) { return (other.Elements.Count <= Elements.Count && Elements[0].Value == other.Elements[0].Value); }