#region Copyright and License
//
// Fizzler - CSS Selector Engine for Microsoft .NET Framework
// Copyright (c) 2009 Atif Aziz, Colin Ramsay. All rights reserved.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this library; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
#endregion
namespace Fizzler
{
using System;
///
/// An implementation that generates
/// human-readable description of the selector.
///
public class HumanReadableSelectorGenerator : ISelectorGenerator
{
private int _chainCount;
///
/// Initializes the text.
///
public virtual void OnInit()
{
Text = null;
}
///
/// Gets the generated human-readable description text.
///
public string Text { get; private set; }
///
/// Generates human-readable for a selector in a group.
///
public virtual void OnSelector()
{
if (string.IsNullOrEmpty(Text))
Text = "Take all";
else
Text += " and select them. Combined with previous, take all";
}
///
/// Concludes the text.
///
public virtual void OnClose()
{
Text = Text.Trim();
Text += " and select them.";
}
///
/// Adds to the generated human-readable text.
///
protected void Add(string selector)
{
if (selector == null) throw new ArgumentNullException("selector");
Text += selector;
}
///
/// Generates human-readable text of this type selector.
///
public void Type(NamespacePrefix prefix, string type)
{
Add(string.Format(" <{0}> elements", type));
}
///
/// Generates human-readable text of this universal selector.
///
public void Universal(NamespacePrefix prefix)
{
Add(" elements");
}
///
/// Generates human-readable text of this ID selector.
///
public void Id(string id)
{
Add(string.Format(" with an ID of '{0}'", id));
}
///
/// Generates human-readable text of this class selector.
///
void ISelectorGenerator.Class(string clazz)
{
Add(string.Format(" with a class of '{0}'", clazz));
}
///
/// Generates human-readable text of this attribute selector.
///
public void AttributeExists(NamespacePrefix prefix, string name)
{
Add(string.Format(" which have attribute {0} defined", name));
}
///
/// Generates human-readable text of this attribute selector.
///
public void AttributeExact(NamespacePrefix prefix, string name, string value)
{
Add(string.Format(" which have attribute {0} with a value of '{1}'", name, value));
}
///
/// Generates human-readable text of this attribute selector.
///
public void AttributeIncludes(NamespacePrefix prefix, string name, string value)
{
Add(string.Format(" which have attribute {0} that includes the word '{1}'", name, value));
}
///
/// Generates human-readable text of this attribute selector.
///
public void AttributeDashMatch(NamespacePrefix prefix, string name, string value)
{
Add(string.Format(" which have attribute {0} with a hyphen separated value matching '{1}'", name, value));
}
///
/// Generates human-readable text of this attribute selector.
///
public void AttributePrefixMatch(NamespacePrefix prefix, string name, string value)
{
Add(string.Format(" which have attribute {0} whose value begins with '{1}'", name, value));
}
///
/// Generates human-readable text of this attribute selector.
///
public void AttributeSuffixMatch(NamespacePrefix prefix, string name, string value)
{
Add(string.Format(" which have attribute {0} whose value ends with '{1}'", name, value));
}
///
/// Generates human-readable text of this attribute selector.
///
public void AttributeSubstring(NamespacePrefix prefix, string name, string value)
{
Add(string.Format(" which have attribute {0} whose value contains '{1}'", name, value));
}
///
/// Generates human-readable text of this pseudo-class selector.
///
public void FirstChild()
{
Add(" which are the first child of their parent");
}
///
/// Generates human-readable text of this pseudo-class selector.
///
public void LastChild()
{
Add(" which are the last child of their parent");
}
///
/// Generates human-readable text of this pseudo-class selector.
///
public void NthChild(int a, int b)
{
Add(string.Format(" where the element has {0}n+{1}-1 sibling before it", a, b));
}
///
/// Generates human-readable text of this pseudo-class selector.
///
public void OnlyChild()
{
Add(" where the element is the only child");
}
///
/// Generates human-readable text of this pseudo-class selector.
///
public void Empty()
{
Add(" where the element is empty");
}
///
/// Generates human-readable text of this combinator.
///
public void Child()
{
Add(", then take their immediate children which are");
}
///
/// Generates human-readable text of this combinator.
///
public void Descendant()
{
if (_chainCount > 0)
{
Add(". With those, take only their descendants which are");
}
else
{
Add(", then take their descendants which are");
_chainCount++;
}
}
///
/// Generates human-readable text of this combinator.
///
public void Adjacent()
{
Add(", then take their immediate siblings which are");
}
///
/// Generates a combinator,
/// which separates two sequences of simple selectors. The elements represented
/// by the two sequences share the same parent in the document tree and the
/// element represented by the first sequence precedes (not necessarily
/// immediately) the element represented by the second one.
///
public void GeneralSibling()
{
Add(", then take their siblings which are");
}
///
/// Generates human-readable text of this combinator.
///
public void NthLastChild(int a, int b)
{
Add(string.Format(" where the element has {0}n+{1}-1 sibling after it", a, b));
}
}
}