-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMarkdownRenderer.cs
More file actions
79 lines (67 loc) · 3.08 KB
/
MarkdownRenderer.cs
File metadata and controls
79 lines (67 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
namespace Docx.Renderer.Markdown;
public class MarkdownRenderer : IMarkdownRenderer
{
private readonly DocxMarkdownFormatting options;
private readonly List<IMarkdownObjectRenderer> renderers;
public MarkdownRenderer(DocxMarkdownFormatting options)
{
this.options = options;
renderers = new List<IMarkdownObjectRenderer>
{
new Renderers.ParagraphRenderer(),
new Renderers.TableRenderer(),
new Renderers.RunRenderer(),
new Renderers.IgnoredBlocks()
};
}
public string MarkdownFolder { get; private set; }
public string MediaFolder { get; private set; }
public string ConvertAbsoluteUrl(string url) => options?.ConvertAbsoluteUrls(url) ?? url;
public bool PreferPlainMarkdown => options.PreferPlainMarkdown;
public void Convert(string docxFile, string markdownFile, string mediaFolder)
{
if (string.IsNullOrEmpty(docxFile))
throw new ArgumentException("Value cannot be null or empty.", nameof(docxFile));
if (!File.Exists(docxFile))
throw new ArgumentException($"{docxFile} does not exist.", nameof(docxFile));
if (string.IsNullOrEmpty(markdownFile))
throw new ArgumentException("Value cannot be null or empty.", nameof(markdownFile));
if (Path.GetInvalidPathChars().Any(markdownFile.Contains))
throw new ArgumentException($"{markdownFile} is an invalid filename.", nameof(markdownFile));
if (string.IsNullOrEmpty(mediaFolder))
throw new ArgumentException("Value cannot be null or empty.", nameof(mediaFolder));
MarkdownFolder = Path.GetDirectoryName(markdownFile) ?? "";
MediaFolder = mediaFolder;
if (File.Exists(markdownFile))
File.Delete(markdownFile);
using var wordDocument = Document.Load(docxFile);
var markdownDocument = new MarkdownDocument();
var renderer = this as IMarkdownRenderer;
renderer.WriteContainer(markdownDocument, null, wordDocument.Blocks, null);
using var writer = new StreamWriter(markdownFile);
markdownDocument.Write(writer, options);
}
public IMarkdownObjectRenderer FindRenderer(object element)
=> renderers.FirstOrDefault(r => r.CanRender(element));
public void WriteContainer(MarkdownDocument document, MarkdownBlock blockOwner, IEnumerable<object> container, RenderBag tags)
{
foreach (var block in container)
{
WriteElement(document, blockOwner, block, tags);
}
}
public void WriteElement(MarkdownDocument document, MarkdownBlock blockOwner,
object element, RenderBag tags)
{
var renderer = FindRenderer(element);
if (renderer != null)
renderer.Render(this, document, blockOwner, element, tags);
else
{
if (element is UnknownBlock ub)
Console.Error.WriteLine($"Missing renderer for unknown block type: {ub.Name}");
else
Console.Error.WriteLine($"Missing renderer for {element.GetType().Name}");
}
}
}