Security News
Weekly Downloads Now Available in npm Package Search Results
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
twig-layout
Advanced tools
! In Dev dont use this !
twig-layout is a layout system based on twig.
$ npm install twig-layout
This exemple use express and express-twig-layout
install express and express-twig-layout
$ npm install --save express
$ npm install --save express-twig-layout
Create a simple express app with two route: /home and /test
const express = require('express')
const layout = require('express-twig-layout')
const app = express()
//set the views directory
app.set('view', './views')
app.use(layout({
extendFilter: {},
extendFunction:{}
}))
//home route
app.get('/home', async (req, res) => {
//load the layout from the file home.html
await req.layout.loadTemplate('home.html')
//send the layout html
const html = await req.layout.render()
res.send(html)
})
//test route
app.get('/test', function (req, res) {
//load the layout from the file test.html
await req.layout.loadTemplate('test.html')
//Set the title of the block head
req.layout.getBlock('head').data.title = 'Test page'
//send the layout html
const html = await req.layout.render()
res.send(html)
})
app.get('*', function (req, res) {
res.redirect('/home')
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
The template for the page For the template syntax read the twig js documentation
<template>
<!doctype html>
<html lang="en">
<!-- block head -->
{{ getBlockHtml('head') }}
<body>
<header>
<nav>
<ul>
<li>
<a href="/home">Home</a>
</li>
<li>
<a href="/test">Test</a>
</li>
</ul>
</nav>
</header>
<main role="main">
<h1>{{ this.getSomething() }}</h1>
<!-- block content -->
{{ getBlockHtml('content') }}
<!-- /block content -->
</main>
<footer>
<p>footer</p>
</footer>
</body>
</html>
</template>
<script>
//Require the block dependency
const Block = require('node-twig-layout/block')
//Block for the page
class Default extends Block {
async init () {
//set the name of the block
//the name of the block can be define in this way or for other block it can be defined in the config
this.name = 'page'
//Head block
this.addBlock({name: 'head', template: 'page/head.html'})
//content block it just a block container
//to use block with no html temple use type
this.addBlock({name: 'content', script: 'twig-layout/scripts/container'})
}
/**
* A method called in the template
*/
async getSomething() {
return 'something';
}
/**
* before render callback
*/
async beforeRender () {
//Add a css file
this.layout.getBlock('head').addCss('https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css', -10)
}
}
module.exports = Default
</script>
template for the head block define in the file views/page/default.html
<template>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>{{title}}</title>
{% for file in css %}
<link rel="stylesheet" href="{{file}}">
{% endfor %}
{% for file in js %}
<script src="{{file}}"></script>
{% endfor %}
</head>
</template>
<script>
//requite the block object
const Block = require('node-twig-layout/block')
//A Test class for the test page
class Head extends Block {
/**
* Init method
*/
async init() {
//unsorted array
this._css = []
this._js = []
//data array for render
this.data.css = []
this.data.js = []
}
//add css files
async addCss (cssFiles, weight = 0) {
if (Array.isArray(cssFiles)) {
for (let key in cssFiles) {
this._css.push({weight: weight, file: cssFiles[key]})
}
} else if (typeof cssFiles === 'string') {
this._css.push({weight: weight, file: cssFiles})
} else {
throw Error('Invalid addCss argument')
}
}
//add js files to the data object
async addJs (jsFiles) {
if (Array.isArray(jsFiles)) {
for (let key in jsFiles) {
this._js.push({weight: weight, file: jsFiles[key]})
}
} else if (typeof jsFiles === 'string') {
this._js.push({weight: weight, file: jsFiles})
} else {
throw Error('Invalid addJs argument')
}
}
/**
* Before render callback
*/
async beforeRender() {
const sort = function(a, b) {
return a.weight - b.weight
}
this._css.sort(sort);
for (const key in this._css)
this.data.css.push(this._css[key].file)
this._js.sort(sort);
for (const key in this._js)
this.data.js.push(this._js[key].file)
}
}
module.exports = Head
</script>
The template for the /home route
<template>
<div>
<h1>Home page</h1>
</div>
</template>
<script>
//requite the block object
const Block = require('node-twig-layout/block')
//A Block class for the home page
class Home extends Block {
async init () {
this.page ='page/default.html'
//name of the parent block of this block
//here the block content, it is defined in the file page/default.html
this.parent = 'content'
}
beforeRender() {
this.layout.getBlock('head').data.title = 'Home page'
}
}
module.exports = Home
</script>
The template for the /test route
<template>
<div class="test">
<h1>Test</h1>
</div>
</template>
<script>
//requite the block object
const Block = require('node-twig-layout/block')
//A Test class for the test page
class Test extends Block {
init () {
this.page ='page/default.html'
//name of the parent block of this block
//here the block content, it is defined in the file page/default.html
this.parent= 'content'
}
}
module.exports = Test
</script>
$ node index.js
FAQs
A layout system build on top of twig js
The npm package twig-layout receives a total of 1 weekly downloads. As such, twig-layout popularity was classified as not popular.
We found that twig-layout demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
Security News
A Stanford study reveals 9.5% of engineers contribute almost nothing, costing tech $90B annually, with remote work fueling the rise of "ghost engineers."
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.