CrazyIter_Bin 3 роки тому
батько
коміт
91dfb15137

+ 1 - 1
HTEXLib/HTEXLib.csproj

@@ -9,7 +9,7 @@
     <FileVersion>5.2109.7.1</FileVersion>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />
+    <PackageReference Include="DocumentFormat.OpenXml" Version="2.13.1" />
     <PackageReference Include="HtmlAgilityPack" Version="1.11.28" />
     <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.8" />

+ 117 - 0
HTEXLib/PPTX/Builders/PPTContainerShapeBuilder.cs

@@ -251,5 +251,122 @@ namespace HTEXLib.Builders
             }
             return pptContainerShape;
         }
+
+
+        public PPTContainerShape GetPPTContainerShape(SlideMasterPart slidePart, PPTSlide slide)
+        {
+            var pptContainerShape = new PPTContainerShape();
+            pptContainerShape.Elements = new List<PPTShapeBase>();
+            var ShapeTree = slidePart.SlideMaster.Descendants<DocumentFormat.OpenXml.Presentation.ShapeTree>().FirstOrDefault();
+            if (ShapeTree == null)
+            {
+                return null;
+            }
+            var objs = ShapeTree.ChildElements;
+            foreach (object obj in objs)
+            {
+                PPTShapeBase shape = null;
+                if (typeof(DocumentFormat.OpenXml.Presentation.Shape).Equals(obj.GetType()))
+                {
+                    DocumentFormat.OpenXml.Presentation.Shape pshape = (DocumentFormat.OpenXml.Presentation.Shape)obj;
+                    if (pshape.Parent.LocalName == "Choice" || pshape.Parent.LocalName == "Fallback")
+                    {
+                        continue;
+                    }
+                    //p:sp
+                    PPTShape shapeppt = new PPTShape(slidePart, pshape, slide);
+                    if (shapeppt.IsText)
+                    {
+                        shape = shapeppt;
+                    }
+
+                }
+                else if (typeof(Picture).Equals(obj.GetType()))
+                {
+                    //p:pic
+                    shape = new PPTImage(slidePart, (Picture)obj, slide);
+                }
+                else if (typeof(GraphicFrame).Equals(obj.GetType()))
+                {
+                    //p:graphicFrame  Chart, Diagram, Table
+                    var graphicFrame = new PPTGraphicFrame(slidePart, (GraphicFrame)obj, slide);
+                    var GraphicDataChildren = graphicFrame.element.Graphic.GraphicData.ChildElements;
+
+                    foreach (var clild in GraphicDataChildren)
+                    {
+                        if (clild is DocumentFormat.OpenXml.Drawing.Table Table)
+                        {
+                            shape = new PPTTable(slidePart, graphicFrame, Table, slide);
+                        }
+                        if (clild is DocumentFormat.OpenXml.Drawing.Charts.ChartReference Chart)
+                        {
+                            shape = new PPTChart(slidePart, graphicFrame, Chart, slide);
+                        }
+                        if (clild is DocumentFormat.OpenXml.Drawing.Diagrams.RelationshipIds Diagram)
+                        {
+                            shape = new PPTDiagram(slidePart, graphicFrame, Diagram, slide);
+
+                        }
+                    }
+                }
+                else if (typeof(GroupShape).Equals(obj.GetType()))
+                {
+                    //p:grpSp
+                    shape = new PPTGroupShape(slidePart, (GroupShape)obj, slide);
+                }
+                else if (typeof(ConnectionShape).Equals(obj.GetType()))
+                {
+                    //p:cxnSp
+                    shape = new PPTConnectionShape(slidePart, (ConnectionShape)obj, slide);
+                }
+                else if (typeof(AlternateContent).Equals(obj.GetType()))
+                {
+                    ///Equations and formulas as Image  处理公式 方程等
+                    AlternateContent alternateContent = (AlternateContent)obj;
+                    //  shape=   new PPTAlternateContent(slidePart, (DocumentFormat.OpenXml.AlternateContent)obj, slide);
+                    var AlternateContentChoice = alternateContent.GetFirstChild<AlternateContentChoice>();
+                    var shp = AlternateContentChoice.GetFirstChild<DocumentFormat.OpenXml.Presentation.Shape>();
+                    if (shp != null)
+                    {
+                        var Paragraphs = shp.TextBody.Elements<DocumentFormat.OpenXml.Drawing.Paragraph>();
+                        foreach (var pa in Paragraphs)
+                        {
+                            //  var a = pa.GetFirstChild<DocumentFormat.OpenXml.Office2010.Drawing.TextMath>();
+                            // OfficeMath
+                            ///公式插入 线性 专用,普通文本区别
+                            var oMath = shp.GetPPTXNodeByPath("//p:txBody/a:p/a14:m/m:oMathPara/m:oMath");
+                            if (oMath != null)
+                            {
+                                var element = alternateContent.ChildElements.Where(x => typeof(AlternateContentFallback).Equals(x.GetType())).FirstOrDefault();
+                                AlternateContentFallback alternateContentFallback = null;
+                                if (element != null)
+                                {
+                                    alternateContentFallback = (AlternateContentFallback)element;
+                                }
+                                shape = new PPTMath(slidePart, AlternateContentChoice, alternateContentFallback, slide);
+                            }
+
+                        }
+                    }
+
+                }
+                if (shape != null)
+                {
+                    bool exist = false;
+                    foreach (var elm in pptContainerShape.Elements)
+                    {
+                        if (elm.suid == shape.suid)
+                        {
+                            exist = true;
+                        }
+                    }
+                    if (!exist)
+                    {
+                        pptContainerShape.Elements.Add(shape);
+                    }
+                }
+            }
+            return pptContainerShape;
+        }
     }
 }

