ln.templates/ln.templates/TemplateReader.cs

105 lines
3.1 KiB
C#
Raw Permalink Normal View History

// /**
// * File: TemplateReader.cs
// * Author: haraldwolff
// *
// * This file and it's content is copyrighted by the Author and / or copyright holder.
// * Any use wihtout proper permission is illegal and may lead to legal actions.
// *
// *
// **/
using System;
2020-11-18 00:25:16 +01:00
using System.IO;
using System.Net;
using ln.templates.html;
2020-11-18 00:25:16 +01:00
namespace ln.templates
{
public class TemplateReader : ElementReader
2020-11-18 00:25:16 +01:00
{
public virtual TemplateDocument TemplateDocument => Document as TemplateDocument;
2020-11-18 00:25:16 +01:00
protected TemplateReader()
2020-11-18 00:25:16 +01:00
{
}
public override DocumentElement CreateDocument() => new TemplateDocument();
public override Element CreateElement(string tagName) => TemplateElement.Create(tagName);
public override void CloseTag(string tagName)
2020-11-18 00:25:16 +01:00
{
Element saveCurrentElement = CurrentElement;
base.CloseTag(tagName);
if (saveCurrentElement.HasAttribute("v-slot") && (saveCurrentElement.Parent is TemplateElement parentElement))
{
parentElement.SetSlot(saveCurrentElement.GetAttribute("v-slot"), saveCurrentElement);
parentElement.RemoveChild(saveCurrentElement);
saveCurrentElement.RemoveAttribute("v-slot");
}
}
2020-11-18 00:25:16 +01:00
public override void Text(string text)
{
if (text.Contains("{{"))
2020-11-18 00:25:16 +01:00
{
int pOpen = 0;
int pClose = 0;
2020-11-18 00:25:16 +01:00
while (pOpen < text.Length)
2020-11-18 00:25:16 +01:00
{
pOpen = text.IndexOf("{{", pClose);
if (pOpen == -1)
pOpen = text.Length;
string preText = text.Substring(pClose, pOpen - pClose);
if (preText.Length > 0)
2020-11-18 00:25:16 +01:00
{
CurrentElement.AppendChild(CreateTextElement(preText));
2020-11-18 00:25:16 +01:00
}
if (pOpen == text.Length)
break;
2020-11-18 00:25:16 +01:00
pOpen += 2;
2020-11-18 00:25:16 +01:00
pClose = text.IndexOf("}}", pOpen);
if (pClose == -1)
throw new FormatException("missing }}");
string expr = text.Substring(pOpen, pClose - pOpen);
2020-11-18 00:25:16 +01:00
pClose += 2;
CurrentElement.AppendChild(new ExpressionElement(expr));
}
} else
2020-11-18 00:25:16 +01:00
{
CurrentElement.AppendChild(
CreateTextElement(text)
);
2020-11-18 00:25:16 +01:00
}
}
public static TemplateDocument Parse(string source)
2020-11-18 00:25:16 +01:00
{
using (StringReader reader = new StringReader(source))
return ReadTemplate(reader);
2020-11-18 00:25:16 +01:00
}
public static TemplateDocument ReadTemplate(string filename)
2020-11-18 00:25:16 +01:00
{
using (StreamReader reader = new StreamReader(filename))
return ReadTemplate(reader);
2020-11-18 00:25:16 +01:00
}
public static TemplateDocument ReadTemplate(TextReader reader)
2020-11-18 00:25:16 +01:00
{
var templateReader = new TemplateReader();
templateReader.Read(reader);
return templateReader.TemplateDocument;
2020-11-18 00:25:16 +01:00
}
2020-11-18 00:25:16 +01:00
}
}