Exemplo n.º 1
0
        public void Exec(SubCommandRunningContext context)
        {
            EnvironmentContext.SetBaseDirectory(Path.GetFullPath(string.IsNullOrEmpty(_config.BaseDirectory) ? Directory.GetCurrentDirectory() : _config.BaseDirectory));
            // TODO: remove BaseDirectory from Config, it may cause potential issue when abused
            var baseDirectory   = EnvironmentContext.BaseDirectory;
            var outputFolder    = Path.GetFullPath(Path.Combine(string.IsNullOrEmpty(_config.OutputFolder) ? baseDirectory : _config.OutputFolder, _config.Destination ?? string.Empty));
            var rawOutputFolder = string.IsNullOrEmpty(_config.RawOutputFolder) ? Path.Combine(outputFolder, "_raw") : _config.RawOutputFolder;
            var options         = new PdfOptions
            {
                BasePath      = _config.BasePath,
                CssFilePath   = _config.CssFilePath,
                DestDirectory = outputFolder,
                Host          = _config.Host,
                Locale        = _config.Locale,
                NeedGeneratePdfExternalLink = _config.GeneratesExternalLink,
                GenerateAppendices          = _config.GeneratesAppendices,
                PdfConvertParallelism       = _config.MaxParallelism == null || _config.MaxParallelism <= 0 ? Environment.ProcessorCount : _config.MaxParallelism.Value,
                PdfDocsetName     = _config.Name ?? Path.GetFileName(EnvironmentContext.BaseDirectory),
                SourceDirectory   = Path.Combine(rawOutputFolder, _config.Destination ?? string.Empty),
                ExcludeTocs       = _config.ExcludedTocs?.ToArray(),
                KeepRawFiles      = _config.KeepRawFiles,
                LoadErrorHandling = _config.LoadErrorHandling
            };

            // 1. call BuildCommand to generate html files first
            // Output build command exec result to temp folder
            _innerBuildCommand.Config.OutputFolder = rawOutputFolder;

            _innerBuildCommand.Exec(context);

            // 2. call html2pdf converter
            var converter = new ConvertWrapper(options);

            try
            {
                using (new LoggerPhaseScope("PDF", LogLevel.Info))
                {
                    Logger.LogInfo("Start generating PDF files...");
                    converter.Convert();
                }
            }
            catch (IOException ioe)
            {
                throw new DocfxException(ioe.Message, ioe);
            }

            // 3. Should we delete generated files according to manifest
        }
Exemplo n.º 2
0
        public void BuildDocument()
        {
            var sponsor = new ClientSponsor();

            EnvironmentContext.SetBaseDirectory(_baseDirectory);
            EnvironmentContext.SetGitFeaturesDisabled(_disableGitFeatures);
            EnvironmentContext.SetVersion(_version);
            if (_listener != null)
            {
                Logger.LogLevelThreshold = _logLevel;
                Logger.RegisterListener(_listener);
                sponsor.Register(_listener);
            }
            try
            {
                try
                {
                    BuildDocument(_config, _manager, _baseDirectory, _outputDirectory, _pluginDirectory, _templateDirectory);
                }
                catch (AggregateException agg) when(agg.InnerException is DocfxException)
                {
                    throw new DocfxException(agg.InnerException.Message);
                }
                catch (AggregateException agg) when(agg.InnerException is DocumentException)
                {
                    throw new DocumentException(agg.InnerException.Message);
                }
                catch (DocfxException e)
                {
                    throw new DocfxException(e.Message);
                }
                catch (DocumentException)
                {
                    throw;
                }
                catch (Exception e)
                {
                    throw new DocfxException(e.ToString());
                }
            }
            finally
            {
                sponsor.Close();
            }
        }
