From 3ca657d33f2733615336090fb25c80b86bede4b1 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Wed, 25 Mar 2020 18:55:43 +0100 Subject: [PATCH] #6 - TOML support added --- CHANGELOG.md | 9 +++ README.md | 9 +++ package-lock.json | 105 ++++++++++++++++++----------------- package.json | 16 +++++- src/commands/Settings.ts | 16 +++++- src/constants/settings.ts | 4 +- src/helpers/ArticleHelper.ts | 17 ++++-- src/helpers/TomlEngine.ts | 22 ++++++++ 8 files changed, 139 insertions(+), 59 deletions(-) create mode 100644 src/helpers/TomlEngine.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ea2d3a9..0dbab224 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## [1.1.0] - 2020-03-25 + +- `TOML` support added + +## [1.0.0] - 2020-03-25 + +- First major release +- Fixed an issue with `null` tag/category values + ## [0.0.10] - 2019-09-17 - Updated the logic to remove quotes from front matter property values diff --git a/README.md b/README.md index 51530e8c..c5680a97 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,15 @@ The tags and categories are stored in the project VSCode user settings. You can The extension has more settings which allow you to further configure it to your needs. Here is a list of settings which you can set: +- `frontMatter.taxonomy.frontMatterType` + - Specify which Front Matter language you want to use. The extension supports `YAML` (default) and `TOML`. + +```json +{ + "frontMatter.taxonomy.frontMatterType": "YAML" +} +``` + - `frontMatter.taxonomy.indentArrays` - Specify if arrays in front matter are indented. Default: `true`. If you do not want to indent the array values, you can update it with the following setting change: diff --git a/package-lock.json b/package-lock.json index efbd456c..7e11556c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,11 @@ "js-tokens": "^4.0.0" } }, + "@iarna/toml": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.3.tgz", + "integrity": "sha512-FmuxfCuolpLl0AnQ2NHSzoUKWEJDFl63qXjzdoWBVyFCXzMGm1spBzk7LeHNoVCiWCF7mRVms9e6jEV9+MoPbg==" + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -260,9 +265,9 @@ "dev": true }, "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "agent-base": { @@ -515,9 +520,9 @@ "dev": true }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "bn.js": { @@ -673,9 +678,9 @@ "dev": true }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -761,9 +766,9 @@ } }, "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "chrome-trace-event": { @@ -997,9 +1002,9 @@ } }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "date-fns": { @@ -1434,9 +1439,9 @@ "dev": true }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "fill-range": { @@ -2353,9 +2358,9 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { "agent-base": "^4.3.0", @@ -2682,17 +2687,17 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "lcid": { @@ -3320,12 +3325,12 @@ "dev": true }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } @@ -3757,9 +3762,9 @@ "dev": true }, "serialize-javascript": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.8.0.tgz", - "integrity": "sha512-3tHgtF4OzDmeKYj6V9nSyceRS0UJ3C7VqyD2Yj28vC/z2j6jG5FmFGahOKMD9CrglxTm3tETr87jEypaYV8DUg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", "dev": true }, "set-blocking": { @@ -3962,9 +3967,9 @@ } }, "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4085,9 +4090,9 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "string-width": { @@ -4152,9 +4157,9 @@ "dev": true }, "terser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.2.1.tgz", - "integrity": "sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", "dev": true, "requires": { "commander": "^2.20.0", @@ -4171,16 +4176,16 @@ } }, "terser-webpack-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", - "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -4834,9 +4839,9 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index 648bad2a..ceb17b03 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,18 @@ "type": "array", "default": [], "markdownDescription": "Specify the properties from which quotes need to be removed." + }, + "frontMatter.taxonomy.frontMatterType": { + "type": "string", + "default": "YAML", + "enum": [ + "YAML", + "TOML" + ], + "enumDescriptions": [ + "Specifies you want to use YAML markup for the front matter (default)", + "Specifies you want to use TOML markup for the front matter" + ] } } }, @@ -142,5 +154,7 @@ "webpack": "^4.39.2", "webpack-cli": "^3.3.7" }, - "dependencies": {} + "dependencies": { + "@iarna/toml": "2.2.3" + } } diff --git a/src/commands/Settings.ts b/src/commands/Settings.ts index a0635964..483c532f 100644 --- a/src/commands/Settings.ts +++ b/src/commands/Settings.ts @@ -4,6 +4,7 @@ import * as fs from 'fs'; import { TaxonomyType } from "../models"; import { CONFIG_KEY, SETTING_TAXONOMY_TAGS, SETTING_TAXONOMY_CATEGORIES, EXTENSION_NAME } from '../constants'; import { ArticleHelper, SettingsHelper, FilesHelper } from '../helpers'; +import { FMLanguage, TomlEngine } from '../helpers/TomlEngine'; export class Settings { @@ -98,7 +99,10 @@ export class Settings { const txtData = mdFile.getText(); if (txtData) { try { - const article = matter(txtData); + const article = matter(txtData, { + ...TomlEngine, + language: FMLanguage() + }); if (article && article.data) { const { data } = article; const mdTags = data["tags"]; @@ -214,7 +218,10 @@ export class Settings { const mdFile = fs.readFileSync(file.path, { encoding: "utf8" }); if (mdFile) { try { - const article = matter(mdFile); + const article = matter(mdFile, { + ...TomlEngine, + language: FMLanguage() + }); if (article && article.data) { const { data } = article; let taxonomies: string[] = data[matterProp]; @@ -228,7 +235,10 @@ export class Settings { } data[matterProp] = [...new Set(taxonomies)].sort(); // Update the file - fs.writeFileSync(file.path, matter.stringify(article.content, article.data), { encoding: "utf8" }); + fs.writeFileSync(file.path, matter.stringify(article.content, article.data, { + ...TomlEngine, + language: FMLanguage() + }), { encoding: "utf8" }); } } } diff --git a/src/constants/settings.ts b/src/constants/settings.ts index 6f4a22f2..1f931c70 100644 --- a/src/constants/settings.ts +++ b/src/constants/settings.ts @@ -10,4 +10,6 @@ export const SETTING_SLUG_PREFIX = "taxonomy.slugPrefix"; export const SETTING_SLUG_SUFFIX = "taxonomy.slugSuffix"; export const SETTING_INDENT_ARRAY = "taxonomy.indentArrays"; -export const SETTING_REMOVE_QUOTES = "taxonomy.noPropertyValueQuotes"; \ No newline at end of file +export const SETTING_REMOVE_QUOTES = "taxonomy.noPropertyValueQuotes"; + +export const SETTING_FRONTMATTER_TYPE = "taxonomy.frontMatterType"; \ No newline at end of file diff --git a/src/helpers/ArticleHelper.ts b/src/helpers/ArticleHelper.ts index 379c629d..15852523 100644 --- a/src/helpers/ArticleHelper.ts +++ b/src/helpers/ArticleHelper.ts @@ -2,8 +2,10 @@ import * as vscode from 'vscode'; import * as matter from "gray-matter"; import { stopWords } from '../constants/stopwords-en'; import { charMap } from '../constants/charMap'; -import { CONFIG_KEY, SETTING_INDENT_ARRAY, SETTING_DATE_FORMAT, SETTING_REMOVE_QUOTES } from '../constants'; +import { CONFIG_KEY, SETTING_INDENT_ARRAY, SETTING_DATE_FORMAT, SETTING_REMOVE_QUOTES, SETTING_FRONTMATTER_TYPE } from '../constants'; import { DumpOptions } from 'js-yaml'; +import { TomlEngine, FMLanguage } from './TomlEngine'; + export class ArticleHelper { @@ -12,8 +14,13 @@ export class ArticleHelper { * * @param editor */ - public static getFrontMatter(editor: vscode.TextEditor) { - const article = matter(editor.document.getText()); + public static getFrontMatter(editor: vscode.TextEditor) { + const language = FMLanguage() + let article: matter.GrayMatterFile | null = matter(editor.document.getText(), { + ...TomlEngine, + language + }); + if (article && article.data) { return article; } @@ -30,8 +37,10 @@ export class ArticleHelper { const config = vscode.workspace.getConfiguration(CONFIG_KEY); const indentArray = config.get(SETTING_INDENT_ARRAY) as boolean; const removeQuotes = config.get(SETTING_REMOVE_QUOTES) as string[]; - + let newMarkdown = matter.stringify(article.content, article.data, ({ + ...TomlEngine, + language: FMLanguage(), noArrayIndent: !indentArray } as DumpOptions as any)); diff --git a/src/helpers/TomlEngine.ts b/src/helpers/TomlEngine.ts new file mode 100644 index 00000000..1207d5ad --- /dev/null +++ b/src/helpers/TomlEngine.ts @@ -0,0 +1,22 @@ +import * as vscode from 'vscode'; +import * as toml from '@iarna/toml'; +import { CONFIG_KEY, SETTING_FRONTMATTER_TYPE } from '../constants'; + +export const FMLanguage = () => { + const config = vscode.workspace.getConfiguration(CONFIG_KEY); + const language = config.get(SETTING_FRONTMATTER_TYPE) as string || "YAML"; + return language.toLowerCase(); +}; + +export const TomlEngine = { + engines: { + toml: { + parse: (value: string) => { + return toml.parse(value); + }, + stringify: (value: any) => { + return toml.stringify(value); + } + } + } +}; \ No newline at end of file