diff --git a/modules/fileicon/material.go b/modules/fileicon/material.go index 54666c76b2..201cf6f455 100644 --- a/modules/fileicon/material.go +++ b/modules/fileicon/material.go @@ -18,13 +18,9 @@ import ( ) type materialIconRulesData struct { - IconDefinitions map[string]*struct { - IconPath string `json:"iconPath"` - } `json:"iconDefinitions"` FileNames map[string]string `json:"fileNames"` FolderNames map[string]string `json:"folderNames"` FileExtensions map[string]string `json:"fileExtensions"` - LanguageIDs map[string]string `json:"languageIds"` } type MaterialIconProvider struct { @@ -36,6 +32,7 @@ type MaterialIconProvider struct { var materialIconProvider MaterialIconProvider func DefaultMaterialIconProvider() *MaterialIconProvider { + materialIconProvider.once.Do(materialIconProvider.loadData) return &materialIconProvider } @@ -88,8 +85,6 @@ func (m *MaterialIconProvider) renderFileIconSVG(ctx reqctx.RequestContext, name } func (m *MaterialIconProvider) FileIcon(ctx reqctx.RequestContext, entry *git.TreeEntry) template.HTML { - m.once.Do(m.loadData) - if m.rules == nil { return BasicThemeIcon(entry) } @@ -101,7 +96,7 @@ func (m *MaterialIconProvider) FileIcon(ctx reqctx.RequestContext, entry *git.Tr return svg.RenderHTML("octicon-file-symlink-file") // TODO: find some better icons for them } - name := m.findIconName(entry) + name := m.findIconNameByGit(entry) if name == "folder" { // the material icon pack's "folder" icon doesn't look good, so use our built-in one return svg.RenderHTML("material-folder-generic") @@ -112,34 +107,23 @@ func (m *MaterialIconProvider) FileIcon(ctx reqctx.RequestContext, entry *git.Tr return svg.RenderHTML("octicon-file") } -func (m *MaterialIconProvider) findIconName(entry *git.TreeEntry) string { - if entry.IsSubModule() { - return "folder-git" - } - +func (m *MaterialIconProvider) FindIconName(name string, isDir bool) string { iconsData := m.rules - fileName := path.Base(entry.Name()) - - if entry.IsDir() { - if s, ok := iconsData.FolderNames[fileName]; ok { - return s - } - if s, ok := iconsData.FolderNames[strings.ToLower(fileName)]; ok { + fileNameLower := strings.ToLower(path.Base(name)) + if isDir { + if s, ok := iconsData.FolderNames[fileNameLower]; ok { return s } return "folder" } - if s, ok := iconsData.FileNames[fileName]; ok { - return s - } - if s, ok := iconsData.FileNames[strings.ToLower(fileName)]; ok { + if s, ok := iconsData.FileNames[fileNameLower]; ok { return s } - for i := len(fileName) - 1; i >= 0; i-- { - if fileName[i] == '.' { - ext := fileName[i+1:] + for i := len(fileNameLower) - 1; i >= 0; i-- { + if fileNameLower[i] == '.' { + ext := fileNameLower[i+1:] if s, ok := iconsData.FileExtensions[ext]; ok { return s } @@ -148,3 +132,10 @@ func (m *MaterialIconProvider) findIconName(entry *git.TreeEntry) string { return "file" } + +func (m *MaterialIconProvider) findIconNameByGit(entry *git.TreeEntry) string { + if entry.IsSubModule() { + return "folder-git" + } + return m.FindIconName(entry.Name(), entry.IsDir()) +} diff --git a/modules/fileicon/material_test.go b/modules/fileicon/material_test.go new file mode 100644 index 0000000000..bce316c692 --- /dev/null +++ b/modules/fileicon/material_test.go @@ -0,0 +1,24 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package fileicon_test + +import ( + "testing" + + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/fileicon" + + "github.com/stretchr/testify/assert" +) + +func TestMain(m *testing.M) { + unittest.MainTest(m, &unittest.TestOptions{FixtureFiles: []string{}}) +} + +func TestFindIconName(t *testing.T) { + unittest.PrepareTestEnv(t) + p := fileicon.DefaultMaterialIconProvider() + assert.Equal(t, "php", p.FindIconName("foo.php", false)) + assert.Equal(t, "php", p.FindIconName("foo.PHP", false)) +} diff --git a/modules/git/commit_info_nogogit.go b/modules/git/commit_info_nogogit.go index ef2df0b133..7a6af0410b 100644 --- a/modules/git/commit_info_nogogit.go +++ b/modules/git/commit_info_nogogit.go @@ -65,7 +65,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath log.Debug("missing commit for %s", entry.Name()) } - // If the entry if a submodule add a submodule file for this + // If the entry is a submodule add a submodule file for this if entry.IsSubModule() { subModuleURL := "" var fullPath string @@ -85,8 +85,8 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath } // Retrieve the commit for the treePath itself (see above). We basically - // get it for free during the tree traversal and it's used for listing - // pages to display information about newest commit for a given path. + // get it for free during the tree traversal, and it's used for listing + // pages to display information about the newest commit for a given path. var treeCommit *Commit var ok bool if treePath == "" { diff --git a/options/fileicon/material-icon-rules.json b/options/fileicon/material-icon-rules.json index b14867efea..05d56cc546 100644 --- a/options/fileicon/material-icon-rules.json +++ b/options/fileicon/material-icon-rules.json @@ -1,3222 +1,4 @@ { - "iconDefinitions": { - "git": { - "iconPath": "./../icons/git.svg" - }, - "github-actions-workflow": { - "iconPath": "./../icons/github-actions-workflow.svg" - }, - "yaml": { - "iconPath": "./../icons/yaml.svg" - }, - "xml": { - "iconPath": "./../icons/xml.svg" - }, - "matlab": { - "iconPath": "./../icons/matlab.svg" - }, - "settings": { - "iconPath": "./../icons/settings.svg" - }, - "toml": { - "iconPath": "./../icons/toml.svg" - }, - "toml_light": { - "iconPath": "./../icons/toml_light.svg" - }, - "diff": { - "iconPath": "./../icons/diff.svg" - }, - "json": { - "iconPath": "./../icons/json.svg" - }, - "blink": { - "iconPath": "./../icons/blink.svg" - }, - "java": { - "iconPath": "./../icons/java.svg" - }, - "razor": { - "iconPath": "./../icons/razor.svg" - }, - "python": { - "iconPath": "./../icons/python.svg" - }, - "mojo": { - "iconPath": "./../icons/mojo.svg" - }, - "javascript": { - "iconPath": "./../icons/javascript.svg" - }, - "typescript": { - "iconPath": "./../icons/typescript.svg" - }, - "scala": { - "iconPath": "./../icons/scala.svg" - }, - "handlebars": { - "iconPath": "./../icons/handlebars.svg" - }, - "perl": { - "iconPath": "./../icons/perl.svg" - }, - "haxe": { - "iconPath": "./../icons/haxe.svg" - }, - "puppet": { - "iconPath": "./../icons/puppet.svg" - }, - "elixir": { - "iconPath": "./../icons/elixir.svg" - }, - "livescript": { - "iconPath": "./../icons/livescript.svg" - }, - "erlang": { - "iconPath": "./../icons/erlang.svg" - }, - "twig": { - "iconPath": "./../icons/twig.svg" - }, - "julia": { - "iconPath": "./../icons/julia.svg" - }, - "elm": { - "iconPath": "./../icons/elm.svg" - }, - "purescript": { - "iconPath": "./../icons/purescript.svg" - }, - "stylus": { - "iconPath": "./../icons/stylus.svg" - }, - "nunjucks": { - "iconPath": "./../icons/nunjucks.svg" - }, - "pug": { - "iconPath": "./../icons/pug.svg" - }, - "robot": { - "iconPath": "./../icons/robot.svg" - }, - "sass": { - "iconPath": "./../icons/sass.svg" - }, - "less": { - "iconPath": "./../icons/less.svg" - }, - "css": { - "iconPath": "./../icons/css.svg" - }, - "visualstudio": { - "iconPath": "./../icons/visualstudio.svg" - }, - "angular": { - "iconPath": "./../icons/angular.svg" - }, - "graphql": { - "iconPath": "./../icons/graphql.svg" - }, - "solidity": { - "iconPath": "./../icons/solidity.svg" - }, - "autoit": { - "iconPath": "./../icons/autoit.svg" - }, - "haml": { - "iconPath": "./../icons/haml.svg" - }, - "yang": { - "iconPath": "./../icons/yang.svg" - }, - "terraform": { - "iconPath": "./../icons/terraform.svg" - }, - "applescript": { - "iconPath": "./../icons/applescript.svg" - }, - "cake": { - "iconPath": "./../icons/cake.svg" - }, - "cucumber": { - "iconPath": "./../icons/cucumber.svg" - }, - "nim": { - "iconPath": "./../icons/nim.svg" - }, - "apiblueprint": { - "iconPath": "./../icons/apiblueprint.svg" - }, - "riot": { - "iconPath": "./../icons/riot.svg" - }, - "postcss": { - "iconPath": "./../icons/postcss.svg" - }, - "coldfusion": { - "iconPath": "./../icons/coldfusion.svg" - }, - "haskell": { - "iconPath": "./../icons/haskell.svg" - }, - "dhall": { - "iconPath": "./../icons/dhall.svg" - }, - "cabal": { - "iconPath": "./../icons/cabal.svg" - }, - "nix": { - "iconPath": "./../icons/nix.svg" - }, - "ruby": { - "iconPath": "./../icons/ruby.svg" - }, - "slim": { - "iconPath": "./../icons/slim.svg" - }, - "php": { - "iconPath": "./../icons/php.svg" - }, - "php_elephant": { - "iconPath": "./../icons/php_elephant.svg" - }, - "php_elephant_pink": { - "iconPath": "./../icons/php_elephant_pink.svg" - }, - "hack": { - "iconPath": "./../icons/hack.svg" - }, - "react": { - "iconPath": "./../icons/react.svg" - }, - "mjml": { - "iconPath": "./../icons/mjml.svg" - }, - "processing": { - "iconPath": "./../icons/processing.svg" - }, - "hcl": { - "iconPath": "./../icons/hcl.svg" - }, - "go": { - "iconPath": "./../icons/go.svg" - }, - "go_gopher": { - "iconPath": "./../icons/go_gopher.svg" - }, - "nodejs_alt": { - "iconPath": "./../icons/nodejs_alt.svg" - }, - "django": { - "iconPath": "./../icons/django.svg" - }, - "html": { - "iconPath": "./../icons/html.svg" - }, - "godot": { - "iconPath": "./../icons/godot.svg" - }, - "godot-assets": { - "iconPath": "./../icons/godot-assets.svg" - }, - "vim": { - "iconPath": "./../icons/vim.svg" - }, - "silverstripe": { - "iconPath": "./../icons/silverstripe.svg" - }, - "prolog": { - "iconPath": "./../icons/prolog.svg" - }, - "pawn": { - "iconPath": "./../icons/pawn.svg" - }, - "reason": { - "iconPath": "./../icons/reason.svg" - }, - "sml": { - "iconPath": "./../icons/sml.svg" - }, - "tex": { - "iconPath": "./../icons/tex.svg" - }, - "salesforce": { - "iconPath": "./../icons/salesforce.svg" - }, - "sas": { - "iconPath": "./../icons/sas.svg" - }, - "docker": { - "iconPath": "./../icons/docker.svg" - }, - "table": { - "iconPath": "./../icons/table.svg" - }, - "csharp": { - "iconPath": "./../icons/csharp.svg" - }, - "console": { - "iconPath": "./../icons/console.svg" - }, - "c": { - "iconPath": "./../icons/c.svg" - }, - "cpp": { - "iconPath": "./../icons/cpp.svg" - }, - "objective-c": { - "iconPath": "./../icons/objective-c.svg" - }, - "objective-cpp": { - "iconPath": "./../icons/objective-cpp.svg" - }, - "c3": { - "iconPath": "./../icons/c3.svg" - }, - "coffee": { - "iconPath": "./../icons/coffee.svg" - }, - "fsharp": { - "iconPath": "./../icons/fsharp.svg" - }, - "editorconfig": { - "iconPath": "./../icons/editorconfig.svg" - }, - "clojure": { - "iconPath": "./../icons/clojure.svg" - }, - "groovy": { - "iconPath": "./../icons/groovy.svg" - }, - "markdoc": { - "iconPath": "./../icons/markdoc.svg" - }, - "markdown": { - "iconPath": "./../icons/markdown.svg" - }, - "jinja": { - "iconPath": "./../icons/jinja.svg" - }, - "proto": { - "iconPath": "./../icons/proto.svg" - }, - "python-misc": { - "iconPath": "./../icons/python-misc.svg" - }, - "vue": { - "iconPath": "./../icons/vue.svg" - }, - "lua": { - "iconPath": "./../icons/lua.svg" - }, - "lib": { - "iconPath": "./../icons/lib.svg" - }, - "log": { - "iconPath": "./../icons/log.svg" - }, - "jupyter": { - "iconPath": "./../icons/jupyter.svg" - }, - "document": { - "iconPath": "./../icons/document.svg" - }, - "pdf": { - "iconPath": "./../icons/pdf.svg" - }, - "powershell": { - "iconPath": "./../icons/powershell.svg" - }, - "r": { - "iconPath": "./../icons/r.svg" - }, - "rust": { - "iconPath": "./../icons/rust.svg" - }, - "database": { - "iconPath": "./../icons/database.svg" - }, - "kusto": { - "iconPath": "./../icons/kusto.svg" - }, - "lock": { - "iconPath": "./../icons/lock.svg" - }, - "svg": { - "iconPath": "./../icons/svg.svg" - }, - "swift": { - "iconPath": "./../icons/swift.svg" - }, - "react_ts": { - "iconPath": "./../icons/react_ts.svg" - }, - "search": { - "iconPath": "./../icons/search.svg" - }, - "minecraft": { - "iconPath": "./../icons/minecraft.svg" - }, - "rescript": { - "iconPath": "./../icons/rescript.svg" - }, - "otne": { - "iconPath": "./../icons/otne.svg" - }, - "twine": { - "iconPath": "./../icons/twine.svg" - }, - "grain": { - "iconPath": "./../icons/grain.svg" - }, - "lolcode": { - "iconPath": "./../icons/lolcode.svg" - }, - "idris": { - "iconPath": "./../icons/idris.svg" - }, - "chess": { - "iconPath": "./../icons/chess.svg" - }, - "gemini": { - "iconPath": "./../icons/gemini.svg" - }, - "vlang": { - "iconPath": "./../icons/vlang.svg" - }, - "wolframlanguage": { - "iconPath": "./../icons/wolframlanguage.svg" - }, - "shader": { - "iconPath": "./../icons/shader.svg" - }, - "tree": { - "iconPath": "./../icons/tree.svg" - }, - "svelte": { - "iconPath": "./../icons/svelte.svg" - }, - "dart": { - "iconPath": "./../icons/dart.svg" - }, - "cadence": { - "iconPath": "./../icons/cadence.svg" - }, - "stylable": { - "iconPath": "./../icons/stylable.svg" - }, - "hjson": { - "iconPath": "./../icons/hjson.svg" - }, - "huff": { - "iconPath": "./../icons/huff.svg" - }, - "cds": { - "iconPath": "./../icons/cds.svg" - }, - "concourse": { - "iconPath": "./../icons/concourse.svg" - }, - "systemd": { - "iconPath": "./../icons/systemd.svg" - }, - "systemd_light": { - "iconPath": "./../icons/systemd_light.svg" - }, - "slint": { - "iconPath": "./../icons/slint.svg" - }, - "luau": { - "iconPath": "./../icons/luau.svg" - }, - "hosts": { - "iconPath": "./../icons/hosts.svg" - }, - "beancount": { - "iconPath": "./../icons/beancount.svg" - }, - "ahk2": { - "iconPath": "./../icons/ahk2.clone.svg" - }, - "gnuplot": { - "iconPath": "./../icons/gnuplot.svg" - }, - "blink_light": { - "iconPath": "./../icons/blink_light.svg" - }, - "just": { - "iconPath": "./../icons/just.svg" - }, - "jinja_light": { - "iconPath": "./../icons/jinja_light.svg" - }, - "playwright": { - "iconPath": "./../icons/playwright.svg" - }, - "sublime": { - "iconPath": "./../icons/sublime.svg" - }, - "simulink": { - "iconPath": "./../icons/simulink.svg" - }, - "image": { - "iconPath": "./../icons/image.svg" - }, - "palette": { - "iconPath": "./../icons/palette.svg" - }, - "rocket": { - "iconPath": "./../icons/rocket.svg" - }, - "routing": { - "iconPath": "./../icons/routing.svg" - }, - "redux-action": { - "iconPath": "./../icons/redux-action.svg" - }, - "redux-reducer": { - "iconPath": "./../icons/redux-reducer.svg" - }, - "redux-selector": { - "iconPath": "./../icons/redux-selector.svg" - }, - "redux-store": { - "iconPath": "./../icons/redux-store.svg" - }, - "typescript-def": { - "iconPath": "./../icons/typescript-def.svg" - }, - "markdoc-config": { - "iconPath": "./../icons/markdoc-config.svg" - }, - "markojs": { - "iconPath": "./../icons/markojs.svg" - }, - "astro": { - "iconPath": "./../icons/astro.svg" - }, - "astro-config": { - "iconPath": "./../icons/astro-config.svg" - }, - "vscode": { - "iconPath": "./../icons/vscode.svg" - }, - "qsharp": { - "iconPath": "./../icons/qsharp.svg" - }, - "zip": { - "iconPath": "./../icons/zip.svg" - }, - "vala": { - "iconPath": "./../icons/vala.svg" - }, - "zig": { - "iconPath": "./../icons/zig.svg" - }, - "exe": { - "iconPath": "./../icons/exe.svg" - }, - "hex": { - "iconPath": "./../icons/hex.svg" - }, - "jar": { - "iconPath": "./../icons/jar.svg" - }, - "javaclass": { - "iconPath": "./../icons/javaclass.svg" - }, - "h": { - "iconPath": "./../icons/h.svg" - }, - "hpp": { - "iconPath": "./../icons/hpp.svg" - }, - "rc": { - "iconPath": "./../icons/rc.svg" - }, - "go-mod": { - "iconPath": "./../icons/go-mod.svg" - }, - "ruff": { - "iconPath": "./../icons/ruff.svg" - }, - "uv": { - "iconPath": "./../icons/uv.svg" - }, - "scons": { - "iconPath": "./../icons/scons.svg" - }, - "scons_light": { - "iconPath": "./../icons/scons_light.svg" - }, - "url": { - "iconPath": "./../icons/url.svg" - }, - "gradle": { - "iconPath": "./../icons/gradle.svg" - }, - "word": { - "iconPath": "./../icons/word.svg" - }, - "certificate": { - "iconPath": "./../icons/certificate.svg" - }, - "key": { - "iconPath": "./../icons/key.svg" - }, - "keystatic": { - "iconPath": "./../icons/keystatic.svg" - }, - "font": { - "iconPath": "./../icons/font.svg" - }, - "dll": { - "iconPath": "./../icons/dll.svg" - }, - "gemfile": { - "iconPath": "./../icons/gemfile.svg" - }, - "rubocop": { - "iconPath": "./../icons/rubocop.svg" - }, - "rubocop_light": { - "iconPath": "./../icons/rubocop_light.svg" - }, - "rspec": { - "iconPath": "./../icons/rspec.svg" - }, - "arduino": { - "iconPath": "./../icons/arduino.svg" - }, - "powerpoint": { - "iconPath": "./../icons/powerpoint.svg" - }, - "video": { - "iconPath": "./../icons/video.svg" - }, - "virtual": { - "iconPath": "./../icons/virtual.svg" - }, - "vedic": { - "iconPath": "./../icons/vedic.svg" - }, - "email": { - "iconPath": "./../icons/email.svg" - }, - "audio": { - "iconPath": "./../icons/audio.svg" - }, - "lyric": { - "iconPath": "./../icons/lyric.svg" - }, - "raml": { - "iconPath": "./../icons/raml.svg" - }, - "xaml": { - "iconPath": "./../icons/xaml.svg" - }, - "kotlin": { - "iconPath": "./../icons/kotlin.svg" - }, - "mist": { - "iconPath": "./../icons/mist.clone.svg" - }, - "dart_generated": { - "iconPath": "./../icons/dart_generated.svg" - }, - "actionscript": { - "iconPath": "./../icons/actionscript.svg" - }, - "mxml": { - "iconPath": "./../icons/mxml.svg" - }, - "autohotkey": { - "iconPath": "./../icons/autohotkey.svg" - }, - "flash": { - "iconPath": "./../icons/flash.svg" - }, - "adobe-swc": { - "iconPath": "./../icons/adobe-swc.svg" - }, - "swc": { - "iconPath": "./../icons/swc.svg" - }, - "cmake": { - "iconPath": "./../icons/cmake.svg" - }, - "assembly": { - "iconPath": "./../icons/assembly.svg" - }, - "semgrep": { - "iconPath": "./../icons/semgrep.svg" - }, - "vue-config": { - "iconPath": "./../icons/vue-config.svg" - }, - "vuex-store": { - "iconPath": "./../icons/vuex-store.svg" - }, - "nuxt": { - "iconPath": "./../icons/nuxt.svg" - }, - "harmonix": { - "iconPath": "./../icons/harmonix.svg" - }, - "ocaml": { - "iconPath": "./../icons/ocaml.svg" - }, - "odin": { - "iconPath": "./../icons/odin.svg" - }, - "javascript-map": { - "iconPath": "./../icons/javascript-map.svg" - }, - "css-map": { - "iconPath": "./../icons/css-map.svg" - }, - "test-ts": { - "iconPath": "./../icons/test-ts.svg" - }, - "test-jsx": { - "iconPath": "./../icons/test-jsx.svg" - }, - "test-js": { - "iconPath": "./../icons/test-js.svg" - }, - "angular-component": { - "iconPath": "./../icons/angular-component.clone.svg" - }, - "angular-guard": { - "iconPath": "./../icons/angular-guard.clone.svg" - }, - "angular-service": { - "iconPath": "./../icons/angular-service.clone.svg" - }, - "angular-pipe": { - "iconPath": "./../icons/angular-pipe.clone.svg" - }, - "angular-directive": { - "iconPath": "./../icons/angular-directive.clone.svg" - }, - "angular-resolver": { - "iconPath": "./../icons/angular-resolver.clone.svg" - }, - "angular-interceptor": { - "iconPath": "./../icons/angular-interceptor.clone.svg" - }, - "smarty": { - "iconPath": "./../icons/smarty.svg" - }, - "bucklescript": { - "iconPath": "./../icons/bucklescript.svg" - }, - "merlin": { - "iconPath": "./../icons/merlin.svg" - }, - "verilog": { - "iconPath": "./../icons/verilog.svg" - }, - "mathematica": { - "iconPath": "./../icons/mathematica.svg" - }, - "vercel": { - "iconPath": "./../icons/vercel.svg" - }, - "vercel_light": { - "iconPath": "./../icons/vercel_light.svg" - }, - "liara": { - "iconPath": "./../icons/liara.svg" - }, - "verdaccio": { - "iconPath": "./../icons/verdaccio.svg" - }, - "payload": { - "iconPath": "./../icons/payload.svg" - }, - "payload_light": { - "iconPath": "./../icons/payload_light.svg" - }, - "next": { - "iconPath": "./../icons/next.svg" - }, - "next_light": { - "iconPath": "./../icons/next_light.svg" - }, - "remark": { - "iconPath": "./../icons/remark.svg" - }, - "remix": { - "iconPath": "./../icons/remix.svg" - }, - "remix_light": { - "iconPath": "./../icons/remix_light.svg" - }, - "laravel": { - "iconPath": "./../icons/laravel.svg" - }, - "vfl": { - "iconPath": "./../icons/vfl.svg" - }, - "kl": { - "iconPath": "./../icons/kl.svg" - }, - "posthtml": { - "iconPath": "./../icons/posthtml.svg" - }, - "todo": { - "iconPath": "./../icons/todo.svg" - }, - "http": { - "iconPath": "./../icons/http.svg" - }, - "restql": { - "iconPath": "./../icons/restql.svg" - }, - "kivy": { - "iconPath": "./../icons/kivy.svg" - }, - "graphcool": { - "iconPath": "./../icons/graphcool.svg" - }, - "sbt": { - "iconPath": "./../icons/sbt.svg" - }, - "webpack": { - "iconPath": "./../icons/webpack.svg" - }, - "ionic": { - "iconPath": "./../icons/ionic.svg" - }, - "gulp": { - "iconPath": "./../icons/gulp.svg" - }, - "nodejs": { - "iconPath": "./../icons/nodejs.svg" - }, - "npm": { - "iconPath": "./../icons/npm.svg" - }, - "yarn": { - "iconPath": "./../icons/yarn.svg" - }, - "android": { - "iconPath": "./../icons/android.svg" - }, - "tune": { - "iconPath": "./../icons/tune.svg" - }, - "turborepo": { - "iconPath": "./../icons/turborepo.svg" - }, - "turborepo_light": { - "iconPath": "./../icons/turborepo_light.svg" - }, - "babel": { - "iconPath": "./../icons/babel.svg" - }, - "blitz": { - "iconPath": "./../icons/blitz.svg" - }, - "contributing": { - "iconPath": "./../icons/contributing.svg" - }, - "readme": { - "iconPath": "./../icons/readme.svg" - }, - "changelog": { - "iconPath": "./../icons/changelog.svg" - }, - "architecture": { - "iconPath": "./../icons/architecture.svg" - }, - "credits": { - "iconPath": "./../icons/credits.svg" - }, - "authors": { - "iconPath": "./../icons/authors.svg" - }, - "flow": { - "iconPath": "./../icons/flow.svg" - }, - "favicon": { - "iconPath": "./../icons/favicon.svg" - }, - "karma": { - "iconPath": "./../icons/karma.svg" - }, - "bithound": { - "iconPath": "./../icons/bithound.svg" - }, - "svgo": { - "iconPath": "./../icons/svgo.svg" - }, - "appveyor": { - "iconPath": "./../icons/appveyor.svg" - }, - "travis": { - "iconPath": "./../icons/travis.svg" - }, - "codecov": { - "iconPath": "./../icons/codecov.svg" - }, - "sonarcloud": { - "iconPath": "./../icons/sonarcloud.svg" - }, - "protractor": { - "iconPath": "./../icons/protractor.svg" - }, - "fusebox": { - "iconPath": "./../icons/fusebox.svg" - }, - "heroku": { - "iconPath": "./../icons/heroku.svg" - }, - "gitlab": { - "iconPath": "./../icons/gitlab.svg" - }, - "bower": { - "iconPath": "./../icons/bower.svg" - }, - "eslint": { - "iconPath": "./../icons/eslint.svg" - }, - "conduct": { - "iconPath": "./../icons/conduct.svg" - }, - "watchman": { - "iconPath": "./../icons/watchman.svg" - }, - "aurelia": { - "iconPath": "./../icons/aurelia.svg" - }, - "auto": { - "iconPath": "./../icons/auto.svg" - }, - "auto_light": { - "iconPath": "./../icons/auto_light.svg" - }, - "mocha": { - "iconPath": "./../icons/mocha.svg" - }, - "jenkins": { - "iconPath": "./../icons/jenkins.svg" - }, - "firebase": { - "iconPath": "./../icons/firebase.svg" - }, - "figma": { - "iconPath": "./../icons/figma.svg" - }, - "rollup": { - "iconPath": "./../icons/rollup.svg" - }, - "huff_light": { - "iconPath": "./../icons/huff_light.svg" - }, - "hardhat": { - "iconPath": "./../icons/hardhat.svg" - }, - "stylelint": { - "iconPath": "./../icons/stylelint.svg" - }, - "stylelint_light": { - "iconPath": "./../icons/stylelint_light.svg" - }, - "code-climate": { - "iconPath": "./../icons/code-climate.svg" - }, - "code-climate_light": { - "iconPath": "./../icons/code-climate_light.svg" - }, - "prettier": { - "iconPath": "./../icons/prettier.svg" - }, - "renovate": { - "iconPath": "./../icons/renovate.svg" - }, - "apollo": { - "iconPath": "./../icons/apollo.svg" - }, - "nodemon": { - "iconPath": "./../icons/nodemon.svg" - }, - "ngrx-reducer": { - "iconPath": "./../icons/ngrx-reducer.svg" - }, - "ngrx-state": { - "iconPath": "./../icons/ngrx-state.svg" - }, - "ngrx-actions": { - "iconPath": "./../icons/ngrx-actions.svg" - }, - "ngrx-effects": { - "iconPath": "./../icons/ngrx-effects.svg" - }, - "ngrx-entity": { - "iconPath": "./../icons/ngrx-entity.svg" - }, - "ngrx-selectors": { - "iconPath": "./../icons/ngrx-selectors.svg" - }, - "webhint": { - "iconPath": "./../icons/webhint.svg" - }, - "browserlist": { - "iconPath": "./../icons/browserlist.svg" - }, - "browserlist_light": { - "iconPath": "./../icons/browserlist_light.svg" - }, - "crystal": { - "iconPath": "./../icons/crystal.svg" - }, - "crystal_light": { - "iconPath": "./../icons/crystal_light.svg" - }, - "snyk": { - "iconPath": "./../icons/snyk.svg" - }, - "drone": { - "iconPath": "./../icons/drone.svg" - }, - "drone_light": { - "iconPath": "./../icons/drone_light.svg" - }, - "cuda": { - "iconPath": "./../icons/cuda.svg" - }, - "dotjs": { - "iconPath": "./../icons/dotjs.svg" - }, - "ejs": { - "iconPath": "./../icons/ejs.svg" - }, - "sequelize": { - "iconPath": "./../icons/sequelize.svg" - }, - "gatsby": { - "iconPath": "./../icons/gatsby.svg" - }, - "wakatime": { - "iconPath": "./../icons/wakatime.svg" - }, - "wakatime_light": { - "iconPath": "./../icons/wakatime_light.svg" - }, - "circleci": { - "iconPath": "./../icons/circleci.svg" - }, - "circleci_light": { - "iconPath": "./../icons/circleci_light.svg" - }, - "cloudfoundry": { - "iconPath": "./../icons/cloudfoundry.svg" - }, - "grunt": { - "iconPath": "./../icons/grunt.svg" - }, - "jest": { - "iconPath": "./../icons/jest.svg" - }, - "storybook": { - "iconPath": "./../icons/storybook.svg" - }, - "wepy": { - "iconPath": "./../icons/wepy.svg" - }, - "fastlane": { - "iconPath": "./../icons/fastlane.svg" - }, - "hcl_light": { - "iconPath": "./../icons/hcl_light.svg" - }, - "helm": { - "iconPath": "./../icons/helm.svg" - }, - "san": { - "iconPath": "./../icons/san.svg" - }, - "quokka": { - "iconPath": "./../icons/quokka.svg" - }, - "wallaby": { - "iconPath": "./../icons/wallaby.svg" - }, - "stencil": { - "iconPath": "./../icons/stencil.svg" - }, - "red": { - "iconPath": "./../icons/red.svg" - }, - "makefile": { - "iconPath": "./../icons/makefile.svg" - }, - "foxpro": { - "iconPath": "./../icons/foxpro.svg" - }, - "i18n": { - "iconPath": "./../icons/i18n.svg" - }, - "webassembly": { - "iconPath": "./../icons/webassembly.svg" - }, - "semantic-release": { - "iconPath": "./../icons/semantic-release.svg" - }, - "semantic-release_light": { - "iconPath": "./../icons/semantic-release_light.svg" - }, - "bitbucket": { - "iconPath": "./../icons/bitbucket.svg" - }, - "d": { - "iconPath": "./../icons/d.svg" - }, - "mdx": { - "iconPath": "./../icons/mdx.svg" - }, - "mdsvex": { - "iconPath": "./../icons/mdsvex.svg" - }, - "ballerina": { - "iconPath": "./../icons/ballerina.svg" - }, - "racket": { - "iconPath": "./../icons/racket.svg" - }, - "bazel": { - "iconPath": "./../icons/bazel.svg" - }, - "mint": { - "iconPath": "./../icons/mint.svg" - }, - "velocity": { - "iconPath": "./../icons/velocity.svg" - }, - "azure-pipelines": { - "iconPath": "./../icons/azure-pipelines.svg" - }, - "azure": { - "iconPath": "./../icons/azure.svg" - }, - "vagrant": { - "iconPath": "./../icons/vagrant.svg" - }, - "prisma": { - "iconPath": "./../icons/prisma.svg" - }, - "abc": { - "iconPath": "./../icons/abc.svg" - }, - "asciidoc": { - "iconPath": "./../icons/asciidoc.svg" - }, - "istanbul": { - "iconPath": "./../icons/istanbul.svg" - }, - "edge": { - "iconPath": "./../icons/edge.svg" - }, - "scheme": { - "iconPath": "./../icons/scheme.svg" - }, - "lisp": { - "iconPath": "./../icons/lisp.svg" - }, - "tailwindcss": { - "iconPath": "./../icons/tailwindcss.svg" - }, - "3d": { - "iconPath": "./../icons/3d.svg" - }, - "buildkite": { - "iconPath": "./../icons/buildkite.svg" - }, - "netlify": { - "iconPath": "./../icons/netlify.svg" - }, - "netlify_light": { - "iconPath": "./../icons/netlify_light.svg" - }, - "svelte_js": { - "iconPath": "./../icons/svelte_js.clone.svg" - }, - "svelte_ts": { - "iconPath": "./../icons/svelte_ts.clone.svg" - }, - "nest": { - "iconPath": "./../icons/nest.svg" - }, - "nest-controller": { - "iconPath": "./../icons/nest-controller.clone.svg" - }, - "nest-middleware": { - "iconPath": "./../icons/nest-middleware.clone.svg" - }, - "nest-module": { - "iconPath": "./../icons/nest-module.clone.svg" - }, - "nest-service": { - "iconPath": "./../icons/nest-service.clone.svg" - }, - "nest-decorator": { - "iconPath": "./../icons/nest-decorator.clone.svg" - }, - "nest-pipe": { - "iconPath": "./../icons/nest-pipe.clone.svg" - }, - "nest-filter": { - "iconPath": "./../icons/nest-filter.clone.svg" - }, - "nest-gateway": { - "iconPath": "./../icons/nest-gateway.clone.svg" - }, - "nest-guard": { - "iconPath": "./../icons/nest-guard.clone.svg" - }, - "nest-resolver": { - "iconPath": "./../icons/nest-resolver.clone.svg" - }, - "nest-interceptor": { - "iconPath": "./../icons/nest-interceptor.clone.svg" - }, - "moon": { - "iconPath": "./../icons/moon.svg" - }, - "moonscript": { - "iconPath": "./../icons/moonscript.svg" - }, - "percy": { - "iconPath": "./../icons/percy.svg" - }, - "gitpod": { - "iconPath": "./../icons/gitpod.svg" - }, - "stackblitz": { - "iconPath": "./../icons/stackblitz.svg" - }, - "advpl": { - "iconPath": "./../icons/advpl.svg" - }, - "advpl-ptm": { - "iconPath": "./../icons/advpl-ptm.clone.svg" - }, - "advpl-tlpp": { - "iconPath": "./../icons/advpl-tlpp.clone.svg" - }, - "advpl-include": { - "iconPath": "./../icons/advpl-include.clone.svg" - }, - "codeowners": { - "iconPath": "./../icons/codeowners.svg" - }, - "gcp": { - "iconPath": "./../icons/gcp.svg" - }, - "amplify": { - "iconPath": "./../icons/amplify.svg" - }, - "disc": { - "iconPath": "./../icons/disc.svg" - }, - "fortran": { - "iconPath": "./../icons/fortran.svg" - }, - "tcl": { - "iconPath": "./../icons/tcl.svg" - }, - "liquid": { - "iconPath": "./../icons/liquid.svg" - }, - "husky": { - "iconPath": "./../icons/husky.svg" - }, - "coconut": { - "iconPath": "./../icons/coconut.svg" - }, - "tilt": { - "iconPath": "./../icons/tilt.svg" - }, - "capacitor": { - "iconPath": "./../icons/capacitor.svg" - }, - "sketch": { - "iconPath": "./../icons/sketch.svg" - }, - "adonis": { - "iconPath": "./../icons/adonis.svg" - }, - "forth": { - "iconPath": "./../icons/forth.svg" - }, - "uml": { - "iconPath": "./../icons/uml.svg" - }, - "uml_light": { - "iconPath": "./../icons/uml_light.svg" - }, - "meson": { - "iconPath": "./../icons/meson.svg" - }, - "commitizen": { - "iconPath": "./../icons/commitizen.svg" - }, - "commitlint": { - "iconPath": "./../icons/commitlint.svg" - }, - "buck": { - "iconPath": "./../icons/buck.svg" - }, - "nx": { - "iconPath": "./../icons/nx.svg" - }, - "opam": { - "iconPath": "./../icons/opam.svg" - }, - "dune": { - "iconPath": "./../icons/dune.svg" - }, - "imba": { - "iconPath": "./../icons/imba.svg" - }, - "drawio": { - "iconPath": "./../icons/drawio.svg" - }, - "pascal": { - "iconPath": "./../icons/pascal.svg" - }, - "unity": { - "iconPath": "./../icons/unity.svg" - }, - "roadmap": { - "iconPath": "./../icons/roadmap.svg" - }, - "nuget": { - "iconPath": "./../icons/nuget.svg" - }, - "command": { - "iconPath": "./../icons/command.svg" - }, - "stryker": { - "iconPath": "./../icons/stryker.svg" - }, - "denizenscript": { - "iconPath": "./../icons/denizenscript.svg" - }, - "modernizr": { - "iconPath": "./../icons/modernizr.svg" - }, - "slug": { - "iconPath": "./../icons/slug.svg" - }, - "stitches": { - "iconPath": "./../icons/stitches.svg" - }, - "stitches_light": { - "iconPath": "./../icons/stitches_light.svg" - }, - "nginx": { - "iconPath": "./../icons/nginx.svg" - }, - "replit": { - "iconPath": "./../icons/replit.svg" - }, - "rescript-interface": { - "iconPath": "./../icons/rescript-interface.svg" - }, - "duc": { - "iconPath": "./../icons/duc.svg" - }, - "snowpack": { - "iconPath": "./../icons/snowpack.svg" - }, - "snowpack_light": { - "iconPath": "./../icons/snowpack_light.svg" - }, - "brainfuck": { - "iconPath": "./../icons/brainfuck.svg" - }, - "bicep": { - "iconPath": "./../icons/bicep.svg" - }, - "cobol": { - "iconPath": "./../icons/cobol.svg" - }, - "quasar": { - "iconPath": "./../icons/quasar.svg" - }, - "dependabot": { - "iconPath": "./../icons/dependabot.svg" - }, - "pipeline": { - "iconPath": "./../icons/pipeline.svg" - }, - "vite": { - "iconPath": "./../icons/vite.svg" - }, - "vitest": { - "iconPath": "./../icons/vitest.svg" - }, - "velite": { - "iconPath": "./../icons/velite.svg" - }, - "opa": { - "iconPath": "./../icons/opa.svg" - }, - "lerna": { - "iconPath": "./../icons/lerna.svg" - }, - "windicss": { - "iconPath": "./../icons/windicss.svg" - }, - "textlint": { - "iconPath": "./../icons/textlint.svg" - }, - "lilypond": { - "iconPath": "./../icons/lilypond.svg" - }, - "chess_light": { - "iconPath": "./../icons/chess_light.svg" - }, - "sentry": { - "iconPath": "./../icons/sentry.svg" - }, - "contentlayer": { - "iconPath": "./../icons/contentlayer.svg" - }, - "phpunit": { - "iconPath": "./../icons/phpunit.svg" - }, - "php-cs-fixer": { - "iconPath": "./../icons/php-cs-fixer.svg" - }, - "robots": { - "iconPath": "./../icons/robots.svg" - }, - "tsconfig": { - "iconPath": "./../icons/tsconfig.svg" - }, - "tauri": { - "iconPath": "./../icons/tauri.svg" - }, - "jsconfig": { - "iconPath": "./../icons/jsconfig.svg" - }, - "maven": { - "iconPath": "./../icons/maven.svg" - }, - "ada": { - "iconPath": "./../icons/ada.svg" - }, - "serverless": { - "iconPath": "./../icons/serverless.svg" - }, - "supabase": { - "iconPath": "./../icons/supabase.svg" - }, - "ember": { - "iconPath": "./../icons/ember.svg" - }, - "horusec": { - "iconPath": "./../icons/horusec.svg" - }, - "poetry": { - "iconPath": "./../icons/poetry.svg" - }, - "pdm": { - "iconPath": "./../icons/pdm.svg" - }, - "coala": { - "iconPath": "./../icons/coala.svg" - }, - "parcel": { - "iconPath": "./../icons/parcel.svg" - }, - "dinophp": { - "iconPath": "./../icons/dinophp.svg" - }, - "teal": { - "iconPath": "./../icons/teal.svg" - }, - "template": { - "iconPath": "./../icons/template.svg" - }, - "astyle": { - "iconPath": "./../icons/astyle.svg" - }, - "lighthouse": { - "iconPath": "./../icons/lighthouse.svg" - }, - "svgr": { - "iconPath": "./../icons/svgr.svg" - }, - "rome": { - "iconPath": "./../icons/rome.svg" - }, - "cypress": { - "iconPath": "./../icons/cypress.svg" - }, - "siyuan": { - "iconPath": "./../icons/siyuan.svg" - }, - "ndst": { - "iconPath": "./../icons/ndst.svg" - }, - "plop": { - "iconPath": "./../icons/plop.svg" - }, - "tobi": { - "iconPath": "./../icons/tobi.svg" - }, - "tobimake": { - "iconPath": "./../icons/tobimake.svg" - }, - "gleam": { - "iconPath": "./../icons/gleam.svg" - }, - "pnpm": { - "iconPath": "./../icons/pnpm.svg" - }, - "pnpm_light": { - "iconPath": "./../icons/pnpm_light.svg" - }, - "gridsome": { - "iconPath": "./../icons/gridsome.svg" - }, - "steadybit": { - "iconPath": "./../icons/steadybit.svg" - }, - "capnp": { - "iconPath": "./../icons/capnp.svg" - }, - "caddy": { - "iconPath": "./../icons/caddy.svg" - }, - "openapi": { - "iconPath": "./../icons/openapi.svg" - }, - "openapi_light": { - "iconPath": "./../icons/openapi_light.svg" - }, - "swagger": { - "iconPath": "./../icons/swagger.svg" - }, - "bun": { - "iconPath": "./../icons/bun.svg" - }, - "bun_light": { - "iconPath": "./../icons/bun_light.svg" - }, - "antlr": { - "iconPath": "./../icons/antlr.svg" - }, - "pinejs": { - "iconPath": "./../icons/pinejs.svg" - }, - "nano-staged": { - "iconPath": "./../icons/nano-staged.svg" - }, - "nano-staged_light": { - "iconPath": "./../icons/nano-staged_light.svg" - }, - "knip": { - "iconPath": "./../icons/knip.svg" - }, - "taskfile": { - "iconPath": "./../icons/taskfile.svg" - }, - "craco": { - "iconPath": "./../icons/craco.svg" - }, - "gamemaker": { - "iconPath": "./../icons/gamemaker.svg" - }, - "tldraw": { - "iconPath": "./../icons/tldraw.svg" - }, - "tldraw_light": { - "iconPath": "./../icons/tldraw_light.svg" - }, - "mercurial": { - "iconPath": "./../icons/mercurial.svg" - }, - "deno": { - "iconPath": "./../icons/deno.svg" - }, - "deno_light": { - "iconPath": "./../icons/deno_light.svg" - }, - "plastic": { - "iconPath": "./../icons/plastic.svg" - }, - "typst": { - "iconPath": "./../icons/typst.svg" - }, - "unocss": { - "iconPath": "./../icons/unocss.svg" - }, - "ifanr-cloud": { - "iconPath": "./../icons/ifanr-cloud.svg" - }, - "qwik": { - "iconPath": "./../icons/qwik.svg" - }, - "mermaid": { - "iconPath": "./../icons/mermaid.svg" - }, - "syncpack": { - "iconPath": "./../icons/syncpack.svg" - }, - "werf": { - "iconPath": "./../icons/werf.svg" - }, - "roblox": { - "iconPath": "./../icons/roblox.svg" - }, - "rojo": { - "iconPath": "./../icons/rojo.svg" - }, - "wally": { - "iconPath": "./../icons/wally.svg" - }, - "rbxmk": { - "iconPath": "./../icons/rbxmk.svg" - }, - "panda": { - "iconPath": "./../icons/panda.svg" - }, - "biome": { - "iconPath": "./../icons/biome.svg" - }, - "esbuild": { - "iconPath": "./../icons/esbuild.svg" - }, - "spwn": { - "iconPath": "./../icons/spwn.svg" - }, - "templ": { - "iconPath": "./../icons/templ.svg" - }, - "chrome": { - "iconPath": "./../icons/chrome.svg" - }, - "stan": { - "iconPath": "./../icons/stan.svg" - }, - "abap": { - "iconPath": "./../icons/abap.svg" - }, - "drizzle": { - "iconPath": "./../icons/drizzle.svg" - }, - "lottie": { - "iconPath": "./../icons/lottie.svg" - }, - "puppeteer": { - "iconPath": "./../icons/puppeteer.svg" - }, - "apps-script": { - "iconPath": "./../icons/apps-script.svg" - }, - "garden": { - "iconPath": "./../icons/garden.svg" - }, - "pkl": { - "iconPath": "./../icons/pkl.svg" - }, - "kubernetes": { - "iconPath": "./../icons/kubernetes.svg" - }, - "phpstan": { - "iconPath": "./../icons/phpstan.svg" - }, - "screwdriver": { - "iconPath": "./../icons/screwdriver.svg" - }, - "snapcraft": { - "iconPath": "./../icons/snapcraft.svg" - }, - "container": { - "iconPath": "./../icons/container.clone.svg" - }, - "kcl": { - "iconPath": "./../icons/kcl.svg" - }, - "verified": { - "iconPath": "./../icons/verified.svg" - }, - "bruno": { - "iconPath": "./../icons/bruno.svg" - }, - "cairo": { - "iconPath": "./../icons/cairo.svg" - }, - "grafana-alloy": { - "iconPath": "./../icons/grafana-alloy.svg" - }, - "clangd": { - "iconPath": "./../icons/clangd.svg" - }, - "freemarker": { - "iconPath": "./../icons/freemarker.svg" - }, - "markdownlint": { - "iconPath": "./../icons/markdownlint.svg" - }, - "tsil": { - "iconPath": "./../icons/tsil.svg" - }, - "trigger": { - "iconPath": "./../icons/trigger.svg" - }, - "deepsource": { - "iconPath": "./../icons/deepsource.svg" - }, - "tape": { - "iconPath": "./../icons/tape.clone.svg" - }, - "hurl": { - "iconPath": "./../icons/hurl.svg" - }, - "jsr": { - "iconPath": "./../icons/jsr.svg" - }, - "jsr_light": { - "iconPath": "./../icons/jsr_light.svg" - }, - "coderabbit-ai": { - "iconPath": "./../icons/coderabbit-ai.svg" - }, - "gemini-ai": { - "iconPath": "./../icons/gemini-ai.svg" - }, - "taze": { - "iconPath": "./../icons/taze.svg" - }, - "wxt": { - "iconPath": "./../icons/wxt.svg" - }, - "sway": { - "iconPath": "./../icons/sway.svg" - }, - "lefthook": { - "iconPath": "./../icons/lefthook.svg" - }, - "label": { - "iconPath": "./../icons/label.svg" - }, - "zeabur": { - "iconPath": "./../icons/zeabur.svg" - }, - "zeabur_light": { - "iconPath": "./../icons/zeabur_light.svg" - }, - "copilot": { - "iconPath": "./../icons/copilot.svg" - }, - "copilot_light": { - "iconPath": "./../icons/copilot_light.svg" - }, - "bench-ts": { - "iconPath": "./../icons/bench-ts.svg" - }, - "bench-jsx": { - "iconPath": "./../icons/bench-jsx.svg" - }, - "bench-js": { - "iconPath": "./../icons/bench-js.svg" - }, - "pre-commit": { - "iconPath": "./../icons/pre-commit.svg" - }, - "controller": { - "iconPath": "./../icons/controller.svg" - }, - "dependencies-update": { - "iconPath": "./../icons/dependencies-update.svg" - }, - "histoire": { - "iconPath": "./../icons/histoire.svg" - }, - "installation": { - "iconPath": "./../icons/installation.svg" - }, - "github-sponsors": { - "iconPath": "./../icons/github-sponsors.svg" - }, - "minecraft-fabric": { - "iconPath": "./../icons/minecraft-fabric.svg" - }, - "umi": { - "iconPath": "./../icons/umi.svg" - }, - "pm2-ecosystem": { - "iconPath": "./../icons/pm2-ecosystem.svg" - }, - "hosts_light": { - "iconPath": "./../icons/hosts_light.svg" - }, - "citation": { - "iconPath": "./../icons/citation.svg" - }, - "xmake": { - "iconPath": "./../icons/xmake.svg" - }, - "subtitles": { - "iconPath": "./../icons/subtitles.svg" - }, - "wrangler": { - "iconPath": "./../icons/wrangler.svg" - }, - "epub": { - "iconPath": "./../icons/epub.svg" - }, - "regedit": { - "iconPath": "./../icons/regedit.svg" - }, - "cline": { - "iconPath": "./../icons/cline.svg" - }, - "file": { - "iconPath": "./../icons/file.svg" - }, - "folder-rust": { - "iconPath": "./../icons/folder-rust.svg" - }, - "folder-rust-open": { - "iconPath": "./../icons/folder-rust-open.svg" - }, - "folder-robot": { - "iconPath": "./../icons/folder-robot.svg" - }, - "folder-robot-open": { - "iconPath": "./../icons/folder-robot-open.svg" - }, - "folder-src": { - "iconPath": "./../icons/folder-src.svg" - }, - "folder-src-open": { - "iconPath": "./../icons/folder-src-open.svg" - }, - "folder-dist": { - "iconPath": "./../icons/folder-dist.svg" - }, - "folder-dist-open": { - "iconPath": "./../icons/folder-dist-open.svg" - }, - "folder-css": { - "iconPath": "./../icons/folder-css.svg" - }, - "folder-css-open": { - "iconPath": "./../icons/folder-css-open.svg" - }, - "folder-sass": { - "iconPath": "./../icons/folder-sass.svg" - }, - "folder-sass-open": { - "iconPath": "./../icons/folder-sass-open.svg" - }, - "folder-television": { - "iconPath": "./../icons/folder-television.svg" - }, - "folder-television-open": { - "iconPath": "./../icons/folder-television-open.svg" - }, - "folder-desktop": { - "iconPath": "./../icons/folder-desktop.svg" - }, - "folder-desktop-open": { - "iconPath": "./../icons/folder-desktop-open.svg" - }, - "folder-console": { - "iconPath": "./../icons/folder-console.svg" - }, - "folder-console-open": { - "iconPath": "./../icons/folder-console-open.svg" - }, - "folder-images": { - "iconPath": "./../icons/folder-images.svg" - }, - "folder-images-open": { - "iconPath": "./../icons/folder-images-open.svg" - }, - "folder-scripts": { - "iconPath": "./../icons/folder-scripts.svg" - }, - "folder-scripts-open": { - "iconPath": "./../icons/folder-scripts-open.svg" - }, - "folder-node": { - "iconPath": "./../icons/folder-node.svg" - }, - "folder-node-open": { - "iconPath": "./../icons/folder-node-open.svg" - }, - "folder-javascript": { - "iconPath": "./../icons/folder-javascript.svg" - }, - "folder-javascript-open": { - "iconPath": "./../icons/folder-javascript-open.svg" - }, - "folder-json": { - "iconPath": "./../icons/folder-json.svg" - }, - "folder-json-open": { - "iconPath": "./../icons/folder-json-open.svg" - }, - "folder-font": { - "iconPath": "./../icons/folder-font.svg" - }, - "folder-font-open": { - "iconPath": "./../icons/folder-font-open.svg" - }, - "folder-bower": { - "iconPath": "./../icons/folder-bower.svg" - }, - "folder-bower-open": { - "iconPath": "./../icons/folder-bower-open.svg" - }, - "folder-test": { - "iconPath": "./../icons/folder-test.svg" - }, - "folder-test-open": { - "iconPath": "./../icons/folder-test-open.svg" - }, - "folder-directive": { - "iconPath": "./../icons/folder-directive.svg" - }, - "folder-directive-open": { - "iconPath": "./../icons/folder-directive-open.svg" - }, - "folder-jinja": { - "iconPath": "./../icons/folder-jinja.svg" - }, - "folder-jinja-open": { - "iconPath": "./../icons/folder-jinja-open.svg" - }, - "folder-jinja_light": { - "iconPath": "./../icons/folder-jinja_light.svg" - }, - "folder-jinja-open_light": { - "iconPath": "./../icons/folder-jinja-open_light.svg" - }, - "folder-markdown": { - "iconPath": "./../icons/folder-markdown.svg" - }, - "folder-markdown-open": { - "iconPath": "./../icons/folder-markdown-open.svg" - }, - "folder-pdm": { - "iconPath": "./../icons/folder-pdm.svg" - }, - "folder-pdm-open": { - "iconPath": "./../icons/folder-pdm-open.svg" - }, - "folder-php": { - "iconPath": "./../icons/folder-php.svg" - }, - "folder-php-open": { - "iconPath": "./../icons/folder-php-open.svg" - }, - "folder-phpmailer": { - "iconPath": "./../icons/folder-phpmailer.svg" - }, - "folder-phpmailer-open": { - "iconPath": "./../icons/folder-phpmailer-open.svg" - }, - "folder-sublime": { - "iconPath": "./../icons/folder-sublime.svg" - }, - "folder-sublime-open": { - "iconPath": "./../icons/folder-sublime-open.svg" - }, - "folder-docs": { - "iconPath": "./../icons/folder-docs.svg" - }, - "folder-docs-open": { - "iconPath": "./../icons/folder-docs-open.svg" - }, - "folder-gh-workflows": { - "iconPath": "./../icons/folder-gh-workflows.svg" - }, - "folder-gh-workflows-open": { - "iconPath": "./../icons/folder-gh-workflows-open.svg" - }, - "folder-git": { - "iconPath": "./../icons/folder-git.svg" - }, - "folder-git-open": { - "iconPath": "./../icons/folder-git-open.svg" - }, - "folder-github": { - "iconPath": "./../icons/folder-github.svg" - }, - "folder-github-open": { - "iconPath": "./../icons/folder-github-open.svg" - }, - "folder-gitea": { - "iconPath": "./../icons/folder-gitea.svg" - }, - "folder-gitea-open": { - "iconPath": "./../icons/folder-gitea-open.svg" - }, - "folder-gitlab": { - "iconPath": "./../icons/folder-gitlab.svg" - }, - "folder-gitlab-open": { - "iconPath": "./../icons/folder-gitlab-open.svg" - }, - "folder-forgejo": { - "iconPath": "./../icons/folder-forgejo.svg" - }, - "folder-forgejo-open": { - "iconPath": "./../icons/folder-forgejo-open.svg" - }, - "folder-vscode": { - "iconPath": "./../icons/folder-vscode.svg" - }, - "folder-vscode-open": { - "iconPath": "./../icons/folder-vscode-open.svg" - }, - "folder-views": { - "iconPath": "./../icons/folder-views.svg" - }, - "folder-views-open": { - "iconPath": "./../icons/folder-views-open.svg" - }, - "folder-vue": { - "iconPath": "./../icons/folder-vue.svg" - }, - "folder-vue-open": { - "iconPath": "./../icons/folder-vue-open.svg" - }, - "folder-vuepress": { - "iconPath": "./../icons/folder-vuepress.svg" - }, - "folder-vuepress-open": { - "iconPath": "./../icons/folder-vuepress-open.svg" - }, - "folder-expo": { - "iconPath": "./../icons/folder-expo.svg" - }, - "folder-expo-open": { - "iconPath": "./../icons/folder-expo-open.svg" - }, - "folder-config": { - "iconPath": "./../icons/folder-config.svg" - }, - "folder-config-open": { - "iconPath": "./../icons/folder-config-open.svg" - }, - "folder-i18n": { - "iconPath": "./../icons/folder-i18n.svg" - }, - "folder-i18n-open": { - "iconPath": "./../icons/folder-i18n-open.svg" - }, - "folder-components": { - "iconPath": "./../icons/folder-components.svg" - }, - "folder-components-open": { - "iconPath": "./../icons/folder-components-open.svg" - }, - "folder-verdaccio": { - "iconPath": "./../icons/folder-verdaccio.svg" - }, - "folder-verdaccio-open": { - "iconPath": "./../icons/folder-verdaccio-open.svg" - }, - "folder-aurelia": { - "iconPath": "./../icons/folder-aurelia.svg" - }, - "folder-aurelia-open": { - "iconPath": "./../icons/folder-aurelia-open.svg" - }, - "folder-resource": { - "iconPath": "./../icons/folder-resource.svg" - }, - "folder-resource-open": { - "iconPath": "./../icons/folder-resource-open.svg" - }, - "folder-lib": { - "iconPath": "./../icons/folder-lib.svg" - }, - "folder-lib-open": { - "iconPath": "./../icons/folder-lib-open.svg" - }, - "folder-theme": { - "iconPath": "./../icons/folder-theme.svg" - }, - "folder-theme-open": { - "iconPath": "./../icons/folder-theme-open.svg" - }, - "folder-webpack": { - "iconPath": "./../icons/folder-webpack.svg" - }, - "folder-webpack-open": { - "iconPath": "./../icons/folder-webpack-open.svg" - }, - "folder-global": { - "iconPath": "./../icons/folder-global.svg" - }, - "folder-global-open": { - "iconPath": "./../icons/folder-global-open.svg" - }, - "folder-public": { - "iconPath": "./../icons/folder-public.svg" - }, - "folder-public-open": { - "iconPath": "./../icons/folder-public-open.svg" - }, - "folder-include": { - "iconPath": "./../icons/folder-include.svg" - }, - "folder-include-open": { - "iconPath": "./../icons/folder-include-open.svg" - }, - "folder-docker": { - "iconPath": "./../icons/folder-docker.svg" - }, - "folder-docker-open": { - "iconPath": "./../icons/folder-docker-open.svg" - }, - "folder-ngrx-store": { - "iconPath": "./../icons/folder-ngrx-store.svg" - }, - "folder-ngrx-store-open": { - "iconPath": "./../icons/folder-ngrx-store-open.svg" - }, - "folder-ngrx-effects": { - "iconPath": "./../icons/folder-ngrx-effects.clone.svg" - }, - "folder-ngrx-effects-open": { - "iconPath": "./../icons/folder-ngrx-effects-open.clone.svg" - }, - "folder-ngrx-state": { - "iconPath": "./../icons/folder-ngrx-state.clone.svg" - }, - "folder-ngrx-state-open": { - "iconPath": "./../icons/folder-ngrx-state-open.clone.svg" - }, - "folder-ngrx-reducer": { - "iconPath": "./../icons/folder-ngrx-reducer.clone.svg" - }, - "folder-ngrx-reducer-open": { - "iconPath": "./../icons/folder-ngrx-reducer-open.clone.svg" - }, - "folder-ngrx-actions": { - "iconPath": "./../icons/folder-ngrx-actions.clone.svg" - }, - "folder-ngrx-actions-open": { - "iconPath": "./../icons/folder-ngrx-actions-open.clone.svg" - }, - "folder-ngrx-entities": { - "iconPath": "./../icons/folder-ngrx-entities.clone.svg" - }, - "folder-ngrx-entities-open": { - "iconPath": "./../icons/folder-ngrx-entities-open.clone.svg" - }, - "folder-ngrx-selectors": { - "iconPath": "./../icons/folder-ngrx-selectors.clone.svg" - }, - "folder-ngrx-selectors-open": { - "iconPath": "./../icons/folder-ngrx-selectors-open.clone.svg" - }, - "folder-redux-reducer": { - "iconPath": "./../icons/folder-redux-reducer.svg" - }, - "folder-redux-reducer-open": { - "iconPath": "./../icons/folder-redux-reducer-open.svg" - }, - "folder-redux-actions": { - "iconPath": "./../icons/folder-redux-actions.clone.svg" - }, - "folder-redux-actions-open": { - "iconPath": "./../icons/folder-redux-actions-open.clone.svg" - }, - "folder-redux-selector": { - "iconPath": "./../icons/folder-redux-selector.clone.svg" - }, - "folder-redux-selector-open": { - "iconPath": "./../icons/folder-redux-selector-open.clone.svg" - }, - "folder-redux-store": { - "iconPath": "./../icons/folder-redux-store.clone.svg" - }, - "folder-redux-store-open": { - "iconPath": "./../icons/folder-redux-store-open.clone.svg" - }, - "folder-react-components": { - "iconPath": "./../icons/folder-react-components.svg" - }, - "folder-react-components-open": { - "iconPath": "./../icons/folder-react-components-open.svg" - }, - "folder-astro": { - "iconPath": "./../icons/folder-astro.svg" - }, - "folder-astro-open": { - "iconPath": "./../icons/folder-astro-open.svg" - }, - "folder-database": { - "iconPath": "./../icons/folder-database.svg" - }, - "folder-database-open": { - "iconPath": "./../icons/folder-database-open.svg" - }, - "folder-log": { - "iconPath": "./../icons/folder-log.svg" - }, - "folder-log-open": { - "iconPath": "./../icons/folder-log-open.svg" - }, - "folder-target": { - "iconPath": "./../icons/folder-target.svg" - }, - "folder-target-open": { - "iconPath": "./../icons/folder-target-open.svg" - }, - "folder-temp": { - "iconPath": "./../icons/folder-temp.svg" - }, - "folder-temp-open": { - "iconPath": "./../icons/folder-temp-open.svg" - }, - "folder-aws": { - "iconPath": "./../icons/folder-aws.svg" - }, - "folder-aws-open": { - "iconPath": "./../icons/folder-aws-open.svg" - }, - "folder-audio": { - "iconPath": "./../icons/folder-audio.svg" - }, - "folder-audio-open": { - "iconPath": "./../icons/folder-audio-open.svg" - }, - "folder-video": { - "iconPath": "./../icons/folder-video.svg" - }, - "folder-video-open": { - "iconPath": "./../icons/folder-video-open.svg" - }, - "folder-kubernetes": { - "iconPath": "./../icons/folder-kubernetes.svg" - }, - "folder-kubernetes-open": { - "iconPath": "./../icons/folder-kubernetes-open.svg" - }, - "folder-import": { - "iconPath": "./../icons/folder-import.svg" - }, - "folder-import-open": { - "iconPath": "./../icons/folder-import-open.svg" - }, - "folder-export": { - "iconPath": "./../icons/folder-export.svg" - }, - "folder-export-open": { - "iconPath": "./../icons/folder-export-open.svg" - }, - "folder-wakatime": { - "iconPath": "./../icons/folder-wakatime.svg" - }, - "folder-wakatime-open": { - "iconPath": "./../icons/folder-wakatime-open.svg" - }, - "folder-circleci": { - "iconPath": "./../icons/folder-circleci.svg" - }, - "folder-circleci-open": { - "iconPath": "./../icons/folder-circleci-open.svg" - }, - "folder-wordpress": { - "iconPath": "./../icons/folder-wordpress.svg" - }, - "folder-wordpress-open": { - "iconPath": "./../icons/folder-wordpress-open.svg" - }, - "folder-gradle": { - "iconPath": "./../icons/folder-gradle.svg" - }, - "folder-gradle-open": { - "iconPath": "./../icons/folder-gradle-open.svg" - }, - "folder-coverage": { - "iconPath": "./../icons/folder-coverage.svg" - }, - "folder-coverage-open": { - "iconPath": "./../icons/folder-coverage-open.svg" - }, - "folder-class": { - "iconPath": "./../icons/folder-class.svg" - }, - "folder-class-open": { - "iconPath": "./../icons/folder-class-open.svg" - }, - "folder-other": { - "iconPath": "./../icons/folder-other.svg" - }, - "folder-other-open": { - "iconPath": "./../icons/folder-other-open.svg" - }, - "folder-lua": { - "iconPath": "./../icons/folder-lua.svg" - }, - "folder-lua-open": { - "iconPath": "./../icons/folder-lua-open.svg" - }, - "folder-turborepo": { - "iconPath": "./../icons/folder-turborepo.svg" - }, - "folder-turborepo-open": { - "iconPath": "./../icons/folder-turborepo-open.svg" - }, - "folder-typescript": { - "iconPath": "./../icons/folder-typescript.svg" - }, - "folder-typescript-open": { - "iconPath": "./../icons/folder-typescript-open.svg" - }, - "folder-graphql": { - "iconPath": "./../icons/folder-graphql.svg" - }, - "folder-graphql-open": { - "iconPath": "./../icons/folder-graphql-open.svg" - }, - "folder-routes": { - "iconPath": "./../icons/folder-routes.svg" - }, - "folder-routes-open": { - "iconPath": "./../icons/folder-routes-open.svg" - }, - "folder-ci": { - "iconPath": "./../icons/folder-ci.svg" - }, - "folder-ci-open": { - "iconPath": "./../icons/folder-ci-open.svg" - }, - "folder-benchmark": { - "iconPath": "./../icons/folder-benchmark.svg" - }, - "folder-benchmark-open": { - "iconPath": "./../icons/folder-benchmark-open.svg" - }, - "folder-messages": { - "iconPath": "./../icons/folder-messages.svg" - }, - "folder-messages-open": { - "iconPath": "./../icons/folder-messages-open.svg" - }, - "folder-less": { - "iconPath": "./../icons/folder-less.svg" - }, - "folder-less-open": { - "iconPath": "./../icons/folder-less-open.svg" - }, - "folder-gulp": { - "iconPath": "./../icons/folder-gulp.svg" - }, - "folder-gulp-open": { - "iconPath": "./../icons/folder-gulp-open.svg" - }, - "folder-python": { - "iconPath": "./../icons/folder-python.svg" - }, - "folder-python-open": { - "iconPath": "./../icons/folder-python-open.svg" - }, - "folder-sandbox": { - "iconPath": "./../icons/folder-sandbox.svg" - }, - "folder-sandbox-open": { - "iconPath": "./../icons/folder-sandbox-open.svg" - }, - "folder-scons": { - "iconPath": "./../icons/folder-scons.svg" - }, - "folder-scons-open": { - "iconPath": "./../icons/folder-scons-open.svg" - }, - "folder-mojo": { - "iconPath": "./../icons/folder-mojo.svg" - }, - "folder-mojo-open": { - "iconPath": "./../icons/folder-mojo-open.svg" - }, - "folder-moon": { - "iconPath": "./../icons/folder-moon.svg" - }, - "folder-moon-open": { - "iconPath": "./../icons/folder-moon-open.svg" - }, - "folder-debug": { - "iconPath": "./../icons/folder-debug.svg" - }, - "folder-debug-open": { - "iconPath": "./../icons/folder-debug-open.svg" - }, - "folder-fastlane": { - "iconPath": "./../icons/folder-fastlane.svg" - }, - "folder-fastlane-open": { - "iconPath": "./../icons/folder-fastlane-open.svg" - }, - "folder-plugin": { - "iconPath": "./../icons/folder-plugin.svg" - }, - "folder-plugin-open": { - "iconPath": "./../icons/folder-plugin-open.svg" - }, - "folder-middleware": { - "iconPath": "./../icons/folder-middleware.svg" - }, - "folder-middleware-open": { - "iconPath": "./../icons/folder-middleware-open.svg" - }, - "folder-controller": { - "iconPath": "./../icons/folder-controller.svg" - }, - "folder-controller-open": { - "iconPath": "./../icons/folder-controller-open.svg" - }, - "folder-ansible": { - "iconPath": "./../icons/folder-ansible.svg" - }, - "folder-ansible-open": { - "iconPath": "./../icons/folder-ansible-open.svg" - }, - "folder-server": { - "iconPath": "./../icons/folder-server.svg" - }, - "folder-server-open": { - "iconPath": "./../icons/folder-server-open.svg" - }, - "folder-client": { - "iconPath": "./../icons/folder-client.svg" - }, - "folder-client-open": { - "iconPath": "./../icons/folder-client-open.svg" - }, - "folder-tasks": { - "iconPath": "./../icons/folder-tasks.svg" - }, - "folder-tasks-open": { - "iconPath": "./../icons/folder-tasks-open.svg" - }, - "folder-android": { - "iconPath": "./../icons/folder-android.svg" - }, - "folder-android-open": { - "iconPath": "./../icons/folder-android-open.svg" - }, - "folder-ios": { - "iconPath": "./../icons/folder-ios.svg" - }, - "folder-ios-open": { - "iconPath": "./../icons/folder-ios-open.svg" - }, - "folder-ui": { - "iconPath": "./../icons/folder-ui.svg" - }, - "folder-ui-open": { - "iconPath": "./../icons/folder-ui-open.svg" - }, - "folder-upload": { - "iconPath": "./../icons/folder-upload.svg" - }, - "folder-upload-open": { - "iconPath": "./../icons/folder-upload-open.svg" - }, - "folder-download": { - "iconPath": "./../icons/folder-download.svg" - }, - "folder-download-open": { - "iconPath": "./../icons/folder-download-open.svg" - }, - "folder-tools": { - "iconPath": "./../icons/folder-tools.svg" - }, - "folder-tools-open": { - "iconPath": "./../icons/folder-tools-open.svg" - }, - "folder-helper": { - "iconPath": "./../icons/folder-helper.svg" - }, - "folder-helper-open": { - "iconPath": "./../icons/folder-helper-open.svg" - }, - "folder-serverless": { - "iconPath": "./../icons/folder-serverless.svg" - }, - "folder-serverless-open": { - "iconPath": "./../icons/folder-serverless-open.svg" - }, - "folder-api": { - "iconPath": "./../icons/folder-api.svg" - }, - "folder-api-open": { - "iconPath": "./../icons/folder-api-open.svg" - }, - "folder-app": { - "iconPath": "./../icons/folder-app.svg" - }, - "folder-app-open": { - "iconPath": "./../icons/folder-app-open.svg" - }, - "folder-apollo": { - "iconPath": "./../icons/folder-apollo.svg" - }, - "folder-apollo-open": { - "iconPath": "./../icons/folder-apollo-open.svg" - }, - "folder-archive": { - "iconPath": "./../icons/folder-archive.svg" - }, - "folder-archive-open": { - "iconPath": "./../icons/folder-archive-open.svg" - }, - "folder-batch": { - "iconPath": "./../icons/folder-batch.svg" - }, - "folder-batch-open": { - "iconPath": "./../icons/folder-batch-open.svg" - }, - "folder-buildkite": { - "iconPath": "./../icons/folder-buildkite.svg" - }, - "folder-buildkite-open": { - "iconPath": "./../icons/folder-buildkite-open.svg" - }, - "folder-cluster": { - "iconPath": "./../icons/folder-cluster.svg" - }, - "folder-cluster-open": { - "iconPath": "./../icons/folder-cluster-open.svg" - }, - "folder-command": { - "iconPath": "./../icons/folder-command.svg" - }, - "folder-command-open": { - "iconPath": "./../icons/folder-command-open.svg" - }, - "folder-constant": { - "iconPath": "./../icons/folder-constant.svg" - }, - "folder-constant-open": { - "iconPath": "./../icons/folder-constant-open.svg" - }, - "folder-container": { - "iconPath": "./../icons/folder-container.svg" - }, - "folder-container-open": { - "iconPath": "./../icons/folder-container-open.svg" - }, - "folder-content": { - "iconPath": "./../icons/folder-content.svg" - }, - "folder-content-open": { - "iconPath": "./../icons/folder-content-open.svg" - }, - "folder-context": { - "iconPath": "./../icons/folder-context.svg" - }, - "folder-context-open": { - "iconPath": "./../icons/folder-context-open.svg" - }, - "folder-core": { - "iconPath": "./../icons/folder-core.svg" - }, - "folder-core-open": { - "iconPath": "./../icons/folder-core-open.svg" - }, - "folder-delta": { - "iconPath": "./../icons/folder-delta.svg" - }, - "folder-delta-open": { - "iconPath": "./../icons/folder-delta-open.svg" - }, - "folder-dump": { - "iconPath": "./../icons/folder-dump.svg" - }, - "folder-dump-open": { - "iconPath": "./../icons/folder-dump-open.svg" - }, - "folder-examples": { - "iconPath": "./../icons/folder-examples.svg" - }, - "folder-examples-open": { - "iconPath": "./../icons/folder-examples-open.svg" - }, - "folder-environment": { - "iconPath": "./../icons/folder-environment.svg" - }, - "folder-environment-open": { - "iconPath": "./../icons/folder-environment-open.svg" - }, - "folder-functions": { - "iconPath": "./../icons/folder-functions.svg" - }, - "folder-functions-open": { - "iconPath": "./../icons/folder-functions-open.svg" - }, - "folder-generator": { - "iconPath": "./../icons/folder-generator.svg" - }, - "folder-generator-open": { - "iconPath": "./../icons/folder-generator-open.svg" - }, - "folder-hook": { - "iconPath": "./../icons/folder-hook.svg" - }, - "folder-hook-open": { - "iconPath": "./../icons/folder-hook-open.svg" - }, - "folder-job": { - "iconPath": "./../icons/folder-job.svg" - }, - "folder-job-open": { - "iconPath": "./../icons/folder-job-open.svg" - }, - "folder-keys": { - "iconPath": "./../icons/folder-keys.svg" - }, - "folder-keys-open": { - "iconPath": "./../icons/folder-keys-open.svg" - }, - "folder-layout": { - "iconPath": "./../icons/folder-layout.svg" - }, - "folder-layout-open": { - "iconPath": "./../icons/folder-layout-open.svg" - }, - "folder-mail": { - "iconPath": "./../icons/folder-mail.svg" - }, - "folder-mail-open": { - "iconPath": "./../icons/folder-mail-open.svg" - }, - "folder-mappings": { - "iconPath": "./../icons/folder-mappings.svg" - }, - "folder-mappings-open": { - "iconPath": "./../icons/folder-mappings-open.svg" - }, - "folder-meta": { - "iconPath": "./../icons/folder-meta.svg" - }, - "folder-meta-open": { - "iconPath": "./../icons/folder-meta-open.svg" - }, - "folder-changesets": { - "iconPath": "./../icons/folder-changesets.svg" - }, - "folder-changesets-open": { - "iconPath": "./../icons/folder-changesets-open.svg" - }, - "folder-packages": { - "iconPath": "./../icons/folder-packages.svg" - }, - "folder-packages-open": { - "iconPath": "./../icons/folder-packages-open.svg" - }, - "folder-shared": { - "iconPath": "./../icons/folder-shared.svg" - }, - "folder-shared-open": { - "iconPath": "./../icons/folder-shared-open.svg" - }, - "folder-shader": { - "iconPath": "./../icons/folder-shader.svg" - }, - "folder-shader-open": { - "iconPath": "./../icons/folder-shader-open.svg" - }, - "folder-stack": { - "iconPath": "./../icons/folder-stack.svg" - }, - "folder-stack-open": { - "iconPath": "./../icons/folder-stack-open.svg" - }, - "folder-template": { - "iconPath": "./../icons/folder-template.svg" - }, - "folder-template-open": { - "iconPath": "./../icons/folder-template-open.svg" - }, - "folder-utils": { - "iconPath": "./../icons/folder-utils.svg" - }, - "folder-utils-open": { - "iconPath": "./../icons/folder-utils-open.svg" - }, - "folder-supabase": { - "iconPath": "./../icons/folder-supabase.svg" - }, - "folder-supabase-open": { - "iconPath": "./../icons/folder-supabase-open.svg" - }, - "folder-private": { - "iconPath": "./../icons/folder-private.svg" - }, - "folder-private-open": { - "iconPath": "./../icons/folder-private-open.svg" - }, - "folder-linux": { - "iconPath": "./../icons/folder-linux.svg" - }, - "folder-linux-open": { - "iconPath": "./../icons/folder-linux-open.svg" - }, - "folder-windows": { - "iconPath": "./../icons/folder-windows.svg" - }, - "folder-windows-open": { - "iconPath": "./../icons/folder-windows-open.svg" - }, - "folder-macos": { - "iconPath": "./../icons/folder-macos.svg" - }, - "folder-macos-open": { - "iconPath": "./../icons/folder-macos-open.svg" - }, - "folder-error": { - "iconPath": "./../icons/folder-error.svg" - }, - "folder-error-open": { - "iconPath": "./../icons/folder-error-open.svg" - }, - "folder-event": { - "iconPath": "./../icons/folder-event.svg" - }, - "folder-event-open": { - "iconPath": "./../icons/folder-event-open.svg" - }, - "folder-secure": { - "iconPath": "./../icons/folder-secure.svg" - }, - "folder-secure-open": { - "iconPath": "./../icons/folder-secure-open.svg" - }, - "folder-custom": { - "iconPath": "./../icons/folder-custom.svg" - }, - "folder-custom-open": { - "iconPath": "./../icons/folder-custom-open.svg" - }, - "folder-mock": { - "iconPath": "./../icons/folder-mock.svg" - }, - "folder-mock-open": { - "iconPath": "./../icons/folder-mock-open.svg" - }, - "folder-syntax": { - "iconPath": "./../icons/folder-syntax.svg" - }, - "folder-syntax-open": { - "iconPath": "./../icons/folder-syntax-open.svg" - }, - "folder-vm": { - "iconPath": "./../icons/folder-vm.svg" - }, - "folder-vm-open": { - "iconPath": "./../icons/folder-vm-open.svg" - }, - "folder-stylus": { - "iconPath": "./../icons/folder-stylus.svg" - }, - "folder-stylus-open": { - "iconPath": "./../icons/folder-stylus-open.svg" - }, - "folder-flow": { - "iconPath": "./../icons/folder-flow.svg" - }, - "folder-flow-open": { - "iconPath": "./../icons/folder-flow-open.svg" - }, - "folder-rules": { - "iconPath": "./../icons/folder-rules.svg" - }, - "folder-rules-open": { - "iconPath": "./../icons/folder-rules-open.svg" - }, - "folder-review": { - "iconPath": "./../icons/folder-review.svg" - }, - "folder-review-open": { - "iconPath": "./../icons/folder-review-open.svg" - }, - "folder-animation": { - "iconPath": "./../icons/folder-animation.svg" - }, - "folder-animation-open": { - "iconPath": "./../icons/folder-animation-open.svg" - }, - "folder-guard": { - "iconPath": "./../icons/folder-guard.svg" - }, - "folder-guard-open": { - "iconPath": "./../icons/folder-guard-open.svg" - }, - "folder-prisma": { - "iconPath": "./../icons/folder-prisma.svg" - }, - "folder-prisma-open": { - "iconPath": "./../icons/folder-prisma-open.svg" - }, - "folder-pipe": { - "iconPath": "./../icons/folder-pipe.svg" - }, - "folder-pipe-open": { - "iconPath": "./../icons/folder-pipe-open.svg" - }, - "folder-svg": { - "iconPath": "./../icons/folder-svg.svg" - }, - "folder-svg-open": { - "iconPath": "./../icons/folder-svg-open.svg" - }, - "folder-vuex-store": { - "iconPath": "./../icons/folder-vuex-store.svg" - }, - "folder-vuex-store-open": { - "iconPath": "./../icons/folder-vuex-store-open.svg" - }, - "folder-nuxt": { - "iconPath": "./../icons/folder-nuxt.svg" - }, - "folder-nuxt-open": { - "iconPath": "./../icons/folder-nuxt-open.svg" - }, - "folder-vue-directives": { - "iconPath": "./../icons/folder-vue-directives.svg" - }, - "folder-vue-directives-open": { - "iconPath": "./../icons/folder-vue-directives-open.svg" - }, - "folder-terraform": { - "iconPath": "./../icons/folder-terraform.svg" - }, - "folder-terraform-open": { - "iconPath": "./../icons/folder-terraform-open.svg" - }, - "folder-mobile": { - "iconPath": "./../icons/folder-mobile.svg" - }, - "folder-mobile-open": { - "iconPath": "./../icons/folder-mobile-open.svg" - }, - "folder-stencil": { - "iconPath": "./../icons/folder-stencil.svg" - }, - "folder-stencil-open": { - "iconPath": "./../icons/folder-stencil-open.svg" - }, - "folder-firebase": { - "iconPath": "./../icons/folder-firebase.svg" - }, - "folder-firebase-open": { - "iconPath": "./../icons/folder-firebase-open.svg" - }, - "folder-svelte": { - "iconPath": "./../icons/folder-svelte.svg" - }, - "folder-svelte-open": { - "iconPath": "./../icons/folder-svelte-open.svg" - }, - "folder-update": { - "iconPath": "./../icons/folder-update.svg" - }, - "folder-update-open": { - "iconPath": "./../icons/folder-update-open.svg" - }, - "folder-intellij": { - "iconPath": "./../icons/folder-intellij.svg" - }, - "folder-intellij-open": { - "iconPath": "./../icons/folder-intellij-open.svg" - }, - "folder-intellij_light": { - "iconPath": "./../icons/folder-intellij_light.svg" - }, - "folder-intellij-open_light": { - "iconPath": "./../icons/folder-intellij-open_light.svg" - }, - "folder-azure-pipelines": { - "iconPath": "./../icons/folder-azure-pipelines.svg" - }, - "folder-azure-pipelines-open": { - "iconPath": "./../icons/folder-azure-pipelines-open.svg" - }, - "folder-mjml": { - "iconPath": "./../icons/folder-mjml.svg" - }, - "folder-mjml-open": { - "iconPath": "./../icons/folder-mjml-open.svg" - }, - "folder-admin": { - "iconPath": "./../icons/folder-admin.svg" - }, - "folder-admin-open": { - "iconPath": "./../icons/folder-admin-open.svg" - }, - "folder-jupyter": { - "iconPath": "./../icons/folder-jupyter.svg" - }, - "folder-jupyter-open": { - "iconPath": "./../icons/folder-jupyter-open.svg" - }, - "folder-scala": { - "iconPath": "./../icons/folder-scala.svg" - }, - "folder-scala-open": { - "iconPath": "./../icons/folder-scala-open.svg" - }, - "folder-connection": { - "iconPath": "./../icons/folder-connection.svg" - }, - "folder-connection-open": { - "iconPath": "./../icons/folder-connection-open.svg" - }, - "folder-quasar": { - "iconPath": "./../icons/folder-quasar.svg" - }, - "folder-quasar-open": { - "iconPath": "./../icons/folder-quasar-open.svg" - }, - "folder-next": { - "iconPath": "./../icons/folder-next.svg" - }, - "folder-next-open": { - "iconPath": "./../icons/folder-next-open.svg" - }, - "folder-cobol": { - "iconPath": "./../icons/folder-cobol.svg" - }, - "folder-cobol-open": { - "iconPath": "./../icons/folder-cobol-open.svg" - }, - "folder-yarn": { - "iconPath": "./../icons/folder-yarn.svg" - }, - "folder-yarn-open": { - "iconPath": "./../icons/folder-yarn-open.svg" - }, - "folder-husky": { - "iconPath": "./../icons/folder-husky.svg" - }, - "folder-husky-open": { - "iconPath": "./../icons/folder-husky-open.svg" - }, - "folder-storybook": { - "iconPath": "./../icons/folder-storybook.svg" - }, - "folder-storybook-open": { - "iconPath": "./../icons/folder-storybook-open.svg" - }, - "folder-base": { - "iconPath": "./../icons/folder-base.svg" - }, - "folder-base-open": { - "iconPath": "./../icons/folder-base-open.svg" - }, - "folder-cart": { - "iconPath": "./../icons/folder-cart.svg" - }, - "folder-cart-open": { - "iconPath": "./../icons/folder-cart-open.svg" - }, - "folder-home": { - "iconPath": "./../icons/folder-home.svg" - }, - "folder-home-open": { - "iconPath": "./../icons/folder-home-open.svg" - }, - "folder-project": { - "iconPath": "./../icons/folder-project.svg" - }, - "folder-project-open": { - "iconPath": "./../icons/folder-project-open.svg" - }, - "folder-interface": { - "iconPath": "./../icons/folder-interface.svg" - }, - "folder-interface-open": { - "iconPath": "./../icons/folder-interface-open.svg" - }, - "folder-netlify": { - "iconPath": "./../icons/folder-netlify.svg" - }, - "folder-netlify-open": { - "iconPath": "./../icons/folder-netlify-open.svg" - }, - "folder-enum": { - "iconPath": "./../icons/folder-enum.svg" - }, - "folder-enum-open": { - "iconPath": "./../icons/folder-enum-open.svg" - }, - "folder-contract": { - "iconPath": "./../icons/folder-contract.svg" - }, - "folder-contract-open": { - "iconPath": "./../icons/folder-contract-open.svg" - }, - "folder-helm": { - "iconPath": "./../icons/folder-helm.svg" - }, - "folder-helm-open": { - "iconPath": "./../icons/folder-helm-open.svg" - }, - "folder-queue": { - "iconPath": "./../icons/folder-queue.svg" - }, - "folder-queue-open": { - "iconPath": "./../icons/folder-queue-open.svg" - }, - "folder-vercel": { - "iconPath": "./../icons/folder-vercel.svg" - }, - "folder-vercel-open": { - "iconPath": "./../icons/folder-vercel-open.svg" - }, - "folder-cypress": { - "iconPath": "./../icons/folder-cypress.svg" - }, - "folder-cypress-open": { - "iconPath": "./../icons/folder-cypress-open.svg" - }, - "folder-decorators": { - "iconPath": "./../icons/folder-decorators.svg" - }, - "folder-decorators-open": { - "iconPath": "./../icons/folder-decorators-open.svg" - }, - "folder-java": { - "iconPath": "./../icons/folder-java.svg" - }, - "folder-java-open": { - "iconPath": "./../icons/folder-java-open.svg" - }, - "folder-resolver": { - "iconPath": "./../icons/folder-resolver.svg" - }, - "folder-resolver-open": { - "iconPath": "./../icons/folder-resolver-open.svg" - }, - "folder-angular": { - "iconPath": "./../icons/folder-angular.svg" - }, - "folder-angular-open": { - "iconPath": "./../icons/folder-angular-open.svg" - }, - "folder-unity": { - "iconPath": "./../icons/folder-unity.svg" - }, - "folder-unity-open": { - "iconPath": "./../icons/folder-unity-open.svg" - }, - "folder-pdf": { - "iconPath": "./../icons/folder-pdf.svg" - }, - "folder-pdf-open": { - "iconPath": "./../icons/folder-pdf-open.svg" - }, - "folder-proto": { - "iconPath": "./../icons/folder-proto.svg" - }, - "folder-proto-open": { - "iconPath": "./../icons/folder-proto-open.svg" - }, - "folder-plastic": { - "iconPath": "./../icons/folder-plastic.svg" - }, - "folder-plastic-open": { - "iconPath": "./../icons/folder-plastic-open.svg" - }, - "folder-gamemaker": { - "iconPath": "./../icons/folder-gamemaker.svg" - }, - "folder-gamemaker-open": { - "iconPath": "./../icons/folder-gamemaker-open.svg" - }, - "folder-mercurial": { - "iconPath": "./../icons/folder-mercurial.svg" - }, - "folder-mercurial-open": { - "iconPath": "./../icons/folder-mercurial-open.svg" - }, - "folder-godot": { - "iconPath": "./../icons/folder-godot.svg" - }, - "folder-godot-open": { - "iconPath": "./../icons/folder-godot-open.svg" - }, - "folder-lottie": { - "iconPath": "./../icons/folder-lottie.svg" - }, - "folder-lottie-open": { - "iconPath": "./../icons/folder-lottie-open.svg" - }, - "folder-taskfile": { - "iconPath": "./../icons/folder-taskfile.svg" - }, - "folder-taskfile-open": { - "iconPath": "./../icons/folder-taskfile-open.svg" - }, - "folder-drizzle": { - "iconPath": "./../icons/folder-drizzle.svg" - }, - "folder-drizzle-open": { - "iconPath": "./../icons/folder-drizzle-open.svg" - }, - "folder-cloudflare": { - "iconPath": "./../icons/folder-cloudflare.svg" - }, - "folder-cloudflare-open": { - "iconPath": "./../icons/folder-cloudflare-open.svg" - }, - "folder-seeders": { - "iconPath": "./../icons/folder-seeders.svg" - }, - "folder-seeders-open": { - "iconPath": "./../icons/folder-seeders-open.svg" - }, - "folder-store": { - "iconPath": "./../icons/folder-store.svg" - }, - "folder-store-open": { - "iconPath": "./../icons/folder-store-open.svg" - }, - "folder-bicep": { - "iconPath": "./../icons/folder-bicep.svg" - }, - "folder-bicep-open": { - "iconPath": "./../icons/folder-bicep-open.svg" - }, - "folder-snapcraft": { - "iconPath": "./../icons/folder-snapcraft.svg" - }, - "folder-snapcraft-open": { - "iconPath": "./../icons/folder-snapcraft-open.svg" - }, - "folder-development": { - "iconPath": "./../icons/folder-development.clone.svg" - }, - "folder-development-open": { - "iconPath": "./../icons/folder-development-open.clone.svg" - }, - "folder-flutter": { - "iconPath": "./../icons/folder-flutter.svg" - }, - "folder-flutter-open": { - "iconPath": "./../icons/folder-flutter-open.svg" - }, - "folder-snippet": { - "iconPath": "./../icons/folder-snippet.svg" - }, - "folder-snippet-open": { - "iconPath": "./../icons/folder-snippet-open.svg" - }, - "folder-element": { - "iconPath": "./../icons/folder-element.svg" - }, - "folder-element-open": { - "iconPath": "./../icons/folder-element-open.svg" - }, - "folder-src-tauri": { - "iconPath": "./../icons/folder-src-tauri.svg" - }, - "folder-src-tauri-open": { - "iconPath": "./../icons/folder-src-tauri-open.svg" - }, - "folder-favicon": { - "iconPath": "./../icons/folder-favicon.svg" - }, - "folder-favicon-open": { - "iconPath": "./../icons/folder-favicon-open.svg" - }, - "folder-lefthook": { - "iconPath": "./../icons/folder-lefthook.svg" - }, - "folder-lefthook-open": { - "iconPath": "./../icons/folder-lefthook-open.svg" - }, - "folder-bloc": { - "iconPath": "./../icons/folder-bloc.svg" - }, - "folder-bloc-open": { - "iconPath": "./../icons/folder-bloc-open.svg" - }, - "folder-powershell": { - "iconPath": "./../icons/folder-powershell.svg" - }, - "folder-powershell-open": { - "iconPath": "./../icons/folder-powershell-open.svg" - }, - "folder-repository": { - "iconPath": "./../icons/folder-repository.svg" - }, - "folder-repository-open": { - "iconPath": "./../icons/folder-repository-open.svg" - }, - "folder-luau": { - "iconPath": "./../icons/folder-luau.svg" - }, - "folder-luau-open": { - "iconPath": "./../icons/folder-luau-open.svg" - }, - "folder-obsidian": { - "iconPath": "./../icons/folder-obsidian.svg" - }, - "folder-obsidian-open": { - "iconPath": "./../icons/folder-obsidian-open.svg" - }, - "folder-trash": { - "iconPath": "./../icons/folder-trash.svg" - }, - "folder-trash-open": { - "iconPath": "./../icons/folder-trash-open.svg" - }, - "folder-cline": { - "iconPath": "./../icons/folder-cline.svg" - }, - "folder-cline-open": { - "iconPath": "./../icons/folder-cline-open.svg" - }, - "folder-liquibase": { - "iconPath": "./../icons/folder-liquibase.svg" - }, - "folder-liquibase-open": { - "iconPath": "./../icons/folder-liquibase-open.svg" - }, - "folder-dart": { - "iconPath": "./../icons/folder-dart.svg" - }, - "folder-dart-open": { - "iconPath": "./../icons/folder-dart-open.svg" - }, - "folder-zeabur": { - "iconPath": "./../icons/folder-zeabur.svg" - }, - "folder-zeabur-open": { - "iconPath": "./../icons/folder-zeabur-open.svg" - }, - "folder": { - "iconPath": "./../icons/folder.svg" - }, - "folder-open": { - "iconPath": "./../icons/folder-open.svg" - }, - "folder-root": { - "iconPath": "./../icons/folder-root.svg" - }, - "folder-root-open": { - "iconPath": "./../icons/folder-root-open.svg" - } - }, "folderNames": { "rust": "folder-rust", ".rust": "folder-rust", @@ -6192,7 +2974,23 @@ "zeabur": "folder-zeabur", ".zeabur": "folder-zeabur", "_zeabur": "folder-zeabur", - "__zeabur__": "folder-zeabur" + "__zeabur__": "folder-zeabur", + "meta-inf": "folder-config", + ".meta-inf": "folder-config", + "_meta-inf": "folder-config", + "__meta-inf__": "folder-config", + "github/issue_template": "folder-template", + ".github/issue_template": "folder-template", + "_github/issue_template": "folder-template", + "__github/issue_template__": "folder-template", + "github/pull_request_template": "folder-template", + ".github/pull_request_template": "folder-template", + "_github/pull_request_template": "folder-template", + "__github/pull_request_template__": "folder-template", + "ds_store": "folder-macos", + ".ds_store": "folder-macos", + "_ds_store": "folder-macos", + "__ds_store__": "folder-macos" }, "folderNamesExpanded": { "rust": "folder-rust-open", @@ -10237,7 +7035,110 @@ "bean": "beancount", "epub": "epub", "reg": "regedit", - "gnu": "gnuplot" + "gnu": "gnuplot", + "yaml-tmlanguage": "yaml", + "tmlanguage": "xml", + "git": "git", + "git-commit": "git", + "git-rebase": "git", + "ignore": "git", + "github-actions-workflow": "github-actions-workflow", + "yaml": "yaml", + "spring-boot-properties-yaml": "yaml", + "ansible": "yaml", + "ansible-jinja": "yaml", + "matlab": "matlab", + "makefile": "settings", + "spring-boot-properties": "settings", + "diff": "diff", + "razor": "razor", + "aspnetcorerazor": "razor", + "python": "python", + "javascript": "javascript", + "typescript": "typescript", + "handlebars": "handlebars", + "perl": "perl", + "perl6": "perl", + "haxe": "haxe", + "hxml": "haxe", + "puppet": "puppet", + "elixir": "elixir", + "livescript": "livescript", + "erlang": "erlang", + "julia": "julia", + "purescript": "purescript", + "stylus": "stylus", + "robotframework": "robot", + "testoutput": "visualstudio", + "solidity": "solidity", + "autoit": "autoit", + "terraform": "terraform", + "cucumber": "cucumber", + "postcss": "postcss", + "lang-cfml": "coldfusion", + "haskell": "haskell", + "ruby": "ruby", + "php": "php", + "hack": "hack", + "javascriptreact": "react", + "processing": "processing", + "django-html": "django", + "django-txt": "django", + "html": "html", + "gdscript": "godot", + "gdresource": "godot-assets", + "viml": "vim", + "prolog": "prolog", + "pawn": "pawn", + "reason": "reason", + "reason_lisp": "reason", + "doctex": "tex", + "latex": "tex", + "latex-expl3": "tex", + "apex": "salesforce", + "dockercompose": "docker", + "shellscript": "console", + "objective-c": "objective-c", + "objective-cpp": "objective-cpp", + "coffeescript": "coffee", + "fsharp": "fsharp", + "editorconfig": "editorconfig", + "clojure": "clojure", + "pip-requirements": "python-misc", + "vue-postcss": "vue", + "vue-html": "vue", + "bibtex": "lib", + "bibtex-style": "lib", + "jupyter": "jupyter", + "plaintext": "document", + "powershell": "powershell", + "rsweave": "r", + "rust": "rust", + "ssh_config": "lock", + "typescriptreact": "react_ts", + "search-result": "search", + "rescript": "rescript", + "twee3": "twine", + "twee3-harlowe-3": "twine", + "twee3-chapbook-1": "twine", + "twee3-sugarcube-2": "twine", + "grain": "grain", + "lolcode": "lolcode", + "idris": "idris", + "text-gemini": "gemini", + "wolfram": "wolframlanguage", + "shaderlab": "shader", + "cadence": "cadence", + "stylable": "stylable", + "capnb": "cds", + "cds-markdown-injection": "cds", + "concourse-pipeline-yaml": "concourse", + "concourse-task-yaml": "concourse", + "systemd-conf": "systemd", + "systemd-unit-file": "systemd", + "hosts": "hosts", + "ahk2": "ahk2", + "gnuplot": "gnuplot" }, "fileNames": { ".pug-lintrc": "pug", @@ -12106,7 +9007,15 @@ "wrangler.toml": "wrangler", "wrangler.json": "wrangler", "wrangler.jsonc": "wrangler", - ".clinerules": "cline" + ".clinerules": "cline", + ".rhistory": "r", + "cname": "http", + "sonarqube.analysis.xml": "sonarcloud", + "owners": "codeowners", + "caddyfile": "caddy", + "pklproject": "pkl", + "pklproject.deps.json": "pkl", + ".github/funding.yml": "github-sponsors" }, "languageIds": { "git": "git", diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index c1726d0790..a01cd753bf 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -900,7 +900,6 @@ func ExcerptBlob(ctx *context.Context) { } section := &gitdiff.DiffSection{ FileName: filePath, - Name: filePath, } if direction == "up" && (idxLeft-lastLeft) > chunkSize { idxLeft -= chunkSize diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 3a552547b8..53f50a018d 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -78,7 +78,7 @@ const ( type DiffLine struct { LeftIdx int // line number, 1-based RightIdx int // line number, 1-based - Match int // line number, 1-based + Match int // the diff matched index. -1: no match. 0: plain and no need to match. >0: for add/del, "Lines" slice index of the other side Type DiffLineType Content string Comments issues_model.CommentList // related PR code comments @@ -203,12 +203,20 @@ func getLineContent(content string, locale translation.Locale) DiffInline { type DiffSection struct { file *DiffFile FileName string - Name string Lines []*DiffLine } +func (diffSection *DiffSection) GetLine(idx int) *DiffLine { + if idx <= 0 { + return nil + } + return diffSection.Lines[idx] +} + // GetLine gets a specific line by type (add or del) and file line number -func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLine { +// This algorithm is not quite right. +// Actually now we have "Match" field, it is always right, so use it instead in new GetLine +func (diffSection *DiffSection) getLineLegacy(lineType DiffLineType, idx int) *DiffLine { //nolint:unused var ( difference = 0 addCount = 0 @@ -279,7 +287,7 @@ func (diffSection *DiffSection) getLineContentForRender(lineIdx int, diffLine *D if setting.Git.DisableDiffHighlight { return template.HTML(html.EscapeString(diffLine.Content[1:])) } - h, _ = highlight.Code(diffSection.Name, fileLanguage, diffLine.Content[1:]) + h, _ = highlight.Code(diffSection.FileName, fileLanguage, diffLine.Content[1:]) return h } @@ -292,20 +300,31 @@ func (diffSection *DiffSection) getDiffLineForRender(diffLineType DiffLineType, highlightedLeftLines, highlightedRightLines = diffSection.file.highlightedLeftLines, diffSection.file.highlightedRightLines } + var lineHTML template.HTML hcd := newHighlightCodeDiff() - var diff1, diff2, lineHTML template.HTML - if leftLine != nil { - diff1 = diffSection.getLineContentForRender(leftLine.LeftIdx, leftLine, fileLanguage, highlightedLeftLines) - lineHTML = util.Iif(diffLineType == DiffLinePlain, diff1, "") - } - if rightLine != nil { - diff2 = diffSection.getLineContentForRender(rightLine.RightIdx, rightLine, fileLanguage, highlightedRightLines) - lineHTML = util.Iif(diffLineType == DiffLinePlain, diff2, "") - } - if diffLineType != DiffLinePlain { - // it seems that Gitea doesn't need the line wrapper of Chroma, so do not add them back - // if the line wrappers are still needed in the future, it can be added back by "diffLineWithHighlightWrapper(hcd.lineWrapperTags. ...)" - lineHTML = hcd.diffLineWithHighlight(diffLineType, diff1, diff2) + if diffLineType == DiffLinePlain { + // left and right are the same, no need to do line-level diff + if leftLine != nil { + lineHTML = diffSection.getLineContentForRender(leftLine.LeftIdx, leftLine, fileLanguage, highlightedLeftLines) + } else if rightLine != nil { + lineHTML = diffSection.getLineContentForRender(rightLine.RightIdx, rightLine, fileLanguage, highlightedRightLines) + } + } else { + var diff1, diff2 template.HTML + if leftLine != nil { + diff1 = diffSection.getLineContentForRender(leftLine.LeftIdx, leftLine, fileLanguage, highlightedLeftLines) + } + if rightLine != nil { + diff2 = diffSection.getLineContentForRender(rightLine.RightIdx, rightLine, fileLanguage, highlightedRightLines) + } + if diff1 != "" && diff2 != "" { + // if only some parts of a line are changed, highlight these changed parts as "deleted/added". + lineHTML = hcd.diffLineWithHighlight(diffLineType, diff1, diff2) + } else { + // if left is empty or right is empty (a line is fully deleted or added), then we do not need to diff anymore. + // the tmpl code already adds background colors for these cases. + lineHTML = util.Iif(diffLineType == DiffLineDel, diff1, diff2) + } } return DiffInlineWithUnicodeEscape(lineHTML, locale) } @@ -317,10 +336,10 @@ func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine, loc case DiffLineSection: return getLineContent(diffLine.Content[1:], locale) case DiffLineAdd: - compareDiffLine := diffSection.GetLine(DiffLineDel, diffLine.RightIdx) + compareDiffLine := diffSection.GetLine(diffLine.Match) return diffSection.getDiffLineForRender(DiffLineAdd, compareDiffLine, diffLine, locale) case DiffLineDel: - compareDiffLine := diffSection.GetLine(DiffLineAdd, diffLine.LeftIdx) + compareDiffLine := diffSection.GetLine(diffLine.Match) return diffSection.getDiffLineForRender(DiffLineDel, diffLine, compareDiffLine, locale) default: // Plain // TODO: there was an "if" check: `if diffLine.Content >strings.IndexByte(" +-", diffLine.Content[0]) > -1 { ... } else { ... }` @@ -383,15 +402,22 @@ type DiffLimitedContent struct { // GetTailSectionAndLimitedContent creates a fake DiffLineSection if the last section is not the end of the file func (diffFile *DiffFile) GetTailSectionAndLimitedContent(leftCommit, rightCommit *git.Commit) (_ *DiffSection, diffLimitedContent DiffLimitedContent) { - if len(diffFile.Sections) == 0 || leftCommit == nil || diffFile.Type != DiffFileChange || diffFile.IsBin || diffFile.IsLFSFile { + var leftLineCount, rightLineCount int + diffLimitedContent = DiffLimitedContent{} + if diffFile.IsBin || diffFile.IsLFSFile { + return nil, diffLimitedContent + } + if (diffFile.Type == DiffFileDel || diffFile.Type == DiffFileChange) && leftCommit != nil { + leftLineCount, diffLimitedContent.LeftContent = getCommitFileLineCountAndLimitedContent(leftCommit, diffFile.OldName) + } + if (diffFile.Type == DiffFileAdd || diffFile.Type == DiffFileChange) && rightCommit != nil { + rightLineCount, diffLimitedContent.RightContent = getCommitFileLineCountAndLimitedContent(rightCommit, diffFile.OldName) + } + if len(diffFile.Sections) == 0 || diffFile.Type != DiffFileChange { return nil, diffLimitedContent } - lastSection := diffFile.Sections[len(diffFile.Sections)-1] lastLine := lastSection.Lines[len(lastSection.Lines)-1] - leftLineCount, leftContent := getCommitFileLineCountAndLimitedContent(leftCommit, diffFile.Name) - rightLineCount, rightContent := getCommitFileLineCountAndLimitedContent(rightCommit, diffFile.Name) - diffLimitedContent = DiffLimitedContent{LeftContent: leftContent, RightContent: rightContent} if leftLineCount <= lastLine.LeftIdx || rightLineCount <= lastLine.RightIdx { return nil, diffLimitedContent } diff --git a/services/gitdiff/highlightdiff.go b/services/gitdiff/highlightdiff.go index 5891e61249..6e18651d83 100644 --- a/services/gitdiff/highlightdiff.go +++ b/services/gitdiff/highlightdiff.go @@ -99,7 +99,7 @@ func (hcd *highlightCodeDiff) diffLineWithHighlightWrapper(lineWrapperTags []str dmp := defaultDiffMatchPatch() diffs := dmp.DiffMain(convertedCodeA, convertedCodeB, true) - diffs = dmp.DiffCleanupEfficiency(diffs) + diffs = dmp.DiffCleanupSemantic(diffs) buf := bytes.NewBuffer(nil) diff --git a/services/gitdiff/highlightdiff_test.go b/services/gitdiff/highlightdiff_test.go index 16649682b4..c2584dc622 100644 --- a/services/gitdiff/highlightdiff_test.go +++ b/services/gitdiff/highlightdiff_test.go @@ -23,6 +23,16 @@ func TestDiffWithHighlight(t *testing.T) { assert.Equal(t, `x bar y`, string(outAdd)) }) + t.Run("CleanUp", func(t *testing.T) { + hcd := newHighlightCodeDiff() + codeA := template.HTML(`this is updated comment`) + outDel := hcd.diffLineWithHighlight(DiffLineDel, codeA, codeB) + assert.Equal(t, `a comment`, string(outDel)) + outAdd := hcd.diffLineWithHighlight(DiffLineAdd, codeA, codeB) + assert.Equal(t, `updated comment`, string(outAdd)) + }) + t.Run("OpenCloseTags", func(t *testing.T) { hcd := newHighlightCodeDiff() hcd.placeholderTokenMap['O'], hcd.placeholderTokenMap['C'] = "", "" diff --git a/services/repository/files/diff_test.go b/services/repository/files/diff_test.go index 57920a2c4f..a8514791cc 100644 --- a/services/repository/files/diff_test.go +++ b/services/repository/files/diff_test.go @@ -47,7 +47,6 @@ func TestGetDiffPreview(t *testing.T) { Sections: []*gitdiff.DiffSection{ { FileName: "README.md", - Name: "", Lines: []*gitdiff.DiffLine{ { LeftIdx: 0, diff --git a/tools/generate-svg.js b/tools/generate-svg.js index f1b09915d8..7368392d01 100755 --- a/tools/generate-svg.js +++ b/tools/generate-svg.js @@ -63,8 +63,18 @@ async function processMaterialFileIcons() { } fs.writeFileSync(fileURLToPath(new URL(`../options/fileicon/material-icon-svgs.json`, import.meta.url)), JSON.stringify(svgSymbols, null, 2)); - const iconRules = await readFile(fileURLToPath(new URL(`../node_modules/material-icon-theme/dist/material-icons.json`, import.meta.url))); - const iconRulesPretty = JSON.stringify(JSON.parse(iconRules), null, 2); + const iconRulesJson = await readFile(fileURLToPath(new URL(`../node_modules/material-icon-theme/dist/material-icons.json`, import.meta.url))); + const iconRules = JSON.parse(iconRulesJson); + // The rules are from VSCode material-icon-theme, we need to adjust them to our needs + // 1. We only use lowercase filenames to match (it should be good enough for most cases and more efficient) + // 2. We do not have a "Language ID" system: https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers + // * So we just treat the "Language ID" as file extension, it is not always true, but it is good enough for most cases. + delete iconRules.iconDefinitions; + for (const [k, v] of Object.entries(iconRules.fileNames)) iconRules.fileNames[k.toLowerCase()] = v; + for (const [k, v] of Object.entries(iconRules.folderNames)) iconRules.folderNames[k.toLowerCase()] = v; + for (const [k, v] of Object.entries(iconRules.fileExtensions)) iconRules.fileExtensions[k.toLowerCase()] = v; + for (const [k, v] of Object.entries(iconRules.languageIds)) iconRules.fileExtensions[k.toLowerCase()] = v; + const iconRulesPretty = JSON.stringify(iconRules, null, 2); fs.writeFileSync(fileURLToPath(new URL(`../options/fileicon/material-icon-rules.json`, import.meta.url)), iconRulesPretty); }