diff --git a/OpenXmlPowerTools/WmlToHtmlConverter.cs b/OpenXmlPowerTools/WmlToHtmlConverter.cs
index 8c908cfd..071a5a2c 100644
--- a/OpenXmlPowerTools/WmlToHtmlConverter.cs
+++ b/OpenXmlPowerTools/WmlToHtmlConverter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft. All rights reserved.
+// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
@@ -8,6 +8,7 @@
using System.Globalization;
using System.Linq;
using System.Text;
+using System.Text.RegularExpressions;
using System.Xml.Linq;
using DocumentFormat.OpenXml.Packaging;
@@ -195,7 +196,8 @@ public static XElement ConvertToHtml(WordprocessingDocument wordDoc, WmlToHtmlCo
XElement xhtml = (XElement)ConvertToHtmlTransform(wordDoc, htmlConverterSettings,
rootElement, false, 0m);
-
+ AddMarkToAllHtmlNodes(xhtml);
+ AddBoldSignature(xhtml);
ReifyStylesAndClasses(htmlConverterSettings, xhtml);
// Note: the xhtml returned by ConvertToHtmlTransform contains objects of type
@@ -209,6 +211,74 @@ public static XElement ConvertToHtml(WordprocessingDocument wordDoc, WmlToHtmlCo
return xhtml;
}
+ private static void AddBoldSignature(XElement xhtml)
+ {
+ try
+ {
+ List lstBoldNodes = new List();
+ List lstBoldEntityNodes = new List();
+ foreach (var node in xhtml.Descendants())
+ {
+ Dictionary style = node.Annotation>();
+ if (style != null && style.ContainsKey("font-weight") && style["font-weight"] == "bold")
+ {
+ var boldNodes = node.DescendantNodesAndSelf();
+ foreach (XNode boldNode in node.DescendantNodesAndSelf())
+ {
+ if (boldNode is XEntity)
+ {
+ lstBoldEntityNodes.Add(boldNode as XEntity);
+ }
+ else if (boldNode is XText)
+ {
+ if (boldNode != null && !string.IsNullOrWhiteSpace(boldNode.ToString()))
+ {
+ if (!lstBoldNodes.Contains(boldNode))
+ {
+ lstBoldNodes.Add(boldNode);
+ }
+ }
+ }
+ }
+ }
+ }
+ foreach (XNode boldNode in lstBoldNodes)
+ {
+ string value = boldNode.ToString();
+ Match match = Regex.Match(value, "^(\\s)+");
+ string startSpace = "";
+ string endSpaceh = "";
+ if (match.Success)
+ {
+ startSpace = match.Value;
+ }
+ match = Regex.Match(value, "(\\s)+$");
+ if (match.Success)
+ {
+ endSpaceh = match.Value;
+ }
+ boldNode.ReplaceWith(startSpace, new XElement(Xhtml.b, value.Trim()), endSpaceh);
+ }
+ //foreach (XEntity boldNode in lstBoldEntityNodes)
+ //{
+ // boldNode.ReplaceWith(new XElement(Xhtml.b, boldNode));
+ //}
+ }
+ catch (Exception ex)
+ {
+ string s = "";
+ }
+ }
+
+ private static void AddMarkToAllHtmlNodes(XElement xhtml)
+ {
+ foreach (var node in xhtml.DescendantsAndSelf())
+ {
+ var markName = XName.Get("data-htmlNode");
+ node.SetAttributeValue(markName, "");
+ }
+ }
+
private static void ReverseTableBordersForRtlTables(WordprocessingDocument wordDoc)
{
XDocument xd = wordDoc.MainDocumentPart.GetXDocument();
@@ -439,7 +509,17 @@ private static object ConvertToHtmlTransform(WordprocessingDocument wordDoc,
// Transform contents of runs.
if (element.Name == W.r)
{
- return ConvertRun(wordDoc, settings, element);
+ //return ConvertRun(wordDoc, settings, element);
+ var el = ConvertRun(wordDoc, settings, element);
+ if (element.Attributes(PtOpenXml.ListItemRun).FirstOrDefault() != null)
+ {
+ var xe = el as XElement;
+ if (xe != null)
+ {
+ xe.SetAttributeValue(XName.Get("data-listItemSymbol"), "");
+ }
+ }
+ return el;
}
// Transform w:bookmarkStart into anchor
@@ -528,7 +608,7 @@ private static object ProcessHyperlinkToBookmark(WordprocessingDocument wordDoc,
{
var style = new Dictionary();
var a = new XElement(Xhtml.a,
- new XAttribute("href", "#" + (string) element.Attribute(W.anchor)),
+ new XAttribute("href", "#" + (string)element.Attribute(W.anchor)),
element.Elements(W.r).Select(run => ConvertRun(wordDoc, settings, run)));
if (!a.Nodes().Any())
a.Add(new XText(""));
@@ -539,7 +619,7 @@ private static object ProcessHyperlinkToBookmark(WordprocessingDocument wordDoc,
private static object ProcessBookmarkStart(XElement element)
{
- var name = (string) element.Attribute(W.name);
+ var name = (string)element.Attribute(W.name);
if (name == null) return null;
var style = new Dictionary();
@@ -558,8 +638,8 @@ private static object ProcessTab(XElement element)
var tabWidthAtt = element.Attribute(PtOpenXml.TabWidth);
if (tabWidthAtt == null) return null;
- var leader = (string) element.Attribute(PtOpenXml.Leader);
- var tabWidth = (decimal) tabWidthAtt;
+ var leader = (string)element.Attribute(PtOpenXml.Leader);
+ var tabWidth = (decimal)tabWidthAtt;
var style = new Dictionary();
XElement span;
if (leader != null)
@@ -596,7 +676,7 @@ private static object ProcessTab(XElement element)
if (widthOfLeaderChar != 0)
{
- var numberOfLeaderChars = (int) (Math.Floor((tabWidth*1440)/widthOfLeaderChar));
+ var numberOfLeaderChars = (int)(Math.Floor((tabWidth * 1440) / widthOfLeaderChar));
if (numberOfLeaderChars < 0)
numberOfLeaderChars = 0;
span = new XElement(Xhtml.span,
@@ -650,7 +730,7 @@ private static object ProcessTab(XElement element)
private static object ProcessBreak(XElement element)
{
XElement span = null;
- var tabWidth = (decimal?) element.Attribute(PtOpenXml.TabWidth);
+ var tabWidth = (decimal?)element.Attribute(PtOpenXml.TabWidth);
if (tabWidth != null)
{
span = new XElement(Xhtml.span);
@@ -704,7 +784,7 @@ private static object ProcessParagraph(WordprocessingDocument wordDoc, WmlToHtml
var elementName = GetParagraphElementName(element, wordDoc);
var isBidi = IsBidi(element);
- var paragraph = (XElement) ConvertParagraph(wordDoc, settings, element, elementName,
+ var paragraph = (XElement)ConvertParagraph(wordDoc, settings, element, elementName,
suppressTrailingWhiteSpace, currentMarginLeft, isBidi);
// The paragraph conversion might have created empty spans.
@@ -803,6 +883,23 @@ private static object ProcessTable(WordprocessingDocument wordDoc, WmlToHtmlConv
dir,
jcToUse,
table);
+ //add tableDiv style.
+ try
+ {
+ var tableDivStyle = new Dictionary();
+ if (dir != null)
+ {
+ tableDivStyle.AddIfMissing(dir.Name.LocalName, dir.Value);
+ }
+ if (jcToUse != null)
+ {
+ tableDivStyle.AddIfMissing(jcToUse.Name.LocalName, jcToUse.Value);
+ }
+ tableDiv.AddAnnotation(tableDivStyle);
+ }
+ catch (Exception)
+ {
+ }
return tableDiv;
}
@@ -816,7 +913,7 @@ private static object ProcessTableCell(WordprocessingDocument wordDoc, WmlToHtml
var tcPr = element.Element(W.tcPr);
if (tcPr != null)
{
- if ((string) tcPr.Elements(W.vMerge).Attributes(W.val).FirstOrDefault() == "restart")
+ if ((string)tcPr.Elements(W.vMerge).Attributes(W.val).FirstOrDefault() == "restart")
{
var currentRow = element.Parent.ElementsBeforeSelf(W.tr).Count();
var currentCell = element.ElementsBeforeSelf(W.tc).Count();
@@ -833,7 +930,7 @@ private static object ProcessTableCell(WordprocessingDocument wordDoc, WmlToHtml
break;
if (cell2.Elements(W.tcPr).Elements(W.vMerge).FirstOrDefault() == null)
break;
- if ((string) cell2.Elements(W.tcPr).Elements(W.vMerge).Attributes(W.val).FirstOrDefault() == "restart")
+ if ((string)cell2.Elements(W.tcPr).Elements(W.vMerge).Attributes(W.val).FirstOrDefault() == "restart")
break;
currentRow += 1;
rowSpanCount += 1;
@@ -842,12 +939,12 @@ private static object ProcessTableCell(WordprocessingDocument wordDoc, WmlToHtml
}
if (tcPr.Element(W.vMerge) != null &&
- (string) tcPr.Elements(W.vMerge).Attributes(W.val).FirstOrDefault() != "restart")
+ (string)tcPr.Elements(W.vMerge).Attributes(W.val).FirstOrDefault() != "restart")
return null;
if (tcPr.Element(W.vAlign) != null)
{
- var vAlignVal = (string) tcPr.Elements(W.vAlign).Attributes(W.val).FirstOrDefault();
+ var vAlignVal = (string)tcPr.Elements(W.vAlign).Attributes(W.val).FirstOrDefault();
if (vAlignVal == "top")
style.AddIfMissing("vertical-align", "top");
else if (vAlignVal == "center")
@@ -859,15 +956,15 @@ private static object ProcessTableCell(WordprocessingDocument wordDoc, WmlToHtml
}
style.AddIfMissing("vertical-align", "top");
- if ((string) tcPr.Elements(W.tcW).Attributes(W.type).FirstOrDefault() == "dxa")
+ if ((string)tcPr.Elements(W.tcW).Attributes(W.type).FirstOrDefault() == "dxa")
{
- decimal width = (int) tcPr.Elements(W.tcW).Attributes(W._w).FirstOrDefault();
- style.AddIfMissing("width", string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", width/20m));
+ decimal width = (int)tcPr.Elements(W.tcW).Attributes(W._w).FirstOrDefault();
+ style.AddIfMissing("width", string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", width / 20m));
}
- if ((string) tcPr.Elements(W.tcW).Attributes(W.type).FirstOrDefault() == "pct")
+ if ((string)tcPr.Elements(W.tcW).Attributes(W.type).FirstOrDefault() == "pct")
{
- decimal width = (int) tcPr.Elements(W.tcW).Attributes(W._w).FirstOrDefault();
- style.AddIfMissing("width", string.Format(NumberFormatInfo.InvariantInfo, "{0:0.0}%", width/50m));
+ decimal width = (int)tcPr.Elements(W.tcW).Attributes(W._w).FirstOrDefault();
+ style.AddIfMissing("width", string.Format(NumberFormatInfo.InvariantInfo, "{0:0.0}%", width / 50m));
}
var tcBorders = tcPr.Element(W.tcBorders);
@@ -878,9 +975,9 @@ private static object ProcessTableCell(WordprocessingDocument wordDoc, WmlToHtml
CreateStyleFromShd(style, tcPr.Element(W.shd));
- var gridSpan = tcPr.Elements(W.gridSpan).Attributes(W.val).Select(a => (int?) a).FirstOrDefault();
+ var gridSpan = tcPr.Elements(W.gridSpan).Attributes(W.val).Select(a => (int?)a).FirstOrDefault();
if (gridSpan != null)
- colSpan = new XAttribute("colspan", (int) gridSpan);
+ colSpan = new XAttribute("colspan", (int)gridSpan);
}
style.AddIfMissing("padding-top", "0");
style.AddIfMissing("padding-bottom", "0");
@@ -897,10 +994,10 @@ private static object ProcessTableRow(WordprocessingDocument wordDoc, WmlToHtmlC
decimal currentMarginLeft)
{
var style = new Dictionary();
- int? trHeight = (int?) element.Elements(W.trPr).Elements(W.trHeight).Attributes(W.val).FirstOrDefault();
+ int? trHeight = (int?)element.Elements(W.trPr).Elements(W.trHeight).Attributes(W.val).FirstOrDefault();
if (trHeight != null)
style.AddIfMissing("height",
- string.Format(NumberFormatInfo.InvariantInfo, "{0:0.00}in", (decimal) trHeight/1440m));
+ string.Format(NumberFormatInfo.InvariantInfo, "{0:0.00}in", (decimal)trHeight / 1440m));
var htmlRow = new XElement(Xhtml.tr,
element.Elements().Select(e => ConvertToHtmlTransform(wordDoc, settings, e, false, currentMarginLeft)));
if (style.Any())
@@ -925,14 +1022,14 @@ private static XName GetParagraphElementName(XElement element, WordprocessingDoc
{
var elementName = Xhtml.p;
- var styleId = (string) element.Elements(W.pPr).Elements(W.pStyle).Attributes(W.val).FirstOrDefault();
+ var styleId = (string)element.Elements(W.pPr).Elements(W.pStyle).Attributes(W.val).FirstOrDefault();
if (styleId == null) return elementName;
var style = GetStyle(styleId, wordDoc);
if (style == null) return elementName;
var outlineLevel =
- (int?) style.Elements(W.pPr).Elements(W.outlineLvl).Attributes(W.val).FirstOrDefault();
+ (int?)style.Elements(W.pPr).Elements(W.outlineLvl).Attributes(W.val).FirstOrDefault();
if (outlineLevel != null && outlineLevel <= 5)
{
elementName = Xhtml.xhtml + string.Format("h{0}", outlineLevel + 1);
@@ -948,7 +1045,7 @@ private static XElement GetStyle(string styleId, WordprocessingDocument wordDoc)
var styles = stylesPart.GetXDocument().Root;
return styles != null
- ? styles.Elements(W.style).FirstOrDefault(s => (string) s.Attribute(W.styleId) == styleId)
+ ? styles.Elements(W.style).FirstOrDefault(s => (string)s.Attribute(W.styleId) == styleId)
: null;
}
@@ -1102,12 +1199,12 @@ private static List