From 01196da3b73453bf1146626a7e81ddecfabc9503 Mon Sep 17 00:00:00 2001 From: kitelev Date: Sat, 4 Jan 2025 00:38:31 +0500 Subject: [PATCH] Add Area layout --- app/src/ExoMainModal.ts | 10 +--- .../{ => commands}/CountNotesExoCommand.ts | 2 +- .../{ => commands}/CreateEffortExoCommand.ts | 6 +-- .../CreateEmptyNoteWithinInboxExoCommand.ts | 2 +- .../input/{ => commands}/ExoCommand.ts | 2 +- .../input/{ => commands}/ExoCommands.ts | 2 +- .../GetActiveFileTagsExoCommand.ts | 2 +- .../{ => commands}/GetCurrentKOCExoCommand.ts | 2 +- .../OpenCurrentDailyNoteExoCommand.ts | 4 +- .../OpenRandomNoteExoCommand.ts | 2 +- app/src/adapters/input/layouts/AreaLayout.ts | 46 +++++++++++++++++++ app/src/adapters/input/layouts/Layout.ts | 3 ++ .../adapters/input/layouts/LayoutFactory.ts | 19 ++++++++ .../output/EffortPersistenceAdapter.ts | 15 ++++++ app/src/utils/AreaCreator.ts | 24 ++++++++++ app/src/utils/EffortCreator.ts | 38 +++++++++++++++ app/src/utils/KOCFactory.ts | 17 +++++++ app/src/utils/KObjectCreator.ts | 19 +++----- common/ExoContext.ts | 11 +++++ core/src/domain/effort/Effort.ts | 8 ++++ core/src/ports/output/EffortRepository.ts | 2 + main.ts | 21 ++++++++- 22 files changed, 223 insertions(+), 34 deletions(-) rename app/src/adapters/input/{ => commands}/CountNotesExoCommand.ts (80%) rename app/src/adapters/input/{ => commands}/CreateEffortExoCommand.ts (79%) rename app/src/adapters/input/{ => commands}/CreateEmptyNoteWithinInboxExoCommand.ts (87%) rename app/src/adapters/input/{ => commands}/ExoCommand.ts (65%) rename app/src/adapters/input/{ => commands}/ExoCommands.ts (94%) rename app/src/adapters/input/{ => commands}/GetActiveFileTagsExoCommand.ts (89%) rename app/src/adapters/input/{ => commands}/GetCurrentKOCExoCommand.ts (88%) rename app/src/adapters/input/{ => commands}/OpenCurrentDailyNoteExoCommand.ts (75%) rename app/src/adapters/input/{ => commands}/OpenRandomNoteExoCommand.ts (94%) create mode 100644 app/src/adapters/input/layouts/AreaLayout.ts create mode 100644 app/src/adapters/input/layouts/Layout.ts create mode 100644 app/src/adapters/input/layouts/LayoutFactory.ts create mode 100644 app/src/utils/AreaCreator.ts create mode 100644 app/src/utils/EffortCreator.ts create mode 100644 app/src/utils/KOCFactory.ts diff --git a/app/src/ExoMainModal.ts b/app/src/ExoMainModal.ts index 09e0a65..c78df91 100644 --- a/app/src/ExoMainModal.ts +++ b/app/src/ExoMainModal.ts @@ -1,6 +1,6 @@ import {FuzzySuggestModal, Notice} from "obsidian"; -import ExoCommand from "./adapters/input/ExoCommand"; -import ExoCommands from "./adapters/input/ExoCommands"; +import ExoCommand from "./adapters/input/commands/ExoCommand"; +import ExoCommands from "./adapters/input/commands/ExoCommands"; import ExoContext from "../../common/ExoContext"; export class ExoMainModal extends FuzzySuggestModal { @@ -18,17 +18,11 @@ export class ExoMainModal extends FuzzySuggestModal { } async onChooseItem(cmd: ExoCommand) { - const startTime = performance.now(); try { - // console.log(`Executing command ${cmd.name}`); await cmd.execute(this.ctx); - // console.log(`Command ${cmd.name} executed`); } catch (e) { console.error(e); new Notice(`Error: ${e.message}`); - } finally { - const endTime = performance.now(); - // console.log(`Execution time for command ${cmd.name}: ${endTime - startTime} ms`); } } } diff --git a/app/src/adapters/input/CountNotesExoCommand.ts b/app/src/adapters/input/commands/CountNotesExoCommand.ts similarity index 80% rename from app/src/adapters/input/CountNotesExoCommand.ts rename to app/src/adapters/input/commands/CountNotesExoCommand.ts index 058606d..a04569f 100644 --- a/app/src/adapters/input/CountNotesExoCommand.ts +++ b/app/src/adapters/input/commands/CountNotesExoCommand.ts @@ -1,6 +1,6 @@ import ExoCommand from "./ExoCommand"; import {Notice} from "obsidian"; -import CountNotesUseCase from "../../../../core/src/ports/input/CountNotesUseCase"; +import CountNotesUseCase from "../../../../../core/src/ports/input/CountNotesUseCase"; export default class CountNotesExoCommand implements ExoCommand { name = "Notes Count"; diff --git a/app/src/adapters/input/CreateEffortExoCommand.ts b/app/src/adapters/input/commands/CreateEffortExoCommand.ts similarity index 79% rename from app/src/adapters/input/CreateEffortExoCommand.ts rename to app/src/adapters/input/commands/CreateEffortExoCommand.ts index 226226e..d3dfddc 100644 --- a/app/src/adapters/input/CreateEffortExoCommand.ts +++ b/app/src/adapters/input/commands/CreateEffortExoCommand.ts @@ -1,7 +1,7 @@ import ExoCommand from "./ExoCommand"; -import ExoContext from "../../../../common/ExoContext"; -import Area from "../../../../core/src/domain/Area"; -import Effort from "../../../../core/src/domain/effort/Effort"; +import ExoContext from "../../../../../common/ExoContext"; +import Area from "../../../../../core/src/domain/Area"; +import Effort from "../../../../../core/src/domain/effort/Effort"; export default class CreateEffortExoCommand implements ExoCommand { name = "Create Effort"; diff --git a/app/src/adapters/input/CreateEmptyNoteWithinInboxExoCommand.ts b/app/src/adapters/input/commands/CreateEmptyNoteWithinInboxExoCommand.ts similarity index 87% rename from app/src/adapters/input/CreateEmptyNoteWithinInboxExoCommand.ts rename to app/src/adapters/input/commands/CreateEmptyNoteWithinInboxExoCommand.ts index bf70894..b3c55f8 100644 --- a/app/src/adapters/input/CreateEmptyNoteWithinInboxExoCommand.ts +++ b/app/src/adapters/input/commands/CreateEmptyNoteWithinInboxExoCommand.ts @@ -1,5 +1,5 @@ import ExoCommand from "./ExoCommand"; -import ExoContext from "../../../../common/ExoContext"; +import ExoContext from "../../../../../common/ExoContext"; export default class CreateEmptyNoteWithinInboxExoCommand implements ExoCommand { name = "Create Effort Within Inbox"; diff --git a/app/src/adapters/input/ExoCommand.ts b/app/src/adapters/input/commands/ExoCommand.ts similarity index 65% rename from app/src/adapters/input/ExoCommand.ts rename to app/src/adapters/input/commands/ExoCommand.ts index 87dc0fc..369a74e 100644 --- a/app/src/adapters/input/ExoCommand.ts +++ b/app/src/adapters/input/commands/ExoCommand.ts @@ -1,4 +1,4 @@ -import ExoContext from "../../../../common/ExoContext"; +import ExoContext from "../../../../../common/ExoContext"; export default interface ExoCommand { name: string; diff --git a/app/src/adapters/input/ExoCommands.ts b/app/src/adapters/input/commands/ExoCommands.ts similarity index 94% rename from app/src/adapters/input/ExoCommands.ts rename to app/src/adapters/input/commands/ExoCommands.ts index 5cf50d7..d19cdeb 100644 --- a/app/src/adapters/input/ExoCommands.ts +++ b/app/src/adapters/input/commands/ExoCommands.ts @@ -5,7 +5,7 @@ import CreateEmptyNoteWithinInboxExoCommand from "./CreateEmptyNoteWithinInboxEx import GetActiveFileTagsExoCommand from "./GetActiveFileTagsExoCommand"; import GetCurrentKOCExoCommand from "./GetCurrentKOCExoCommand"; import OpenCurrentDailyNoteExoCommand from "./OpenCurrentDailyNoteExoCommand"; -import ExoContext from "../../../../common/ExoContext"; +import ExoContext from "../../../../../common/ExoContext"; import CreateEffortExoCommand from "./CreateEffortExoCommand"; export default class ExoCommands { diff --git a/app/src/adapters/input/GetActiveFileTagsExoCommand.ts b/app/src/adapters/input/commands/GetActiveFileTagsExoCommand.ts similarity index 89% rename from app/src/adapters/input/GetActiveFileTagsExoCommand.ts rename to app/src/adapters/input/commands/GetActiveFileTagsExoCommand.ts index 3d02a4a..0a1eecd 100644 --- a/app/src/adapters/input/GetActiveFileTagsExoCommand.ts +++ b/app/src/adapters/input/commands/GetActiveFileTagsExoCommand.ts @@ -1,6 +1,6 @@ import ExoCommand from "./ExoCommand"; import {Notice} from "obsidian"; -import ExoContext from "../../../../common/ExoContext"; +import ExoContext from "../../../../../common/ExoContext"; export default class GetActiveFileTagsExoCommand implements ExoCommand { name = "Get Active File Tags"; diff --git a/app/src/adapters/input/GetCurrentKOCExoCommand.ts b/app/src/adapters/input/commands/GetCurrentKOCExoCommand.ts similarity index 88% rename from app/src/adapters/input/GetCurrentKOCExoCommand.ts rename to app/src/adapters/input/commands/GetCurrentKOCExoCommand.ts index e230fda..8a0bad5 100644 --- a/app/src/adapters/input/GetCurrentKOCExoCommand.ts +++ b/app/src/adapters/input/commands/GetCurrentKOCExoCommand.ts @@ -1,6 +1,6 @@ import ExoCommand from "./ExoCommand"; import {Notice} from "obsidian"; -import ExoContext from "../../../../common/ExoContext"; +import ExoContext from "../../../../../common/ExoContext"; export default class GetCurrentKOCExoCommand implements ExoCommand { name = "Get Current KOC"; diff --git a/app/src/adapters/input/OpenCurrentDailyNoteExoCommand.ts b/app/src/adapters/input/commands/OpenCurrentDailyNoteExoCommand.ts similarity index 75% rename from app/src/adapters/input/OpenCurrentDailyNoteExoCommand.ts rename to app/src/adapters/input/commands/OpenCurrentDailyNoteExoCommand.ts index 971ea63..86e3634 100644 --- a/app/src/adapters/input/OpenCurrentDailyNoteExoCommand.ts +++ b/app/src/adapters/input/commands/OpenCurrentDailyNoteExoCommand.ts @@ -1,6 +1,6 @@ import ExoCommand from "./ExoCommand"; -import ExoContext from "../../../../common/ExoContext"; -import GetCurrentDailyNoteUseCase from "../../../../core/src/ports/input/GetCurrentDailyNoteUseCase"; +import ExoContext from "../../../../../common/ExoContext"; +import GetCurrentDailyNoteUseCase from "../../../../../core/src/ports/input/GetCurrentDailyNoteUseCase"; export default class OpenCurrentDailyNoteExoCommand implements ExoCommand { name = "Open Current Daily Note"; diff --git a/app/src/adapters/input/OpenRandomNoteExoCommand.ts b/app/src/adapters/input/commands/OpenRandomNoteExoCommand.ts similarity index 94% rename from app/src/adapters/input/OpenRandomNoteExoCommand.ts rename to app/src/adapters/input/commands/OpenRandomNoteExoCommand.ts index 42bed39..7b6ef6f 100644 --- a/app/src/adapters/input/OpenRandomNoteExoCommand.ts +++ b/app/src/adapters/input/commands/OpenRandomNoteExoCommand.ts @@ -1,6 +1,6 @@ import ExoCommand from "./ExoCommand"; import {Notice} from "obsidian"; -import ExoContext from "../../../../common/ExoContext"; +import ExoContext from "../../../../../common/ExoContext"; export default class OpenRandomNoteExoCommand implements ExoCommand { name = "Рандомная заметка из прошлого"; diff --git a/app/src/adapters/input/layouts/AreaLayout.ts b/app/src/adapters/input/layouts/AreaLayout.ts new file mode 100644 index 0000000..c0366fb --- /dev/null +++ b/app/src/adapters/input/layouts/AreaLayout.ts @@ -0,0 +1,46 @@ +import Layout from "./Layout"; +import ExoContext from "../../../../../common/ExoContext"; +import Area from "../../../../../core/src/domain/Area"; + +export default class AreaLayout implements Layout { + constructor(private ctx: ExoContext) { + } + + async render(ko: Area): Promise { + const renderText = document.createElement("div"); + + const unresolvedEfforts = await this.ctx.effortRepository.find(e => { + if (e.area === null) { + return false; + } + const sameArea = e.area.id == ko.id; + const unresolved = e.isUnresolved(); + return sameArea && unresolved; + }); + + if (unresolvedEfforts.length > 0) { + let h1 = document.createElement("h1"); + h1.textContent = "Unresolved Efforts"; + renderText.appendChild(h1); + + let table = document.createElement("table"); + renderText.appendChild(table); + + const headerRow = document.createElement("tr"); + const th = document.createElement("th"); + th.innerText = "Name"; + headerRow.appendChild(th); + table.appendChild(headerRow); + + for (let effort of unresolvedEfforts) { + const tr = document.createElement("tr"); + let td = document.createElement("td"); + td.textContent = "[[" + effort.title + "]]"; + tr.appendChild(td); + table.appendChild(tr); + } + } + + return renderText; + } +} diff --git a/app/src/adapters/input/layouts/Layout.ts b/app/src/adapters/input/layouts/Layout.ts new file mode 100644 index 0000000..cd31658 --- /dev/null +++ b/app/src/adapters/input/layouts/Layout.ts @@ -0,0 +1,3 @@ +export default interface Layout { + render(ko: KO): Promise; +} diff --git a/app/src/adapters/input/layouts/LayoutFactory.ts b/app/src/adapters/input/layouts/LayoutFactory.ts new file mode 100644 index 0000000..9486f6d --- /dev/null +++ b/app/src/adapters/input/layouts/LayoutFactory.ts @@ -0,0 +1,19 @@ +import AreaLayout from "./AreaLayout"; +import {KOC} from "../../../../../core/src/domain/KOC"; +import ExoContext from "../../../../../common/ExoContext"; +import KObject from "../../../../../core/src/domain/KObject"; +import Layout from "./Layout"; + +export default class LayoutFactory { + constructor(private ctx: ExoContext) { + } + + create(ko: KObject): Layout | null { + switch (ko.koc) { + case KOC.EMS_AREA: + return new AreaLayout(this.ctx); + default: + return null; + } + } +} diff --git a/app/src/adapters/output/EffortPersistenceAdapter.ts b/app/src/adapters/output/EffortPersistenceAdapter.ts index 77da37d..c8e5369 100644 --- a/app/src/adapters/output/EffortPersistenceAdapter.ts +++ b/app/src/adapters/output/EffortPersistenceAdapter.ts @@ -2,6 +2,7 @@ import EffortRepository from "../../../../core/src/ports/output/EffortRepository import Effort from "../../../../core/src/domain/effort/Effort"; import ExoContext from "../../../../common/ExoContext"; import Area from "../../../../core/src/domain/Area"; +import {TFile} from "obsidian"; export default class EffortPersistenceAdapter implements EffortRepository { constructor(private ctx: ExoContext) { @@ -21,6 +22,20 @@ export default class EffortPersistenceAdapter implements EffortRepository { await this.ctx.appUtils.updateFile(file, data); } + async find(filter: (e: Effort) => boolean): Promise { + let all = await this.findAll(); + return all.filter(filter); + } + + async findAll(): Promise { + const rawEfforts: TFile[] = this.ctx.appUtils.findMdWith((f: TFile) => { + return this.ctx.appUtils.getTagsFromFile(f).includes("EMS/Effort"); + }); + + let promises = rawEfforts.map(async f => await this.ctx.kObjectCreator.createFromTFileTyped(f) as Effort); + return await Promise.all(promises); + } + private serializeData(effort: Effort) { let result = ""; result += "---\n"; diff --git a/app/src/utils/AreaCreator.ts b/app/src/utils/AreaCreator.ts new file mode 100644 index 0000000..3035f2d --- /dev/null +++ b/app/src/utils/AreaCreator.ts @@ -0,0 +1,24 @@ +import AppUtils from "./AppUtils"; +import {TFile} from "obsidian"; +import Area from "../../../core/src/domain/Area"; +import {UUID} from "node:crypto"; + +export default class AreaCreator { + constructor(private appUtils: AppUtils) { + } + + async create(file: TFile): Promise { + const koProperties = this.appUtils.getFrontmatterOrThrow(file); + + const id: UUID = koProperties["uid"] as UUID; + + let parentArea: Area | null = null; + const parentStr: string = koProperties["a-parent"]; + if (parentStr) { + const file = this.appUtils.getTFileFromStrLink(parentStr); + parentArea = await this.create(file); + } + + return new Area(id, file.name.replace(".md", ""), parentArea) + } +} diff --git a/app/src/utils/EffortCreator.ts b/app/src/utils/EffortCreator.ts new file mode 100644 index 0000000..f018fbf --- /dev/null +++ b/app/src/utils/EffortCreator.ts @@ -0,0 +1,38 @@ +import AppUtils from "./AppUtils"; +import {TFile} from "obsidian"; +import {UUID} from "node:crypto"; +import Effort from "../../../core/src/domain/effort/Effort"; +import {EffortStatus} from "../../../core/src/domain/effort/EffortStatus"; +import Area from "../../../core/src/domain/Area"; +import AreaCreator from "./AreaCreator"; + +export default class EffortCreator { + constructor(private appUtils: AppUtils, private areaCreator: AreaCreator) { + } + + async create(file: TFile): Promise { + const koProperties = this.appUtils.getFrontmatterOrThrow(file); + + const id: UUID = koProperties["uid"] as UUID; + const status: EffortStatus = koProperties["e-status"] as EffortStatus; + const started: Date | null = koProperties["started"] ? koProperties["started"] as Date : null; + const ended: Date | null = koProperties["ended"] ? koProperties["ended"] as Date : null; + + let area: Area | null = null; + const areaStr: string = koProperties["area"]; + if (areaStr) { + const file = this.appUtils.getTFileFromStrLink(areaStr); + area = await this.areaCreator.create(file); + } + + let parent: Effort | null = null; + const parentStr: string = koProperties["e-parent"]; + if (parentStr) { + const file = this.appUtils.getTFileFromStrLink(parentStr); + parent = await this.create(file); + } + + const body: string = await this.appUtils.getFileBody(file); + return new Effort(id, file.name.replace(".md", ""), status, started, ended, area, parent, body); + } +} diff --git a/app/src/utils/KOCFactory.ts b/app/src/utils/KOCFactory.ts new file mode 100644 index 0000000..f534c87 --- /dev/null +++ b/app/src/utils/KOCFactory.ts @@ -0,0 +1,17 @@ +import {KOC} from "../../../core/src/domain/KOC"; + +export default class KOCFactory { + static create(tags: string[]) { + if (tags.includes("IMS/MOC")) { + return KOC.IMS_MOC + } else if (tags.includes("EMS/Area")) { + return KOC.EMS_AREA; + } else if (tags.includes("EMS/Effort")) { + return KOC.EMS_EFFORT; + } else if (tags.includes("TMS/DailyNote")) { + return KOC.TMS_DN; + } else { + return KOC.UNKNOWN; + } + } +} diff --git a/app/src/utils/KObjectCreator.ts b/app/src/utils/KObjectCreator.ts index 45cebbf..36afdd9 100644 --- a/app/src/utils/KObjectCreator.ts +++ b/app/src/utils/KObjectCreator.ts @@ -6,6 +6,7 @@ import Area from "../../../core/src/domain/Area"; import {UUID} from "node:crypto"; import Effort from "../../../core/src/domain/effort/Effort"; import {EffortStatus} from "../../../core/src/domain/effort/EffortStatus"; +import KOCFactory from "./KOCFactory"; export default class KObjectCreator { constructor(private appUtils: AppUtils) { @@ -45,6 +46,9 @@ export default class KObjectCreator { return new Area(id, file.name.replace(".md", ""), parentArea) } + /** + * @deprecated + */ async createEffort(file: TFile): Promise { const koProperties = this.appUtils.getFrontmatterOrThrow(file); @@ -63,7 +67,7 @@ export default class KObjectCreator { let parent: Effort | null = null; const parentStr: string = koProperties["e-parent"]; if (parentStr) { - const file = this.appUtils.getTFileFromStrLink(areaStr); + const file = this.appUtils.getTFileFromStrLink(parentStr); parent = await this.createEffort(file); } @@ -73,17 +77,6 @@ export default class KObjectCreator { getFileKoc(file: TFile): KOC { const tags = this.appUtils.getTagsFromFile(file); - - if (tags.includes("IMS/MOC")) { - return KOC.IMS_MOC - } else if (tags.includes("EMS/Area")) { - return KOC.EMS_AREA; - } else if (tags.includes("EMS/Effort")) { - return KOC.EMS_EFFORT; - } else if (tags.includes("TMS/DailyNote")) { - return KOC.TMS_DN; - } else { - return KOC.UNKNOWN; - } + return KOCFactory.create(tags); } } diff --git a/common/ExoContext.ts b/common/ExoContext.ts index 6acc5cf..8012561 100644 --- a/common/ExoContext.ts +++ b/common/ExoContext.ts @@ -15,15 +15,21 @@ import EffortRepository from "../core/src/ports/output/EffortRepository"; import EffortPersistenceAdapter from "../app/src/adapters/output/EffortPersistenceAdapter"; import KObjectUtility from "../app/src/utils/KObjectUtility"; import EffortPathRulesHelper from "../app/src/helpers/EffortPathRulesHelper"; +import EffortCreator from "../app/src/utils/EffortCreator"; +import AreaCreator from "../app/src/utils/AreaCreator"; +import LayoutFactory from "../app/src/adapters/input/layouts/LayoutFactory"; export default class ExoContext { public readonly utils: Utils; public readonly kObjectCreator: KObjectCreator public readonly dailyNoteCreator: DailyNoteCreator; + public readonly areaCreator: AreaCreator; + public readonly effortCreator: EffortCreator; public readonly dailyNoteRepository: DailyNoteRepository; public readonly kObjectUtility: KObjectUtility; public readonly appUtils: AppUtils; + public readonly layoutFactory: LayoutFactory; public readonly countNotesUseCase: CountNotesUseCase; public readonly getCurrentDNUseCase: GetCurrentDailyNoteUseCase; @@ -34,8 +40,13 @@ export default class ExoContext { constructor(public app: App) { this.utils = new Utils(this.app); this.appUtils = new AppUtils(this.app); + this.layoutFactory = new LayoutFactory(this); + this.kObjectCreator = new KObjectCreator(this.appUtils); this.dailyNoteCreator = new DailyNoteCreator(this.appUtils); + this.areaCreator = new AreaCreator(this.appUtils); + this.effortCreator = new EffortCreator(this.appUtils, this.areaCreator); + this.dailyNoteRepository = new DailyNotePersistenceAdapter(this.appUtils, this.dailyNoteCreator); this.kObjectUtility = new KObjectUtility(this); diff --git a/core/src/domain/effort/Effort.ts b/core/src/domain/effort/Effort.ts index 87c2869..fab996c 100644 --- a/core/src/domain/effort/Effort.ts +++ b/core/src/domain/effort/Effort.ts @@ -25,4 +25,12 @@ export default class Effort extends KObject { this.ended = new Date(); this.status = EffortStatus.ENDED; } + + isResolved(): boolean { + return this.status === EffortStatus.ENDED || this.status === EffortStatus.TRASHED; + } + + isUnresolved(): boolean { + return !this.isResolved(); + } } diff --git a/core/src/ports/output/EffortRepository.ts b/core/src/ports/output/EffortRepository.ts index 3583fff..be296de 100644 --- a/core/src/ports/output/EffortRepository.ts +++ b/core/src/ports/output/EffortRepository.ts @@ -2,4 +2,6 @@ import Effort from "../../domain/effort/Effort"; export default interface EffortRepository { save(effort: Effort): Promise; + + find(filter: (e: Effort) => boolean): Promise; } diff --git a/main.ts b/main.ts index 9e399f6..812d050 100644 --- a/main.ts +++ b/main.ts @@ -1,4 +1,4 @@ -import {Plugin} from 'obsidian'; +import {Plugin, TFile} from 'obsidian'; import {ExoMainModal} from "./app/src/ExoMainModal"; import "localforage"; import ExoApi from "./core/src/ExoApi"; @@ -15,5 +15,24 @@ export default class ExoPlugin extends Plugin { this.addRibbonIcon('star', 'Exocortex commands List', () => { new ExoMainModal(this.ctx).open(); }); + + this.registerMarkdownPostProcessor(async (el, ctx) => { + if (!ctx.frontmatter || !ctx.frontmatter.tags) { + return; + } + + if (el.classList.contains("mod-ui")) { + const file: TFile = this.ctx.appUtils.getFileByPathOrThrow(ctx.sourcePath); + console.log(file) + const ko = await this.ctx.kObjectCreator.createFromTFileTyped(file); + const layout = this.ctx.layoutFactory.create(ko); + if (!layout) { + return; + } + + const renderText = await layout.render(ko); + el.prepend(renderText); + } + }); } }