You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
webpack-plugin/src/models/page.js

113 lines
2.3 KiB

2 years ago
const path = require('path')
const slugify = require('slugify')
const merge = require('lodash.merge')
const nunjucks = require('nunjucks')
1 year ago
const assign = require('assign-deep')
2 years ago
2 years ago
const parseMarkdownFile = require('./../parsers/markdown.js')
2 years ago
/**
* Page
*
*
* @author Björn Hase <me@herr-hase.wtf>
* @license http://opensource.org/licenses/MIT The MIT License
1 year ago
* @link https://gitea.node001.net/HerrHase/siteomat-webpack-plugin.git
2 years ago
*
*/
class Page {
/**
*
*
* @param {object} file
* @param {string} parent
* @param {string} fileString
* @param {object} [blocks=null]
*
*/
constructor(file, parent, fileString, blocks = {}) {
// parse file
const result = parseMarkdownFile(fileString)
// adding filename for html as pathname and relative path in structure
this.filename = this._resolveFilename(file)
this.pathname = this._resolvePathname(parent)
// fields merge by default values
1 year ago
this.fields = merge({
2 years ago
view: 'page',
meta: {
robots: 'index'
}
}, result.fields)
1 year ago
this.content = result.content
this.blocks = blocks
2 years ago
}
/**
* render view of page
*
*
* @return {string}
*
*/
2 years ago
render(engine, done) {
2 years ago
1 year ago
const page = merge({}, this.fields)
2 years ago
1 year ago
page.content = this.content
page.blocks = this.blocks
2 years ago
page.path = this.pathname + '/' + this.filename
1 year ago
return engine.render(this.fields.view, {
2 years ago
page: page
2 years ago
}, done)
2 years ago
}
/**
2 years ago
* create html-filename = filename
2 years ago
*
* @param {string} file
* @return {string}
*
*/
_resolveFilename(file) {
let filename = file.name
if (filename === 'index.md') {
filename = 'index'
} else {
if (path.extname(filename) === '.md') {
filename = filename.replace('.md', '')
}
filename = slugify(filename)
}
return filename + '.html'
}
/**
2 years ago
* pathname = parent
2 years ago
*
* @param {string} parent
* @return {string}
*
*/
_resolvePathname(parent) {
let pathname = parent
if (parent === '/') {
pathname = ''
}
return pathname
}
}
2 years ago
module.exports =Page