public string GeneratePart(string templatePathPart, ILogger log, IReadOnlyDictionary <string, object> options) { if (templatePathPart == null) { throw new ArgumentNullException(nameof(templatePathPart)); } if (log == null) { throw new ArgumentNullException(nameof(log)); } var expandoOptions = new ExpandoObject(); var expandoOptionsAsDictionary = (IDictionary <string, object>)expandoOptions; foreach (var option in options) { expandoOptionsAsDictionary[option.Key] = option.Value; } var templateDirectory = new FileInfo(FilePath).Directory; var sourceFilePath = Path.Combine(templateDirectory.FullName, templatePathPart); var content = File.ReadAllText(sourceFilePath); var engine = new TemplatingEngine(); var host = new ProjectTemplatingHost(log, sourceFilePath, templateDirectory.FullName, expandoOptions, Assemblies.Select(assembly => assembly.FullPath)); return(engine.ProcessTemplate(content, host)); }
public bool ProcessTemplate(string inputFileName, string inputContent, ref string outputFileName, out string outputContent) { errors.Clear(); encoding = Encoding.UTF8; outputFile = outputFileName; inputFile = inputFileName; outputContent = Engine.ProcessTemplate(inputContent, this); outputFileName = outputFile; return(!errors.HasErrors); }
public void WithEngine() { var engine = new TemplatingEngine(); var host = new TemplateGenerator(); host.Refs.Add("System.CodeDom"); var session = host.GetOrCreateSession(); session["Count"] = 2; var templateString = File.ReadAllText("RuntimeTextTemplateForEngine.tt"); string output = engine.ProcessTemplate(templateString, host); Console.WriteLine(output); }
public static void Main(string[] args) { var directoryInfo = new DirectoryInfo("res/json_schema"); var schemaFiles = directoryInfo.GetFiles("*.json"); var fileNames = schemaFiles.Select(f => f.FullName).ToArray(); var classNames = schemaFiles.Select(f => f.Name).Select(name => name.Split(new string[] { ".json" }, System.StringSplitOptions.None)[0]).ToArray(); if (!Directory.Exists("output")) { Directory.CreateDirectory("output"); } else { Directory.Delete("output", true); Directory.CreateDirectory("output"); } var schemaTT = File.ReadAllText("res/templates/SchemaClass.tt"); for (var i = 0; i < fileNames.Length; i++) { var json = MiniJSON.Json.Deserialize(File.ReadAllText(fileNames[i])) as Dictionary <string, object>; var session = new TextTemplatingSession(); session["ClassName"] = classNames[i]; session["Json"] = json; var host = new TextTemplatingHost(); host.Initialize("res/templates/SchemaClass.tt", session); var engine = new TemplatingEngine(); var result = engine.ProcessTemplate(schemaTT, host); var streamWriter = new StreamWriter(string.Format("output/{0}.cs", classNames[i]), false); streamWriter.Write(result); streamWriter.Close(); } }
public string ProcessTemplate(string content, ITextTemplatingEngineHost host) { return(engine.ProcessTemplate(content, host)); }
/// <summary> /// Generates this project template to the specified output directory. /// </summary> /// <param name="outputDirectory">The output directory.</param> /// <param name="projectName">Name of the project.</param> /// <param name="projectGuid">The project unique identifier.</param> /// <param name="log">The log to output errors to.</param> /// <param name="options">The options arguments that will be made available through the Session property in each template.</param> /// <param name="generatedOutputFiles">The generated files.</param> /// <exception cref="System.ArgumentNullException">outputDirectory /// or /// projectName</exception> /// <exception cref="System.InvalidOperationException">FilePath cannot be null on this instance</exception> public void Generate(string outputDirectory, string projectName, Guid projectGuid, ILogger log, IReadOnlyDictionary <string, object> options = null, List <string> generatedOutputFiles = null) { if (outputDirectory == null) { throw new ArgumentNullException(nameof(outputDirectory)); } if (projectName == null) { throw new ArgumentNullException(nameof(projectName)); } if (log == null) { throw new ArgumentNullException(nameof(log)); } if (FilePath == null) { throw new InvalidOperationException("FilePath cannot be null on this instance"); } try { // Check Project template filepath var templateDirectory = new FileInfo(FilePath).Directory; if (templateDirectory == null || !templateDirectory.Exists) { log.Error($"Invalid ProjectTemplate directory [{FilePath}]"); return; } // Creates the output directory var directory = new DirectoryInfo(outputDirectory); if (!directory.Exists) { directory.Create(); } // Create expando object from options valid for the whole life of generating a project template var expandoOptions = new ExpandoObject(); var expandoOptionsAsDictionary = (IDictionary <string, object>)expandoOptions; expandoOptionsAsDictionary["ProjectName"] = projectName; expandoOptionsAsDictionary["ProjectGuid"] = projectGuid; if (options != null) { foreach (var option in options) { expandoOptionsAsDictionary[option.Key] = option.Value; } } var engine = new TemplatingEngine(); // In case this project template is dynamic, we need to generate its content first through T4 if (IsDynamicTemplate) { var content = File.ReadAllText(FilePath); var host = new ProjectTemplatingHost(log, FilePath, templateDirectory.FullName, expandoOptions, Assemblies.Select(assembly => assembly.FullPath)); var newTemplateAsString = engine.ProcessTemplate(content, host); Files.Clear(); using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(newTemplateAsString))) { var newTemplate = (ProjectTemplate)YamlSerializer.Default.Deserialize(stream); Files.AddRange(newTemplate.Files); } } // Iterate on each files foreach (var fileItem in Files) { if (fileItem.Source == null) { log.Warning($"Invalid empty file item [{fileItem}] with no source location"); continue; } var sourceFilePath = Path.Combine(templateDirectory.FullName, fileItem.Source); var targetLocation = fileItem.Target ?? fileItem.Source; if (Path.IsPathRooted(targetLocation)) { log.Error($"Invalid file item [{fileItem}]. TargetLocation must be a relative path"); continue; } var targetLocationExpanded = Expand(targetLocation, expandoOptionsAsDictionary, log); // If this is a template file, turn template on by default if (fileItem.IsTemplate) { var targetPath = Path.GetDirectoryName(targetLocationExpanded); var targetFileName = Path.GetFileName(targetLocationExpanded); targetLocationExpanded = targetPath != null?Path.Combine(targetPath, targetFileName) : targetFileName; } var targetFilePath = Path.Combine(outputDirectory, targetLocationExpanded); try { // Make sure that the target directory does exist var targetDirectory = new FileInfo(targetFilePath).Directory; if (!targetDirectory.Exists) { targetDirectory.Create(); } bool fileGenerated = false; if (fileItem.IsTemplate) { var content = File.ReadAllText(sourceFilePath); // Replace the default platform with the selected one from the ProjectItemTemplate. object oldPlatform = null; if (fileItem.CurrentPlatform != null) { if (expandoOptionsAsDictionary.ContainsKey(nameof(fileItem.CurrentPlatform))) { oldPlatform = expandoOptionsAsDictionary[nameof(fileItem.CurrentPlatform)]; } expandoOptionsAsDictionary[nameof(fileItem.CurrentPlatform)] = fileItem.CurrentPlatform; } var host = new ProjectTemplatingHost(log, sourceFilePath, templateDirectory.FullName, expandoOptions, Assemblies.Select(assembly => assembly.FullPath)); var newContent = engine.ProcessTemplate(content, host); if (fileItem.CurrentPlatform != null) { if (oldPlatform != null) { expandoOptionsAsDictionary[nameof(fileItem.CurrentPlatform)] = oldPlatform; } else { expandoOptionsAsDictionary.Remove(nameof(fileItem.CurrentPlatform)); } } if (newContent != null) { fileGenerated = true; File.WriteAllText(targetFilePath, newContent); } } else { fileGenerated = true; File.Copy(sourceFilePath, targetFilePath, true); } if (generatedOutputFiles != null && fileGenerated) { generatedOutputFiles.Add(targetFilePath); } } catch (Exception ex) { log.Error($"Unexpected exception while processing [{fileItem}]", ex); } } } catch (Exception ex) { log.Error($"Unexpected exception while processing project template [{projectName}] to directory [{outputDirectory}]", ex); } }