HtexController.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using DocumentFormat.OpenXml.Presentation;
  2. using HTEXLib.Animations;
  3. using HTEXLib.Helpers.ShapeHelpers;
  4. using HTEXLib.Models;
  5. using HTEXLib.Models.HTEX;
  6. using Newtonsoft.Json.Linq;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using System.Text.Json;
  11. using System.Text.RegularExpressions;
  12. namespace HTEXLib.Controller
  13. {
  14. public class HtexController
  15. {
  16. private readonly int _numberOfSlides;
  17. private readonly int _allSlidesCount;
  18. private readonly int _slideIndex;
  19. // private readonly string _fileName;
  20. // private readonly string _baseFileName;
  21. // private readonly string _filePath;
  22. /// <summary>
  23. /// string SC = ".SC {height: " + SlideHeight + "px; width: " + SlideWidth + "px; display: none;}";
  24. /// </summary>
  25. private dynamic SC { get; set; }
  26. /// <summary>
  27. /// string DC = ".DC1 {top: 0px; left: 0px; height: 100%; width: 100%; opacity: 1; }";
  28. /// </summary>
  29. private dynamic DC1 { get; set; }
  30. /// <summary>
  31. /// string DC0 = ".DC0 {top: 0px; left: 0px; height: 100%; width: 100%; opacity: 0;}";
  32. /// </summary>
  33. private dynamic DC0 { get; set; }
  34. /// <summary>
  35. /// var gv = {w: 0,h: 0,t: 1,a: " + "'" + this._fileName + "'" + ",v: 0,sh:" + SlideHeight + ",sw:" + SlideWidth + ",s: 0,i:" + numbers + ",f:1,r:1};
  36. /// </summary>
  37. private dynamic gv { get; set; }
  38. // private readonly StringBuilder _htmlPart;
  39. private List<Item> htexElements;
  40. private readonly PPTSlide _mSlide;
  41. private const string JS_DIR_NAME = "temp";
  42. public double SlideWidth { get; set; }
  43. public double SlideHeight { get; set; }
  44. public HtexController(PPTSlide aSlide, int slideCounter, int slidesNumber)
  45. {
  46. this._mSlide = aSlide;
  47. _numberOfSlides = 1;
  48. _allSlidesCount = slidesNumber;
  49. _slideIndex = slideCounter;
  50. this.htexElements = new List<Item>();
  51. }
  52. public Slide GenerateHtex() {
  53. this.GenerateHeader();
  54. Slide slide= this.GenerateBody();
  55. return slide;
  56. }
  57. private void GenerateHeader()
  58. {
  59. int[] numbers = DynamicHeaderJSPart();
  60. AppendHeader(numbers);
  61. }
  62. private int [] DynamicHeaderJSPart()
  63. {
  64. if (_numberOfSlides == 1)
  65. {
  66. return new int[] { 0, 1, 1 } ;
  67. }
  68. else
  69. {
  70. int count = 0;
  71. List<int> arr = new List<int>();
  72. StringBuilder numbers = new StringBuilder();
  73. numbers.Append("[");
  74. while (count <= _numberOfSlides - 1)
  75. {
  76. arr.Add(count);
  77. numbers.Append(count.ToString());
  78. numbers.Append(",");
  79. count++;
  80. }
  81. numbers.Append(count);
  82. arr.Add(count);
  83. int length = numbers.ToString().Length;
  84. string outputString = numbers.ToString().Remove(length - 1, 1);
  85. arr.Add(int.Parse(outputString));
  86. //return outputString + "]";
  87. return arr.ToArray();
  88. }
  89. }
  90. private void AppendHeader(int[] numbers) {
  91. SC = new {
  92. height =SlideHeight,
  93. width =SlideWidth,
  94. display="none"
  95. };
  96. DC1 = new {
  97. top = 0,
  98. left = 0,
  99. height= "100%",
  100. width = "100%",
  101. opacity=1
  102. };
  103. DC0 = new
  104. {
  105. top = 0,
  106. left = 0,
  107. height = "100%",
  108. width = "100%",
  109. opacity = 0
  110. };
  111. gv = new
  112. {
  113. w = 0,
  114. h = 0,
  115. t= 1,
  116. v=0,
  117. sh=SlideHeight,
  118. sw=SlideWidth,
  119. s=0,
  120. i= numbers,
  121. f=1,
  122. r=1
  123. };
  124. }
  125. private Slide GenerateBody() {
  126. ///当页 动画p:timing presetID代表 动画类型 presetClass是进入,强调,还是退出,还是路径方式
  127. ///tgtEl 子类型
  128. ///inkTgt (墨迹目标) §19.5.47
  129. ///sldTgt (幻灯片目标) §19.5.67
  130. ///sndTgt (声音目标) §19.5.70
  131. ///spTgt (形状目标) §19.5.72
  132. ///p:spTgt spid 绑定的sp
  133. ///AppendPlayer
  134. int netxPage = _slideIndex >= _allSlidesCount ? _slideIndex : _slideIndex + 1;
  135. int prevPage = _slideIndex >= _allSlidesCount ? _slideIndex : _slideIndex - 1;
  136. Slide slide= DynamicBodyPart();
  137. if (slide != null) {
  138. slide.netxPage = netxPage;
  139. slide.prevPage = prevPage;
  140. }
  141. return slide;
  142. }
  143. private Slide DynamicBodyPart()
  144. {
  145. if (_numberOfSlides != 0)
  146. {
  147. ////foreach (PPTSlide pptSlide in _mSlides)
  148. ////{
  149. ///string dirpath = Path.Combine(_filePath, _fileName);
  150. HtexSlide htexSlide = new HtexSlide(_mSlide, _mSlide.slideIndex)
  151. {
  152. ContainerShape = _mSlide.ContainerShape,
  153. };
  154. string anima = new JSONGenerator(_mSlide).GetAnimaVariable();
  155. //if (_mSlide.slideIndex == 27) {
  156. //}
  157. Slide slide = new Slide();
  158. //string jsonStro = anima.Replace(",", ",").Replace("'","");
  159. //object res = JsonHelper.ConvertJsonStr(jsonStro);
  160. //string s = res.ToString();
  161. //var m = Regex.Match(s, "\"[0-9]{1,}\"");
  162. //while (m.Success)
  163. //{
  164. // string testInfo = m.Value;
  165. // string newStr = testInfo.Replace("\"", "");
  166. // s = s.Replace(testInfo, newStr);
  167. // m = m.NextMatch();
  168. //}
  169. //JToken token=JsonHelper. FromJson<JToken>(s);
  170. //slide.animations = token;
  171. Background background = _mSlide.background;
  172. if (background != null)
  173. {
  174. slide.fill = PPTXHelper.DoBackgroundProperties(background.BackgroundProperties, _mSlide, "master");
  175. };
  176. htexElements.AddRange(htexSlide.DrawElement());
  177. List<Group> newGroup = new List<Group>();
  178. //处理组合图形在Wpf不能多层嵌套
  179. int len = htexElements.Count;
  180. for (int i =0;i<len;i++)
  181. {
  182. if (htexElements[i] is Group group)
  183. {
  184. doGroup(group, newGroup);
  185. }
  186. }
  187. slide.item = htexElements;
  188. return slide;
  189. }
  190. else { return null; }
  191. }
  192. public void doGroup(Group group, List<Group> newGroup)
  193. {
  194. if (group != null && group.shapes != null && group.shapes.Count > 0)
  195. {
  196. newGroup.Add(group);
  197. int len = group.shapes.Count;
  198. for(int i= 0; i < len;i++ ){
  199. if (group.shapes[i] is Group gp)
  200. {
  201. //深拷贝操作
  202. // var gg= gp.ToJson().FromJson<Group>();
  203. doGroup(gp, newGroup);
  204. }
  205. }
  206. }
  207. }
  208. }
  209. }