Просмотр исходного кода

Bug fixes and Extensions Flatten function

master
coffeycathal_cp 15 лет назад
Родитель
Сommit
950d116dfc
7 измененных файлов: 102 добавлений и 36 удалений
  1. 1
    1
      DocX/Container.cs
  2. 3
    6
      DocX/DocX.cs
  3. 57
    0
      DocX/HelperFunctions.cs
  4. 3
    27
      DocX/Paragraph.cs
  5. 5
    1
      DocX/Table.cs
  6. 1
    1
      DocX/_BaseClasses.cs
  7. 32
    0
      DocX/_Extensions.cs

+ 1
- 1
DocX/Container.cs Просмотреть файл

{ {
List<Paragraph> paragraphs = List<Paragraph> paragraphs =
( (
from p in Xml.Descendants(DocX.w + "p")
from p in Xml.Elements(DocX.w + "p")
select new Paragraph(Document, p, 0) select new Paragraph(Document, p, 0)
).ToList(); ).ToList();

+ 3
- 6
DocX/DocX.cs Просмотреть файл

{ {
get get
{ {
string text = string.Empty;
foreach (Paragraph p in Paragraphs)
{
text += p.Text + "\n";
}
return text;
StringBuilder sb = new StringBuilder();
HelperFunctions.GetText(Xml, sb);
return sb.ToString();
} }
} }

+ 57
- 0
DocX/HelperFunctions.cs Просмотреть файл

{ {
internal static class HelperFunctions internal static class HelperFunctions
{ {
internal static void GetText(XElement e, StringBuilder sb)
{
if (e.HasElements)
{
XElement clone = CloneElement(e);
IEnumerable<XElement> children = clone.Elements();
children.Remove();
sb.Append(ToText(clone));
foreach (XElement elem in e.Elements())
GetText(elem, sb);
}
else
sb.Append(ToText(e));
}
internal static string ToText(XElement e)
{
switch (e.Name.LocalName)
{
case "tab":
return "\t";
case "br":
return "\n";
case "t":
goto case "delText";
case "delText":
return e.Value;
case "tr":
goto case "br";
case "tc":
goto case "tab";
default: return "";
}
}
internal static XElement CloneElement(XElement element)
{
return new XElement
(
element.Name,
element.Attributes(),
element.Nodes().Select
(
n =>
{
XElement e = n as XElement;
if (e != null)
return CloneElement(e);
return n;
}
)
);
}
internal static PackagePart CreateOrGetSettingsPart(Package package) internal static PackagePart CreateOrGetSettingsPart(Package package)
{ {
PackagePart settingsPart; PackagePart settingsPart;

+ 3
- 27
DocX/Paragraph.cs Просмотреть файл

private Alignment alignment; private Alignment alignment;
// A lookup for the runs in this paragraph // A lookup for the runs in this paragraph
Dictionary<int, Run> runLookup = new Dictionary<int, Run>();
public Dictionary<int, Run> runLookup = new Dictionary<int, Run>();
internal int startIndex, endIndex; internal int startIndex, endIndex;
get get
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
// Loop through each run in this paragraph
foreach (XElement r in Xml.Descendants(XName.Get("r", DocX.w.NamespaceName)))
{
// Loop through each text item in this run
foreach (XElement descendant in r.Descendants())
{
switch (descendant.Name.LocalName)
{
case "tab":
sb.Append("\t");
break;
case "br":
sb.Append("\n");
break;
case "t":
goto case "delText";
case "delText":
sb.Append(descendant.Value);
break;
default: break;
}
}
}
HelperFunctions.GetText(Xml, sb);
return sb.ToString(); return sb.ToString();
} }
} }
} }
} }
internal class Run : DocXElement
public class Run : DocXElement
{ {
// A lookup for the text elements in this paragraph // A lookup for the text elements in this paragraph
Dictionary<int, Text> textLookup = new Dictionary<int, Text>(); Dictionary<int, Text> textLookup = new Dictionary<int, Text>();

+ 5
- 1
DocX/Table.cs Просмотреть файл

{ {
get get
{ {
List<Paragraph> paragraphs = base.Paragraphs;
List<Paragraph> paragraphs =
(
from p in Xml.Descendants(DocX.w + "p")
select new Paragraph(Document, p, 0)
).ToList();
foreach (Paragraph p in paragraphs) foreach (Paragraph p in paragraphs)
p.PackagePart = table.mainPart; p.PackagePart = table.mainPart;

+ 1
- 1
DocX/_BaseClasses.cs Просмотреть файл

/// </p> /// </p>
/// </summary> /// </summary>
private XElement xml; private XElement xml;
internal XElement Xml { get { return xml; } set { xml = value; } }
public XElement Xml { get { return xml; } set { xml = value; } }
/// <summary> /// <summary>
/// This is a reference to the DocX object that this element belongs to. /// This is a reference to the DocX object that this element belongs to.

+ 32
- 0
DocX/_Extensions.cs Просмотреть файл

using System.Text; using System.Text;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Xml.Linq;
namespace Novacode namespace Novacode
{ {
return string.Format("{0}{1}{2}", redHex, greenHex, blueHex); return string.Format("{0}{1}{2}", redHex, greenHex, blueHex);
} }
public static void Flatten(this XElement e, XName name, List<XElement> flat)
{
// Add this element (without its children) to the flat list.
XElement clone = CloneElement(e);
clone.Elements().Remove();
// Filter elements using XName.
if (clone.Name == name)
flat.Add(clone);
// Process the children.
if (e.HasElements)
foreach (XElement elem in e.Elements(name)) // Filter elements using XName
elem.Flatten(name, flat);
}
static XElement CloneElement(XElement element)
{
return new XElement(element.Name,
element.Attributes(),
element.Nodes().Select(n =>
{
XElement e = n as XElement;
if (e != null)
return CloneElement(e);
return n;
}
)
);
}
} }
} }

Загрузка…
Отмена
Сохранить