+ 4 - 0
HTEXLib/PPTX/Models/PPTX/PPTAlternateContent.cs

@@ -22,6 +22,10 @@ namespace HTEXLib.Models.Inner
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             base.slide = slide;
             this.openXmlPart = openXmlPart;
             element = alternateContent;

+ 9 - 0
HTEXLib/PPTX/Models/PPTX/PPTChart.cs

@@ -26,6 +26,10 @@ namespace HTEXLib.Models.PPTX
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             this.openXmlPart = openXmlPart;
             element = chart;
             this.gfarame = gfarame;
@@ -84,6 +88,11 @@ namespace HTEXLib.Models.PPTX
                     shapeTree =
                          layoutPart.SlideLayout.CommonSlideData.ShapeTree;
                 }
+                else if (openXmlPart is SlideMasterPart slideMasterPart)
+                {
+                    shapeTree =
+                         slideMasterPart.SlideMaster.CommonSlideData.ShapeTree;
+                }
 
 
                 DocumentFormat.OpenXml.Presentation.GraphicFrame layoutShape;

+ 9 - 1
HTEXLib/PPTX/Models/PPTX/PPTConnectionShape.cs

@@ -24,6 +24,10 @@ namespace HTEXLib.Models.Inner
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             this.openXmlPart = openXmlPart;
             element = connectionShape;
             SetConnectionShapeVisualProperties(openXmlPart, connectionShape);
@@ -81,7 +85,11 @@ namespace HTEXLib.Models.Inner
                 {
                     shapeTree = layoutPart.SlideLayout.CommonSlideData.ShapeTree;
                 }
-                
+                else if (openXmlPart is SlideMasterPart masterPart)
+                {
+                    shapeTree = masterPart.SlideMaster.CommonSlideData.ShapeTree;
+                }
+
                 ConnectionShape layoutShape;
                 if (shapeTree != null)
                 {

+ 9 - 1
HTEXLib/PPTX/Models/PPTX/PPTDiagram.cs

@@ -26,6 +26,10 @@ namespace HTEXLib.Models.PPTX
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             this.openXmlPart = openXmlPart;
             element = diagram;
             this.gfarame = gfarame;
@@ -87,7 +91,11 @@ namespace HTEXLib.Models.PPTX
                     shapeTree =
                          layoutPart.SlideLayout.CommonSlideData.ShapeTree;
                 }
