// Copyright 2015 The Gogs Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package highlight import ( "path" "strings" "code.gitea.io/gitea/modules/setting" ) var ( // File name should ignore highlight. ignoreFileNames = map[string]bool{ "license": true, "copying": true, } // File names that are representing highlight classes. highlightFileNames = map[string]string{ "dockerfile": "dockerfile", "makefile": "makefile", "gnumakefile": "makefile", "cmakelists.txt": "cmake", } // Extensions that are same as highlight classes. // See hljs.listLanguages() for list of language names. highlightExts = map[string]struct{}{ ".applescript": {}, ".arm": {}, ".as": {}, ".bash": {}, ".bat": {}, ".c": {}, ".cmake": {}, ".cpp": {}, ".cs": {}, ".css": {}, ".dart": {}, ".diff": {}, ".django": {}, ".go": {}, ".gradle": {}, ".groovy": {}, ".haml": {}, ".handlebars": {}, ".html": {}, ".ini": {}, ".java": {}, ".json": {}, ".less": {}, ".lua": {}, ".php": {}, ".scala": {}, ".scss": {}, ".sql": {}, ".swift": {}, ".ts": {}, ".xml": {}, ".yaml": {}, } // Extensions that are not same as highlight classes. highlightMapping = map[string]string{ ".ahk": "autohotkey", ".crmsh": "crmsh", ".dash": "shell", ".erl": "erlang", ".escript": "erlang", ".ex": "elixir", ".exs": "elixir", ".f": "fortran", ".f77": "fortran", ".f90": "fortran", ".f95": "fortran", ".feature": "gherkin", ".fish": "shell", ".for": "fortran", ".hbs": "handlebars", ".hs": "haskell", ".hx": "haxe", ".js": "javascript", ".jsx": "javascript", ".ksh": "shell", ".kt": "kotlin", ".l": "ocaml", ".ls": "livescript", ".md": "markdown", ".mjs": "javascript", ".mli": "ocaml", ".mll": "ocaml", ".mly": "ocaml", ".patch": "diff", ".pl": "perl", ".pm": "perl", ".ps1": "powershell", ".psd1": "powershell", ".psm1": "powershell", ".py": "python", ".pyw": "python", ".rb": "ruby", ".rs": "rust", ".scpt": "applescript", ".scptd": "applescript", ".sh": "bash", ".tcsh": "shell", ".ts": "typescript", ".tsx": "typescript", ".txt": "plaintext", ".vb": "vbnet", ".vbs": "vbscript", ".yml": "yaml", ".zsh": "shell", } ) // NewContext loads highlight map func NewContext() { keys := setting.Cfg.Section("highlight.mapping").Keys() for i := range keys { highlightMapping[keys[i].Name()] = keys[i].Value() } } // FileNameToHighlightClass returns the best match for highlight class name // based on the rule of highlight.js. func FileNameToHighlightClass(fname string) string { fname = strings.ToLower(fname) if ignoreFileNames[fname] { return "nohighlight" } if name, ok := highlightFileNames[fname]; ok { return name } ext := path.Ext(fname) if _, ok := highlightExts[ext]; ok { return ext[1:] } name, ok := highlightMapping[ext] if ok { return name } return "" }