100 lines
3.2 KiB
C#
100 lines
3.2 KiB
C#
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
|
|
|
using System;
|
|
using System.Xml;
|
|
using System.Xml.Schema;
|
|
|
|
namespace ICSharpCode.AvalonEdit.Highlighting.Xshd
|
|
{
|
|
/// <summary>
|
|
/// Static class with helper methods to load XSHD highlighting files.
|
|
/// </summary>
|
|
public static class HighlightingLoader
|
|
{
|
|
#region XSHD loading
|
|
/// <summary>
|
|
/// Lodas a syntax definition from the xml reader.
|
|
/// </summary>
|
|
public static XshdSyntaxDefinition LoadXshd(XmlReader reader)
|
|
{
|
|
return LoadXshd(reader, false);
|
|
}
|
|
|
|
internal static XshdSyntaxDefinition LoadXshd(XmlReader reader, bool skipValidation)
|
|
{
|
|
if (reader == null)
|
|
throw new ArgumentNullException("reader");
|
|
try {
|
|
reader.MoveToContent();
|
|
if (reader.NamespaceURI == V2Loader.Namespace) {
|
|
return V2Loader.LoadDefinition(reader, skipValidation);
|
|
} else {
|
|
return V1Loader.LoadDefinition(reader, skipValidation);
|
|
}
|
|
} catch (XmlSchemaException ex) {
|
|
throw WrapException(ex, ex.LineNumber, ex.LinePosition);
|
|
} catch (XmlException ex) {
|
|
throw WrapException(ex, ex.LineNumber, ex.LinePosition);
|
|
}
|
|
}
|
|
|
|
static Exception WrapException(Exception ex, int lineNumber, int linePosition)
|
|
{
|
|
return new HighlightingDefinitionInvalidException(FormatExceptionMessage(ex.Message, lineNumber, linePosition), ex);
|
|
}
|
|
|
|
internal static string FormatExceptionMessage(string message, int lineNumber, int linePosition)
|
|
{
|
|
if (lineNumber <= 0)
|
|
return message;
|
|
else
|
|
return "Error at position (line " + lineNumber + ", column " + linePosition + "):\n" + message;
|
|
}
|
|
|
|
internal static XmlReader GetValidatingReader(XmlReader input, bool ignoreWhitespace, XmlSchemaSet schemaSet)
|
|
{
|
|
XmlReaderSettings settings = new XmlReaderSettings();
|
|
settings.CloseInput = true;
|
|
settings.IgnoreComments = true;
|
|
settings.IgnoreWhitespace = ignoreWhitespace;
|
|
if (schemaSet != null) {
|
|
settings.Schemas = schemaSet;
|
|
settings.ValidationType = ValidationType.Schema;
|
|
}
|
|
return XmlReader.Create(input, settings);
|
|
}
|
|
|
|
internal static XmlSchemaSet LoadSchemaSet(XmlReader schemaInput)
|
|
{
|
|
XmlSchemaSet schemaSet = new XmlSchemaSet();
|
|
schemaSet.Add(null, schemaInput);
|
|
schemaSet.ValidationEventHandler += delegate(object sender, ValidationEventArgs args) {
|
|
throw new HighlightingDefinitionInvalidException(args.Message);
|
|
};
|
|
return schemaSet;
|
|
}
|
|
#endregion
|
|
|
|
#region Load Highlighting from XSHD
|
|
/// <summary>
|
|
/// Creates a highlighting definition from the XSHD file.
|
|
/// </summary>
|
|
public static IHighlightingDefinition Load(XshdSyntaxDefinition syntaxDefinition, IHighlightingDefinitionReferenceResolver resolver)
|
|
{
|
|
if (syntaxDefinition == null)
|
|
throw new ArgumentNullException("syntaxDefinition");
|
|
return new XmlHighlightingDefinition(syntaxDefinition, resolver);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a highlighting definition from the XSHD file.
|
|
/// </summary>
|
|
public static IHighlightingDefinition Load(XmlReader reader, IHighlightingDefinitionReferenceResolver resolver)
|
|
{
|
|
return Load(LoadXshd(reader), resolver);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|