public static List <TemplateManifestItem> Transform(TemplateProcessor processor, List <ManifestItem> manifest, DocumentBuildContext context, ApplyTemplateSettings settings) { if (settings.Options == ApplyTemplateOptions.ExportRawModel || processor == null) { ExportRawModel(manifest, settings); return(null); } using (new LoggerPhaseScope("Apply Templates")) { Logger.LogInfo($"Applying templates to {manifest.Count} model(s)..."); processor.ProcessDependencies(settings.OutputFolder); if (processor.IsEmpty) { Logger.LogWarning("No template is found."); ExportRawModel(manifest, settings); return(null); } Logger.LogVerbose("Start applying template..."); var outputDirectory = context.BuildOutputFolder; var templateManifest = processor.Transform(manifest, context, settings); if (!settings.Options.HasFlag(ApplyTemplateOptions.TransformDocument)) { Logger.LogInfo("Dryrun, no template will be applied to the documents."); } if (templateManifest.Count > 0) { // Save manifest from template // TODO: Keep .manifest for backward-compatability, will remove next sprint var manifestPath = Path.Combine(outputDirectory ?? string.Empty, Constants.ObsoleteManifestFileName); JsonUtility.Serialize(manifestPath, templateManifest); // Logger.LogInfo($"Manifest file saved to {manifestPath}. NOTE: This file is out-of-date and will be removed in version 1.8, if you rely on this file, please change to use {Constants.ManifestFileName} instead."); var manifestJsonPath = Path.Combine(outputDirectory ?? string.Empty, Constants.ManifestFileName); var toc = context.GetTocInfo(); var manifestObject = GenerateManifest(context, templateManifest); JsonUtility.Serialize(manifestJsonPath, manifestObject); Logger.LogInfo($"Manifest file saved to {manifestJsonPath}."); } return(templateManifest); } }
public void Build(DocumentBuildParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } if (parameters.OutputBaseDir == null) { throw new ArgumentException("Output folder cannot be null.", nameof(parameters) + "." + nameof(parameters.OutputBaseDir)); } if (parameters.Files == null) { throw new ArgumentException("Source files cannot be null.", nameof(parameters) + "." + nameof(parameters.Files)); } if (parameters.MaxParallelism <= 0) { parameters.MaxParallelism = Environment.ProcessorCount; } if (parameters.Metadata == null) { parameters.Metadata = ImmutableDictionary <string, object> .Empty; } using (new LoggerPhaseScope(PhaseName)) { Logger.LogInfo($"Max parallelism is {parameters.MaxParallelism.ToString()}."); Directory.CreateDirectory(parameters.OutputBaseDir); var context = new DocumentBuildContext( Path.Combine(Environment.CurrentDirectory, parameters.OutputBaseDir), parameters.Files.EnumerateFiles(), parameters.ExternalReferencePackages, parameters.MaxParallelism); Logger.LogVerbose("Start building document..."); var innerContexts = Enumerable.Empty <InnerBuildContext>(); try { using (var processor = parameters.TemplateManager?.GetTemplateProcessor(parameters.MaxParallelism)) { innerContexts = GetInnerContexts(parameters, Processors, processor).ToList(); var manifest = new List <ManifestItemWithContext>(); foreach (var item in innerContexts) { manifest.AddRange(BuildCore(item, context)); } // Use manifest from now on UpdateContext(context); UpdateHref(manifest, context); var generatedManifest = TemplateProcessor.Transform(processor, manifest.Select(s => s.Item).ToList(), context, parameters.ApplyTemplateSettings); // todo : move to plugin. object value; if (parameters.Metadata.TryGetValue("_enableSearch", out value)) { var isSearchable = value as bool?; if (isSearchable.HasValue && isSearchable.Value) { ExtractSearchData.ExtractSearchIndexFromHtml.GenerateFile(generatedManifest, parameters.OutputBaseDir); } } Logger.LogInfo($"Building {manifest.Count} file(s) completed."); } } finally { foreach (var item in innerContexts) { if (item.HostService != null) { Cleanup(item.HostService); item.HostService.Dispose(); } } } } }