-
+                else if (openXmlPart is SlideMasterPart masterPart)
+                {
+                    shapeTree =
+                         masterPart.SlideMaster.CommonSlideData.ShapeTree;
+                }
 
                 DocumentFormat.OpenXml.Presentation.GraphicFrame layoutShape;
                 if (shapeTree != null)

+ 9 - 1
HTEXLib/PPTX/Models/PPTX/PPTGraphicFrame.cs

@@ -21,6 +21,10 @@ namespace HTEXLib.Models.Inner
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             element = gfarame;
             this.openXmlPart = openXmlPart;
             SetGraphicFrameVisualProperties(openXmlPart, gfarame);
@@ -82,9 +86,13 @@ namespace HTEXLib.Models.Inner
                     shapeTree =
                          layoutPart.SlideLayout.CommonSlideData.ShapeTree;
                 }
+                else if (openXmlPart is SlideMasterPart masterPart)
+                {
+                    shapeTree = masterPart.SlideMaster.CommonSlideData.ShapeTree;
+                }
 
 
-                    DocumentFormat.OpenXml.Presentation.GraphicFrame layoutShape;
+                DocumentFormat.OpenXml.Presentation.GraphicFrame layoutShape;
                 if (shapeTree != null)
                 {
                     layoutShape = shapeTree.GetFirstChild<DocumentFormat.OpenXml.Presentation.GraphicFrame>();

+ 8 - 0
HTEXLib/PPTX/Models/PPTX/PPTGroupShape.cs

@@ -26,6 +26,10 @@ namespace HTEXLib.Models.Inner
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             this.openXmlPart = openXmlPart;
             base.slide = slide;
             element = groupShape;
@@ -221,6 +225,10 @@ namespace HTEXLib.Models.Inner
                     shapeTree =
                          layoutPart.SlideLayout.CommonSlideData.ShapeTree;
                 }
+                else if (openXmlPart is SlideMasterPart masterPart)
+                {
+                    shapeTree = masterPart.SlideMaster.CommonSlideData.ShapeTree;
+                }
                 DocumentFormat.OpenXml.Presentation.GroupShape layoutShape;
                 if (shapeTree != null)
                 {

+ 15 - 1
HTEXLib/PPTX/Models/PPTX/PPTImage.cs

@@ -19,6 +19,10 @@ namespace HTEXLib.Models.Inner
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             this.openXmlPart = openXmlPart;
             element = picture;
             GetShapeVisualProperties(openXmlPart, picture);
@@ -57,7 +61,12 @@ namespace HTEXLib.Models.Inner
                     ImagePart imagePart = (ImagePart)layoutPart.GetPartById(rId);
                     FileExtension = imagePart.Uri.OriginalString.Substring(imagePart.Uri.OriginalString.LastIndexOf(".") + 1).ToLower();
                 }
-               
+                else if (openXmlPart is SlideMasterPart masterPart)
+                {
+                    ImagePart imagePart = (ImagePart)masterPart.GetPartById(rId);
+                    FileExtension = imagePart.Uri.OriginalString.Substring(imagePart.Uri.OriginalString.LastIndexOf(".") + 1).ToLower();
+                }
+
             }
             else
             {
@@ -73,6 +82,11 @@ namespace HTEXLib.Models.Inner
                     shapeTree =
                          layoutPart.SlideLayout.CommonSlideData.ShapeTree;
                 }
