ComparisonUnitGroup.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright (c) Microsoft. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Xml.Linq;
  8. namespace OpenXmlPowerTools
  9. {
  10. internal class ComparisonUnitGroup : ComparisonUnit
  11. {
  12. public ComparisonUnitGroup(
  13. IEnumerable<ComparisonUnit> comparisonUnitList,
  14. ComparisonUnitGroupType groupType,
  15. int level)
  16. {
  17. Contents = comparisonUnitList.ToList();
  18. ComparisonUnitGroupType = groupType;
  19. ComparisonUnit first = Contents.First();
  20. ComparisonUnitAtom comparisonUnitAtom = GetFirstComparisonUnitAtomOfGroup(first);
  21. XElement[] ancestorsToLookAt = comparisonUnitAtom
  22. .AncestorElements
  23. .Where(e => e.Name == W.tbl || e.Name == W.tr || e.Name == W.tc || e.Name == W.p || e.Name == W.txbxContent)
  24. .ToArray();
  25. XElement ancestor = ancestorsToLookAt[level];
  26. if (ancestor == null) throw new OpenXmlPowerToolsException("Internal error: ComparisonUnitGroup");
  27. SHA1Hash = (string) ancestor.Attribute(PtOpenXml.SHA1Hash);
  28. CorrelatedSHA1Hash = (string) ancestor.Attribute(PtOpenXml.CorrelatedSHA1Hash);
  29. StructureSHA1Hash = (string) ancestor.Attribute(PtOpenXml.StructureSHA1Hash);
  30. }
  31. public ComparisonUnitGroupType ComparisonUnitGroupType { get; }
  32. public string CorrelatedSHA1Hash { get; }
  33. public string StructureSHA1Hash { get; }
  34. private static ComparisonUnitAtom GetFirstComparisonUnitAtomOfGroup(ComparisonUnit group)
  35. {
  36. ComparisonUnit thisGroup = group;
  37. while (true)
  38. {
  39. if (thisGroup is ComparisonUnitGroup tg)
  40. {
  41. thisGroup = tg.Contents.First();
  42. continue;
  43. }
  44. if (!(thisGroup is ComparisonUnitWord tw))
  45. {
  46. throw new OpenXmlPowerToolsException("Internal error: GetFirstComparisonUnitAtomOfGroup");
  47. }
  48. var ca = (ComparisonUnitAtom) tw.Contents.First();
  49. return ca;
  50. }
  51. }
  52. public override string ToString(int indent)
  53. {
  54. var sb = new StringBuilder();
  55. sb.Append("".PadRight(indent) + "Group Type: " + ComparisonUnitGroupType + " SHA1:" + SHA1Hash + Environment.NewLine);
  56. foreach (ComparisonUnit comparisonUnitAtom in Contents)
  57. {
  58. sb.Append(comparisonUnitAtom.ToString(indent + 2));
  59. }
  60. return sb.ToString();
  61. }
  62. }
  63. }