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