Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
rytmis committed Apr 17, 2015
2 parents 5b45c18 + 1b4a966 commit c008310
Show file tree
Hide file tree
Showing 14 changed files with 122 additions and 58 deletions.
1 change: 0 additions & 1 deletion default.ps1
Expand Up @@ -287,7 +287,6 @@ task NuGetPackage -depends Merge {

Copy-Item $build_dir\Dotless.nuspec $target
Copy-Item $source_dir\web.config.install.xdt $target\content\
Copy-Item $source_dir\web.config.uninstall.xdt $target\content\
Copy-Item $build_dir\dotless.Core.dll $target\lib\
Copy-Item $build_dir\dotless.Core.pdb $target\lib\
Copy-Item $build_dir\dotless.compiler.exe $target\tool\
Expand Down
2 changes: 2 additions & 0 deletions src/dotless.Compiler/Program.cs
@@ -1,4 +1,5 @@
using System.Diagnostics;
using dotless.Core.Loggers;

namespace dotless.Compiler
{
Expand All @@ -22,6 +23,7 @@ public static int Main(string[] args)
arguments.AddRange(args);

var configuration = GetConfigurationFromArguments(arguments);
configuration.LogLevel = LogLevel.Warn;

if(configuration.Help)
return -1;
Expand Down
19 changes: 19 additions & 0 deletions src/dotless.Core/Engine/LessEngine.cs
@@ -1,4 +1,7 @@
using dotless.Core.Parser;
using dotless.Core.Parser.Tree;
using dotless.Core.Plugins;
using dotless.Core.Stylizers;

namespace dotless.Core
{
Expand Down Expand Up @@ -93,6 +96,22 @@ public string TransformToCss(string source, string fileName)

var css = tree.ToCSS(env);

var stylizer = new PlainStylizer();

foreach (var unmatchedExtension in env.FindUnmatchedExtensions()) {
Logger.Warn("Warning: extend '{0}' has no matches {1}\n",
unmatchedExtension.BaseSelector.ToCSS(env).Trim(),
stylizer.Stylize(new Zone(unmatchedExtension.Extend.Location)).Trim());
}

tree.Accept(DelegateVisitor.For<Media>(m => {
foreach (var unmatchedExtension in m.FindUnmatchedExtensions()) {
Logger.Warn("Warning: extend '{0}' has no matches {1}\n",
unmatchedExtension.BaseSelector.ToCSS(env).Trim(),
stylizer.Stylize(new Zone(unmatchedExtension.Extend.Location)).Trim());
}
}));

LastTransformationSuccessful = true;
return css;
}
Expand Down
2 changes: 1 addition & 1 deletion src/dotless.Core/Loggers/ConsoleLogger.cs
Expand Up @@ -8,7 +8,7 @@ public class ConsoleLogger : Logger

protected override void Log(string message)
{
Console.Write(message);
Console.WriteLine(message);
}
}
}
8 changes: 6 additions & 2 deletions src/dotless.Core/Parser/Infrastructure/Env.cs
Expand Up @@ -367,7 +367,7 @@ public void AddExtension(Selector selector, Extend extends, Env env)
Extender match = null;
if ((match = _extensions.OfType<ExactExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null)
{
match = new ExactExtender(extending);
match = new ExactExtender(extending, extends);
_extensions.Add(match);
}

Expand All @@ -379,7 +379,7 @@ public void AddExtension(Selector selector, Extend extends, Env env)
Extender match = null;
if ((match = _extensions.OfType<PartialExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null)
{
match = new PartialExtender(extending);
match = new PartialExtender(extending, extends);
_extensions.Add(match);
}

Expand All @@ -395,6 +395,10 @@ public void AddExtension(Selector selector, Extend extends, Env env)
_extensions.AddRange(child._extensions);
}

public IEnumerable<Extender> FindUnmatchedExtensions() {
return _extensions.Where(e => !e.IsMatched);
}

public ExactExtender FindExactExtension(string selection)
{
if (ExtendMediaScope.Any())
Expand Down
23 changes: 21 additions & 2 deletions src/dotless.Core/Parser/Infrastructure/Extender.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Linq;
using System.Text;
using System.Threading;
Expand All @@ -10,15 +11,25 @@ namespace dotless.Core.Parser.Infrastructure
{
public class ExactExtender : Extender
{
public ExactExtender(Selector baseSelector):base(baseSelector)
[Obsolete("Use the overload that accepts the Extend node")]
public ExactExtender(Selector baseSelector) : this(baseSelector, null)
{

}
public ExactExtender(Selector baseSelector, Extend extend) : base(baseSelector, extend)
{

}
}

public class PartialExtender : Extender
{
public PartialExtender(Selector baseSelector):base(baseSelector)
[Obsolete("Use the overload that accepts the Extend node")]
public PartialExtender(Selector baseSelector) : this(baseSelector, null)
{

}
public PartialExtender(Selector baseSelector, Extend extend) : base(baseSelector, extend)
{

}
Expand Down Expand Up @@ -79,14 +90,22 @@ public class Extender
public Selector BaseSelector { get; private set; }
public List<Selector> ExtendedBy { get; private set; }
public bool IsReference { get; set; }
public bool IsMatched { get; set; }
public Extend Extend { get; private set; }

[Obsolete("Use the overload that accepts the Extend node")]
public Extender(Selector baseSelector)
{
BaseSelector = baseSelector;
ExtendedBy = new List<Selector>();
IsReference = baseSelector.IsReference;
}

public Extender(Selector baseSelector, Extend extend) : this(baseSelector)
{
Extend = extend;
}

public static string FullPathSelector()
{
throw new NotImplementedException();
Expand Down
28 changes: 12 additions & 16 deletions src/dotless.Core/Parser/Parsers.cs
Expand Up @@ -983,6 +983,7 @@ public Element Element(Parser parser)
Node e = ExtendRule(parser)
|| NonPseudoClassSelector(parser)
|| PseudoClassSelector(parser)
|| PseudoElementSelector(parser)
|| parser.Tokenizer.Match('*')
|| parser.Tokenizer.Match('&')
|| Attribute(parser)
Expand Down Expand Up @@ -1019,6 +1020,10 @@ public Element Element(Parser parser)
return parser.Tokenizer.Match(@":(\\.|[a-zA-Z0-9_-])+");
}

private static RegexMatchResult PseudoElementSelector(Parser parser) {
return parser.Tokenizer.Match(@"::(\\.|[a-zA-Z0-9_-])+");
}

private Node NonPseudoClassSelector(Parser parser) {
var memo = Remember(parser);
var match = parser.Tokenizer.Match(@"[.#]?(\\.|[a-zA-Z0-9_-])+");
Expand Down Expand Up @@ -1050,7 +1055,7 @@ public Combinator Combinator(Parser parser)
var index = parser.Tokenizer.Location.Index;

Node match;
if (match = parser.Tokenizer.Match(@"[+>~]") || parser.Tokenizer.Match(@"::"))
if (match = parser.Tokenizer.Match(@"[+>~]"))
return NodeProvider.Combinator(match.ToString(), parser.Tokenizer.GetNodeLocation(index));

return NodeProvider.Combinator(char.IsWhiteSpace(parser.Tokenizer.GetPreviousCharIgnoringComments()) ? " " : null, parser.Tokenizer.GetNodeLocation(index));
Expand Down Expand Up @@ -1161,23 +1166,14 @@ public Ruleset Ruleset(Parser parser)
var memo = Remember(parser);
var index = memo.TokenizerLocation.Index;

if (parser.Tokenizer.Peek(@"([a-z.#: _-]+)[\s\n]*\{")) //simple case with no comments
{
var match = parser.Tokenizer.Match(@"[a-z.#: _-]+");
var s = NodeProvider.Selector(new NodeList<Element>(NodeProvider.Element(null, match, parser.Tokenizer.GetNodeLocation(index))), parser.Tokenizer.GetNodeLocation(index));
selectors = new NodeList<Selector>(s);
}
else
Selector s;
while (s = Selector(parser))
{
Selector s;
while (s = Selector(parser))
{
selectors.Add(s);
if (!parser.Tokenizer.Match(','))
break;
selectors.Add(s);
if (!parser.Tokenizer.Match(','))
break;

GatherComments(parser);
}
GatherComments(parser);
}

NodeList rules;
Expand Down
2 changes: 1 addition & 1 deletion src/dotless.Core/Parser/Tree/Extend.cs
Expand Up @@ -41,7 +41,7 @@ public override Node Evaluate(Env env)
newPartial.Add(selector);
}

return new Extend(newExact,newPartial) { IsReference = IsReference };
return new Extend(newExact,newPartial) { IsReference = IsReference, Location = Location };
}

public override void AppendCSS(Env env)
Expand Down
7 changes: 5 additions & 2 deletions src/dotless.Core/Parser/Tree/Media.cs
Expand Up @@ -268,7 +268,7 @@ public void AddExtension(Selector selector, Extend extends, Env env)
Extender match = null;
if ((match = Extensions.OfType<ExactExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null)
{
match = new ExactExtender(extending);
match = new ExactExtender(extending, extends);
Extensions.Add(match);
}

Expand All @@ -280,13 +280,16 @@ public void AddExtension(Selector selector, Extend extends, Env env)
Extender match = null;
if ((match = Extensions.OfType<PartialExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null)
{
match = new PartialExtender(extending);
match = new PartialExtender(extending, extends);
Extensions.Add(match);
}

match.AddExtension(selector, env);
}
}
public IEnumerable<Extender> FindUnmatchedExtensions() {
return Extensions.Where(e => !e.IsMatched);
}

public ExactExtender FindExactExtension(string selection)
{
Expand Down
13 changes: 9 additions & 4 deletions src/dotless.Core/Parser/Tree/Ruleset.cs
@@ -1,3 +1,4 @@
using System;
using dotless.Core.Exceptions;

namespace dotless.Core.Parser.Tree
Expand Down Expand Up @@ -462,17 +463,21 @@ public virtual void AppendCSS(Env env, Context context)
var local = context.Clone();
local.AppendSelectors(context, new[] {s});
var finalString = local.ToCss(env);
var extensions = env.FindExactExtension(finalString);
if (extensions != null) {
paths.AppendSelectors(context.Clone(), extensions.ExtendedBy);
var exactExtension = env.FindExactExtension(finalString);
if (exactExtension != null) {
exactExtension.IsMatched = true;
paths.AppendSelectors(context.Clone(), exactExtension.ExtendedBy);
}

var partials = env.FindPartialExtensions(local);
if (partials != null) {
foreach (var partialExtension in partials) {
partialExtension.IsMatched = true;
}
paths.AppendSelectors(context.Clone(), partials.SelectMany(p => p.Replacements(finalString)));
}

bool newExactExtenders = extensions != null && extensions.ExtendedBy.Any(e => !e.IsReference);
bool newExactExtenders = exactExtension != null && exactExtension.ExtendedBy.Any(e => !e.IsReference);
bool newPartialExtenders = partials != null && partials.Any(p => p.ExtendedBy.Any(e => !e.IsReference));

if (newExactExtenders || newPartialExtenders) {
Expand Down
22 changes: 20 additions & 2 deletions src/dotless.Core/Plugins/DelegateVisitor.cs
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using dotless.Core.Parser.Infrastructure.Nodes;

namespace dotless.Core.Plugins
Expand All @@ -12,8 +13,13 @@ public DelegateVisitor(Func<Node, Node> visitor)
this.visitor = visitor;
}

public Node Visit(Node node)
{
public Node Visit(Node node) {
var list = node as IList<Node>;
if (list != null) {
for (var i = 0; i < list.Count; i++) {
list[i] = Visit(list[i]);
}
}
return visitor(node);
}

Expand All @@ -29,5 +35,17 @@ public Node Visit(Node node)
return projection(typed);
});
}
public static IVisitor For<TNode>(Action<TNode> action) where TNode : Node
{
return new DelegateVisitor(node =>
{
var typed = node as TNode;
if (typed != null)
{
action(typed);
}
return node;
});
}
}
}
21 changes: 20 additions & 1 deletion src/dotless.Test/Specs/ExtendFixture.cs
Expand Up @@ -482,6 +482,25 @@ public void PartialExtendWithRuleDefinedInMediaBlock()
} ";

