ln.templates/ln.templates/TemplateReader.cs

105 lines
3.1 KiB
C#

// /**
// * 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;
using System.IO;
using System.Net;
using ln.templates.html;
namespace ln.templates
{
public class TemplateReader : ElementReader
{
public virtual TemplateDocument TemplateDocument => Document as TemplateDocument;
protected TemplateReader()
{
}
public override DocumentElement CreateDocument() => new TemplateDocument();
public override Element CreateElement(string tagName) => TemplateElement.Create(tagName);
public override void CloseTag(string tagName)
{
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");
}
}
public override void Text(string text)
{
if (text.Contains("{{"))
{
int pOpen = 0;
int pClose = 0;
while (pOpen < text.Length)
{
pOpen = text.IndexOf("{{", pClose);
if (pOpen == -1)
pOpen = text.Length;
string preText = text.Substring(pClose, pOpen - pClose);
if (preText.Length > 0)
{
CurrentElement.AppendChild(CreateTextElement(preText));
}
if (pOpen == text.Length)
break;
pOpen += 2;
pClose = text.IndexOf("}}", pOpen);
if (pClose == -1)
throw new FormatException("missing }}");
string expr = text.Substring(pOpen, pClose - pOpen);
pClose += 2;
CurrentElement.AppendChild(new ExpressionElement(expr));
}
} else
{
CurrentElement.AppendChild(
CreateTextElement(text)
);
}
}
public static TemplateDocument Parse(string source)
{
using (StringReader reader = new StringReader(source))
return ReadTemplate(reader);
}
public static TemplateDocument ReadTemplate(string filename)
{
using (StreamReader reader = new StreamReader(filename))
return ReadTemplate(reader);
}
public static TemplateDocument ReadTemplate(TextReader reader)
{
var templateReader = new TemplateReader();
templateReader.Read(reader);
return templateReader.TemplateDocument;
}
}
}