From 7fe1e2dd3b98192e605617f1851fd7a17506e070 Mon Sep 17 00:00:00 2001 From: WWL Publish Date: Fri, 8 May 2020 13:45:07 +0800 Subject: [PATCH] Update WmlToHtmlConverter.cs --- OpenXmlPowerTools/WmlToHtmlConverter.cs | 275 ++++++++++++++++-------- 1 file changed, 188 insertions(+), 87 deletions(-) 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 TransformElementsPrecedingTab(WordprocessingDocument List elementsPrecedingTab, XElement firstTabRun) { var tabWidth = firstTabRun != null - ? (decimal?) firstTabRun.Elements(W.tab).Attributes(PtOpenXml.TabWidth).FirstOrDefault() ?? 0m + ? (decimal?)firstTabRun.Elements(W.tab).Attributes(PtOpenXml.TabWidth).FirstOrDefault() ?? 0m : 0m; var precedingElementsWidth = elementsPrecedingTab .Elements() .Where(c => c.Attributes(PtOpenXml.TabWidth).Any()) - .Select(e => (decimal) e.Attribute(PtOpenXml.TabWidth)) + .Select(e => (decimal)e.Attribute(PtOpenXml.TabWidth)) .Sum(); var totalWidth = precedingElementsWidth + tabWidth; @@ -1144,7 +1241,7 @@ private static Dictionary DefineParagraphStyle(XElement paragrap { var style = new Dictionary(); - var styleName = (string) paragraph.Attribute(PtOpenXml.StyleName); + var styleName = (string)paragraph.Attribute(PtOpenXml.StyleName); if (styleName != null) style.Add("PtStyleName", styleName); @@ -1167,7 +1264,7 @@ private static Dictionary DefineParagraphStyle(XElement paragrap CreateStyleFromShd(style, pPr.Element(W.shd)); // Pt.FontName - var font = (string) paragraph.Attributes(PtOpenXml.FontName).FirstOrDefault(); + var font = (string)paragraph.Attributes(PtOpenXml.FontName).FirstOrDefault(); if (font != null) CreateFontCssProperty(font, style); @@ -1190,38 +1287,38 @@ private static void CreateStyleFromInd(Dictionary style, XElemen { if (ind == null) return; - var left = (decimal?) ind.Attribute(W.left); + var left = (decimal?)ind.Attribute(W.left); if (left != null && elementName != Xhtml.span) { - var leftInInches = (decimal) left/1440 - currentMarginLeft; + var leftInInches = (decimal)left / 1440 - currentMarginLeft; style.AddIfMissing(isBidi ? "margin-right" : "margin-left", leftInInches > 0m ? string.Format(NumberFormatInfo.InvariantInfo, "{0:0.00}in", leftInInches) : "0"); } - var right = (decimal?) ind.Attribute(W.right); + var right = (decimal?)ind.Attribute(W.right); if (right != null) { - var rightInInches = (decimal) right/1440; + var rightInInches = (decimal)right / 1440; style.AddIfMissing(isBidi ? "margin-left" : "margin-right", rightInInches > 0m ? string.Format(NumberFormatInfo.InvariantInfo, "{0:0.00}in", rightInInches) : "0"); } - var firstLine = (decimal?) ind.Attribute(W.firstLine); + var firstLine = (decimal?)ind.Attribute(W.firstLine); if (firstLine != null && elementName != Xhtml.span) { - var firstLineInInches = (decimal) firstLine/1440m; + var firstLineInInches = (decimal)firstLine / 1440m; style.AddIfMissing("text-indent", string.Format(NumberFormatInfo.InvariantInfo, "{0:0.00}in", firstLineInInches)); } - var hanging = (decimal?) ind.Attribute(W.hanging); + var hanging = (decimal?)ind.Attribute(W.hanging); if (hanging != null && elementName != Xhtml.span) { - var hangingInInches = (decimal) -hanging/1440m; + var hangingInInches = (decimal)-hanging / 1440m; style.AddIfMissing("text-indent", string.Format(NumberFormatInfo.InvariantInfo, "{0:0.00}in", hangingInInches)); } @@ -1248,42 +1345,42 @@ private static void CreateStyleFromSpacing(Dictionary style, XEl { if (spacing == null) return; - var spacingBefore = (decimal?) spacing.Attribute(W.before); + var spacingBefore = (decimal?)spacing.Attribute(W.before); if (spacingBefore != null && elementName != Xhtml.span) style.AddIfMissing("margin-top", spacingBefore > 0m - ? string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", spacingBefore/20.0m) + ? string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", spacingBefore / 20.0m) : "0"); - var lineRule = (string) spacing.Attribute(W.lineRule); + var lineRule = (string)spacing.Attribute(W.lineRule); if (lineRule == "auto") { - var line = (decimal) spacing.Attribute(W.line); + var line = (decimal)spacing.Attribute(W.line); if (line != 240m) { - var pct = (line/240m)*100m; + var pct = (line / 240m) * 100m; style.Add("line-height", string.Format(NumberFormatInfo.InvariantInfo, "{0:0.0}%", pct)); } } if (lineRule == "exact") { - var line = (decimal) spacing.Attribute(W.line); - var points = line/20m; + var line = (decimal)spacing.Attribute(W.line); + var points = line / 20m; style.Add("line-height", string.Format(NumberFormatInfo.InvariantInfo, "{0:0.0}pt", points)); } if (lineRule == "atLeast") { - var line = (decimal) spacing.Attribute(W.line); - var points = line/20m; + var line = (decimal)spacing.Attribute(W.line); + var points = line / 20m; if (points >= 14m) style.Add("line-height", string.Format(NumberFormatInfo.InvariantInfo, "{0:0.0}pt", points)); } - var spacingAfter = suppressTrailingWhiteSpace ? 0m : (decimal?) spacing.Attribute(W.after); + var spacingAfter = suppressTrailingWhiteSpace ? 0m : (decimal?)spacing.Attribute(W.after); if (spacingAfter != null) style.AddIfMissing("margin-bottom", spacingAfter > 0m - ? string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", spacingAfter/20.0m) + ? string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", spacingAfter / 20.0m) : "0"); } @@ -1418,37 +1515,37 @@ private static Dictionary DefineRunStyle(XElement run) var rPr = run.Elements(W.rPr).First(); - var styleName = (string) run.Attribute(PtOpenXml.StyleName); + var styleName = (string)run.Attribute(PtOpenXml.StyleName); if (styleName != null) style.Add("PtStyleName", styleName); // W.bdr - if (rPr.Element(W.bdr) != null && (string) rPr.Elements(W.bdr).Attributes(W.val).FirstOrDefault() != "none") + if (rPr.Element(W.bdr) != null && (string)rPr.Elements(W.bdr).Attributes(W.val).FirstOrDefault() != "none") { style.AddIfMissing("border", "solid windowtext 1.0pt"); style.AddIfMissing("padding", "0"); } // W.color - var color = (string) rPr.Elements(W.color).Attributes(W.val).FirstOrDefault(); + var color = (string)rPr.Elements(W.color).Attributes(W.val).FirstOrDefault(); if (color != null) CreateColorProperty("color", color, style); // W.highlight - var highlight = (string) rPr.Elements(W.highlight).Attributes(W.val).FirstOrDefault(); + var highlight = (string)rPr.Elements(W.highlight).Attributes(W.val).FirstOrDefault(); if (highlight != null) CreateColorProperty("background", highlight, style); // W.shd - var shade = (string) rPr.Elements(W.shd).Attributes(W.fill).FirstOrDefault(); + var shade = (string)rPr.Elements(W.shd).Attributes(W.fill).FirstOrDefault(); if (shade != null) CreateColorProperty("background", shade, style); // Pt.FontName var sym = run.Element(W.sym); var font = sym != null - ? (string) sym.Attributes(W.font).FirstOrDefault() - : (string) run.Attributes(PtOpenXml.FontName).FirstOrDefault(); + ? (string)sym.Attributes(W.font).FirstOrDefault() + : (string)run.Attributes(PtOpenXml.FontName).FirstOrDefault(); if (font != null) CreateFontCssProperty(font, style); @@ -1456,7 +1553,7 @@ private static Dictionary DefineRunStyle(XElement run) var languageType = (string)run.Attribute(PtOpenXml.LanguageType); var sz = GetFontSize(languageType, rPr); if (sz != null) - style.AddIfMissing("font-size", string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", sz/2.0m)); + style.AddIfMissing("font-size", string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", sz / 2.0m)); // W.caps if (GetBoolProp(rPr, W.caps)) @@ -1467,19 +1564,19 @@ private static Dictionary DefineRunStyle(XElement run) style.AddIfMissing("font-variant", "small-caps"); // W.spacing - var spacingInTwips = (decimal?) rPr.Elements(W.spacing).Attributes(W.val).FirstOrDefault(); + var spacingInTwips = (decimal?)rPr.Elements(W.spacing).Attributes(W.val).FirstOrDefault(); if (spacingInTwips != null) style.AddIfMissing("letter-spacing", spacingInTwips > 0m - ? string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", spacingInTwips/20) + ? string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", spacingInTwips / 20) : "0"); // W.position - var position = (decimal?) rPr.Elements(W.position).Attributes(W.val).FirstOrDefault(); + var position = (decimal?)rPr.Elements(W.position).Attributes(W.val).FirstOrDefault(); if (position != null) { style.AddIfMissing("position", "relative"); - style.AddIfMissing("top", string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", -(position/2))); + style.AddIfMissing("top", string.Format(NumberFormatInfo.InvariantInfo, "{0}pt", -(position / 2))); } // W.vanish @@ -1487,7 +1584,7 @@ private static Dictionary DefineRunStyle(XElement run) style.AddIfMissing("display", "none"); // W.u - if (rPr.Element(W.u) != null && (string) rPr.Elements(W.u).Attributes(W.val).FirstOrDefault() != "none") + if (rPr.Element(W.u) != null && (string)rPr.Elements(W.u).Attributes(W.val).FirstOrDefault() != "none") style.AddIfMissing("text-decoration", "underline"); // W.i @@ -1521,8 +1618,8 @@ private static Dictionary DefineRunStyle(XElement run) { if (rPr == null) return null; return languageType == "bidi" - ? (decimal?) rPr.Elements(W.szCs).Attributes(W.val).FirstOrDefault() - : (decimal?) rPr.Elements(W.sz).Attributes(W.val).FirstOrDefault(); + ? (decimal?)rPr.Elements(W.szCs).Attributes(W.val).FirstOrDefault() + : (decimal?)rPr.Elements(W.sz).Attributes(W.val).FirstOrDefault(); } private static void DetermineRunMarks(XElement run, XElement rPr, Dictionary style, out XEntity runStartMark, out XEntity runEndMark) @@ -1573,11 +1670,11 @@ private static XAttribute GetLangAttribute(XElement run) string lang = null; if (languageType == "western") - lang = (string) rPr.Elements(W.lang).Attributes(W.val).FirstOrDefault(); + lang = (string)rPr.Elements(W.lang).Attributes(W.val).FirstOrDefault(); else if (languageType == "bidi") - lang = (string) rPr.Elements(W.lang).Attributes(W.bidi).FirstOrDefault(); + lang = (string)rPr.Elements(W.lang).Attributes(W.bidi).FirstOrDefault(); else if (languageType == "eastAsia") - lang = (string) rPr.Elements(W.lang).Attributes(W.eastAsia).FirstOrDefault(); + lang = (string)rPr.Elements(W.lang).Attributes(W.eastAsia).FirstOrDefault(); if (lang == null) lang = defaultLanguage; @@ -1603,7 +1700,7 @@ private static void AdjustTableBorders(XElement tbl) .Elements(W.tc) .SelectMany(c => Enumerable.Repeat(c, - (int?) c.Elements(W.tcPr).Elements(W.gridSpan).Attributes(W.val).FirstOrDefault() ?? 1)) + (int?)c.Elements(W.tcPr).Elements(W.gridSpan).Attributes(W.val).FirstOrDefault() ?? 1)) .ToArray()) .ToArray(); @@ -2176,7 +2273,7 @@ private static object CalculateSpanWidthTransform(XNode node, int defaultTabStop //var widthOfText = CalcWidthOfRunInTwips(dummyRun3); const int widthOfText = 0; currentElement.Add(new XAttribute(PtOpenXml.TabWidth, - string.Format(NumberFormatInfo.InvariantInfo, "{0:0.000}", (decimal) widthOfText/1440m))); + string.Format(NumberFormatInfo.InvariantInfo, "{0:0.000}", (decimal)widthOfText / 1440m))); twipCounter += widthOfText; currentElementIdx++; @@ -2300,7 +2397,7 @@ private static int CalcWidthOfRunInTwips(XElement r) // TODO: Revisit. var runText = r.DescendantsTrimmed(W.txbxContent) .Where(e => e.Name == W.t) - .Select(t => (string) t) + .Select(t => (string)t) .StringConcatenate() + " "; var tabLength = r.DescendantsTrimmed(W.txbxContent) @@ -2517,23 +2614,23 @@ private static SectionAnnotation InitializeSectionAnnotation(IEnumerable elements) { return elements.GroupAdjacent(e => + { + var pBdr = e.Elements(W.pPr).Elements(W.pBdr).FirstOrDefault(); + if (pBdr != null) { - var pBdr = e.Elements(W.pPr).Elements(W.pBdr).FirstOrDefault(); - if (pBdr != null) - { - var indStr = string.Empty; - var ind = e.Elements(W.pPr).Elements(W.ind).FirstOrDefault(); - if (ind != null) - indStr = ind.ToString(SaveOptions.DisableFormatting); - return pBdr.ToString(SaveOptions.DisableFormatting) + indStr; - } - return e.Name == W.tbl ? "table" : string.Empty; - }) + var indStr = string.Empty; + var ind = e.Elements(W.pPr).Elements(W.ind).FirstOrDefault(); + if (ind != null) + indStr = ind.ToString(SaveOptions.DisableFormatting); + return pBdr.ToString(SaveOptions.DisableFormatting) + indStr; + } + return e.Name == W.tbl ? "table" : string.Empty; + }) .Select(g => { if (g.Key == string.Empty) { - return (object) GroupAndVerticallySpaceNumberedParagraphs(wordDoc, settings, g, 0m); + return (object)GroupAndVerticallySpaceNumberedParagraphs(wordDoc, settings, g, 0m); } if (g.Key == "table") { @@ -2551,8 +2648,8 @@ private static object CreateBorderDivs(WordprocessingDocument wordDoc, WmlToHtml var ind = pPr.Element(W.ind); if (ind != null) { - var leftInInches = (decimal?) ind.Attribute(W.left)/1440m ?? 0; - var hangingInInches = -(decimal?) ind.Attribute(W.hanging)/1440m ?? 0; + var leftInInches = (decimal?)ind.Attribute(W.left) / 1440m ?? 0; + var hangingInInches = -(decimal?)ind.Attribute(W.hanging) / 1440m ?? 0; currentMarginLeft = leftInInches + hangingInInches; style.AddIfMissing("margin-left", @@ -2739,7 +2836,7 @@ private static void GenerateBorderStyle(XElement pBdr, XName sideXName, Dictiona } } - private static readonly Dictionary> ShadeMapper = new Dictionary>() + private static readonly Dictionary> ShadeMapper = new Dictionary>() { { "auto", (c, f) => c }, { "clear", (c, f) => f }, @@ -2813,7 +2910,11 @@ private static void CreateStyleFromShd(Dictionary style, XElemen var shadeType = (string)shd.Attribute(W.val); var color = (string)shd.Attribute(W.color); var fill = (string)shd.Attribute(W.fill); - if (ShadeMapper.ContainsKey(shadeType)) + //if (ShadeMapper.ContainsKey(shadeType)) + //{ + // color = ShadeMapper[shadeType](color, fill); + //} + if (shadeType != null && ShadeMapper.ContainsKey(shadeType)) { color = ShadeMapper[shadeType](color, fill); }