private static void ProcessTemplate(string templateName, string inputFolder, IEnumerable <InternalManifestItem> items, object model, string outputFolder, params Tuple <string, string>[] templateFiles) { var rootTemplateFolder = "tmpl"; var templateFolder = Path.Combine(rootTemplateFolder, templateName); if (Directory.Exists(templateFolder)) { Directory.Delete(templateFolder, true); } WriteTemplate(templateFolder, templateFiles); using (var resource = new ResourceFinder(null, null).Find(templateFolder)) { var processor = new TemplateProcessor(resource, 4); var context = new DocumentBuildContext(inputFolder); foreach (var item in items) { if (item.ResourceFile != null) { var dir = Path.GetDirectoryName(item.ResourceFile); if (!string.IsNullOrEmpty(dir)) { Directory.CreateDirectory(dir); } File.Create(item.ResourceFile).Dispose(); } if (string.IsNullOrEmpty(item.InputFolder)) { item.InputFolder = Environment.CurrentDirectory; } item.Model = new DocAsCode.Plugins.ModelWithCache(model); } var settings = new ApplyTemplateSettings(inputFolder, outputFolder); processor.Process(items.ToList(), context, settings); } }
private void BuildDocument(FileCollection files, Dictionary <string, object> metadata = null, ApplyTemplateSettings applyTemplateSettings = null, string templateFolder = null, string versionDir = null) { using (var builder = new DocumentBuilder(LoadAssemblies(), ImmutableArray <string> .Empty, null)) { if (applyTemplateSettings == null) { applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); applyTemplateSettings.RawModelExportSettings.Export = true; } var parameters = new DocumentBuildParameters { Files = files, OutputBaseDir = Path.Combine(Directory.GetCurrentDirectory(), _outputFolder), ApplyTemplateSettings = applyTemplateSettings, Metadata = metadata?.ToImmutableDictionary(), TemplateManager = new TemplateManager(null, null, new List <string> { _templateFolder }, null, null), TemplateDir = templateFolder, VersionDir = versionDir, XRefMaps = ImmutableArray.Create("TestData/xrefmap.yml") }; builder.Build(parameters); } }
private void BuildDocument( FileCollection files, string inputFolder, string outputFolder, Dictionary <string, object> metadata = null, ApplyTemplateSettings applyTemplateSettings = null, string templateFolder = null, string intermediateFolder = null, Dictionary <string, ChangeKindWithDependency> changes = null) { using (var builder = new DocumentBuilder(LoadAssemblies(), ImmutableArray <string> .Empty, null, intermediateFolder)) { if (applyTemplateSettings == null) { applyTemplateSettings = new ApplyTemplateSettings(inputFolder, outputFolder); } var parameters = new DocumentBuildParameters { Files = files, OutputBaseDir = Path.Combine(Directory.GetCurrentDirectory(), outputFolder), ApplyTemplateSettings = applyTemplateSettings, Metadata = metadata?.ToImmutableDictionary(), TemplateManager = new TemplateManager(null, null, new List <string> { templateFolder }, null, null), TemplateDir = templateFolder, Changes = changes?.ToImmutableDictionary(), }; builder.Build(parameters); } }
public TocDocumentProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); _applyTemplateSettings.RawModelExportSettings.Export = true; _fileCreator = new FileCreator(_inputFolder); }
public TocDocumentProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); _applyTemplateSettings.RawModelExportSettings.Export = true; _fileCreator = new FileCreator(_inputFolder); EnvironmentContext.SetBaseDirectory(_inputFolder); EnvironmentContext.SetOutputDirectory(_outputFolder); }
public RestApiDocumentProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Directory.GetCurrentDirectory()); _defaultFiles.Add(DocumentType.Article, new[] { "TestData/contacts.json" }, "TestData/", null); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); _applyTemplateSettings.RawModelExportSettings.Export = true; }
public RestApiDocumentProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Environment.CurrentDirectory); _defaultFiles.Add(DocumentType.Article, new[] { "TestData/contacts.json" }, p => (((RelativePath)p) - (RelativePath)"TestData/").ToString()); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); _applyTemplateSettings.RawModelExportSettings.Export = true; }
public BuildRestApiDocument() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Directory.GetCurrentDirectory()); _defaultFiles.Add(DocumentType.Article, new[] { "swagger/swagger.json" }); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true } }; }
private static DocumentBuildParameters ConfigToParameter(BuildJsonConfig config, TemplateManager templateManager, string baseDirectory, string outputDirectory) { var parameters = new DocumentBuildParameters(); parameters.OutputBaseDir = outputDirectory; if (config.GlobalMetadata != null) { parameters.Metadata = config.GlobalMetadata.ToImmutableDictionary(); } if (config.FileMetadata != null) { parameters.FileMetadata = ConvertToFileMetadataItem(baseDirectory, config.FileMetadata); } parameters.ExternalReferencePackages = GetFilesFromFileMapping( GlobUtility.ExpandFileMapping(baseDirectory, config.ExternalReference)) .ToImmutableArray(); parameters.Files = GetFileCollectionFromFileMapping( baseDirectory, GlobUtility.ExpandFileMapping(baseDirectory, config.Content), GlobUtility.ExpandFileMapping(baseDirectory, config.Overwrite), GlobUtility.ExpandFileMapping(baseDirectory, config.Resource)); var applyTemplateSettings = new ApplyTemplateSettings(baseDirectory, outputDirectory) { TransformDocument = config.DryRun != true, }; applyTemplateSettings.RawModelExportSettings.Export = config.ExportRawModel == true; if (!string.IsNullOrEmpty(config.RawModelOutputFolder)) { applyTemplateSettings.RawModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.RawModelOutputFolder); } applyTemplateSettings.ViewModelExportSettings.Export = config.ExportViewModel == true; if (!string.IsNullOrEmpty(config.ViewModelOutputFolder)) { applyTemplateSettings.ViewModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.ViewModelOutputFolder); } parameters.ApplyTemplateSettings = applyTemplateSettings; parameters.TemplateManager = templateManager; if (config.MaxParallelism == null || config.MaxParallelism.Value <= 0) { parameters.MaxParallelism = Environment.ProcessorCount; } else { parameters.MaxParallelism = config.MaxParallelism.Value; } return(parameters); }
public UniversalReferenceDocumentProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true, }; _templateManager = new TemplateManager(null, null, new List <string> { "template" }, null, "TestData/"); }
public void OverwriteUneditableTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Directory.GetCurrentDirectory()); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true, }; _templateManager = new TemplateManager(null, null, new List <string> { "template" }, null, _templateFolder); _listener = TestLoggerListener.CreateLoggerListenerWithPhaseEqualFilter(null); _rawModelFilePath = GetRawModelFilePath("FragmentsValidation.yml"); var schemaFile = CreateFile("template/schemas/fragments.validation.schema.json", File.ReadAllText("TestData/schemas/fragments.validation.schema.json"), _templateFolder); var yamlFile = CreateFile("FragmentsValidation.yml", File.ReadAllText("TestData/inputs/FragmentsValidation.yml"), _inputFolder); var mdFile = CreateFile("FragmentsValidation.yml.md", File.ReadAllText("TestData/inputs/FragmentsValidation.yml.md"), _inputFolder); _files = new FileCollection(_defaultFiles); _files.Add(DocumentType.Article, new[] { yamlFile }, _inputFolder); // Act Logger.RegisterListener(_listener); try { BuildDocument(_files); } finally { Logger.UnregisterListener(_listener); } var logs = _listener.Items; var warningLogs = logs.Where(l => l.Code == WarningCodes.Overwrite.InvalidMarkdownFragments).ToList(); Assert.True(File.Exists(_rawModelFilePath)); Assert.Equal(5, warningLogs.Count()); Assert.Equal( @"Markdown property `depot_name` is not allowed inside a YAML code block You cannot overwrite a readonly property: `site_name`, please add an `editable` tag on this property or mark its contentType as `markdown` in schema if you want to overwrite this property There is an invalid H2: `name`: the contentType of this property in schema must be `markdown` There is an invalid H2: `operations[id=""management.azure.com.advisor.fragmentsValidation.create""]/summary`: the contentType of this property in schema must be `markdown` ""/operations/1"" in overwrite object fails to overwrite ""/operations"" for ""management.azure.com.advisor.fragmentsValidation"" because it does not match any existing item.", String.Join(Environment.NewLine, warningLogs.Select(x => x.Message))); Assert.Equal("14", warningLogs[2].Line); Assert.Equal("17", warningLogs[3].Line); }
public SplitClassPageToMemberLevelTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true, }; _templateManager = new TemplateManager(null, null, new List <string> { "template" }, null, "TestData/"); }
public SplitRestApiToOperationLevelTest() { _inputFolder = GetRandomFolder(); _outputFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Directory.GetCurrentDirectory()); _defaultFiles.Add(DocumentType.Article, new[] { "TestData/swagger/petstore.json" }, "TestData/"); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true, }; _templateManager = new TemplateManager(null, null, new List <string> { "template" }, null, "TestData/"); }
public ManagedReferenceDocumentProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Directory.GetCurrentDirectory()); _defaultFiles.Add(DocumentType.Article, new[] { "TestData/mref/CatLibrary.Cat-2.yml" }, "TestData/"); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true, }; _templateManager = new TemplateManager(null, null, new List <string> { "template" }, null, "TestData/"); }
public SchemaDrivenProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Directory.GetCurrentDirectory()); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true, }; _templateManager = new TemplateManager(null, null, new List <string> { "template" }, null, _templateFolder); }
public void TestRestApiDocumentProcessorWithSwaggerJsonFile() { const string RawModelFileExtension = ".raw.json"; // TODO: Add override markdown file FileCollection files = new FileCollection(Environment.CurrentDirectory); files.Add(DocumentType.Article, new[] { "TestData/contacts_swagger2.json" }, p => (((RelativePath)p) - (RelativePath)"TestData/").ToString()); using (var builder = new DocumentBuilder()) { var applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); applyTemplateSettings.RawModelExportSettings.Export = true; var parameters = new DocumentBuildParameters { Files = files, OutputBaseDir = _outputFolder, ApplyTemplateSettings = applyTemplateSettings, Metadata = new Dictionary <string, object> { ["meta"] = "Hello world!", }.ToImmutableDictionary() }; builder.Build(parameters); } // Check REST API var outputRawModelPath = Path.Combine(_outputFolder, Path.ChangeExtension("contacts_swagger2.json", RawModelFileExtension)); Assert.True(File.Exists(outputRawModelPath)); var model = RestApiDocumentProcessor.GetModelWithoutRef <RestApiItemViewModel>(File.ReadAllText(outputRawModelPath)); Assert.Equal("graph.windows.net/myorganization/Contacts", model.Uid); Assert.Equal("graph_windows_net_myorganization_Contacts", model.HtmlId); Assert.Equal(9, model.Children.Count); Assert.Equal("Hello world!", model.Metadata["meta"]); var item1 = model.Children[0]; Assert.Equal("graph.windows.net/myorganization/Contacts/get contacts", item1.Uid); Assert.Equal("<p>You can get a collection of contacts from your tenant.</p>\n", item1.Summary); Assert.Equal(1, item1.Parameters.Count); Assert.Equal("1.6", item1.Parameters[0].Metadata["default"]); Assert.Equal(1, item1.Responses.Count); Assert.Equal("200", item1.Responses[0].HttpStatusCode); }
private void BuildDocument(FileCollection files, Dictionary <string, object> metadata = null, ApplyTemplateSettings applyTemplateSettings = null) { using (var builder = new DocumentBuilder(LoadAssemblies())) { if (applyTemplateSettings == null) { applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); applyTemplateSettings.RawModelExportSettings.Export = true; } var parameters = new DocumentBuildParameters { Files = files, OutputBaseDir = Path.Combine(Environment.CurrentDirectory, _outputFolder), ApplyTemplateSettings = applyTemplateSettings, Metadata = metadata?.ToImmutableDictionary(), TemplateManager = new TemplateManager(null, null, new List <string> { _templateFolder }, null, null) }; builder.Build(parameters); } }
public ConceptualDocumentProcessorTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _fileCreator = new FileCreator(_inputFolder); _defaultFiles = new FileCollection(_inputFolder); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true }; EnvironmentContext.SetBaseDirectory(_inputFolder); EnvironmentContext.SetOutputDirectory(_outputFolder); // Prepare conceptual template var templateCreator = new FileCreator(_templateFolder); var file = templateCreator.CreateFile(@"{{{conceptual}}}", "conceptual.html.tmpl", "default"); _templateManager = new TemplateManager(null, null, new List <string> { "default" }, null, _templateFolder); }
public MergeMarkdownFragmentsTest() { _outputFolder = GetRandomFolder(); _inputFolder = GetRandomFolder(); _templateFolder = GetRandomFolder(); _defaultFiles = new FileCollection(Directory.GetCurrentDirectory()); _applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder) { RawModelExportSettings = { Export = true }, TransformDocument = true, }; _templateManager = new TemplateManager(null, null, new List <string> { "template" }, null, _templateFolder); _listener = TestLoggerListener.CreateLoggerListenerWithPhaseEqualFilter(null); _rawModelFilePath = GetRawModelFilePath("Suppressions.yml"); var schemaFile = CreateFile("template/schemas/rest.mixed.schema.json", File.ReadAllText("TestData/schemas/rest.mixed.schema.json"), _templateFolder); var yamlFile = CreateFile("Suppressions.yml", File.ReadAllText("TestData/inputs/Suppressions.yml"), _inputFolder); _files = new FileCollection(_defaultFiles); _files.Add(DocumentType.Article, new[] { yamlFile }, _inputFolder); }
private static IEnumerable <DocumentBuildParameters> ConfigToParameter(BuildJsonConfig config, TemplateManager templateManager, ChangeList changeList, string baseDirectory, string outputDirectory, string templateDir) { var parameters = new DocumentBuildParameters { OutputBaseDir = outputDirectory, ForceRebuild = config.Force ?? false, ForcePostProcess = config.ForcePostProcess ?? false, SitemapOptions = config.SitemapOptions, FALName = config.FALName, DisableGitFeatures = config.DisableGitFeatures, SchemaLicense = config.SchemaLicense, TagParameters = config.TagParameters }; if (config.GlobalMetadata != null) { parameters.Metadata = config.GlobalMetadata.ToImmutableDictionary(); } if (config.FileMetadata != null) { parameters.FileMetadata = ConvertToFileMetadataItem(baseDirectory, config.FileMetadata); } if (config.PostProcessors != null) { parameters.PostProcessors = config.PostProcessors.ToImmutableArray(); } if (config.XRefMaps != null) { parameters.XRefMaps = config.XRefMaps.ToImmutableArray(); } if (config.XRefServiceUrls != null) { parameters.XRefServiceUrls = config.XRefServiceUrls.ToImmutableArray(); } if (!config.NoLangKeyword) { parameters.XRefMaps = parameters.XRefMaps.Add("embedded:docfx/langwordMapping.yml"); } string outputFolderForDebugFiles = null; if (!string.IsNullOrEmpty(config.OutputFolderForDebugFiles)) { outputFolderForDebugFiles = Path.Combine(baseDirectory, config.OutputFolderForDebugFiles); } var applyTemplateSettings = new ApplyTemplateSettings(baseDirectory, outputDirectory, outputFolderForDebugFiles, config.EnableDebugMode ?? false) { TransformDocument = config.DryRun != true, }; applyTemplateSettings.RawModelExportSettings.Export = config.ExportRawModel == true; if (!string.IsNullOrEmpty(config.RawModelOutputFolder)) { applyTemplateSettings.RawModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.RawModelOutputFolder); } applyTemplateSettings.ViewModelExportSettings.Export = config.ExportViewModel == true; if (!string.IsNullOrEmpty(config.ViewModelOutputFolder)) { applyTemplateSettings.ViewModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.ViewModelOutputFolder); } parameters.ApplyTemplateSettings = applyTemplateSettings; parameters.TemplateManager = templateManager; if (config.MaxParallelism == null || config.MaxParallelism.Value <= 0) { parameters.MaxParallelism = Environment.ProcessorCount; } else { parameters.MaxParallelism = config.MaxParallelism.Value; ThreadPool.GetMinThreads(out int wt, out int cpt); if (wt < parameters.MaxParallelism) { ThreadPool.SetMinThreads(parameters.MaxParallelism, cpt); } } parameters.MaxHttpParallelism = Math.Max(64, parameters.MaxParallelism * 2); ServicePointManager.DefaultConnectionLimit = parameters.MaxHttpParallelism; if (config.MarkdownEngineName != null) { parameters.MarkdownEngineName = config.MarkdownEngineName; } if (config.MarkdownEngineProperties != null) { parameters.MarkdownEngineParameters = config.MarkdownEngineProperties.ToImmutableDictionary(); } if (config.CustomLinkResolver != null) { parameters.CustomLinkResolver = config.CustomLinkResolver; } parameters.TemplateDir = templateDir; var fileMappingParametersDictionary = GroupFileMappings(config.Content, config.Overwrite, config.Resource); if (config.LruSize == null) { parameters.LruSize = Environment.Is64BitProcess ? 0x2000 : 0xC00; } else { parameters.LruSize = Math.Max(0, config.LruSize.Value); } if (config.KeepFileLink) { parameters.KeepFileLink = true; } if (config.Pairing != null) { parameters.OverwriteFragmentsRedirectionRules = config.Pairing.Select(i => new FolderRedirectionRule(i.ContentFolder, i.OverwriteFragmentsFolder)).ToImmutableArray(); } foreach (var pair in fileMappingParametersDictionary) { var p = parameters.Clone(); if (!string.IsNullOrEmpty(pair.Key)) { p.GroupInfo = new GroupInfo() { Name = pair.Key, }; if (config.Groups != null && config.Groups.TryGetValue(pair.Key, out GroupConfig gi)) { p.GroupInfo.Destination = gi.Destination; p.GroupInfo.Metadata = gi.Metadata; if (!string.IsNullOrEmpty(gi.Destination)) { p.VersionDir = gi.Destination; } } } p.Files = GetFileCollectionFromFileMapping( baseDirectory, GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Content)), GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Overwrite)), GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Resource))); p.VersionName = pair.Key; p.Changes = GetIntersectChanges(p.Files, changeList); p.RootTocPath = pair.Value.RootTocPath; yield return(p); } }
private static IEnumerable <DocumentBuildParameters> ConfigToParameter(BuildJsonConfig config, TemplateManager templateManager, ChangeList changeList, string baseDirectory, string outputDirectory, string templateDir) { var parameters = new DocumentBuildParameters { OutputBaseDir = outputDirectory, ForceRebuild = config.Force ?? false, ForcePostProcess = config.ForcePostProcess ?? false }; if (config.GlobalMetadata != null) { parameters.Metadata = config.GlobalMetadata.ToImmutableDictionary(); } if (config.FileMetadata != null) { parameters.FileMetadata = ConvertToFileMetadataItem(baseDirectory, config.FileMetadata); } if (config.PostProcessors != null) { parameters.PostProcessors = config.PostProcessors.ToImmutableArray(); } parameters.ExternalReferencePackages = GetFilesFromFileMapping( GlobUtility.ExpandFileMapping(baseDirectory, config.ExternalReference)) .ToImmutableArray(); if (config.XRefMaps != null) { parameters.XRefMaps = config.XRefMaps.ToImmutableArray(); } if (!config.NoLangKeyword) { parameters.XRefMaps = parameters.XRefMaps.Add("embedded:docfx/langwordMapping.yml"); } string outputFolderForDebugFiles = null; if (!string.IsNullOrEmpty(config.OutputFolderForDebugFiles)) { outputFolderForDebugFiles = Path.Combine(baseDirectory, config.OutputFolderForDebugFiles); } var applyTemplateSettings = new ApplyTemplateSettings(baseDirectory, outputDirectory, outputFolderForDebugFiles, config.EnableDebugMode ?? false) { TransformDocument = config.DryRun != true, }; applyTemplateSettings.RawModelExportSettings.Export = config.ExportRawModel == true; if (!string.IsNullOrEmpty(config.RawModelOutputFolder)) { applyTemplateSettings.RawModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.RawModelOutputFolder); } applyTemplateSettings.ViewModelExportSettings.Export = config.ExportViewModel == true; if (!string.IsNullOrEmpty(config.ViewModelOutputFolder)) { applyTemplateSettings.ViewModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.ViewModelOutputFolder); } parameters.ApplyTemplateSettings = applyTemplateSettings; parameters.TemplateManager = templateManager; if (config.MaxParallelism == null || config.MaxParallelism.Value <= 0) { parameters.MaxParallelism = Environment.ProcessorCount; } else { parameters.MaxParallelism = config.MaxParallelism.Value; int wt, cpt; ThreadPool.GetMinThreads(out wt, out cpt); if (wt < parameters.MaxParallelism) { ThreadPool.SetMinThreads(parameters.MaxParallelism, cpt); } } if (config.MarkdownEngineName != null) { parameters.MarkdownEngineName = config.MarkdownEngineName; } if (config.MarkdownEngineProperties != null) { parameters.MarkdownEngineParameters = config.MarkdownEngineProperties.ToImmutableDictionary(); } if (config.CustomLinkResolver != null) { parameters.CustomLinkResolver = config.CustomLinkResolver; } parameters.TemplateDir = templateDir; var fileMappingParametersDictionary = GroupFileMappings(config.Content, config.Overwrite, config.Resource); if (config.LruSize == null) { parameters.LruSize = Environment.Is64BitProcess ? 0x2000 : 0xC00; } else { parameters.LruSize = Math.Max(0, config.LruSize.Value); } foreach (var pair in fileMappingParametersDictionary) { var p = parameters.Clone(); VersionConfig vi; if (config.Versions != null && config.Versions.TryGetValue(pair.Key, out vi)) { if (!string.IsNullOrEmpty(vi.Destination)) { p.VersionDir = vi.Destination; } } p.Files = GetFileCollectionFromFileMapping( baseDirectory, GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Content)), GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Overwrite)), GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Resource))); p.VersionName = pair.Key; p.Changes = GetIntersectChanges(p.Files, changeList); // TODO: move RootTocPath to VersionInfo p.RootTocPath = pair.Value.RootTocPath; yield return(p); } }
private static IEnumerable <DocumentBuildParameters> ConfigToParameter(BuildJsonConfig config, TemplateManager templateManager, string baseDirectory, string outputDirectory, string templateDir) { var parameters = new DocumentBuildParameters(); parameters.OutputBaseDir = outputDirectory; if (config.GlobalMetadata != null) { parameters.Metadata = config.GlobalMetadata.ToImmutableDictionary(); } if (config.FileMetadata != null) { parameters.FileMetadata = ConvertToFileMetadataItem(baseDirectory, config.FileMetadata); } if (config.PostProcessors != null) { parameters.PostProcessors = config.PostProcessors.ToImmutableArray(); } parameters.ExternalReferencePackages = GetFilesFromFileMapping( GlobUtility.ExpandFileMapping(baseDirectory, config.ExternalReference)) .ToImmutableArray(); if (config.XRefMaps != null) { parameters.XRefMaps = config.XRefMaps.ToImmutableArray(); } if (!config.NoLangKeyword) { parameters.XRefMaps = parameters.XRefMaps.Add("embedded:docfx/langwordMapping.yml"); } var applyTemplateSettings = new ApplyTemplateSettings(baseDirectory, outputDirectory) { TransformDocument = config.DryRun != true, }; applyTemplateSettings.RawModelExportSettings.Export = config.ExportRawModel == true; if (!string.IsNullOrEmpty(config.RawModelOutputFolder)) { applyTemplateSettings.RawModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.RawModelOutputFolder); } applyTemplateSettings.ViewModelExportSettings.Export = config.ExportViewModel == true; if (!string.IsNullOrEmpty(config.ViewModelOutputFolder)) { applyTemplateSettings.ViewModelExportSettings.OutputFolder = Path.Combine(baseDirectory, config.ViewModelOutputFolder); } parameters.ApplyTemplateSettings = applyTemplateSettings; parameters.TemplateManager = templateManager; if (config.MaxParallelism == null || config.MaxParallelism.Value <= 0) { parameters.MaxParallelism = Environment.ProcessorCount; } else { parameters.MaxParallelism = config.MaxParallelism.Value; } if (config.MarkdownEngineName != null) { parameters.MarkdownEngineName = config.MarkdownEngineName; } if (config.MarkdownEngineProperties != null) { parameters.MarkdownEngineParameters = config.MarkdownEngineProperties.ToImmutableDictionary(); } parameters.TemplateDir = templateDir; ChangeList changeList = null; if (config.ChangesFile != null) { changeList = ChangeList.Parse(config.ChangesFile, config.BaseDirectory); } var fileMappingParametersDictionary = GroupFileMappings(config.Content, config.Overwrite, config.Resource); foreach (var pair in fileMappingParametersDictionary) { parameters.Files = GetFileCollectionFromFileMapping( baseDirectory, GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Content)), GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Overwrite)), GlobUtility.ExpandFileMapping(baseDirectory, pair.Value.GetFileMapping(FileMappingType.Resource))); parameters.VersionName = pair.Key; parameters.Changes = GetIntersectChanges(parameters.Files, changeList); yield return(parameters); } }
private static void ProcessTemplate(string templateName, string inputFolder, IEnumerable<InternalManifestItem> items, object model, string outputFolder, params Tuple<string, string>[] templateFiles) { var rootTemplateFolder = "tmpl"; var templateFolder = Path.Combine(rootTemplateFolder, templateName); if (Directory.Exists(templateFolder)) Directory.Delete(templateFolder, true); WriteTemplate(templateFolder, templateFiles); using (var resource = new ResourceFinder(null, null).Find(templateFolder)) { var processor = new TemplateProcessor(resource, null, 4); var context = new DocumentBuildContext(inputFolder); foreach (var item in items) { if (item.ResourceFile != null) { var dir = Path.GetDirectoryName(item.ResourceFile); if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); File.Create(item.ResourceFile).Dispose(); } if (string.IsNullOrEmpty(item.InputFolder)) item.InputFolder = Directory.GetCurrentDirectory(); item.Model = new DocAsCode.Plugins.ModelWithCache(model); } var settings = new ApplyTemplateSettings(inputFolder, outputFolder); processor.Process(items.ToList(), context, settings); } }
public void TestBuild() { const string documentsBaseDir = "db.documents"; const string outputBaseDir = "db.output"; const string RawModelFileExtension = ".raw.json"; #region Prepare test data if (Directory.Exists(documentsBaseDir)) { Directory.Delete(documentsBaseDir, true); } if (Directory.Exists(outputBaseDir)) { Directory.Delete(outputBaseDir, true); } Directory.CreateDirectory(documentsBaseDir); Directory.CreateDirectory(documentsBaseDir + "/test"); Directory.CreateDirectory(outputBaseDir); var tocFile = Path.Combine(documentsBaseDir, "toc.md"); var conceptualFile = Path.Combine(documentsBaseDir, "test.md"); var conceptualFile2 = Path.Combine(documentsBaseDir, "test/test.md"); var resourceFile = Path.GetFileName(typeof(DocumentBuilderTest).Assembly.Location); var resourceMetaFile = resourceFile + ".meta"; File.WriteAllLines( tocFile, new[] { "# [test1](test.md)", "## [test2](test/test.md)", "# Api", "## [Console](@System.Console)", "## [ConsoleColor](xref:System.ConsoleColor)", }); File.WriteAllLines( conceptualFile, new[] { "---", "uid: XRef1", "a: b", "b:", " c: e", "---", "# Hello World", "Test XRef: @XRef1", "Test link: [link text](test/test.md)", "Test link: [link text 2](../" + resourceFile + ")", "<p>", "test", }); File.WriteAllLines( conceptualFile2, new[] { "---", "uid: XRef2", "a: b", "b:", " c: e", "---", "# Hello World", "Test XRef: @XRef2", "Test link: [link text](../test.md)", "<p>", "test", }); File.WriteAllText(resourceMetaFile, @"{ abc: ""xyz"", uid: ""r1"" }"); File.WriteAllText(MarkdownSytleConfig.MarkdownStyleFileName, @"{ rules : [ ""foo"", { name: ""bar"", disable: true} ], tagRules : [ { tagNames: [""p""], behavior: ""Warning"", messageFormatter: ""Tag {0} is not valid."", openingTagOnly: true } ] }"); FileCollection files = new FileCollection(Environment.CurrentDirectory); files.Add(DocumentType.Article, new[] { tocFile, conceptualFile, conceptualFile2 }); files.Add(DocumentType.Article, new[] { "TestData/System.Console.csyml", "TestData/System.ConsoleColor.csyml" }, p => (((RelativePath)p) - (RelativePath)"TestData/").ToString()); files.Add(DocumentType.Resource, new[] { resourceFile }); #endregion Init(string.Join(".", nameof(DocumentBuilderTest), DocumentBuilder.PhaseName, MarkdownValidatorBuilder.MarkdownValidatePhaseName)); try { using (new LoggerPhaseScope(nameof(DocumentBuilderTest))) using (var builder = new DocumentBuilder()) { var applyTemplateSettings = new ApplyTemplateSettings(documentsBaseDir, outputBaseDir); applyTemplateSettings.RawModelExportSettings.Export = true; var parameters = new DocumentBuildParameters { Files = files, OutputBaseDir = Path.Combine(Environment.CurrentDirectory, outputBaseDir), ApplyTemplateSettings = applyTemplateSettings, Metadata = new Dictionary <string, object> { ["meta"] = "Hello world!", }.ToImmutableDictionary() }; builder.Build(parameters); } { // check log for markdown stylecop. Assert.Equal(2, Listener.Items.Count); Assert.Equal("Tag p is not valid.", Listener.Items[0].Message); Assert.Equal(LogLevel.Warning, Listener.Items[0].LogLevel); Assert.Equal("Tag p is not valid.", Listener.Items[1].Message); Assert.Equal(LogLevel.Warning, Listener.Items[1].LogLevel); } { // check toc. Assert.True(File.Exists(Path.Combine(outputBaseDir, Path.ChangeExtension(tocFile, RawModelFileExtension)))); var model = JsonUtility.Deserialize <TocViewModel>(Path.Combine(outputBaseDir, Path.ChangeExtension(tocFile, RawModelFileExtension))); Assert.NotNull(model); Assert.Equal("test1", model[0].Name); Assert.Equal("test.json", model[0].Href); Assert.NotNull(model[0].Items); Assert.Equal("test2", model[0].Items[0].Name); Assert.Equal("test/test.json", model[0].Items[0].Href); Assert.Equal("Api", model[1].Name); Assert.Null(model[1].Href); Assert.NotNull(model[1].Items); Assert.Equal("Console", model[1].Items[0].Name); Assert.Equal("../System.Console.json", model[1].Items[0].Href); Assert.Equal("ConsoleColor", model[1].Items[1].Name); Assert.Equal("../System.ConsoleColor.json", model[1].Items[1].Href); } { // check conceptual. Assert.True(File.Exists(Path.Combine(outputBaseDir, Path.ChangeExtension(conceptualFile, RawModelFileExtension)))); var model = JsonUtility.Deserialize <Dictionary <string, object> >(Path.Combine(outputBaseDir, Path.ChangeExtension(conceptualFile, RawModelFileExtension))); Assert.Equal( "<h1 id=\"hello-world\">Hello World</h1>", model["rawTitle"]); Assert.Equal( "\n<p>Test XRef: <xref href=\"XRef1\" data-throw-if-not-resolved=\"False\" data-raw=\"@XRef1\"></xref>\n" + "Test link: <a href=\"~/db.documents/test/test.md\">link text</a>\n" + "Test link: <a href=\"~/" + resourceFile + "\">link text 2</a></p>\n" + "<p><p>\n" + "test</p>\n", model[Constants.PropertyName.Conceptual]); Assert.Equal("Conceptual", model["type"]); Assert.Equal("Hello world!", model["meta"]); Assert.Equal("b", model["a"]); } { // check mref. Assert.True(File.Exists(Path.Combine(outputBaseDir, Path.ChangeExtension("System.Console.csyml", RawModelFileExtension)))); Assert.True(File.Exists(Path.Combine(outputBaseDir, Path.ChangeExtension("System.ConsoleColor.csyml", RawModelFileExtension)))); } { // check resource. Assert.True(File.Exists(Path.Combine(outputBaseDir, resourceFile))); Assert.True(File.Exists(Path.Combine(outputBaseDir, resourceFile + RawModelFileExtension))); var meta = JsonUtility.Deserialize <Dictionary <string, object> >(Path.Combine(outputBaseDir, resourceFile + RawModelFileExtension)); Assert.Equal(3, meta.Count); Assert.True(meta.ContainsKey("meta")); Assert.Equal("Hello world!", meta["meta"]); Assert.True(meta.ContainsKey("abc")); Assert.Equal("xyz", meta["abc"]); Assert.True(meta.ContainsKey(Constants.PropertyName.Uid)); Assert.Equal("r1", meta[Constants.PropertyName.Uid]); } } finally { CleanUp(); Directory.Delete(documentsBaseDir, true); Directory.Delete(outputBaseDir, true); File.Delete(resourceMetaFile); } }
private void BuildDocument( FileCollection files, string inputFolder, string outputFolder, Dictionary<string, object> metadata = null, ApplyTemplateSettings applyTemplateSettings = null, string templateFolder = null, string intermediateFolder = null, Dictionary<string, ChangeKindWithDependency> changes = null) { using (var builder = new DocumentBuilder(LoadAssemblies(), ImmutableArray<string>.Empty, null, intermediateFolder)) { if (applyTemplateSettings == null) { applyTemplateSettings = new ApplyTemplateSettings(inputFolder, outputFolder); } var parameters = new DocumentBuildParameters { Files = files, OutputBaseDir = Path.Combine(Directory.GetCurrentDirectory(), outputFolder), ApplyTemplateSettings = applyTemplateSettings, Metadata = metadata?.ToImmutableDictionary(), TemplateManager = new TemplateManager(null, null, new List<string> { templateFolder }, null, null), TemplateDir = templateFolder, Changes = changes?.ToImmutableDictionary(), }; builder.Build(parameters); } }
private void BuildDocument(FileCollection files, Dictionary<string, object> metadata = null, ApplyTemplateSettings applyTemplateSettings = null, string templateFolder = null) { using (var builder = new DocumentBuilder(LoadAssemblies(), ImmutableArray<string>.Empty, null, templateFolder)) { if (applyTemplateSettings == null) { applyTemplateSettings = new ApplyTemplateSettings(_inputFolder, _outputFolder); applyTemplateSettings.RawModelExportSettings.Export = true; } var parameters = new DocumentBuildParameters { Files = files, OutputBaseDir = Path.Combine(Directory.GetCurrentDirectory(), _outputFolder), ApplyTemplateSettings = applyTemplateSettings, Metadata = metadata?.ToImmutableDictionary(), TemplateManager = new TemplateManager(null, null, new List<string> { _templateFolder }, null, null), TemplateDir = templateFolder, }; builder.Build(parameters); } }