using System.Linq; using Aspose.Html; using Newtonsoft.Json; namespace Aspose.DocMaker { class Program { private const string Path = @"D:\Github\Aspose.PDF.Docs"; private const string Theme = @"D:\Github\Aspose.PDF.Docs\template\demo01"; private static readonly License License = new License(); static void Main() { License.SetLicense(@"C:\Keys\Aspose.Total.Product.Family.lic"); var inputPath = System.IO.Path.Combine(Path, "input"); var outputPath = System.IO.Path.Combine(Path, "output"); ScanFolders(inputPath); RenderStaticPages(inputPath, outputPath); } private static void RenderStaticPages(string inputPath, string outputPath) { InputConfig inputConfig; if (System.IO.Directory.Exists(outputPath)) System.IO.Directory.CreateDirectory(outputPath); var inputConfigFile = System.IO.Path.Combine(inputPath, "index.json"); if (System.IO.File.Exists(inputConfigFile)) { var json = System.IO.File.ReadAllText(inputConfigFile); inputConfig = JsonConvert.DeserializeObject(json); } else { inputConfig = new InputConfig(); } var indexTemplate = System.IO.Path.Combine(Theme, "index.html"); var outputIndexFile = System.IO.Path.Combine(outputPath, "index.html"); var document = new HTMLDocument(indexTemplate); var menuPlaceholder = document.GetElementById("aspose-menu-placeholder"); foreach (var folder in inputConfig.Folders.OrderBy(f => f.Order)) { if (document.GetElementById("aspose-menu-item") is HTMLTemplateElement menuItemTemplate) { var menuNode = menuItemTemplate.Content.CloneNode(true) as Html.Dom.DocumentFragment; var titleElements = menuNode?.QuerySelectorAll(".aspose-menu-item-title").Cast(); if (titleElements != null) foreach (var element in titleElements) { element.InnerHTML = folder.Title; } var anchorElements = menuNode?.QuerySelectorAll(".aspose-menu-item-href").Cast(); if (anchorElements != null) foreach (var element in anchorElements) { element.Href =$"{folder.Name}/index.html"; } menuPlaceholder.AppendChild(menuNode); } RenderStaticPages( System.IO.Path.Combine(inputPath, folder.Name), System.IO.Path.Combine(outputPath, folder.Name)); } var pageTemplateFileName = System.IO.Path.Combine(Theme, "page.html"); var pageDocument = new Aspose.Html.HTMLDocument(pageTemplateFileName); var contentPlaceholder = pageDocument.GetElementById("aspose-content-placeholder"); foreach (var page in inputConfig.Pages) { var markdownFileName = System.IO.Path.Combine(inputPath, page.Name + ".md"); var pageFileName = System.IO.Path.Combine(outputPath, page.Name + ".html"); var markdownContent = Aspose.Html.Converters.Converter.ConvertMarkdown(markdownFileName); pageDocument.Title = page.Title; contentPlaceholder.InnerHTML = markdownContent.GetElementsByTagName("body")[0].InnerHTML; var tables = pageDocument.GetElementsByTagName("table"); foreach (var element in tables) { element.ClassName = "table table-bordered"; } pageDocument.Save(pageFileName); pageDocument.Title = string.Empty; if (document.GetElementById("aspose-menu-item") is HTMLTemplateElement menuItemTemplate) { var menuNode = menuItemTemplate.Content.CloneNode(true) as Aspose.Html.Dom.DocumentFragment; var titleElements = menuNode?.QuerySelectorAll(".aspose-menu-item-title").Cast(); if (titleElements != null) foreach (var element in titleElements) { element.InnerHTML = page.Title; } var anchorElements = menuNode?.QuerySelectorAll(".aspose-menu-item-href").Cast(); if (anchorElements != null) foreach (var element in anchorElements) { element.Href = $"{page.Name}.html"; } menuPlaceholder.AppendChild(menuNode); } } document.Save(outputIndexFile); } private static void ScanFolders(string inputPath) { var inputConfigFile = System.IO.Path.Combine(inputPath, "index.json"); InputConfig inputConfig; if (System.IO.File.Exists(inputConfigFile)) { var json = System.IO.File.ReadAllText(inputConfigFile); inputConfig = JsonConvert.DeserializeObject(json); } else { inputConfig = new InputConfig(); } foreach (var folder in System.IO.Directory.GetDirectories(inputPath)) { ScanFolders(folder); var folderName = System.IO.Path.GetFileName(folder.TrimEnd(System.IO.Path.DirectorySeparatorChar)); if (!inputConfig.Folders.Any(f => f.Name.Equals(folderName))) inputConfig.Folders.Add(new Folder() { Name = folderName, Order = 1000, Title = folderName }); } foreach (var file in System.IO.Directory.GetFiles(inputPath, "*.md")) { var pageFileName = System.IO.Path.GetFileNameWithoutExtension(file); if (!inputConfig.Pages.Any(f =>f.Name.StartsWith(pageFileName))) inputConfig.Pages.Add(new Page() { Name = pageFileName, Order = 1000, Title = pageFileName }); } System.IO.File.WriteAllText(inputConfigFile, JsonConvert.SerializeObject(inputConfig, Formatting.Indented)); } } }