Skip to content

Commit

Permalink
Fixed table handling both ways (columns were not added under Table.Co…
Browse files Browse the repository at this point in the history
…lumns element, wysiwyg issues, invalid collapse handling)
  • Loading branch information
t00 committed Aug 9, 2017
1 parent 64c4ceb commit cf3e872
Show file tree
Hide file tree
Showing 8 changed files with 336 additions and 104 deletions.
6 changes: 6 additions & 0 deletions MarkupConverter/htmlcssparser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,12 @@ internal static void GetElementPropertiesFromCssAttributes(XElement htmlElement,
case "clear":
ParseCssClear(styleValue, ref nextIndex, localProperties);
break;
case "border-collapse":
if ("collapse".Equals(styleValue))
{
localProperties.Add("border-collapse", "collapse");
}
break;

default:
break;
Expand Down
7 changes: 6 additions & 1 deletion MarkupConverter/htmlfromxamlconverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,12 @@ private static void WriteFormattingProperties(XmlReader xamlReader, XmlWriter ht
case "RowSpan":
htmlWriter.WriteAttributeString("ROWSPAN", xamlReader.Value);
break;
case "CellSpacing":
if(xamlReader.Value == "0")
{
css = "border-collapse:collapse;";
}
break;
default:
context.OnWriteCustomProperty?.Invoke(xamlReader, htmlWriter, inlineStyle, context, xamlReader.Name);
break;
Expand All @@ -318,7 +324,6 @@ private static void WriteFormattingProperties(XmlReader xamlReader, XmlWriter ht

if(elementName == "Table")
{
inlineStyle.Append("border-collapse:collapse;");
if(!borderSet && context.CurrentTable != null)
{
var t = context.CurrentTable.CommonBorder;
Expand Down
18 changes: 9 additions & 9 deletions MarkupConverter/htmlschema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,26 +117,26 @@ public static string HtmlEntitiesEncode(string input)
/// <summary>
/// returns true when XElementName corresponds to empty element
/// </summary>
/// <param name="XElementName">
/// <param name="elementName">
/// string representing name to test
/// </param>
internal static bool IsEmptyElement(string XElementName)
internal static bool IsEmptyElement(string elementName)
{
// convert to lowercase before we check
// because element names are not case sensitive
return _htmlEmptyElements.Contains(XElementName.ToLower());
return _htmlEmptyElements.Contains(elementName.ToLower());
}

/// <summary>
/// returns true if XElementName represents a block formattinng element.
/// It used in an algorithm of transferring inline elements over block elements
/// in HtmlParser
/// </summary>
/// <param name="XElementName"></param>
/// <param name="elementName"></param>
/// <returns></returns>
internal static bool IsBlockElement(string XElementName)
internal static bool IsBlockElement(string elementName)
{
return _htmlBlockElements.Contains(XElementName);
return _htmlBlockElements.Contains(elementName.ToLower());
}

/// <summary>
Expand Down Expand Up @@ -166,13 +166,13 @@ internal static bool IsKnownOpenableElement(string XElementName)
/// returns true when XElementName closes when the outer element closes
/// this is true of elements with optional start tags
/// </summary>
/// <param name="XElementName">
/// <param name="elementName">
/// string representing name to test
/// </param>
internal static bool ClosesOnParentElementEnd(string XElementName)
internal static bool ClosesOnParentElementEnd(string elementName)
{
// convert to lowercase when testing
return _htmlElementsClosingOnParentElementEnd.Contains(XElementName.ToLower());
return _htmlElementsClosingOnParentElementEnd.Contains(elementName.ToLower());
}

/// <summary>
Expand Down
257 changes: 163 additions & 94 deletions MarkupConverter/htmltoxamlconverter.cs

Large diffs are not rendered by default.

59 changes: 59 additions & 0 deletions MarkupConverterTests/Documents.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

77 changes: 77 additions & 0 deletions MarkupConverterTests/Documents.resx
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,83 @@
<data name="MultipleFontStyles_Xaml" xml:space="preserve">
<value>&lt;FlowDocument xml:space="preserve" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;&lt;Paragraph&gt;&lt;Run FontStyle="Italic" FontWeight="Bold" xml:space="preserve"&gt;&lt;Run.TextDecorations&gt;&lt;TextDecoration Location="Strikethrough" /&gt;&lt;TextDecoration Location="Underline" /&gt;&lt;/Run.TextDecorations&gt;word1 &lt;/Run&gt;word2&lt;/Paragraph&gt;&lt;/FlowDocument&gt;</value>
</data>
<data name="Table_Html" xml:space="preserve">
<value>&lt;div style="font-family: Verdana; font-size: 18.7px;"&gt;
&lt;table style="border-collapse: collapse; width: 100px;"&gt;
&lt;colgroup&gt;
&lt;col style="width: 150px;" /&gt;
&lt;col style="width: 200px;" /&gt;
&lt;col style="width: 250px;" /&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;a&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;b&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;
&lt;p style="margin: 0px 0px 0px 0px; text-align: Left; font-family: Calibri; font-size: 14.7px; text-indent: 0;"&gt;c&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"/&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;e&lt;/td&gt;
&lt;td style="padding: 0px 8px 0px 8px; border: 1px solid #000000;"&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style="text-indent: 0; margin: 0px 0px 0px 0px;"&gt;label&lt;/p&gt;
&lt;/div&gt;</value>
</data>
<data name="Table_HtmlFromXaml" xml:space="preserve">
<value>&lt;html&gt;&lt;body style="font-family:Verdana;font-size:18.7px;"&gt;&lt;table style="border-collapse:collapse;"&gt;&lt;colgroup&gt;&lt;col style="width:100px;" /&gt;&lt;col style="width:200px;" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="padding:0px 8px 0px 8px;border-width:1px 1px 1px 1px;border-color:#000000;border-style:solid;"&gt;&lt;p style="margin:0px 0px 0px 0px;text-align:Left;font-family:Calibri;font-size:14.7px;"&gt;&lt;span&gt;a&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="padding:0px 8px 0px 8px;border-width:1px 1px 1px 1px;border-color:#000000;border-style:solid;"&gt;&lt;p style="margin:0px 0px 0px 0px;text-align:Left;font-family:Calibri;font-size:14.7px;"&gt;&lt;span&gt;b&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="padding:0px 8px 0px 8px;border-width:1px 1px 1px 1px;border-color:#000000;border-style:solid;"&gt;&lt;p style="margin:0px 0px 0px 0px;text-align:Left;font-family:Calibri;font-size:14.7px;" /&gt;&lt;/td&gt;&lt;td style="padding:0px 8px 0px 8px;border-width:1px 1px 1px 1px;border-color:#000000;border-style:solid;"&gt;&lt;p style="margin:0px 0px 0px 0px;text-align:Left;font-family:Calibri;font-size:14.7px;"&gt;&lt;span&gt;z&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="text-indent:0;margin:0px 0px 0px 0px;" /&gt;&lt;/body&gt;&lt;/html&gt;</value>
</data>
<data name="Table_Xaml" xml:space="preserve">
<value>&lt;FlowDocument FontFamily="Verdana" FontSize="18.6666666666667" PagePadding="4,4,4,4" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;
&lt;Table CellSpacing="0"&gt;
&lt;Table.Columns&gt;
&lt;TableColumn Width="100" /&gt;
&lt;TableColumn Width="200" /&gt;
&lt;/Table.Columns&gt;
&lt;TableRowGroup&gt;
&lt;TableRow&gt;
&lt;TableCell Padding="7.2,0,7.2,0" BorderThickness="1,1,1,1" BorderBrush="#FF000000"&gt;
&lt;Paragraph Margin="0,0,0,0" TextAlignment="Left" FontFamily="Calibri" FontSize="14.6666666666667"&gt;
&lt;Span xml:lang="en-gb"&gt;a&lt;/Span&gt;
&lt;/Paragraph&gt;
&lt;/TableCell&gt;
&lt;TableCell Padding="7.2,0,7.2,0" BorderThickness="1,1,1,1" BorderBrush="#FF000000"&gt;
&lt;Paragraph Margin="0,0,0,0" TextAlignment="Left" FontFamily="Calibri" FontSize="14.6666666666667"&gt;
&lt;Span xml:lang="en-gb"&gt;b&lt;/Span&gt;
&lt;/Paragraph&gt;
&lt;/TableCell&gt;
&lt;/TableRow&gt;
&lt;TableRow&gt;
&lt;TableCell Padding="7.2,0,7.2,0" BorderThickness="1,1,1,1" BorderBrush="#FF000000"&gt;
&lt;Paragraph Margin="0,0,0,0" TextAlignment="Left" FontFamily="Calibri" FontSize="14.6666666666667" /&gt;
&lt;/TableCell&gt;
&lt;TableCell Padding="7.2,0,7.2,0" BorderThickness="1,1,1,1" BorderBrush="#FF000000"&gt;
&lt;Paragraph Margin="0,0,0,0" TextAlignment="Left" FontFamily="Calibri" FontSize="14.6666666666667"&gt;
&lt;Span xml:lang="en-gb"&gt;z&lt;/Span&gt;
&lt;/Paragraph&gt;
&lt;/TableCell&gt;
&lt;/TableRow&gt;
&lt;/TableRowGroup&gt;
&lt;/Table&gt;
&lt;Paragraph TextIndent="0" Margin="0,0,0,0" xml:space="preserve" /&gt;
&lt;/FlowDocument&gt;</value>
</data>
<data name="Table_XamlFromHtml" xml:space="preserve">
<value>&lt;FlowDocument xml:space="preserve" FontFamily="verdana" FontSize="18.6666666666667" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;&lt;Table CellSpacing="0"&gt;&lt;Table.Columns&gt;&lt;TableColumn Width="25" /&gt;&lt;TableColumn Width="33.3333333333333" /&gt;&lt;TableColumn Width="41.6666666666667" /&gt;&lt;/Table.Columns&gt;&lt;TableRowGroup&gt;&lt;TableRow&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt; &lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt;a&lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt; &lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;/TableRow&gt;&lt;TableRow&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt;b&lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph TextAlignment="left" FontFamily="calibri" FontSize="14.6666666666667" TextIndent="0" Margin="0"&gt;c&lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt;d&lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;/TableRow&gt;&lt;TableRow&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt; &lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt;e&lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;TableCell BorderThickness="1,1,1,1" BorderBrush="Black"&gt;&lt;Paragraph&gt; &lt;/Paragraph&gt;&lt;/TableCell&gt;&lt;/TableRow&gt;&lt;/TableRowGroup&gt;&lt;/Table&gt;&lt;Paragraph TextIndent="0" Margin="0"&gt;label&lt;/Paragraph&gt;&lt;/FlowDocument&gt;</value>
</data>
<data name="TestParagraph_Html" xml:space="preserve">
<value>&lt;p style="text-indent:0;margin:0px 0px 0px 0px;font-family:Verdana;font-size:16px;"&gt;Paragraph 1&lt;/p&gt;&lt;p /&gt;&lt;p style="text-indent:0;margin:0px 0px 0px 0px;font-family:Verdana;font-size:16px;"&gt;Paragraph 2&lt;/p&gt;&lt;p style="text-indent:-22;margin:0px 0px 0px 38px;font-family:Verdana;font-size:16px;"&gt;Test &lt;span&gt;capacitor&lt;/span&gt; inductor&lt;/p&gt;&lt;p style="text-indent:-22;margin:0px 0px 0px 38px;font-family:Verdana;font-size:16px;"&gt;Transistor &lt;span&gt;resistor&lt;/span&gt;&lt;/p&gt;&lt;p /&gt;</value>
</data>
Expand Down
8 changes: 8 additions & 0 deletions MarkupConverterTests/HtmlToXamlTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,13 @@ public void TestParagraphRun()
var xaml = HtmlToXamlConverter.ConvertHtmlToXaml(html, new HtmlToXamlContext(new HtmlToXamlDocumentOptions()));
Assert.AreEqual(Documents.TestParagraph_XamlFromHtml, xaml);
}

[TestMethod]
public void TestTable()
{
var html = Documents.Table_Html;
var xaml = HtmlToXamlConverter.ConvertHtmlToXaml(html, new HtmlToXamlContext(new HtmlToXamlDocumentOptions()));
Assert.AreEqual(Documents.Table_XamlFromHtml, xaml);
}
}
}
8 changes: 8 additions & 0 deletions MarkupConverterTests/XamlToHtmlTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ public void TestMultipleStylesToPlain()
CollectionAssert.AreEqual(expectedList, texts);
}

[TestMethod]
public void TestTable()
{
var xaml = Documents.Table_Xaml;
var html = HtmlFromXamlConverter.ConvertXamlToHtml(xaml, new HtmlFromXamlContext(new HtmlFromXamlDocumentOptions()));
Assert.AreEqual(Documents.Table_HtmlFromXaml, html);
}

private void ReadText(XmlReader xamlReader, XmlWriter htmlWriter, StringBuilder inlineStyle, HtmlFromXamlContext context, ref string value)
{
texts.Add(value);
Expand Down

0 comments on commit cf3e872

Please sign in to comment.