AssertLess(input, expected);
}
}


[Test]
public void PartialExtendWithElementSelector() {
var input = @"
ul li {
list-style-type: none;
}
.foo:extend(li all) { }
";
var expected = @"
ul li,
ul .foo {
list-style-type: none;
}";

AssertLess(input, expected);
}
}
}
12 changes: 6 additions & 6 deletions src/web.config.install.xdt
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections xdt:Transform="InsertIfMissing">
<section name="dotless" type="dotless.Core.configuration.DotlessConfigurationSectionHandler, dotless.Core" xdt:Transform="InsertIfMissing" />
<section name="dotless" type="dotless.Core.configuration.DotlessConfigurationSectionHandler, dotless.Core" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" />
</configSections>

<dotless minifyCss="false" cache="true" web="false" strictMath="false" xdt:Transform="InsertIfMissing" />

<system.webServer>
<system.webServer xdt:Transform="InsertIfMissing">
<handlers xdt:Transform="InsertIfMissing">
<add name="dotless" path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler,dotless.Core" resourceType="File" preCondition="" xdt:Transform="InsertIfMissing" />
<add name="dotless" path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler,dotless.Core" resourceType="File" preCondition="" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" />
</handlers>
</system.webServer>

<system.web>
<system.web xdt:Transform="InsertIfMissing">
<httpHandlers xdt:Transform="InsertIfMissing">
<add path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler, dotless.Core" xdt:Transform="InsertIfMissing" />
<add path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler, dotless.Core" xdt:Transform="InsertIfMissing" xdt:Locator="Match(path, verb)" />
</httpHandlers>
</system.web>
</configuration>
20 changes: 0 additions & 20 deletions src/web.config.uninstall.xdt

This file was deleted.

0 comments on commit c008310

Please sign in to comment.