public override bool Render(IInternalContextAdapter context, TextWriter writer) { bool result; if (this.referenceType == ReferenceType.Runt) { char[] array = this.rootString.ToCharArray(); writer.Write(array, 0, array.Length); result = true; } else { object obj = this.Execute(null, context); if (this.escaped) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(this.escPrefix); if (obj == null) { stringBuilder.Append("\\"); } stringBuilder.Append(this.nullString); char[] array = stringBuilder.ToString().ToCharArray(); writer.Write(array, 0, array.Length); result = true; } else { EventCartridge eventCartridge = context.EventCartridge; if (eventCartridge != null && this.referenceStack != null) { obj = eventCartridge.ReferenceInsert(this.referenceStack, this.nullString, obj); } if (obj == null) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(this.escPrefix); stringBuilder.Append(this.escPrefix); stringBuilder.Append(this.morePrefix); stringBuilder.Append(this.nullString); char[] array = stringBuilder.ToString().ToCharArray(); writer.Write(array, 0, array.Length); if (this.referenceType != ReferenceType.Quiet && this.rsvc.GetBoolean("runtime.log.invalid.references", true)) { this.rsvc.Warn(new ReferenceException("reference : template = " + context.CurrentTemplateName, this)); } result = true; } else { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(this.escPrefix); stringBuilder.Append(this.morePrefix); stringBuilder.Append(obj); char[] array = stringBuilder.ToString().ToCharArray(); writer.Write(array, 0, array.Length); result = true; } } } return(result); }
/// <summary> /// gets the value of the reference and outputs it to the /// writer. /// </summary> /// <param name="context"> context of data to use in getting value </param> /// <param name="writer"> writer to render to </param> public override bool Render(IInternalContextAdapter context, TextWriter writer) { if (referenceType == ReferenceType.Runt) { writer.Write(rootString); return(true); } Object value = Execute(null, context); // if this reference is escaped (\$foo) then we want to do one of two things : // 1) if this is a reference in the context, then we want to print $foo // 2) if not, then \$foo (its considered shmoo, not VTL) if (escaped) { StringBuilder b = new StringBuilder(); b.Append(escPrefix); if (value == null) { b.Append("\\"); } b.Append(nullString); writer.Write(b); return(true); } // the normal processing // if we have an event cartridge, get a new value object EventCartridge eventCartridge = context.EventCartridge; if (eventCartridge != null && referenceStack != null) { value = eventCartridge.ReferenceInsert(referenceStack, nullString, value); } // if value is null... if (value == null) { // write prefix twice, because it's shmoo, so the \ don't escape each other... StringBuilder b = new StringBuilder(); b.Append(escPrefix); b.Append(escPrefix); b.Append(morePrefix); b.Append(nullString); writer.Write(b); if (referenceType != ReferenceType.Quiet && runtimeServices.GetBoolean(RuntimeConstants.RUNTIME_LOG_REFERENCE_LOG_INVALID, true)) { runtimeServices.Warn( new ReferenceException(string.Format("reference : template = {0}", context.CurrentTemplateName), this)); } return(true); } else { // non-null processing StringBuilder b = new StringBuilder(); b.Append(escPrefix); b.Append(morePrefix); b.Append(value); writer.Write(b); return(true); } }