Ctrl K
ComunidadGuías…

engine/funcmap.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package engine

import (
	"fmt"
	"html/template"
	"net/http"
	"strings"

	"github.com/sirupsen/logrus"
	"github.com/xyproto/datablock"
)

// Functions for concurrent use by rendering.go and handlers.go

// Lua2funcMap runs in a Lua file and returns the functions as a template.FuncMap (or an error)
func (ac *Config) Lua2funcMap(w http.ResponseWriter, req *http.Request, filename, luafilename, ext string, errChan chan error, funcMapChan chan template.FuncMap) {
	funcs, err := ac.lua2funcMap(w, req, filename, luafilename, ext)
	funcMapChan <- funcs
	errChan <- err
}

func (ac *Config) lua2funcMap(w http.ResponseWriter, req *http.Request, filename, luafilename, ext string) (funcs template.FuncMap, err error) {
	defer func() {
		if r := recover(); r != nil {
			funcs = make(template.FuncMap)
			err = fmt.Errorf("panic while running %s: %v", luafilename, r)
		}
	}()

	// Make functions from the given Lua data available
	funcs = make(template.FuncMap)

	// Try reading data.lua, if possible
	luablock, err := ac.cache.Read(luafilename, ac.shouldCache(ext))
	if err != nil {
		// Could not find and/or read data.lua
		luablock = datablock.EmptyDataBlock

		// This only means the file wasn't cached, so just ignore this error
	}

	// luablock can be empty if there was an error or if the file was empty
	if luablock.HasData() {
		// There was Lua code available. Now make the functions and
		// variables available for the template.
		funcs, err = ac.LuaFunctionMap(w, req, luablock.Bytes(), luafilename)
		if err != nil {
			return funcs, err
		}
		if ac.debugMode && ac.verboseMode {
			var sb strings.Builder
			sb.WriteString("These functions from ")
			sb.WriteString(luafilename)
			sb.WriteString(" are useable for ")
			sb.WriteString(filename)
			sb.WriteString(": ")
			// Create a comma separated list of the available functions
			first := true
			for key := range funcs {
				if first {
					first = false
				} else {
					sb.WriteString(", ")
				}
				sb.WriteString(key)
			}
			// Output the message
			logrus.Info(sb.String())
		}
	}
	return funcs, err
}