Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

TableOfContents.cs 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Xml;
  5. using System.Xml.Linq;
  6. namespace Novacode
  7. {
  8. /// <summary>
  9. /// Represents a table of contents in the document
  10. /// </summary>
  11. public class TableOfContents : DocXElement
  12. {
  13. #region TocBaseValues
  14. private const string HeaderStyle = "TOCHeading";
  15. private const int RightTabPos = 9350;
  16. #endregion
  17. private TableOfContents(DocX document, XElement xml, string headerStyle) : base(document, xml)
  18. {
  19. AssureUpdateField(document);
  20. AssureStyles(document, headerStyle);
  21. }
  22. internal static TableOfContents CreateTableOfContents(DocX document, string title, TableOfContentsSwitches switches, string headerStyle = null, int lastIncludeLevel = 3, int? rightTabPos = null)
  23. {
  24. var reader = XmlReader.Create(new StringReader(string.Format(XmlTemplateBases.TocXmlBase, headerStyle ?? HeaderStyle, title, rightTabPos ?? RightTabPos, BuildSwitchString(switches, lastIncludeLevel))));
  25. var xml = XElement.Load(reader);
  26. return new TableOfContents(document, xml, headerStyle);
  27. }
  28. private void AssureUpdateField(DocX document)
  29. {
  30. if (document.settings.Descendants().Any(x => x.Name.Equals(DocX.w + "updateFields"))) return;
  31. var element = new XElement(XName.Get("updateFields", DocX.w.NamespaceName), new XAttribute(DocX.w + "val", true));
  32. document.settings.Root.Add(element);
  33. }
  34. private void AssureStyles(DocX document, string headerStyle)
  35. {
  36. if (!HasStyle(document, headerStyle, "paragraph"))
  37. {
  38. var reader = XmlReader.Create(new StringReader(string.Format(XmlTemplateBases.TocHeadingStyleBase, headerStyle ?? HeaderStyle)));
  39. var xml = XElement.Load(reader);
  40. document.styles.Root.Add(xml);
  41. }
  42. if (!HasStyle(document, "TOC1", "paragraph"))
  43. {
  44. var reader = XmlReader.Create(new StringReader(string.Format(XmlTemplateBases.TocElementStyleBase, "TOC1", "toc 1")));
  45. var xml = XElement.Load(reader);
  46. document.styles.Root.Add(xml);
  47. }
  48. if (!HasStyle(document, "TOC2", "paragraph"))
  49. {
  50. var reader = XmlReader.Create(new StringReader(string.Format(XmlTemplateBases.TocElementStyleBase, "TOC2", "toc 2")));
  51. var xml = XElement.Load(reader);
  52. document.styles.Root.Add(xml);
  53. }
  54. if (!HasStyle(document, "TOC3", "paragraph"))
  55. {
  56. var reader = XmlReader.Create(new StringReader(string.Format(XmlTemplateBases.TocElementStyleBase, "TOC3", "toc 3")));
  57. var xml = XElement.Load(reader);
  58. document.styles.Root.Add(xml);
  59. }
  60. if (!HasStyle(document, "TOC4", "paragraph"))
  61. {
  62. var reader = XmlReader.Create(new StringReader(string.Format(XmlTemplateBases.TocElementStyleBase, "TOC4", "toc 4")));
  63. var xml = XElement.Load(reader);
  64. document.styles.Root.Add(xml);
  65. }
  66. if (!HasStyle(document, "Hyperlink", "character"))
  67. {
  68. var reader = XmlReader.Create(new StringReader(string.Format(XmlTemplateBases.TocHyperLinkStyleBase)));
  69. var xml = XElement.Load(reader);
  70. document.styles.Root.Add(xml);
  71. }
  72. }
  73. private bool HasStyle(DocX document, string value, string type)
  74. {
  75. return document.styles.Descendants().Any(x => x.Name.Equals(DocX.w + "style")&& (x.Attribute(DocX.w + "type") == null || x.Attribute(DocX.w + "type").Value.Equals(type)) && x.Attribute(DocX.w + "styleId") != null && x.Attribute(DocX.w + "styleId").Value.Equals(value));
  76. }
  77. private static string BuildSwitchString(TableOfContentsSwitches switches, int lastIncludeLevel)
  78. {
  79. var allSwitches = Enum.GetValues(typeof (TableOfContentsSwitches)).Cast<TableOfContentsSwitches>();
  80. var switchString = "TOC";
  81. foreach (var s in allSwitches.Where(s => s != TableOfContentsSwitches.None && switches.HasFlag(s)))
  82. {
  83. switchString += " " + s.EnumDescription();
  84. if (s == TableOfContentsSwitches.O)
  85. {
  86. switchString += string.Format(" '{0}-{1}'", 1, lastIncludeLevel);
  87. }
  88. }
  89. return switchString;
  90. }
  91. }
  92. }