60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package backend
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"regexp"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
func ConvertToMarkdown(c *Config, filename string) ([]byte, error) {
|
|
var stderr bytes.Buffer
|
|
|
|
articleID := uuid.New()
|
|
articleFileName := fmt.Sprint("/tmp/", articleID, ".md")
|
|
|
|
tmpDir, err := os.MkdirTemp("/tmp", "cpolis_images")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error creating temporary directory: %v", err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
cmd := exec.Command("pandoc", "-s", "-f", "docx", "-t", "commonmark_x", "-o", articleFileName, "--extract-media", tmpDir, filename) // TODO: Is writing to a file necessary?
|
|
cmd.Stderr = &stderr
|
|
if err = cmd.Run(); err != nil {
|
|
return nil, fmt.Errorf("error converting docx to markdown: %v: %v", err, stderr.String())
|
|
}
|
|
defer os.Remove(articleFileName)
|
|
|
|
articleContent, err := os.ReadFile(articleFileName)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error reading markdown file: %v", err)
|
|
}
|
|
|
|
imageNames, err := filepath.Glob(filepath.Join(tmpDir, "/media/*"))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error getting docx images from temporary directory: %v", err)
|
|
}
|
|
|
|
for _, name := range imageNames {
|
|
image, err := os.Open(name)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error opening image file %v: %v", name, err)
|
|
}
|
|
defer image.Close()
|
|
|
|
newImageName, err := SaveImage(image, c.MaxImgHeight, c.MaxImgWidth, c.PicsDir)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error saving image %v: %v", name, err)
|
|
}
|
|
|
|
articleContent = regexp.MustCompile(name).ReplaceAll(articleContent, []byte(c.PicsDir+"/"+newImageName))
|
|
}
|
|
|
|
return articleContent, nil
|
|
}
|