Skip to content

Commit e277a83

Browse files
committed
js view field syntax highlighting and hidden
1 parent 9b2e444 commit e277a83

File tree

12 files changed

+49
-9
lines changed

12 files changed

+49
-9
lines changed

bun.lockb

338 Bytes
Binary file not shown.

exampleVault/View Fields/JS View Field.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ return engine.markdown.create(`**${context.bound.n1 * context.bound.n2}** km`);
2121
```meta-bind-js-view
2222
{number1} as n1
2323
save to {n1clone}
24+
hidden
2425
---
2526
return context.bound.n1;
2627
```

packages/core/src/api/InternalAPI.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,9 @@ export abstract class InternalAPI<Plugin extends IPlugin> {
144144
* @param container
145145
* @param filePath
146146
* @param code
147+
* @param hidden
147148
*/
148-
abstract createJsRenderer(container: HTMLElement, filePath: string, code: string): IJsRenderer;
149+
abstract createJsRenderer(container: HTMLElement, filePath: string, code: string, hidden: boolean): IJsRenderer;
149150

150151
/**
151152
* Open a specific file.

packages/core/src/fields/viewFields/JsViewFieldMountable.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,12 @@ export class JsViewFieldMountable extends FieldMountable {
140140
const wrapperEl: HTMLDivElement = document.createElement('div');
141141
DomHelpers.addClass(wrapperEl, 'mb-view-wrapper');
142142

143-
this.jsRenderer = this.plugin.internal.createJsRenderer(wrapperEl, this.getFilePath(), this.declaration.code);
143+
this.jsRenderer = this.plugin.internal.createJsRenderer(
144+
wrapperEl,
145+
this.getFilePath(),
146+
this.declaration.code,
147+
this.declaration.hidden,
148+
);
144149

145150
this.registerSelfToMetadataManager();
146151

packages/core/src/parsers/nomParsers/ViewFieldNomParsers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,16 @@ const P_JsViewFieldBindTargetMapping: Parser<UnvalidatedJsViewFieldBindTargetMap
107107
);
108108

109109
export const P_JsViewFieldDeclaration: Parser<PartialUnvalidatedJsViewFieldDeclaration> = P.sequenceMap(
110-
(bindTargetMappings, writeToBindTarget, code) => {
110+
(bindTargetMappings, writeToBindTarget, hidden, code) => {
111111
return {
112112
bindTargetMappings: bindTargetMappings,
113113
writeToBindTarget: writeToBindTarget,
114+
hidden: hidden !== undefined,
114115
code: code,
115116
} satisfies PartialUnvalidatedJsViewFieldDeclaration;
116117
},
117118
P_JsViewFieldBindTargetMapping.separateBy(P_UTILS.whitespace()).skip(P_UTILS.whitespace()),
118119
P.string('save to ').then(P_BindTarget.wrapString('{', '}')).skip(P_UTILS.whitespace()).optional(),
120+
P.string('hidden').skip(P_UTILS.whitespace()).optional(),
119121
P.string('---').then(P_UTILS.remaining()),
120122
);

packages/core/src/parsers/viewFieldParser/JsViewFieldParser.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export class JsViewFieldParser {
3232
errorCollection: errorCollection,
3333
bindTargetMappings: [],
3434
writeToBindTarget: undefined,
35+
hidden: false,
3536
code: '',
3637
};
3738
}
@@ -55,6 +56,7 @@ export class JsViewFieldParser {
5556
writeToBindTarget: this.plugin.api.bindTargetParser.fromExistingDeclaration(
5657
simpleDeclaration.writeToBindTarget,
5758
),
59+
hidden: simpleDeclaration.hidden ?? false,
5860
errorCollection: errorCollection,
5961
};
6062
}
@@ -109,6 +111,7 @@ export class JsViewFieldParser {
109111
}
110112

111113
declaration.code = unvalidatedDeclaration.code;
114+
declaration.hidden = unvalidatedDeclaration.hidden;
112115

113116
return declaration;
114117
} catch (e) {
@@ -120,6 +123,7 @@ export class JsViewFieldParser {
120123
errorCollection: declaration.errorCollection,
121124
bindTargetMappings: [],
122125
writeToBindTarget: undefined,
126+
hidden: false,
123127
code: '',
124128
};
125129
}

packages/core/src/parsers/viewFieldParser/ViewFieldDeclaration.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export interface SimpleViewFieldDeclaration {
4141
export interface JsViewFieldDeclaration extends FieldDeclaration {
4242
bindTargetMappings: JsViewFieldBindTargetMapping[];
4343
writeToBindTarget?: BindTargetDeclaration | undefined;
44+
hidden: boolean;
4445
code: string;
4546
}
4647

@@ -54,6 +55,7 @@ export interface UnvalidatedJsViewFieldDeclaration extends PartialUnvalidatedJsV
5455
export interface PartialUnvalidatedJsViewFieldDeclaration {
5556
bindTargetMappings: UnvalidatedJsViewFieldBindTargetMapping[];
5657
writeToBindTarget?: UnvalidatedBindTargetDeclaration | undefined;
58+
hidden: boolean;
5759
code: string;
5860
}
5961

@@ -65,6 +67,7 @@ export interface UnvalidatedJsViewFieldBindTargetMapping {
6567
export interface SimpleJsViewFieldDeclaration {
6668
bindTargetMappings: SimpleJsViewFieldBindTargetMapping[];
6769
writeToBindTarget?: BindTargetDeclaration | undefined;
70+
hidden?: boolean;
6871
code: string;
6972
}
7073

packages/obsidian/src/ObsidianInternalAPI.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ export class ObsidianInternalAPI extends InternalAPI<MetaBindPlugin> {
135135
return () => component.unload();
136136
}
137137

138-
public createJsRenderer(container: HTMLElement, filePath: string, code: string): IJsRenderer {
139-
return new ObsidianJsRenderer(this.plugin, container, filePath, code);
138+
public createJsRenderer(container: HTMLElement, filePath: string, code: string, hidden: boolean): IJsRenderer {
139+
return new ObsidianJsRenderer(this.plugin, container, filePath, code, hidden);
140140
}
141141

142142
public openFile(filePath: string, callingFilePath: string, newTab: boolean): void {

packages/obsidian/src/ObsidianJsRenderer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ export class ObsidianJsRenderer implements IJsRenderer {
1212
file: TFile;
1313
jsEngine: API;
1414
code: string;
15+
hidden: boolean;
1516
renderComponent: Component;
1617

17-
constructor(plugin: MetaBindPlugin, containerEl: HTMLElement, filePath: string, code: string) {
18+
constructor(plugin: MetaBindPlugin, containerEl: HTMLElement, filePath: string, code: string, hidden: boolean) {
1819
this.plugin = plugin;
1920
this.containerEl = containerEl;
2021
this.code = code;
22+
this.hidden = hidden;
2123

2224
const file = plugin.app.vault.getAbstractFileByPath(filePath);
2325
if (!(file instanceof TFile)) {
@@ -58,7 +60,9 @@ export class ObsidianJsRenderer implements IJsRenderer {
5860
this.file.path,
5961
this.renderComponent,
6062
);
61-
await renderer.render(execution.result);
63+
if (!this.hidden) {
64+
await renderer.render(execution.result);
65+
}
6266

6367
const simpleObject = renderer.convertToSimpleObject(execution.result);
6468

packages/obsidian/src/cm6/Cm5_Modes.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { yaml } from '@codemirror/legacy-modes/mode/yaml';
2+
import { javascript } from '@codemirror/legacy-modes/mode/javascript';
23
import { type Mode, type StringStream } from 'codemirror';
34
import { SyntaxHighlighting } from 'packages/core/src/parsers/syntaxHighlighting/SyntaxHighlighting';
45
import type MetaBindPlugin from 'packages/obsidian/src/main';
@@ -30,6 +31,25 @@ export function registerCm5HLModes(plugin: MetaBindPlugin): void {
3031
return mode;
3132
});
3233

34+
window.CodeMirror.defineMode('meta-bind-js-view', _config => {
35+
const mode: Mode<any> = {
36+
startState: () => {
37+
return javascript.startState?.(4);
38+
},
39+
blankLine: (state: any) => {
40+
return javascript.blankLine?.(state, 4);
41+
},
42+
copyState: (_state: any) => {
43+
return javascript.startState?.(4);
44+
},
45+
token: (stream: any, state: any) => {
46+
return `line-HyperMD-codeblock ${javascript.token?.(stream, state)}`;
47+
},
48+
};
49+
50+
return mode;
51+
});
52+
3353
const codeBlockEndRegexp = /^\s*(```+|~~~+)/;
3454

3555
type MBModeState = {

0 commit comments

Comments
 (0)