Exemplo n.º 3
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 context   = new DocumentBuildContext(inputFolder);
            var processor = new TemplateProcessor(resource, context, 4);

            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 ModelWithCache(model);
            }
            var settings = new ApplyTemplateSettings(inputFolder, outputFolder);

            EnvironmentContext.SetBaseDirectory(inputFolder);
            EnvironmentContext.SetOutputDirectory(outputFolder);
            try
            {
                processor.Process(items.ToList(), settings);
            }
            finally
            {
                EnvironmentContext.Clean();
            }
        }
Exemplo n.º 4
0
        public void Exec(SubCommandRunningContext context)
        {
            EnvironmentContext.SetBaseDirectory(Path.GetFullPath(string.IsNullOrEmpty(Config.BaseDirectory) ? Directory.GetCurrentDirectory() : Config.BaseDirectory));
            // TODO: remove BaseDirectory from Config, it may cause potential issue when abused
            var baseDirectory            = EnvironmentContext.BaseDirectory;
            var intermediateOutputFolder = Path.Combine(baseDirectory, "obj");
            var outputFolder             = Path.GetFullPath(Path.Combine(string.IsNullOrEmpty(Config.OutputFolder) ? baseDirectory : Config.OutputFolder, Config.Destination ?? string.Empty));

            BuildDocument(baseDirectory, outputFolder);

            _templateManager.ProcessTheme(outputFolder, true);
            // TODO: SEARCH DATA

            if (Config?.Serve ?? false)
            {
                ServeCommand.Serve(outputFolder, Config.Host, Config.Port);
            }
            EnvironmentContext.Clean();
        }
Exemplo n.º 5
0
        public void Exec(SubCommandRunningContext context)
        {
            string originalGlobalNamespaceId = VisitorHelper.GlobalNamespaceId;

            EnvironmentContext.SetBaseDirectory(Path.GetFullPath(string.IsNullOrEmpty(Config.BaseDirectory) ? Directory.GetCurrentDirectory() : Config.BaseDirectory));
            foreach (var inputModel in InputModels)
            {
                VisitorHelper.GlobalNamespaceId = inputModel.GlobalNamespaceId;

                // TODO: Use plugin to generate metadata for files with different extension?
                using (var worker = new ExtractMetadataWorker(inputModel, inputModel.ForceRebuild, inputModel.UseCompatibilityFileName))
                {
                    // Use task.run to get rid of current context (causing deadlock in xunit)
                    var task = Task.Run(worker.ExtractMetadataAsync);
                    task.Wait();
                }
            }
            EnvironmentContext.Clean();
            VisitorHelper.GlobalNamespaceId = originalGlobalNamespaceId;
        }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
0
        private void ExecCore()
        {
            string originalGlobalNamespaceId = VisitorHelper.GlobalNamespaceId;

            EnvironmentContext.SetBaseDirectory(BaseDirectory);

            // If Root Output folder is specified from command line, use it instead of the base directory
            EnvironmentContext.SetOutputDirectory(OutputFolder ?? BaseDirectory);
            foreach (var item in Config)
            {
                VisitorHelper.GlobalNamespaceId = item.GlobalNamespaceId;

                var inputModel = ConvertToInputModel(item);

                // TODO: Use plugin to generate metadata for files with different extension?
                using (var worker = new ExtractMetadataWorker(inputModel))
                {
                    // Use task.run to get rid of current context (causing deadlock in xunit)
                    var task = Task.Run(worker.ExtractMetadataAsync);
                    task.Wait();
                }
            }
            VisitorHelper.GlobalNamespaceId = originalGlobalNamespaceId;
        }
Exemplo n.º 8
0
 public ValidateBookmarkTest()
 {
     _outputFolder = GetRandomFolder();
     EnvironmentContext.SetBaseDirectory(_outputFolder);
     EnvironmentContext.SetOutputDirectory(_outputFolder);
 }
