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 cdb16e97f..783c5dea0 100644
Binary files a/lib/ppt/template.pptx and b/lib/ppt/template.pptx differ