mirror of https://github.com/jlelse/GoBlog
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
903 B
Go
41 lines
903 B
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"sync"
|
|
|
|
"github.com/PuerkitoBio/goquery"
|
|
"go.goblog.app/app/pkgs/htmlbuilder"
|
|
)
|
|
|
|
func (*goBlog) wrapForPlugins(
|
|
originalWriter io.Writer,
|
|
plugins []any,
|
|
pluginRender func(plugin any, doc *goquery.Document),
|
|
) (wrappedHb *htmlbuilder.HtmlBuilder, finish func()) {
|
|
if len(plugins) == 0 {
|
|
// No plugins, nothing to wrap
|
|
if hb, ok := (originalWriter).(*htmlbuilder.HtmlBuilder); ok {
|
|
return hb, func() {}
|
|
}
|
|
return htmlbuilder.NewHtmlBuilder(originalWriter), func() {}
|
|
}
|
|
var wg sync.WaitGroup
|
|
pr, pw := io.Pipe()
|
|
finish = func() {
|
|
_ = pw.Close()
|
|
wg.Wait()
|
|
}
|
|
go func() {
|
|
wg.Add(1)
|
|
defer wg.Done()
|
|
doc, err := goquery.NewDocumentFromReader(pr)
|
|
_ = pr.CloseWithError(err)
|
|
for _, plugin := range plugins {
|
|
pluginRender(plugin, doc)
|
|
}
|
|
_ = goquery.Render(originalWriter, doc.Selection)
|
|
}()
|
|
return htmlbuilder.NewHtmlBuilder(pw), finish
|
|
}
|