Skip to content

Commit ab6e17e

Browse files
committed
templates finished
1 parent 960169c commit ab6e17e

File tree

10 files changed

+152
-66
lines changed

10 files changed

+152
-66
lines changed

exampleVault/.obsidian/plugins/obsidian-meta-bind-plugin/main.js

Lines changed: 58 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

exampleVault/examples.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
rating: 31
33
title: test title test test
44
completed: false
5-
toggle1: true
6-
slider1: 63
5+
toggle1: false
6+
slider1: 5
77
slider2: 5
88
text1: Test text
99
text_area1: Test test
@@ -123,6 +123,12 @@ Lorem ipsum dolor sit amet, `INPUT[date():other note#date]` consectetur adipisci
123123

124124
asdasd
125125

126+
## Templates
127+
- unknown tempalate
128+
- `INPUT[][toggle:toggle1]`
129+
- `INPUT[nonExistantTemplate][toggle:toggle1]`
130+
- `INPUT[toggleTemplate][:toggle1]`
131+
126132
## Error Messages
127133
- `INPUT[text():meta bind/nonExistantFile#title]`
128134
- `INPUT[slider(nonExistantArgument)]`

exampleVault/other note.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ select: option b
44
multi-select:
55
- option b
66
- option c
7-
date: 2029-05-18
7+
date: 2029-05-11
88
time: 19:20
99
---

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"license": "MIT",
1515
"devDependencies": {
1616
"@tsconfig/svelte": "^3.0.0",
17-
"@types/jest": "^28.1.3",
17+
"@types/jest": "^28.1.6",
1818
"@types/node": "^16.11.6",
1919
"@typescript-eslint/eslint-plugin": "^5.30.0",
2020
"@typescript-eslint/parser": "^5.30.0",

src/InputFieldMarkdownRenderChild.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export class InputFieldMarkdownRenderChild extends MarkdownRenderChild {
6666
this.limitInterval = window.setInterval(() => this.applyValueQueueToMetadata(), this.plugin.settings.syncInterval);
6767
} catch (e: any) {
6868
this.error = e.message;
69-
Logger.logWarning(e);
69+
console.warn(e);
7070
}
7171
}
7272

src/main.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {InputFieldMarkdownRenderChild, InputFieldMarkdownRenderChildType} from '
44
import {getFileName, isPath, removeFileEnding} from './utils/Utils';
55
import {Logger} from './utils/Logger';
66
import {DateParser} from './parsers/DateParser';
7+
import {InputFieldDeclarationParser} from "./parsers/InputFieldDeclarationParser";
78

89
export default class MetaBindPlugin extends Plugin {
910
// @ts-ignore defined in `onload`
@@ -19,6 +20,7 @@ export default class MetaBindPlugin extends Plugin {
1920

2021
Logger.devMode = this.settings.devMode;
2122
DateParser.dateFormat = this.settings.preferredDateFormat;
23+
InputFieldDeclarationParser.parseTemplates(this.settings.inputTemplates);
2224

2325
this.activeMarkdownInputFields = [];
2426
this.markDownInputFieldIndex = 0;
@@ -194,6 +196,7 @@ export default class MetaBindPlugin extends Plugin {
194196
async saveSettings(): Promise<void> {
195197
DateParser.dateFormat = this.settings.preferredDateFormat;
196198
Logger.devMode = this.settings.devMode;
199+
InputFieldDeclarationParser.parseTemplates(this.settings.inputTemplates);
197200
await this.saveData(this.settings);
198201
}
199202
}

src/parsers/InputFieldDeclarationParser.ts

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ export interface InputFieldDeclaration {
3838
argumentContainer: InputFieldArgumentContainer;
3939
}
4040

41+
export interface Template {
42+
identifier: string;
43+
template: InputFieldDeclaration;
44+
}
45+
4146
export class InputFieldDeclarationParser {
4247
static roundBracesPair: EnclosingPair = new EnclosingPair('(', ')');
4348
static squareBracesPair: EnclosingPair = new EnclosingPair('[', ']');
@@ -48,15 +53,29 @@ export class InputFieldDeclarationParser {
4853
InputFieldDeclarationParser.curlyBracesPair,
4954
];
5055

51-
static templates: Record<string, InputFieldDeclaration> = {};
56+
static templates: Template[] = [];
5257

5358

54-
static parse(fullDeclaration: string, templateName?: string): InputFieldDeclaration {
59+
static parse(fullDeclaration: string): InputFieldDeclaration {
5560
let inputFieldDeclaration: InputFieldDeclaration = {} as InputFieldDeclaration;
5661

62+
let useTemplate = false;
63+
let templateName = '';
64+
5765
// declaration
5866
inputFieldDeclaration.fullDeclaration = fullDeclaration;
59-
inputFieldDeclaration.declaration = ParserUtils.getInBetween(fullDeclaration, InputFieldDeclarationParser.squareBracesPair) as string;
67+
const temp = ParserUtils.getInBetween(fullDeclaration, InputFieldDeclarationParser.squareBracesPair);
68+
if (Array.isArray(temp)) {
69+
if (temp.length === 2) {
70+
useTemplate = true;
71+
templateName = temp[0];
72+
inputFieldDeclaration.declaration = temp[1];
73+
} else {
74+
throw new MetaBindParsingError('invalid input field declaration');
75+
}
76+
} else {
77+
inputFieldDeclaration.declaration = temp;
78+
}
6079

6180
// declaration parts
6281
const declarationParts: string[] = ParserUtils.split(inputFieldDeclaration.declaration, ':', InputFieldDeclarationParser.squareBracesPair);
@@ -67,51 +86,65 @@ export class InputFieldDeclarationParser {
6786

6887
// input field type and arguments
6988
const inputFieldTypeWithArguments: string = declarationParts[0];
70-
// input field type
71-
const inputFieldTypeString = ParserUtils.removeInBetween(inputFieldTypeWithArguments, InputFieldDeclarationParser.roundBracesPair);
72-
inputFieldDeclaration.inputFieldType = InputFieldDeclarationParser.getInputFieldType(inputFieldTypeString);
73-
74-
// arguments
75-
const inputFieldArgumentsString: string = ParserUtils.getInBetween(inputFieldTypeWithArguments, InputFieldDeclarationParser.roundBracesPair) as string;
76-
// console.log(inputFieldArgumentsString);
77-
if (inputFieldArgumentsString) {
78-
inputFieldDeclaration.argumentContainer = InputFieldDeclarationParser.parseArguments(inputFieldArgumentsString, inputFieldDeclaration.inputFieldType);
89+
if (inputFieldTypeWithArguments) {
90+
// input field type
91+
const inputFieldTypeString = ParserUtils.removeInBetween(inputFieldTypeWithArguments, InputFieldDeclarationParser.roundBracesPair);
92+
inputFieldDeclaration.inputFieldType = InputFieldDeclarationParser.getInputFieldType(inputFieldTypeString);
93+
94+
// arguments
95+
const inputFieldArgumentsString: string = ParserUtils.getInBetween(inputFieldTypeWithArguments, InputFieldDeclarationParser.roundBracesPair) as string;
96+
// console.log(inputFieldArgumentsString);
97+
if (inputFieldArgumentsString) {
98+
inputFieldDeclaration.argumentContainer = InputFieldDeclarationParser.parseArguments(inputFieldArgumentsString, inputFieldDeclaration.inputFieldType);
99+
} else {
100+
inputFieldDeclaration.argumentContainer = new InputFieldArgumentContainer();
101+
}
79102
} else {
103+
inputFieldDeclaration.inputFieldType = InputFieldType.INVALID;
80104
inputFieldDeclaration.argumentContainer = new InputFieldArgumentContainer();
81105
}
82106

83107

84-
if (templateName) {
85-
const template = InputFieldDeclarationParser.templates[templateName];
108+
if (useTemplate) {
109+
console.log(templateName);
110+
const template = InputFieldDeclarationParser.templates.filter(x => x.identifier === templateName).first()?.template;
111+
console.log(template);
86112
if (template) {
87113
inputFieldDeclaration.bindTarget = inputFieldDeclaration.bindTarget || template.bindTarget;
88114
inputFieldDeclaration.isBound = inputFieldDeclaration.isBound || template.isBound;
89115
inputFieldDeclaration.inputFieldType = inputFieldDeclaration.inputFieldType === InputFieldType.INVALID ? template.inputFieldType : (inputFieldDeclaration.inputFieldType || template.inputFieldType);
90116
inputFieldDeclaration.argumentContainer = template.argumentContainer.mergeByOverride(inputFieldDeclaration.argumentContainer);
117+
} else {
118+
throw new MetaBindParsingError(`unknown template name \'${templateName}\'`);
91119
}
92120
}
93121

94122
if (inputFieldDeclaration.inputFieldType === InputFieldType.INVALID) {
95-
throw new MetaBindParsingError(`unknown input field type \'${inputFieldTypeString}\'`);
123+
throw new MetaBindParsingError(`unknown input field type`);
96124
}
97125

98126
return inputFieldDeclaration;
99127
}
100128

101129
static parseTemplates(templates: string): void {
102130
let templateDeclarations = ParserUtils.split(templates, '\n', InputFieldDeclarationParser.squareBracesPair);
103-
templateDeclarations.map(x => x.trim()).filter(x => x.length > 0);
131+
templateDeclarations = templateDeclarations.map(x => x.trim()).filter(x => x.length > 0);
104132

105133
for (const templateDeclaration of templateDeclarations) {
106-
const templateDeclarationParts: string[] = ParserUtils.split(templateDeclaration, '->', InputFieldDeclarationParser.squareBracesPair);
107-
templateDeclarationParts.map(x => x.trim());
134+
let templateDeclarationParts: string[] = ParserUtils.split(templateDeclaration, '->', InputFieldDeclarationParser.squareBracesPair);
135+
templateDeclarationParts = templateDeclarationParts.map(x => x.trim());
108136

109137
if (templateDeclarationParts.length === 1) {
110138
throw new MetaBindParsingError('Invalid template syntax');
111139
} else if (templateDeclarationParts.length === 2) {
112-
InputFieldDeclarationParser.templates[templateDeclarationParts[0]] = InputFieldDeclarationParser.parse(templateDeclarationParts[1]);
140+
InputFieldDeclarationParser.templates.push({
141+
identifier: templateDeclarationParts[0],
142+
template: InputFieldDeclarationParser.parse(templateDeclarationParts[1]),
143+
})
113144
}
114145
}
146+
147+
console.log(InputFieldDeclarationParser.templates);
115148
}
116149

117150
static parseArguments(inputFieldArgumentsString: string, inputFieldType: InputFieldType): InputFieldArgumentContainer {

src/settings/Settings.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {App, PluginSettingTab, Setting} from 'obsidian';
1+
import {App, PluginSettingTab, Setting, TextAreaComponent} from 'obsidian';
22
import MetaBindPlugin from '../main';
33

44
export interface MetaBindPluginSettings {
@@ -82,15 +82,17 @@ export class MetaBindSettingTab extends PluginSettingTab {
8282

8383
new Setting(containerEl)
8484
.setName('Templates')
85-
.setDesc(`You can specify templates here, and access them using \`TEMPLATE_INPUT[...]\` in your notes.`)
86-
.addTextArea(cb => {
87-
cb.setValue(this.plugin.settings.inputTemplates);
88-
cb.setPlaceholder('template_name -> INPUT[input_type(argument(value)):bind_target]');
89-
cb.onChange(data => {
90-
this.plugin.settings.inputTemplates = data;
91-
this.plugin.saveSettings();
92-
});
93-
});
85+
.setDesc(`You can specify templates here, and access them using \`TEMPLATE_INPUT[...]\` in your notes.`);
86+
87+
const ta = new TextAreaComponent(containerEl);
88+
ta.setValue(this.plugin.settings.inputTemplates);
89+
ta.setPlaceholder('template_name -> INPUT[input_type(argument(value)):bind_target]');
90+
ta.inputEl.style.width = '100%';
91+
ta.inputEl.style.height = '200px';
92+
ta.onChange(data => {
93+
this.plugin.settings.inputTemplates = data;
94+
this.plugin.saveSettings();
95+
});
9496

9597

9698
new Setting(containerEl)

src/utils/Logger.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ export class Logger {
3131
console.warn(this.prefix, data);
3232
}
3333

34+
/**
35+
* Logs a warning to the console without the plugin prefix
36+
*
37+
* @param data
38+
*/
39+
static warn(...data: any): void {
40+
console.warn(data);
41+
}
42+
3443
/**
3544
* Logs an error to the console with the plugin prefix
3645
*

0 commit comments

Comments
 (0)