From 675e71bc7d3e0d884679905e39cc9109ef71f3b9 Mon Sep 17 00:00:00 2001 From: gregorybesson Date: Fri, 7 Oct 2016 23:28:45 +0200 Subject: [PATCH] refactoring: cmsData --- src/cli/Builder.js | 6 +- src/cli/cms/Page.js | 8 +- src/cli/cms/data/file.js | 129 ++++++++++++++ src/cli/cms/data/index.js | 22 +-- src/cli/cms/data/{meta.js => metas.js} | 24 +++ src/cli/cms/data/revision.js | 28 +-- src/cli/cms/data/source.js | 2 +- src/cli/cms/operations/create.js | 10 +- src/cli/cms/operations/duplicate.js | 5 +- src/cli/cms/operations/index.js | 10 +- src/cli/cms/operations/post.js | 16 +- src/cli/cms/operations/remove.js | 54 ++++++ src/cli/cms/operations/save.js | 29 +-- src/cli/cms/templates/assets.js | 39 ++++- src/cli/cms/templates/template.js | 10 +- src/cli/core/manager/Manager.js | 7 +- src/cli/core/utils/file-parser.js | 233 ------------------------- src/cli/core/utils/object.json | 13 ++ src/cli/index.js | 4 +- src/cli/process/publish-all.js | 3 +- src/server/app.js | 6 +- src/server/controllers/editor.js | 6 +- src/server/helpers/page.js | 6 +- src/server/routes/get-delete.js | 6 +- src/server/routes/get-main.js | 10 +- 25 files changed, 344 insertions(+), 342 deletions(-) create mode 100644 src/cli/cms/data/file.js rename src/cli/cms/data/{meta.js => metas.js} (58%) create mode 100644 src/cli/cms/operations/remove.js create mode 100644 src/cli/core/utils/object.json diff --git a/src/cli/Builder.js b/src/cli/Builder.js index d4d1f970..f01f5161 100755 --- a/src/cli/Builder.js +++ b/src/cli/Builder.js @@ -7,7 +7,7 @@ import { FileParser, config, fileAttr, - cmsTemplate, + cmsTemplates, Page } from './' @@ -28,7 +28,7 @@ class Builder { .replace('.' + config.files.templates.extension, '.json') var json = fse.readJsonSync(file.path) - var text = cmsTemplate.template.getTemplate(json.abe_meta.template) + var text = cmsTemplates.template.getTemplate(json.abe_meta.template) cmsData.source.getDataList(path.dirname(json.abe_meta.link), text, json) .then(() => { @@ -42,7 +42,7 @@ class Builder { } else if(file.path.indexOf('.json') > -1){ var json = fse.readJsonSync(file.path) - var text = cmsTemplate.template.getTemplate(json.abe_meta.template) + var text = cmsTemplates.template.getTemplate(json.abe_meta.template) cmsData.source.getDataList(path.dirname(json.abe_meta.link), text, json) .then(() => { diff --git a/src/cli/cms/Page.js b/src/cli/cms/Page.js index 2b4b88d0..2ddb0937 100644 --- a/src/cli/cms/Page.js +++ b/src/cli/cms/Page.js @@ -6,7 +6,7 @@ import { cmsEditor, abeEngine, cmsData, - cmsTemplate, + cmsTemplates, config, Hooks, Manager @@ -117,7 +117,7 @@ export default class Page { var matches = this.template.match(eachSource) if(typeof matches !== 'undefined' && matches !== null) { Array.prototype.forEach.call(matches, (match) => { - this.template = this.template.replace(match, `${match}`) + this.template = this.template.replace(match, `${match}`) }) } } @@ -139,7 +139,7 @@ export default class Page { } // I compile the text - var compiledTemplate = Handlebars.compile((!this._onlyHTML) ? cmsTemplate.insertDebugtoolUtilities(this.template) : this.template) + var compiledTemplate = Handlebars.compile((!this._onlyHTML) ? cmsTemplates.insertDebugtoolUtilities(this.template) : this.template) // I create the html page ! yeah !!! this.html = compiledTemplate(json, {data: {intl: config.intlData}}) @@ -210,7 +210,7 @@ export default class Page { var textEachWithIndex = block.replace(/(<(?![\/])[A-Za-z0-9!-]*)/g, '$1 data-abe-block="' + key + '{{@index}}"') // je remplace le block dans le texte par ça - this.template = this.template.replace(block, textEachWithIndex + ``) + this.template = this.template.replace(block, textEachWithIndex + ``) } // Pour chaque tag Abe, je mets en forme ce tag avec des data- supplémentaires diff --git a/src/cli/cms/data/file.js b/src/cli/cms/data/file.js new file mode 100644 index 00000000..90ee0b30 --- /dev/null +++ b/src/cli/cms/data/file.js @@ -0,0 +1,129 @@ +import path from 'path' +import fse from 'fs-extra' + +import { + Hooks, + FileParser, + cmsData, + config +} from '../../' + +export function getAllWithKeys(withKeys) { + var files = FileParser.getFiles(path.join(config.root, config.data.url), true, 99, /\.json/) + var filesArr = [] + + var i = 0 + + files.forEach(function (file) { + var cleanFile = file + var json = cmsData.file.get(file.path) + + if(typeof json.abe_meta.latest !== 'undefined' && json.abe_meta.latest !== null + && typeof json.abe_meta.latest !== 'undefined' && json.abe_meta.latest !== null + && typeof json.abe_meta.latest.date !== 'undefined' && json.abe_meta.latest.date !== null) { + file.date = json.abe_meta.latest.date + } + + if(typeof json.abe_meta !== 'undefined' && json.abe_meta !== null) { + var date = null + if (typeof json.abe_meta.latest !== 'undefined' && json.abe_meta.latest !== null + && typeof json.abe_meta.latest.date !== 'undefined' && json.abe_meta.latest.date !== null) { + date = json.abe_meta.latest.date + }else if (typeof json.abe_meta.date !== 'undefined' && json.abe_meta.date !== null) { + date = json.abe_meta.date + } + cleanFile.abe_meta = { + date: date + , type: (typeof json.abe_meta.type !== 'undefined' && json.abe_meta.type !== null) ? json.abe_meta.type : null + , link: (typeof json.abe_meta.link !== 'undefined' && json.abe_meta.link !== null) ? json.abe_meta.link : null + , template: (typeof json.abe_meta.template !== 'undefined' && json.abe_meta.template !== null) ? json.abe_meta.template : null + , status: (typeof json.abe_meta.status !== 'undefined' && json.abe_meta.status !== null) ? json.abe_meta.status : null + , cleanName: (typeof json.abe_meta.cleanName !== 'undefined' && json.abe_meta.cleanName !== null) ? json.abe_meta.cleanName : null + , cleanFilename: (typeof json.abe_meta.cleanFilename !== 'undefined' && json.abe_meta.cleanFilename !== null) ? json.abe_meta.cleanFilename : null + } + } + Array.prototype.forEach.call(withKeys, (key) => { + var keyFirst = key.split('.')[0] + cleanFile[keyFirst] = json[keyFirst] + }) + filesArr.push(cleanFile) + }) + + var merged = cmsData.revision.getFilesMerged(filesArr) + + Hooks.instance.trigger('afterGetAllFiles', merged) + return merged +} + +export function get(pathJson) { + var json = {} + pathJson = Hooks.instance.trigger('beforeGetJson', pathJson) + + try { + var stat = fse.statSync(pathJson) + if (stat) { + json = fse.readJsonSync(pathJson) + } + }catch(e) { + } + + json = Hooks.instance.trigger('afterGetJson', json) + return json +} + +export function fromUrl(url) { + var res = { + root: '', + draft: { + dir: '', + file: '', + path: '' + }, + publish: { + dir: '', + file: '', + link: '', + path: '', + json: '' + }, + json: { + path: '', + file: '' + } + } + + if(typeof url !== 'undefined' && url !== null) { + + var dir = path.dirname(url).replace(config.root, '') + var filename = path.basename(url) + var link = url.replace(config.root, '') + link = link.replace(/^\//, '').split('/') + link.shift() + link = cmsData.fileAttr.delete('/' + link.join('/').replace(/\/$/, '')) + + let draft = config.draft.url + let publish = config.publish.url + let data = config.data.url + + res.root = config.root + + // set dir path draft/json + res.draft.dir = FileParser.changePathEnv(path.join(config.root, dir), draft) + res.json.dir = FileParser.changePathEnv(path.join(config.root, dir), data) + res.publish.dir = FileParser.changePathEnv(path.join(config.root, dir), publish) + res.publish.json = res.json.dir + + // set filename draft/json + res.draft.file = filename + res.publish.file = cmsData.fileAttr.delete(filename) + res.publish.link = link + res.json.file = filename.replace(`.${config.files.templates.extension}`, '.json') + res.publish.json = path.join(res.json.dir, cmsData.fileAttr.delete(res.json.file)) + + // set filename draft/json + res.draft.path = path.join(res.draft.dir, res.draft.file) + res.publish.path = path.join(res.publish.dir, res.publish.file) + res.json.path = path.join(res.json.dir, res.json.file) + } + return res +} \ No newline at end of file diff --git a/src/cli/cms/data/index.js b/src/cli/cms/data/index.js index 4c503f40..a499aec3 100644 --- a/src/cli/cms/data/index.js +++ b/src/cli/cms/data/index.js @@ -6,16 +6,18 @@ import * as regex from './regex' import * as sql from './sql' import * as source from './source' import * as revision from './revision' -import * as meta from './meta' +import * as metas from './metas' +import * as file from './file' export { - values - ,attributes - ,attr - ,fileAttr - ,sql - ,source - ,revision - ,regex - ,meta + values, + attributes, + attr, + fileAttr, + sql, + source, + revision, + regex, + metas, + file } \ No newline at end of file diff --git a/src/cli/cms/data/meta.js b/src/cli/cms/data/metas.js similarity index 58% rename from src/cli/cms/data/meta.js rename to src/cli/cms/data/metas.js index 6ae5265b..f938ce4b 100644 --- a/src/cli/cms/data/meta.js +++ b/src/cli/cms/data/metas.js @@ -25,4 +25,28 @@ export function add(tpl, json, type, obj = {}, date = null, realType = 'draft') json[meta][type].latest = JSON.parse(JSON.stringify(obj)) json[meta][type].latest.date = currentDate json[meta][type].latest.abeUrl = abeUrl +} + +export function get(arr) { + var res = [] + Array.prototype.forEach.call(arr, (file) => { + let meta = config.meta.name + + var jsonPath = cmsData.file.fromUrl(file.path).json.path + var json = cmsData.file.get(jsonPath) + if(typeof json[meta] === 'undefined' || json[meta] === null) json[meta] = {} + file['template'] = json[meta].template + if(typeof json[meta].latest !== 'undefined' && json[meta].latest !== null) { + file['date'] = json[meta].latest.date + } + if(typeof json[meta].complete === 'undefined' || json[meta].complete === null) { + json[meta].complete = 0 + } + if(typeof json[meta] !== 'undefined' && json[meta] !== null) { + file[config.meta.name] = json[meta] + } + res.push(file) + }) + + return res } \ No newline at end of file diff --git a/src/cli/cms/data/revision.js b/src/cli/cms/data/revision.js index 9674d05c..24fb3e96 100644 --- a/src/cli/cms/data/revision.js +++ b/src/cli/cms/data/revision.js @@ -12,14 +12,14 @@ import { export function getFilesRevision(urls, fileName) { var res = [] var number = 1 - var tplUrl = FileParser.getFileDataFromUrl(fileName) + var tplUrl = cmsData.file.fromUrl(fileName) fileName = fileName.split('/') fileName = fileName[fileName.length - 1] var publishDate = new Date() var json = null if(coreUtils.file.exist(tplUrl.publish.json)) { - json = FileParser.getJson(tplUrl.publish.json) + json = cmsData.file.get(tplUrl.publish.json) if(typeof json !== 'undefined' && json !== null && typeof json[config.meta.name] !== 'undefined' && json[config.meta.name] !== null) { publishDate = new Date(json[config.meta.name].latest.date) @@ -47,9 +47,9 @@ export function getFilesRevision(urls, fileName) { urlObj.version = number number = number + 1 - var tplUrlObj = FileParser.getFileDataFromUrl(urlObj.path) + var tplUrlObj = cmsData.file.fromUrl(urlObj.path) if(coreUtils.file.exist(tplUrlObj.publish.json)) { - var jsonObj = FileParser.getJson(tplUrlObj.publish.json) + var jsonObj = cmsData.file.get(tplUrlObj.publish.json) urlObj[config.meta.name] = jsonObj[config.meta.name] } res.push(urlObj) @@ -212,24 +212,4 @@ export function getFilesMerged(files) { }) return arMerged -} - -export function deleteOlderRevisionByType(fileName, type) { - var folder = fileName.split('/') - var file = folder.pop() - var extension = file.replace(/.*?\./, '') - folder = folder.join('/') - var stat = fse.statSync(folder) - if(stat){ - var files = FileParser.getFiles(folder, true, 1, new RegExp('\\.' + extension)) - files.forEach(function (fileItem) { - var fname = cmsData.fileAttr.delete(fileItem.cleanPath) - var ftype = cmsData.fileAttr.get(fileItem.cleanPath).s - if(fname === file && ftype === type){ - var fileDraft = fileItem.path.replace(/-abe-./, '-abe-d') - FileParser.removeFile(fileItem.path, FileParser.changePathEnv(fileItem.path, config.data.url).replace(new RegExp('\\.' + extension), '.json')) - FileParser.removeFile(fileDraft, FileParser.changePathEnv(fileDraft, config.data.url).replace(new RegExp('\\.' + extension), '.json')) - } - }) - } } \ No newline at end of file diff --git a/src/cli/cms/data/source.js b/src/cli/cms/data/source.js index 4836e545..ba58bbaf 100644 --- a/src/cli/cms/data/source.js +++ b/src/cli/cms/data/source.js @@ -141,7 +141,7 @@ export function urlList(obj, tplPath, match, jsonPage) { export function fileList(obj, tplPath, match, jsonPage) { var p = new Promise((resolve) => { - jsonPage['abe_source'][obj.key] = FileParser.getJson(path.join(config.root, obj.sourceString)) + jsonPage['abe_source'][obj.key] = cmsData.file.get(path.join(config.root, obj.sourceString)) resolve() }) diff --git a/src/cli/cms/operations/create.js b/src/cli/cms/operations/create.js index 48e7fa10..9f199caa 100644 --- a/src/cli/cms/operations/create.js +++ b/src/cli/cms/operations/create.js @@ -2,7 +2,7 @@ import path from 'path' import { FileParser, coreUtils, - cmsTemplate, + cmsTemplates, cmsOperations, config, Hooks, @@ -20,12 +20,12 @@ var create = function(template, pathCreate, name, req, forceJson = {}, duplicate filePath = path.join(config.root, config.draft.url, filePath.replace(config.root)) if(templatePath !== null && filePath !== null) { - var tplUrl = FileParser.getFileDataFromUrl(filePath) + var tplUrl = cmsData.file.fromUrl(filePath) if(!coreUtils.file.exist(tplUrl.json.path)) { var json = (forceJson) ? forceJson : {} var tpl = templatePath - var text = cmsTemplate.template.getTemplate(tpl) + var text = cmsTemplates.template.getTemplate(tpl) if (duplicate) { json = cmsData.values.removeDuplicate(text, json) } @@ -40,14 +40,14 @@ var create = function(template, pathCreate, name, req, forceJson = {}, duplicate .then((resSave) => { Manager.instance.updateList() filePath = resSave.htmlPath - tplUrl = FileParser.getFileDataFromUrl(filePath) + tplUrl = cmsData.file.fromUrl(filePath) resolve(resSave.json) }).catch(function(e) { reject() console.error(e) }) }else { - json = FileParser.getJson(tplUrl.json.path) + json = cmsData.file.get(tplUrl.json.path) resolve(json, tplUrl.json.path) } }else { diff --git a/src/cli/cms/operations/duplicate.js b/src/cli/cms/operations/duplicate.js index 7c9ee21a..70254691 100644 --- a/src/cli/cms/operations/duplicate.js +++ b/src/cli/cms/operations/duplicate.js @@ -3,6 +3,7 @@ import { FileParser, Manager, config, + cmsData, cmsOperations } from '../../' @@ -28,7 +29,7 @@ var duplicate = function(oldFilePath, template, newPath, name, req, isUpdate = f if(typeof revisions !== 'undefined' && revisions !== null && typeof revisions[0] !== 'undefined' && revisions[0] !== null) { - json = FileParser.getJson(revisions[0].path) + json = cmsData.file.get(revisions[0].path) } } @@ -37,7 +38,7 @@ var duplicate = function(oldFilePath, template, newPath, name, req, isUpdate = f if (isUpdate) { Hooks.instance.trigger('beforeUpdate', json, oldFilePath, template, newPath, name, req, isUpdate) - FileParser.deleteFile(oldFilePath) + cmsOperations.remove.remove(oldFilePath) } Hooks.instance.trigger('afterDuplicate', json, oldFilePath, template, newPath, name, req, isUpdate) diff --git a/src/cli/cms/operations/index.js b/src/cli/cms/operations/index.js index c670833b..888a1b85 100644 --- a/src/cli/cms/operations/index.js +++ b/src/cli/cms/operations/index.js @@ -2,10 +2,12 @@ import create from './create' import duplicate from './duplicate' import * as save from './save' import * as post from './post' +import * as remove from './remove' export { - create - ,duplicate - ,save - ,post + create, + duplicate, + save, + post, + remove } \ No newline at end of file diff --git a/src/cli/cms/operations/post.js b/src/cli/cms/operations/post.js index afc7e746..49a3441c 100644 --- a/src/cli/cms/operations/post.js +++ b/src/cli/cms/operations/post.js @@ -1,18 +1,18 @@ import path from 'path' import { - cmsOperations - ,coreUtils - ,config - ,Manager - ,FileParser + cmsData, + cmsOperations, + coreUtils, + config, + Manager } from '../../' export function unpublish(filePath) { - var tplUrl = FileParser.getFileDataFromUrl(path.join(config.publish.url, filePath)) + var tplUrl = cmsData.file.fromUrl(path.join(config.publish.url, filePath)) if(coreUtils.file.exist(tplUrl.json.path)) { - var json = JSON.parse(JSON.stringify(FileParser.getJson(tplUrl.json.path))) + var json = JSON.parse(JSON.stringify(cmsData.file.get(tplUrl.json.path))) if(typeof json.abe_meta.publish !== 'undefined' && json.abe_meta.publish !== null) { delete json.abe_meta.publish } @@ -27,7 +27,7 @@ export function unpublish(filePath) { 'reject' ) .then((resSave) => { - FileParser.removeFile(tplUrl.publish.path, tplUrl.publish.json) + cmsOperations.remove.removeFile(tplUrl.publish.path, tplUrl.publish.json) Manager.instance.updateList() }) } diff --git a/src/cli/cms/operations/remove.js b/src/cli/cms/operations/remove.js new file mode 100644 index 00000000..01ae503e --- /dev/null +++ b/src/cli/cms/operations/remove.js @@ -0,0 +1,54 @@ +import path from 'path' +import fse from 'fs-extra' + +import { + Hooks, + cmsData, + coreUtils, + cmsOperations, + Manager +} from '../../' + + +export function remove(filePath) { + filePath = coreUtils.slug.clean(filePath) + filePath = Hooks.instance.trigger('beforeDeleteFile', filePath) + + var revisions = cmsData.revision.getVersions(filePath) + + Array.prototype.forEach.call(revisions, (revision) => { + cmsOperations.remove.removeFile(revision.path, revision.htmlPath) + }) + + Manager.instance.updateList() +} + +export function removeFile(file, json) { + if(coreUtils.file.exist(file)) { + fse.removeSync(file) + } + + if(coreUtils.file.exist(json)) { + fse.removeSync(json) + } +} + +export function olderRevisionByType(fileName, type) { + var folder = fileName.split('/') + var file = folder.pop() + var extension = file.replace(/.*?\./, '') + folder = folder.join('/') + var stat = fse.statSync(folder) + if(stat){ + var files = FileParser.getFiles(folder, true, 1, new RegExp('\\.' + extension)) + files.forEach(function (fileItem) { + var fname = cmsData.fileAttr.delete(fileItem.cleanPath) + var ftype = cmsData.fileAttr.get(fileItem.cleanPath).s + if(fname === file && ftype === type){ + var fileDraft = fileItem.path.replace(/-abe-./, '-abe-d') + cmsOperations.remove.removeFile(fileItem.path, FileParser.changePathEnv(fileItem.path, config.data.url).replace(new RegExp('\\.' + extension), '.json')) + cmsOperations.remove.removeFile(fileDraft, FileParser.changePathEnv(fileDraft, config.data.url).replace(new RegExp('\\.' + extension), '.json')) + } + }) + } +} \ No newline at end of file diff --git a/src/cli/cms/operations/save.js b/src/cli/cms/operations/save.js index 121beecd..dd29e5fa 100755 --- a/src/cli/cms/operations/save.js +++ b/src/cli/cms/operations/save.js @@ -6,14 +6,15 @@ import {Promise} from 'es6-promise' import path from 'path' import { - abeProcess - ,FileParser - ,cmsData - ,config - ,Page - ,cmsTemplate - ,Hooks - ,coreUtils + abeProcess, + cmsOperations, + FileParser, + cmsData, + config, + Page, + cmsTemplates, + Hooks, + coreUtils } from '../../' export function checkRequired(text, json) { @@ -62,7 +63,7 @@ export function save(url, tplPath, json = null, text = '', type = '', previousSa realType = 'draft' url = Hooks.instance.trigger('afterReject', url) } - var tplUrl = FileParser.getFileDataFromUrl(url) + var tplUrl = cmsData.file.fromUrl(url) type = type || 'draft' var pathIso = dateIso(tplUrl, type) if(typeof previousSave !== 'undefined' && previousSave !== null){ @@ -78,7 +79,7 @@ export function save(url, tplPath, json = null, text = '', type = '', previousSa var fullTpl = path.join(config.root, config.templates.url, tpl) + '.' + config.files.templates.extension if(typeof json === 'undefined' || json === null) { - json = FileParser.getJson(tplUrl.json.path) + json = cmsData.file.get(tplUrl.json.path) } var ext = { @@ -103,10 +104,10 @@ export function save(url, tplPath, json = null, text = '', type = '', previousSa } } - cmsData.meta.add(tpl, json, type, {}, date, realType) + cmsData.metas.add(tpl, json, type, {}, date, realType) if(typeof text === 'undefined' || text === null || text === '') { - text = cmsTemplate.template.getTemplate(fullTpl) + text = cmsTemplates.template.getTemplate(fullTpl) } cmsData.source.getDataList(path.dirname(tplUrl.publish.link), text, json) @@ -155,7 +156,7 @@ export function save(url, tplPath, json = null, text = '', type = '', previousSa Hooks.instance.trigger('afterSave', obj) - cmsTemplate.assets.copy() + cmsTemplates.assets.copy() if(typeof config.publishAll !== 'undefined' && config.publishAll !== null && config.publishAll === true) { if(!publishAll && type === 'publish') { @@ -215,7 +216,7 @@ export function saveJson(url, json) { export function saveHtml(url, html) { mkdirp.sync(path.dirname(url)) if(cmsData.fileAttr.test(url) && cmsData.fileAttr.get(url).s !== 'd'){ - cmsData.revision.deleteOlderRevisionByType(cmsData.fileAttr.delete(url), cmsData.fileAttr.get(url).s) + cmsOperations.remove.olderRevisionByType(cmsData.fileAttr.delete(url), cmsData.fileAttr.get(url).s) } fse.writeFileSync(url, html) } diff --git a/src/cli/cms/templates/assets.js b/src/cli/cms/templates/assets.js index 91f0fc21..041a3d28 100644 --- a/src/cli/cms/templates/assets.js +++ b/src/cli/cms/templates/assets.js @@ -4,12 +4,13 @@ import mkdirp from 'mkdirp' import path from 'path' import { - FileParser - ,config + cmsTemplates, + FileParser, + config } from '../../' export function copy(pathAssets) { - var publicFolders = FileParser.getAssetsFolder(pathAssets) + var publicFolders = cmsTemplates.assets.getFolder(pathAssets) let publish = config.publish.url var dest = path.join(config.root, publish) try { @@ -53,4 +54,36 @@ export function copy(pathAssets) { }) return publicFolders +} + +export function getFolder(pathAssets = '') { + var folder = path.join(config.root, pathAssets.replace(config.root, '')).replace(/\/$/, '') + var assetsFolders = [] + var flatten = true + + let templates = config.templates.url + let assets = config.files.templates.assets + pathAssets = path.join(folder, templates) + + try { + var directory = fse.lstatSync(pathAssets) + if (directory.isDirectory()) { + var arr = FileParser.read(pathAssets, pathAssets, 'files', flatten, /(.*?)/, 99) + + // now check if file for folder exist + Array.prototype.forEach.call(arr, (file) => { + var folderName = file.path.replace(/\..+$/, '') + assets + try { + var directory = fse.lstatSync(folderName) + if (directory.isDirectory()) { + assetsFolders.push(folderName) + } + } catch (e) { + } + }) + } + } catch (e) { + } + + return assetsFolders } \ No newline at end of file diff --git a/src/cli/cms/templates/template.js b/src/cli/cms/templates/template.js index bb3deddd..db924013 100755 --- a/src/cli/cms/templates/template.js +++ b/src/cli/cms/templates/template.js @@ -2,11 +2,11 @@ import fse from 'fs-extra' import {Promise} from 'es6-promise' import path from 'path' import { - config - ,coreUtils - ,cmsData - ,Hooks - ,FileParser + config, + coreUtils, + cmsData, + Hooks, + FileParser } from '../../' export function findTemplateAndPartialsInFolder (currentPath) { diff --git a/src/cli/core/manager/Manager.js b/src/cli/core/manager/Manager.js index 8fbc8fa5..00f9bfcf 100644 --- a/src/cli/core/manager/Manager.js +++ b/src/cli/core/manager/Manager.js @@ -3,9 +3,10 @@ import fse from 'fs-extra' import mkdirp from 'mkdirp' import path from 'path' import { + cmsData, config, FileParser, - cmsTemplate + cmsTemplates } from '../../' let singleton = Symbol() @@ -43,7 +44,7 @@ class Manager { this._whereKeys = [] var p = new Promise((resolve) => { const pathTemplate = path.join(config.root, config.templates.url) - cmsTemplate.template.getSelectTemplateKeys(pathTemplate) + cmsTemplates.template.getSelectTemplateKeys(pathTemplate) .then((whereKeys) => { this._whereKeys = whereKeys this.updateList() @@ -61,7 +62,7 @@ class Manager { } updateList() { - this._list = FileParser.getAllFilesWithKeys(this._whereKeys) + this._list = cmsData.file.getAllWithKeys(this._whereKeys) this._list.sort(FileParser.predicatBy('date', -1)) console.log('Manager updated') diff --git a/src/cli/core/utils/file-parser.js b/src/cli/core/utils/file-parser.js index e89e4009..41cbb100 100755 --- a/src/cli/core/utils/file-parser.js +++ b/src/cli/core/utils/file-parser.js @@ -138,48 +138,6 @@ export default class FileParser { }) return result } - - static getAssetsFolder(pathAssets = '') { - var folder = path.join(config.root, pathAssets.replace(config.root, '')).replace(/\/$/, '') - var assetsFolders = [] - var flatten = true - - let templates = config.templates.url - let assets = config.files.templates.assets - pathAssets = path.join(folder, templates) - - try { - var directory = fse.lstatSync(pathAssets) - if (directory.isDirectory()) { - var arr = FileParser.read(pathAssets, pathAssets, 'files', flatten, /(.*?)/, 99) - - // now check if file for folder exist - Array.prototype.forEach.call(arr, (file) => { - var folderName = file.path.replace(/\..+$/, '') + assets - try { - var directory = fse.lstatSync(folderName) - if (directory.isDirectory()) { - assetsFolders.push(folderName) - } - } catch (e) { - } - }) - } - } catch (e) { - } - - return assetsFolders - } - - static getAssets() { - var folders = FileParser.getAssetsFolder() - var assets = [] - Array.prototype.forEach.call(folders, (folder) => { - assets = assets.concat(FileParser.read(folder, folder, 'files', true, /(.*?)/, 99)) - }) - - return assets - } static changePathEnv(pathEnv, change) { pathEnv = pathEnv.replace(config.root, '').replace(/^\//, '').split('/') @@ -187,87 +145,6 @@ export default class FileParser { return path.join(config.root, pathEnv.join('/')) } - - static getFileDataFromUrl(url) { - var res = { - root: '', - draft: { - dir: '', - file: '', - path: '' - }, - publish: { - dir: '', - file: '', - link: '', - path: '', - json: '' - }, - json: { - path: '', - file: '' - } - } - - if(typeof url !== 'undefined' && url !== null) { - - var dir = path.dirname(url).replace(config.root, '') - var filename = path.basename(url) - var link = url.replace(config.root, '') - link = link.replace(/^\//, '').split('/') - link.shift() - link = cmsData.fileAttr.delete('/' + link.join('/').replace(/\/$/, '')) - - let draft = config.draft.url - let publish = config.publish.url - let data = config.data.url - - res.root = config.root - - // set dir path draft/json - res.draft.dir = FileParser.changePathEnv(path.join(config.root, dir), draft) - res.json.dir = FileParser.changePathEnv(path.join(config.root, dir), data) - res.publish.dir = FileParser.changePathEnv(path.join(config.root, dir), publish) - res.publish.json = res.json.dir - - // set filename draft/json - res.draft.file = filename - res.publish.file = cmsData.fileAttr.delete(filename) - res.publish.link = link - res.json.file = filename.replace(`.${config.files.templates.extension}`, '.json') - res.publish.json = path.join(res.json.dir, cmsData.fileAttr.delete(res.json.file)) - - // set filename draft/json - res.draft.path = path.join(res.draft.dir, res.draft.file) - res.publish.path = path.join(res.publish.dir, res.publish.file) - res.json.path = path.join(res.json.dir, res.json.file) - } - return res - } - - static getMetas(arr) { - var res = [] - Array.prototype.forEach.call(arr, (file) => { - let meta = config.meta.name - - var jsonPath = FileParser.getFileDataFromUrl(file.path).json.path - var json = FileParser.getJson(jsonPath) - if(typeof json[meta] === 'undefined' || json[meta] === null) json[meta] = {} - file['template'] = json[meta].template - if(typeof json[meta].latest !== 'undefined' && json[meta].latest !== null) { - file['date'] = json[meta].latest.date - } - if(typeof json[meta].complete === 'undefined' || json[meta].complete === null) { - json[meta].complete = 0 - } - if(typeof json[meta] !== 'undefined' && json[meta] !== null) { - file[config.meta.name] = json[meta] - } - res.push(file) - }) - - return res - } /** * This function makes sorting on an array of Json objects possible. @@ -303,114 +180,4 @@ export default class FileParser { return 0 } } - - static getAllFilesWithKeys(withKeys) { - var files = FileParser.getFiles(path.join(config.root, config.data.url), true, 99, /\.json/) - var filesArr = [] - - var i = 0 - - files.forEach(function (file) { - var cleanFile = file - var json = FileParser.getJson(file.path) - - if(typeof json.abe_meta.latest !== 'undefined' && json.abe_meta.latest !== null - && typeof json.abe_meta.latest !== 'undefined' && json.abe_meta.latest !== null - && typeof json.abe_meta.latest.date !== 'undefined' && json.abe_meta.latest.date !== null) { - file.date = json.abe_meta.latest.date - } - - if(typeof json.abe_meta !== 'undefined' && json.abe_meta !== null) { - var date = null - if (typeof json.abe_meta.latest !== 'undefined' && json.abe_meta.latest !== null - && typeof json.abe_meta.latest.date !== 'undefined' && json.abe_meta.latest.date !== null) { - date = json.abe_meta.latest.date - }else if (typeof json.abe_meta.date !== 'undefined' && json.abe_meta.date !== null) { - date = json.abe_meta.date - } - cleanFile.abe_meta = { - date: date - , type: (typeof json.abe_meta.type !== 'undefined' && json.abe_meta.type !== null) ? json.abe_meta.type : null - , link: (typeof json.abe_meta.link !== 'undefined' && json.abe_meta.link !== null) ? json.abe_meta.link : null - , template: (typeof json.abe_meta.template !== 'undefined' && json.abe_meta.template !== null) ? json.abe_meta.template : null - , status: (typeof json.abe_meta.status !== 'undefined' && json.abe_meta.status !== null) ? json.abe_meta.status : null - , cleanName: (typeof json.abe_meta.cleanName !== 'undefined' && json.abe_meta.cleanName !== null) ? json.abe_meta.cleanName : null - , cleanFilename: (typeof json.abe_meta.cleanFilename !== 'undefined' && json.abe_meta.cleanFilename !== null) ? json.abe_meta.cleanFilename : null - } - } - Array.prototype.forEach.call(withKeys, (key) => { - var keyFirst = key.split('.')[0] - cleanFile[keyFirst] = json[keyFirst] - }) - filesArr.push(cleanFile) - }) - - var merged = cmsData.revision.getFilesMerged(filesArr) - - Hooks.instance.trigger('afterGetAllFiles', merged) - return merged - } - - // TODO : change the signature of this method to removeFile(file) - static removeFile(file, json) { - if(coreUtils.file.exist(file)) { - fse.removeSync(file) - } - - if(coreUtils.file.exist(json)) { - fse.removeSync(json) - } - } - - static unpublishFile(filePath) { - var tplUrl = FileParser.getFileDataFromUrl(path.join(config.publish.url, filePath)) - if(coreUtils.file.exist(tplUrl.json.path)) { - var json = JSON.parse(JSON.stringify(FileParser.getJson(tplUrl.json.path))) - if(typeof json.abe_meta.publish !== 'undefined' && json.abe_meta.publish !== null) { - delete json.abe_meta.publish - } - - cmsOperations.save.save( - path.join(config.root, config.draft.url, json.abe_meta.link.replace(config.root)), - json.abe_meta.template, - json, - '', - 'reject', - null, - 'reject' - ) - .then((resSave) => { - FileParser.removeFile(tplUrl.publish.path, tplUrl.publish.json) - Manager.instance.updateList() - }) - } - } - - static deleteFile(filePath) { - filePath = Hooks.instance.trigger('beforeDeleteFile', filePath) - - var revisions = cmsData.revision.getVersions(filePath) - - Array.prototype.forEach.call(revisions, (revision) => { - FileParser.removeFile(revision.path, revision.htmlPath) - }) - - Manager.instance.updateList() - } - - static getJson(pathJson) { - var json = {} - pathJson = Hooks.instance.trigger('beforeGetJson', pathJson) - - try { - var stat = fse.statSync(pathJson) - if (stat) { - json = fse.readJsonSync(pathJson) - } - }catch(e) { - } - - json = Hooks.instance.trigger('afterGetJson', json) - return json - } } \ No newline at end of file diff --git a/src/cli/core/utils/object.json b/src/cli/core/utils/object.json new file mode 100644 index 00000000..66be435d --- /dev/null +++ b/src/cli/core/utils/object.json @@ -0,0 +1,13 @@ + +/** + * sort an array of objects by date attribute + * + * Example : [{date: date}, {date: date}].sort(coreUtils.sort.byDateDesc) + * + * @param {Object} a object with date attribute + * @param {Object} b object with date attribute + * @return {Int} 1 | 0 | -1 + */ +export function getValue(obj, path) { + return path.split('.').reduce((o,i)=>(o[i]===), obj) +} \ No newline at end of file diff --git a/src/cli/index.js b/src/cli/index.js index ee3f392f..b9a86d40 100755 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -49,13 +49,13 @@ import Plugins from './extend/abe-plugins' import * as cmsData from './cms/data' import * as cmsEditor from './cms/editor' import * as cmsOperations from './cms/operations' -import * as cmsTemplate from './cms/templates' +import * as cmsTemplates from './cms/templates' import * as coreUtils from './core/utils' export { cmsData ,cmsOperations - ,cmsTemplate + ,cmsTemplates ,coreUtils ,cmsEditor ,mkdirp diff --git a/src/cli/process/publish-all.js b/src/cli/process/publish-all.js index d868101e..ab7bf544 100644 --- a/src/cli/process/publish-all.js +++ b/src/cli/process/publish-all.js @@ -36,7 +36,7 @@ function publishNext(published, tt, cb, i = 0) { var pub = published.shift() if(typeof pub !== 'undefined' && pub !== null) { - var json = FileParser.getJson(pub.path) + var json = cmsData.file.get(pub.path) if(typeof json.abe_meta !== 'undefined' && json.abe_meta !== null) { i++ @@ -99,6 +99,7 @@ if(typeof pConfig.ABE_WEBSITE !== 'undefined' && pConfig.ABE_WEBSITE !== null) { if(pConfig.ABE_WEBSITE) config.set({root: pConfig.ABE_WEBSITE.replace(/\/$/, '') + '/'}) try { var FileParser = require('../../cli').FileParser + var cmsData = require('../../cli').cmsData var cmsOperations = require('../../cli').cmsOperations var Manager = require('../../cli').Manager diff --git a/src/server/app.js b/src/server/app.js index 5ee69536..2b7617b7 100755 --- a/src/server/app.js +++ b/src/server/app.js @@ -14,7 +14,7 @@ import uuid from 'node-uuid' import { config, coreUtils, - cmsTemplate, + cmsTemplates, FileParser, printInput, abeImport, @@ -84,7 +84,7 @@ var app = express(opts) // Instantiate Singleton Manager (which lists all blog files) Manager.instance.init() app.set('config', config.getConfigByWebsite()) -app.set('projectFiles', cmsTemplate.template.getStructureAndTemplatesFiles()) +app.set('projectFiles', cmsTemplates.template.getStructureAndTemplatesFiles()) app.use(bodyParser.json({limit: '1gb'})) app.use(bodyParser.urlencoded({limit: '1gb', extended: true, parameterLimit: 10000 })) @@ -143,7 +143,7 @@ app.locals.layout = false app.use(middleWebsite) app.use(express.static(__dirname + '/public')) -cmsTemplate.assets.copy() +cmsTemplates.assets.copy() var sites = FileParser.getFolders(config.root.replace(/\/$/, ''), false, 0) diff --git a/src/server/controllers/editor.js b/src/server/controllers/editor.js index 2b69c625..5994fc4c 100755 --- a/src/server/controllers/editor.js +++ b/src/server/controllers/editor.js @@ -6,7 +6,7 @@ import { cmsEditor, coreUtils, abeEngine, - cmsTemplate, + cmsTemplates, FileParser, Hooks } from '../../cli' @@ -225,10 +225,10 @@ export function editor(fileName, jsonPath, documentLink) { json = {} if(coreUtils.file.exist(jsonPath)) { - json = FileParser.getJson(jsonPath, 'utf8') + json = cmsData.file.get(jsonPath, 'utf8') } - text = cmsTemplate.template.getTemplate(fileName) + text = cmsTemplates.template.getTemplate(fileName) cmsData.source.getDataList(path.dirname(documentLink), text, json, true) .then(() => { diff --git a/src/server/helpers/page.js b/src/server/helpers/page.js index 016bbee7..2e370ec7 100644 --- a/src/server/helpers/page.js +++ b/src/server/helpers/page.js @@ -5,7 +5,7 @@ import { FileParser, config, Page, - cmsTemplate, + cmsTemplates, coreUtils } from '../../cli' @@ -41,7 +41,7 @@ var page = function (req, res, next) { } if(typeof json === 'undefined' || json === null) { - json = FileParser.getJson(jsonPath) + json = cmsData.file.get(jsonPath) } let meta = config.meta.name @@ -53,7 +53,7 @@ var page = function (req, res, next) { }else { template = req.params[0] } - var text = cmsTemplate.template.getTemplate(template) + var text = cmsTemplates.template.getTemplate(template) if (!editor) { diff --git a/src/server/routes/get-delete.js b/src/server/routes/get-delete.js index 4674775c..4cd6a5d7 100644 --- a/src/server/routes/get-delete.js +++ b/src/server/routes/get-delete.js @@ -1,15 +1,13 @@ import { - FileParser, Hooks, - coreUtils + cmsOperations } from '../../cli' var route = function(req, res, next){ Hooks.instance.trigger('beforeRoute', req, res, next) if(typeof res._header !== 'undefined' && res._header !== null) return - var filePath = coreUtils.slug.clean(req.query.filePath) - FileParser.deleteFile(filePath) + cmsOperations.remove.remove(req.query.filePath) var result = { success: 1, diff --git a/src/server/routes/get-main.js b/src/server/routes/get-main.js index 7387c0f1..93d0b6e2 100644 --- a/src/server/routes/get-main.js +++ b/src/server/routes/get-main.js @@ -7,7 +7,7 @@ import { config, Page, cmsData, - cmsTemplate, + cmsTemplates, coreUtils, Hooks, Manager @@ -64,15 +64,11 @@ var route = function(req, res, next) { editor(templatePath, jsonPath, linkPath) .then((result) => { var manager = {} - - FileParser.getAssetsFolder() - FileParser.getAssets() - var revisionFilePath = FileParser.changePathEnv(filePath, config.draft.url) var dirPath = path.dirname(revisionFilePath) var allDraft = FileParser.getFiles(dirPath, true, 99, new RegExp('\\.' + config.files.templates.extension)) - allDraft = FileParser.getMetas(allDraft, 'draft') + allDraft = cmsData.metas.get(allDraft, 'draft') var breadcrumb = req.params[0].split('/') manager.file = { revision: cmsData.revision.getFilesRevision(allDraft, cmsData.fileAttr.delete(revisionFilePath)) @@ -129,7 +125,7 @@ var route = function(req, res, next) { var pageHtml = '' if(typeof _json !== 'undefined' && _json !== null && typeof _json.abe_meta !== 'undefined' && _json.abe_meta !== null) { - var text = cmsTemplate.template.getTemplate(_json.abe_meta.template) + var text = cmsTemplates.template.getTemplate(_json.abe_meta.template) var page = new Page(_json.abe_meta.template, text, _json, false) pageHtml = page.html.replace(/"/g, '"').replace(/'/g, '\'').replace(//g, '--ABE>') }