代码拉取完成,页面将自动刷新
package main
import (
"path/filepath"
"sync"
)
type macroinput map[string]interface{}
type macrofn func(macroinput) interface{}
type Preprocessor struct {
sync.Mutex
macros map[string]macrofn
ready bool
}
func (p *Preprocessor) Register(name string, fn macrofn) {
p.Lock()
defer p.Unlock()
if !p.ready {
p.macros = make(map[string]macrofn)
p.ready = true
}
p.macros[name] = fn
}
func (p *Preprocessor) Process(tree *JsonTree) *JsonTree {
p.Lock()
defer p.Unlock()
newtree := tree.Copy()
for _, namepath := range p.macroPaths(newtree) {
name := filepath.Base(namepath)
path := filepath.Dir(namepath)
input := macroinput(tree.Get(path).(map[string]interface{}))
newtree.Replace(path, p.macros[name](input))
}
return newtree
}
func (p *Preprocessor) macroPaths(t *JsonTree) []string {
paths := make([]string, 0)
for _, path := range t.Paths() {
for name, _ := range p.macros {
if filepath.Base(path) == name {
paths = append(paths, path)
}
}
}
return paths
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。