4 changed files with 150 additions and 6 deletions
@ -0,0 +1,83 @@ |
|||||
|
// Copyright (c) The Perspex Project. All rights reserved.
|
||||
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
||||
|
|
||||
|
using System; |
||||
|
using Perspex.Styling; |
||||
|
using Sprache; |
||||
|
|
||||
|
namespace Perspex.Markup.Xaml.Parsers |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Parses a <see cref="Selector"/> from text.
|
||||
|
/// </summary>
|
||||
|
public class SelectorParser |
||||
|
{ |
||||
|
private Func<string, string, Type> _typeResolver; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="SelectorParser"/> class.
|
||||
|
/// </summary>
|
||||
|
/// <param name="typeResolver">
|
||||
|
/// The type resolver to use. The type resolver is a function which accepts two strings:
|
||||
|
/// a type name and a XML namespace prefix and a type name, and should return the resolved
|
||||
|
/// type or throw an exception.
|
||||
|
/// </param>
|
||||
|
public SelectorParser(Func<string, string, Type> typeResolver) |
||||
|
{ |
||||
|
this._typeResolver = typeResolver; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Parses a <see cref="Selector"/> from a string.
|
||||
|
/// </summary>
|
||||
|
/// <param name="s">The string.</param>
|
||||
|
/// <returns>The parsed selector.</returns>
|
||||
|
public Selector Parse(string s) |
||||
|
{ |
||||
|
var syntax = SelectorGrammar.Selector.Parse(s); |
||||
|
var result = new Selector(); |
||||
|
|
||||
|
foreach (var i in syntax) |
||||
|
{ |
||||
|
var ofType = i as SelectorGrammar.OfTypeSyntax; |
||||
|
var @class = i as SelectorGrammar.ClassSyntax; |
||||
|
var name = i as SelectorGrammar.NameSyntax; |
||||
|
var property = i as SelectorGrammar.PropertySyntax; |
||||
|
var child = i as SelectorGrammar.ChildSyntax; |
||||
|
var descendent = i as SelectorGrammar.DescendentSyntax; |
||||
|
var template = i as SelectorGrammar.TemplateSyntax; |
||||
|
|
||||
|
if (ofType != null) |
||||
|
{ |
||||
|
result = result.OfType(_typeResolver(ofType.TypeName, ofType.Xmlns)); |
||||
|
} |
||||
|
else if (@class != null) |
||||
|
{ |
||||
|
result = result.Class(@class.Class); |
||||
|
} |
||||
|
else if (name != null) |
||||
|
{ |
||||
|
result = result.Name(name.Name); |
||||
|
} |
||||
|
else if (property != null) |
||||
|
{ |
||||
|
throw new NotImplementedException(); |
||||
|
} |
||||
|
else if (child != null) |
||||
|
{ |
||||
|
result = result.Child(); |
||||
|
} |
||||
|
else if (descendent != null) |
||||
|
{ |
||||
|
result = result.Descendent(); |
||||
|
} |
||||
|
else if (template != null) |
||||
|
{ |
||||
|
result = result.Template(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue