diff --git a/src/constants.ts b/src/constants.ts index 561eaf5..f7fd6b7 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,6 @@ export const VALUE_SYNTAX = "{{value}}"; export const DATE_SYNTAX = "{{date}}"; +export const TIME_SYNTAX = "{{time}}"; export const NAME_SYNTAX = "{{name}}"; export const VARIABLE_SYNTAX = "{{value:}}"; export const FIELD_VAR_SYNTAX = "{{field:}}"; @@ -46,6 +47,8 @@ export const DATE_REGEX = new RegExp(/{{DATE(\+-?[0-9]+)?}}/i); export const DATE_REGEX_FORMATTED = new RegExp( /{{DATE:([^}\n\r+]*)(\+-?[0-9]+)?}}/i ); +export const TIME_REGEX = new RegExp(/{{TIME}}/i); +export const TIME_REGEX_FORMATTED = new RegExp(/{{TIME:([^}\n\r+]*)}}/i); export const NAME_VALUE_REGEX = new RegExp(/{{NAME}}|{{VALUE}}/i); export const VARIABLE_REGEX = new RegExp(/{{VALUE:([^\n\r}]*)}}/i); export const FIELD_VAR_REGEX = new RegExp(/{{FIELD:([^\n\r}]*)}}/i); @@ -111,6 +114,10 @@ export const TITLE_SYNTAX_SUGGEST_REGEX = new RegExp( export const SELECTED_SYNTAX_SUGGEST_REGEX = new RegExp( /{{[S]?[E]?[L]?[E]?[C]?[T]?[E]?[D]?[}]?[}]?/i ); +export const TIME_SYNTAX_SUGGEST_REGEX = new RegExp(/{{[T]?[I]?[M]?[E]?[}]?[}]?/i); +export const TIME_FORMAT_SYNTAX_SUGGEST_REGEX = new RegExp( + /{{[T]?[I]?[M]?[E]?[:]?$|{{TIME:[^\n\r}]*}}$/i +) // == File Exists (Template Choice) == // export const fileExistsIncrement = "Increment the file name" as const; diff --git a/src/formatters/completeFormatter.ts b/src/formatters/completeFormatter.ts index b29a009..5a39555 100644 --- a/src/formatters/completeFormatter.ts +++ b/src/formatters/completeFormatter.ts @@ -38,6 +38,7 @@ export class CompleteFormatter extends Formatter { output = await this.replaceMacrosInString(output); output = await this.replaceTemplateInString(output); output = this.replaceDateInString(output); + output = this.replaceTimeInString(output); output = await this.replaceValueInString(output); output = await this.replaceSelectedInString(output); output = await this.replaceDateVariableInString(output); diff --git a/src/formatters/fileNameDisplayFormatter.ts b/src/formatters/fileNameDisplayFormatter.ts index 4046b54..e3e02a7 100644 --- a/src/formatters/fileNameDisplayFormatter.ts +++ b/src/formatters/fileNameDisplayFormatter.ts @@ -13,6 +13,7 @@ export class FileNameDisplayFormatter extends Formatter { output = await this.replaceMacrosInString(output); output = this.replaceDateInString(output); + output = this.replaceTimeInString(output); output = await this.replaceValueInString(output); output = await this.replaceDateVariableInString(output); output = await this.replaceVariableInString(output); diff --git a/src/formatters/formatDisplayFormatter.ts b/src/formatters/formatDisplayFormatter.ts index 72e44cb..4a82bba 100644 --- a/src/formatters/formatDisplayFormatter.ts +++ b/src/formatters/formatDisplayFormatter.ts @@ -13,6 +13,7 @@ export class FormatDisplayFormatter extends Formatter { let output: string = input; output = this.replaceDateInString(output); + output = this.replaceTimeInString(output); output = await this.replaceValueInString(output); output = await this.replaceDateVariableInString(output); output = await this.replaceVariableInString(output); diff --git a/src/formatters/formatter.ts b/src/formatters/formatter.ts index c58ab58..2b64669 100644 --- a/src/formatters/formatter.ts +++ b/src/formatters/formatter.ts @@ -14,6 +14,8 @@ import { VARIABLE_REGEX, FIELD_VAR_REGEX, SELECTED_REGEX, + TIME_REGEX, + TIME_REGEX_FORMATTED, } from "../constants"; import { getDate } from "../utilityObsidian"; @@ -71,6 +73,36 @@ export abstract class Formatter { return output; } + protected replaceTimeInString(input: string): string { + let output: string = input; + + while (TIME_REGEX.test(output)) { + const timeMatch = TIME_REGEX.exec(output); + if (!timeMatch) throw new Error("unable to parse time"); + + output = this.replacer( + output, + TIME_REGEX, + getDate({ format: "HH:mm" }) + ) + } + + while (TIME_REGEX_FORMATTED.test(output)) { + const timeMatch = TIME_REGEX_FORMATTED.exec(output); + if (!timeMatch) throw new Error("unable to parse time"); + + const format = timeMatch[1]; + + output = this.replacer( + output, + TIME_REGEX_FORMATTED, + getDate({ format }) + ) + } + + return output; + } + protected abstract promptForValue( header?: string ): Promise | string; diff --git a/src/gui/suggesters/formatSyntaxSuggester.ts b/src/gui/suggesters/formatSyntaxSuggester.ts index 6beeb01..37d5dea 100644 --- a/src/gui/suggesters/formatSyntaxSuggester.ts +++ b/src/gui/suggesters/formatSyntaxSuggester.ts @@ -4,6 +4,7 @@ import { DATE_FORMAT_SYNTAX_SUGGEST_REGEX, DATE_SYNTAX, DATE_SYNTAX_SUGGEST_REGEX, + TIME_SYNTAX, LINKCURRENT_SYNTAX, LINKCURRENT_SYNTAX_SUGGEST_REGEX, MACRO_SYNTAX_SUGGEST_REGEX, @@ -18,6 +19,7 @@ import { VARIABLE_SYNTAX_SUGGEST_REGEX, SELECTED_SYNTAX_SUGGEST_REGEX, SELECTED_SYNTAX, + TIME_SYNTAX_SUGGEST_REGEX, } from "../../constants"; import type QuickAdd from "../../main"; @@ -32,6 +34,8 @@ enum FormatSyntaxToken { Macro, Template, MathValue, + Time, + Selected } export class FormatSyntaxSuggester extends TextInputSuggest { @@ -160,6 +164,9 @@ export class FormatSyntaxSuggester extends TextInputSuggest { const dateMatch = DATE_SYNTAX_SUGGEST_REGEX.exec(input); if (dateMatch) callback(dateMatch, FormatSyntaxToken.Date, DATE_SYNTAX); + const timeMatch = TIME_SYNTAX_SUGGEST_REGEX.exec(input); + if (timeMatch) callback(timeMatch, FormatSyntaxToken.Time, TIME_SYNTAX); + const nameMatch = NAME_SYNTAX_SUGGEST_REGEX.exec(input); if (nameMatch) callback(nameMatch, FormatSyntaxToken.Name, NAME_SYNTAX); @@ -177,7 +184,7 @@ export class FormatSyntaxSuggester extends TextInputSuggest { const selectedMatch = SELECTED_SYNTAX_SUGGEST_REGEX.exec(input); if (selectedMatch) - callback(selectedMatch, FormatSyntaxToken.Macro, SELECTED_SYNTAX); + callback(selectedMatch, FormatSyntaxToken.Selected, SELECTED_SYNTAX); const variableMatch = VARIABLE_SYNTAX_SUGGEST_REGEX.exec(input); if (variableMatch)