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;}
}
}
}