+                else if (openXmlPart is SlideMasterPart masterPart)
+                {
+                    shapeTree =
+                         masterPart.SlideMaster.CommonSlideData.ShapeTree;
+                }
                 if (shapeTree != null)
                 {
                     var layoutShape = shapeTree.GetFirstChild<Picture>();

+ 4 - 0
HTEXLib/PPTX/Models/PPTX/PPTMath.cs

@@ -23,6 +23,10 @@ namespace HTEXLib.Models.PPTX
             {
                 PartForm = "layout";
             }
+            else if (openXmlPart is SlideMasterPart slideMaster)
+            {
+                PartForm = "master";
+            }
             this.openXmlPart = openXmlPart;
             base.slide = slide;
             this.AlternateContentChoice = AlternateContentChoice;

+ 11 - 2
HTEXLib/PPTX/Models/PPTX/PPTSlide.cs

@@ -31,6 +31,7 @@ namespace HTEXLib.Models
             SlideLayoutPart = openXmlPart.SlideLayoutPart;
             PSlide = openXmlPart.Slide;
             SetShapeNonVisualProperties(openXmlPart);
+            SetSpecificProperties(slideMasterPart);
             SetSpecificProperties(SlideLayoutPart);
             SetSpecificProperties(openXmlPart);
             SetBackground(openXmlPart, slideMasterPart);
@@ -149,8 +150,16 @@ namespace HTEXLib.Models
             if (elms != null) {
                 ContainerShape.Elements.AddRange(elms);
             }
-           
-
+        }
+        private void SetSpecificProperties(SlideMasterPart slideMasterPart)
+        {
+            textStyles = slideMasterPart.SlideMaster.TextStyles;
+            PPTContainerShapeBuilder groupShapeBuilder = new PPTContainerShapeBuilder();
+            var elms = groupShapeBuilder.GetPPTContainerShape(slideMasterPart, this).Elements;
+            if (elms != null)
+            {
+                ContainerShape.Elements.AddRange(elms);
+            }
         }
         private void SetSpecificProperties(SlideLayoutPart slideLayoutPart)
         {

+ 5 - 0
HTEXLib/Translator/PPTX2HTEXTranslator.cs

@@ -12,6 +12,11 @@ namespace HTEXLib.Translator
 {
     public   class PPTX2HTEXTranslator
     {
+        /// <summary>
+        /// pptx¹Ù·½µÄjs²Ù×÷Ïà¹Ø½Ó¿Ú¡£ https://docs.microsoft.com/zh-cn/javascript/api/powerpoint?view=powerpoint-js-preview
+        /// </summary>
+        /// <param name="stream"></param>
+        /// <returns></returns>
         public Htex Translate(Stream stream) {
             PresentationDocument presentation;
             var htexBuilder = new HtexBuilder();

Різницю між файлами не показано, бо вона завелика
+ 18 - 0
HTEXTest/Program.cs


+ 8 - 4
HTEXWeb/Config/LangConfigV3.json

@@ -16,7 +16,8 @@
           "complete": "填空题",
           "subjective": "问答题",
           "connector": "连线题",
-          "correct": "改错题"
+          "correct": "改错题",
+          "draw": "作图题"
         },
         "Answer": "答案",
         "Analysis": "解析",
@@ -42,7 +43,8 @@
           "complete": "填充題",
           "subjective": "問答題",
           "connector": "連線題",
-          "correct": "改錯題"
+          "correct": "改錯題",
+          "draw": "作圖題"
         },
         "Answer": "答案",
         "Analysis": "解析",
@@ -68,7 +70,8 @@
           "complete": "填充題",
           "subjective": "問答題",
           "connector": "連線題",
-          "correct": "改錯題"
+          "correct": "改錯題",
+          "draw": "作圖題"
         },
         "Answer": "答案",
         "Analysis": "解析",
@@ -94,7 +97,8 @@
           "complete": "Blank",
           "subjective": "Essay",
           "connector": "Connector",
-          "correct": "Correct"
+          "correct": "Correct",
+          "draw": "Draw"
         },
         "Answer": "Answer",
         "Analysis": "Explain",