diff --git a/OpenXmlPowerTools/WmlToHtmlConverter.cs b/OpenXmlPowerTools/WmlToHtmlConverter.cs
index 3d1cb496..12c519cd 100644
--- a/OpenXmlPowerTools/WmlToHtmlConverter.cs
+++ b/OpenXmlPowerTools/WmlToHtmlConverter.cs
@@ -48,6 +48,7 @@ public class WmlToHtmlConverterSettings
public bool RestrictToSupportedNumberingFormats;
public Dictionary> ListItemImplementations;
public Func ImageHandler;
+ public bool OpenLinksInNewTab;
public WmlToHtmlConverterSettings()
{
@@ -59,6 +60,7 @@ public WmlToHtmlConverterSettings()
RestrictToSupportedLanguages = false;
RestrictToSupportedNumberingFormats = false;
ListItemImplementations = ListItemRetrieverSettings.DefaultListItemTextImplementations;
+ OpenLinksInNewTab = false;
}
public WmlToHtmlConverterSettings(HtmlConverterSettings htmlConverterSettings)
@@ -72,6 +74,7 @@ public WmlToHtmlConverterSettings(HtmlConverterSettings htmlConverterSettings)
RestrictToSupportedNumberingFormats = htmlConverterSettings.RestrictToSupportedNumberingFormats;
ListItemImplementations = htmlConverterSettings.ListItemImplementations;
ImageHandler = htmlConverterSettings.ImageHandler;
+ OpenLinksInNewTab = htmlConverterSettings.OpenLinksInNewTab;
}
}
@@ -87,7 +90,7 @@ public class HtmlConverterSettings
public bool RestrictToSupportedNumberingFormats;
public Dictionary> ListItemImplementations;
public Func ImageHandler;
-
+ public bool OpenLinksInNewTab;
public HtmlConverterSettings()
{
PageTitle = "";
@@ -98,6 +101,7 @@ public HtmlConverterSettings()
RestrictToSupportedLanguages = false;
RestrictToSupportedNumberingFormats = false;
ListItemImplementations = ListItemRetrieverSettings.DefaultListItemTextImplementations;
+ OpenLinksInNewTab = false;
}
}
@@ -411,18 +415,38 @@ private static object ConvertToHtmlTransform(WordprocessingDocument wordDoc,
{
try
{
- var a = new XElement(Xhtml.a,
- new XAttribute("href",
- wordDoc.MainDocumentPart
- .HyperlinkRelationships
- .First(x => x.Id == (string)element.Attribute(R.id))
- .Uri
+ if (settings.OpenLinksInNewTab)
+ {
+ var a = new XElement(Xhtml.a,
+ new XAttribute("href",
+ wordDoc.MainDocumentPart
+ .HyperlinkRelationships
+ .First(x => x.Id == (string)element.Attribute(R.id))
+ .Uri
),
- element.Elements(W.r).Select(run => ConvertRun(wordDoc, settings, run))
+ new XAttribute("target", "_blank"),
+ element.Elements(W.r).Select(run => ConvertRun(wordDoc, settings, run))
);
- if (!a.Nodes().Any())
- a.Add(new XText(""));
- return a;
+ if (!a.Nodes().Any())
+ a.Add(new XText(""));
+ return a;
+ }
+ else
+ {
+ var a = new XElement(Xhtml.a,
+ new XAttribute("href",
+ wordDoc.MainDocumentPart
+ .HyperlinkRelationships
+ .First(x => x.Id == (string)element.Attribute(R.id))
+ .Uri
+ ),
+ element.Elements(W.r).Select(run => ConvertRun(wordDoc, settings, run))
+ );
+ if (!a.Nodes().Any())
+ a.Add(new XText(""));
+ return a;
+ }
+
}
catch (UriFormatException)
{
@@ -528,7 +552,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 +563,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 +582,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 +620,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 +674,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 +728,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.
@@ -816,7 +840,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 +857,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 +866,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 +883,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 +902,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 +921,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 +949,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 +972,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;
}
@@ -959,7 +983,8 @@ private static object CreateSectionDivs(WordprocessingDocument wordDoc, WmlToHtm
// for the non-paging transform.
var groupedIntoDivs = element
.Elements()
- .GroupAdjacent(e => {
+ .GroupAdjacent(e =>
+ {
var sectAnnotation = e.Annotation();
return sectAnnotation != null ? sectAnnotation.SectionElement.ToString() : "";
});
@@ -1102,12 +1127,12 @@ private static List