using DocumentFormat.OpenXml.Presentation; using HTEXLib.Animations; using HTEXLib.Helpers.ShapeHelpers; using HTEXLib.Models; using HTEXLib.Models.HTEX; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Text.RegularExpressions; namespace HTEXLib.Controller { public class HtexController { private readonly int _numberOfSlides; private readonly int _allSlidesCount; private readonly int _slideIndex; // private readonly string _fileName; // private readonly string _baseFileName; // private readonly string _filePath; /// /// string SC = ".SC {height: " + SlideHeight + "px; width: " + SlideWidth + "px; display: none;}"; /// private dynamic SC { get; set; } /// /// string DC = ".DC1 {top: 0px; left: 0px; height: 100%; width: 100%; opacity: 1; }"; /// private dynamic DC1 { get; set; } /// /// string DC0 = ".DC0 {top: 0px; left: 0px; height: 100%; width: 100%; opacity: 0;}"; /// private dynamic DC0 { get; set; } /// /// 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}; /// private dynamic gv { get; set; } // private readonly StringBuilder _htmlPart; private List htexElements; private readonly PPTSlide _mSlide; private const string JS_DIR_NAME = "temp"; public double SlideWidth { get; set; } public double SlideHeight { get; set; } public HtexController(PPTSlide aSlide, int slideCounter, int slidesNumber) { this._mSlide = aSlide; _numberOfSlides = 1; _allSlidesCount = slidesNumber; _slideIndex = slideCounter; this.htexElements = new List(); } public Slide GenerateHtex() { this.GenerateHeader(); Slide slide= this.GenerateBody(); return slide; } private void GenerateHeader() { int[] numbers = DynamicHeaderJSPart(); AppendHeader(numbers); } private int [] DynamicHeaderJSPart() { if (_numberOfSlides == 1) { return new int[] { 0, 1, 1 } ; } else { int count = 0; List arr = new List(); StringBuilder numbers = new StringBuilder(); numbers.Append("["); while (count <= _numberOfSlides - 1) { arr.Add(count); numbers.Append(count.ToString()); numbers.Append(","); count++; } numbers.Append(count); arr.Add(count); int length = numbers.ToString().Length; string outputString = numbers.ToString().Remove(length - 1, 1); arr.Add(int.Parse(outputString)); //return outputString + "]"; return arr.ToArray(); } } private void AppendHeader(int[] numbers) { SC = new { height =SlideHeight, width =SlideWidth, display="none" }; DC1 = new { top = 0, left = 0, height= "100%", width = "100%", opacity=1 }; DC0 = new { top = 0, left = 0, height = "100%", width = "100%", opacity = 0 }; gv = new { w = 0, h = 0, t= 1, v=0, sh=SlideHeight, sw=SlideWidth, s=0, i= numbers, f=1, r=1 }; } private Slide GenerateBody() { ///当页 动画p:timing presetID代表 动画类型 presetClass是进入,强调,还是退出,还是路径方式 ///tgtEl 子类型 ///inkTgt (墨迹目标) §19.5.47 ///sldTgt (幻灯片目标) §19.5.67 ///sndTgt (声音目标) §19.5.70 ///spTgt (形状目标) §19.5.72 ///p:spTgt spid 绑定的sp ///AppendPlayer int netxPage = _slideIndex >= _allSlidesCount ? _slideIndex : _slideIndex + 1; int prevPage = _slideIndex >= _allSlidesCount ? _slideIndex : _slideIndex - 1; Slide slide= DynamicBodyPart(); if (slide != null) { slide.netxPage = netxPage; slide.prevPage = prevPage; } return slide; } private Slide DynamicBodyPart() { if (_numberOfSlides != 0) { ////foreach (PPTSlide pptSlide in _mSlides) ////{ ///string dirpath = Path.Combine(_filePath, _fileName); HtexSlide htexSlide = new HtexSlide(_mSlide, _mSlide.slideIndex) { ContainerShape = _mSlide.ContainerShape, }; string anima = new JSONGenerator(_mSlide).GetAnimaVariable(); //if (_mSlide.slideIndex == 27) { //} Slide slide = new Slide(); //string jsonStro = anima.Replace(",", ",").Replace("'",""); //object res = JsonHelper.ConvertJsonStr(jsonStro); //string s = res.ToString(); //var m = Regex.Match(s, "\"[0-9]{1,}\""); //while (m.Success) //{ // string testInfo = m.Value; // string newStr = testInfo.Replace("\"", ""); // s = s.Replace(testInfo, newStr); // m = m.NextMatch(); //} //JToken token=JsonHelper. FromJson(s); //slide.animations = token; var Animations = _mSlide.Animations; if (Animations != null) { slide.animations = Animations; } Background background = _mSlide.background; if (background != null) { slide.fill = PPTXHelper.DoBackgroundProperties(background.BackgroundProperties, _mSlide, "master"); }; htexElements.AddRange(htexSlide.DrawElement()); List newGroup = new List(); //处理组合图形在Wpf不能多层嵌套 int len = htexElements.Count; for (int i =0;i newGroup) { if (group != null && group.shapes != null && group.shapes.Count > 0) { newGroup.Add(group); int len = group.shapes.Count; List groups = new List(); for(int i= 0; i < len;i++ ){ if (group.shapes[i] is Group gp) { doGroup(gp, newGroup); groups.Add(group.shapes[i]); } } foreach (var ag in groups) { group.shapes.Remove(ag); } } } } }