11import { randomUUID } from 'crypto' ;
22import PptxGenJS from 'pptxgenjs' ;
3- import fs from 'fs' ;
43import { ISlide } from '../../interfaces/islide' ;
54import Automizer from '../../automizer' ;
6- import { GenerateElements , SupportedPptxGenJSSlide } from '../../types/types' ;
5+ import { GenerateElements } from '../../types/types' ;
76import { IGenerator } from '../../interfaces/igenerator' ;
7+ import { IPptxGenJSSlide } from '../../interfaces/ipptxgenjs-slide' ;
8+ import { vd } from '../general-helper' ;
89
10+ /**
11+ * Using pptxGenJs on an automizer ISlide will create a temporary pptx template
12+ * and auto-import the generated shapes to the right place on the output slides.
13+ */
914export default class GeneratePptxGenJs implements IGenerator {
1015 tmpFile : string ;
1116 slides : ISlide [ ] ;
@@ -16,11 +21,17 @@ export default class GeneratePptxGenJs implements IGenerator {
1621 constructor ( automizer : Automizer , slides : ISlide [ ] ) {
1722 this . automizer = automizer ;
1823 this . slides = slides ;
24+ this . create ( ) ;
1925 }
2026
21- create ( ) : this {
22- this . generator = new PptxGenJS ( ) ;
23- return this ;
27+ create ( ) {
28+ if ( this . automizer . params . pptxGenJs ) {
29+ // Use a customized pptxGenJs instance
30+ this . generator = this . automizer . params . pptxGenJs ;
31+ } else {
32+ // Or the installed version
33+ this . generator = new PptxGenJS ( ) ;
34+ }
2435 }
2536
2637 async generateSlides ( ) : Promise < void > {
@@ -29,7 +40,8 @@ export default class GeneratePptxGenJs implements IGenerator {
2940 const generate = slide . getGeneratedElements ( ) ;
3041 if ( generate . length ) {
3142 this . countSlides ++ ;
32- this . addElements ( generate , this . appendPptxGenSlide ( ) , slide ) ;
43+ await this . generateElements ( generate , this . appendPptxGenSlide ( ) ) ;
44+ this . addElements ( generate , slide ) ;
3345 }
3446 }
3547
@@ -41,72 +53,79 @@ export default class GeneratePptxGenJs implements IGenerator {
4153 }
4254 }
4355
44- addElements (
56+ async generateElements (
4557 generate : GenerateElements [ ] ,
4658 pgenSlide : PptxGenJS . Slide ,
47- slide : ISlide ,
48- ) {
49- generate . forEach ( ( generateElement ) => {
59+ ) : Promise < void > {
60+ for ( const generateElement of generate ) {
5061 generateElement . tmpSlideNumber = this . countSlides ;
51-
5262 const addedObjects = < string [ ] > [ ] ;
53-
54- generateElement . callback (
55- this . supportedSlideItems ( pgenSlide , generateElement , addedObjects ) ,
63+ await generateElement . callback (
64+ this . addSlideItems ( pgenSlide , generateElement , addedObjects ) ,
5665 this . generator ,
5766 ) ;
67+ generateElement . addedObjects = [ ...addedObjects ] ;
68+ }
69+ }
5870
59- addedObjects . forEach ( ( addedObjectName ) => {
71+ addElements ( generate : GenerateElements [ ] , slide : ISlide ) {
72+ generate . forEach ( ( generateElement ) => {
73+ generateElement . addedObjects . forEach ( ( addedObjectName ) => {
6074 slide . addElement ( this . tmpFile , this . countSlides , addedObjectName ) ;
6175 } ) ;
6276 } ) ;
6377 }
6478
65- supportedSlideItems = (
79+ /**
80+ * This is a wrapper around supported pptxGenJS slide item types.
81+ * It is required to create a unique objectName and find the generated
82+ * shapes by object name later.
83+ *
84+ * @param pgenSlide
85+ * @param generateElement
86+ * @param addedObjects
87+ */
88+ addSlideItems = (
6689 pgenSlide : PptxGenJS . Slide ,
6790 generateElement : GenerateElements ,
6891 addedObjects : string [ ] ,
69- ) : SupportedPptxGenJSSlide => {
92+ ) : IPptxGenJSSlide => {
93+ const getObjectName = ( ) => {
94+ return this . generateObjectName ( generateElement , addedObjects ) ;
95+ } ;
7096 return {
7197 addChart : ( type , data , options ) => {
72- const objectName = this . generateObjectName (
73- generateElement ,
74- addedObjects ,
98+ pgenSlide . addChart (
99+ type ,
100+ data ,
101+ this . getOptions ( options , getObjectName ( ) ) ,
75102 ) ;
76- pgenSlide . addChart ( type , data , this . getOptions ( options , objectName ) ) ;
77103 } ,
78104 addImage : ( options ) => {
79- const objectName = this . generateObjectName (
80- generateElement ,
81- addedObjects ,
82- ) ;
83- pgenSlide . addImage ( this . getOptions ( options , objectName ) ) ;
105+ pgenSlide . addImage ( this . getOptions ( options , getObjectName ( ) ) ) ;
84106 } ,
85107 addShape : ( shapeName , options ?) => {
86- const objectName = this . generateObjectName (
87- generateElement ,
88- addedObjects ,
108+ pgenSlide . addShape (
109+ shapeName ,
110+ this . getOptions ( options , getObjectName ( ) ) ,
89111 ) ;
90- pgenSlide . addShape ( shapeName , this . getOptions ( options , objectName ) ) ;
91112 } ,
92113 addTable : ( tableRows , options ?) => {
93- const objectName = this . generateObjectName (
94- generateElement ,
95- addedObjects ,
114+ pgenSlide . addTable (
115+ tableRows ,
116+ this . getOptions ( options , getObjectName ( ) ) ,
96117 ) ;
97- pgenSlide . addTable ( tableRows , this . getOptions ( options , objectName ) ) ;
98118 } ,
99119 addText : ( text , options ?) => {
100- const objectName = this . generateObjectName (
101- generateElement ,
102- addedObjects ,
103- ) ;
104- pgenSlide . addText ( text , this . getOptions ( options , objectName ) ) ;
120+ pgenSlide . addText ( text , this . getOptions ( options , getObjectName ( ) ) ) ;
105121 } ,
106122 } ;
107123 } ;
108124
109- generateObjectName ( generateElement , addedObjects : string [ ] ) : string {
125+ generateObjectName (
126+ generateElement : GenerateElements ,
127+ addedObjects : string [ ] ,
128+ ) : string {
110129 const objectName =
111130 ( generateElement . objectName ? generateElement . objectName + '-' : '' ) +
112131 randomUUID ( ) ;
0 commit comments