bb-drummer /
node-patternlibrary
| 1 | 1 | var fs = require('fs'); |
|
| 2 | 1 | var path = require('path'); |
|
| 3 | 1 | var fm = require('front-matter'); |
|
| 4 | 1 | var resolvePath = require('./util/module-or-process-path'); |
|
| 5 | |||
| 6 | class Patternlibrary { |
||
| 7 | |||
| 8 | 92 | constructor (opts) { |
|
| 9 | |||
| 10 | 92 | this.options = {}; |
|
| 11 | 92 | this.adapters = {}; |
|
| 12 | 92 | this.handlebars = null; |
|
| 13 | 92 | this.markdown = null; |
|
| 14 | 92 | this.template = null; |
|
| 15 | 92 | this._layoutTemplate = null; |
|
| 16 | 92 | this.time = null; |
|
| 17 | |||
| 18 | 92 | this.searchOptions = { |
|
| 19 | extra : [], |
||
| 20 | sort : [], |
||
| 21 | pageTypes : {} |
||
| 22 | }; |
||
| 23 | |||
| 24 | 92 | this.reset(); |
|
| 25 | 92 | this.init(opts); |
|
| 26 | } |
||
| 27 | |||
| 28 | /** |
||
| 29 | * resets/clears all (pattern) data |
||
| 30 | */ |
||
| 31 | reset () { |
||
| 32 | 113 | this.data = { |
|
| 33 | patterns : {}, |
||
| 34 | categories: {} |
||
| 35 | }; |
||
| 36 | 113 | return (this); |
|
| 37 | } |
||
| 38 | |||
| 39 | /** |
||
| 40 | * Retrieves (handlebars) layout template |
||
| 41 | * |
||
| 42 | * if no layout is set yet, returns the default layout template |
||
| 43 | * |
||
| 44 | * @var layoutname |
||
| 45 | * @returns {string} |
||
| 46 | */ |
||
| 47 | get layoutname () { |
||
| 48 | 28 | return this._layoutName; |
|
| 49 | } |
||
| 50 | |||
| 51 | /** |
||
| 52 | * Retrieves (handlebars) layout template |
||
| 53 | * |
||
| 54 | * if no layout is set yet, returns the default layout template |
||
| 55 | * |
||
| 56 | * @var {function} layout - a precompiled (handlebars) template |
||
| 57 | * @returns {string} |
||
| 58 | */ |
||
| 59 | get layout () { |
||
| 60 | 35 | if (!this._layoutTemplate) { |
|
| 61 | 1 | this.layout = this.options.gui.layout; |
|
| 62 | } |
||
| 63 | 35 | return this._layoutTemplate; |
|
| 64 | } |
||
| 65 | |||
| 66 | /** |
||
| 67 | * Sets and compiles (handlebars) layout by the file basename of the layoutfile |
||
| 68 | * |
||
| 69 | * if no name is given an 'empty' layout ('{{> body}}') is set |
||
| 70 | * |
||
| 71 | * @function layout |
||
| 72 | * @param {string} layoutname - the file basename of the layoutfile |
||
| 73 | */ |
||
| 74 | set layout ( layoutname ) { |
||
| 75 | 80 | var layoutSource = '{{> body}}'; |
|
| 76 | 80 | this._layoutName = 'none'; |
|
| 77 | 80 | if ( (typeof layoutname != 'undefined') && (layoutname != '') && (layoutname != 'none') && (layoutname != false) ) { |
|
|
0 ignored issues
–
show
Best Practice
introduced
by
Loading history...
|
|||
| 78 | 71 | var layoutfile = path.join(this.options.layouts, layoutname+'.html'); |
|
| 79 | 71 | var layoutgui = resolvePath(path.join(this.options.gui.layouts, layoutname+'.html')); |
|
| 80 | |||
| 81 | 71 | try { |
|
| 82 | 71 | if (fs.existsSync(layoutgui) && !fs.existsSync(layoutfile)) { |
|
| 83 | // gui layout |
||
| 84 | 43 | layoutfile = layoutgui; |
|
| 85 | } |
||
| 86 | 71 | layoutSource = fs.readFileSync(layoutfile).toString(); |
|
| 87 | 70 | this._layoutName = layoutname; |
|
| 88 | } catch (e) { |
||
| 89 | 1 | this.log.warn('Error loading Patternlibrary layoutfile "'+layoutname+'"'); |
|
| 90 | 1 | throw new Error(e.message); |
|
| 91 | } |
||
| 92 | } |
||
| 93 | 79 | this._layoutTemplate = this.handlebars.compile(layoutSource, {noEscape: true}); |
|
| 94 | } |
||
| 95 | |||
| 96 | /** |
||
| 97 | * Retrieves (handlebars) page template |
||
| 98 | * |
||
| 99 | * if no page template is set yet, returns the default |
||
| 100 | * gui doc-page templateto be used in a series of similar |
||
| 101 | * pages with iterating data |
||
| 102 | * |
||
| 103 | * it retrieves a compiled Handlebars template and |
||
| 104 | * returns the rendred page content when invoked |
||
| 105 | * ``` |
||
| 106 | * var rendered = P.pagetemplate(pagevars); |
||
| 107 | * ``` |
||
| 108 | * |
||
| 109 | * @function pagetemplate |
||
| 110 | * @param {object} data - template data |
||
| 111 | * @returns {string} |
||
| 112 | */ |
||
| 113 | get pagetemplate () { |
||
| 114 | 39 | if (!this._pageTemplate) { |
|
| 115 | 1 | this.pagetemplate = this.options.gui.docpage; |
|
| 116 | } |
||
| 117 | 39 | return this._pageTemplate; |
|
| 118 | } |
||
| 119 | |||
| 120 | /** |
||
| 121 | * Sets and compiles (handlebars) page by page filename |
||
| 122 | * for a *Patternlibrary* page template to be used in a |
||
| 123 | * series of similar pages with iterating data |
||
| 124 | * |
||
| 125 | * if `page` is a '.md' or '.markdown' file, it is also |
||
| 126 | * passed through the markdown renderer |
||
| 127 | * |
||
| 128 | * the content is compiled into a Handlebars template and |
||
| 129 | * retrieves the rendred page content when invoked |
||
| 130 | * ``` |
||
| 131 | * var rendered = P.pagetemplate(pagevars); |
||
| 132 | * ``` |
||
| 133 | * |
||
| 134 | * if the parameter does not correspond to a readable file |
||
| 135 | * the parameter's string value is assigned as page template |
||
| 136 | * |
||
| 137 | * look-up order: |
||
| 138 | * - project's doc pages dir (pages src dir + basepath) |
||
| 139 | * - project's `gui` pages dir |
||
| 140 | * - module's `gui` pages dir |
||
| 141 | * - file path |
||
| 142 | * |
||
| 143 | * @param {string} page - the file basename of the page-file |
||
| 144 | * @var {function} pagetemplate - a precompiled (handlebars) template |
||
| 145 | */ |
||
| 146 | set pagetemplate ( page ) { |
||
| 147 | |||
| 148 | //markdown = isMD(pageSource); |
||
| 149 | |||
| 150 | 72 | var pageSource = page; |
|
| 151 | 72 | var markdown = isMD(pageSource); |
|
| 152 | 72 | if ( (typeof page != 'undefined') && (page != '') && (page != 'none') && (page != false) ) { |
|
|
0 ignored issues
–
show
|
|||
| 153 | 72 | var pagefile = path.join(this.options.root, this.options.basepath, page); |
|
| 154 | 72 | var guipage = resolvePath(path.join(this.options.gui.pages, this.options.basepath, page)); |
|
| 155 | |||
| 156 | 72 | if ( !fs.existsSync(pagefile) ) { |
|
| 157 | 71 | if ( fs.existsSync(guipage) ) { |
|
| 158 | // file from gui pages |
||
| 159 | 43 | pageSource = fs.readFileSync(guipage).toString(); |
|
| 160 | } else { |
||
| 161 | 28 | if ( fs.existsSync(pageSource) ) { |
|
| 162 | // file from `pageSource` as a file-path by it self |
||
| 163 | 27 | pageSource = fs.readFileSync(pageSource).toString(); |
|
| 164 | } |
||
| 165 | } |
||
| 166 | } else { |
||
| 167 | // file from pages |
||
| 168 | 1 | pageSource = fs.readFileSync(pagefile).toString(); |
|
| 169 | } |
||
| 170 | } |
||
| 171 | // strip yml data in the beginning |
||
| 172 | 72 | pageSource = fm(pageSource).body; |
|
| 173 | |||
| 174 | // finally compile Markdown content, if we have a markdown file here... |
||
| 175 | 72 | if (markdown) { |
|
| 176 | |||
| 177 | 1 | this.log.info('Rendering Markdown content...'); |
|
| 178 | // interestingly, just rendering with MarkdownIt seems to do too much escaping |
||
| 179 | // and renders some special characters useless for to be interpreted by |
||
| 180 | // Handlebars, like `{{> ...`, so we wrap it with Handlebars and let its |
||
| 181 | // MarkdownIt helper there do it... |
||
| 182 | 1 | pageSource = '{{#markdown}}'+pageSource+'{{/markdown}}'; |
|
| 183 | |||
| 184 | } |
||
| 185 | |||
| 186 | 72 | this._pageTemplate = this.handlebars.compile(pageSource, {noEscape: true}); |
|
| 187 | } |
||
| 188 | |||
| 189 | } |
||
| 190 | |||
| 191 | 1 | Patternlibrary.prototype.init = require('./patternlibrary/init'); |
|
| 192 | 1 | Patternlibrary.prototype.config = require('./patternlibrary/config'); |
|
| 193 | |||
| 194 | 1 | Patternlibrary.prototype.loaddata = require('./patternlibrary/load-data'); |
|
| 195 | 1 | Patternlibrary.prototype.loadhelpers = require('./patternlibrary/load-helpers'); |
|
| 196 | |||
| 197 | |||
| 198 | 1 | Patternlibrary.prototype.run = require('./patternlibrary/run'); |
|
| 199 | 1 | Patternlibrary.prototype.parsepatterns = require('./patternlibrary/parse-patterns'); |
|
| 200 | 1 | Patternlibrary.prototype.parsecategories = require('./patternlibrary/parse-categories'); |
|
| 201 | 1 | Patternlibrary.prototype.parsedocs = require('./patternlibrary/parse-docs'); |
|
| 202 | |||
| 203 | 1 | Patternlibrary.prototype.buildpages = require('./patternlibrary/build-pages'); |
|
| 204 | 1 | Patternlibrary.prototype.buildgui = require('./patternlibrary/build-gui'); |
|
| 205 | 1 | Patternlibrary.prototype.builddocs = require('./patternlibrary/build-docs'); |
|
| 206 | 1 | Patternlibrary.prototype.adapter = require('./patternlibrary/adapter'); |
|
| 207 | |||
| 208 | 1 | Patternlibrary.prototype.renderdata = require('./patternlibrary/render-data'); |
|
| 209 | 1 | Patternlibrary.prototype.renderdocs = require('./patternlibrary/render-docs'); |
|
| 210 | 1 | Patternlibrary.prototype.renderpattern = require('./patternlibrary/render-pattern'); |
|
| 211 | 1 | Patternlibrary.prototype.renderpage = require('./patternlibrary/render-page'); |
|
| 212 | |||
| 213 | 1 | Patternlibrary.prototype.listpatterns = require('./patternlibrary/list-patterns'); |
|
| 214 | 1 | Patternlibrary.prototype.listcategories = require('./patternlibrary/list-categories'); |
|
| 215 | 1 | Patternlibrary.prototype.statistics = require('./patternlibrary/statistics'); |
|
| 216 | |||
| 217 | 1 | Patternlibrary.prototype.searchconfig = require('./patternlibrary/search-config'); |
|
| 218 | 1 | Patternlibrary.prototype.buildsearch = require('./patternlibrary/build-search'); |
|
| 219 | 1 | Patternlibrary.prototype.updatedatafiles = require('./patternlibrary/update-datafiles'); |
|
| 220 | |||
| 221 | 1 | module.exports = Patternlibrary; |
|
| 222 | |||
| 223 | |||
| 224 | function isMD ( str ) { |
||
| 225 | return ( (path.extname( str ) == '.md') || (path.extname( str ) == '.markdown') ); |
||
| 226 | } |