using now defaultContext to extend eta templates, adding etaHelper

develop
HerrHase 2 years ago
parent 37671d9040
commit 0720e3c583

@ -1,11 +1,12 @@
{% layout('layout') %}
{{# layout('layout') }}
{{# const posts = await it.injectStore('post') }}
{{# const store = await it.injectStore('post') }}
{{# const posts = await store.find() }}
{{# if posts.data.length > 0 }}
{{# if (posts.data && posts.data.length > 0) { }}
{{# posts.data.forEach((post) => { }}
{{ post.title }}
{{ marked.parse(page.data.content) }}
{{! it.marked.parse(post.teaser_content) }}
{{# }) }}
{{# } else { }}

@ -4,7 +4,7 @@
<div class="grid">
<div class="col-12">
<div class="content">
{{! it.parseMarkdown(it.page.data.content) }}
{{! it.marked.parse(it.page.data.content) }}
</div>
</div>
</div>

@ -17,14 +17,26 @@ const server = fastify()
import * as Eta from 'eta'
import view from '@fastify/view'
import { asset, templateClass, isHome, injectStore } from './helpers/eta.js'
import { marked } from 'marked'
server.register(view, {
engine: {
eta: Eta
},
root: path.join(path.resolve(), '/../frontend/views'),
extname: '.eta',
// adding function to templates
defaultContext: {
asset: asset,
templateClass: templateClass,
isHome: isHome,
injectStore: injectStore,
marked: marked
},
options: {
tags: [ '{{', '}}' ],
includeViewExtension: true,
@ -46,24 +58,12 @@ server.register(view, {
import SettingsStore from './stores/settings.js'
import templateClass from './eta/templateClass.js'
import isHome from './eta/isHome.js'
import injectStore from './eta/injectStore.js'
import parseMarkdown from './eta/parseMarkdown.js'
// getting options from directus add to all views
server.addHook('preHandler', async function (request, response) {
const settingsStore = new SettingsStore()
const settings = await settingsStore.find()
response.locals = {
settings: settings,
templateClass: templateClass,
isHome: isHome,
injectStore: injectStore,
parseMarkdown: parseMarkdown
}
response.locals.settings = settings
})
// check url for paged

@ -1,14 +0,0 @@
import slugify from 'slugify'
/**
*
*
*
*/
export default async function injectStore(name) {
const StoreClass = await import('./../stores/' + name + '.js')
const store = new StoreClass.default()
return await store.find()
}

@ -1,18 +0,0 @@
import slugify from 'slugify'
/**
*
*
*
*/
export default function isHome(entity) {
let result = false
if (entity.data && entity.data.permalink && entity.data.permalink === "/") {
result = true
}
return result
}

@ -1,18 +0,0 @@
import { marked } from 'marked'
/**
*
*
*
*/
export default function parseMarkdown(value) {
let result = ''
if (value) {
result = marked.parse(value)
}
return result
}

@ -1,15 +0,0 @@
import slugify from 'slugify'
/**
*
*
*
*/
export default function templateClass(entity, prefix = 'page') {
if (entity.data && entity.data.template) {
prefix += '-' + entity.data.template
}
return prefix
}

@ -0,0 +1,101 @@
import slugify from 'slugify'
import { marked } from 'marked'
import * as fs from 'fs'
/**
* etaHelpers
*
* collection for helpers to extend eta
*
*
*/
/**
* asset -
*
* @param {String} path
* @param {String} [prefix='/public']
*
*/
function asset(path, prefix = '/public')
{
// getting basePath
const basePath = path
// path to mix-manifest
file = basePath + 'mix-manifest.json';
if (!fs.existsSync(file)) {
//const manifest = file_get_contents($file);
//const files = json_decode(manifest, true);
//if (files[prefix + path]) {
// path = str_replace(prefix, '', files[prefix + path]);
//}
}
return path
}
/**
* templateClass - parse template name to css-classname,
* use prefix, default is "page"
*
* @param {Object} entity
* @param {String} [prefix='page']
* @return {String}
*
*/
function templateClass(entity, prefix = 'page') {
if (entity.data && entity.data.template) {
prefix += '-' + entity.data.template
}
return prefix
}
/**
* isHome - check if entity is home,
* checks for permalink
*
* @param {Object} entity
* @return {Boolean}
*
*/
function isHome(entity) {
let result = false
if (entity.data && entity.data.permalink && entity.data.permalink === "/") {
result = true
}
return result
}
/**
* injectStore
*
*
* @param {String} name
* @return {Object}
*
*/
async function injectStore(name) {
const path = './../stores/' + name + '.js'
// if file
//if (!fs.existsSync(path)) {
//throw new Error(name + ' not exists!')
//}
const StoreClass = await import(path)
const store = new StoreClass.default()
return store
}
export { asset, templateClass, isHome, injectStore }

@ -32,6 +32,7 @@ class PageStore extends DirectusAbstractStore {
'title',
'status',
'permalink',
'template',
'meta',
'content'
],

Loading…
Cancel
Save