diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index 4a6cf64..1cb906b 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -1,18 +1,18 @@ -version: v1.0 -name: Go -agent: - machine: - type: e1-standard-2 - os_image: ubuntu2004 -blocks: - - name: Test - task: - jobs: - - name: go test - commands: - - sem-version go 1.18 - - export GOPATH=~/go - - 'export PATH=/home/semaphore/go/bin:$PATH' - - checkout - - go get ./... - - go test ./... +version: v1.0 +name: Go +agent: + machine: + type: e1-standard-2 + os_image: ubuntu2004 +blocks: + - name: Test + task: + jobs: + - name: go test + commands: + - sem-version go 1.18 + - export GOPATH=~/go + - 'export PATH=/home/semaphore/go/bin:$PATH' + - checkout + - go get ./... + - go test ./... diff --git a/tags_inlineextend.go b/tags_inlineextend.go new file mode 100644 index 0000000..3a68232 --- /dev/null +++ b/tags_inlineextend.go @@ -0,0 +1,72 @@ +package pongo2 + +type tagInlineExtendNode struct { + filename string + blocks map[string]*NodeWrapper + wrapper *NodeWrapper +} + +func (node *tagInlineExtendNode) Execute(ctx *ExecutionContext, writer TemplateWriter) *Error { + parentTpl, err := ctx.template.set.FromFile(node.filename) + if err != nil { + return err.(*Error) + } + + childTpl := &Template{ + blocks: node.blocks, + parent: parentTpl, + set: ctx.template.set, + root: &nodeDocument{Nodes: node.wrapper.nodes}, + } + parentTpl.child = childTpl + + newCtx := NewChildExecutionContext(ctx) + newCtx.template = childTpl + + return parentTpl.root.Execute(newCtx, writer) +} + +func tagInlineExtendParser(doc *Parser, start *Token, arguments *Parser) (INodeTag, *Error) { + node := &tagInlineExtendNode{ + blocks: make(map[string]*NodeWrapper), + } + + filenameToken := arguments.MatchType(TokenString) + if filenameToken == nil { + return nil, arguments.Error("Expected a string as first argument for 'inlineextend' tag.", start) + } + node.filename = doc.template.set.resolveFilename(doc.template, filenameToken.Val) + + if arguments.Remaining() > 0 { + return nil, arguments.Error("Malformed 'inlineextend'-tag arguments.", start) + } + + // hold on to the blocks + tempTemplate := &Template{ + blocks: make(map[string]*NodeWrapper), + set: doc.template.set, + } + + // temporarily replace the parser's template + originalTemplate := doc.template + doc.template = tempTemplate + defer func() { doc.template = originalTemplate }() + + // parse the body of the inlineextend tag + wrapper, endtagargs, err := doc.WrapUntilTag("endinlineextend") + if err != nil { + return nil, err + } + if endtagargs.Remaining() > 0 { + return nil, endtagargs.Error("Arguments not allowed for 'endinlineextend'.", nil) + } + + node.blocks = tempTemplate.blocks + node.wrapper = wrapper + + return node, nil +} + +func init() { + RegisterTag("inlineextend", tagInlineExtendParser) +} diff --git a/template_tests/inheritance/base_inline.tpl b/template_tests/inheritance/base_inline.tpl new file mode 100644 index 0000000..d4085a5 --- /dev/null +++ b/template_tests/inheritance/base_inline.tpl @@ -0,0 +1 @@ +{% block body %}{% endblock %} diff --git a/template_tests/inheritance/modal.tpl b/template_tests/inheritance/modal.tpl new file mode 100644 index 0000000..524e37e --- /dev/null +++ b/template_tests/inheritance/modal.tpl @@ -0,0 +1,5 @@ + diff --git a/template_tests/inlineextend.tpl b/template_tests/inlineextend.tpl new file mode 100644 index 0000000..99002a8 --- /dev/null +++ b/template_tests/inlineextend.tpl @@ -0,0 +1,10 @@ +{% extends "inheritance/base_inline.tpl" %} + +{% block body %} +Hello world!! +{% inlineextend "inheritance/modal.tpl" %} +{% block header %}Modal title{% endblock %} +{% block body %}Lorem ipsum{% endblock %} +{% block footer %}Modal footer{% endblock %} +{% endinlineextend -%} +{% endblock %} diff --git a/template_tests/inlineextend.tpl.out b/template_tests/inlineextend.tpl.out new file mode 100644 index 0000000..6c1e4ff --- /dev/null +++ b/template_tests/inlineextend.tpl.out @@ -0,0 +1,8 @@ + +Hello world!! + +