From 6fc79c8b47d317296d904107b03979bf3ceb053f Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Thu, 9 Dec 2021 18:17:44 +0900 Subject: [PATCH] initial --- .editorconfig | 9 + .eslintignore | 2 + .eslintrc | 22 +++ .gitignore | 20 +++ README.md | 9 + TagFolderViewComponent.svelte | 33 ++++ TreeItemComponent.svelte | 81 +++++++++ esbuild.config.mjs | 38 ++++ images/screenshot.png | Bin 0 -> 33967 bytes main.ts | 319 ++++++++++++++++++++++++++++++++++ manifest.json | 10 ++ package.json | 28 +++ store.ts | 4 + styles.css | 4 + svelte.config.js | 18 ++ tsconfig.json | 15 ++ types.ts | 13 ++ versions.json | 4 + 18 files changed, 629 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 README.md create mode 100644 TagFolderViewComponent.svelte create mode 100644 TreeItemComponent.svelte create mode 100644 esbuild.config.mjs create mode 100644 images/screenshot.png create mode 100644 main.ts create mode 100644 manifest.json create mode 100644 package.json create mode 100644 store.ts create mode 100644 styles.css create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 types.ts create mode 100644 versions.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c9cfdb3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +# top-most EditorConfig file +root = true + +[*] +charset = utf-8 +insert_final_newline = true +indent_style = tab +indent_size = 4 +tab_width = 4 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..32909b2 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +npm node_modules +build \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..60224a4 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,22 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], + "@typescript-eslint/ban-ts-comment": "off", + "no-prototype-builtins": "off", + "@typescript-eslint/no-empty-function": "off" + } + } \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8981bbe --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# vscode +.vscode + +# Intellij +*.iml +.idea + +# npm +node_modules +package-lock.json + +# Don't include the compiled main.js file in the repo. +# They should be uploaded to GitHub releases instead. +main.js + +# Exclude sourcemaps +*.map + +# obsidian +data.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..72439c3 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +## TagFolder + +This is the plugin that shows your tags as like a folder. + +![screenshot](images/screenshot.png) + +### How to use + +Install this plugin, press `Ctrl+p`, and choose "Show Tag Folder". \ No newline at end of file diff --git a/TagFolderViewComponent.svelte b/TagFolderViewComponent.svelte new file mode 100644 index 0000000..04700f7 --- /dev/null +++ b/TagFolderViewComponent.svelte @@ -0,0 +1,33 @@ + + +
+ + + diff --git a/TreeItemComponent.svelte b/TreeItemComponent.svelte new file mode 100644 index 0000000..a074a26 --- /dev/null +++ b/TreeItemComponent.svelte @@ -0,0 +1,81 @@ + + + + + diff --git a/esbuild.config.mjs b/esbuild.config.mjs new file mode 100644 index 0000000..d7385d3 --- /dev/null +++ b/esbuild.config.mjs @@ -0,0 +1,38 @@ +import esbuild from "esbuild"; +import process from "process"; +import builtins from "builtin-modules"; +import sveltePlugin from "esbuild-svelte"; +import sveltePreprocess from "svelte-preprocess"; + +const banner = `/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ +`; + +const prod = process.argv[2] === "production"; + +esbuild + .build({ + banner: { + js: banner, + }, + entryPoints: ["main.ts"], + bundle: true, + external: ["obsidian", "electron", ...builtins], + format: "cjs", + watch: !prod, + target: "es2016", + logLevel: "info", + sourcemap: prod ? false : "inline", + // sourcemap: false, + treeShaking: true, + plugins: [ + sveltePlugin({ + preprocess: sveltePreprocess(), + compilerOptions: { css: true }, + }), + ], + outfile: "main.js", + }) + .catch(() => process.exit(1)); diff --git a/images/screenshot.png b/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7f29419082fa2aeb86d2dd876f3448ab5b4534 GIT binary patch literal 33967 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 NqK`!i9%}vde*jXIeD?qV literal 0 HcmV?d00001 diff --git a/main.ts b/main.ts new file mode 100644 index 0000000..5a90cbe --- /dev/null +++ b/main.ts @@ -0,0 +1,319 @@ +/// + +import { + App, + CachedMetadata, + debounce, + getAllTags, + Plugin, + PluginSettingTab, + Setting, + TFile, + ItemView, + WorkspaceLeaf, +} from "obsidian"; + +import TagFolderViewComponent from "./TagFolderViewComponent.svelte"; + +import { TreeItem, ViewItem } from "types"; +import { treeRoot } from "store"; + +interface TagFolderSettings { + mySetting: string; +} + +const DEFAULT_SETTINGS: TagFolderSettings = { + mySetting: "default", +}; + +const VIEW_TYPE_TAGFOLDER = "tagfolder-view"; + +class TagFolderView extends ItemView { + component: TagFolderViewComponent; + plugin: TagFolderPlugin; + icon: "stacked-levels"; + getIcon():string{ + return "stacked-levels"; + } + + constructor(leaf: WorkspaceLeaf, plugin: TagFolderPlugin) { + super(leaf); + this.plugin = plugin; + } + + getViewType() { + return VIEW_TYPE_TAGFOLDER; + } + + getDisplayText() { + return "Tag Folder"; + } + + async onOpen() { + this.component = new TagFolderViewComponent({ + target: this.contentEl, + props: { + openfile: this.plugin.focusFile, + }, + }); + this.component.$set({ props: { openFile: this.plugin.focusFile } }); + } + + async onClose() { + this.component.$destroy(); + } + setTreeRoot(root: TreeItem) { + treeRoot.set(root); + } +} + +const sortChildren = ( + a: TreeItem | ViewItem, + b: TreeItem | ViewItem +): number => { + if ("tag" in a && !("tag" in b)) { + return -1; + } else if (!("tag" in a) && !("tag" in b)) { + return 1; + } else { + if ("tag" in a && "tag" in b) { + return a.tag.localeCompare(b.tag); + } else if ("tags" in a && "tags" in b) { + return a.entry.name.localeCompare(b.entry.name); + } else { + return 0; + } + } +}; + +const expandTree = (node: TreeItem, ancestor: string[]) => { + const tree = node.children; + const tags = Array.from( + new Set( + node.children + .filter((e) => "tags" in e) + .map((e) => (e as ViewItem).tags) + .flat() + ) + ); + + for (const tag of tags) { + if (ancestor.contains(tag)) continue; + const newChildrens = node.children.filter( + (e) => "tags" in e && e.tags.contains(tag) + ); + if (tree.find((e) => "tag" in e && e.tag == tag)) { + continue; + } + const newLeaf: TreeItem = { + tag: tag, + children: newChildrens, + }; + tree.push(newLeaf); + expandTree(newLeaf, [...ancestor, tag]); + } + tree.sort(sortChildren); +}; +const splitTag = (entry: TreeItem) => { + for (const v of entry.children) { + if ("tag" in v) { + splitTag(v); + if (v.tag.contains("/")) { + const w = v; + entry.children.remove(w); + const tagsArray = v.tag.split("/"); + const tagCar = tagsArray.shift(); + const tagCdr = tagsArray.join("/"); + const parent = entry.children.find( + (e) => "tag" in e && e.tag == tagCar + ) as TreeItem; + if (!parent) { + // console.log("parent missing, create new!"); + const x: TreeItem = { + tag: tagCar, + children: [{ tag: tagCdr, children: [...v.children] }], + }; + + entry.children.push(x); + splitTag(entry); + } else { + parent.children.push({ + tag: tagCdr, + children: [...v.children], + }); + splitTag(parent); + } + } + } + } + entry.children.sort(sortChildren); +}; + +export default class TagFolderPlugin extends Plugin { + settings: TagFolderSettings; + view: TagFolderView; + readonly focusFile = (path: string): void => { + const targetFile = this.app.vault + .getFiles() + .find((f) => f.path === path); + + if (targetFile) { + let leaf = this.app.workspace.getMostRecentLeaf(); + + const createLeaf = leaf.getViewState().pinned; + if (createLeaf) { + leaf = this.app.workspace.createLeafBySplit(leaf); + } + leaf.openFile(targetFile); + } + }; + async onload() { + await this.loadSettings(); + + this.registerView(VIEW_TYPE_TAGFOLDER, (leaf) => { + this.view = new TagFolderView(leaf, this); + this.loadFileInfo(); + return this.view; + }); + this.app.workspace.onLayoutReady(async () => { + // this.activateView(); + }); + this.addCommand({ + id: "tagfolder-open", + name: "Show Tag Folder", + callback: () => { + this.activateView(); + }, + }); + this.metadataCacheChanged = debounce( + this.metadataCacheChanged.bind(this), + 1000, + false + ); + this.registerEvent( + this.app.metadataCache.on("changed", this.metadataCacheChanged) + ); + + // To prepare. + // this.addSettingTab(new TabFolderSettingTab(this.app, this)); + } + metadataCacheChanged(file: TFile) { + this.loadFileInfo(file); + } + fileCaches: { + file: TFile; + metadata: CachedMetadata; + }[] = []; + + // Sweep updated file or all files to retrive tags. + async loadFileInfo(diff?: TFile) { + if (this.view == null) return; + const files = this.app.vault + .getFiles() + .filter((e) => e.extension == "md"); + if (this.fileCaches.length == 0 || !diff) { + this.fileCaches = files.map((e) => { + return { + file: e, + metadata: this.app.metadataCache.getFileCache(e), + }; + }); + } else { + this.fileCaches = this.fileCaches.filter( + (e) => e.file.path != diff.path + ); + this.fileCaches.push({ + file: diff, + metadata: this.app.metadataCache.getFileCache(diff), + }); + } + + const items: ViewItem[] = []; + for (const f of this.fileCaches) { + let allTags = getAllTags(f.metadata).map((e) => e.substring(1)); + if (allTags.length == 0) { + allTags = ["_orphan"]; + } + + items.push({ tags: allTags, entry: f.file }); + } + const root: TreeItem = { + tag: "root", + children: [...items], + }; + + // Expands subfolders in advance. + expandTree(root, []); + + // Omit orphan items. + root.children = root.children.filter((e) => "tag" in e); + + // Split tag that having slashes. + splitTag(root); + + // sort again. + root.children.sort(sortChildren); + + this.view.setTreeRoot(root); + } + + onunload() { + this.app.workspace.detachLeavesOfType(VIEW_TYPE_TAGFOLDER); + } + async activateView() { + await this.loadFileInfo(); + this.app.workspace.detachLeavesOfType(VIEW_TYPE_TAGFOLDER); + + await this.app.workspace.getLeftLeaf(false).setViewState({ + type: VIEW_TYPE_TAGFOLDER, + active: true, + }); + + this.app.workspace.revealLeaf( + this.app.workspace.getLeavesOfType(VIEW_TYPE_TAGFOLDER)[0] + ); + } + + async loadSettings() { + this.settings = Object.assign( + {}, + DEFAULT_SETTINGS, + await this.loadData() + ); + } + + async saveSettings() { + await this.saveData(this.settings); + } +} + +class TabFolderSettingTab extends PluginSettingTab { + plugin: TagFolderPlugin; + + constructor(app: App, plugin: TagFolderPlugin) { + super(app, plugin); + this.plugin = plugin; + } + + display(): void { + const { containerEl } = this; + + containerEl.empty(); + + containerEl.createEl("h2", { text: "Settings for my awesome plugin." }); + + new Setting(containerEl) + .setName("Setting #1") + .setDesc("It's a secret") + .addText((text) => + text + .setPlaceholder("Enter your secret") + .setValue(this.plugin.settings.mySetting) + .onChange(async (value) => { + console.log("Secret: " + value); + this.plugin.settings.mySetting = value; + await this.plugin.saveSettings(); + }) + ); + } +} diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..624eb5b --- /dev/null +++ b/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-tagfolder", + "name": "TagFolder", + "version": "0.1.0", + "minAppVersion": "0.12.0", + "description": "Show tags as folder", + "author": "vorotamoroz", + "authorUrl": "https://github.com/vrtmrz", + "isDesktopOnly": false +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b0bf667 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "obsidian-tagfolder", + "version": "0.1.0", + "description": "Show tags as folder", + "main": "main.js", + "type": "module", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "node esbuild.config.mjs production" + }, + "keywords": [], + "author": "vorotamoroz", + "license": "MIT", + "devDependencies": { + "@tsconfig/svelte": "^2.0.1", + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "builtin-modules": "^3.2.0", + "esbuild": "0.13.12", + "esbuild-svelte": "^0.6.0", + "obsidian": "^0.12.17", + "svelte": "^3.44.2", + "svelte-preprocess": "^4.9.8", + "tslib": "^2.3.1", + "typescript": "4.4.4" + } +} diff --git a/store.ts b/store.ts new file mode 100644 index 0000000..0ea6614 --- /dev/null +++ b/store.ts @@ -0,0 +1,4 @@ +import { writable } from "svelte/store"; +import { TreeItem } from "types"; + +export const treeRoot = writable(); diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..8c9223c --- /dev/null +++ b/styles.css @@ -0,0 +1,4 @@ +/* Sets all the text color to red! */ +/* body { + color: red; +} */ diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..52c09ef --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,18 @@ +// svelte.config.js +import preprocess from "svelte-preprocess"; + +/** + * This will add autocompletion if you're working with SvelteKit + * + * @type {import('@sveltejs/kit').Config} + */ +const config = { + preprocess: preprocess({ + // ...svelte-preprocess options + }), + cache:false, + compilerOptions: {css: true}, + // ...other svelte options +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e28185e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "module": "ESNext", + "target": "ES6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "types": ["svelte", "node"], + // "importsNotUsedAsValues": "error", + "importHelpers": true, + "lib": ["es2018", "DOM", "ES5", "ES6", "ES7"] + }, + "include": ["**/*.ts"] +} diff --git a/types.ts b/types.ts new file mode 100644 index 0000000..44a3e87 --- /dev/null +++ b/types.ts @@ -0,0 +1,13 @@ +import { TFile } from "obsidian"; + +export interface ViewItem { + tags: string[]; + entry: TFile; +} + +export interface TreeItem { + tag: string; + children: Array; +} + +export type TagFolderItem = TreeItem | ViewItem; diff --git a/versions.json b/versions.json new file mode 100644 index 0000000..be42d9f --- /dev/null +++ b/versions.json @@ -0,0 +1,4 @@ +{ + "1.0.1": "0.9.12", + "1.0.0": "0.9.7" +}