protected internal string Render(object value, string templateScript) { try { string json = value.ToJson(); StringBuilder script = CreateBaseScript(); script.Append("dust.loadSource(compiledSource);"); script.Append(@"dust.render(templateName, JSON.parse(jsonData), function(err, result){ error = err; output = result; })"); EcmaScript.NET.Context ctx = EcmaScript.NET.Context.Enter(); ScriptableObject scope = ctx.InitStandardObjects(); SetParameters(scope); ScriptableObject.PutProperty(scope, "jsonData", json); ScriptableObject.PutProperty(scope, "compiledSource", Regex.Unescape(templateScript)); ScriptableObject.PutProperty(scope, "error", null); ScriptableObject.PutProperty(scope, "output", ""); ctx.EvaluateString(scope, script.ToString(), "render", 0, null); object error = ScriptableObject.GetProperty(scope, "error"); if (error != null) { throw new InvalidOperationException("An error occurred during dust.render: " + error.ToString()); } string result = ((string)ScriptableObject.GetProperty(scope, "output")); return(Regex.Unescape(result)); } catch (Exception ex) { string sig = "An error occurred rendering template ({0}) : {1}"; string msg = ex.Message; this.Exception = Args.Exception <DustException>(sig, Name, msg); return(string.Format(sig, Name, msg)); } }
private void SetCompiledScript() { try { StringBuilder script = CreateBaseScript(); script.Append("compiledTemplate = dust.compile(templateSource, templateName);"); EcmaScript.NET.Context ctx = EcmaScript.NET.Context.Enter(); ScriptableObject scope = ctx.InitStandardObjects(); SetParameters(scope); ScriptableObject.PutProperty(scope, "compiledTemplate", null); ctx.EvaluateString(scope, script.ToString(), "Compile", 0, null); CompiledScript = (string)ScriptableObject.GetProperty(scope, "compiledTemplate"); SetCompiledTemplate(); } catch (Exception ex) { CompiledScript = string.Format("alert('An error occurred compiling {0}: {1}');", Name, ex.Message); Exception = Args.Exception <DustException>("An error occurred compiling script ({0}) :{1}", ex, Name, ex.Message); } }
/// <summary> Evaluate JavaScript source. /// /// </summary> /// <param name="cx">the current context /// </param> /// <param name="filename">the name of the file to compile, or null /// for interactive mode. /// </param> private void ProcessSource (Context cx, string filename) { if (filename == null) { Console.WriteLine ("EcmaScript.NET v" + typeof (Context).Assembly .GetName ().Version); ScriptOrFnNode script = null; string sourceName = "<stdin>"; int lineno = 1; bool hitEOF = false; do { int startline = lineno; Console.Error.Write ("js> "); Console.Error.Flush (); string source = ""; // Collect lines of source to compile. while (true) { string newline = Console.In.ReadLine (); if (newline == null) { hitEOF = true; break; } source = source + newline + "\n"; lineno++; // Continue collecting as long as more lines // are needed to complete the current // statement. stringIsCompilableUnit is also // true if the source statement will result in // any error other than one that might be // resolved by appending more source. if ((script = cx.IsCompilableUnit (source)) != null) break; } try { object result = cx.EvaluateString (this, source, sourceName, startline, (Object)null); if (result != Context.UndefinedValue) { Console.Error.WriteLine (ScriptConvert.ToString (result)); } } catch (Exception ex) { PrintException (ex); } if (quitting || resetting) { // The user executed the quit() function. break; } } while (!hitEOF); Console.Error.WriteLine (); } else { // Here we evalute the entire contents of the file as // a script. Text is printed only if the print() function // is called. using (StreamReader sr = new StreamReader (filename)) { try { cx.EvaluateReader (this, sr, filename, 1, null); } catch (Exception ex) { PrintException (ex); } } } GC.Collect (); }