|
|
@@ -527,6 +527,85 @@ module.exports = function(crowi) {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ /**
|
|
|
+ * find all templates applicable to the new page
|
|
|
+ */
|
|
|
+ pageSchema.statics.findTemplate = function(path) {
|
|
|
+ const Page = this;
|
|
|
+ const templatePath = cutOffLastSlash(path);
|
|
|
+ const pathList = generatePathsOnTree(templatePath, []);
|
|
|
+ const regexpList = pathList.map(path => new RegExp(`^${path}/_{1,2}template$`));
|
|
|
+
|
|
|
+ return Page
|
|
|
+ .find({path: {$in: regexpList}})
|
|
|
+ .populate({path: 'revision', model: 'Revision'})
|
|
|
+ .then(templates => {
|
|
|
+ return fetchTemplate(templates, templatePath);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ const cutOffLastSlash = path => {
|
|
|
+ const lastSlash = path.lastIndexOf('/');
|
|
|
+ return path.substr(0, lastSlash);
|
|
|
+ };
|
|
|
+
|
|
|
+ const generatePathsOnTree = (path, pathList) => {
|
|
|
+ if (path === '') {
|
|
|
+ return pathList;
|
|
|
+ }
|
|
|
+
|
|
|
+ pathList.push(path);
|
|
|
+ const newPath = cutOffLastSlash(path);
|
|
|
+
|
|
|
+ return generatePathsOnTree(newPath, pathList);
|
|
|
+ };
|
|
|
+
|
|
|
+ const assignTemplateByType = (templates, path, type) => {
|
|
|
+ for (let i = 0; i < templates.length; i++) {
|
|
|
+ if (templates[i].path === `${path}/${type}template`) {
|
|
|
+ return templates[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const assignGlobalTemplate = (globalTemplates, path) => {
|
|
|
+ const globalTemplate = assignTemplateByType(globalTemplates, path, '_');
|
|
|
+ if (globalTemplate) {
|
|
|
+ return globalTemplate;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (path === '') {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const newPath = cutOffLastSlash(path);
|
|
|
+ return assignGlobalTemplate(globalTemplates, newPath);
|
|
|
+ };
|
|
|
+
|
|
|
+ const fetchTemplate = (templates, templatePath) => {
|
|
|
+ let templateBody;
|
|
|
+ /**
|
|
|
+ * get local template
|
|
|
+ * __tempate: applicable only to immediate decendants
|
|
|
+ */
|
|
|
+ const localTemplate = assignTemplateByType(templates, templatePath, '__');
|
|
|
+
|
|
|
+ /**
|
|
|
+ * get global templates
|
|
|
+ * _tempate: applicable to all pages under
|
|
|
+ */
|
|
|
+ const globalTemplate = assignGlobalTemplate(templates, templatePath);
|
|
|
+
|
|
|
+ if (localTemplate) {
|
|
|
+ templateBody = localTemplate.revision.body;
|
|
|
+ }
|
|
|
+ else if (globalTemplate) {
|
|
|
+ templateBody = globalTemplate.revision.body;
|
|
|
+ }
|
|
|
+
|
|
|
+ return templateBody;
|
|
|
+ };
|
|
|
+
|
|
|
// find page by path
|
|
|
pageSchema.statics.findPageByPath = function(path) {
|
|
|
if (path == null) {
|