From 1ee36112a4147210f4af0a83ac063766245f8e1e Mon Sep 17 00:00:00 2001 From: Diomede Date: Sun, 23 May 2021 22:14:13 +0200 Subject: [PATCH 01/13] restructure folders and start using date-fns for parsing dates --- package.json | 1 + rollup.config.js | 6 ++-- main.ts => src/main.ts | 21 +++++++++++++- settings.ts => src/settings.ts | 1 - .../suggest}/codemirror-suggest.ts | 0 {suggest => src/suggest}/suggest.ts | 0 {suggest => src/suggest}/template-suggest.ts | 21 +++++++++----- utils.ts => src/utils.ts | 28 +++++++++++++++++++ 8 files changed, 66 insertions(+), 12 deletions(-) rename main.ts => src/main.ts (56%) rename settings.ts => src/settings.ts (98%) rename {suggest => src/suggest}/codemirror-suggest.ts (100%) rename {suggest => src/suggest}/suggest.ts (100%) rename {suggest => src/suggest}/template-suggest.ts (87%) rename utils.ts => src/utils.ts (56%) diff --git a/package.json b/package.json index c8d1123..bc6f16d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "typescript": "^4.2.4" }, "dependencies": { + "date-fns": "^2.21.3", "liquidjs": "^9.25.0", "lodash": "^4.17.21" } diff --git a/rollup.config.js b/rollup.config.js index dd4d041..80651fd 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -4,7 +4,7 @@ import commonjs from '@rollup/plugin-commonjs'; const isProd = (process.env.BUILD === 'production'); -const banner = +const banner = `/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins github repository @@ -12,7 +12,7 @@ if you want to view the source visit the plugins github repository `; export default { - input: 'main.ts', + input: 'src/main.ts', output: { dir: '.', sourcemap: 'inline', @@ -27,4 +27,4 @@ export default { nodeResolve({browser: true}), commonjs(), ] -}; \ No newline at end of file +}; diff --git a/main.ts b/src/main.ts similarity index 56% rename from main.ts rename to src/main.ts index 2dbfada..f909dbd 100644 --- a/main.ts +++ b/src/main.ts @@ -1,3 +1,4 @@ +import { get, isEmpty } from "lodash"; import { Plugin } from "obsidian"; import { LiquidTemplatesSettings, DEFAULT_SETTINGS, LiquidTemplatesSettingsTab } from "./settings"; @@ -40,11 +41,29 @@ export default class LiquidTemplates extends Plugin { }; async loadSettings(): Promise { - this.settings = Object.assign({ ...DEFAULT_SETTINGS }, await this.loadData()); + this.settings = this.settingsWithDefault(await this.loadData()); } async saveSettings(): Promise { + // the templates folder can change this.setupAutosuggest(); await this.saveData(this.settings); } + + settingsWithDefault(savedSettings: LiquidTemplatesSettings): LiquidTemplatesSettings { + // TODO: improve me + return { + templatesFolder: this.getSettingOrDefault(savedSettings, 'templatesFolder'), + excludeFolders: this.getSettingOrDefault(savedSettings, 'excludeFolders'), + dateFormat: this.getSettingOrDefault(savedSettings, 'dateFormat'), + timeFormat: this.getSettingOrDefault(savedSettings, 'timeFormat'), + autocompleteTrigger: this.getSettingOrDefault(savedSettings, 'autocompleteTrigger'), + } + } + + getSettingOrDefault(savedSettings: LiquidTemplatesSettings, settingKey: string, defaultValue?: any): any { + let currentValue = get(savedSettings, settingKey) + if (!isEmpty(currentValue)) return currentValue; + return get(DEFAULT_SETTINGS, settingKey, defaultValue); + } } diff --git a/settings.ts b/src/settings.ts similarity index 98% rename from settings.ts rename to src/settings.ts index 24a641b..46c0c8d 100644 --- a/settings.ts +++ b/src/settings.ts @@ -1,4 +1,3 @@ -import { get, isEmpty } from "lodash"; import { App, PluginSettingTab, Setting } from "obsidian"; import LiquidTemplates from "./main"; diff --git a/suggest/codemirror-suggest.ts b/src/suggest/codemirror-suggest.ts similarity index 100% rename from suggest/codemirror-suggest.ts rename to src/suggest/codemirror-suggest.ts diff --git a/suggest/suggest.ts b/src/suggest/suggest.ts similarity index 100% rename from suggest/suggest.ts rename to src/suggest/suggest.ts diff --git a/suggest/template-suggest.ts b/src/suggest/template-suggest.ts similarity index 87% rename from suggest/template-suggest.ts rename to src/suggest/template-suggest.ts index ff9a0c1..d36a3d9 100644 --- a/suggest/template-suggest.ts +++ b/src/suggest/template-suggest.ts @@ -2,7 +2,8 @@ import { App, TFile } from "obsidian"; import { Liquid } from "liquidjs"; import type PoweredTemplates from "../main"; import CodeMirrorSuggest from "./codemirror-suggest"; -import { getTFilesFromFolder } from "utils"; +import { getTFilesFromFolder, customizeEngine } from "../utils"; +import { format } from "date-fns"; interface ITemplateCompletion { label: string; @@ -21,7 +22,7 @@ export default class TemplateSuggest extends CodeMirrorSuggest { // TODO: implement me @@ -47,7 +48,7 @@ export default class TemplateSuggest extends CodeMirrorSuggest { const head = this.getStartPos(); const anchor = this.cmEditor.getCursor(); + console.log('--- context', await this.generateContext()); if (suggestion.file) { const templateString = await this.app.vault.read(suggestion.file) diff --git a/utils.ts b/src/utils.ts similarity index 56% rename from utils.ts rename to src/utils.ts index b74edd8..c9fdbdb 100644 --- a/utils.ts +++ b/src/utils.ts @@ -1,5 +1,7 @@ import { App, normalizePath, TAbstractFile, TFile, TFolder, Vault } from "obsidian"; import { compact } from 'lodash'; +import { Liquid } from "liquidjs"; +import { format, parse, subDays } from 'date-fns'; const ALLOWED_EXTENSIONS = ['md'] @@ -28,3 +30,29 @@ export function getTFilesFromFolder(app: App, folderName: string, subfoldersToEx return files; } + +function parseDate(stringToParse: string): Date { + if(['now', 'today'].includes(stringToParse)) return new Date; + if(stringToParse === 'yesterday') return subDays(Date.now(), 1); + // try to parse the given string + return new Date(Date.parse(stringToParse)); +} + +export function customizeEngine(engine: Liquid, ): Liquid { + engine.registerFilter('date', (valueToParse, dateFormat) => { + const dateToFormat = (typeof valueToParse === 'number') + ? valueToParse + : parseDate(valueToParse) + try { + return format(dateToFormat, dateFormat) + } catch (e) { + if (e instanceof RangeError) return valueToParse; + } + }); + + engine.registerFilter('days_ago', (daysToSub) => { + return subDays(Date.now(), daysToSub); + }) + + return engine; +} From 16ff73e4f17292dd97426694698ae446b2150d32 Mon Sep 17 00:00:00 2001 From: Diomede Date: Sun, 23 May 2021 22:18:13 +0200 Subject: [PATCH 02/13] add TODO --- src/utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils.ts b/src/utils.ts index c9fdbdb..f5f620a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -32,6 +32,7 @@ export function getTFilesFromFolder(app: App, folderName: string, subfoldersToEx } function parseDate(stringToParse: string): Date { + // TODO: find a way to support i18n if(['now', 'today'].includes(stringToParse)) return new Date; if(stringToParse === 'yesterday') return subDays(Date.now(), 1); // try to parse the given string From 780af071c0c7a2063f381540e4b201848ba9f3db Mon Sep 17 00:00:00 2001 From: Diomede Date: Mon, 24 May 2021 22:07:13 +0200 Subject: [PATCH 03/13] refactor and organize the engine filters --- README.md | 17 +++++++++++ src/engine/filters/base_filter.ts | 21 ++++++++++++++ src/engine/filters/date.ts | 30 +++++++++++++++++++ src/engine/filters/days_after.ts | 9 ++++++ src/engine/filters/days_ago.ts | 9 ++++++ src/engine/index.ts | 48 +++++++++++++++++++++++++++++++ src/suggest/template-suggest.ts | 38 ++++-------------------- src/utils.ts | 29 ------------------- 8 files changed, 140 insertions(+), 61 deletions(-) create mode 100644 src/engine/filters/base_filter.ts create mode 100644 src/engine/filters/date.ts create mode 100644 src/engine/filters/days_after.ts create mode 100644 src/engine/filters/days_ago.ts create mode 100644 src/engine/index.ts diff --git a/README.md b/README.md index ddd9322..b534f74 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,23 @@ I'm just a footer But other than that, you can use all the basic [tags](https://liquidjs.com/tags/overview.html) and [filters](https://liquidjs.com/filters/overview.html) +## Custom Filters + +For now I'll keep the documentation of the filters here, when they become more I'll move it somewhere more convenient + +### `date` + +The `date` filter has been replaced with a custom one + + +### `days_ago` + + + +### `days_after` + + + ## Template context Other than the classic, `date`, `time` and `title` variable you also have: diff --git a/src/engine/filters/base_filter.ts b/src/engine/filters/base_filter.ts new file mode 100644 index 0000000..bdde348 --- /dev/null +++ b/src/engine/filters/base_filter.ts @@ -0,0 +1,21 @@ +import { Liquid, FilterImplOptions } from 'liquidjs'; + +import LiquidTemplates from '../../main'; + +export default class BaseFilter { + readonly plugin: LiquidTemplates; + readonly engine: Liquid; + readonly filterName: string = 'base_filter'; + handler: FilterImplOptions; + + constructor(plugin: LiquidTemplates, engine: Liquid) { + this.plugin = plugin; + this.engine = engine; + + this.register(); + } + + register(): void { + this.engine.registerFilter(this.filterName, this.handler); + } +} diff --git a/src/engine/filters/date.ts b/src/engine/filters/date.ts new file mode 100644 index 0000000..9b84f0d --- /dev/null +++ b/src/engine/filters/date.ts @@ -0,0 +1,30 @@ +import { addDays, format, subDays } from 'date-fns'; + +import BaseFilter from './base_filter'; + +export default class DateFiler extends BaseFilter { + filterName = 'date'; + + handler = (givenValue: number | string, dateFormat?: string): string | number => { + const dateToFormat = (typeof givenValue === 'number') + ? givenValue + : this.parseDate(givenValue) + const formatToUse = dateFormat || this.plugin.settings.dateFormat; + + try { + return format(dateToFormat, formatToUse) + } catch (e) { + if (!(e instanceof RangeError)) throw e; + } + + return givenValue; + } + + parseDate = (stringToParse: string): Date => { + if(['now', 'today'].includes(stringToParse)) return new Date; + if(stringToParse === 'yesterday') return subDays(Date.now(), 1); + if(stringToParse === 'tomorrow') return addDays(Date.now(), 1); + // try to parse the given string + return new Date(Date.parse(stringToParse)); + } +} diff --git a/src/engine/filters/days_after.ts b/src/engine/filters/days_after.ts new file mode 100644 index 0000000..0a0be97 --- /dev/null +++ b/src/engine/filters/days_after.ts @@ -0,0 +1,9 @@ +import { addDays } from 'date-fns'; + +import BaseFilter from './base_filter'; + +export default class DaysAfter extends BaseFilter { + filterName = 'days_after'; + + handler = (daysToSub: number): Date => addDays(Date.now(), daysToSub); +} diff --git a/src/engine/filters/days_ago.ts b/src/engine/filters/days_ago.ts new file mode 100644 index 0000000..111db39 --- /dev/null +++ b/src/engine/filters/days_ago.ts @@ -0,0 +1,9 @@ +import { subDays } from 'date-fns'; + +import BaseFilter from './base_filter'; + +export default class DaysAgo extends BaseFilter { + filterName = 'days_ago'; + + handler = (daysToSub: number): Date => subDays(Date.now(), daysToSub); +} diff --git a/src/engine/index.ts b/src/engine/index.ts new file mode 100644 index 0000000..88d233d --- /dev/null +++ b/src/engine/index.ts @@ -0,0 +1,48 @@ +import { App } from 'obsidian'; +import { Liquid } from 'liquidjs'; + +import LiquidTemplates from '../main'; +import { getTFilesFromFolder } from 'src/utils'; + +import DateFilter from './filters/date'; +import DaysAgo from './filters/days_ago'; +import DaysAfter from './filters/days_after'; + +export function applyCustomFilters(engine: Liquid, plugin: LiquidTemplates) { + [ + DateFilter, + DaysAgo, + DaysAfter + ].forEach(filter => new filter(plugin, engine)) +} + +export function initEngine(app: App, plugin: LiquidTemplates): Liquid { + const engine = new Liquid({ + fs: { + readFileSync: (file) => { + // TODO: implement me + return ""; + }, + readFile: async (file) => { + const [fileName, ...folder] = file.split('/').reverse() + const folderToCheck = [plugin.settings.templatesFolder, ...folder.reverse()].join('/') + // TODO: find a better way to do this + const fileObj = getTFilesFromFolder(app, folderToCheck).find(f => f.basename === fileName); + return app.vault.read(fileObj); + }, + existsSync: () => { + return true + }, + exists: async () => { + return true + }, + resolve: (_root, file, _ext) => { + return file + } + }, + extname: '.md', + greedy: true, + }); + applyCustomFilters(engine, plugin); + return engine; +} diff --git a/src/suggest/template-suggest.ts b/src/suggest/template-suggest.ts index d36a3d9..423638d 100644 --- a/src/suggest/template-suggest.ts +++ b/src/suggest/template-suggest.ts @@ -1,10 +1,12 @@ import { App, TFile } from "obsidian"; import { Liquid } from "liquidjs"; -import type PoweredTemplates from "../main"; -import CodeMirrorSuggest from "./codemirror-suggest"; -import { getTFilesFromFolder, customizeEngine } from "../utils"; import { format } from "date-fns"; +import CodeMirrorSuggest from "./codemirror-suggest"; +import type PoweredTemplates from "../main"; +import { getTFilesFromFolder } from "../utils"; +import { initEngine } from "src/engine"; + interface ITemplateCompletion { label: string; file?: TFile; @@ -21,34 +23,7 @@ export default class TemplateSuggest extends CodeMirrorSuggest { - // TODO: implement me - return ""; - }, - readFile: async (file) => { - const [fileName, ...folder] = file.split('/').reverse() - const { templatesFolder } = this.plugin.settings; - const folderToCheck = [templatesFolder, ...folder.reverse()].join('/') - // TODO: find a better way to do this - const fileObj = getTFilesFromFolder(app, folderToCheck).find(f => f.basename === fileName); - return app.vault.read(fileObj); - }, - existsSync: () => { - return true - }, - exists: async () => { - return true - }, - resolve: (_root, file, _ext) => { - return file - } - }, - extname: '.md', - greedy: true, - })); + this.engine = initEngine(app, plugin); } open(): void { @@ -105,7 +80,6 @@ export default class TemplateSuggest extends CodeMirrorSuggest { const head = this.getStartPos(); const anchor = this.cmEditor.getCursor(); - console.log('--- context', await this.generateContext()); if (suggestion.file) { const templateString = await this.app.vault.read(suggestion.file) diff --git a/src/utils.ts b/src/utils.ts index f5f620a..b74edd8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,7 +1,5 @@ import { App, normalizePath, TAbstractFile, TFile, TFolder, Vault } from "obsidian"; import { compact } from 'lodash'; -import { Liquid } from "liquidjs"; -import { format, parse, subDays } from 'date-fns'; const ALLOWED_EXTENSIONS = ['md'] @@ -30,30 +28,3 @@ export function getTFilesFromFolder(app: App, folderName: string, subfoldersToEx return files; } - -function parseDate(stringToParse: string): Date { - // TODO: find a way to support i18n - if(['now', 'today'].includes(stringToParse)) return new Date; - if(stringToParse === 'yesterday') return subDays(Date.now(), 1); - // try to parse the given string - return new Date(Date.parse(stringToParse)); -} - -export function customizeEngine(engine: Liquid, ): Liquid { - engine.registerFilter('date', (valueToParse, dateFormat) => { - const dateToFormat = (typeof valueToParse === 'number') - ? valueToParse - : parseDate(valueToParse) - try { - return format(dateToFormat, dateFormat) - } catch (e) { - if (e instanceof RangeError) return valueToParse; - } - }); - - engine.registerFilter('days_ago', (daysToSub) => { - return subDays(Date.now(), daysToSub); - }) - - return engine; -} From f45ab5003f133efe5bf1fe8f5ae1fda962fd8af2 Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 18:35:15 +0200 Subject: [PATCH 04/13] refactor the date filter and update the Readme refactor the date filter in order to use the original date filter when a `%` is present inside the format string --- README.md | 54 +++++++++++++++++++++++++++---- src/engine/filters/base_filter.ts | 15 ++++++--- src/engine/filters/date.ts | 15 +++++++-- src/engine/filters/days_after.ts | 6 ++-- src/engine/filters/days_ago.ts | 6 ++-- src/engine/index.ts | 2 +- 6 files changed, 80 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index b534f74..24cf9cc 100644 --- a/README.md +++ b/README.md @@ -64,23 +64,65 @@ For now I'll keep the documentation of the filters here, when they become more I ### `date` -The `date` filter has been replaced with a custom one - +The LiquidJS [built-in `date` filter](https://liquidjs.com/filters/date.html) has been replaced with a custom one. +For now, if there is a `%` character in the date format the old filter is used, otherwise the new one will take place. + +The new `date` filter uses [date-fns](https://date-fns.org/) as library to handle dates, and the format strings to use are showed here: [date-fns formats](https://date-fns.org/v2.21.3/docs/format) + +There are also some special words that can be used with this filter: + +| word | example | effect | +| ---- | ------- | ------ | +| "now" | {{ "now" | date: "yyyy-MM-dd" }} | Use the date from `new Date` and formatted with the given format | +| "today" | {{ "today" | date: "yyyy-MM-dd" }} | same as `now` | +| "yesterday" | {{ "yesterday" | date: "yyyy-MM-dd" }} | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format | +| "tomorrow" | {{ "tomorrow" | date: "yyyy-MM-dd" }} | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format | + +#### Default format + +Now you can use the "Date Format" you defined inside the plugin settings in a easier way: + +**Before**: `{{ "now" | date: default_date_format }}` + +**Now**: `{{ "now" | date }}` the format you specified in the settings is now used as default ### `days_ago` - +A simple filter that uses the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) to subtract days from the current date (`Date.now()`) + +Keep in mind that this filter returns a date that needs to be formatted, so needs to be used with the `date` filter, like this: + +`{{ 1 | days_ago | date }}` same as `{{ "yesterday" | date }}` + +`{{ 2 | days_ago | date }}` return the date from two days ago + +This can be used for a "Weekly Review" template, something like: + +- [[{{ 7 | days_ago | date }}]] +- [[{{ 6 | days_ago | date }}]] +- [[{{ 5 | days_ago | date }}]] +- [[{{ 4 | days_ago | date }}]] +- [[{{ 3 | days_ago | date }}]] +- [[{{ 2 | days_ago | date }}]] +- [[{{ 1 | days_ago | date }}]] + ### `days_after` - +A simple filter that uses the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) to add days to the current date (`Date.now()`) + +Keep in mind that this filter returns a date that needs to be formatted, so needs to be used with the `date` filter, like this: + +`{{ 1 | days_after | date }}` same as `{{ "tomorrow" | date }}` + +`{{ 2 | days_after | date }}` return the date from two days from now ## Template context Other than the classic, `date`, `time` and `title` variable you also have: -| Name | Description | -| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| Name | Description | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | default_date_format | The date format that you have specified in the plugin settings and can be used like this: {{ "now" | date: default_date_format }} | | default_time_format | The time format that you have specified in the plugin settings and can be used like this: {{ "now" | date: default_time_format }} | diff --git a/src/engine/filters/base_filter.ts b/src/engine/filters/base_filter.ts index bdde348..ac0c4aa 100644 --- a/src/engine/filters/base_filter.ts +++ b/src/engine/filters/base_filter.ts @@ -2,17 +2,22 @@ import { Liquid, FilterImplOptions } from 'liquidjs'; import LiquidTemplates from '../../main'; -export default class BaseFilter { +export interface BaseFilterProps { + engine: Liquid, + plugin: LiquidTemplates, + filterName?: string; +} + +export class BaseFilter { readonly plugin: LiquidTemplates; readonly engine: Liquid; - readonly filterName: string = 'base_filter'; + readonly filterName: string; handler: FilterImplOptions; - constructor(plugin: LiquidTemplates, engine: Liquid) { + constructor({ plugin, engine, filterName }: BaseFilterProps) { this.plugin = plugin; this.engine = engine; - - this.register(); + this.filterName = filterName; } register(): void { diff --git a/src/engine/filters/date.ts b/src/engine/filters/date.ts index 9b84f0d..a5f1312 100644 --- a/src/engine/filters/date.ts +++ b/src/engine/filters/date.ts @@ -1,9 +1,14 @@ import { addDays, format, subDays } from 'date-fns'; -import BaseFilter from './base_filter'; +import { BaseFilter, BaseFilterProps } from './base_filter'; export default class DateFiler extends BaseFilter { - filterName = 'date'; + originalFilter: Function; + + constructor(props: BaseFilterProps) { + super({ ...props, filterName: 'date' }); + this.originalFilter = this.engine.filters.get('date'); + } handler = (givenValue: number | string, dateFormat?: string): string | number => { const dateToFormat = (typeof givenValue === 'number') @@ -11,6 +16,12 @@ export default class DateFiler extends BaseFilter { : this.parseDate(givenValue) const formatToUse = dateFormat || this.plugin.settings.dateFormat; + // TODO: improve or remove me: keep backwards compatibility with the current 0.1.5 version + if (formatToUse.includes('%')) { + // TODO: send a notification when using this function + return this.originalFilter(givenValue, dateFormat); + } + try { return format(dateToFormat, formatToUse) } catch (e) { diff --git a/src/engine/filters/days_after.ts b/src/engine/filters/days_after.ts index 0a0be97..56e3321 100644 --- a/src/engine/filters/days_after.ts +++ b/src/engine/filters/days_after.ts @@ -1,9 +1,11 @@ import { addDays } from 'date-fns'; -import BaseFilter from './base_filter'; +import { BaseFilter, BaseFilterProps } from './base_filter'; export default class DaysAfter extends BaseFilter { - filterName = 'days_after'; + constructor(props: BaseFilterProps) { + super({ ...props, filterName: 'days_after' }); + } handler = (daysToSub: number): Date => addDays(Date.now(), daysToSub); } diff --git a/src/engine/filters/days_ago.ts b/src/engine/filters/days_ago.ts index 111db39..758e8a7 100644 --- a/src/engine/filters/days_ago.ts +++ b/src/engine/filters/days_ago.ts @@ -1,9 +1,11 @@ import { subDays } from 'date-fns'; -import BaseFilter from './base_filter'; +import { BaseFilter, BaseFilterProps } from './base_filter'; export default class DaysAgo extends BaseFilter { - filterName = 'days_ago'; + constructor(props: BaseFilterProps) { + super({ ...props, filterName: 'days_ago' }); + } handler = (daysToSub: number): Date => subDays(Date.now(), daysToSub); } diff --git a/src/engine/index.ts b/src/engine/index.ts index 88d233d..46cb557 100644 --- a/src/engine/index.ts +++ b/src/engine/index.ts @@ -13,7 +13,7 @@ export function applyCustomFilters(engine: Liquid, plugin: LiquidTemplates) { DateFilter, DaysAgo, DaysAfter - ].forEach(filter => new filter(plugin, engine)) + ].forEach(filter => new filter({ plugin, engine }).register()) } export function initEngine(app: App, plugin: LiquidTemplates): Liquid { From b28c74a64d09d2c3f3c68714700c6d63d8f05e16 Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 18:50:09 +0200 Subject: [PATCH 05/13] improve settings panel --- src/settings.ts | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/settings.ts b/src/settings.ts index 46c0c8d..5a0a2d5 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,5 +1,6 @@ import { App, PluginSettingTab, Setting } from "obsidian"; import LiquidTemplates from "./main"; +import { format } from 'date-fns'; export interface LiquidTemplatesSettings { templatesFolder: string; @@ -12,8 +13,8 @@ export interface LiquidTemplatesSettings { export const DEFAULT_SETTINGS: LiquidTemplatesSettings = { templatesFolder: 'templates', excludeFolders: "", - dateFormat: '%Y-%m-%d', - timeFormat: '%H:%M', + dateFormat: 'yyyy-MM-dd', + timeFormat: 'k:m', autocompleteTrigger: ';;' }; @@ -59,9 +60,26 @@ export class LiquidTemplatesSettingsTab extends PluginSettingTab { }) ); + const dateFormatDesc = document.createDocumentFragment(); + dateFormatDesc.append( + 'Output format for render dates.', + dateFormatDesc.createEl('br'), + 'For more syntax, refer to ', + dateFormatDesc.createEl("a", { + href: "https://date-fns.org/v2.21.3/docs/format", + text: "format reference", + }), + dateFormatDesc.createEl('br'), + 'current format: ', + dateFormatDesc.createEl('b', { + cls: 'u-pop', + text: format(new Date, this.plugin.settings.dateFormat) + }) + ); + new Setting(containerEl) .setName('Date format') - .setDesc('Output format for render dates') + .setDesc(dateFormatDesc) .addText((text) => text .setPlaceholder(DEFAULT_SETTINGS.dateFormat) @@ -72,9 +90,27 @@ export class LiquidTemplatesSettingsTab extends PluginSettingTab { }) ); + + const timeFormatDesc = document.createDocumentFragment(); + timeFormatDesc.append( + 'Output format for render time.', + timeFormatDesc.createEl('br'), + 'For more syntax, refer to ', + timeFormatDesc.createEl("a", { + href: "https://date-fns.org/v2.21.3/docs/format", + text: "format reference", + }), + timeFormatDesc.createEl('br'), + 'current format: ', + timeFormatDesc.createEl('b', { + cls: 'u-pop', + text: format(new Date, this.plugin.settings.timeFormat) + }) + ); + new Setting(containerEl) .setName('Time format') - .setDesc('Output format for render time') + .setDesc(timeFormatDesc) .addText((text) => text .setPlaceholder(DEFAULT_SETTINGS.timeFormat) From efef55959bda00a45299bee95bfedaac6f91cfc8 Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 18:50:51 +0200 Subject: [PATCH 06/13] bump version to 0.2.0 --- manifest.json | 2 +- package.json | 2 +- versions.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 94a3076..cfb757d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "liquid-templates", "name": "Liquid Templates", - "version": "0.1.5", + "version": "0.2.0", "minAppVersion": "0.12.3", "description": "Empower your template with LiquidJS tags", "author": "diomedet", diff --git a/package.json b/package.json index bc6f16d..dea2a3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "liquid-templates", - "version": "0.1.5", + "version": "0.2.0", "description": "Empower your template with LiquidJS tags", "main": "main.js", "scripts": { diff --git a/versions.json b/versions.json index 1395e56..13af677 100644 --- a/versions.json +++ b/versions.json @@ -1,3 +1,3 @@ { - "0.1.5": "0.12.3" + "0.2.0": "0.12.3" } From ab7e1efeed61622a0087b5d5c5246c180934856f Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 18:52:19 +0200 Subject: [PATCH 07/13] fix table in readme --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 24cf9cc..3443e74 100644 --- a/README.md +++ b/README.md @@ -71,12 +71,12 @@ The new `date` filter uses [date-fns](https://date-fns.org/) as library to handl There are also some special words that can be used with this filter: -| word | example | effect | -| ---- | ------- | ------ | -| "now" | {{ "now" | date: "yyyy-MM-dd" }} | Use the date from `new Date` and formatted with the given format | -| "today" | {{ "today" | date: "yyyy-MM-dd" }} | same as `now` | -| "yesterday" | {{ "yesterday" | date: "yyyy-MM-dd" }} | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format | -| "tomorrow" | {{ "tomorrow" | date: "yyyy-MM-dd" }} | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format | +| word | example | effect | +| ----------- | ---------------- | --------------------- | +| "now" | {{ "now" \ | date: "yyyy-MM-dd" }} | Use the date from `new Date` and formatted with the given format +| "today" | {{ "today" \ | date: "yyyy-MM-dd" }} | same as `now` +| "yesterday" | {{ "yesterday" \ | date: "yyyy-MM-dd" }} | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format +| "tomorrow" | {{ "tomorrow" \ | date: "yyyy-MM-dd" }} | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format #### Default format From aaff89f486d147f768361e6b8b9288838c48654f Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 18:53:52 +0200 Subject: [PATCH 08/13] improve readme --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 3443e74..5e61daf 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ But other than that, you can use all the basic [tags](https://liquidjs.com/tags/ For now I'll keep the documentation of the filters here, when they become more I'll move it somewhere more convenient -### `date` +### `date` filter The LiquidJS [built-in `date` filter](https://liquidjs.com/filters/date.html) has been replaced with a custom one. For now, if there is a `%` character in the date format the old filter is used, otherwise the new one will take place. @@ -86,18 +86,18 @@ Now you can use the "Date Format" you defined inside the plugin settings in a ea **Now**: `{{ "now" | date }}` the format you specified in the settings is now used as default -### `days_ago` +### `days_ago` filter A simple filter that uses the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) to subtract days from the current date (`Date.now()`) Keep in mind that this filter returns a date that needs to be formatted, so needs to be used with the `date` filter, like this: -`{{ 1 | days_ago | date }}` same as `{{ "yesterday" | date }}` - -`{{ 2 | days_ago | date }}` return the date from two days ago +- `{{ 1 | days_ago | date }}` same as `{{ "yesterday" | date }}` +- `{{ 2 | days_ago | date }}` return the date from two days ago This can be used for a "Weekly Review" template, something like: +``` - [[{{ 7 | days_ago | date }}]] - [[{{ 6 | days_ago | date }}]] - [[{{ 5 | days_ago | date }}]] @@ -105,17 +105,16 @@ This can be used for a "Weekly Review" template, something like: - [[{{ 3 | days_ago | date }}]] - [[{{ 2 | days_ago | date }}]] - [[{{ 1 | days_ago | date }}]] +``` - -### `days_after` +### `days_after` filter A simple filter that uses the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) to add days to the current date (`Date.now()`) Keep in mind that this filter returns a date that needs to be formatted, so needs to be used with the `date` filter, like this: -`{{ 1 | days_after | date }}` same as `{{ "tomorrow" | date }}` - -`{{ 2 | days_after | date }}` return the date from two days from now +- `{{ 1 | days_after | date }}` same as `{{ "tomorrow" | date }}` +- `{{ 2 | days_after | date }}` return the date from two days from now ## Template context From 08431346a611a2b519118d8bd89f67566a0e2e22 Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 18:55:24 +0200 Subject: [PATCH 09/13] fix markdown table --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5e61daf..2cd383a 100644 --- a/README.md +++ b/README.md @@ -71,12 +71,12 @@ The new `date` filter uses [date-fns](https://date-fns.org/) as library to handl There are also some special words that can be used with this filter: -| word | example | effect | -| ----------- | ---------------- | --------------------- | -| "now" | {{ "now" \ | date: "yyyy-MM-dd" }} | Use the date from `new Date` and formatted with the given format -| "today" | {{ "today" \ | date: "yyyy-MM-dd" }} | same as `now` -| "yesterday" | {{ "yesterday" \ | date: "yyyy-MM-dd" }} | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format -| "tomorrow" | {{ "tomorrow" \ | date: "yyyy-MM-dd" }} | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format +| word | example | effect | +| ----------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| "now" | {{ "now" | date: "yyyy-MM-dd" }} | Use the date from `new Date` and formatted with the given format | +| "today" | {{ "today" | date: "yyyy-MM-dd" }} | same as `now` | +| "yesterday" | {{ "yesterday" | date: "yyyy-MM-dd" }} | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format | +| "tomorrow" | {{ "tomorrow" | date: "yyyy-MM-dd" }} | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format | #### Default format From a4f484ea4758796fb1b0463db11be66ce7d49e28 Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 18:56:50 +0200 Subject: [PATCH 10/13] use codeblock inside table in the readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2cd383a..ed7f926 100644 --- a/README.md +++ b/README.md @@ -73,10 +73,10 @@ There are also some special words that can be used with this filter: | word | example | effect | | ----------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| "now" | {{ "now" | date: "yyyy-MM-dd" }} | Use the date from `new Date` and formatted with the given format | -| "today" | {{ "today" | date: "yyyy-MM-dd" }} | same as `now` | -| "yesterday" | {{ "yesterday" | date: "yyyy-MM-dd" }} | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format | -| "tomorrow" | {{ "tomorrow" | date: "yyyy-MM-dd" }} | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format | +| "now" | `{{ "now" | date: "yyyy-MM-dd" }}` | Use the date from `new Date` and formatted with the given format | +| "today" | `{{ "today" | date: "yyyy-MM-dd" }}` | same as `now` | +| "yesterday" | `{{ "yesterday" | date: "yyyy-MM-dd" }}` | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format | +| "tomorrow" | `{{ "tomorrow" | date: "yyyy-MM-dd" }}` | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format | #### Default format @@ -131,5 +131,5 @@ For now, this plugin just includes the basic version of LiquidJS, but I want to - [ ] Add autocomplete to the template folder, excluded folder settings - [ ] Implement a fuzzy finder for the autocomplete -- [ ] Implement/install a filter that allows you to write `{{ 1 | days_ago | date: default_date_format }}` +- [x] Implement/install a filter that allows you to write `{{ 1 | days_ago | date: default_date_format }}` - [ ] Parse a selected template string, something like you select `{{ "dQw4w9WgXcQ" | youtube_iframe }}` run a command and end up with the parsed result, in this case, the youtube iframe. (the `youtube_iframe` tag does not exist yet) \ No newline at end of file From f34e590e72fdee36183aaf3b3883649c10dde47a Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 19:01:34 +0200 Subject: [PATCH 11/13] improve readme and remove that stupid table --- README.md | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ed7f926..9a87e27 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ But other than that, you can use all the basic [tags](https://liquidjs.com/tags/ For now I'll keep the documentation of the filters here, when they become more I'll move it somewhere more convenient -### `date` filter +## `date` filter The LiquidJS [built-in `date` filter](https://liquidjs.com/filters/date.html) has been replaced with a custom one. For now, if there is a `%` character in the date format the old filter is used, otherwise the new one will take place. @@ -71,14 +71,37 @@ The new `date` filter uses [date-fns](https://date-fns.org/) as library to handl There are also some special words that can be used with this filter: -| word | example | effect | -| ----------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -| "now" | `{{ "now" | date: "yyyy-MM-dd" }}` | Use the date from `new Date` and formatted with the given format | -| "today" | `{{ "today" | date: "yyyy-MM-dd" }}` | same as `now` | -| "yesterday" | `{{ "yesterday" | date: "yyyy-MM-dd" }}` | use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format | -| "tomorrow" | `{{ "tomorrow" | date: "yyyy-MM-dd" }}` | use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format | +**"now"** -#### Default format +`{{ "now" | date: "yyyy-MM-dd" }}` + +Use the date from `new Date` and formatted with the given format + +--- + +**"today"** + +`{{ "today" | date: "yyyy-MM-dd" }}` + +same as `now` + +--- + +**"yesterday"** + +`{{ "yesterday" | date: "yyyy-MM-dd" }}` + +use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format + +--- + +**"tomorrow"** + +`{{ "tomorrow" | date: "yyyy-MM-dd" }}` + +use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format + +### `date` Default format Now you can use the "Date Format" you defined inside the plugin settings in a easier way: @@ -86,7 +109,7 @@ Now you can use the "Date Format" you defined inside the plugin settings in a ea **Now**: `{{ "now" | date }}` the format you specified in the settings is now used as default -### `days_ago` filter +## `days_ago` filter A simple filter that uses the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) to subtract days from the current date (`Date.now()`) @@ -107,7 +130,7 @@ This can be used for a "Weekly Review" template, something like: - [[{{ 1 | days_ago | date }}]] ``` -### `days_after` filter +## `days_after` filter A simple filter that uses the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) to add days to the current date (`Date.now()`) From 32d688c6987aeb8469a34a76adecd02519b73f1f Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 19:02:36 +0200 Subject: [PATCH 12/13] test a different readme format --- README.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/README.md b/README.md index 9a87e27..ea1565f 100644 --- a/README.md +++ b/README.md @@ -72,35 +72,25 @@ The new `date` filter uses [date-fns](https://date-fns.org/) as library to handl There are also some special words that can be used with this filter: **"now"** - `{{ "now" | date: "yyyy-MM-dd" }}` - Use the date from `new Date` and formatted with the given format ---- **"today"** - `{{ "today" | date: "yyyy-MM-dd" }}` - same as `now` ---- **"yesterday"** - `{{ "yesterday" | date: "yyyy-MM-dd" }}` - use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format ---- **"tomorrow"** - `{{ "tomorrow" | date: "yyyy-MM-dd" }}` - use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format + ### `date` Default format Now you can use the "Date Format" you defined inside the plugin settings in a easier way: From bb6a78965fbaa1de8164f7c5e8b6a097567c3d09 Mon Sep 17 00:00:00 2001 From: Diomede Date: Wed, 26 May 2021 19:04:03 +0200 Subject: [PATCH 13/13] Final readme update --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index ea1565f..1690237 100644 --- a/README.md +++ b/README.md @@ -71,24 +71,24 @@ The new `date` filter uses [date-fns](https://date-fns.org/) as library to handl There are also some special words that can be used with this filter: -**"now"** -`{{ "now" | date: "yyyy-MM-dd" }}` -Use the date from `new Date` and formatted with the given format +**"now"**
+`{{ "now" | date: "yyyy-MM-dd" }}`
+Use the date from `new Date` and formatted with the given format
-**"today"** -`{{ "today" | date: "yyyy-MM-dd" }}` -same as `now` +**"today"**
+`{{ "today" | date: "yyyy-MM-dd" }}`
+same as `now`
-**"yesterday"** -`{{ "yesterday" | date: "yyyy-MM-dd" }}` -use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format +**"yesterday"**
+`{{ "yesterday" | date: "yyyy-MM-dd" }}`
+use the [`subDays`](https://date-fns.org/v2.21.3/docs/subDays) function to subtract `1` from `Date.now()` and formatted with the given format
-**"tomorrow"** -`{{ "tomorrow" | date: "yyyy-MM-dd" }}` -use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format +**"tomorrow"**
+`{{ "tomorrow" | date: "yyyy-MM-dd" }}`
+use the [`addDays`](https://date-fns.org/v2.21.3/docs/addDays) function to add `1` to `Date.now()` and formatted with the given format
### `date` Default format @@ -145,4 +145,4 @@ For now, this plugin just includes the basic version of LiquidJS, but I want to - [ ] Add autocomplete to the template folder, excluded folder settings - [ ] Implement a fuzzy finder for the autocomplete - [x] Implement/install a filter that allows you to write `{{ 1 | days_ago | date: default_date_format }}` -- [ ] Parse a selected template string, something like you select `{{ "dQw4w9WgXcQ" | youtube_iframe }}` run a command and end up with the parsed result, in this case, the youtube iframe. (the `youtube_iframe` tag does not exist yet) \ No newline at end of file +- [ ] Parse a selected template string, something like you select `{{ "dQw4w9WgXcQ" | youtube_iframe }}` run a command and end up with the parsed result, in this case, the youtube iframe. (the `youtube_iframe` tag does not exist yet)