diff --git a/engine.go b/engine.go index 8e1cfe2..e77591d 100644 --- a/engine.go +++ b/engine.go @@ -173,3 +173,11 @@ func (e *Engine) ParseTemplateAndCache(source []byte, path string, line int) (*T func (e *Engine) SetAutoEscapeReplacer(replacer render.Replacer) { e.cfg.SetAutoEscapeReplacer(replacer) } + +// UnregisterTag removes the named tag definition from the engine's configuration. +// After calling UnregisterTag the tag will no longer be recognized by subsequent +// parsing or rendering operations. The call is idempotent — unregistering a tag +// that is not registered is a no-op. +func (e *Engine) UnregisterTag(name string) { + e.cfg.UnregisterTag(name) +} diff --git a/engine_test.go b/engine_test.go index fcb028b..82dc5d2 100644 --- a/engine_test.go +++ b/engine_test.go @@ -9,6 +9,7 @@ import ( "strings" "testing" + "github.com/osteele/liquid/render" "github.com/stretchr/testify/require" ) @@ -183,3 +184,19 @@ func Test_template_store(t *testing.T) { out, _ := engine.ParseAndRenderString(string(template), params) require.Equal(t, "Message Text: filename from: template.liquid.", out) } + +func TestEngine_UnregisterTag(t *testing.T) { + engine := NewEngine() + engine.RegisterTag("echo", func(c render.Context) (string, error) { + return c.TagArgs(), nil + }) + source := `{% echo hello world %}` + + _, err := engine.ParseAndRenderString(source, emptyBindings) + require.NoError(t, err) + + engine.UnregisterTag("echo") + + _, err = engine.ParseAndRenderString(source, emptyBindings) + require.Error(t, err) +} diff --git a/render/tags.go b/render/tags.go index 871e04a..fdba4e1 100644 --- a/render/tags.go +++ b/render/tags.go @@ -18,3 +18,8 @@ func (c *Config) FindTagDefinition(name string) (TagCompiler, bool) { td, ok := c.tags[name] return td, ok } + +// UnregisterTag removes a tag definition. +func (c *Config) UnregisterTag(name string) { + delete(c.tags, name) +}