Advertisement
andruhovski

MD-to-HTML tool

May 31st, 2020
1,430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.62 KB | None | 0 0
  1. using System.Linq;
  2. using Aspose.Html;
  3. using Newtonsoft.Json;
  4.  
  5. namespace Aspose.DocMaker
  6. {
  7.     class Program
  8.     {
  9.         private const string Path = @"D:\Github\Aspose.PDF.Docs";
  10.         private const string Theme = @"D:\Github\Aspose.PDF.Docs\template\demo01";
  11.         private static readonly License License = new License();
  12.         static void Main()
  13.         {
  14.             License.SetLicense(@"C:\Keys\Aspose.Total.Product.Family.lic");
  15.             var inputPath = System.IO.Path.Combine(Path, "input");
  16.             var outputPath = System.IO.Path.Combine(Path, "output");
  17.             ScanFolders(inputPath);
  18.             RenderStaticPages(inputPath, outputPath);
  19.         }
  20.  
  21.         private static void RenderStaticPages(string inputPath, string outputPath)
  22.         {
  23.             InputConfig inputConfig;
  24.             if (System.IO.Directory.Exists(outputPath))
  25.                 System.IO.Directory.CreateDirectory(outputPath);
  26.             var inputConfigFile = System.IO.Path.Combine(inputPath, "index.json");
  27.             if (System.IO.File.Exists(inputConfigFile))
  28.             {
  29.                 var json = System.IO.File.ReadAllText(inputConfigFile);
  30.                 inputConfig = JsonConvert.DeserializeObject<InputConfig>(json);
  31.             }
  32.             else
  33.             {
  34.                 inputConfig = new InputConfig();
  35.             }
  36.             var indexTemplate = System.IO.Path.Combine(Theme, "index.html");
  37.             var outputIndexFile = System.IO.Path.Combine(outputPath, "index.html");
  38.             var document = new HTMLDocument(indexTemplate);
  39.             var menuPlaceholder = document.GetElementById("aspose-menu-placeholder");
  40.  
  41.             foreach (var folder in inputConfig.Folders.OrderBy(f => f.Order))
  42.             {
  43.                 if (document.GetElementById("aspose-menu-item") is HTMLTemplateElement menuItemTemplate)
  44.                 {
  45.                     var menuNode = menuItemTemplate.Content.CloneNode(true) as Html.Dom.DocumentFragment;
  46.  
  47.                     var titleElements = menuNode?.QuerySelectorAll(".aspose-menu-item-title").Cast<HTMLElement>();
  48.                     if (titleElements != null)
  49.                         foreach (var element in titleElements)
  50.                         {
  51.                             element.InnerHTML = folder.Title;
  52.                         }
  53.  
  54.                     var anchorElements = menuNode?.QuerySelectorAll(".aspose-menu-item-href").Cast<HTMLAnchorElement>();
  55.                     if (anchorElements != null)
  56.                         foreach (var element in anchorElements)
  57.                         {
  58.                             element.Href =$"{folder.Name}/index.html";
  59.                         }
  60.                     menuPlaceholder.AppendChild(menuNode);
  61.                 }
  62.  
  63.                 RenderStaticPages(
  64.                     System.IO.Path.Combine(inputPath, folder.Name),
  65.                     System.IO.Path.Combine(outputPath, folder.Name));
  66.             }
  67.            
  68.  
  69.             var pageTemplateFileName = System.IO.Path.Combine(Theme, "page.html");
  70.             var pageDocument = new Aspose.Html.HTMLDocument(pageTemplateFileName);
  71.             var contentPlaceholder = pageDocument.GetElementById("aspose-content-placeholder");
  72.  
  73.             foreach (var page in inputConfig.Pages)
  74.             {
  75.                 var markdownFileName = System.IO.Path.Combine(inputPath, page.Name + ".md");
  76.                 var pageFileName = System.IO.Path.Combine(outputPath, page.Name + ".html");
  77.                 var markdownContent = Aspose.Html.Converters.Converter.ConvertMarkdown(markdownFileName);
  78.                 pageDocument.Title = page.Title;
  79.                 contentPlaceholder.InnerHTML = markdownContent.GetElementsByTagName("body")[0].InnerHTML;
  80.                 var tables = pageDocument.GetElementsByTagName("table");
  81.                 foreach (var element in tables)
  82.                 {
  83.                     element.ClassName = "table table-bordered";
  84.                 }
  85.                 pageDocument.Save(pageFileName);
  86.                 pageDocument.Title = string.Empty;
  87.                 if (document.GetElementById("aspose-menu-item") is HTMLTemplateElement menuItemTemplate)
  88.                 {
  89.                     var menuNode = menuItemTemplate.Content.CloneNode(true) as Aspose.Html.Dom.DocumentFragment;
  90.  
  91.                     var titleElements = menuNode?.QuerySelectorAll(".aspose-menu-item-title").Cast<HTMLElement>();
  92.                     if (titleElements != null)
  93.                         foreach (var element in titleElements)
  94.                         {
  95.                             element.InnerHTML = page.Title;
  96.                         }
  97.  
  98.                     var anchorElements = menuNode?.QuerySelectorAll(".aspose-menu-item-href").Cast<HTMLAnchorElement>();
  99.                     if (anchorElements != null)
  100.                         foreach (var element in anchorElements)
  101.                         {
  102.                             element.Href = $"{page.Name}.html";
  103.                         }
  104.                     menuPlaceholder.AppendChild(menuNode);
  105.                 }
  106.             }
  107.  
  108.  
  109.             document.Save(outputIndexFile);
  110.         }
  111.  
  112.  
  113.         private static void ScanFolders(string inputPath)
  114.         {
  115.             var inputConfigFile = System.IO.Path.Combine(inputPath, "index.json");
  116.  
  117.             InputConfig inputConfig;
  118.  
  119.             if (System.IO.File.Exists(inputConfigFile))
  120.             {
  121.                 var json = System.IO.File.ReadAllText(inputConfigFile);
  122.                 inputConfig = JsonConvert.DeserializeObject<InputConfig>(json);
  123.             }
  124.             else
  125.             {
  126.                 inputConfig = new InputConfig();
  127.             }
  128.  
  129.             foreach (var folder in System.IO.Directory.GetDirectories(inputPath))
  130.             {
  131.                 ScanFolders(folder);
  132.                 var folderName = System.IO.Path.GetFileName(folder.TrimEnd(System.IO.Path.DirectorySeparatorChar));
  133.                 if (!inputConfig.Folders.Any(f => f.Name.Equals(folderName)))
  134.                     inputConfig.Folders.Add(new Folder() { Name = folderName, Order = 1000, Title = folderName });
  135.  
  136.             }
  137.  
  138.             foreach (var file in System.IO.Directory.GetFiles(inputPath, "*.md"))
  139.             {
  140.                 var pageFileName = System.IO.Path.GetFileNameWithoutExtension(file);
  141.                 if (!inputConfig.Pages.Any(f =>f.Name.StartsWith(pageFileName)))
  142.                     inputConfig.Pages.Add(new Page() { Name = pageFileName, Order = 1000, Title = pageFileName });
  143.             }
  144.             System.IO.File.WriteAllText(inputConfigFile, JsonConvert.SerializeObject(inputConfig, Formatting.Indented));
  145.  
  146.         }
  147.     }
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement