private void VisitRender(HxlRenderWorkElement element) { string parent = stack.Peek(); string slug = GenerateSlug(element); string renderName = NewVariable("_Render" + slug, false, true); string varName = SafeNewVariable(renderName); CurrentOutput.WriteLine("{0} = global::{2}.Create({1});", varName, renderName.TrimStart('_'), typeof(HxlElement).FullName); stack.Push(varName); PushRenderIsland(renderName.TrimStart('_')); element.WritePreLines(CurrentOutput); if (element.ChildNodes.Count > 0) { CurrentOutput.WriteLine(" __self.RenderBody();"); } element.WritePostLines(CurrentOutput); PopRenderIsland(); CurrentOutput.WriteLine("{0}.Append({1});", parent, varName); VisitAll(element.ChildNodes); stack.Pop(); }
private void ClearLiteralCache() { if (literalCache.Length > 0) { CurrentOutput.WriteLine("base.Write(\"{0}\");", literalCache); literalCache.Length = 0; } }
protected override void VisitAttribute(DomAttribute attribute) { string parent = stack.Peek(); CurrentOutput.WriteLine("{0}.Attribute(\"{1}\", \"{2}\");", parent, CodeUtility.Escape(attribute.Name), CodeUtility.Escape(attribute.Value)); }
protected override void VisitText(HxlTextElement element) { // These should have been converted to render islands, BUT there are a few // cases where we want to keep an object: // - parent is retained (easier to work with) // - only writing a space or tab (no need for the overhead) string parent = stack.Peek(); CurrentOutput.WriteLine("{0}.AppendText(\"{1}\");", parent, CodeUtility.Escape(element.Data)); }
protected override void VisitDocumentType(DomDocumentType documentType) { string varName = SafeNewVariable(documentType.Name); CurrentOutput.WriteLine( "{0} = this.__document.CreateDocumentType(\"{1}\", \"{2}\", \"{3}\");", varName, documentType.Name, documentType.PublicId, documentType.SystemId); DoAppend(varName); }
protected override void VisitElement(DomElement element) { string varName = SafeNewVariable(element.Name); CurrentOutput.WriteLine( "{1} = this.__document.CreateElement(\"{0}\");", element.Name, varName); foreach (var m in element.Annotations <IRenderWorkElementCodeBuilder>()) { m.EmitCode(output, varName, element); } DoChildVisit(element, varName); DoAppend(varName); }
private string SafeNewVariable(string suffix, bool isAttr = false) { string result; suffix = CodeUtility.Slug(suffix); if (stack.Count <= 1) { CurrentOutput.WriteLine(); result = NewVariable("root_" + suffix, isAttr); } else { string variable = stack.Peek(); result = NewVariable(string.Format("{0}_{1}", variable, suffix), isAttr); } return(result); }
protected override void VisitText(DomText text) { string parent = stack.Peek(); CurrentOutput.WriteLine("{0}.AppendText(\"{1}\");", parent, CodeUtility.Escape(text.Data)); }
private void DoAppend(string variable) { CurrentOutput.Write("{0}.Append({1});", stack.Peek(), variable); CurrentOutput.WriteLine(); }
protected void EmitCode(string str) { ClearLiteralCache(); CurrentOutput.WriteLine(str); }