Add binary files support (#503)
هذا الالتزام موجود في:
84
internal/render/render.go
Normal file
84
internal/render/render.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package render
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"sync"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/thomiceli/opengist/internal/git"
|
||||
)
|
||||
|
||||
type RenderedFile interface {
|
||||
getFile() *git.File
|
||||
}
|
||||
|
||||
type NonHighlightedFile struct {
|
||||
*git.File
|
||||
Type string `json:"type"`
|
||||
}
|
||||
|
||||
func (r NonHighlightedFile) getFile() *git.File {
|
||||
return r.File
|
||||
}
|
||||
|
||||
func RenderFiles(files []*git.File) []RenderedFile {
|
||||
const numWorkers = 10
|
||||
jobs := make(chan int, numWorkers)
|
||||
renderedFiles := make([]RenderedFile, len(files))
|
||||
var wg sync.WaitGroup
|
||||
|
||||
worker := func() {
|
||||
for idx := range jobs {
|
||||
renderedFiles[idx] = processFile(files[idx])
|
||||
}
|
||||
wg.Done()
|
||||
}
|
||||
|
||||
for i := 0; i < numWorkers; i++ {
|
||||
wg.Add(1)
|
||||
go worker()
|
||||
}
|
||||
|
||||
for i := range files {
|
||||
jobs <- i
|
||||
}
|
||||
close(jobs)
|
||||
|
||||
wg.Wait()
|
||||
|
||||
return renderedFiles
|
||||
}
|
||||
|
||||
func processFile(file *git.File) RenderedFile {
|
||||
mt := file.MimeType
|
||||
if mt.IsCSV() {
|
||||
rendered, err := renderCsvFile(file)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error parsing CSV file for " + file.Filename)
|
||||
}
|
||||
return rendered
|
||||
} else if mt.IsText() && filepath.Ext(file.Filename) == ".md" {
|
||||
rendered, err := renderMarkdownFile(file)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error rendering markdown file for " + file.Filename)
|
||||
}
|
||||
return rendered
|
||||
} else if mt.IsSVG() {
|
||||
rendered := renderSvgFile(file)
|
||||
return rendered
|
||||
} else if mt.CanBeEmbedded() {
|
||||
rendered := NonHighlightedFile{File: file, Type: mt.RenderType()}
|
||||
file.Content = ""
|
||||
return rendered
|
||||
} else if mt.CanBeRendered() {
|
||||
rendered, err := highlightFile(file)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error rendering gist preview for " + file.Filename)
|
||||
}
|
||||
return rendered
|
||||
} else {
|
||||
rendered := NonHighlightedFile{File: file, Type: mt.RenderType()}
|
||||
file.Content = ""
|
||||
return rendered
|
||||
}
|
||||
}
|
||||
المرجع في مشكلة جديدة
حظر مستخدم