1using System.Collections.Generic;
3using System.Threading.Tasks;
23 private bool elementsOpen =
false;
29 : this(
XML.WriterSettings(false, true))
40 this.xmlOutput = XmlWriter.Create(this.
Output, XmlSettings);
51 this.xmlOutput = XmlWriter.Create(this.Output, XmlSettings);
59 this.xmlOutput.Dispose();
67 this.xmlOutput.WriteStartElement(
"parsedMakdown",
"http://waher.se/Schema/Markdown.xsd");
68 this.xmlOutput.WriteAttributeString(
"isDynamic",
CommonTypes.
Encode(
this.Document.IsDynamic));
72 this.xmlOutput.WriteStartElement(
"metaData");
74 foreach (KeyValuePair<
string, KeyValuePair<string, bool>[]> P
in this.
Document.
MetaData)
76 this.xmlOutput.WriteStartElement(
"tag", P.Key);
78 foreach (KeyValuePair<string, bool> P2
in P.Value)
80 this.xmlOutput.WriteStartElement(
"value", P2.Key);
82 this.xmlOutput.WriteEndElement();
85 this.xmlOutput.WriteEndElement();
88 this.xmlOutput.WriteEndElement();
91 this.xmlOutput.WriteStartElement(
"elements");
92 this.elementsOpen =
true;
94 return Task.CompletedTask;
102 if (this.elementsOpen)
104 this.xmlOutput.WriteEndElement();
105 this.elementsOpen =
false;
108 await this.RenderReferences();
112 this.xmlOutput.WriteStartElement(
"footnotes");
119 await F.Render(
this);
123 this.xmlOutput.WriteEndElement();
127 private async Task RenderReferences()
131 this.xmlOutput.WriteStartElement(
"references");
135 this.xmlOutput.WriteStartElement(
"reference");
136 this.xmlOutput.WriteAttributeString(
"key", P.Key);
138 await P.Value.Render(
this);
140 this.xmlOutput.WriteEndElement();
143 this.xmlOutput.WriteEndElement();
152 if (this.elementsOpen)
154 this.xmlOutput.WriteEndElement();
155 this.elementsOpen =
false;
157 await this.RenderReferences();
160 this.xmlOutput.WriteEndElement();
161 this.xmlOutput.Flush();
171 this.xmlOutput.WriteStartElement(ElementName);
173 this.xmlOutput.WriteEndElement();
183 this.xmlOutput.WriteStartElement(ElementName);
185 this.xmlOutput.WriteEndElement();
195 this.xmlOutput.WriteElementString(ElementName,
string.Empty);
198 #region Span Elements
207 this.xmlOutput.WriteAttributeString(
"description", Element.
Description);
211 this.xmlOutput.WriteEndElement();
221 this.xmlOutput.WriteAttributeString(
"eMail", Element.
EMail);
222 this.xmlOutput.WriteEndElement();
224 return Task.CompletedTask;
234 this.xmlOutput.WriteAttributeString(
"url", Element.
URL);
235 this.xmlOutput.WriteEndElement();
237 return Task.CompletedTask;
246 return this.RenderElement(Element, nameof(
Delete));
255 this.RenderElement(Element,
"Details");
256 return Task.CompletedTask;
265 this.xmlOutput.WriteStartElement(
"Emoji");
266 this.xmlOutput.WriteAttributeString(
"shortName", Element.
Emoji.ShortName);
268 if (Element.
Level > 1)
269 this.xmlOutput.WriteAttributeString(
"level", Element.
Level.ToString());
271 this.xmlOutput.WriteEndElement();
273 return Task.CompletedTask;
282 return this.RenderElement(Element, nameof(
Emphasize));
292 this.xmlOutput.WriteAttributeString(
"key", Element.
Key);
294 if (this.
Document?.TryGetFootnoteNumber(Element.
Key, out
int Nr) ??
false)
295 this.xmlOutput.WriteAttributeString(
"nr", Nr.ToString());
300 await this.
Render(Footnote);
302 Footnote.Referenced =
true;
305 this.xmlOutput.WriteEndElement();
314 this.xmlOutput.WriteElementString(nameof(
HashTag), Element.
Tag);
316 return Task.CompletedTask;
327 return Task.CompletedTask;
338 return Task.CompletedTask;
347 this.xmlOutput.WriteStartElement(nameof(
InlineCode));
348 this.xmlOutput.WriteCData(Element.
Code);
349 this.xmlOutput.WriteEndElement();
351 return Task.CompletedTask;
360 this.xmlOutput.WriteStartElement(
"Html");
361 this.xmlOutput.WriteCData(Element.
HTML);
362 this.xmlOutput.WriteEndElement();
364 return Task.CompletedTask;
373 this.xmlOutput.WriteStartElement(
"Script");
374 this.xmlOutput.WriteAttributeString(
"expression", Element.
Expression.Script);
376 this.xmlOutput.WriteEndElement();
378 return Task.CompletedTask;
389 return Task.CompletedTask;
398 return this.RenderElement(Element, nameof(
Insert));
407 this.xmlOutput.WriteElementString(nameof(
LineBreak),
string.Empty);
409 return Task.CompletedTask;
418 this.xmlOutput.WriteStartElement(nameof(
Link));
419 this.xmlOutput.WriteAttributeString(
"url", Element.
Url);
420 this.xmlOutput.WriteAttributeString(
"title", Element.
Title);
424 this.xmlOutput.WriteEndElement();
434 this.xmlOutput.WriteAttributeString(
"label", Element.
Label);
438 this.xmlOutput.WriteEndElement();
448 this.xmlOutput.WriteAttributeString(
"key", Element.
Key);
449 this.xmlOutput.WriteEndElement();
451 return Task.CompletedTask;
460 this.xmlOutput.WriteStartElement(nameof(
Multimedia));
466 Item.
Export(this.xmlOutput);
468 this.xmlOutput.WriteEndElement();
478 this.xmlOutput.WriteAttributeString(
"label", Element.
Label);
482 this.xmlOutput.WriteEndElement();
500 return this.RenderElement(Element, nameof(
Strong));
509 return this.RenderElement(Element, nameof(
SubScript));
518 return this.RenderElement(Element, nameof(
SuperScript));
527 return this.RenderElement(Element, nameof(
Underline));
532 #region Block elements
540 return this.RenderElement(Element, nameof(
BlockQuote));
549 return this.RenderElement(Element, nameof(
BulletList));
567 this.xmlOutput.WriteStartElement(nameof(
CodeBlock));
568 this.xmlOutput.WriteAttributeString(
"language", Element.
Language);
569 this.xmlOutput.WriteAttributeString(
"start", Element.
Start.ToString());
570 this.xmlOutput.WriteAttributeString(
"end", Element.
End.ToString());
571 this.xmlOutput.WriteAttributeString(
"indent", Element.
Indent.ToString());
572 this.xmlOutput.WriteAttributeString(
"indentString", Element.
IndentString);
576 for (i = Element.
Start; i <= Element.
End; i++)
577 this.xmlOutput.WriteElementString(
"Row", Element.
Rows[i]);
579 this.xmlOutput.WriteEndElement();
581 return Task.CompletedTask;
592 foreach (
string s
in Element.Rows)
593 this.xmlOutput.WriteElementString(
"Row", s);
595 this.xmlOutput.WriteEndElement();
597 return Task.CompletedTask;
633 return this.RenderElement(Element, nameof(
DeleteBlocks));
642 this.xmlOutput.WriteStartElement(nameof(
Footnote));
643 this.xmlOutput.WriteAttributeString(
"key", Element.
Key);
646 this.xmlOutput.WriteAttributeString(
"nr", Nr.ToString());
650 this.xmlOutput.WriteEndElement();
659 this.xmlOutput.WriteStartElement(nameof(
Header));
660 this.xmlOutput.WriteAttributeString(
"id", await Element.
Id);
661 this.xmlOutput.WriteAttributeString(
"level", Element.
Level.ToString());
665 this.xmlOutput.WriteEndElement();
675 return Task.CompletedTask;
684 return this.RenderElement(Element, nameof(
HtmlBlock));
693 return this.RenderElement(Element, nameof(
InsertBlocks));
703 return Task.CompletedTask;
712 return this.RenderElement(Element, nameof(
LeftAligned));
730 return this.RenderElement(Element, nameof(
NestedBlock));
740 this.xmlOutput.WriteAttributeString(
"number", Element.
Number.ToString());
745 this.xmlOutput.WriteEndElement();
754 return this.RenderElement(Element, nameof(
NumberedList));
763 this.xmlOutput.WriteStartElement(nameof(
Paragraph));
769 this.xmlOutput.WriteEndElement();
778 return this.RenderElement(Element, nameof(
RightAligned));
787 this.xmlOutput.WriteStartElement(nameof(
Sections));
788 this.xmlOutput.WriteAttributeString(
"nrColumns", Element.
InitialNrColumns.ToString());
790 this.xmlOutput.WriteEndElement();
800 this.xmlOutput.WriteAttributeString(
"sectionNr", Element.
SectionNr.ToString());
801 this.xmlOutput.WriteAttributeString(
"nrColumns", Element.
NrColumns.ToString());
802 this.xmlOutput.WriteEndElement();
804 return Task.CompletedTask;
816 int NrRows, RowIndex;
817 int NrColumns = Element.
Columns;
820 this.xmlOutput.WriteStartElement(nameof(
Table));
821 this.xmlOutput.WriteAttributeString(
"caption", Element.
Caption);
822 this.xmlOutput.WriteAttributeString(
"id", Element.
Id);
823 this.xmlOutput.WriteAttributeString(
"columns", Element.
Columns.ToString());
827 this.xmlOutput.WriteStartElement(
"Column");
828 this.xmlOutput.WriteAttributeString(
"alignment", Col.ToString());
829 this.xmlOutput.WriteEndElement();
832 NrRows = Element.Headers.Length;
833 for (RowIndex = 0; RowIndex < NrRows; RowIndex++)
835 Row = Element.Headers[RowIndex];
836 CellAlignments = Element.HeaderCellAlignments[RowIndex];
838 this.xmlOutput.WriteStartElement(
"HeaderRow");
840 for (ColumnIndex = 0;ColumnIndex<NrColumns; ColumnIndex++)
842 E = Row[ColumnIndex];
845 this.xmlOutput.WriteElementString(
"Continue",
string.Empty);
848 this.xmlOutput.WriteStartElement(
"HeaderCell");
849 this.xmlOutput.WriteAttributeString(
"alignment",
850 (CellAlignments[ColumnIndex] ?? Element.ColumnAlignments[ColumnIndex]).ToString());
854 this.xmlOutput.WriteEndElement();
858 this.xmlOutput.WriteEndElement();
861 NrRows = Element.Rows.Length;
862 for (RowIndex = 0; RowIndex < NrRows; RowIndex++)
864 Row = Element.Rows[RowIndex];
865 CellAlignments = Element.RowCellAlignments[RowIndex];
867 this.xmlOutput.WriteStartElement(
"Row");
869 for (ColumnIndex = 0; ColumnIndex < NrColumns; ColumnIndex++)
871 E = Row[ColumnIndex];
874 this.xmlOutput.WriteElementString(
"Continue",
string.Empty);
877 this.xmlOutput.WriteStartElement(
"Cell");
878 this.xmlOutput.WriteAttributeString(
"alignment",
879 (CellAlignments[ColumnIndex] ?? Element.ColumnAlignments[ColumnIndex]).ToString());
883 this.xmlOutput.WriteEndElement();
887 this.xmlOutput.WriteEndElement();
890 this.xmlOutput.WriteEndElement();
899 this.xmlOutput.WriteStartElement(nameof(
TaskItem));
902 this.xmlOutput.WriteEndElement();
911 return this.RenderElement(Element, nameof(
TaskList));
920 this.xmlOutput.WriteStartElement(
"UnnumberedItem");
921 this.xmlOutput.WriteAttributeString(
"prefix", Element.
Prefix);
923 this.xmlOutput.WriteEndElement();
Helps with parsing of commong data types.
static string Encode(bool x)
Encodes a Boolean for use in XML and other formats.
bool TryGetFootnoteNumber(string Key, out int Number)
Tries to get the number of a footnote, given its key.
IEnumerable< KeyValuePair< string, KeyValuePair< string, bool >[]> > MetaData
Meta-data
IEnumerable< string > FootnoteOrder
Order of footnotes.
IEnumerable< KeyValuePair< string, Multimedia > > References
Multimedia references
Represents a block quote in a markdown document.
Represents a bullet list in a markdown document.
Represents a center-aligned set of blocks in a markdown document.
Represents a code block in a markdown document.
string IndentString
String used for indentation.
int Indent
Code block indentation.
string[] Rows
Rows in code block
Represents a definition list in a markdown document.
Represents inserted blocks in a markdown document.
Represents a block of HTML in a markdown document.
Represents inserted blocks in a markdown document.
Represents a left-aligned set of blocks in a markdown document.
Represents a margin-aligned set of blocks in a markdown document.
Represents a nested block with no special formatting rules in a markdown document.
Represents a numbered item in an ordered list.
bool NumberExplicit
If number is explicitly provided (true) or inferred (false).
int Number
Number associated with item.
Represents a numbered list in a markdown document.
Represents a paragraph in a markdown document.
bool Implicit
If paragraph is implicit or not.
Represents a right-aligned set of blocks in a markdown document.
int NrColumns
Number of columns in following section.
int SectionNr
Section number.
Represents a sequence of sections.
int InitialNrColumns
Number of columns for initial section.
Represents a table in a markdown document.
string Caption
Table caption.
int Columns
Number of columns.
Represents a task item in a task list.
bool IsChecked
If the item is checked or not.
Represents a task list in a markdown document.
Represents an unnumbered item in an ordered list.
string Prefix
Prefix, in plain text mode.
Abstract base class for all markdown elements with a variable number of child elements.
Abstract base class for all markdown elements.
abstract Task Render(IRenderer Output)
Renders the element.
MarkdownDocument Document
Markdown document.
Abstract base class for all markdown elements with one child element.
void Export(XmlWriter Output)
Exports the element to XML.
string Description
Description
int Level
Level (number of colons used to define the emoji)
EmojiInfo Emoji
Emoji information.
Represents an HTML entity.
Represents an HTML entity in Unicode format.
int Code
Unicode character
bool AloneInParagraph
If the element is alone in a paragraph.
Expression Expression
Expression
string Value
Unformatted text.
string Title
Optional Link title.
bool AloneInParagraph
If the element is alone in a paragraph.
Abstract base class for Markdown renderers.
readonly StringBuilder Output
Renderer output.
Task RenderChild(MarkdownElementSingleChild Element)
Renders the child of Element .
async Task RenderChildren(MarkdownElementChildren Element)
Renders the children of Element .
MarkdownDocument Document
Reference to Markdown document being processed.
Renders XML from a Markdown document.
override void Dispose()
Disposes of the renderer.
override Task Render(StrikeThrough Element)
Renders Element .
override Task Render(HashTag Element)
Renders Element .
override async Task Render(LinkReference Element)
Renders Element .
override async Task RenderDocumentFooter()
Renders the document header.
override Task Render(InsertBlocks Element)
Renders Element .
override async Task Render(Footnote Element)
Renders Element .
override Task Render(MarginAligned Element)
Renders Element .
override Task Render(TaskList Element)
Renders Element .
override async Task Render(Table Element)
Renders Element .
override Task Render(NestedBlock Element)
Renders Element .
override Task Render(InlineCode Element)
Renders Element .
override Task Render(Emphasize Element)
Renders Element .
override async Task Render(Sections Element)
Renders Element .
override Task Render(BulletList Element)
Renders Element .
override Task Render(HtmlEntityUnicode Element)
Renders Element .
override Task Render(CenterAligned Element)
Renders Element .
override async Task Render(FootnoteReference Element)
Renders Element .
override Task Render(NumberedList Element)
Renders Element .
override Task Render(DefinitionTerms Element)
Renders Element .
override Task Render(SubScript Element)
Renders Element .
override Task Render(InlineHTML Element)
Renders Element .
override Task Render(AutomaticLinkMail Element)
Renders Element .
override async Task Render(Link Element)
Renders Element .
override async Task Render(MultimediaReference Element)
Renders Element .
override async Task Render(Abbreviation Element)
Renders Element .
override Task Render(DetailsReference Element)
Renders Element .
XmlRenderer(XmlWriterSettings XmlSettings)
Renders XML from a Markdown document.
override Task Render(Strong Element)
Renders Element .
override Task Render(InlineText Element)
Renders Element .
override Task Render(SuperScript Element)
Renders Element .
override async Task Render(NumberedItem Element)
Renders Element .
XmlRenderer()
Renders XML from a Markdown document.
override Task Render(Insert Element)
Renders Element .
override Task Render(HorizontalRule Element)
Renders Element .
override Task Render(BlockQuote Element)
Renders Element .
override Task Render(HtmlEntity Element)
Renders Element .
override Task Render(RightAligned Element)
Renders Element .
override Task Render(Underline Element)
Renders Element .
override Task Render(DefinitionDescriptions Element)
Renders Element .
XmlRenderer(StringBuilder Output, XmlWriterSettings XmlSettings)
Renders XML from a Markdown document.
override Task Render(CommentBlock Element)
Renders Element .
override Task Render(InvisibleBreak Element)
Renders Element .
override async Task Render(Multimedia Element)
Renders Element .
override Task Render(LeftAligned Element)
Renders Element .
override Task Render(DefinitionList Element)
Renders Element .
override Task Render(DeleteBlocks Element)
Renders Element .
override async Task Render(Paragraph Element)
Renders Element .
override Task Render(InlineScript Element)
Renders Element .
override Task Render(EmojiReference Element)
Renders Element .
override Task Render(CodeBlock Element)
Renders Element .
override async Task Render(Header Element)
Renders Element .
override async Task Render(UnnumberedItem Element)
Renders Element .
override Task RenderDocumentHeader()
Renders the document header.
readonly XmlWriter xmlOutput
XML output
override async Task RenderFootnotes()
Renders footnotes.
override Task Render(HtmlBlock Element)
Renders Element .
override Task Render(AutomaticLinkUrl Element)
Renders Element .
override async Task Render(TaskItem Element)
Renders Element .
override Task Render(SectionSeparator Element)
Renders Element .
override Task Render(Delete Element)
Renders Element .
override Task Render(MetaReference Element)
Renders Element .
override Task Render(LineBreak Element)
Renders Element .
Helps with common XML-related tasks.
TextAlignment
Text alignment of contents.