From f0adecf1dc952f54669b9f3abda5268f78c6be78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Wed, 5 Apr 2023 15:22:12 -0300 Subject: [PATCH] metadata --- d2cli/main.go | 11 ++++++- lib/ppt/pptx.go | 68 ++++++++++++++++++++++++++++++++++++++++ lib/ppt/presentation.go | 28 ++++++++++++++--- lib/ppt/template.pptx | Bin 29492 -> 28298 bytes 4 files changed, 102 insertions(+), 5 deletions(-) diff --git a/d2cli/main.go b/d2cli/main.go index 47e6744f5..9f5f7484f 100644 --- a/d2cli/main.go +++ b/d2cli/main.go @@ -7,6 +7,7 @@ import ( "io" "os" "os/exec" + "os/user" "path/filepath" "strconv" "strings" @@ -359,7 +360,15 @@ func compile(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, rende ms.Log.Success.Printf("successfully compiled %s to %s in %s", ms.HumanPath(inputPath), ms.HumanPath(outputPath), dur) return pdf, true, nil case ".pptx": - p := ppt.NewPresentation() + ext := filepath.Ext(outputPath) + trimmedPath := strings.TrimSuffix(outputPath, ext) + splitPath := strings.Split(trimmedPath, "/") + rootName := splitPath[len(splitPath)-1] + var username string + if user, err := user.Current(); err != nil { + username = user.Username + } + p := ppt.NewPresentation(rootName, rootName, rootName, username, version.Version) err := renderPPTX(ctx, ms, p, plugin, renderOpts, outputPath, page, diagram, nil) if err != nil { return nil, false, err diff --git a/lib/ppt/pptx.go b/lib/ppt/pptx.go index 1de5d589e..34fbe6ab4 100644 --- a/lib/ppt/pptx.go +++ b/lib/ppt/pptx.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "strings" + "time" ) // Office Open XML (OOXML) http://officeopenxml.com/prPresentation.php @@ -124,3 +125,70 @@ func getPresentationXml(slideFileNames []string) string { )) return builder.String() } + +func getCoreXml(title, subject, description, creator string) string { + var builder strings.Builder + + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(fmt.Sprintf(`%s`, title)) + builder.WriteString(fmt.Sprintf(`%s`, subject)) + builder.WriteString(fmt.Sprintf(`%s`, creator)) + builder.WriteString(``) + builder.WriteString(fmt.Sprintf(`%s`, description)) + builder.WriteString(fmt.Sprintf(`%s`, creator)) + builder.WriteString(`1`) + dateTime := time.Now().Format("RFC3339") + builder.WriteString(fmt.Sprintf(`%s`, dateTime)) + builder.WriteString(fmt.Sprintf(`%s`, dateTime)) + builder.WriteString(``) + builder.WriteString(``) + + return builder.String() +} + +func getAppXml(nSlides int, d2version string) string { + var builder strings.Builder + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(`1`) + builder.WriteString(`0`) + builder.WriteString(`D2`) + builder.WriteString(`On-screen Show (4:3)`) + builder.WriteString(`0`) + builder.WriteString(fmt.Sprintf(`%d`, nSlides)) + builder.WriteString(`0`) + builder.WriteString(`0`) + builder.WriteString(`0`) + builder.WriteString(`false`) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(`Theme`) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(`1`) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(`Slide Titles`) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(`0`) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(`Office Theme`) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(``) + builder.WriteString(`false`) + builder.WriteString(`false`) + builder.WriteString(``) + builder.WriteString(`false`) + builder.WriteString(fmt.Sprintf(`%s`, d2version)) + builder.WriteString(``) + return builder.String() +} diff --git a/lib/ppt/presentation.go b/lib/ppt/presentation.go index 5003df26d..81775135c 100644 --- a/lib/ppt/presentation.go +++ b/lib/ppt/presentation.go @@ -11,12 +11,16 @@ import ( // TODO: comments / references / assumptions // TODO: update core files with metadata -// TODO: first slide title -// TODO: steps number title // TODO: links? // TODO: appendix? type Presentation struct { + Title string + Description string + Subject string + Creator string + D2Version string + Slides []*Slide } @@ -29,8 +33,14 @@ type Slide struct { ImageLeft int } -func NewPresentation() *Presentation { - return &Presentation{} +func NewPresentation(title, description, subject, creator, d2Version string) *Presentation { + return &Presentation{ + Title: title, + Description: description, + Subject: subject, + Creator: creator, + D2Version: d2Version, + } } func (p *Presentation) AddSlide(pngContent []byte, boardPath []string) error { @@ -126,5 +136,15 @@ func (p *Presentation) SaveTo(filePath string) error { return err } + err = addFile(zipFile, "docProps/core.xml", getCoreXml(p.Title, p.Subject, p.Description, p.Creator)) + if err != nil { + return err + } + + err = addFile(zipFile, "docProps/app.xml", getAppXml(len(p.Slides), p.D2Version)) + if err != nil { + return err + } + return nil } diff --git a/lib/ppt/template.pptx b/lib/ppt/template.pptx index cdb16e97f7e01114a3c2f95379a99ae98530cd92..783c5dea0ab7157b440e4bd6d37c0c60893bf08e 100644 GIT binary patch delta 678 zcmYk3Ur1A77{+<^UH-hd+qJhU)RKS|euwxYM z^*ds#u}T=lim>yg5=i1_h*EbIx4|3}kaSe_%f$qfkz?|z94@V)4_#`mbka6>+)@_B zmh;E-$*!U8Iz36}xRYr~@Z_RHi(xifxys4SKIQRyyh{rt(~1H2Ci>}*0ly{!^xla6 zaDW{#amcibSPiS}pSjF(L}i8s4u`FFB0Ux6Z z-M45mP0y{mYZL_}H20fLmq(|(w5t(HycLU6US7t+WGnW>2FWAp@41+lE;Q-5)GS~- zrqE?cD^IhVj`B|Hag~j4-6Jv!c*QQ3-z!;3x{uj7Z{Ov?1P7yDB6h$cOBs!zw%zFE*t8G zEVz|Y=!_qqQhvJOM`t=fU;N0YeXQ*?hm&V5_?cFyFbsFbNAHF)mkCfTh_{&$8V$jn e_0jDR=CVQh9>Rz0fVqR~;I{U1T>f0?-~I!kw&AA$ delta 1774 zcmY+Ec~DbV6vkiP1H*3EA%+A<*hE$rR00I61_S~KVU<7#OCkgjw+1RHjOJShr-xGE5YfpAd5E>=*+uJk=l%=C1?)G+6t2)$bTz!}p{e7(Fp zFr5uH34)#`sm7ekJh^6j(;Z%;O_6{_ZF!M4muaouB@D9grb&Cq?WT7nx^96Nm^QQC z?w6hw@VZT-Ui{Q@YwZ=MS4q+hn!5Gy_^R`BrpT2p#$`;~0qyzIF3zGxX3trZ zNTxQE#__ATKZoU82J`)QMDEOMrDZqV>zoLvyzDn)_Y3`WQV;uf)~!CfrG~l;(Xzh17Q7Fj+L#XUztCtE(r<-RTFS?4%e7L`A8r~Tu&JXG8 zcZK?mcTk?X?;qIr^Yrv8pAz=N+KiH^zKnP8FZi5S+oFT#7vn3>q$FOuag{BInKjm{ ziJ3w?Fwy4>29t+XjV}#%P73|Bf^a00A@R2&J%5S_kHi;<&wHY$eR=t3^}8p@n)7G} ze%HfrHHpr?p1{$ylG|C4fg4jRF$crM*KTJ`m{oNPBb*+!&yF@+8#(K4X1{lh$x`j+ z%=XQ$cre3%3eD>+l!fUv{KaxPK^;J9_O?kKtuJ}z){g8l+#ffV%Z=Z>BHS(Rt^xL* z4fl#*L73i(*)4gJ7=&9nb9yqeFj_W|pLW(a^Ci6pvnKsK?>E+U;Dfb|_|}8yx8lzp zqMI4j_Xj)*E&4}3j727Up@RGn6$1!@)F5`%K_EuCAUb6GCKb3<)#g7ttiWJ#oF~i8 zBN&2ozs?P7S4QHO;1reh(5^dU4ok^fdi`j1<3`)^%FIzuRP?qNP=*TI1GMwF4<8A6 zSyiV3=3eAPhpk@VkdM!1h9A9ZR1cyOEzE8)q5KpJda2;NeETEW&8jYid=Y$`RGfSY zPB>&ibZ~Y>b~jTsJk5JL%gre1uvO?uvF=9U#N?L7qwZ~DyT?^WZ*+F}zVyZox!a&w zF$3e7gOLZbw=oC=qu~%@-Qbz^g>OPR5BJf2HfP19o#yxxQ9=K29!gEi+H6{4S?aFj{WccWR*$uVQ4xK}ww?2_M)B?@eTw##+siYnxiv4VQc( zHV&dcdcC%6JH{vCp_uGfV}h05X2l7$ZXKIgh@QGTm9mLMoz0~}^x;Y9?T zWVp$ty>d>!?l7bNRR=|CIksS!frpzl!6$|f{6-T{W9hI&8&t>A5uy$Rt~!{3I1Mzw z#!-+DdJ3HxM@3XjAmEKN0Yh<{V7dt~XQm?=rgDo2TA2Pw30A?j@%~8t3I$7zwLm`0 z6=0Y;NEc4wX|eoK&%o~qRv??@k01oOO9HQDY+){EXONyiLA)#!)%^+n$PP;d*Wmx} z#v>~BwG(8=U|EByL@ZKHQVeUIL`6dF6kH@@oP&aAWnAkbXA(%};J*CG++-~Bc%9<= zwPY%?$z8#GH#Bf&Q;-Hvh5nK4gE|JhIRx;L?SnLLRk(2+D*VnD)N$xAWn0L0tD3F^