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);
            }
        }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
 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);
 }
Beispiel #5
0
 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);
 }
Beispiel #6
0
 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;
 }
Beispiel #7
0
 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;
 }
Beispiel #8
0
 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);
        }
Beispiel #10
0
 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/");
        }
Beispiel #13
0
 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);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
 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);
     }
 }
Beispiel #18
0
        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);
        }
Beispiel #20
0
        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);
            }
        }
Beispiel #21
0
        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);
            }
        }
Beispiel #22
0
        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);
            }
        }
Beispiel #23
0
 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);
     }
 }
Beispiel #24
0
        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);
            }
        }
Beispiel #25
0
 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);
     }
 }
Beispiel #26
0
 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);
     }
 }