HtexController.cs 8.1 KB

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