From 8f47cbfb0bee74b2f4975c24e3357d2430bdf140 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Tue, 12 Oct 2021 09:11:47 +0200 Subject: [PATCH] #141 - Merge content creation logic to ArticleHelper --- src/commands/Template.ts | 39 +++-------------------- src/helpers/ArticleHelper.ts | 61 +++++++++++++++++++++++++++++++++--- src/helpers/ContentType.ts | 30 +----------------- 3 files changed, 63 insertions(+), 67 deletions(-) diff --git a/src/commands/Template.ts b/src/commands/Template.ts index 3aaeb59a..cd67a3a9 100644 --- a/src/commands/Template.ts +++ b/src/commands/Template.ts @@ -3,8 +3,6 @@ import * as vscode from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; import { SETTING_TEMPLATES_FOLDER, SETTING_TEMPLATES_PREFIX } from '../constants'; -import { format } from 'date-fns'; -import sanitize from '../helpers/Sanitize'; import { ArticleHelper, Settings } from '../helpers'; import { Article } from '.'; import { Notifications } from '../helpers/Notifications'; @@ -12,8 +10,7 @@ import { CONTEXT } from '../constants'; import { Project } from './Project'; import { Folders } from './Folders'; import { ContentType } from '../helpers/ContentType'; -import { join } from 'path'; -import { existsSync, mkdirSync } from 'fs'; +import { ContentType as IContentType } from '../models'; export class Template { @@ -137,39 +134,13 @@ export class Template { return; } - // Name of the file or folder to create - const sanitizedName = sanitize(titleValue.toLowerCase().replace(/ /g, "-")); - let newFilePath: string | undefined; - const templateData = ArticleHelper.getFrontMatterByPath(template.fsPath); + let contentType: IContentType | undefined; if (templateData && templateData.data && templateData.data.type) { - const type = contentTypes?.find(t => t.name === templateData.data.type); - if (type && type.pageBundle) { - const newFolder = join(folderPath, sanitizedName); - if (existsSync(newFolder)) { - Notifications.error(`A page bundle with the name ${sanitizedName} already exists in ${folderPath}`); - return; - } else { - mkdirSync(newFolder); - newFilePath = join(newFolder, `index.md`); - } - } else { - const fileExt = path.parse(selectedTemplate).ext; - let newFileName = `${sanitizedName}${fileExt}`; - - if (prefix && typeof prefix === "string") { - newFileName = `${format(new Date(), prefix)}-${newFileName}`; - } - - newFilePath = path.join(folderPath, newFileName); - - if (fs.existsSync(newFilePath)) { - Notifications.warning(`File already exists, please remove it before creating a new one with the same title.`); - return; - } - } + contentType = contentTypes?.find(t => t.name === templateData.data.type); } + let newFilePath: string | undefined = ArticleHelper.createContent(contentType, folderPath, titleValue); if (!newFilePath) { return; } @@ -190,7 +161,7 @@ export class Template { fmData.title = titleValue; } if (typeof fmData.slug !== "undefined") { - fmData.slug = sanitizedName; + fmData.slug = ArticleHelper.sanitize(titleValue); } frontMatter = Article.updateDate(frontMatter); diff --git a/src/helpers/ArticleHelper.ts b/src/helpers/ArticleHelper.ts index 63db4cad..d89fd355 100644 --- a/src/helpers/ArticleHelper.ts +++ b/src/helpers/ArticleHelper.ts @@ -1,17 +1,19 @@ import { DEFAULT_CONTENT_TYPE, DEFAULT_CONTENT_TYPE_NAME } from './../constants/ContentType'; -import { ContentType } from './../models/PanelSettings'; import * as vscode from 'vscode'; import * as matter from "gray-matter"; import * as fs from "fs"; -import { DefaultFields, SETTING_COMMA_SEPARATED_FIELDS, SETTING_DATE_FIELD, SETTING_DATE_FORMAT, SETTING_INDENT_ARRAY, SETTING_REMOVE_QUOTES, SETTING_TAXONOMY_CONTENT_TYPES } from '../constants'; +import { DefaultFields, SETTING_COMMA_SEPARATED_FIELDS, SETTING_DATE_FIELD, SETTING_DATE_FORMAT, SETTING_INDENT_ARRAY, SETTING_REMOVE_QUOTES, SETTING_TAXONOMY_CONTENT_TYPES, SETTING_TEMPLATES_PREFIX } from '../constants'; import { DumpOptions } from 'js-yaml'; import { TomlEngine, getFmLanguage, getFormatOpts } from './TomlEngine'; import { Settings } from '.'; -import { parse } from 'date-fns'; +import { format, parse } from 'date-fns'; import { Notifications } from './Notifications'; import { Article } from '../commands'; -import { basename } from 'path'; +import { basename, join } from 'path'; import { EditorHelper } from '@estruyf/vscode'; +import sanitize from '../helpers/Sanitize'; +import { existsSync, mkdirSync } from 'fs'; +import { ContentType } from '../models'; export class ArticleHelper { @@ -164,6 +166,57 @@ export class ArticleHelper { return metadata; } + /** + * Sanitize the value + * @param value + * @returns + */ + public static sanitize(value: string): string { + return sanitize(value.toLowerCase().replace(/ /g, "-")); + } + + /** + * Create the file or folder for the new content + * @param contentType + * @param folderPath + * @param titleValue + * @returns The new file path + */ + public static createContent(contentType: ContentType | undefined, folderPath: string, titleValue: string): string | undefined { + const prefix = Settings.get(SETTING_TEMPLATES_PREFIX); + + // Name of the file or folder to create + const sanitizedName = ArticleHelper.sanitize(titleValue); + let newFilePath: string | undefined; + + // Create a folder with the `index.md` file + if (contentType?.pageBundle) { + const newFolder = join(folderPath, sanitizedName); + if (existsSync(newFolder)) { + Notifications.error(`A page bundle with the name ${sanitizedName} already exists in ${folderPath}`); + return; + } else { + mkdirSync(newFolder); + newFilePath = join(newFolder, `index.md`); + } + } else { + let newFileName = `${sanitizedName}.md`; + + if (prefix && typeof prefix === "string") { + newFileName = `${format(new Date(), prefix)}-${newFileName}`; + } + + newFilePath = join(folderPath, newFileName); + + if (existsSync(newFilePath)) { + Notifications.warning(`Content with the title already exists. Please specify a new title.`); + return; + } + } + + return newFilePath; + } + /** * Parse a markdown file and its front matter * @param fileContents diff --git a/src/helpers/ContentType.ts b/src/helpers/ContentType.ts index 1603d05d..b8bc8e79 100644 --- a/src/helpers/ContentType.ts +++ b/src/helpers/ContentType.ts @@ -4,7 +4,6 @@ import { ContentType as IContentType } from '../models'; import { Uri, workspace, window } from 'vscode'; import { Folders } from "../commands/Folders"; import { Questions } from "./Questions"; -import sanitize from '../helpers/Sanitize'; import { format } from "date-fns"; import { join } from "path"; import { existsSync, mkdirSync, writeFileSync } from "fs"; @@ -58,34 +57,7 @@ export class ContentType { return; } - // Name of the file or folder to create - const sanitizedName = sanitize(titleValue.toLowerCase().replace(/ /g, "-")); - let newFilePath: string | undefined; - - // Create a folder with the `index.md` file - if (contentType.pageBundle) { - const newFolder = join(folderPath, sanitizedName); - if (existsSync(newFolder)) { - Notifications.error(`A page bundle with the name ${sanitizedName} already exists in ${folderPath}`); - return; - } else { - mkdirSync(newFolder); - newFilePath = join(newFolder, `index.md`); - } - } else { - let newFileName = `${sanitizedName}.md`; - - if (prefix && typeof prefix === "string") { - newFileName = `${format(new Date(), prefix)}-${newFileName}`; - } - - newFilePath = join(folderPath, newFileName); - if (existsSync(newFilePath)) { - Notifications.warning(`Content with the title already exists. Please specify a new title.`); - return; - } - } - + let newFilePath: string | undefined = ArticleHelper.createContent(contentType, folderPath, titleValue); if (!newFilePath) { return; }