UNPKG

decap-cms-widget-code

Version:

Widget for editing code in Decap CMS

1,468 lines (1,461 loc) 44.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty")); var _isEqual2 = _interopRequireDefault(require("lodash/isEqual")); var _uniq2 = _interopRequireDefault(require("lodash/uniq")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes")); var _react2 = require("@emotion/react"); var _immutable = require("immutable"); var _uuid = require("uuid"); var _reactCodemirror = require("react-codemirror2"); var _codemirror = _interopRequireDefault(require("codemirror")); require("codemirror/keymap/vim"); require("codemirror/keymap/sublime"); require("codemirror/keymap/emacs"); var _codemirror2 = _interopRequireDefault(require("codemirror/lib/codemirror.css")); var _material = _interopRequireDefault(require("codemirror/theme/material.css")); var _SettingsPane = _interopRequireDefault(require("./SettingsPane")); var _SettingsButton = _interopRequireDefault(require("./SettingsButton")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } const languageData = [{ label: "AGS Script", identifiers: ["ags", "asc", "ash"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "APL", identifiers: ["apl", "dyalog"], codemirror_mode: "apl", codemirror_mime_type: "text/apl" }, { label: "ASN.1", identifiers: ["asn"], codemirror_mode: "asn.1", codemirror_mime_type: "text/x-ttcn-asn" }, { label: "ASP", identifiers: ["asp", "aspx", "asax", "ascx", "ashx", "asmx", "axd"], codemirror_mode: "htmlembedded", codemirror_mime_type: "application/x-aspx" }, { label: "Alpine Abuild", identifiers: ["abuild", "apkbuild"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "AngelScript", identifiers: ["angelscript", "as"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "Ant Build System", identifiers: [], codemirror_mode: "xml", codemirror_mime_type: "application/xml" }, { label: "Apex", identifiers: ["apex", "cls"], codemirror_mode: "clike", codemirror_mime_type: "text/x-java" }, { label: "Asymptote", identifiers: ["asymptote", "asy"], codemirror_mode: "clike", codemirror_mime_type: "text/x-kotlin" }, { label: "BibTeX", identifiers: ["bibtex", "bib"], codemirror_mode: "stex", codemirror_mime_type: "text/x-stex" }, { label: "Brainfuck", identifiers: ["brainfuck", "b", "bf"], codemirror_mode: "brainfuck", codemirror_mime_type: "text/x-brainfuck" }, { label: "C", identifiers: ["c", "cats", "h", "idc"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "C#", identifiers: ["csharp", "cs", "cake", "csx"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csharp" }, { label: "C++", identifiers: ["cpp", "cc", "cp", "cxx", "h", "hh", "hpp", "hxx", "inc", "inl", "ino", "ipp", "re", "tcc", "tpp"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "C2hs Haskell", identifiers: ["chs"], codemirror_mode: "haskell", codemirror_mime_type: "text/x-haskell" }, { label: "CMake", identifiers: ["cmake"], codemirror_mode: "cmake", codemirror_mime_type: "text/x-cmake" }, { label: "COBOL", identifiers: ["cobol", "cob", "cbl", "ccp", "cpy"], codemirror_mode: "cobol", codemirror_mime_type: "text/x-cobol" }, { label: "COLLADA", identifiers: ["collada", "dae"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "CSON", identifiers: ["cson"], codemirror_mode: "coffeescript", codemirror_mime_type: "text/x-coffeescript" }, { label: "CSS", identifiers: ["css"], codemirror_mode: "css", codemirror_mime_type: "text/css" }, { label: "Cabal Config", identifiers: ["Cabal", "cabal"], codemirror_mode: "haskell", codemirror_mime_type: "text/x-haskell" }, { label: "ChucK", identifiers: ["chuck", "ck"], codemirror_mode: "clike", codemirror_mime_type: "text/x-java" }, { label: "Clojure", identifiers: ["clojure", "clj", "boot", "cljc", "cljs", "cljscm", "cljx", "hic"], codemirror_mode: "clojure", codemirror_mime_type: "text/x-clojure" }, { label: "Closure Templates", identifiers: ["soy"], codemirror_mode: "soy", codemirror_mime_type: "text/x-soy" }, { label: "Cloud Firestore Security Rules", identifiers: [], codemirror_mode: "css", codemirror_mime_type: "text/css" }, { label: "CoffeeScript", identifiers: ["coffeescript", "coffee", "cake", "cjsx", "iced"], codemirror_mode: "coffeescript", codemirror_mime_type: "text/x-coffeescript" }, { label: "Common Lisp", identifiers: ["lisp", "asd", "cl", "l", "lsp", "ny", "podsl", "sexp"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "Common Workflow Language", identifiers: ["cwl"], codemirror_mode: "yaml", codemirror_mime_type: "text/x-yaml" }, { label: "Component Pascal", identifiers: ["delphi", "objectpascal", "cp", "cps"], codemirror_mode: "pascal", codemirror_mime_type: "text/x-pascal" }, { label: "Crystal", identifiers: ["crystal", "cr"], codemirror_mode: "crystal", codemirror_mime_type: "text/x-crystal" }, { label: "Cuda", identifiers: ["cuda", "cu", "cuh"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "Cycript", identifiers: ["cycript", "cy"], codemirror_mode: "javascript", codemirror_mime_type: "text/javascript" }, { label: "Cython", identifiers: ["cython", "pyrex", "pyx", "pxd", "pxi"], codemirror_mode: "python", codemirror_mime_type: "text/x-cython" }, { label: "D", identifiers: ["d", "di"], codemirror_mode: "d", codemirror_mime_type: "text/x-d" }, { label: "DTrace", identifiers: ["dtrace", "d"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "Dart", identifiers: ["dart"], codemirror_mode: "dart", codemirror_mime_type: "application/dart" }, { label: "Dhall", identifiers: ["dhall"], codemirror_mode: "haskell", codemirror_mime_type: "text/x-haskell" }, { label: "Diff", identifiers: ["diff", "udiff", "patch"], codemirror_mode: "diff", codemirror_mime_type: "text/x-diff" }, { label: "Dockerfile", identifiers: ["dockerfile"], codemirror_mode: "dockerfile", codemirror_mime_type: "text/x-dockerfile" }, { label: "Dylan", identifiers: ["dylan", "dyl", "intr", "lid"], codemirror_mode: "dylan", codemirror_mime_type: "text/x-dylan" }, { label: "EBNF", identifiers: ["ebnf"], codemirror_mode: "ebnf", codemirror_mime_type: "text/x-ebnf" }, { label: "ECL", identifiers: ["ecl", "eclxml"], codemirror_mode: "ecl", codemirror_mime_type: "text/x-ecl" }, { label: "EQ", identifiers: ["eq"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csharp" }, { label: "Eagle", identifiers: ["eagle", "sch", "brd"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "Easybuild", identifiers: ["easybuild", "eb"], codemirror_mode: "python", codemirror_mime_type: "text/x-python" }, { label: "Ecere Projects", identifiers: ["epj"], codemirror_mode: "javascript", codemirror_mime_type: "application/json" }, { label: "EditorConfig", identifiers: ["editorconfig"], codemirror_mode: "properties", codemirror_mime_type: "text/x-properties" }, { label: "Edje Data Collection", identifiers: ["edc"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "Eiffel", identifiers: ["eiffel", "e"], codemirror_mode: "eiffel", codemirror_mime_type: "text/x-eiffel" }, { label: "Elm", identifiers: ["elm"], codemirror_mode: "elm", codemirror_mime_type: "text/x-elm" }, { label: "Emacs Lisp", identifiers: ["elisp", "emacs", "el"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "EmberScript", identifiers: ["emberscript", "em"], codemirror_mode: "coffeescript", codemirror_mime_type: "text/x-coffeescript" }, { label: "Erlang", identifiers: ["erlang", "erl", "es", "escript", "hrl", "xrl", "yrl"], codemirror_mode: "erlang", codemirror_mime_type: "text/x-erlang" }, { label: "F#", identifiers: ["fsharp", "fs", "fsi", "fsx"], codemirror_mode: "mllike", codemirror_mime_type: "text/x-fsharp" }, { label: "Factor", identifiers: ["factor"], codemirror_mode: "factor", codemirror_mime_type: "text/x-factor" }, { label: "Forth", identifiers: ["forth", "fth", "f", "for", "fr", "frt", "fs"], codemirror_mode: "forth", codemirror_mime_type: "text/x-forth" }, { label: "Fortran", identifiers: ["fortran", "f", "for", "fpp"], codemirror_mode: "fortran", codemirror_mime_type: "text/x-fortran" }, { label: "GCC Machine Description", identifiers: ["md"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "GN", identifiers: ["gn", "gni"], codemirror_mode: "python", codemirror_mime_type: "text/x-python" }, { label: "Game Maker Language", identifiers: ["gml"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "Genshi", identifiers: ["genshi", "kid"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "Gentoo Ebuild", identifiers: ["ebuild"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "Gentoo Eclass", identifiers: ["eclass"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "Git Attributes", identifiers: ["gitattributes"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "Git Config", identifiers: ["gitconfig", "gitmodules"], codemirror_mode: "properties", codemirror_mime_type: "text/x-properties" }, { label: "Glyph", identifiers: ["glyph", "glf"], codemirror_mode: "tcl", codemirror_mime_type: "text/x-tcl" }, { label: "Go", identifiers: ["go", "golang"], codemirror_mode: "go", codemirror_mime_type: "text/x-go" }, { label: "Grammatical Framework", identifiers: ["gf"], codemirror_mode: "haskell", codemirror_mime_type: "text/x-haskell" }, { label: "Groovy", identifiers: ["groovy", "grt", "gtpl", "gvy"], codemirror_mode: "groovy", codemirror_mime_type: "text/x-groovy" }, { label: "Groovy Server Pages", identifiers: ["gsp"], codemirror_mode: "htmlembedded", codemirror_mime_type: "application/x-jsp" }, { label: "HCL", identifiers: ["hcl", "terraform", "tf", "tfvars", "workflow"], codemirror_mode: "ruby", codemirror_mime_type: "text/x-ruby" }, { label: "HTML", identifiers: ["html", "xhtml", "htm", "inc", "st", "xht"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "HTML+Django", identifiers: ["django", "htmldjango", "njk", "nunjucks", "jinja", "mustache"], codemirror_mode: "django", codemirror_mime_type: "text/x-django" }, { label: "HTML+ECR", identifiers: ["ecr"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "HTML+EEX", identifiers: ["eex"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "HTML+ERB", identifiers: ["erb"], codemirror_mode: "htmlembedded", codemirror_mime_type: "application/x-erb" }, { label: "HTML+PHP", identifiers: ["phtml"], codemirror_mode: "php", codemirror_mime_type: "application/x-httpd-php" }, { label: "HTML+Razor", identifiers: ["razor", "cshtml"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "HTTP", identifiers: ["http"], codemirror_mode: "http", codemirror_mime_type: "message/http" }, { label: "Hack", identifiers: ["hack", "hh", "php"], codemirror_mode: "php", codemirror_mime_type: "application/x-httpd-php" }, { label: "Haml", identifiers: ["haml"], codemirror_mode: "haml", codemirror_mime_type: "text/x-haml" }, { label: "Haskell", identifiers: ["haskell", "hs", "hsc"], codemirror_mode: "haskell", codemirror_mime_type: "text/x-haskell" }, { label: "Haxe", identifiers: ["haxe", "hx", "hxsl"], codemirror_mode: "haxe", codemirror_mime_type: "text/x-haxe" }, { label: "HolyC", identifiers: ["holyc", "hc"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "IDL", identifiers: ["idl", "pro", "dlm"], codemirror_mode: "idl", codemirror_mime_type: "text/x-idl" }, { label: "INI", identifiers: ["ini", "dosini", "cfg", "lektorproject", "prefs", "pro", "properties"], codemirror_mode: "properties", codemirror_mime_type: "text/x-properties" }, { label: "IRC log", identifiers: ["irc", "irclog", "weechatlog"], codemirror_mode: "mirc", codemirror_mime_type: "text/mirc" }, { label: "Ignore List", identifiers: ["ignore", "gitignore"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "JSON", identifiers: ["json", "avsc", "geojson", "gltf", "har", "ice", "jsonl", "mcmeta", "tfstate", "topojson", "webapp", "webmanifest", "yy", "yyp"], codemirror_mode: "javascript", codemirror_mime_type: "application/json" }, { label: "JSON with Comments", identifiers: ["jsonc"], codemirror_mode: "javascript", codemirror_mime_type: "text/javascript" }, { label: "JSON5", identifiers: [], codemirror_mode: "javascript", codemirror_mime_type: "application/json" }, { label: "JSONLD", identifiers: ["jsonld"], codemirror_mode: "javascript", codemirror_mime_type: "application/json" }, { label: "JSONiq", identifiers: ["jsoniq", "jq"], codemirror_mode: "javascript", codemirror_mime_type: "application/json" }, { label: "JSX", identifiers: ["jsx"], codemirror_mode: "jsx", codemirror_mime_type: "text/jsx" }, { label: "Java", identifiers: ["java"], codemirror_mode: "clike", codemirror_mime_type: "text/x-java" }, { label: "Java Properties", identifiers: ["properties"], codemirror_mode: "properties", codemirror_mime_type: "text/x-properties" }, { label: "Java Server Pages", identifiers: ["jsp"], codemirror_mode: "htmlembedded", codemirror_mime_type: "application/x-jsp" }, { label: "JavaScript", identifiers: ["javascript", "js", "node", "bones", "es", "frag", "gs", "jake", "jsb", "jscad", "jsfl", "jsm", "jss", "mjs", "njs", "pac", "sjs", "ssjs", "xsjs", "xsjslib"], codemirror_mode: "javascript", codemirror_mime_type: "text/javascript" }, { label: "JavaScript+ERB", identifiers: [], codemirror_mode: "javascript", codemirror_mime_type: "application/javascript" }, { label: "Julia", identifiers: ["julia", "jl"], codemirror_mode: "julia", codemirror_mime_type: "text/x-julia" }, { label: "Jupyter Notebook", identifiers: ["ipynb"], codemirror_mode: "javascript", codemirror_mime_type: "application/json" }, { label: "KiCad Layout", identifiers: ["pcbnew"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "Kit", identifiers: ["kit"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "Kotlin", identifiers: ["kotlin", "kt", "ktm", "kts"], codemirror_mode: "clike", codemirror_mime_type: "text/x-kotlin" }, { label: "LFE", identifiers: ["lfe"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "LTspice Symbol", identifiers: ["asy"], codemirror_mode: "spreadsheet", codemirror_mime_type: "text/x-spreadsheet" }, { label: "LabVIEW", identifiers: ["labview", "lvproj"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "Latte", identifiers: ["latte"], codemirror_mode: "smarty", codemirror_mime_type: "text/x-smarty" }, { label: "Less", identifiers: ["less"], codemirror_mode: "css", codemirror_mime_type: "text/css" }, { label: "Literate Haskell", identifiers: ["lhaskell", "lhs"], codemirror_mode: "haskell-literate", codemirror_mime_type: "text/x-literate-haskell" }, { label: "LiveScript", identifiers: ["livescript", "ls"], codemirror_mode: "livescript", codemirror_mime_type: "text/x-livescript" }, { label: "LookML", identifiers: ["lookml"], codemirror_mode: "yaml", codemirror_mime_type: "text/x-yaml" }, { label: "Lua", identifiers: ["lua", "fcgi", "nse", "rbxs", "wlua"], codemirror_mode: "lua", codemirror_mime_type: "text/x-lua" }, { label: "M", identifiers: ["m", "mumps"], codemirror_mode: "mumps", codemirror_mime_type: "text/x-mumps" }, { label: "MATLAB", identifiers: ["matlab", "octave", "m"], codemirror_mode: "octave", codemirror_mime_type: "text/x-octave" }, { label: "MTML", identifiers: ["mtml"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "MUF", identifiers: ["muf", "m"], codemirror_mode: "forth", codemirror_mime_type: "text/x-forth" }, { label: "Makefile", identifiers: ["makefile", "bsdmake", "make", "mf", "mak", "d", "mk", "mkfile"], codemirror_mode: "cmake", codemirror_mime_type: "text/x-cmake" }, { label: "Markdown", identifiers: ["markdown", "pandoc", "md", "mdown", "mdwn", "mdx", "mkd", "mkdn", "mkdown", "ronn", "workbook"], codemirror_mode: "gfm", codemirror_mime_type: "text/x-gfm" }, { label: "Marko", identifiers: ["marko", "markojs"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "Mathematica", identifiers: ["mathematica", "mma", "cdf", "m", "ma", "mt", "nb", "nbp", "wl", "wlt"], codemirror_mode: "mathematica", codemirror_mime_type: "text/x-mathematica" }, { label: "Maven POM", identifiers: [], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "Max", identifiers: ["max", "maxmsp", "maxpat", "maxhelp", "maxproj", "mxt", "pat"], codemirror_mode: "javascript", codemirror_mime_type: "application/json" }, { label: "Metal", identifiers: ["metal"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "Mirah", identifiers: ["mirah", "druby", "duby"], codemirror_mode: "ruby", codemirror_mime_type: "text/x-ruby" }, { label: "Modelica", identifiers: ["modelica", "mo"], codemirror_mode: "modelica", codemirror_mime_type: "text/x-modelica" }, { label: "NSIS", identifiers: ["nsis", "nsi", "nsh"], codemirror_mode: "nsis", codemirror_mime_type: "text/x-nsis" }, { label: "NetLogo", identifiers: ["netlogo", "nlogo"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "NewLisp", identifiers: ["newlisp", "nl", "lisp", "lsp"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "Nginx", identifiers: ["nginx", "nginxconf", "vhost"], codemirror_mode: "nginx", codemirror_mime_type: "text/x-nginx-conf" }, { label: "Nu", identifiers: ["nu", "nush"], codemirror_mode: "scheme", codemirror_mime_type: "text/x-scheme" }, { label: "NumPy", identifiers: ["numpy", "numpyw", "numsc"], codemirror_mode: "python", codemirror_mime_type: "text/x-python" }, { label: "OCaml", identifiers: ["ocaml", "ml", "eliom", "eliomi", "mli", "mll", "mly"], codemirror_mode: "mllike", codemirror_mime_type: "text/x-ocaml" }, { label: "Objective-C", identifiers: ["objc", "objectivec", "m", "h"], codemirror_mode: "clike", codemirror_mime_type: "text/x-objectivec" }, { label: "Objective-C++", identifiers: ["mm"], codemirror_mode: "clike", codemirror_mime_type: "text/x-objectivec" }, { label: "OpenCL", identifiers: ["opencl", "cl"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "OpenRC runscript", identifiers: ["openrc"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "Oz", identifiers: ["oz"], codemirror_mode: "oz", codemirror_mime_type: "text/x-oz" }, { label: "PHP", identifiers: ["php", "inc", "aw", "ctp", "fcgi", "phps", "phpt"], codemirror_mode: "php", codemirror_mime_type: "application/x-httpd-php" }, { label: "PLSQL", identifiers: ["plsql", "pls", "bdy", "ddl", "fnc", "pck", "pkb", "pks", "plb", "prc", "spc", "sql", "tpb", "tps", "trg", "vw"], codemirror_mode: "sql", codemirror_mime_type: "text/x-plsql" }, { label: "PLpgSQL", identifiers: ["plpgsql", "pgsql", "sql"], codemirror_mode: "sql", codemirror_mime_type: "text/x-sql" }, { label: "Pascal", identifiers: ["pascal", "pas", "dfm", "dpr", "inc", "lpr", "pp"], codemirror_mode: "pascal", codemirror_mime_type: "text/x-pascal" }, { label: "Perl", identifiers: ["perl", "cperl", "pl", "al", "cgi", "fcgi", "ph", "plx", "pm", "psgi", "t"], codemirror_mode: "perl", codemirror_mime_type: "text/x-perl" }, { label: "Perl 6", identifiers: ["nqp", "pl", "pm", "t"], codemirror_mode: "perl", codemirror_mime_type: "text/x-perl" }, { label: "Pic", identifiers: ["pic", "chem"], codemirror_mode: "troff", codemirror_mime_type: "text/troff" }, { label: "Pod", identifiers: ["pod"], codemirror_mode: "perl", codemirror_mime_type: "text/x-perl" }, { label: "PowerShell", identifiers: ["powershell", "posh", "pwsh"], codemirror_mode: "powershell", codemirror_mime_type: "application/x-powershell" }, { label: "Protocol Buffer", identifiers: ["protobuf", "proto"], codemirror_mode: "protobuf", codemirror_mime_type: "text/x-protobuf" }, { label: "Public Key", identifiers: ["asc", "pub"], codemirror_mode: "asciiarmor", codemirror_mime_type: "application/pgp" }, { label: "Pug", identifiers: ["pug", "jade"], codemirror_mode: "pug", codemirror_mime_type: "text/x-pug" }, { label: "Puppet", identifiers: ["puppet", "pp"], codemirror_mode: "puppet", codemirror_mime_type: "text/x-puppet" }, { label: "PureScript", identifiers: ["purescript", "purs"], codemirror_mode: "haskell", codemirror_mime_type: "text/x-haskell" }, { label: "Python", identifiers: ["python", "rusthon", "py", "bzl", "cgi", "fcgi", "gyp", "gypi", "lmi", "pyde", "pyi", "pyp", "pyt", "pyw", "rpy", "spec", "tac", "wsgi", "xpy"], codemirror_mode: "python", codemirror_mime_type: "text/x-python" }, { label: "R", identifiers: ["r", "R", "Rscript", "splus", "rd", "rsx"], codemirror_mode: "r", codemirror_mime_type: "text/x-rsrc" }, { label: "RAML", identifiers: ["raml"], codemirror_mode: "yaml", codemirror_mime_type: "text/x-yaml" }, { label: "RHTML", identifiers: ["rhtml"], codemirror_mode: "htmlembedded", codemirror_mime_type: "application/x-erb" }, { label: "RMarkdown", identifiers: ["rmarkdown", "rmd"], codemirror_mode: "gfm", codemirror_mime_type: "text/x-gfm" }, { label: "RPM Spec", identifiers: ["specfile", "spec"], codemirror_mode: "rpm", codemirror_mime_type: "text/x-rpm-spec" }, { label: "Reason", identifiers: ["reason", "re", "rei"], codemirror_mode: "rust", codemirror_mime_type: "text/x-rustsrc" }, { label: "Roff", identifiers: ["roff", "groff", "man", "manpage", "mdoc", "nroff", "troff", "l", "me", "ms", "n", "nr", "rno", "tmac"], codemirror_mode: "troff", codemirror_mime_type: "text/troff" }, { label: "Roff Manpage", identifiers: ["man", "mdoc"], codemirror_mode: "troff", codemirror_mime_type: "text/troff" }, { label: "Rouge", identifiers: ["rouge", "rg"], codemirror_mode: "clojure", codemirror_mime_type: "text/x-clojure" }, { label: "Ruby", identifiers: ["ruby", "jruby", "macruby", "rake", "rb", "rbx", "builder", "eye", "fcgi", "gemspec", "god", "jbuilder", "mspec", "pluginspec", "podspec", "rabl", "rbuild", "rbw", "ru", "spec", "thor", "watchr"], codemirror_mode: "ruby", codemirror_mime_type: "text/x-ruby" }, { label: "Rust", identifiers: ["rust", "rs"], codemirror_mode: "rust", codemirror_mime_type: "text/x-rustsrc" }, { label: "SAS", identifiers: ["sas"], codemirror_mode: "sas", codemirror_mime_type: "text/x-sas" }, { label: "SCSS", identifiers: ["scss"], codemirror_mode: "css", codemirror_mime_type: "text/x-scss" }, { label: "SPARQL", identifiers: ["sparql", "rq"], codemirror_mode: "sparql", codemirror_mime_type: "application/sparql-query" }, { label: "SQL", identifiers: ["sql", "cql", "ddl", "inc", "mysql", "prc", "tab", "udf", "viw"], codemirror_mode: "sql", codemirror_mime_type: "text/x-sql" }, { label: "SQLPL", identifiers: ["sqlpl", "sql"], codemirror_mode: "sql", codemirror_mime_type: "text/x-sql" }, { label: "SRecode Template", identifiers: ["srt"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "SVG", identifiers: ["svg"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "Sage", identifiers: ["sage", "sagews"], codemirror_mode: "python", codemirror_mime_type: "text/x-python" }, { label: "SaltStack", identifiers: ["saltstack", "saltstate", "salt", "sls"], codemirror_mode: "yaml", codemirror_mime_type: "text/x-yaml" }, { label: "Sass", identifiers: ["sass"], codemirror_mode: "sass", codemirror_mime_type: "text/x-sass" }, { label: "Scala", identifiers: ["scala", "kojo", "sbt", "sc"], codemirror_mode: "clike", codemirror_mime_type: "text/x-scala" }, { label: "Scheme", identifiers: ["scheme", "scm", "sch", "sld", "sls", "sps", "ss"], codemirror_mode: "scheme", codemirror_mime_type: "text/x-scheme" }, { label: "Shell", identifiers: ["shell", "sh", "bash", "zsh", "bats", "cgi", "command", "fcgi", "ksh", "tmux", "tool"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "ShellSession", identifiers: ["shellsession", "console"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "Slim", identifiers: ["slim"], codemirror_mode: "slim", codemirror_mime_type: "text/x-slim" }, { label: "Smalltalk", identifiers: ["smalltalk", "squeak", "st", "cs"], codemirror_mode: "smalltalk", codemirror_mime_type: "text/x-stsrc" }, { label: "Smarty", identifiers: ["smarty", "tpl"], codemirror_mode: "smarty", codemirror_mime_type: "text/x-smarty" }, { label: "Squirrel", identifiers: ["squirrel", "nut"], codemirror_mode: "clike", codemirror_mime_type: "text/x-c++src" }, { label: "Standard ML", identifiers: ["sml", "ML", "fun", "sig"], codemirror_mode: "mllike", codemirror_mime_type: "text/x-ocaml" }, { label: "Svelte", identifiers: ["svelte"], codemirror_mode: "htmlmixed", codemirror_mime_type: "text/html" }, { label: "Swift", identifiers: ["swift"], codemirror_mode: "swift", codemirror_mime_type: "text/x-swift" }, { label: "SystemVerilog", identifiers: ["systemverilog", "sv", "svh", "vh"], codemirror_mode: "verilog", codemirror_mime_type: "text/x-systemverilog" }, { label: "TOML", identifiers: ["toml"], codemirror_mode: "toml", codemirror_mime_type: "text/x-toml" }, { label: "TSX", identifiers: ["tsx"], codemirror_mode: "jsx", codemirror_mime_type: "text/jsx" }, { label: "Tcl", identifiers: ["tcl", "adp", "tm"], codemirror_mode: "tcl", codemirror_mime_type: "text/x-tcl" }, { label: "Tcsh", identifiers: ["tcsh", "csh"], codemirror_mode: "shell", codemirror_mime_type: "text/x-sh" }, { label: "TeX", identifiers: ["tex", "latex", "aux", "bbx", "cbx", "cls", "dtx", "ins", "lbx", "ltx", "mkii", "mkiv", "mkvi", "sty", "toc"], codemirror_mode: "stex", codemirror_mime_type: "text/x-stex" }, { label: "Terra", identifiers: ["terra", "t"], codemirror_mode: "lua", codemirror_mime_type: "text/x-lua" }, { label: "Textile", identifiers: ["textile"], codemirror_mode: "textile", codemirror_mime_type: "text/x-textile" }, { label: "Turtle", identifiers: ["turtle", "ttl"], codemirror_mode: "turtle", codemirror_mime_type: "text/turtle" }, { label: "Twig", identifiers: ["twig"], codemirror_mode: "twig", codemirror_mime_type: "text/x-twig" }, { label: "TypeScript", identifiers: ["typescript", "ts"], codemirror_mode: "javascript", codemirror_mime_type: "application/typescript" }, { label: "Unified Parallel C", identifiers: ["upc"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "Unity3D Asset", identifiers: ["anim", "asset", "mat", "meta", "prefab", "unity"], codemirror_mode: "yaml", codemirror_mime_type: "text/x-yaml" }, { label: "Uno", identifiers: ["uno"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csharp" }, { label: "UnrealScript", identifiers: ["unrealscript", "uc"], codemirror_mode: "clike", codemirror_mime_type: "text/x-java" }, { label: "V", identifiers: ["v", "vlang"], codemirror_mode: "go", codemirror_mime_type: "text/x-go" }, { label: "VHDL", identifiers: ["vhdl", "vhd", "vhf", "vhi", "vho", "vhs", "vht", "vhw"], codemirror_mode: "vhdl", codemirror_mime_type: "text/x-vhdl" }, { label: "Verilog", identifiers: ["verilog", "v", "veo"], codemirror_mode: "verilog", codemirror_mime_type: "text/x-verilog" }, { label: "Visual Basic", identifiers: ["vbnet", "vb", "bas", "cls", "frm", "frx", "vba", "vbhtml", "vbs"], codemirror_mode: "vb", codemirror_mime_type: "text/x-vb" }, { label: "Volt", identifiers: ["volt"], codemirror_mode: "d", codemirror_mime_type: "text/x-d" }, { label: "WebAssembly", identifiers: ["webassembly", "wast", "wasm", "wat"], codemirror_mode: "commonlisp", codemirror_mime_type: "text/x-common-lisp" }, { label: "WebIDL", identifiers: ["webidl"], codemirror_mode: "webidl", codemirror_mime_type: "text/x-webidl" }, { label: "Windows Registry Entries", identifiers: ["reg"], codemirror_mode: "properties", codemirror_mime_type: "text/x-properties" }, { label: "X BitMap", identifiers: ["xbm"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "X PixMap", identifiers: ["xpm", "pm"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "XC", identifiers: ["xc"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "XML", identifiers: ["xml", "rss", "xsd", "wsdl", "adml", "admx", "ant", "axml", "builds", "ccproj", "ccxml", "clixml", "cproject", "cscfg", "csdef", "csl", "csproj", "ct", "depproj", "dita", "ditamap", "ditaval", "dotsettings", "filters", "fsproj", "fxml", "glade", "gml", "gmx", "grxml", "iml", "ivy", "jelly", "jsproj", "kml", "launch", "mdpolicy", "mjml", "mm", "mod", "mxml", "natvis", "ncl", "ndproj", "nproj", "nuspec", "odd", "osm", "pkgproj", "pluginspec", "proj", "props", "pt", "rdf", "resx", "sch", "scxml", "sfproj", "shproj", "srdf", "storyboard", "targets", "tml", "ts", "tsx", "ui", "urdf", "ux", "vbproj", "vcxproj", "vsixmanifest", "vssettings", "vstemplate", "vxml", "wixproj", "workflow", "wsf", "wxi", "wxl", "wxs", "xacro", "xaml", "xib", "xlf", "xliff", "xmi", "xproj", "xspec", "xul", "zcml"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "XML Property List", identifiers: ["plist", "stTheme", "tmCommand", "tmLanguage", "tmPreferences", "tmSnippet", "tmTheme"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "XPages", identifiers: ["xpages"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "XProc", identifiers: ["xproc", "xpl"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "XQuery", identifiers: ["xquery", "xq", "xql", "xqm", "xqy"], codemirror_mode: "xquery", codemirror_mime_type: "application/xquery" }, { label: "XS", identifiers: ["xs"], codemirror_mode: "clike", codemirror_mime_type: "text/x-csrc" }, { label: "XSLT", identifiers: ["xslt", "xsl"], codemirror_mode: "xml", codemirror_mime_type: "text/xml" }, { label: "YAML", identifiers: ["yaml", "yml", "mir", "reek", "rviz", "syntax"], codemirror_mode: "yaml", codemirror_mime_type: "text/x-yaml" }, { label: "edn", identifiers: ["edn"], codemirror_mode: "clojure", codemirror_mime_type: "text/x-clojure" }, { label: "reStructuredText", identifiers: ["restructuredtext", "rst", "rest"], codemirror_mode: "rst", codemirror_mime_type: "text/x-rst" }, { label: "wisp", identifiers: ["wisp"], codemirror_mode: "clojure", codemirror_mime_type: "text/x-clojure" }]; // TODO: relocate as a utility function function getChangedProps(previous, next, keys) { const propNames = keys || (0, _uniq2.default)(Object.keys(previous), Object.keys(next)); const changedProps = propNames.reduce((acc, prop) => { if (previous[prop] !== next[prop]) { acc[prop] = next[prop]; } return acc; }, {}); if (!(0, _isEmpty2.default)(changedProps)) { return changedProps; } } const languages = languageData.map(lang => ({ label: lang.label, name: lang.identifiers[0], mode: lang.codemirror_mode, mimeType: lang.codemirror_mime_type })); const styleString = ` padding: 0; `; const defaultLang = { name: '', mode: '', label: 'none' }; function valueToOption(val) { if (typeof val === 'string') { return { value: val, label: val }; } return { value: val.name, label: val.label || val.name }; } const modes = languages.map(valueToOption); const themes = ['default', 'material']; const settingsPersistKeys = { theme: 'cms.codemirror.theme', keyMap: 'cms.codemirror.keymap' }; class CodeControl extends _react.default.Component { constructor(...args) { var _this$props$value; super(...args); _defineProperty(this, "keys", this.getKeys(this.props.field)); _defineProperty(this, "state", { isActive: false, unknownLang: null, lang: '', keyMap: localStorage.getItem(settingsPersistKeys['keyMap']) || 'default', settingsVisible: false, codeMirrorKey: (0, _uuid.v4)(), theme: localStorage.getItem(settingsPersistKeys['theme']) || themes[themes.length - 1], lastKnownValue: this.valueIsMap() ? (_this$props$value = this.props.value) === null || _this$props$value === void 0 ? void 0 : _this$props$value.get(this.keys.code) : this.props.value }); _defineProperty(this, "visibility", { isInvisibleOnInit: this.props.isParentListCollapsed === true, isRefreshedAfterInvisible: false }); _defineProperty(this, "getLanguageByName", name => { return languages.find(lang => lang.name === name); }); _defineProperty(this, "getKeyMapOptions", () => { return Object.keys(_codemirror.default.keyMap).sort().filter(keyMap => ['emacs', 'vim', 'sublime', 'default'].includes(keyMap)).map(keyMap => ({ value: keyMap, label: keyMap })); }); // This widget is not fully controlled, it only takes a value through props // upon initialization. _defineProperty(this, "getInitialLang", () => { const { value, field } = this.props; const lang = this.valueIsMap() && value && value.get(this.keys.lang) || field.get('default_language'); const langInfo = this.getLanguageByName(lang); if (lang && !langInfo) { this.setState({ unknownLang: lang }); } return lang; }); // If `allow_language_selection` is not set, default to true. Otherwise, use // its value. _defineProperty(this, "allowLanguageSelection", !this.props.field.has('allow_language_selection') || !!this.props.field.get('allow_language_selection')); _defineProperty(this, "toValue", this.valueIsMap() ? (type, value) => (this.props.value || (0, _immutable.Map)()).set(this.keys[type], value) : (type, value) => type === 'code' ? value : this.props.value); _defineProperty(this, "showSettings", () => { this.setState({ settingsVisible: true }); }); _defineProperty(this, "hideSettings", () => { if (this.state.settingsVisible) { this.setState({ settingsVisible: false }); } this.cm.focus(); }); _defineProperty(this, "handleFocus", () => { this.hideSettings(); this.props.setActiveStyle(); this.setActive(); }); _defineProperty(this, "handleBlur", () => { this.setInactive(); this.props.setInactiveStyle(); }); _defineProperty(this, "setActive", () => this.setState({ isActive: true })); _defineProperty(this, "setInactive", () => this.setState({ isActive: false })); } shouldComponentUpdate(nextProps, nextState) { return !(0, _isEqual2.default)(this.state, nextState) || this.props.classNameWrapper !== nextProps.classNameWrapper || this.visibility.isInvisibleOnInit && !this.visibility.isRefreshedAfterInvisible; } componentDidMount() { this.setState({ lang: this.getInitialLang() || '' }); } componentDidUpdate(prevProps, prevState) { this.updateCodeMirrorProps(prevState); // when initially hidden and then shown, codeMirror content is not visible if (this.visibility.isInvisibleOnInit && !this.visibility.isRefreshedAfterInvisible && !this.props.isParentListCollapsed) { this.refreshCodeMirrorInstance(); } } updateCodeMirrorProps(prevState) { const keys = ['lang', 'theme', 'keyMap']; const changedProps = getChangedProps(prevState, this.state, keys); if (changedProps) { this.handleChangeCodeMirrorProps(changedProps); } } refreshCodeMirrorInstance() { var _this$cm; if ((_this$cm = this.cm) !== null && _this$cm !== void 0 && _this$cm.getWrapperElement().offsetHeight) { this.cm.refresh(); this.visibility.isRefreshedAfterInvisible = true; } } // If the value is a map, keys can be customized via config. getKeys(field) { const defaults = { code: 'code', lang: 'lang' }; // Force default keys if widget is an editor component code block. if (this.props.isEditorComponent) { return defaults; } const keys = field.get('keys', (0, _immutable.Map)()).toJS(); return _objectSpread(_objectSpread({}, defaults), keys); } // Determine if the persisted value is a map rather than a plain string. A map // value allows both the code string and the language to be persisted. valueIsMap() { const { field, isEditorComponent } = this.props; return !field.get('output_code_only') || isEditorComponent; } async handleChangeCodeMirrorProps(changedProps) { const { onChange } = this.props; if (changedProps.lang) { const { mode } = this.getLanguageByName(changedProps.lang) || {}; if (mode) { require(`codemirror/mode/${mode}/${mode}.js`); } } // Changing CodeMirror props requires re-initializing the // detached/uncontrolled React CodeMirror component, so here we save and // restore the selections and cursor position after the state change. if (this.cm) { const cursor = this.cm.doc.getCursor(); const selections = this.cm.doc.listSelections(); this.setState({ codeMirrorKey: (0, _uuid.v4)() }, () => { this.cm.doc.setCursor(cursor); this.cm.doc.setSelections(selections); }); } for (const key of ['theme', 'keyMap']) { if (changedProps[key]) { localStorage.setItem(settingsPersistKeys[key], changedProps[key]); } } // Only persist the language change if supported - requires the value to be // a map rather than just a code string. if (changedProps.lang && this.valueIsMap()) { onChange(this.toValue('lang', changedProps.lang)); } } handleChange(newValue) { const cursor = this.cm.doc.getCursor(); const selections = this.cm.doc.listSelections(); this.setState({ lastKnownValue: newValue }); this.props.onChange(this.toValue('code', newValue), { cursor, selections }); } render() { const { classNameWrapper, forID, widget, isNewEditorComponent } = this.props; const { lang, settingsVisible, keyMap, codeMirrorKey, theme, lastKnownValue } = this.state; const langInfo = this.getLanguageByName(lang); const mode = (langInfo === null || langInfo === void 0 ? void 0 : langInfo.mimeType) || (langInfo === null || langInfo === void 0 ? void 0 : langInfo.mode); return (0, _react2.jsx)(_react2.ClassNames, null, ({ css, cx }) => (0, _react2.jsx)("div", { className: cx(classNameWrapper, css` ${_codemirror2.default}; ${_material.default}; ${styleString}; `) }, !settingsVisible && (0, _react2.jsx)(_SettingsButton.default, { onClick: this.showSettings }), settingsVisible && (0, _react2.jsx)(_SettingsPane.default, { hideSettings: this.hideSettings, forID: forID, modes: modes, mode: valueToOption(langInfo || defaultLang), theme: themes.find(t => t === theme), themes: themes, keyMap: { value: keyMap, label: keyMap }, keyMaps: this.getKeyMapOptions(), allowLanguageSelection: this.allowLanguageSelection, onChangeLang: newLang => this.setState({ lang: newLang }), onChangeTheme: newTheme => this.setState({ theme: newTheme }), onChangeKeyMap: newKeyMap => this.setState({ keyMap: newKeyMap }) }), (0, _react2.jsx)(_reactCodemirror.UnControlled, { key: codeMirrorKey, id: forID, className: css` height: 100%; border-radius: 0 3px 3px; overflow: hidden; .CodeMirror { height: auto !important; cursor: text; min-height: 300px; } .CodeMirror-scroll { min-height: 300px; } `, options: _objectSpread(_objectSpread({ lineNumbers: true }, widget.codeMirrorConfig), {}, { extraKeys: _objectSpread({ 'Shift-Tab': 'indentLess', Tab: 'indentMore' }, widget.codeMirrorConfig.extraKeys || {}), theme, mode, keyMap, viewportMargin: Infinity }), detach: true, editorDidMount: cm => { this.cm = cm; if (isNewEditorComponent) { this.handleFocus(); } }, value: lastKnownValue, onChange: (editor, data, newValue) => this.handleChange(newValue), onFocus: this.handleFocus, onBlur: this.handleBlur }))); } } exports.default = CodeControl; _defineProperty(CodeControl, "propTypes", { field: _reactImmutableProptypes.default.map.isRequired, onChange: _propTypes.default.func.isRequired, value: _propTypes.default.node, forID: _propTypes.default.string.isRequired, classNameWrapper: _propTypes.default.string.isRequired, widget: _propTypes.default.object.isRequired, isParentListCollapsed: _propTypes.default.bool });