using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using System.IO.Packaging; namespace Novacode { /// /// Represents a Hyperlink in a document. /// public class Hyperlink: DocXElement { internal Uri uri; internal String text; internal Dictionary hyperlink_rels; public PackagePart mainPart; internal int type; internal String id; internal XElement instrText; internal List runs; /// /// Remove a Hyperlink from this Paragraph only. /// /// /// /// // Create a document. /// using (DocX document = DocX.Create(@"Test.docx")) /// { /// // Add a hyperlink to this document. /// Hyperlink h = document.AddHyperlink("link", new Uri("http://www.google.com")); /// /// // Add a Paragraph to this document and insert the hyperlink /// Paragraph p1 = document.InsertParagraph(); /// p1.Append("This is a cool ").AppendHyperlink(h).Append(" ."); /// /// /* /// * Remove the hyperlink from this Paragraph only. /// * Note a reference to the hyperlink will still exist in the document and it can thus be reused. /// */ /// p1.Hyperlinks[0].Remove(); /// /// // Add a new Paragraph to this document and reuse the hyperlink h. /// Paragraph p2 = document.InsertParagraph(); /// p2.Append("This is the same cool ").AppendHyperlink(h).Append(" ."); /// /// document.Save(); /// }// Release this document from memory. /// /// public void Remove() { Xml.Remove(); } /// /// Change the Text of a Hyperlink. /// /// /// Change the Text of a Hyperlink. /// /// // Create a document. /// using (DocX document = DocX.Load(@"Test.docx")) /// { /// // Get all of the hyperlinks in this document /// List hyperlinks = document.Hyperlinks; /// /// // Change the first hyperlinks text and Uri /// Hyperlink h0 = hyperlinks[0]; /// h0.Text = "DocX"; /// h0.Uri = new Uri("http://docx.codeplex.com"); /// /// // Save this document. /// document.Save(); /// } /// /// public string Text { get { return this.text; } set { XElement rPr = new XElement ( DocX.w + "rPr", new XElement ( DocX.w + "rStyle", new XAttribute(DocX.w + "val", "Hyperlink") ) ); // Format and add the new text. List newRuns = HelperFunctions.FormatInput(value, rPr); if (type == 0) { // Get all the runs in this Text. var runs = from r in Xml.Elements() where r.Name.LocalName == "r" select r; // Remove each run. for (int i = 0; i < runs.Count(); i++) runs.Remove(); Xml.Add(newRuns); } else { XElement separate = XElement.Parse(@" "); XElement end = XElement.Parse(@" "); runs.Last().AddAfterSelf(separate, newRuns, end); runs.ForEach(r => r.Remove()); } this.text = value; } } /// /// Change the Uri of a Hyperlink. /// /// /// Change the Uri of a Hyperlink. /// /// // Create a document. /// using (DocX document = DocX.Load(@"Test.docx")) /// { /// // Get all of the hyperlinks in this document /// List hyperlinks = document.Hyperlinks; /// /// // Change the first hyperlinks text and Uri /// Hyperlink h0 = hyperlinks[0]; /// h0.Text = "DocX"; /// h0.Uri = new Uri("http://docx.codeplex.com"); /// /// // Save this document. /// document.Save(); /// } /// /// public Uri Uri { get { if (type == 0 && id != String.Empty) { PackageRelationship r = mainPart.GetRelationship(id); return r.TargetUri; } return this.uri; } set { if (type == 0) { PackageRelationship r = mainPart.GetRelationship(id); // Get all of the information about this relationship. TargetMode r_tm = r.TargetMode; string r_rt = r.RelationshipType; string r_id = r.Id; // Delete the relationship mainPart.DeleteRelationship(r_id); mainPart.CreateRelationship(value, r_tm, r_rt, r_id); } else { instrText.Value = "HYPERLINK " + "\"" + value + "\""; } this.uri = value; } } internal Hyperlink(DocX document, PackagePart mainPart, XElement i): base(document, i) { this.type = 0; this.id = i.Attribute(XName.Get("id", DocX.r.NamespaceName)).Value; StringBuilder sb = new StringBuilder(); HelperFunctions.GetTextRecursive(i, ref sb); this.text = sb.ToString(); } internal Hyperlink(DocX document, XElement instrText, List runs) : base(document, null) { this.type = 1; this.instrText = instrText; this.runs = runs; try { int start = instrText.Value.IndexOf("HYPERLINK \"") + "HYPERLINK \"".Length; int end = instrText.Value.IndexOf("\"", start); if (start != -1 && end != -1) { this.uri = new Uri(instrText.Value.Substring(start, end - start), UriKind.Absolute); StringBuilder sb = new StringBuilder(); HelperFunctions.GetTextRecursive(new XElement(XName.Get("temp", DocX.w.NamespaceName), runs), ref sb); this.text = sb.ToString(); } } catch (Exception e){throw e;} } } }