Exemplo n.º 1
0
        public void EvaluateContent(XDoc script, DekiScriptEnv env, DekiScriptEvalMode mode, out bool scripted) {
            scripted = false;
            switch(mode) {
            case DekiScriptEvalMode.None:
                break;
            case DekiScriptEvalMode.Evaluate:
            case DekiScriptEvalMode.EvaluateSafeMode: {
                var expr = DekiScriptParser.Parse(script);
                try {
                    expr = DekiContext.Current.Instance.ScriptRuntime.Evaluate(expr, mode, env);
                } catch(Exception e) {
                    var error = DekiScriptLibrary.MakeErrorObject(e, env);
                    DekiContext.Current.Instance.ScriptRuntime.LogExceptionInOutput(error);
                    expr = DekiScriptExpression.Constant(DekiScriptLibrary.WebShowError((Hashtable)error.NativeValue));
                }

                // check if outcome is an XML document
                var xml = expr as DekiScriptXml;
                if(xml != null) {

                    // check if outcome is the expected content document
                    if(xml.Value.HasName("content")) {
                        script.Replace(((DekiScriptXml)expr).Value);
                    } else {

                        // remove all contents from existing document and append new document
                        script.RemoveNodes();
                        script.Start("body").Add(xml.Value).End();
                    }
                } else if(expr is DekiScriptString) {   

                    // remove all contents from existing document and append new document
                    script.RemoveNodes();
                    script.Start("body").Value(((DekiScriptString)expr).Value).End();
                } else {

                    // remove all contents from existing document and append new document
                    script.RemoveNodes();
                    script.Start("body").Value(expr.ToString()).End();
                }
            }
                break;
            case DekiScriptEvalMode.EvaluateEditOnly:
            case DekiScriptEvalMode.EvaluateSaveOnly:
            case DekiScriptEvalMode.Verify: {
                DekiScriptEvalContext context = new DekiScriptEvalContext(script, mode, false, DekiContext.Current.Instance.ScriptRuntime.GetMaxOutputSize(mode));

                // add <head> and <tail> sections
                context.AddHeadElements(script);
                context.AddTailElements(script);
                script["head"].RemoveNodes();
                script["tail"].RemoveNodes();

                // evaluate the script
                bool error = false;
                DekiScriptInterpreter.Evaluate(script, (XmlElement)script.Root.AsXmlNode, context, env, DekiContext.Current.Instance.ScriptRuntime, out scripted, ref error);
                if((mode == DekiScriptEvalMode.Verify) || !error) {
                    context.MergeContextIntoDocument(script.AsXmlNode.OwnerDocument);
                }
            }
                break;
            default:
                throw new InvalidOperationException(string.Format("unrecognized evaluation mode '{0}'", mode));
            }
        }