Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions .semaphore/semaphore.yml
Original file line number Diff line number Diff line change
@@ -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 ./...
72 changes: 72 additions & 0 deletions tags_inlineextend.go
Original file line number Diff line number Diff line change
@@ -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)
}
1 change: 1 addition & 0 deletions template_tests/inheritance/base_inline.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<html><body>{% block body %}{% endblock %}</body></html>
5 changes: 5 additions & 0 deletions template_tests/inheritance/modal.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<section class="modal">
<header>{% block header %}Default header{% endblock %}</header>
<article>{% block body %}Default body{% endblock %}</article>
<footer>{% block footer %}Default footer{% endblock %}</footer>
</section>
10 changes: 10 additions & 0 deletions template_tests/inlineextend.tpl
Original file line number Diff line number Diff line change
@@ -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 %}
8 changes: 8 additions & 0 deletions template_tests/inlineextend.tpl.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<html><body>
Hello world!!
<section class="modal">
<header>Modal title</header>
<article>Lorem ipsum</article>
<footer>Modal footer</footer>
</section>
</body></html>