diff --git a/plugins/plugin-md-power/src/client/components/FileTreeItem.vue b/plugins/plugin-md-power/src/client/components/FileTreeItem.vue index 34dbc433..6e0e319f 100644 --- a/plugins/plugin-md-power/src/client/components/FileTreeItem.vue +++ b/plugins/plugin-md-power/src/client/components/FileTreeItem.vue @@ -10,7 +10,10 @@ const props = defineProps<{ const active = ref(!!props.expanded) const el = ref() -function toggle() { +function toggle(e: HTMLElementEventMap['click']) { + const target = e.target as HTMLElement + if (target.matches('.comment')) + return active.value = !active.value } @@ -18,14 +21,20 @@ onMounted(() => { if (!el.value || props.type !== 'folder') return - el.value.querySelector('.tree-node.folder')?.addEventListener('click', toggle) + el.value.querySelector('.tree-node.folder')?.addEventListener( + 'click', + toggle as EventListener, + ) }) onUnmounted(() => { if (!el.value || props.type !== 'folder') return - el.value.querySelector('.tree-node.folder')?.removeEventListener('click', toggle) + el.value.querySelector('.tree-node.folder')?.removeEventListener( + 'click', + toggle as EventListener, + ) }) @@ -114,6 +123,7 @@ onUnmounted(() => { width: 10px; height: 10px; color: var(--vp-c-text-3); + cursor: pointer; content: ""; background-color: currentcolor; -webkit-mask: var(--icon) no-repeat; @@ -124,9 +134,19 @@ onUnmounted(() => { } .file-tree-item .tree-node .name.focus { + position: relative; + padding: 0 4px; + margin: 0 -4px; font-weight: bold; - color: var(--vp-c-brand-1); - transition: color var(--t-color); + color: var(--vp-c-bg); + background-color: var(--vp-c-brand-2); + border-radius: 4px; + transition: color var(--t-color), background-color var(--t-color); +} + +.file-tree-item .tree-node .name.focus:hover { + color: var(--vp-c-bg); + background-color: var(--vp-c-brand-1); } .file-tree-item .tree-node .comment { @@ -136,19 +156,13 @@ onUnmounted(() => { transition: color var(--t-color); } -.file-tree-item .tree-node [class*="vp-fti-"] { - display: inline-block; - width: 0.9em; - height: 0.9em; - color: var(--vp-c-text-2); - background-color: currentcolor; - -webkit-mask: var(--icon) no-repeat; - mask: var(--icon) no-repeat; - -webkit-mask-size: 100% 100%; - mask-size: 100% 100%; +.file-tree-item .tree-node [class*="vpi-"] { + width: 1.2em; + height: 1.2em; + margin: 0; } -.file-tree-item .tree-node.folder [class*="vp-fti-"] { +.file-tree-item .tree-node.folder [class*="vpi-"] { cursor: pointer; } diff --git a/plugins/plugin-md-power/src/node/features/fileTree/definitions.ts b/plugins/plugin-md-power/src/node/features/fileTree/definitions.ts new file mode 100644 index 00000000..55361583 --- /dev/null +++ b/plugins/plugin-md-power/src/node/features/fileTree/definitions.ts @@ -0,0 +1,604 @@ +export interface Definitions { + named: Record + folders: Record + files: Record + extensions: Record + partials: Record +} + +export const defaultFolder = 'vscode-icons:default-folder' +export const defaultFile = 'vscode-icons:default-file' + +export const definitions: Definitions = { + named: { + // package manager + pnpm: 'vscode-icons:file-type-light-pnpm', + PNPM: 'vscode-icons:file-type-light-pnpm', + npm: 'vscode-icons:file-type-npm', + NPM: 'vscode-icons:file-type-npm', + yarn: 'vscode-icons:file-type-yarn', + Yarn: 'vscode-icons:file-type-yarn', + bun: 'vscode-icons:file-type-bun', + Bun: 'vscode-icons:file-type-bun', + deno: 'vscode-icons:file-type-light-deno', + Deno: 'vscode-icons:file-type-light-deno', + // bundlers + rollup: 'vscode-icons:file-type-rollup', + Rollup: 'vscode-icons:file-type-rollup', + webpack: 'vscode-icons:file-type-webpack', + Webpack: 'vscode-icons:file-type-webpack', + vite: 'vscode-icons:file-type-vite', + Vite: 'vscode-icons:file-type-vite', + esbuild: 'vscode-icons:file-type-esbuild', + Esbuild: 'vscode-icons:file-type-esbuild', + // frameworks + vue: 'vscode-icons:file-type-vue', + Vue: 'vscode-icons:file-type-vue', + svelte: 'vscode-icons:file-type-svelte', + sveltekit: 'vscode-icons:file-type-svelte', + angular: 'vscode-icons:file-type-angular', + Angular: 'vscode-icons:file-type-angular', + react: 'vscode-icons:file-type-reactjs', + React: 'vscode-icons:file-type-reactjs', + next: 'vscode-icons:file-type-light-next', + Next: 'vscode-icons:file-type-light-next', + Nextjs: 'vscode-icons:file-type-light-next', + NextJS: 'vscode-icons:file-type-light-next', + nuxt: 'vscode-icons:file-type-nuxt', + Nuxt: 'vscode-icons:file-type-nuxt', + Nuxtjs: 'vscode-icons:file-type-nuxt', + NuxtJS: 'vscode-icons:file-type-nuxt', + solid: 'logos:solidjs-icon', + Solid: 'logos:solidjs-icon', + solidjs: 'logos:solidjs-icon', + astro: 'vscode-icons:file-type-light-astro', + Astro: 'vscode-icons:file-type-light-astro', + + // TODO: code group title icons + // programming languages + html: 'vscode-icons:file-type-html', + HTML: 'vscode-icons:file-type-html', + java: 'vscode-icons:file-type-java', + Java: 'vscode-icons:file-type-java', + JAVA: 'vscode-icons:file-type-java', + php: 'vscode-icons:file-type-php3', + PHP: 'vscode-icons:file-type-php3', + c: 'vscode-icons:file-type-c', + C: 'vscode-icons:file-type-c', + python: 'vscode-icons:file-type-python', + Python: 'vscode-icons:file-type-python', + }, + folders: { + 'default': 'vscode-icons:default-folder', + 'src': 'vscode-icons:folder-type-src', + 'dist': 'vscode-icons:folder-type-dist', + 'docs': 'vscode-icons:folder-type-docs', + 'scripts': 'vscode-icons:folder-type-script', + 'shared': 'vscode-icons:folder-type-shared', + 'cli': 'vscode-icons:folder-type-cli', + 'tauri-src': 'vscode-icons:folder-type-tauri', + 'template': 'vscode-icons:folder-type-template', + 'templates': 'vscode-icons:folder-type-template', + 'theme': 'vscode-icons:folder-type-theme', + 'themes': 'vscode-icons:folder-type-theme', + 'packages': 'vscode-icons:folder-type-package', + 'tools': 'vscode-icons:folder-type-tools', + 'utils': 'vscode-icons:folder-type-tools', + 'helper': 'vscode-icons:folder-type-helper', + 'helpers': 'vscode-icons:folder-type-helper', + + 'component': 'vscode-icons:folder-type-component', + 'components': 'vscode-icons:folder-type-component', + 'Component': 'vscode-icons:folder-type-component', + 'Components': 'vscode-icons:folder-type-component', + + 'hooks': 'vscode-icons:folder-type-hook', + 'composables': 'vscode-icons:folder-type-hook', + + 'public': 'vscode-icons:folder-type-public', + 'fonts': 'vscode-icons:folder-type-fonts', + 'images': 'vscode-icons:folder-type-images', + 'apis': 'vscode-icons:folder-type-api', + 'style': 'vscode-icons:folder-type-style', + 'styles': 'vscode-icons:folder-type-style', + 'css': 'vscode-icons:folder-type-css', + 'scss': 'vscode-icons:folder-type-light-sass', + 'sass': 'vscode-icons:folder-type-light-sass', + 'less': 'vscode-icons:folder-type-less', + + 'plugin': 'vscode-icons:folder-type-plugin', + 'plugins': 'vscode-icons:folder-type-plugin', + 'typings': 'vscode-icons:folder-type-typings', + 'types': 'vscode-icons:folder-type-typings', + 'mock': 'vscode-icons:folder-type-mock', + + 'locales': 'vscode-icons:folder-type-locale', + 'locale': 'vscode-icons:folder-type-locale', + 'langs': 'vscode-icons:folder-type-locale', + 'languages': 'vscode-icons:folder-type-locale', + + 'config': 'vscode-icons:folder-type-config', + 'configs': 'vscode-icons:folder-type-config', + '.config': 'vscode-icons:folder-type-config', + '.configs': 'vscode-icons:folder-type-config', + + 'controller': 'vscode-icons:folder-type-controller', + 'controllers': 'vscode-icons:folder-type-controller', + 'Controller': 'vscode-icons:folder-type-controller', + 'Controllers': 'vscode-icons:folder-type-controller', + 'model': 'vscode-icons:folder-type-model', + 'models': 'vscode-icons:folder-type-model', + 'Model': 'vscode-icons:folder-type-model', + 'Models': 'vscode-icons:folder-type-model', + 'service': 'vscode-icons:folder-type-services', + 'services': 'vscode-icons:folder-type-services', + 'Service': 'vscode-icons:folder-type-services', + 'Services': 'vscode-icons:folder-type-services', + 'view': 'vscode-icons:folder-type-view', + 'views': 'vscode-icons:folder-type-view', + 'View': 'vscode-icons:folder-type-view', + 'Views': 'vscode-icons:folder-type-view', + + 'db': 'vscode-icons:folder-type-db', + 'database': 'vscode-icons:folder-type-db', + + 'e2e': 'vscode-icons:folder-type-e2e', + 'cypress': 'vscode-icons:folder-type-light-cypress', + 'test': 'vscode-icons:folder-type-test', + + '.git': 'vscode-icons:folder-type-git', + '.github': 'vscode-icons:folder-type-github', + '.gitlab': 'vscode-icons:folder-type-gitlab', + '.vscode': 'vscode-icons:folder-type-vscode', + '.husky': 'vscode-icons:folder-type-husky', + '.idea': 'vscode-icons:folder-type-idea', + }, + files: { + 'package.json': 'vscode-icons:file-type-node', + 'pnpm-debug.log': 'vscode-icons:file-type-light-pnpm', + 'pnpm-lock.yaml': 'vscode-icons:file-type-light-pnpm', + 'pnpm-workspace.yaml': 'vscode-icons:file-type-light-pnpm', + 'biome.json': 'vscode-icons:file-type-biome', + 'bun.lockb': 'vscode-icons:file-type-bun', + 'COMMIT_EDITMSG': 'vscode-icons:file-type-git', + 'MERGE_MSG': 'vscode-icons:file-type-git', + 'karma.conf.js': 'vscode-icons:file-type-karma', + 'karma.conf.cjs': 'vscode-icons:file-type-karma', + 'karma.conf.mjs': 'vscode-icons:file-type-karma', + 'karma.conf.coffee': 'vscode-icons:file-type-karma', + 'README.md': 'flat-color-icons:info', + 'README.txt': 'flat-color-icons:info', + 'README': 'flat-color-icons:info', + 'CHANGELOG.md': 'catppuccin:changelog', + 'CHANGELOG.txt': 'catppuccin:changelog', + 'CHANGELOG': 'catppuccin:changelog', + 'CHANGES.md': 'catppuccin:changelog', + 'CHANGES.txt': 'catppuccin:changelog', + 'CHANGES': 'catppuccin:changelog', + 'VERSION.md': 'catppuccin:changelog', + 'VERSION.txt': 'catppuccin:changelog', + 'VERSION': 'catppuccin:changelog', + 'mvnw': 'vscode-icons:file-type-maven', + 'pom.xml': 'vscode-icons:file-type-maven', + 'tsconfig.json': 'vscode-icons:file-type-tsconfig', + 'swagger.json': 'vscode-icons:file-type-swagger', + 'swagger.yml': 'vscode-icons:file-type-swagger', + 'swagger.yaml': 'vscode-icons:file-type-swagger', + 'mime.types': 'vscode-icons:file-type-light-config', + 'Jenkinsfile': 'vscode-icons:file-type-jenkins', + 'babel.config.js': 'vscode-icons:file-type-babel2', + 'babel.config.json': 'vscode-icons:file-type-babel2', + 'babel.config.cjs': 'vscode-icons:file-type-babel2', + 'BUILD': 'vscode-icons:file-type-bazel', + 'BUILD.bazel': 'vscode-icons:file-type-bazel', + 'WORKSPACE': 'vscode-icons:file-type-bazel', + 'WORKSPACE.bazel': 'vscode-icons:file-type-bazel', + 'bower.json': 'vscode-icons:file-type-bower2', + 'Bower.json': 'vscode-icons:file-type-bower2', + 'eslint.config.js': 'vscode-icons:file-type-eslint', + 'eslint.config.ts': 'vscode-icons:file-type-eslint', + 'firebase.json': 'vscode-icons:file-type-firebase', + 'geckodriver': 'openmoji:firefox', + 'Gruntfile.js': 'vscode-icons:file-type-grunt', + 'gruntfile.babel.js': 'vscode-icons:file-type-grunt', + 'Gruntfile.babel.js': 'vscode-icons:file-type-grunt', + 'gruntfile.js': 'vscode-icons:file-type-grunt', + 'Gruntfile.coffee': 'vscode-icons:file-type-grunt', + 'gruntfile.coffee': 'vscode-icons:file-type-grunt', + 'ionic.config.json': 'vscode-icons:file-type-ionic', + 'Ionic.config.json': 'vscode-icons:file-type-ionic', + 'ionic.project': 'vscode-icons:file-type-ionic', + 'Ionic.project': 'vscode-icons:file-type-ionic', + 'platformio.ini': 'vscode-icons:file-type-platformio', + 'rollup.config.js': 'vscode-icons:file-type-rollup', + 'sass-lint.yml': 'vscode-icons:file-type-sass', + 'stylelint.config.js': 'vscode-icons:file-type-light-stylelint', + 'stylelint.config.cjs': 'vscode-icons:file-type-light-stylelint', + 'stylelint.config.mjs': 'vscode-icons:file-type-light-stylelint', + 'yarn.clean': 'vscode-icons:file-type-yarn', + 'yarn.lock': 'vscode-icons:file-type-yarn', + 'webpack.config.js': 'vscode-icons:file-type-webpack', + 'webpack.config.cjs': 'vscode-icons:file-type-webpack', + 'webpack.config.mjs': 'vscode-icons:file-type-webpack', + 'webpack.config.ts': 'vscode-icons:file-type-webpack', + 'webpack.config.build.js': 'vscode-icons:file-type-webpack', + 'webpack.config.build.cjs': 'vscode-icons:file-type-webpack', + 'webpack.config.build.mjs': 'vscode-icons:file-type-webpack', + 'webpack.config.build.ts': 'vscode-icons:file-type-webpack', + 'webpack.common.js': 'vscode-icons:file-type-webpack', + 'webpack.common.cjs': 'vscode-icons:file-type-webpack', + 'webpack.common.mjs': 'vscode-icons:file-type-webpack', + 'webpack.common.ts': 'vscode-icons:file-type-webpack', + 'webpack.dev.js': 'vscode-icons:file-type-webpack', + 'webpack.dev.cjs': 'vscode-icons:file-type-webpack', + 'webpack.dev.mjs': 'vscode-icons:file-type-webpack', + 'webpack.dev.ts': 'vscode-icons:file-type-webpack', + 'webpack.prod.js': 'vscode-icons:file-type-webpack', + 'webpack.prod.cjs': 'vscode-icons:file-type-webpack', + 'webpack.prod.mjs': 'vscode-icons:file-type-webpack', + 'webpack.prod.ts': 'vscode-icons:file-type-webpack', + 'vite.config.js': 'vscode-icons:file-type-vite', + 'vite.config.ts': 'vscode-icons:file-type-vite', + 'vite.config.mjs': 'vscode-icons:file-type-vite', + 'vite.config.cjs': 'vscode-icons:file-type-vite', + 'vitest.config.ts': 'vscode-icons:file-type-vitest', + 'vitest.config.js': 'vscode-icons:file-type-vitest', + 'vitest.config.mjs': 'vscode-icons:file-type-vitest', + 'vitest.config.cjs': 'vscode-icons:file-type-vitest', + 'turbo.json': 'vscode-icons:file-type-light-turbo', + 'vercel.json': 'vscode-icons:file-type-light-vercel', + 'netlify.toml': 'vscode-icons:file-type-light-netlify', + 'Cargo.toml': 'vscode-icons:file-type-cargo', + 'Cargo.lock': 'vscode-icons:file-type-cargo', + 'npm-debug.log': 'vscode-icons:file-type-npm', + + }, + extensions: { + '.astro': 'vscode-icons:file-type-light-astro', + '.mdx': 'vscode-icons:file-type-light-mdx', + '.cls': 'vscode-icons:file-type-apex', + '.apex': 'vscode-icons:file-type-apex', + '.asm': 'vscode-icons:file-type-assembly', + '.s': 'vscode-icons:file-type-assembly', + '.bicep': 'vscode-icons:file-type-bicep', + '.bzl': 'vscode-icons:file-type-bazel', + '.bazel': 'vscode-icons:file-type-bazel', + '.BUILD': 'vscode-icons:file-type-bazel', + '.WORKSPACE': 'vscode-icons:file-type-bazel', + '.bazelignore': 'vscode-icons:file-type-bazel', + '.bazelversion': 'vscode-icons:file-type-bazel', + '.c': 'vscode-icons:file-type-c', + '.h': 'vscode-icons:file-type-c', + '.m': 'vscode-icons:file-type-c', + '.cs': 'vscode-icons:file-type-csharp', + '.cshtml': 'vscode-icons:file-type-html', + '.aspx': 'vscode-icons:file-type-aspx', + '.ascx': 'vscode-icons:file-type-aspx', + '.asax': 'vvscode-icons:file-type-aspx', + '.master': 'vscode-icons:file-type-html', + '.cc': 'vscode-icons:file-type-cpp', + '.cpp': 'vscode-icons:file-type-cpp', + '.cxx': 'vscode-icons:file-type-cpp', + '.c++': 'vscode-icons:file-type-cpp', + '.hh': 'vscode-icons:file-type-cppheader', + '.hpp': 'vscode-icons:file-type-cppheader', + '.hxx': 'vscode-icons:file-type-cppheader', + '.h++': 'vscode-icons:file-type-cppheader', + '.mm': 'vscode-icons:file-type-cpp', + '.clj': 'vscode-icons:file-type-clojure', + '.cljs': 'vscode-icons:file-type-clojure', + '.cljc': 'vscode-icons:file-type-clojure', + '.edn': 'vscode-icons:file-type-clojure', + '.cfc': 'vscode-icons:file-type-cfc', + '.cfm': 'vscode-icons:file-type-cfm', + '.coffee': 'vscode-icons:file-type-coffeescript', + '.litcoffee': 'vscode-icons:file-type-coffeescript', + '.config': 'vscode-icons:file-type-config', + '.cfg': 'vscode-icons:file-type-config', + '.conf': 'vscode-icons:file-type-config', + '.cr': 'vscode-icons:file-type-light-crystal', + '.ecr': 'vscode-icons:file-type-light-crystal', + '.slang': 'vscode-icons:file-type-slang', + '.cson': 'vscode-icons:file-type-json', + '.css': 'vscode-icons:file-type-css', + '.css.map': 'vscode-icons:file-type-cssmap', + '.sss': 'vscode-icons:file-type-sss', + '.csv': 'vscode-icons:file-type-excel', + '.xls': 'vscode-icons:file-type-excel2', + '.xlsx': 'vscode-icons:file-type-excel2', + '.cu': 'vscode-icons:file-type-cuda', + '.cuh': 'vscode-icons:file-type-cuda', + '.hu': 'vscode-icons:file-type-cuda', + '.cake': 'vscode-icons:file-type-cake', + '.ctp': 'vscode-icons:file-type-cakephp', + '.d': 'vscode-icons:file-type-dependencies', + '.doc': 'vscode-icons:file-type-word2', + '.docx': 'vscode-icons:file-type-word2', + '.ejs': 'vscode-icons:file-type-ejs', + '.ex': 'vscode-icons:file-type-elixir', + '.exs': 'vscode-icons:file-type-elixir', + '.elm': 'vscode-icons:file-type-elm', + '.ico': 'vscode-icons:file-type-favicon', + '.fs': 'vscode-icons:file-type-fsharp', + '.fsx': 'vscode-icons:file-type-fsharp', + '.gitignore': 'vscode-icons:file-type-git', + '.gitconfig': 'vscode-icons:file-type-git', + '.gitkeep': 'vscode-icons:file-type-git', + '.gitattributes': 'vscode-icons:file-type-git', + '.gitmodules': 'vscode-icons:file-type-git', + '.go': 'vscode-icons:file-type-go', + '.slide': 'vscode-icons:file-type-go', + '.article': 'vscode-icons:file-type-go', + '.gd': 'vscode-icons:file-type-godot', + '.godot': 'vscode-icons:file-type-godot', + '.tres': 'vscode-icons:file-type-godot', + '.tscn': 'vscode-icons:file-type-godot', + '.gradle': 'vscode-icons:file-type-light-gradle', + '.groovy': 'vscode-icons:file-type-groovy', + '.gsp': 'vscode-icons:file-type-groovy', + '.gql': 'vscode-icons:file-type-graphql', + '.graphql': 'vscode-icons:file-type-graphql', + '.graphqls': 'vscode-icons:file-type-graphql', + '.hack': 'logos:hack', + '.haml': 'vscode-icons:file-type-haml', + '.handlebars': 'vscode-icons:file-type-handlebars', + '.hbs': 'vscode-icons:file-type-handlebars', + '.hjs': 'vscode-icons:file-type-handlebars', + '.hs': 'vscode-icons:file-type-haskell', + '.lhs': 'vscode-icons:file-type-haskell', + '.hx': 'vscode-icons:file-type-haxe', + '.hxs': 'vscode-icons:file-type-haxe', + '.hxp': 'vscode-icons:file-type-haxe', + '.hxml': 'vscode-icons:file-type-haxe', + '.html': 'vscode-icons:file-type-html', + '.jade': 'file-icons:jade', + '.java': 'vscode-icons:file-type-java', + '.class': 'vscode-icons:file-type-java', + '.classpath': 'vscode-icons:file-type-java', + '.properties': 'vscode-icons:file-type-java', + '.js': 'vscode-icons:file-type-js', + '.js.map': 'vscode-icons:file-type-jsmap', + '.cjs': 'vscode-icons:file-type-js', + '.cjs.map': 'vscode-icons:file-type-jsmap', + '.mjs': 'vscode-icons:file-type-js', + '.mjs.map': 'vscode-icons:file-type-jsmap', + '.spec.js': 'vscode-icons:file-type-light-testjs', + '.spec.cjs': 'vscode-icons:file-type-light-testjs', + '.spec.mjs': 'vscode-icons:file-type-light-testjs', + '.test.js': 'vscode-icons:file-type-light-testjs', + '.test.cjs': 'vscode-icons:file-type-light-testjs', + '.test.mjs': 'vscode-icons:file-type-light-testjs', + '.es': 'vscode-icons:file-type-js', + '.es5': 'vscode-icons:file-type-js', + '.es6': 'vscode-icons:file-type-js', + '.es7': 'vscode-icons:file-type-js', + '.jinja': 'vscode-icons:file-type-jinja', + '.jinja2': 'vscode-icons:file-type-jinja', + '.json': 'vscode-icons:file-type-json', + '.jl': 'vscode-icons:file-type-julia', + '.kt': 'vscode-icons:file-type-kotlin', + '.kts': 'vscode-icons:file-type-kotlin', + '.dart': 'vscode-icons:file-type-dartlang', + '.less': 'vscode-icons:file-type-less', + '.liquid': 'vscode-icons:file-type-liquid', + '.ls': 'vscode-icons:file-type-livescript', + '.lua': 'vscode-icons:file-type-lua', + '.markdown': 'vscode-icons:file-type-markdown', + '.md': 'vscode-icons:file-type-markdown', + '.mustache': 'vscode-icons:file-type-light-mustache', + '.stache': 'vscode-icons:file-type-light-mustache', + '.nim': 'vscode-icons:file-type-light-nim', + '.nims': 'vscode-icons:file-type-light-nim', + '.github-issues': 'mdi:github', + '.ipynb': 'vscode-icons:file-type-jupyter', + '.njk': 'vscode-icons:file-type-nunjucks', + '.nunjucks': 'vscode-icons:file-type-nunjucks', + '.nunjs': 'vscode-icons:file-type-nunjucks', + '.nunj': 'vscode-icons:file-type-nunjucks', + '.njs': 'vscode-icons:file-type-nunjucks', + '.nj': 'vscode-icons:file-type-nunjucks', + '.npm-debug.log': 'vscode-icons:file-type-npm', + '.npmignore': 'catppuccin:npm-ignore', + '.npmrc': 'vscode-icons:file-type-npm', + '.ml': 'vscode-icons:file-type-ocaml', + '.mli': 'vscode-icons:file-type-ocaml', + '.cmx': 'vscode-icons:file-type-ocaml', + '.cmxa': 'vscode-icons:file-type-ocaml', + '.pl': 'vscode-icons:file-type-perl', + '.php': 'vscode-icons:file-type-php', + '.php.inc': 'vscode-icons:file-type-php', + '.pipeline': 'vscode-icons:file-type-pipeline', + '.pddl': 'vscode-icons:file-type-pddl', + '.plan': 'vscode-icons:file-type-pddl-plan', + '.happenings': 'vscode-icons:file-type-pddl-happenings', + '.ps1': 'vscode-icons:file-type-powershell', + '.psd1': 'vscode-icons:file-type-powershell', + '.psm1': 'vscode-icons:file-type-powershell', + '.prisma': 'vscode-icons:file-type-light-prisma', + '.pug': 'vscode-icons:file-type-pug', + '.pp': 'vscode-icons:file-type-puppet', + '.epp': 'vscode-icons:file-type-puppet', + '.purs': 'vscode-icons:file-type-light-purescript', + '.py': 'vscode-icons:file-type-python', + '.jsx': 'vscode-icons:file-type-reactjs', + '.spec.jsx': 'vscode-icons:file-type-reactjs', + '.test.jsx': 'vscode-icons:file-type-reactjs', + '.cjsx': 'vscode-icons:file-type-reactjs', + '.tsx': 'vscode-icons:file-type-reactts', + '.spec.tsx': 'vscode-icons:file-type-reactts', + '.test.tsx': 'vscode-icons:file-type-reactts', + '.res': 'vscode-icons:file-type-rescript', + '.resi': 'vscode-icons:file-type-rescript', + '.R': 'vscode-icons:file-type-r', + '.rmd': 'vscode-icons:file-type-rmd', + '.rb': 'vscode-icons:file-type-ruby', + '.erb': 'vscode-icons:file-type-html', + '.erb.html': 'vscode-icons:file-type-html', + '.html.erb': 'vscode-icons:file-type-html', + '.rs': 'vscode-icons:file-type-rust', + '.sass': 'vscode-icons:file-type-sass', + '.scss': 'vscode-icons:file-type-sass', + '.springBeans': 'seti:spring', + '.slim': 'vscode-icons:file-type-slim', + '.smarty.tpl': 'vscode-icons:file-type-smarty', + '.tpl': 'vscode-icons:file-type-smarty', + '.sbt': 'vscode-icons:file-type-sbt', + '.scala': 'vscode-icons:file-type-scala', + '.sol': 'logos:ethereum-color', + '.styl': 'vscode-icons:file-type-light-stylus', + '.svelte': 'vscode-icons:file-type-svelte', + '.swift': 'vscode-icons:file-type-swift', + '.sql': 'vscode-icons:file-type-sql', + '.soql': 'vscode-icons:file-type-sql', + '.tf': 'vscode-icons:file-type-terraform', + '.tf.json': 'vscode-icons:file-type-terraform', + '.tfvars': 'vscode-icons:file-type-terraform', + '.tfvars.json': 'vscode-icons:file-type-terraform', + '.tex': 'vscode-icons:file-type-light-tex', + '.sty': 'vscode-icons:file-type-light-tex', + '.dtx': 'vscode-icons:file-type-light-tex', + '.ins': 'vscode-icons:file-type-light-tex', + '.txt': 'vscode-icons:file-type-text', + '.toml': 'vscode-icons:file-type-light-toml', + '.twig': 'vscode-icons:file-type-twig', + '.ts': 'vscode-icons:file-type-typescript', + '.spec.ts': 'vscode-icons:file-type-testts', + '.test.ts': 'vscode-icons:file-type-testts', + '.vala': 'vscode-icons:file-type-vala', + '.vapi': 'vscode-icons:file-type-vala', + '.component': 'vscode-icons:file-type-html', + '.vue': 'vscode-icons:file-type-vue', + '.wasm': 'vscode-icons:file-type-wasm', + '.wat': 'vscode-icons:file-type-wasm', + '.xml': 'vscode-icons:file-type-xml', + '.yml': 'vscode-icons:file-type-light-yaml', + '.yaml': 'vscode-icons:file-type-light-yaml', + '.pro': 'vscode-icons:file-type-prolog', + '.zig': 'vscode-icons:file-type-zig', + '.jar': 'vscode-icons:file-type-jar', + '.zip': 'vscode-icons:file-type-zip', + '.ai': 'vscode-icons:file-type-ai', + '.psd': 'vscode-icons:file-type-photoshop', + '.pdf': 'vscode-icons:file-type-pdf2', + '.eot': 'vscode-icons:file-type-light-font', + '.ttf': 'vscode-icons:file-type-light-font', + '.woff': 'vscode-icons:file-type-light-font', + '.woff2': 'vscode-icons:file-type-light-font', + '.otf': 'vscode-icons:file-type-light-font', + '.avif': 'vscode-icons:file-type-avif', + '.gif': 'vscode-icons:file-type-image', + '.jpg': 'vscode-icons:file-type-image', + '.jpeg': 'vscode-icons:file-type-image', + '.png': 'vscode-icons:file-type-image', + '.pxm': 'vscode-icons:file-type-image', + '.svg': 'vscode-icons:file-type-svg', + '.svgx': 'vscode-icons:file-type-image', + '.tiff': 'vscode-icons:file-type-image', + '.webp': 'vscode-icons:file-type-image', + '.sublime-project': 'vscode-icons:file-type-sublime', + '.sublime-workspace': 'vscode-icons:file-type-sublime', + '.code-search': 'vscode-icons:file-type-search-result', + '.sh': 'vscode-icons:file-type-shell', + '.zsh': 'vscode-icons:file-type-shell', + '.fish': 'vscode-icons:file-type-shell', + '.zshrc': 'vscode-icons:file-type-shell', + '.bashrc': 'vscode-icons:file-type-shell', + '.mov': 'vscode-icons:file-type-video', + '.ogv': 'vscode-icons:file-type-video', + '.webm': 'vscode-icons:file-type-video', + '.avi': 'vscode-icons:file-type-video', + '.mpg': 'vscode-icons:file-type-video', + '.mp4': 'vscode-icons:file-type-video', + '.mp3': 'vscode-icons:file-type-audio', + '.ogg': 'vscode-icons:file-type-audio', + '.wav': 'vscode-icons:file-type-audio', + '.flac': 'vscode-icons:file-type-audio', + '.bat': 'vscode-icons:file-type-bat', + '.cmd': 'vscode-icons:file-type-shell', + '.babelrc': 'vscode-icons:file-type-light-babel', + '.babelrc.js': 'vscode-icons:file-type-light-babel', + '.babelrc.cjs': 'vscode-icons:file-type-light-babel', + '.bazelrc': 'vscode-icons:file-type-bazel', + '.bowerrc': 'vscode-icons:file-type-bower2', + '.codeclimate.yml': 'vscode-icons:file-type-codeclimate', + '.eslintrc': 'vscode-icons:file-type-eslint', + '.eslintrc.js': 'vscode-icons:file-type-eslint', + '.eslintrc.cjs': 'vscode-icons:file-type-eslint', + '.eslintrc.yaml': 'vscode-icons:file-type-eslint', + '.eslintrc.yml': 'vscode-icons:file-type-eslint', + '.eslintrc.json': 'vscode-icons:file-type-eslint', + '.eslintignore': 'vscode-icons:file-type-eslint', + '.firebaserc': 'vscode-icons:file-type-firebase', + '.gitlab-ci.yml': 'vscode-icons:file-type-gitlab', + '.jshintrc': 'vscode-icons:file-type-jshint', + '.jscsrc': 'vscode-icons:file-type-js', + '.stylelintrc': 'vscode-icons:file-type-light-stylelint', + '.stylelintrc.json': 'vscode-icons:file-type-light-stylelint', + '.stylelintrc.yaml': 'vscode-icons:file-type-light-stylelint', + '.stylelintrc.yml': 'vscode-icons:file-type-light-stylelint', + '.stylelintrc.js': 'vscode-icons:file-type-light-stylelint', + '.stylelintignore': 'vscode-icons:file-type-light-stylelint', + '.direnv': 'vscode-icons:file-type-dotenv', + '.env': 'vscode-icons:file-type-dotenv', + '.static': 'vscode-icons:file-type-config', + '.editorconfig': 'vscode-icons:file-type-editorconfig', + '.slugignore': 'vscode-icons:file-type-config', + '.tmp': 'ph:clock-bold', + '.htaccess': 'vscode-icons:file-type-config', + '.key': 'vscode-icons:file-type-key', + '.cert': 'vscode-icons:file-type-cert', + '.cer': 'vscode-icons:file-type-cert', + '.crt': 'vscode-icons:file-type-cert', + '.pem': 'vscode-icons:file-type-cert', + '.DS_Store': 'octicon:diff-ignored-16', + }, + partials: { + 'Gemfile': 'vscode-icons:file-type-ruby', + 'gemfile': 'vscode-icons:file-type-ruby', + 'dockerfile': 'vscode-icons:file-type-docker', + 'Dockerfile': 'vscode-icons:file-type-docker', + 'DOCKERFILE': 'vscode-icons:file-type-docker', + '.dockerignore': 'vscode-icons:file-type-docker', + 'docker-healthcheck': 'vscode-icons:file-type-docker', + 'docker-compose.yml': 'vscode-icons:file-type-docker', + 'docker-compose.yaml': 'vscode-icons:file-type-docker', + 'docker-compose.override.yml': 'vscode-icons:file-type-docker', + 'docker-compose.override.yaml': 'vscode-icons:file-type-docker', + 'GULPFILE': 'vscode-icons:file-type-gulp', + 'Gulpfile': 'vscode-icons:file-type-gulp', + 'gulpfile': 'vscode-icons:file-type-gulp', + 'gulpfile.js': 'vscode-icons:file-type-gulp', + 'LICENSE': 'vscode-icons:file-type-license', + 'LICENCE': 'vscode-icons:file-type-license', + 'LICENSE.txt': 'vscode-icons:file-type-license', + 'LICENCE.txt': 'vscode-icons:file-type-license', + 'LICENSE.md': 'vscode-icons:file-type-license', + 'LICENCE.md': 'vscode-icons:file-type-license', + 'COPYING': 'vscode-icons:file-type-license', + 'COPYING.txt': 'vscode-icons:file-type-license', + 'COPYING.md': 'vscode-icons:file-type-license', + 'COMPILING': 'vscode-icons:file-type-license', + 'COMPILING.txt': 'vscode-icons:file-type-license', + 'COMPILING.md': 'vscode-icons:file-type-license', + 'CONTRIBUTING': 'vscode-icons:file-type-license', + 'CONTRIBUTING.txt': 'vscode-icons:file-type-license', + 'CONTRIBUTING.md': 'vscode-icons:file-type-license', + 'MAKEFILE': 'vscode-icons:file-type-makefile', + 'Makefile': 'vscode-icons:file-type-makefile', + 'makefile': 'vscode-icons:file-type-makefile', + 'QMAKEFILE': 'vscode-icons:file-type-makefile', + 'QMakefile': 'vscode-icons:file-type-makefile', + 'qmakefile': 'vscode-icons:file-type-makefile', + 'OMAKEFILE': 'vscode-icons:file-type-makefile', + 'OMakefile': 'vscode-icons:file-type-makefile', + 'omakefile': 'vscode-icons:file-type-makefile', + 'CMAKELISTS.TXT': 'vscode-icons:file-type-makefile', + 'CMAKELISTS.txt': 'vscode-icons:file-type-makefile', + 'CMakeLists.txt': 'vscode-icons:file-type-makefile', + 'cmakelists.txt': 'vscode-icons:file-type-makefile', + 'Procfile': 'vscode-icons:file-type-procfile', + 'TODO': 'vscode-icons:file-type-light-todo', + 'TODO.txt': 'vscode-icons:file-type-light-todo', + 'TODO.md': 'vscode-icons:file-type-light-todo', + }, +} diff --git a/plugins/plugin-md-power/src/node/features/fileTree/findIcon.ts b/plugins/plugin-md-power/src/node/features/fileTree/findIcon.ts index 730754b4..eb593c4d 100644 --- a/plugins/plugin-md-power/src/node/features/fileTree/findIcon.ts +++ b/plugins/plugin-md-power/src/node/features/fileTree/findIcon.ts @@ -1,49 +1,18 @@ -import { definitions, FileIcons } from './icons.js' +import { defaultFile, defaultFolder, definitions } from './definitions.js' -export interface FileIcon { - name: string - svg: string -} - -export const defaultFileIcon: FileIcon = { - name: 'default', - svg: makeSVGIcon(FileIcons['seti:default']), -} - -export const folderIcon: FileIcon = { - name: 'folder', - svg: makeSVGIcon(FileIcons['seti:folder']), -} - -export function getFileIcon(fileName: string): FileIcon { - const name = getFileIconName(fileName) +export function getFileIcon(fileName: string, type: 'file' | 'folder' = 'file'): string { + const name = getFileIconName(fileName, type) if (!name) - return defaultFileIcon + return type === 'file' ? defaultFile : defaultFolder - if (name in FileIcons) { - const path = FileIcons[name as keyof typeof FileIcons] - return { - name: name.includes(':') ? name.split(':')[1] : name, - svg: makeSVGIcon(path), - } + return name +} + +function getFileIconName(fileName: string, type: 'file' | 'folder' = 'file'): string | undefined { + if (type === 'folder') { + return definitions.folders[fileName] } - return defaultFileIcon -} - -function makeSVGIcon(svg: string): string { - svg = `${svg}` - .replace(/"/g, '\'') - .replace(/%/g, '%25') - .replace(/#/g, '%23') - .replace(/\{/g, '%7B') - .replace(/\}/g, '%7D') - .replace(//g, '%3E') - return `url("data:image/svg+xml,${svg}")` -} - -function getFileIconName(fileName: string) { - let icon: string | undefined = definitions.files[fileName] + let icon: string | undefined = definitions.named[fileName] || definitions.files[fileName] if (icon) return icon icon = getFileIconTypeFromExtension(fileName) diff --git a/plugins/plugin-md-power/src/node/features/fileTree/icons.ts b/plugins/plugin-md-power/src/node/features/fileTree/icons.ts deleted file mode 100644 index 20db18d8..00000000 --- a/plugins/plugin-md-power/src/node/features/fileTree/icons.ts +++ /dev/null @@ -1,775 +0,0 @@ -/** - * Based on https://github.com/elviswolcott/seti-icons which - * is derived from https://github.com/jesseweed/seti-ui/ - * - * Copyright (c) 2014 Jesse Weed - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -export interface Definitions { - files: Record - extensions: Record - partials: Record -} - -export const definitions: Definitions = { - files: { - 'pnpm-debug.log': 'pnpm', - 'pnpm-lock.yaml': 'pnpm', - 'pnpm-workspace.yaml': 'pnpm', - 'biome.json': 'biome', - 'bun.lockb': 'bun', - 'COMMIT_EDITMSG': 'seti:git', - 'MERGE_MSG': 'seti:git', - 'karma.conf.js': 'seti:karma', - 'karma.conf.cjs': 'seti:karma', - 'karma.conf.mjs': 'seti:karma', - 'karma.conf.coffee': 'seti:karma', - 'README.md': 'seti:info', - 'README.txt': 'seti:info', - 'README': 'seti:info', - 'CHANGELOG.md': 'seti:clock', - 'CHANGELOG.txt': 'seti:clock', - 'CHANGELOG': 'seti:clock', - 'CHANGES.md': 'seti:clock', - 'CHANGES.txt': 'seti:clock', - 'CHANGES': 'seti:clock', - 'VERSION.md': 'seti:clock', - 'VERSION.txt': 'seti:clock', - 'VERSION': 'seti:clock', - 'mvnw': 'seti:maven', - 'pom.xml': 'seti:maven', - 'tsconfig.json': 'seti:tsconfig', - 'swagger.json': 'seti:json', - 'swagger.yml': 'seti:json', - 'swagger.yaml': 'seti:json', - 'mime.types': 'seti:config', - 'Jenkinsfile': 'seti:jenkins', - 'babel.config.js': 'seti:babel', - 'babel.config.json': 'seti:babel', - 'babel.config.cjs': 'seti:babel', - 'BUILD': 'seti:bazel', - 'BUILD.bazel': 'seti:bazel', - 'WORKSPACE': 'seti:bazel', - 'WORKSPACE.bazel': 'seti:bazel', - 'bower.json': 'seti:bower', - 'Bower.json': 'seti:bower', - 'eslint.config.js': 'seti:eslint', - 'firebase.json': 'seti:firebase', - 'geckodriver': 'seti:firefox', - 'Gruntfile.js': 'seti:grunt', - 'gruntfile.babel.js': 'seti:grunt', - 'Gruntfile.babel.js': 'seti:grunt', - 'gruntfile.js': 'seti:grunt', - 'Gruntfile.coffee': 'seti:grunt', - 'gruntfile.coffee': 'seti:grunt', - 'ionic.config.json': 'seti:ionic', - 'Ionic.config.json': 'seti:ionic', - 'ionic.project': 'seti:ionic', - 'Ionic.project': 'seti:ionic', - 'platformio.ini': 'seti:platformio', - 'rollup.config.js': 'seti:rollup', - 'sass-lint.yml': 'seti:sass', - 'stylelint.config.js': 'seti:stylelint', - 'stylelint.config.cjs': 'seti:stylelint', - 'stylelint.config.mjs': 'seti:stylelint', - 'yarn.clean': 'seti:yarn', - 'yarn.lock': 'seti:yarn', - 'webpack.config.js': 'seti:webpack', - 'webpack.config.cjs': 'seti:webpack', - 'webpack.config.mjs': 'seti:webpack', - 'webpack.config.ts': 'seti:webpack', - 'webpack.config.build.js': 'seti:webpack', - 'webpack.config.build.cjs': 'seti:webpack', - 'webpack.config.build.mjs': 'seti:webpack', - 'webpack.config.build.ts': 'seti:webpack', - 'webpack.common.js': 'seti:webpack', - 'webpack.common.cjs': 'seti:webpack', - 'webpack.common.mjs': 'seti:webpack', - 'webpack.common.ts': 'seti:webpack', - 'webpack.dev.js': 'seti:webpack', - 'webpack.dev.cjs': 'seti:webpack', - 'webpack.dev.mjs': 'seti:webpack', - 'webpack.dev.ts': 'seti:webpack', - 'webpack.prod.js': 'seti:webpack', - 'webpack.prod.cjs': 'seti:webpack', - 'webpack.prod.mjs': 'seti:webpack', - 'webpack.prod.ts': 'seti:webpack', - 'npm-debug.log': 'seti:npm_ignored', - }, - extensions: { - '.astro': 'astro', - '.mdx': 'mdx', - '.pkl': 'pkl', - '.bsl': 'seti:bsl', - '.mdo': 'seti:mdo', - '.cls': 'seti:salesforce', - '.apex': 'seti:salesforce', - '.asm': 'seti:asm', - '.s': 'seti:asm', - '.bicep': 'seti:bicep', - '.bzl': 'seti:bazel', - '.bazel': 'seti:bazel', - '.BUILD': 'seti:bazel', - '.WORKSPACE': 'seti:bazel', - '.bazelignore': 'seti:bazel', - '.bazelversion': 'seti:bazel', - '.c': 'seti:c', - '.h': 'seti:c', - '.m': 'seti:c', - '.cs': 'seti:c-sharp', - '.cshtml': 'seti:html', - '.aspx': 'seti:html', - '.ascx': 'seti:html', - '.asax': 'seti:html', - '.master': 'seti:html', - '.cc': 'seti:cpp', - '.cpp': 'seti:cpp', - '.cxx': 'seti:cpp', - '.c++': 'seti:cpp', - '.hh': 'seti:cpp', - '.hpp': 'seti:cpp', - '.hxx': 'seti:cpp', - '.h++': 'seti:cpp', - '.mm': 'seti:cpp', - '.clj': 'seti:clojure', - '.cljs': 'seti:clojure', - '.cljc': 'seti:clojure', - '.edn': 'seti:clojure', - '.cfc': 'seti:coldfusion', - '.cfm': 'seti:coldfusion', - '.coffee': 'seti:cjsx', - '.litcoffee': 'seti:cjsx', - '.config': 'seti:config', - '.cfg': 'seti:config', - '.conf': 'seti:config', - '.cr': 'seti:crystal', - '.ecr': 'seti:crystal_embedded', - '.slang': 'seti:crystal_embedded', - '.cson': 'seti:json', - '.css': 'seti:css', - '.css.map': 'seti:css', - '.sss': 'seti:css', - '.csv': 'seti:csv', - '.xls': 'seti:xls', - '.xlsx': 'seti:xls', - '.cu': 'seti:cu', - '.cuh': 'seti:cu', - '.hu': 'seti:cu', - '.cake': 'seti:cake', - '.ctp': 'seti:cake_php', - '.d': 'seti:d', - '.doc': 'seti:word', - '.docx': 'seti:word', - '.ejs': 'seti:ejs', - '.ex': 'seti:elixir', - '.exs': 'seti:elixir_script', - '.elm': 'seti:elm', - '.ico': 'seti:favicon', - '.fs': 'seti:f-sharp', - '.fsx': 'seti:f-sharp', - '.gitignore': 'seti:git', - '.gitconfig': 'seti:git', - '.gitkeep': 'seti:git', - '.gitattributes': 'seti:git', - '.gitmodules': 'seti:git', - '.go': 'seti:go', - '.slide': 'seti:go', - '.article': 'seti:go', - '.gd': 'seti:godot', - '.godot': 'seti:godot', - '.tres': 'seti:godot', - '.tscn': 'seti:godot', - '.gradle': 'seti:gradle', - '.groovy': 'seti:grails', - '.gsp': 'seti:grails', - '.gql': 'seti:graphql', - '.graphql': 'seti:graphql', - '.graphqls': 'seti:graphql', - '.hack': 'seti:hacklang', - '.haml': 'seti:haml', - '.handlebars': 'seti:mustache', - '.hbs': 'seti:mustache', - '.hjs': 'seti:mustache', - '.hs': 'seti:haskell', - '.lhs': 'seti:haskell', - '.hx': 'seti:haxe', - '.hxs': 'seti:haxe', - '.hxp': 'seti:haxe', - '.hxml': 'seti:haxe', - '.html': 'seti:html', - '.jade': 'seti:jade', - '.java': 'seti:java', - '.class': 'seti:java', - '.classpath': 'seti:java', - '.properties': 'seti:java', - '.js': 'seti:javascript', - '.js.map': 'seti:javascript', - '.cjs': 'seti:javascript', - '.cjs.map': 'seti:javascript', - '.mjs': 'seti:javascript', - '.mjs.map': 'seti:javascript', - '.spec.js': 'seti:javascript', - '.spec.cjs': 'seti:javascript', - '.spec.mjs': 'seti:javascript', - '.test.js': 'seti:javascript', - '.test.cjs': 'seti:javascript', - '.test.mjs': 'seti:javascript', - '.es': 'seti:javascript', - '.es5': 'seti:javascript', - '.es6': 'seti:javascript', - '.es7': 'seti:javascript', - '.jinja': 'seti:jinja', - '.jinja2': 'seti:jinja', - '.json': 'seti:json', - '.jl': 'seti:julia', - '.kt': 'seti:kotlin', - '.kts': 'seti:kotlin', - '.dart': 'seti:dart', - '.less': 'seti:json', - '.liquid': 'seti:liquid', - '.ls': 'seti:livescript', - '.lua': 'seti:lua', - '.markdown': 'seti:markdown', - '.md': 'seti:markdown', - '.argdown': 'seti:argdown', - '.ad': 'seti:argdown', - '.mustache': 'seti:mustache', - '.stache': 'seti:mustache', - '.nim': 'seti:nim', - '.nims': 'seti:nim', - '.github-issues': 'seti:github', - '.ipynb': 'seti:notebook', - '.njk': 'seti:nunjucks', - '.nunjucks': 'seti:nunjucks', - '.nunjs': 'seti:nunjucks', - '.nunj': 'seti:nunjucks', - '.njs': 'seti:nunjucks', - '.nj': 'seti:nunjucks', - '.npm-debug.log': 'seti:npm', - '.npmignore': 'seti:npm', - '.npmrc': 'seti:npm', - '.ml': 'seti:ocaml', - '.mli': 'seti:ocaml', - '.cmx': 'seti:ocaml', - '.cmxa': 'seti:ocaml', - '.odata': 'seti:odata', - '.pl': 'seti:perl', - '.php': 'seti:php', - '.php.inc': 'seti:php', - '.pipeline': 'seti:pipeline', - '.pddl': 'seti:pddl', - '.plan': 'seti:plan', - '.happenings': 'seti:happenings', - '.ps1': 'seti:powershell', - '.psd1': 'seti:powershell', - '.psm1': 'seti:powershell', - '.prisma': 'seti:prisma', - '.pug': 'seti:pug', - '.pp': 'seti:puppet', - '.epp': 'seti:puppet', - '.purs': 'seti:purescript', - '.py': 'seti:python', - '.jsx': 'seti:react', - '.spec.jsx': 'seti:react', - '.test.jsx': 'seti:react', - '.cjsx': 'seti:react', - '.tsx': 'seti:react', - '.spec.tsx': 'seti:react', - '.test.tsx': 'seti:react', - '.res': 'seti:rescript', - '.resi': 'seti:rescript', - '.R': 'seti:R', - '.rmd': 'seti:R', - '.rb': 'seti:ruby', - '.erb': 'seti:html', - '.erb.html': 'seti:html', - '.html.erb': 'seti:html', - '.rs': 'seti:rust', - '.sass': 'seti:sass', - '.scss': 'seti:sass', - '.springBeans': 'seti:spring', - '.slim': 'seti:slim', - '.smarty.tpl': 'seti:smarty', - '.tpl': 'seti:smarty', - '.sbt': 'seti:sbt', - '.scala': 'seti:scala', - '.sol': 'seti:ethereum', - '.styl': 'seti:stylus', - '.svelte': 'seti:svelte', - '.swift': 'seti:swift', - '.sql': 'seti:db', - '.soql': 'seti:db', - '.tf': 'seti:terraform', - '.tf.json': 'seti:terraform', - '.tfvars': 'seti:terraform', - '.tfvars.json': 'seti:terraform', - '.tex': 'seti:tex', - '.sty': 'seti:tex', - '.dtx': 'seti:tex', - '.ins': 'seti:tex', - '.txt': 'seti:default', - '.toml': 'seti:config', - '.twig': 'seti:twig', - '.ts': 'seti:typescript', - '.spec.ts': 'seti:typescript', - '.test.ts': 'seti:typescript', - '.vala': 'seti:vala', - '.vapi': 'seti:vala', - '.component': 'seti:html', - '.vue': 'seti:vue', - '.wasm': 'seti:wasm', - '.wat': 'seti:wat', - '.xml': 'seti:xml', - '.yml': 'seti:yml', - '.yaml': 'seti:yml', - '.pro': 'seti:prolog', - '.zig': 'seti:zig', - '.jar': 'seti:zip', - '.zip': 'seti:zip', - '.wgt': 'seti:wgt', - '.ai': 'seti:illustrator', - '.psd': 'seti:photoshop', - '.pdf': 'seti:pdf', - '.eot': 'seti:font', - '.ttf': 'seti:font', - '.woff': 'seti:font', - '.woff2': 'seti:font', - '.otf': 'seti:font', - '.avif': 'seti:image', - '.gif': 'seti:image', - '.jpg': 'seti:image', - '.jpeg': 'seti:image', - '.png': 'seti:image', - '.pxm': 'seti:image', - '.svg': 'seti:svg', - '.svgx': 'seti:image', - '.tiff': 'seti:image', - '.webp': 'seti:image', - '.sublime-project': 'seti:sublime', - '.sublime-workspace': 'seti:sublime', - '.code-search': 'seti:code-search', - '.sh': 'seti:shell', - '.zsh': 'seti:shell', - '.fish': 'seti:shell', - '.zshrc': 'seti:shell', - '.bashrc': 'seti:shell', - '.mov': 'seti:video', - '.ogv': 'seti:video', - '.webm': 'seti:video', - '.avi': 'seti:video', - '.mpg': 'seti:video', - '.mp4': 'seti:video', - '.mp3': 'seti:audio', - '.ogg': 'seti:audio', - '.wav': 'seti:audio', - '.flac': 'seti:audio', - '.3ds': 'seti:svg', - '.3dm': 'seti:svg', - '.stl': 'seti:svg', - '.obj': 'seti:svg', - '.dae': 'seti:svg', - '.bat': 'seti:windows', - '.cmd': 'seti:windows', - '.babelrc': 'seti:babel', - '.babelrc.js': 'seti:babel', - '.babelrc.cjs': 'seti:babel', - '.bazelrc': 'seti:bazel', - '.bowerrc': 'seti:bower', - '.codeclimate.yml': 'seti:code-climate', - '.eslintrc': 'seti:eslint', - '.eslintrc.js': 'seti:eslint', - '.eslintrc.cjs': 'seti:eslint', - '.eslintrc.yaml': 'seti:eslint', - '.eslintrc.yml': 'seti:eslint', - '.eslintrc.json': 'seti:eslint', - '.eslintignore': 'seti:eslint', - '.firebaserc': 'seti:firebase', - '.gitlab-ci.yml': 'seti:gitlab', - '.jshintrc': 'seti:javascript', - '.jscsrc': 'seti:javascript', - '.stylelintrc': 'seti:stylelint', - '.stylelintrc.json': 'seti:stylelint', - '.stylelintrc.yaml': 'seti:stylelint', - '.stylelintrc.yml': 'seti:stylelint', - '.stylelintrc.js': 'seti:stylelint', - '.stylelintignore': 'seti:stylelint', - '.direnv': 'seti:config', - '.env': 'seti:config', - '.static': 'seti:config', - '.editorconfig': 'seti:config', - '.slugignore': 'seti:config', - '.tmp': 'seti:clock', - '.htaccess': 'seti:config', - '.key': 'seti:lock', - '.cert': 'seti:lock', - '.cer': 'seti:lock', - '.crt': 'seti:lock', - '.pem': 'seti:lock', - '.DS_Store': 'seti:ignored', - }, - partials: { - 'mix': 'seti:hex', - 'Gemfile': 'seti:ruby', - 'gemfile': 'seti:ruby', - 'dockerfile': 'seti:docker', - 'Dockerfile': 'seti:docker', - 'DOCKERFILE': 'seti:docker', - '.dockerignore': 'seti:docker', - 'docker-healthcheck': 'seti:docker', - 'docker-compose.yml': 'seti:docker', - 'docker-compose.yaml': 'seti:docker', - 'docker-compose.override.yml': 'seti:docker', - 'docker-compose.override.yaml': 'seti:docker', - 'GULPFILE': 'seti:gulp', - 'Gulpfile': 'seti:gulp', - 'gulpfile': 'seti:gulp', - 'gulpfile.js': 'seti:gulp', - 'LICENSE': 'seti:license', - 'LICENCE': 'seti:license', - 'LICENSE.txt': 'seti:license', - 'LICENCE.txt': 'seti:license', - 'LICENSE.md': 'seti:license', - 'LICENCE.md': 'seti:license', - 'COPYING': 'seti:license', - 'COPYING.txt': 'seti:license', - 'COPYING.md': 'seti:license', - 'COMPILING': 'seti:license', - 'COMPILING.txt': 'seti:license', - 'COMPILING.md': 'seti:license', - 'CONTRIBUTING': 'seti:license', - 'CONTRIBUTING.txt': 'seti:license', - 'CONTRIBUTING.md': 'seti:license', - 'MAKEFILE': 'seti:makefile', - 'Makefile': 'seti:makefile', - 'makefile': 'seti:makefile', - 'QMAKEFILE': 'seti:makefile', - 'QMakefile': 'seti:makefile', - 'qmakefile': 'seti:makefile', - 'OMAKEFILE': 'seti:makefile', - 'OMakefile': 'seti:makefile', - 'omakefile': 'seti:makefile', - 'CMAKELISTS.TXT': 'seti:makefile', - 'CMAKELISTS.txt': 'seti:makefile', - 'CMakeLists.txt': 'seti:makefile', - 'cmakelists.txt': 'seti:makefile', - 'Procfile': 'seti:heroku', - 'TODO': 'seti:todo', - 'TODO.txt': 'seti:todo', - 'TODO.md': 'seti:todo', - }, -} - -export const FileIcons = { - 'pnpm': '', - 'biome': - '', - 'bun': '', - - 'seti:folder': - '', - 'seti:bsl': - '', - 'seti:mdo': - '', - 'seti:salesforce': - '', - 'seti:asm': - '', - 'seti:bicep': - '', - 'seti:bazel': - '', - 'seti:c': - '', - 'seti:c-sharp': - '', - 'seti:html': - '', - 'seti:cpp': - '', - 'seti:clojure': - '', - 'seti:coldfusion': - '', - 'seti:config': - '', - 'seti:crystal': - '', - 'seti:crystal_embedded': - '', - 'seti:json': - '', - 'seti:css': - '', - 'seti:csv': - '', - 'seti:xls': - '', - 'seti:cu': - '', - 'seti:cake': - '', - 'seti:cake_php': - '', - 'seti:d': - '', - 'seti:word': - '', - 'seti:elixir': - '', - 'seti:elixir_script': - '', - 'seti:hex': - '', - 'seti:elm': - '', - 'seti:favicon': - '', - 'seti:f-sharp': - '', - 'seti:git': - '', - 'seti:go': - '', - 'seti:godot': - '', - 'seti:gradle': - '', - 'seti:grails': - '', - 'seti:graphql': - '', - 'seti:hacklang': - '', - 'seti:haml': - '', - 'seti:mustache': - '', - 'seti:haskell': - '', - 'seti:haxe': - '', - 'seti:jade': - '', - 'seti:java': - '', - 'seti:javascript': - '', - 'seti:jinja': - '', - 'seti:julia': - '', - 'seti:karma': - '', - 'seti:kotlin': - '', - 'seti:dart': - '', - 'seti:liquid': - '', - 'seti:livescript': - '', - 'seti:lua': - '', - 'seti:markdown': - '', - 'seti:argdown': - '', - 'seti:info': - '', - 'seti:clock': - '', - 'seti:maven': - '', - 'seti:nim': - '', - 'seti:github': - '', - 'seti:notebook': - '', - 'seti:nunjucks': - '', - 'seti:npm': - '', - 'seti:ocaml': - '', - 'seti:odata': - '', - 'seti:perl': - '', - 'seti:php': - '', - 'seti:pipeline': - '', - 'seti:pddl': - '', - 'seti:plan': - '', - 'seti:happenings': - '', - 'seti:powershell': - '', - 'seti:prisma': - '', - 'seti:pug': - '', - 'seti:puppet': - '', - 'seti:purescript': - '', - 'seti:python': - '', - 'seti:react': - '', - 'seti:rescript': - '', - 'seti:R': - '', - 'seti:ruby': - '', - 'seti:rust': - '', - 'seti:sass': - '', - 'seti:spring': - '', - 'seti:slim': - '', - 'seti:smarty': - '', - 'seti:sbt': - '', - 'seti:scala': - '', - 'seti:ethereum': - '', - 'seti:stylus': - '', - 'seti:svelte': - '', - 'seti:swift': - '', - 'seti:db': - '', - 'seti:terraform': - '', - 'seti:tex': - '', - 'seti:default': - '', - 'seti:twig': - '', - 'seti:typescript': - '', - 'seti:tsconfig': - '', - 'seti:vala': - '', - 'seti:vue': - '', - 'seti:wasm': - '', - 'seti:wat': - '', - 'seti:xml': - '', - 'seti:yml': - '', - 'seti:prolog': - '', - 'seti:zig': - '', - 'seti:zip': - '', - 'seti:wgt': - '', - 'seti:illustrator': - '', - 'seti:photoshop': - '', - 'seti:pdf': - '', - 'seti:font': - '', - 'seti:image': - '', - 'seti:svg': - '', - 'seti:sublime': - '', - 'seti:code-search': - '', - 'seti:shell': - '', - 'seti:video': - '', - 'seti:audio': - '', - 'seti:windows': - '', - 'seti:jenkins': - '', - 'seti:babel': - '', - 'seti:bower': - '', - 'seti:docker': - '', - 'seti:code-climate': - '', - 'seti:eslint': - '', - 'seti:firebase': - '', - 'seti:firefox': - '', - 'seti:gitlab': - '', - 'seti:grunt': - '', - 'seti:gulp': - '', - 'seti:ionic': - '', - 'seti:platformio': - '', - 'seti:rollup': - '', - 'seti:stylelint': - '', - 'seti:yarn': - '', - 'seti:webpack': - '', - 'seti:lock': - '', - 'seti:license': - '', - 'seti:makefile': - '', - 'seti:heroku': - '', - 'seti:todo': - '', - 'seti:ignored': - '', -} diff --git a/plugins/plugin-md-power/src/node/features/fileTree/index.ts b/plugins/plugin-md-power/src/node/features/fileTree/index.ts index 818f307a..fc15b2b7 100644 --- a/plugins/plugin-md-power/src/node/features/fileTree/index.ts +++ b/plugins/plugin-md-power/src/node/features/fileTree/index.ts @@ -1,9 +1,7 @@ -import fs from 'node:fs' import container from 'markdown-it-container' import type Token from 'markdown-it/lib/token.mjs' -import type { App } from 'vuepress/core' import type { Markdown } from 'vuepress/markdown' -import { type FileIcon, folderIcon, getFileIcon } from './findIcon.js' +import { getFileIcon } from './findIcon.js' import { resolveTreeNodeInfo, updateInlineToken } from './resolveTreeNodeInfo.js' const type = 'file-tree' @@ -11,10 +9,8 @@ const closeType = `container_${type}_close` const componentName = 'FileTreeItem' const itemOpen = 'file_tree_item_open' const itemClose = 'file_tree_item_close' -const classPrefix = 'vp-fti-' -const styleFilepath = 'internal/md-power/file-tree.css' -export async function fileTreePlugin(app: App, md: Markdown) { +export function fileTreePlugin(md: Markdown) { const validate = (info: string): boolean => info.trim().startsWith(type) const render = (tokens: Token[], idx: number): string => { if (tokens[idx].nesting === 1) { @@ -32,15 +28,14 @@ export async function fileTreePlugin(app: App, md: Markdown) { hasRes.push(token.level) const [info, inline] = result const { filename, type, expanded, empty } = info - const icon = type === 'file' ? getFileIcon(filename) : folderIcon + const icon = getFileIcon(filename, type) token.type = itemOpen token.tag = componentName token.attrSet('type', type) token.attrSet(':expanded', expanded ? 'true' : 'false') token.attrSet(':empty', empty ? 'true' : 'false') - updateInlineToken(inline, info, `${classPrefix}${icon.name}`) - addIcon(icon) + updateInlineToken(inline, info, icon) } else { hasRes.push(-1) @@ -63,25 +58,5 @@ export async function fileTreePlugin(app: App, md: Markdown) { } } - let timer: NodeJS.Timeout | null = null - const icons: Record = {} - - function addIcon(icon: FileIcon) { - icons[icon.name] = icon - - if (timer) - clearTimeout(timer) - timer = setTimeout(async () => { - let content = '' - for (const icon of Object.values(icons)) { - content += `.${classPrefix}${icon.name} { --icon: ${icon.svg}; }\n` - } - await app.writeTemp(styleFilepath, content) - }, 150) - } - md.use(container, type, { validate, render }) - - if (!fs.existsSync(app.dir.temp(styleFilepath))) - await app.writeTemp(styleFilepath, '') } diff --git a/plugins/plugin-md-power/src/node/features/fileTree/resolveTreeNodeInfo.ts b/plugins/plugin-md-power/src/node/features/fileTree/resolveTreeNodeInfo.ts index 3414e975..410d21b0 100644 --- a/plugins/plugin-md-power/src/node/features/fileTree/resolveTreeNodeInfo.ts +++ b/plugins/plugin-md-power/src/node/features/fileTree/resolveTreeNodeInfo.ts @@ -1,5 +1,5 @@ import Token from 'markdown-it/lib/token.mjs' -import { removeLeadingSlash } from 'vuepress/shared' +import { removeEndingSlash, removeLeadingSlash } from 'vuepress/shared' interface FileTreeNode { filename: string @@ -42,7 +42,7 @@ export function resolveTreeNodeInfo( const focus = children[0]?.tag === 'strong' const type = hasChildren || filename.endsWith('/') ? 'folder' : 'file' const info: FileTreeNode = { - filename: removeLeadingSlash(filename), + filename: removeLeadingSlash(removeEndingSlash(filename)), type, focus, empty: !hasChildren, @@ -65,9 +65,9 @@ export function updateInlineToken(inline: Token, info: FileTreeNode, icon: strin tokens.push(wrapperOpen) if (info.filename !== '...' && info.filename !== '…') { - const iconOpen = new Token('span_open', 'span', 1) - iconOpen.attrSet('class', icon) - const iconClose = new Token('span_close', 'span', -1) + const iconOpen = new Token('vp_iconify_open', 'VPIcon', 1) + iconOpen.attrSet('name', icon) + const iconClose = new Token('vp_iconify_close', 'VPIcon', -1) tokens.push(iconOpen, iconClose) } diff --git a/plugins/plugin-md-power/src/node/plugin.ts b/plugins/plugin-md-power/src/node/plugin.ts index 4653d99a..b5d4371d 100644 --- a/plugins/plugin-md-power/src/node/plugin.ts +++ b/plugins/plugin-md-power/src/node/plugin.ts @@ -102,7 +102,7 @@ export function markdownPowerPlugin(options: MarkdownPowerPluginOptions = {}): P if (options.fileTree) { // ::: file-tree - await fileTreePlugin(app, md) + fileTreePlugin(md) } }, } diff --git a/plugins/plugin-md-power/src/node/prepareConfigFile.ts b/plugins/plugin-md-power/src/node/prepareConfigFile.ts index 366a5f07..6a26729f 100644 --- a/plugins/plugin-md-power/src/node/prepareConfigFile.ts +++ b/plugins/plugin-md-power/src/node/prepareConfigFile.ts @@ -56,7 +56,6 @@ export async function prepareConfigFile(app: App, options: MarkdownPowerPluginOp if (options.fileTree) { imports.add(`import FileTreeItem from '${CLIENT_FOLDER}components/FileTreeItem.vue'`) - imports.add(`import '@internal/md-power/file-tree.css'`) enhances.add(`app.component('FileTreeItem', FileTreeItem)`) }