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 }