3using System.Collections.Generic;
5using System.Threading.Tasks;
93 this.XmlOutput = XmlWriter.Create(this.
Output, XmlSettings);
106 this.XmlOutput = XmlWriter.Create(this.Output, XmlSettings);
114 this.XmlOutput.Dispose();
127 this.StrikeThrough =
false;
128 this.Underline =
false;
129 this.Superscript =
false;
130 this.Subscript =
false;
132 this.InLabel =
false;
133 this.Hyperlink =
null;
135 return base.RenderDocument(
Document, Inclusion);
143 this.XmlOutput.WriteStartElement(
"StackLayout",
"http://xamarin.com/schemas/2014/forms");
144 this.XmlOutput.WriteAttributeString(
"xmlns",
"x",
null,
"http://schemas.microsoft.com/winfx/2009/xaml");
145 this.XmlOutput.WriteAttributeString(
"Spacing",
"0");
147 return Task.CompletedTask;
156 string FootnoteMargin =
"0," + this.XamlSettings.ParagraphMarginTop.
ToString() +
"," +
157 this.XamlSettings.FootnoteSeparator.ToString() +
"," +
158 this.XamlSettings.ParagraphMarginBottom.ToString();
160 string Offset = this.XamlSettings.SuperscriptOffset.ToString();
164 this.XmlOutput.WriteStartElement(
"BoxView");
165 this.XmlOutput.WriteAttributeString(
"HeightRequest",
"1");
166 this.XmlOutput.WriteAttributeString(
"BackgroundColor", this.XamlSettings.TableCellBorderColor);
167 this.XmlOutput.WriteAttributeString(
"HorizontalOptions",
"FillAndExpand");
168 this.XmlOutput.WriteAttributeString(
"Margin", this.XamlSettings.ParagraphMargins);
169 this.XmlOutput.WriteEndElement();
171 this.XmlOutput.WriteStartElement(
"Grid");
172 this.XmlOutput.WriteAttributeString(
"RowSpacing",
"0");
173 this.XmlOutput.WriteAttributeString(
"ColumnSpacing",
"0");
175 this.XmlOutput.WriteStartElement(
"Grid.ColumnDefinitions");
177 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
178 this.XmlOutput.WriteAttributeString(
"Width",
"Auto");
179 this.XmlOutput.WriteEndElement();
181 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
182 this.XmlOutput.WriteAttributeString(
"Width",
"*");
183 this.XmlOutput.WriteEndElement();
185 this.XmlOutput.WriteEndElement();
186 this.XmlOutput.WriteStartElement(
"Grid.RowDefinitions");
190 if ((this.
Document?.TryGetFootnoteNumber(Key, out Nr) ??
false) &&
194 this.XmlOutput.WriteStartElement(
"RowDefinition");
195 this.XmlOutput.WriteAttributeString(
"Height",
"Auto");
196 this.XmlOutput.WriteEndElement();
200 this.XmlOutput.WriteEndElement();
204 if ((this.
Document?.TryGetFootnoteNumber(Key, out Nr) ??
false) &&
208 this.XmlOutput.WriteStartElement(
"ContentView");
209 this.XmlOutput.WriteAttributeString(
"Margin", FootnoteMargin);
210 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"0");
211 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
212 this.XmlOutput.WriteAttributeString(
"Scale", Scale);
213 this.XmlOutput.WriteAttributeString(
"TranslationY", Offset);
215 this.XmlOutput.WriteStartElement(
"Label");
216 this.XmlOutput.WriteAttributeString(
"Text", Nr.ToString());
217 this.XmlOutput.WriteEndElement();
218 this.XmlOutput.WriteEndElement();
220 this.XmlOutput.WriteStartElement(
"ContentView");
221 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"1");
222 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
224 this.XmlOutput.WriteEndElement();
230 this.XmlOutput.WriteEndElement();
238 this.XmlOutput.WriteEndElement();
239 this.XmlOutput.Flush();
241 return Task.CompletedTask;
244 #region Span Elements
262 this.Hyperlink =
"mailto:" + Element.
EMail;
263 this.RenderSpan(this.Hyperlink);
264 this.Hyperlink = Bak;
266 return Task.CompletedTask;
276 this.Hyperlink = Element.
URL;
277 this.RenderSpan(Element.
URL);
278 this.Hyperlink = Bak;
280 return Task.CompletedTask;
290 this.StrikeThrough =
true;
294 this.StrikeThrough = Bak;
321 if (EmojiSource is
null)
328 await
Multimedia.ImageContent.OutputXamarinForms(this.XmlOutput, Source);
357 await this.
Render(Footnote);
358 else if (this.
Document?.TryGetFootnoteNumber(Element.
Key, out
int Nr) ??
false)
361 this.Superscript =
true;
363 this.RenderSpan(Nr.ToString());
365 this.Superscript = Bak;
368 Footnote.Referenced =
true;
378 this.RenderSpan(Element.
Tag);
379 return Task.CompletedTask;
388 string s = Html.HtmlEntity.EntityToCharacter(Element.
Entity);
389 if (!
string.IsNullOrEmpty(s))
392 return Task.CompletedTask;
401 this.RenderSpan(
new string((
char)Element.
Code, 1));
402 return Task.CompletedTask;
411 bool Bak = this.
Code;
414 this.RenderSpan(Element.
Code);
418 return Task.CompletedTask;
427 this.XmlOutput.WriteComment(Element.
HTML);
428 return Task.CompletedTask;
454 if (Result is XmlDocument Xml)
461 s = Result?.ToString();
462 if (!
string.IsNullOrEmpty(s))
463 this.RenderSpan(Result?.
ToString() ??
string.Empty);
468 if (Result is
Graph G)
473 s =
"data:image/png;base64," + Convert.ToBase64String(Bin, 0, Bin.Length);
478 Width = Pixels.
Width,
479 Height = Pixels.Height
482 else if (Result is SKImage Img)
484 using (SKData Data = Img.Encode(SKEncodedImageFormat.Png, 100))
486 byte[] Bin = Data.ToArray();
488 s =
"data:image/png;base64," + Convert.ToBase64String(Bin, 0, Bin.Length);
501 Doc.ProcessAsyncTasks();
507 Doc.ProcessAsyncTasks();
509 else if (Result is Exception ex)
513 if (ex is AggregateException ex2)
515 foreach (Exception ex3
in ex2.InnerExceptions)
517 this.RenderContentView();
518 this.XmlOutput.WriteStartElement(
"Label");
519 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
520 this.XmlOutput.WriteAttributeString(
"TextColor",
"Red");
521 this.XmlOutput.WriteValue(ex3.Message);
522 this.XmlOutput.WriteEndElement();
523 this.XmlOutput.WriteEndElement();
528 if (AloneInParagraph)
529 this.RenderContentView();
531 this.XmlOutput.WriteStartElement(
"Label");
532 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
533 this.XmlOutput.WriteAttributeString(
"TextColor",
"Red");
534 this.XmlOutput.WriteValue(ex.Message);
535 this.XmlOutput.WriteEndElement();
537 if (AloneInParagraph)
538 this.XmlOutput.WriteEndElement();
543 if (AloneInParagraph)
544 this.RenderContentView();
546 this.XmlOutput.WriteStartElement(
"Label");
547 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
550 this.XmlOutput.WriteValue(Result.ToString());
551 this.XmlOutput.WriteEndElement();
553 if (AloneInParagraph)
554 this.XmlOutput.WriteEndElement();
564 this.RenderSpan(Element.
Value);
565 return Task.CompletedTask;
575 this.Underline =
true;
579 this.Underline = Bak;
588 this.RenderSpan(Environment.NewLine);
589 return Task.CompletedTask;
599 this.Hyperlink = Element.
Url;
603 this.Hyperlink = Bak;
616 if (!(Multimedia is
null))
621 this.Hyperlink = Bak;
630 StringBuilder sb =
new StringBuilder();
631 bool FirstOnRow =
true;
633 if (Element.
TryGetMetaData(out KeyValuePair<string, bool>[] Values))
635 foreach (KeyValuePair<string, bool> P
in Values)
645 sb.Append(Environment.NewLine);
651 this.RenderSpan(sb.ToString());
653 return Task.CompletedTask;
660 public override Task
Render(Model.SpanElements.Multimedia Element)
666 return Renderer.RenderXamarinFormsXaml(
this, Element.Items, Element.Children, Element.AloneInParagraph, Element.Document);
694 this.StrikeThrough =
true;
698 this.StrikeThrough = Bak;
707 bool Bak = this.
Bold;
722 this.Subscript =
true;
726 this.Subscript = Bak;
736 this.Superscript =
true;
740 this.Superscript = Bak;
750 this.Underline =
true;
754 this.Underline = Bak;
759 #region Block elements
767 this.XmlOutput.WriteStartElement(
"ContentView");
768 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.BlockQuoteMargin.ToString() +
"," +
769 this.XamlSettings.ParagraphMarginTop.ToString() +
",0," +
this.XamlSettings.ParagraphMarginBottom.ToString());
771 this.XmlOutput.WriteStartElement(
"Frame");
772 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.BlockQuotePadding.ToString() +
773 ",0," +
this.XamlSettings.BlockQuotePadding.ToString() +
",0");
774 this.XmlOutput.WriteAttributeString(
"BorderColor", this.XamlSettings.BlockQuoteBorderColor);
777 this.XmlOutput.WriteStartElement(
"StackLayout");
778 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
782 this.XmlOutput.WriteEndElement();
783 this.XmlOutput.WriteEndElement();
784 this.XmlOutput.WriteEndElement();
794 bool ParagraphBullet;
796 this.XmlOutput.WriteStartElement(
"ContentView");
797 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.ParagraphMargins);
799 this.XmlOutput.WriteStartElement(
"Grid");
800 this.XmlOutput.WriteAttributeString(
"RowSpacing",
"0");
801 this.XmlOutput.WriteAttributeString(
"ColumnSpacing",
"0");
803 this.XmlOutput.WriteStartElement(
"Grid.ColumnDefinitions");
805 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
806 this.XmlOutput.WriteAttributeString(
"Width",
"Auto");
807 this.XmlOutput.WriteEndElement();
809 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
810 this.XmlOutput.WriteAttributeString(
"Width",
"*");
811 this.XmlOutput.WriteEndElement();
813 this.XmlOutput.WriteEndElement();
814 this.XmlOutput.WriteStartElement(
"Grid.RowDefinitions");
818 this.XmlOutput.WriteStartElement(
"RowDefinition");
819 this.XmlOutput.WriteAttributeString(
"Height",
"Auto");
820 this.XmlOutput.WriteEndElement();
823 this.XmlOutput.WriteEndElement();
830 this.GetMargins(E, out
int TopMargin, out
int BottomMargin);
832 this.RenderContentView(
"0," + TopMargin.ToString() +
"," +
this.XamlSettings.ListContentMargin.ToString() +
"," +
833 BottomMargin.ToString());
834 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"0");
835 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
837 this.XmlOutput.WriteElementString(
"Label",
"•");
838 this.XmlOutput.WriteEndElement();
840 this.XmlOutput.WriteStartElement(
"StackLayout");
841 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"1");
842 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
843 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
848 await this.RenderLabel(Item,
false);
850 this.XmlOutput.WriteEndElement();
856 this.XmlOutput.WriteEndElement();
857 this.XmlOutput.WriteEndElement();
866 private void GetMargins(
MarkdownElement Element, out
int TopMargin, out
int BottomMargin)
877 TopMargin = BottomMargin = 0;
884 this.GetMargins(E, out TopMargin, out BottomMargin);
887 this.GetMargins(E, out
int _, out BottomMargin);
891 this.GetMargins(SingleChild.Child, out TopMargin, out BottomMargin);
894 TopMargin = this.XamlSettings.ParagraphMarginTop;
895 BottomMargin = this.XamlSettings.ParagraphMarginBottom;
905 this.XmlOutput.WriteStartElement(
"StackLayout");
906 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
913 this.Alignment = Bak;
914 this.XmlOutput.WriteEndElement();
936 if (ex is AggregateException ex2)
938 foreach (Exception ex3
in ex2.InnerExceptions)
940 this.RenderContentView();
941 this.XmlOutput.WriteStartElement(
"Label");
942 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
943 this.XmlOutput.WriteAttributeString(
"TextColor",
"Red");
944 this.XmlOutput.WriteValue(ex3.Message);
945 this.XmlOutput.WriteEndElement();
946 this.XmlOutput.WriteEndElement();
951 this.RenderContentView();
952 this.XmlOutput.WriteStartElement(
"Label");
953 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
954 this.XmlOutput.WriteAttributeString(
"TextColor",
"Red");
955 this.XmlOutput.WriteValue(ex.Message);
956 this.XmlOutput.WriteEndElement();
957 this.XmlOutput.WriteEndElement();
962 this.RenderContentView();
963 this.XmlOutput.WriteStartElement(
"StackLayout");
964 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
968 for (i = Element.
Start; i <= Element.
End; i++)
970 this.XmlOutput.WriteStartElement(
"Label");
971 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"NoWrap");
973 this.XmlOutput.WriteAttributeString(
"FontFamily",
"Courier New");
974 this.XmlOutput.WriteAttributeString(
"Text", Element.
Rows[i]);
975 this.XmlOutput.WriteEndElement();
978 this.XmlOutput.WriteEndElement();
979 this.XmlOutput.WriteEndElement();
988 return Task.CompletedTask;
1006 this.RenderContentView();
1008 this.XmlOutput.WriteStartElement(
"Label");
1009 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
1011 this.XmlOutput.WriteAttributeString(
"TextType",
"Html");
1015 XmlEntitiesOnly =
true
1022 this.XmlOutput.WriteEndElement();
1023 this.XmlOutput.WriteEndElement();
1027 this.XmlOutput.WriteStartElement(
"ContentView");
1028 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.DefinitionMargin.ToString() +
",0,0," +
1029 (Description == Last ? this.XamlSettings.DefinitionSeparator : 0).
ToString());
1031 this.XmlOutput.WriteStartElement(
"StackLayout");
1032 await Description.
Render(
this);
1033 this.XmlOutput.WriteEndElement();
1035 this.XmlOutput.WriteEndElement();
1055 int TopMargin = this.XamlSettings.ParagraphMarginTop;
1059 this.RenderContentView(this.XamlSettings.ParagraphMarginLeft.ToString() +
"," + TopMargin.ToString() +
"," +
1060 this.XamlSettings.ParagraphMarginRight.ToString() +
",0");
1062 bool BoldBak = this.
Bold;
1065 await this.RenderLabel(Term,
true);
1067 this.Bold = BoldBak;
1068 this.XmlOutput.WriteEndElement();
1080 this.XmlOutput.WriteStartElement(
"ContentView");
1081 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.BlockQuoteMargin.ToString() +
"," +
1082 this.XamlSettings.ParagraphMarginTop.ToString() +
",0," +
this.XamlSettings.ParagraphMarginBottom.ToString());
1084 this.XmlOutput.WriteStartElement(
"Frame");
1085 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.BlockQuotePadding.ToString() +
1086 ",0," +
this.XamlSettings.BlockQuotePadding.ToString() +
",0");
1087 this.XmlOutput.WriteAttributeString(
"BorderColor", this.XamlSettings.DeletedBlockQuoteBorderColor);
1090 this.XmlOutput.WriteStartElement(
"StackLayout");
1091 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
1096 this.XmlOutput.WriteEndElement();
1097 this.XmlOutput.WriteEndElement();
1098 this.XmlOutput.WriteEndElement();
1116 this.RenderContentView();
1118 this.XmlOutput.WriteStartElement(
"Label");
1119 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
1122 if (Element.
Level > 0 && Element.
Level <=
this.XamlSettings.HeaderFontSize.Length)
1124 this.XmlOutput.WriteAttributeString(
"FontSize", this.XamlSettings.HeaderFontSize[Element.
Level - 1].ToString());
1125 this.XmlOutput.WriteAttributeString(
"TextColor", this.XamlSettings.HeaderForegroundColor[Element.
Level - 1].ToString());
1128 this.XmlOutput.WriteAttributeString(
"TextType",
"Html");
1132 XmlEntitiesOnly =
true
1140 this.XmlOutput.WriteEndElement();
1141 this.XmlOutput.WriteEndElement();
1149 switch (this.Alignment)
1152 this.XmlOutput.WriteAttributeString(
"HorizontalTextAlignment",
"Start");
1156 this.XmlOutput.WriteAttributeString(
"HorizontalTextAlignment",
"End");
1160 this.XmlOutput.WriteAttributeString(
"HorizontalTextAlignment",
"Center");
1171 this.XmlOutput.WriteStartElement(
"BoxView");
1172 this.XmlOutput.WriteAttributeString(
"HeightRequest",
"1");
1173 this.XmlOutput.WriteAttributeString(
"BackgroundColor", this.XamlSettings.TableCellBorderColor);
1174 this.XmlOutput.WriteAttributeString(
"HorizontalOptions",
"FillAndExpand");
1175 this.XmlOutput.WriteAttributeString(
"Margin", this.XamlSettings.ParagraphMargins);
1176 this.XmlOutput.WriteEndElement();
1178 return Task.CompletedTask;
1187 this.RenderContentView();
1189 this.XmlOutput.WriteStartElement(
"Label");
1190 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
1192 this.XmlOutput.WriteAttributeString(
"TextType",
"Html");
1196 XmlEntitiesOnly =
true
1203 this.XmlOutput.WriteEndElement();
1204 this.XmlOutput.WriteEndElement();
1214 this.XmlOutput.WriteStartElement(
"ContentView");
1215 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.BlockQuoteMargin.ToString() +
"," +
1216 this.XamlSettings.ParagraphMarginTop.ToString() +
",0," +
this.XamlSettings.ParagraphMarginBottom.ToString());
1218 this.XmlOutput.WriteStartElement(
"Frame");
1219 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.BlockQuotePadding.ToString() +
1220 ",0," +
this.XamlSettings.BlockQuotePadding.ToString() +
",0");
1221 this.XmlOutput.WriteAttributeString(
"BorderColor", this.XamlSettings.InsertedBlockQuoteBorderColor);
1224 this.XmlOutput.WriteStartElement(
"StackLayout");
1225 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
1229 this.XmlOutput.WriteEndElement();
1230 this.XmlOutput.WriteEndElement();
1231 this.XmlOutput.WriteEndElement();
1240 return Task.CompletedTask;
1249 this.XmlOutput.WriteStartElement(
"StackLayout");
1250 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
1257 this.Alignment = Bak;
1258 this.XmlOutput.WriteEndElement();
1267 this.XmlOutput.WriteStartElement(
"StackLayout");
1268 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
1275 this.Alignment = Bak;
1276 this.XmlOutput.WriteEndElement();
1291 XmlEntitiesOnly =
true
1308 if (!(Html is
null))
1310 this.XmlOutput.WriteStartElement(
"Label");
1311 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
1313 this.XmlOutput.WriteAttributeString(
"TextType",
"Html");
1314 this.XmlOutput.WriteCData(Html.
ToString());
1315 this.XmlOutput.WriteEndElement();
1325 if (!(Html is
null))
1327 this.XmlOutput.WriteStartElement(
"Label");
1328 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
1330 this.XmlOutput.WriteAttributeString(
"TextType",
"Html");
1331 this.XmlOutput.WriteCData(Html.
ToString());
1332 this.XmlOutput.WriteEndElement();
1359 bool ParagraphBullet;
1361 this.XmlOutput.WriteStartElement(
"ContentView");
1362 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.ParagraphMargins);
1364 this.XmlOutput.WriteStartElement(
"Grid");
1365 this.XmlOutput.WriteAttributeString(
"RowSpacing",
"0");
1366 this.XmlOutput.WriteAttributeString(
"ColumnSpacing",
"0");
1368 this.XmlOutput.WriteStartElement(
"Grid.ColumnDefinitions");
1370 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
1371 this.XmlOutput.WriteAttributeString(
"Width",
"Auto");
1372 this.XmlOutput.WriteEndElement();
1374 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
1375 this.XmlOutput.WriteAttributeString(
"Width",
"*");
1376 this.XmlOutput.WriteEndElement();
1378 this.XmlOutput.WriteEndElement();
1379 this.XmlOutput.WriteStartElement(
"Grid.RowDefinitions");
1383 this.XmlOutput.WriteStartElement(
"RowDefinition");
1384 this.XmlOutput.WriteAttributeString(
"Height",
"Auto");
1385 this.XmlOutput.WriteEndElement();
1388 this.XmlOutput.WriteEndElement();
1397 this.GetMargins(E, out
int TopMargin, out
int BottomMargin);
1399 this.RenderContentView(
"0," + TopMargin.ToString() +
"," +
this.XamlSettings.ListContentMargin.ToString() +
"," +
1400 BottomMargin.ToString());
1401 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"0");
1402 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
1404 this.XmlOutput.WriteStartElement(
"Label");
1409 this.XmlOutput.WriteValue(Expected.ToString());
1411 this.XmlOutput.WriteValue(
".");
1412 this.XmlOutput.WriteEndElement();
1413 this.XmlOutput.WriteEndElement();
1415 this.XmlOutput.WriteStartElement(
"StackLayout");
1416 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"1");
1417 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
1418 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
1420 if (ParagraphBullet)
1423 await this.RenderLabel(Item,
false);
1425 this.XmlOutput.WriteEndElement();
1431 this.XmlOutput.WriteEndElement();
1432 this.XmlOutput.WriteEndElement();
1441 this.RenderContentView();
1442 await this.RenderLabel(Element,
false);
1443 this.XmlOutput.WriteEndElement();
1446 internal async Task RenderLabel(
MarkdownElement Element,
bool IncludeElement)
1448 bool HasLink = !Element.
ForEach((E, _) =>
1457 this.XmlOutput.WriteStartElement(
"Label");
1458 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
1466 await Element.
Render(
this);
1472 this.InLabel =
true;
1474 this.XmlOutput.WriteStartElement(
"Label.FormattedText");
1475 this.XmlOutput.WriteStartElement(
"FormattedString");
1478 await Element.
Render(
this);
1482 this.XmlOutput.WriteEndElement();
1483 this.XmlOutput.WriteEndElement();
1485 this.InLabel =
false;
1490 this.XmlOutput.WriteAttributeString(
"TextType",
"Html");
1493 this.XmlOutput.WriteAttributeString(
"FontAttributes",
"Bold");
1497 XmlEntitiesOnly =
true
1509 this.XmlOutput.WriteEndElement();
1512 internal void RenderSpan(
string Text)
1516 this.XmlOutput.WriteStartElement(
"Label");
1517 this.XmlOutput.WriteAttributeString(
"LineBreakMode",
"WordWrap");
1519 this.XmlOutput.WriteStartElement(
"Label.FormattedText");
1520 this.XmlOutput.WriteStartElement(
"FormattedString");
1523 this.XmlOutput.WriteStartElement(
"Span");
1525 if (this.Superscript)
1527 else if (this.Subscript)
1530 this.XmlOutput.WriteAttributeString(
"Text", Text);
1532 if (this.Bold && this.Italic)
1533 this.XmlOutput.WriteAttributeString(
"FontAttributes",
"Italic, Bold");
1535 this.XmlOutput.WriteAttributeString(
"FontAttributes",
"Bold");
1536 else if (this.Italic)
1537 this.XmlOutput.WriteAttributeString(
"FontAttributes",
"Italic");
1539 if (this.StrikeThrough && this.Underline)
1540 this.XmlOutput.WriteAttributeString(
"TextDecorations",
"Strikethrough, Underline");
1541 else if (this.StrikeThrough)
1542 this.XmlOutput.WriteAttributeString(
"TextDecorations",
"Strikethrough");
1543 else if (this.Underline)
1544 this.XmlOutput.WriteAttributeString(
"TextDecorations",
"Underline");
1547 this.XmlOutput.WriteAttributeString(
"FontFamily",
"Courier New");
1549 if (!(this.Hyperlink is
null))
1551 this.XmlOutput.WriteAttributeString(
"TextColor",
"{Binding HyperlinkColor}");
1553 this.XmlOutput.WriteStartElement(
"Span.GestureRecognizers");
1554 this.XmlOutput.WriteStartElement(
"TapGestureRecognizer");
1555 this.XmlOutput.WriteAttributeString(
"Command",
"{Binding HyperlinkClicked}");
1556 this.XmlOutput.WriteAttributeString(
"CommandParameter", this.Hyperlink);
1557 this.XmlOutput.WriteEndElement();
1558 this.XmlOutput.WriteEndElement();
1563 this.XmlOutput.WriteEndElement();
1564 this.XmlOutput.WriteEndElement();
1565 this.XmlOutput.WriteEndElement();
1568 this.XmlOutput.WriteEndElement();
1571 internal void RenderContentView()
1573 this.RenderContentView(this.Alignment, this.XamlSettings.ParagraphMargins);
1576 internal void RenderContentView(
string Margins)
1578 this.RenderContentView(this.Alignment, Margins);
1583 this.XmlOutput.WriteStartElement(
"ContentView");
1584 this.XmlOutput.WriteAttributeString(
"Padding", Margins);
1589 this.XmlOutput.WriteAttributeString(
"HorizontalOptions",
"Center");
1593 this.XmlOutput.WriteAttributeString(
"HorizontalOptions",
"Start");
1597 this.XmlOutput.WriteAttributeString(
"HorizontalOptions",
"End");
1608 this.XmlOutput.WriteStartElement(
"StackLayout");
1609 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
1616 this.Alignment = Bak;
1617 this.XmlOutput.WriteEndElement();
1635 this.XmlOutput.WriteStartElement(
"BoxView");
1636 this.XmlOutput.WriteAttributeString(
"HeightRequest",
"1");
1637 this.XmlOutput.WriteAttributeString(
"BackgroundColor", this.XamlSettings.TableCellBorderColor);
1638 this.XmlOutput.WriteAttributeString(
"HorizontalOptions",
"FillAndExpand");
1639 this.XmlOutput.WriteAttributeString(
"Margin", this.XamlSettings.ParagraphMargins);
1640 this.XmlOutput.WriteEndElement();
1642 return Task.CompletedTask;
1655 this.XmlOutput.WriteStartElement(
"ContentView");
1656 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.ParagraphMargins);
1658 this.XmlOutput.WriteStartElement(
"Grid");
1659 this.XmlOutput.WriteAttributeString(
"RowSpacing",
"-2");
1660 this.XmlOutput.WriteAttributeString(
"ColumnSpacing",
"-2");
1664 this.XmlOutput.WriteStartElement(
"Grid.ColumnDefinitions");
1666 for (Column = 0; Column < Element.
Columns; Column++)
1668 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
1669 this.XmlOutput.WriteAttributeString(
"Width",
"Auto");
1670 this.XmlOutput.WriteEndElement();
1673 this.XmlOutput.WriteEndElement();
1674 this.XmlOutput.WriteStartElement(
"Grid.RowDefinitions");
1676 for (Row = 0, NrRows = Element.
Rows.Length + Element.
Headers.Length; Row < NrRows; Row++)
1678 this.XmlOutput.WriteStartElement(
"RowDefinition");
1679 this.XmlOutput.WriteAttributeString(
"Height",
"Auto");
1680 this.XmlOutput.WriteEndElement();
1683 this.XmlOutput.WriteEndElement();
1685 for (Row = 0, NrRows = Element.
Headers.Length; Row < NrRows; Row++, RowNr++)
1688 for (Row = 0, NrRows = Element.
Rows.Length; Row < NrRows; Row++, RowNr++)
1691 this.XmlOutput.WriteEndElement();
1692 this.XmlOutput.WriteEndElement();
1695 private void ClearState()
1699 this.Italic =
false;
1700 this.StrikeThrough =
false;
1701 this.Underline =
false;
1702 this.Superscript =
false;
1703 this.Subscript =
false;
1705 this.InLabel =
false;
1706 this.Hyperlink =
null;
1709 private StateBackup Backup()
1711 return new StateBackup()
1722 hyperlink = this.Hyperlink
1726 private void Restore(StateBackup Backup)
1728 this.Alignment = Backup.alignment;
1729 this.Bold = Backup.bold;
1730 this.Italic = Backup.italic;
1731 this.StrikeThrough = Backup.strikeThrough;
1732 this.Underline = Backup.underline;
1733 this.Superscript = Backup.superscript;
1734 this.Subscript = Backup.subscript;
1735 this.Code = Backup.code;
1736 this.InLabel = Backup.inLabel;
1737 this.Hyperlink = Backup.hyperlink;
1740 private class StateBackup
1745 public bool strikeThrough;
1746 public bool underline;
1747 public bool superscript;
1748 public bool subscript;
1750 public bool inLabel;
1751 public string hyperlink;
1759 int NrColumns = Element.
Columns;
1761 StateBackup Bak = this.Backup();
1765 for (Column = 0; Column < NrColumns; Column++)
1767 E = CurrentRow[Column];
1772 ColSpan = Column + 1;
1773 while (ColSpan < NrColumns && CurrentRow[ColSpan] is
null)
1778 this.XmlOutput.WriteStartElement(
"Frame");
1779 this.XmlOutput.WriteAttributeString(
"Padding",
"0,0,0,0");
1780 this.XmlOutput.WriteAttributeString(
"BorderColor", this.XamlSettings.TableCellBorderColor);
1783 if ((RowNr & 1) == 0)
1785 if (!
string.IsNullOrEmpty(this.XamlSettings.TableCellRowBackgroundColor1))
1786 this.XmlOutput.WriteAttributeString(
"BackgroundColor", this.XamlSettings.TableCellRowBackgroundColor1);
1790 if (!
string.IsNullOrEmpty(this.XamlSettings.TableCellRowBackgroundColor2))
1791 this.XmlOutput.WriteAttributeString(
"BackgroundColor", this.XamlSettings.TableCellRowBackgroundColor2);
1794 this.XmlOutput.WriteAttributeString(
"Grid.Column", Column.ToString());
1795 this.XmlOutput.WriteAttributeString(
"Grid.Row", RowNr.ToString());
1798 this.XmlOutput.WriteAttributeString(
"Grid.ColumnSpan", ColSpan.ToString());
1802 this.RenderContentView(
TextAlignment, this.XamlSettings.TableCellPadding);
1805 await this.RenderLabel(E,
true);
1808 this.XmlOutput.WriteEndElement();
1812 this.XmlOutput.WriteStartElement(
"ContentView");
1813 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.TableCellPadding);
1815 this.XmlOutput.WriteStartElement(
"StackLayout");
1817 this.XmlOutput.WriteEndElement();
1819 this.XmlOutput.WriteEndElement();
1822 this.XmlOutput.WriteEndElement();
1844 bool ParagraphBullet;
1846 this.XmlOutput.WriteStartElement(
"ContentView");
1847 this.XmlOutput.WriteAttributeString(
"Padding", this.XamlSettings.ParagraphMargins);
1849 this.XmlOutput.WriteStartElement(
"Grid");
1850 this.XmlOutput.WriteAttributeString(
"RowSpacing",
"0");
1851 this.XmlOutput.WriteAttributeString(
"ColumnSpacing",
"0");
1853 this.XmlOutput.WriteStartElement(
"Grid.ColumnDefinitions");
1855 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
1856 this.XmlOutput.WriteAttributeString(
"Width",
"Auto");
1857 this.XmlOutput.WriteEndElement();
1859 this.XmlOutput.WriteStartElement(
"ColumnDefinition");
1860 this.XmlOutput.WriteAttributeString(
"Width",
"*");
1861 this.XmlOutput.WriteEndElement();
1863 this.XmlOutput.WriteEndElement();
1864 this.XmlOutput.WriteStartElement(
"Grid.RowDefinitions");
1868 this.XmlOutput.WriteStartElement(
"RowDefinition");
1869 this.XmlOutput.WriteAttributeString(
"Height",
"Auto");
1870 this.XmlOutput.WriteEndElement();
1873 this.XmlOutput.WriteEndElement();
1880 this.GetMargins(E, out
int TopMargin, out
int BottomMargin);
1884 this.RenderContentView(
"0," + TopMargin.ToString() +
"," +
this.XamlSettings.ListContentMargin.ToString() +
"," +
1885 BottomMargin.ToString());
1886 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"0");
1887 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
1889 this.XmlOutput.WriteElementString(
"Label",
"✓");
1890 this.XmlOutput.WriteEndElement();
1893 this.XmlOutput.WriteStartElement(
"StackLayout");
1894 this.XmlOutput.WriteAttributeString(
"Grid.Column",
"1");
1895 this.XmlOutput.WriteAttributeString(
"Grid.Row", Row.ToString());
1896 this.XmlOutput.WriteAttributeString(
"Orientation",
"Vertical");
1898 if (ParagraphBullet)
1901 await this.RenderLabel(
TaskItem,
false);
1903 this.XmlOutput.WriteEndElement();
1909 this.XmlOutput.WriteEndElement();
1910 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.
string ShortName
Emoji short name.
string Unicode
Unicode representation of emoji.
Contains information about an emoji image.
int? Width
Width of image, if available.
Class that can be used to encapsulate Markdown to be returned from a Web Service, bypassing any encod...
Contains a markdown document. This markdown document class supports original markdown,...
static async Task< object > TransformXml(XmlDocument Xml, Variables Variables)
Transforms XML to an object that is easier to visualize.
IEnumerable< string > FootnoteOrder
Order of footnotes.
IEmojiSource EmojiSource
Source for emojis in the document.
MarkdownDocument Detail
Detail document of a master document.
Multimedia GetReference(string Label)
Gets the multimedia information referenced by a label.
static Task< MarkdownDocument > CreateAsync(string MarkdownText, params Type[] TransparentExceptionTypes)
Contains a markdown document. This markdown document class supports original markdown,...
Contains settings that the Markdown parser uses to customize its behavior.
Abstract base class for block elements with one child.
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.
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.
int Number
Number associated with item.
Represents a numbered list in a markdown document.
Represents a paragraph in a markdown document.
Represents a right-aligned set of blocks in a markdown document.
Represents a sequence of sections.
Represents a table in a markdown document.
TextAlignment[] ColumnAlignments
Table column alignments.
override IEnumerable< MarkdownElement > Children
Any children of the element.
MarkdownElement[][] Headers
Headers in table.
int Columns
Number of columns.
TextAlignment?[][] RowCellAlignments
Row cell alignments in table.
TextAlignment?[][] HeaderCellAlignments
Header cell alignments in table.
MarkdownElement[][] Rows
Rows in table.
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.
override IEnumerable< MarkdownElement > Children
Any children of the element.
bool HasOneChild
If the element has only one child.
MarkdownElement FirstChild
First child, or null if none.
Abstract base class for all markdown elements.
virtual bool ForEach(MarkdownElementHandler Callback, object State)
Loops through all child-elements for the element.
abstract Task Render(IRenderer Output)
Renders the element.
virtual IEnumerable< MarkdownElement > Children
Any children of the element.
abstract bool InlineSpanElement
If the element is an inline span element.
virtual bool OutsideParagraph
If element, parsed as a span element, can stand outside of a paragraph if alone in it.
MarkdownDocument Document
Markdown document.
Abstract base class for all markdown elements with one child element.
string Delimiter
Delimiter string used to identify emoji.
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.
Variables Variables
Variables.
async Task< object > EvaluateExpression()
Evaluates the script expression.
string Value
Unformatted text.
bool TryGetMetaData(out KeyValuePair< string, bool >[] Values)
Tries to get meta-data from the document.
MultimediaItem[] Items
Multimedia items.
bool AloneInParagraph
If the element is alone in a paragraph.
Renders HTML from a Markdown document.
Contains settings that the HTML export uses to customize HTML output.
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 .
override string ToString()
Returns the renderer output.
virtual void Dispose()
Disposes of the renderer.
MarkdownDocument Document
Reference to Markdown document being processed.
Renders plain text from a Markdown document.
static string ToSubscript(string s)
Converts a string to subscript (as far as it goes).
static string ToSuperscript(string s)
Converts a string to superscript (as far as it goes).
Renders XAML (Xamarin.Forms flavour) from a Markdown document.
override async Task Render(DefinitionTerms Element)
Renders Element .
override async Task Render(CodeBlock Element)
Renders Element .
override async Task Render(Header Element)
Renders Element .
override async Task Render(LeftAligned Element)
Renders Element .
override async Task Render(Table Element)
Renders Element .
override Task Render(NumberedItem Element)
Renders Element .
TextAlignment Alignment
Current text-alignment.
override Task Render(Model.SpanElements.Multimedia Element)
Renders Element .
XamarinFormsXamlRenderer(XmlWriterSettings XmlSettings, XamlSettings XamlSettings)
Renders XAML (Xamarin.Forms flavour) from a Markdown document.
void RenderLabelAlignment()
Writes a text-alignment attribute to a Xamarin.Forms label element.
override async Task Render(DefinitionDescriptions Element)
Renders Element .
override Task Render(HtmlEntity Element)
Renders Element .
override async Task Render(SuperScript Element)
Renders Element .
override async Task Render(InsertBlocks Element)
Renders Element .
bool Underline
If text is underlined
async Task RenderObject(object Result, bool AloneInParagraph, Variables Variables)
Generates Xamarin.Forms XAML from Script output.
override Task Render(Abbreviation Element)
Renders Element .
override Task Render(HashTag Element)
Renders Element .
override async Task Render(HtmlBlock Element)
Renders Element .
override Task Render(InlineText Element)
Renders Element .
override Task Render(MetaReference Element)
Renders Element .
override async Task Render(Delete Element)
Renders Element .
override Task Render(AutomaticLinkMail Element)
Renders Element .
override async Task Render(LinkReference Element)
Renders Element .
override void Dispose()
Disposes of the renderer.
override Task Render(DefinitionList Element)
Renders Element .
override async Task Render(Insert Element)
Renders Element .
override Task RenderDocumentFooter()
Renders the document header.
override Task Render(UnnumberedItem Element)
Renders Element .
override Task RenderDocument(MarkdownDocument Document, bool Inclusion)
Renders a document.
override Task Render(MultimediaReference Element)
Renders Element .
readonly XamlSettings XamlSettings
XAML settings.
override async Task Render(InlineScript Element)
Renders Element .
override Task Render(LineBreak Element)
Renders Element .
override async Task Render(FootnoteReference Element)
Renders Element .
override async Task Render(Strong Element)
Renders Element .
override Task Render(Footnote Element)
Renders Element .
override Task Render(HorizontalRule Element)
Renders Element .
override async Task Render(CenterAligned Element)
Renders Element .
override async Task Render(NestedBlock Element)
Renders Element .
override async Task RenderFootnotes()
Renders footnotes.
override Task Render(Sections Element)
Renders Element .
bool Italic
If text is italic
override Task Render(CommentBlock Element)
Renders Element .
bool StrikeThrough
If text is stricken through
override async Task Render(Underline Element)
Renders Element .
bool Subscript
If text is subscript
override Task Render(TaskItem Element)
Renders Element .
override Task Render(InlineCode Element)
Renders Element .
override Task Render(InlineHTML Element)
Renders Element .
override Task Render(InvisibleBreak Element)
Renders Element .
readonly XmlWriter XmlOutput
XML output
bool Code
If text is inline code.
override async Task Render(SubScript Element)
Renders Element .
override async Task Render(BulletList Element)
Renders Element .
override async Task Render(NumberedList Element)
Renders Element .
override Task Render(SectionSeparator Element)
Renders Element .
override async Task Render(MarginAligned Element)
Renders Element .
bool InLabel
If rendering is inside a label.
override async Task Render(TaskList Element)
Renders Element .
override Task Render(AutomaticLinkUrl Element)
Renders Element .
override Task RenderDocumentHeader()
Renders the document header.
bool Superscript
If text is superscript
override async Task Render(StrikeThrough Element)
Renders Element .
override Task Render(DetailsReference Element)
Renders Element .
override async Task Render(Paragraph Element)
Renders Element .
override async Task Render(Link Element)
Renders Element .
override async Task Render(BlockQuote Element)
Renders Element .
string Hyperlink
Link, if rendering a hyperlink, null otherwise.
override async Task Render(Emphasize Element)
Renders Element .
override async Task Render(DeleteBlocks Element)
Renders Element .
override async Task Render(RightAligned Element)
Renders Element .
XamarinFormsXamlRenderer(StringBuilder Output, XmlWriterSettings XmlSettings, XamlSettings XamlSettings)
Renders XAML (Xamarin.Forms flavour) from a Markdown document.
override Task Render(HtmlEntityUnicode Element)
Renders Element .
override async Task Render(EmojiReference Element)
Renders Element .
Contains settings that the XAML export uses to customize XAML output.
Static class managing the application event log. Applications and services log events on this static ...
static Exception UnnestException(Exception Exception)
Unnests an exception, to extract the relevant inner exception.
ToMatrix(ScriptNode Operand, bool NullCheck, int Start, int Length, Expression Expression)
To-Matrix operator.
Interface for Emoji sources. Emoji sources provide emojis to content providers.
Task< IImageSource > GetImageSource(EmojiInfo Emoji)
Gets the image source of an emoji.
bool EmojiSupported(EmojiInfo Emoji)
If the emoji is supported by the emoji source.
Contains information about an emoji image.
Interface for code content Xamarin.Forms XAML renderers.
Interface for multimedia content Xamarin.Forms XAML renderers.
Interface for objects that can be converted into matrices.
TextAlignment
Text alignment of contents.