// /** // * 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; } } }