67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package sync
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/base32"
|
|
"os"
|
|
"path"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"srs.epita.fr/fic-server/libfic"
|
|
|
|
"golang.org/x/crypto/blake2b"
|
|
"gopkg.in/russross/blackfriday.v2"
|
|
)
|
|
|
|
func ProcessMarkdown(i Importer, input string, rootDir string) (output string, err error) {
|
|
// Define the path where save linked files
|
|
hash := blake2b.Sum512([]byte(rootDir))
|
|
absPath := "$FILES$/" + strings.ToLower(base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(hash[:]))
|
|
|
|
// Process md
|
|
output = string(blackfriday.Run(
|
|
[]byte(input),
|
|
blackfriday.WithRenderer(blackfriday.NewHTMLRenderer(
|
|
blackfriday.HTMLRendererParameters{
|
|
AbsolutePrefix: absPath,
|
|
Flags: blackfriday.CommonHTMLFlags,
|
|
},
|
|
)),
|
|
))
|
|
|
|
// Import files
|
|
var re *regexp.Regexp
|
|
re, err = regexp.Compile(strings.Replace(absPath, "$", "\\$", -1) + "/[^\"]+")
|
|
if err != nil {
|
|
return
|
|
}
|
|
files := re.FindAllString(output, -1)
|
|
|
|
for _, filePath := range files {
|
|
iPath := strings.TrimPrefix(filePath, absPath)
|
|
dPath := path.Join(fic.FilesDir, strings.ToLower(base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(hash[:])), iPath)
|
|
|
|
if err = os.MkdirAll(path.Dir(dPath), 0755); err != nil {
|
|
return
|
|
}
|
|
|
|
var fdto *os.File
|
|
if fdto, err = os.Create(dPath); err != nil {
|
|
return
|
|
} else {
|
|
defer fdto.Close()
|
|
writer := bufio.NewWriter(fdto)
|
|
if err = getFile(i, rootDir + iPath, writer); err != nil {
|
|
os.Remove(dPath)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// Trim output
|
|
output = strings.TrimSpace(output)
|
|
|
|
return
|
|
}
|