Exemplo n.º 9
0
        public void TestFallback_InclusionWithCodeFences()
        {
            // -root_folder (this is also docset folder)
            //  |- root.md
            //  |- a_folder
            //     |- a.md
            //  |- code_folder
            //     |- sample1.cs
            // -fallback_folder
            //  |- a_folder
            //     |- code_in_a.cs
            //  |- code_folder
            //     |- sample2.cs

            // 1. Prepare data
            var root = @"markdown root.md main content start.

mardown a content in root.md content start

[!include[a](a_folder/a.md ""This is a.md"")]

mardown a content in root.md content end

sample 1 code in root.md content start

[!CODE-cs[this is sample 1 code](code_folder/sample1.cs)]

sample 1 code in root.md content end

sample 2 code in root.md content start

[!CODE-cs[this is sample 2 code](code_folder/sample2.cs)]

sample 2 code in root.md content end

markdown root.md main content end.";

            var a = @"markdown a.md main content start.

code_in_a code in a.md content start

[!CODE-cs[this is code_in_a code](code_in_a.cs)]

code_in_a in a.md content end

markdown a.md a.md content end.";

            var code_in_a = @"namespace code_in_a{}";

            var sample1 = @"namespace sample1{}";

            var sample2 = @"namespace sample2{}";

            var uniqueFolderName = Path.GetRandomFileName();

            WriteToFile($"{uniqueFolderName}/root_folder/root.md", root);
            WriteToFile($"{uniqueFolderName}/root_folder/a_folder/a.md", a);
            WriteToFile($"{uniqueFolderName}/root_folder/code_folder/sample1.cs", sample1);
            WriteToFile($"{uniqueFolderName}/fallback_folder/a_folder/code_in_a.cs", code_in_a);
            WriteToFile($"{uniqueFolderName}/fallback_folder/code_folder/sample2.cs", sample2);

            try
            {
                EnvironmentContext.SetBaseDirectory($"{uniqueFolderName}/root_folder");
                var fallbackFolders = new List <string> {
                    { Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/fallback_folder") }
                };

                // Verify root.md markup result
                var rootDependency = new HashSet <string>();
                var rootMarked     = DocfxFlavoredMarked.Markup(Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/root_folder"), root, fallbackFolders, "root.md", dependency: rootDependency);
                Assert.Equal(@"<p>markdown root.md main content start.</p>
<p>mardown a content in root.md content start</p>
<p>markdown a.md main content start.</p>
<p>code_in_a code in a.md content start</p>
<pre><code class=""lang-cs"" name=""this is code_in_a code"">namespace code_in_a{}
</code></pre><p>code_in_a in a.md content end</p>
<p>markdown a.md a.md content end.</p>
<p>mardown a content in root.md content end</p>
<p>sample 1 code in root.md content start</p>
<pre><code class=""lang-cs"" name=""this is sample 1 code"">namespace sample1{}
</code></pre><p>sample 1 code in root.md content end</p>
<p>sample 2 code in root.md content start</p>
<pre><code class=""lang-cs"" name=""this is sample 2 code"">namespace sample2{}
</code></pre><p>sample 2 code in root.md content end</p>
<p>markdown root.md main content end.</p>
".Replace("\r\n", "\n"), rootMarked);
                Assert.Equal(
                    new[] { "../fallback_folder/a_folder/code_in_a.cs", "../fallback_folder/code_folder/sample2.cs", "a_folder/a.md", "a_folder/code_in_a.cs", "code_folder/sample1.cs", "code_folder/sample2.cs" },
                    rootDependency.OrderBy(x => x));

                // Verify a.md markup result
                var aDependency = new HashSet <string>();
                var aMarked     = DocfxFlavoredMarked.Markup(Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/root_folder"), a, fallbackFolders, "a_folder/a.md", dependency: aDependency);
                Assert.Equal(@"<p>markdown a.md main content start.</p>
<p>code_in_a code in a.md content start</p>
<pre><code class=""lang-cs"" name=""this is code_in_a code"">namespace code_in_a{}
</code></pre><p>code_in_a in a.md content end</p>
<p>markdown a.md a.md content end.</p>
".Replace("\r\n", "\n"), aMarked);
                Assert.Equal(
                    new[] { "../../fallback_folder/a_folder/code_in_a.cs", "code_in_a.cs" },
                    aDependency.OrderBy(x => x));
            }
            finally
            {
                EnvironmentContext.Clean();
            }
        }
Exemplo n.º 10
0
        public void TestFallback_Inclusion_random_name()
        {
            // -root_folder (this is also docset folder)
            //  |- root.md
            //  |- a_folder
            //  |  |- a.md
            //  |- token_folder
            //  |  |- token1.md
            // -fallback_folder
            //  |- token_folder
            //     |- token2.md

            // 1. Prepare data
            var uniqueFolderName = Path.GetRandomFileName();
            var root             = $@"1markdown root.md main content start.

[!include[a](a_folder_{uniqueFolderName}/a_{uniqueFolderName}.md ""This is a.md"")]

markdown root.md main content end.";

            var a = $@"1markdown a.md main content start.

[!include[token1](../token_folder_{uniqueFolderName}/token1_{uniqueFolderName}.md ""This is token1.md"")]
[!include[token1](../token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md ""This is token2.md"")]

markdown a.md main content end.";

            var token1 = $@"1markdown token1.md content start.

[!include[token2](token2_{uniqueFolderName}.md ""This is token2.md"")]

markdown token1.md content end.";

            var token2 = @"**1markdown token2.md main content**";

            WriteToFile($"{uniqueFolderName}/root_folder_{uniqueFolderName}/root_{uniqueFolderName}.md", root);
            WriteToFile($"{uniqueFolderName}/root_folder_{uniqueFolderName}/a_folder_{uniqueFolderName}/a_{uniqueFolderName}.md", a);
            WriteToFile($"{uniqueFolderName}/root_folder_{uniqueFolderName}/token_folder_{uniqueFolderName}/token1_{uniqueFolderName}.md", token1);
            WriteToFile($"{uniqueFolderName}/fallback_folder_{uniqueFolderName}/token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md", token2);

            try
            {
                EnvironmentContext.SetBaseDirectory($"{uniqueFolderName}/root_folder_{uniqueFolderName}");
                var fallbackFolders = new List <string> {
                    { Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/fallback_folder_{uniqueFolderName}") }
                };
                var dependency = new HashSet <string>();
                var marked     = DocfxFlavoredMarked.Markup(Path.Combine(Directory.GetCurrentDirectory(), $"{uniqueFolderName}/root_folder_{uniqueFolderName}"), root, fallbackFolders, $"root_{uniqueFolderName}.md", dependency: dependency);
                Assert.Equal($@"<p>1markdown root.md main content start.</p>
<p>1markdown a.md main content start.</p>
<p>1markdown token1.md content start.</p>
<p><strong>1markdown token2.md main content</strong></p>
<p>markdown token1.md content end.</p>
<p><strong>1markdown token2.md main content</strong></p>
<p>markdown a.md main content end.</p>
<p>markdown root.md main content end.</p>
".Replace("\r\n", "\n"), marked);
                Assert.Equal(
                    new[] { $"../fallback_folder_{uniqueFolderName}/token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md", $"a_folder_{uniqueFolderName}/a_{uniqueFolderName}.md", $"token_folder_{uniqueFolderName}/token1_{uniqueFolderName}.md", $"token_folder_{uniqueFolderName}/token2_{uniqueFolderName}.md" },
                    dependency.OrderBy(x => x));
            }
            finally
            {
                EnvironmentContext.Clean();
            }
        }
Exemplo n.º 11
0
 public RemoveDebugInfoTest()
 {
     _outputFolder = GetRandomFolder();
     EnvironmentContext.SetBaseDirectory(_outputFolder);
     EnvironmentContext.SetOutputDirectory(_outputFolder);
 }