public void TestFrontMatter() { var options = new ParserOptions() {Mode = ScriptMode.FrontMatter}; var template = ParseTemplate(@"{{ variable = 1 name = 'yes' }} This is after the frontmatter: {{ name }} {{ variable + 1 }}", options); // Make sure that we have a front matter Assert.NotNull(template.Page.FrontMatter); var context = new TemplateContext(); // Evaluate front-matter var frontResult = context.Evaluate(template.Page.FrontMatter); Assert.Null(frontResult); // Evaluate page-content context.Evaluate(template.Page); var pageResult = context.Output.ToString(); Assert.AreEqual(@"This is after the frontmatter: yes 2", pageResult); }
public void TestScriptOnly() { var options = new ParserOptions() { Mode = ScriptMode.ScriptOnly }; var template = ParseTemplate(@" variable = 1 name = 'yes' ", options); var context = new TemplateContext(); template.Render(context); var outputStr = context.Output.ToString(); Assert.AreEqual(string.Empty, outputStr); var global = context.CurrentGlobal; object value; Assert.True(global.TryGetValue("name", out value)); Assert.AreEqual("yes", value); Assert.True(global.TryGetValue("variable", out value)); Assert.AreEqual(1, value); }
/// <summary> /// Initializes a new instance of the <see cref="TemplateContext" /> class. /// </summary> /// <param name="builtin">The builtin object used to expose builtin functions, default is <see cref="GetDefaultBuiltinObject"/>.</param> public TemplateContext(ScriptObject builtin) { BuiltinObject = builtin ?? GetDefaultBuiltinObject(); EnableOutput = true; LoopLimit = 1000; RecursiveLimit = 100; MemberRenamer = StandardMemberRenamer.Default; TemplateLoaderParserOptions = new ParserOptions(); outputs = new Stack<StringBuilder>(); outputs.Push(new StringBuilder()); globalStores = new Stack<IScriptObject>(); localStores = new Stack<ScriptObject>(); loopStores = new Stack<ScriptObject>(); availableStores = new Stack<ScriptObject>(); sourceFiles = new Stack<string>(); memberAccessors = new Dictionary<Type, IMemberAccessor>(); listAccessors = new Dictionary<Type, IListAccessor>(); loops = new Stack<ScriptLoopStatementBase>(); PipeArguments = new Stack<ScriptExpression>(); BlockDelegates = new Stack<ScriptBlockStatement>(); isFunctionCallDisabled = false; CachedTemplates = new Dictionary<string, Template>(); Tags = new Dictionary<object, object>(); // Ensure that builtin is registered first PushGlobal(BuiltinObject); }
/// <summary> /// Parses the specified scripting text into a <see cref="Template"/> . /// </summary> /// <param name="text">The scripting text.</param> /// <param name="sourceFilePath">The source file path. Optional, used for better error reporting if the source file has a location on the disk</param> /// <param name="options">The templating parsing options.</param> /// <returns>A template</returns> public static Template Parse(string text, string sourceFilePath = null, ParserOptions options = null) { var template = new Template(options, sourceFilePath); template.ParseInternal(text, sourceFilePath); return template; }
private Template(ParserOptions options, string sourceFilePath) { this.options = options == null ? new ParserOptions() : options.Clone(); Messages = new List<LogMessage>(); this.SourceFilePath = sourceFilePath; }
private static Template ParseTemplate(string text, ParserOptions options = null) { var template = Template.Parse(text, "text", options); foreach (var message in template.Messages) { Console.WriteLine(message); } Assert.False(template.HasErrors); return template; }