Bugzilla – Attachment 87301 Details for
Bug 21582
Use CodeMirror for *UserJS & *UserCSS
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 21582: Use CodeMirror for *UserJS & *UserCSS
Bug-21582-Use-CodeMirror-for-UserJS--UserCSS.patch (text/plain), 154.77 KB, created by
Tomás Cohen Arazi (tcohen)
on 2019-04-01 18:43:18 UTC
(
hide
)
Description:
Bug 21582: Use CodeMirror for *UserJS & *UserCSS
Filename:
MIME Type:
Creator:
Tomás Cohen Arazi (tcohen)
Created:
2019-04-01 18:43:18 UTC
Size:
154.77 KB
patch
obsolete
>From 6838fc46af0318297b3d705c308c1a60ef613c85 Mon Sep 17 00:00:00 2001 >From: Owen Leonard <oleonard@myacpl.org> >Date: Fri, 29 Mar 2019 19:01:19 +0000 >Subject: [PATCH] Bug 21582: Use CodeMirror for *UserJS & *UserCSS > >This patch adds CodeMirror syntax highlighting by default to JS and CSS >system preferences. HTML preferences will use CodeMirror editors if >UseWYSIWYGinSystemPreferences is disabled. > >Three new CodeMirror files are added to support three new syntax >highlighting modes: XML (for HTML), CSS, and JS. > >A new option is added to *.pref file configurations for textareas which >are intended for HTML, JS, or CSS: syntax. This option is passed to the >CodeMirror configuration to control syntax highlighting mode. > >Textareas without a syntax option specified will not have CodeMirror >enabled. > >To test, apply the patch and go to Administration -> System preferences. > >Test the behavior of several preferences which use <textarea> as their >input. For example: > >- OPACUserJS (JS) >- IntranetUserCSS (CSS) >- OpacHeader (HTML) >- BibtexExportAdditionalFields (no highlighting) > >Text entry in each of these should have the correct syntax highlighting >applied to them. All data should be saved correctly. > >Test with UseWYSIWYGinSystemPreferences both on and off. > >Signed-off-by: Liz Rea <wizzyrea@gmail.com> >Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> >--- > admin/preferences.pl | 4 +- > koha-tmpl/intranet-tmpl/lib/codemirror/css.js | 833 ++++++++++++++++ > .../intranet-tmpl/lib/codemirror/css.min.js | 1 + > .../lib/codemirror/javascript.js | 900 ++++++++++++++++++ > .../lib/codemirror/javascript.min.js | 1 + > koha-tmpl/intranet-tmpl/lib/codemirror/xml.js | 402 ++++++++ > .../intranet-tmpl/lib/codemirror/xml.min.js | 1 + > .../intranet-tmpl/prog/css/preferences.css | 6 + > .../prog/en/modules/admin/preferences.tt | 18 +- > .../admin/preferences/cataloguing.pref | 1 + > .../admin/preferences/circulation.pref | 6 + > .../en/modules/admin/preferences/opac.pref | 43 +- > .../admin/preferences/staff_client.pref | 4 + > .../prog/js/pages/preferences.js | 51 +- > 14 files changed, 2236 insertions(+), 35 deletions(-) > create mode 100644 koha-tmpl/intranet-tmpl/lib/codemirror/css.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/codemirror/css.min.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/codemirror/javascript.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/codemirror/javascript.min.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/codemirror/xml.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/codemirror/xml.min.js > >diff --git a/admin/preferences.pl b/admin/preferences.pl >index 113b7a5a19..92c5bbee72 100755 >--- a/admin/preferences.pl >+++ b/admin/preferences.pl >@@ -61,7 +61,9 @@ sub _get_chunk { > > my $name = $options{'pref'}; > my $chunk = { name => $name, value => $value, type => $options{'type'} || 'input', class => $options{'class'} }; >- >+ if( $options{'syntax'} ){ >+ $chunk->{'syntax'} = $options{'syntax'}; >+ } > if ( $options{'class'} && $options{'class'} eq 'password' ) { > $chunk->{'input_type'} = 'password'; > } elsif ( $options{'class'} && $options{'class'} eq 'date' ) { >diff --git a/koha-tmpl/intranet-tmpl/lib/codemirror/css.js b/koha-tmpl/intranet-tmpl/lib/codemirror/css.js >new file mode 100644 >index 0000000000..723c70375c >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/codemirror/css.js >@@ -0,0 +1,833 @@ >+/* CodeMirror version: 5.40.2 */ >+// CodeMirror, copyright (c) by Marijn Haverbeke and others >+// Distributed under an MIT license: https://codemirror.net/LICENSE >+ >+(function(mod) { >+ if (typeof exports == "object" && typeof module == "object") // CommonJS >+ mod(require("../../lib/codemirror")); >+ else if (typeof define == "function" && define.amd) // AMD >+ define(["../../lib/codemirror"], mod); >+ else // Plain browser env >+ mod(CodeMirror); >+})(function(CodeMirror) { >+"use strict"; >+ >+CodeMirror.defineMode("css", function(config, parserConfig) { >+ var inline = parserConfig.inline >+ if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); >+ >+ var indentUnit = config.indentUnit, >+ tokenHooks = parserConfig.tokenHooks, >+ documentTypes = parserConfig.documentTypes || {}, >+ mediaTypes = parserConfig.mediaTypes || {}, >+ mediaFeatures = parserConfig.mediaFeatures || {}, >+ mediaValueKeywords = parserConfig.mediaValueKeywords || {}, >+ propertyKeywords = parserConfig.propertyKeywords || {}, >+ nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, >+ fontProperties = parserConfig.fontProperties || {}, >+ counterDescriptors = parserConfig.counterDescriptors || {}, >+ colorKeywords = parserConfig.colorKeywords || {}, >+ valueKeywords = parserConfig.valueKeywords || {}, >+ allowNested = parserConfig.allowNested, >+ lineComment = parserConfig.lineComment, >+ supportsAtComponent = parserConfig.supportsAtComponent === true; >+ >+ var type, override; >+ function ret(style, tp) { type = tp; return style; } >+ >+ // Tokenizers >+ >+ function tokenBase(stream, state) { >+ var ch = stream.next(); >+ if (tokenHooks[ch]) { >+ var result = tokenHooks[ch](stream, state); >+ if (result !== false) return result; >+ } >+ if (ch == "@") { >+ stream.eatWhile(/[\w\\\-]/); >+ return ret("def", stream.current()); >+ } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { >+ return ret(null, "compare"); >+ } else if (ch == "\"" || ch == "'") { >+ state.tokenize = tokenString(ch); >+ return state.tokenize(stream, state); >+ } else if (ch == "#") { >+ stream.eatWhile(/[\w\\\-]/); >+ return ret("atom", "hash"); >+ } else if (ch == "!") { >+ stream.match(/^\s*\w*/); >+ return ret("keyword", "important"); >+ } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { >+ stream.eatWhile(/[\w.%]/); >+ return ret("number", "unit"); >+ } else if (ch === "-") { >+ if (/[\d.]/.test(stream.peek())) { >+ stream.eatWhile(/[\w.%]/); >+ return ret("number", "unit"); >+ } else if (stream.match(/^-[\w\\\-]+/)) { >+ stream.eatWhile(/[\w\\\-]/); >+ if (stream.match(/^\s*:/, false)) >+ return ret("variable-2", "variable-definition"); >+ return ret("variable-2", "variable"); >+ } else if (stream.match(/^\w+-/)) { >+ return ret("meta", "meta"); >+ } >+ } else if (/[,+>*\/]/.test(ch)) { >+ return ret(null, "select-op"); >+ } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { >+ return ret("qualifier", "qualifier"); >+ } else if (/[:;{}\[\]\(\)]/.test(ch)) { >+ return ret(null, ch); >+ } else if (((ch == "u" || ch == "U") && stream.match(/rl(-prefix)?\(/i)) || >+ ((ch == "d" || ch == "D") && stream.match("omain(", true, true)) || >+ ((ch == "r" || ch == "R") && stream.match("egexp(", true, true))) { >+ stream.backUp(1); >+ state.tokenize = tokenParenthesized; >+ return ret("property", "word"); >+ } else if (/[\w\\\-]/.test(ch)) { >+ stream.eatWhile(/[\w\\\-]/); >+ return ret("property", "word"); >+ } else { >+ return ret(null, null); >+ } >+ } >+ >+ function tokenString(quote) { >+ return function(stream, state) { >+ var escaped = false, ch; >+ while ((ch = stream.next()) != null) { >+ if (ch == quote && !escaped) { >+ if (quote == ")") stream.backUp(1); >+ break; >+ } >+ escaped = !escaped && ch == "\\"; >+ } >+ if (ch == quote || !escaped && quote != ")") state.tokenize = null; >+ return ret("string", "string"); >+ }; >+ } >+ >+ function tokenParenthesized(stream, state) { >+ stream.next(); // Must be '(' >+ if (!stream.match(/\s*[\"\')]/, false)) >+ state.tokenize = tokenString(")"); >+ else >+ state.tokenize = null; >+ return ret(null, "("); >+ } >+ >+ // Context management >+ >+ function Context(type, indent, prev) { >+ this.type = type; >+ this.indent = indent; >+ this.prev = prev; >+ } >+ >+ function pushContext(state, stream, type, indent) { >+ state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); >+ return type; >+ } >+ >+ function popContext(state) { >+ if (state.context.prev) >+ state.context = state.context.prev; >+ return state.context.type; >+ } >+ >+ function pass(type, stream, state) { >+ return states[state.context.type](type, stream, state); >+ } >+ function popAndPass(type, stream, state, n) { >+ for (var i = n || 1; i > 0; i--) >+ state.context = state.context.prev; >+ return pass(type, stream, state); >+ } >+ >+ // Parser >+ >+ function wordAsValue(stream) { >+ var word = stream.current().toLowerCase(); >+ if (valueKeywords.hasOwnProperty(word)) >+ override = "atom"; >+ else if (colorKeywords.hasOwnProperty(word)) >+ override = "keyword"; >+ else >+ override = "variable"; >+ } >+ >+ var states = {}; >+ >+ states.top = function(type, stream, state) { >+ if (type == "{") { >+ return pushContext(state, stream, "block"); >+ } else if (type == "}" && state.context.prev) { >+ return popContext(state); >+ } else if (supportsAtComponent && /@component/i.test(type)) { >+ return pushContext(state, stream, "atComponentBlock"); >+ } else if (/^@(-moz-)?document$/i.test(type)) { >+ return pushContext(state, stream, "documentTypes"); >+ } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) { >+ return pushContext(state, stream, "atBlock"); >+ } else if (/^@(font-face|counter-style)/i.test(type)) { >+ state.stateArg = type; >+ return "restricted_atBlock_before"; >+ } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) { >+ return "keyframes"; >+ } else if (type && type.charAt(0) == "@") { >+ return pushContext(state, stream, "at"); >+ } else if (type == "hash") { >+ override = "builtin"; >+ } else if (type == "word") { >+ override = "tag"; >+ } else if (type == "variable-definition") { >+ return "maybeprop"; >+ } else if (type == "interpolation") { >+ return pushContext(state, stream, "interpolation"); >+ } else if (type == ":") { >+ return "pseudo"; >+ } else if (allowNested && type == "(") { >+ return pushContext(state, stream, "parens"); >+ } >+ return state.context.type; >+ }; >+ >+ states.block = function(type, stream, state) { >+ if (type == "word") { >+ var word = stream.current().toLowerCase(); >+ if (propertyKeywords.hasOwnProperty(word)) { >+ override = "property"; >+ return "maybeprop"; >+ } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) { >+ override = "string-2"; >+ return "maybeprop"; >+ } else if (allowNested) { >+ override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; >+ return "block"; >+ } else { >+ override += " error"; >+ return "maybeprop"; >+ } >+ } else if (type == "meta") { >+ return "block"; >+ } else if (!allowNested && (type == "hash" || type == "qualifier")) { >+ override = "error"; >+ return "block"; >+ } else { >+ return states.top(type, stream, state); >+ } >+ }; >+ >+ states.maybeprop = function(type, stream, state) { >+ if (type == ":") return pushContext(state, stream, "prop"); >+ return pass(type, stream, state); >+ }; >+ >+ states.prop = function(type, stream, state) { >+ if (type == ";") return popContext(state); >+ if (type == "{" && allowNested) return pushContext(state, stream, "propBlock"); >+ if (type == "}" || type == "{") return popAndPass(type, stream, state); >+ if (type == "(") return pushContext(state, stream, "parens"); >+ >+ if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) { >+ override += " error"; >+ } else if (type == "word") { >+ wordAsValue(stream); >+ } else if (type == "interpolation") { >+ return pushContext(state, stream, "interpolation"); >+ } >+ return "prop"; >+ }; >+ >+ states.propBlock = function(type, _stream, state) { >+ if (type == "}") return popContext(state); >+ if (type == "word") { override = "property"; return "maybeprop"; } >+ return state.context.type; >+ }; >+ >+ states.parens = function(type, stream, state) { >+ if (type == "{" || type == "}") return popAndPass(type, stream, state); >+ if (type == ")") return popContext(state); >+ if (type == "(") return pushContext(state, stream, "parens"); >+ if (type == "interpolation") return pushContext(state, stream, "interpolation"); >+ if (type == "word") wordAsValue(stream); >+ return "parens"; >+ }; >+ >+ states.pseudo = function(type, stream, state) { >+ if (type == "meta") return "pseudo"; >+ >+ if (type == "word") { >+ override = "variable-3"; >+ return state.context.type; >+ } >+ return pass(type, stream, state); >+ }; >+ >+ states.documentTypes = function(type, stream, state) { >+ if (type == "word" && documentTypes.hasOwnProperty(stream.current())) { >+ override = "tag"; >+ return state.context.type; >+ } else { >+ return states.atBlock(type, stream, state); >+ } >+ }; >+ >+ states.atBlock = function(type, stream, state) { >+ if (type == "(") return pushContext(state, stream, "atBlock_parens"); >+ if (type == "}" || type == ";") return popAndPass(type, stream, state); >+ if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); >+ >+ if (type == "interpolation") return pushContext(state, stream, "interpolation"); >+ >+ if (type == "word") { >+ var word = stream.current().toLowerCase(); >+ if (word == "only" || word == "not" || word == "and" || word == "or") >+ override = "keyword"; >+ else if (mediaTypes.hasOwnProperty(word)) >+ override = "attribute"; >+ else if (mediaFeatures.hasOwnProperty(word)) >+ override = "property"; >+ else if (mediaValueKeywords.hasOwnProperty(word)) >+ override = "keyword"; >+ else if (propertyKeywords.hasOwnProperty(word)) >+ override = "property"; >+ else if (nonStandardPropertyKeywords.hasOwnProperty(word)) >+ override = "string-2"; >+ else if (valueKeywords.hasOwnProperty(word)) >+ override = "atom"; >+ else if (colorKeywords.hasOwnProperty(word)) >+ override = "keyword"; >+ else >+ override = "error"; >+ } >+ return state.context.type; >+ }; >+ >+ states.atComponentBlock = function(type, stream, state) { >+ if (type == "}") >+ return popAndPass(type, stream, state); >+ if (type == "{") >+ return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); >+ if (type == "word") >+ override = "error"; >+ return state.context.type; >+ }; >+ >+ states.atBlock_parens = function(type, stream, state) { >+ if (type == ")") return popContext(state); >+ if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); >+ return states.atBlock(type, stream, state); >+ }; >+ >+ states.restricted_atBlock_before = function(type, stream, state) { >+ if (type == "{") >+ return pushContext(state, stream, "restricted_atBlock"); >+ if (type == "word" && state.stateArg == "@counter-style") { >+ override = "variable"; >+ return "restricted_atBlock_before"; >+ } >+ return pass(type, stream, state); >+ }; >+ >+ states.restricted_atBlock = function(type, stream, state) { >+ if (type == "}") { >+ state.stateArg = null; >+ return popContext(state); >+ } >+ if (type == "word") { >+ if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || >+ (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) >+ override = "error"; >+ else >+ override = "property"; >+ return "maybeprop"; >+ } >+ return "restricted_atBlock"; >+ }; >+ >+ states.keyframes = function(type, stream, state) { >+ if (type == "word") { override = "variable"; return "keyframes"; } >+ if (type == "{") return pushContext(state, stream, "top"); >+ return pass(type, stream, state); >+ }; >+ >+ states.at = function(type, stream, state) { >+ if (type == ";") return popContext(state); >+ if (type == "{" || type == "}") return popAndPass(type, stream, state); >+ if (type == "word") override = "tag"; >+ else if (type == "hash") override = "builtin"; >+ return "at"; >+ }; >+ >+ states.interpolation = function(type, stream, state) { >+ if (type == "}") return popContext(state); >+ if (type == "{" || type == ";") return popAndPass(type, stream, state); >+ if (type == "word") override = "variable"; >+ else if (type != "variable" && type != "(" && type != ")") override = "error"; >+ return "interpolation"; >+ }; >+ >+ return { >+ startState: function(base) { >+ return {tokenize: null, >+ state: inline ? "block" : "top", >+ stateArg: null, >+ context: new Context(inline ? "block" : "top", base || 0, null)}; >+ }, >+ >+ token: function(stream, state) { >+ if (!state.tokenize && stream.eatSpace()) return null; >+ var style = (state.tokenize || tokenBase)(stream, state); >+ if (style && typeof style == "object") { >+ type = style[1]; >+ style = style[0]; >+ } >+ override = style; >+ if (type != "comment") >+ state.state = states[state.state](type, stream, state); >+ return override; >+ }, >+ >+ indent: function(state, textAfter) { >+ var cx = state.context, ch = textAfter && textAfter.charAt(0); >+ var indent = cx.indent; >+ if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; >+ if (cx.prev) { >+ if (ch == "}" && (cx.type == "block" || cx.type == "top" || >+ cx.type == "interpolation" || cx.type == "restricted_atBlock")) { >+ // Resume indentation from parent context. >+ cx = cx.prev; >+ indent = cx.indent; >+ } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || >+ ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { >+ // Dedent relative to current context. >+ indent = Math.max(0, cx.indent - indentUnit); >+ } >+ } >+ return indent; >+ }, >+ >+ electricChars: "}", >+ blockCommentStart: "/*", >+ blockCommentEnd: "*/", >+ blockCommentContinue: " * ", >+ lineComment: lineComment, >+ fold: "brace" >+ }; >+}); >+ >+ function keySet(array) { >+ var keys = {}; >+ for (var i = 0; i < array.length; ++i) { >+ keys[array[i].toLowerCase()] = true; >+ } >+ return keys; >+ } >+ >+ var documentTypes_ = [ >+ "domain", "regexp", "url", "url-prefix" >+ ], documentTypes = keySet(documentTypes_); >+ >+ var mediaTypes_ = [ >+ "all", "aural", "braille", "handheld", "print", "projection", "screen", >+ "tty", "tv", "embossed" >+ ], mediaTypes = keySet(mediaTypes_); >+ >+ var mediaFeatures_ = [ >+ "width", "min-width", "max-width", "height", "min-height", "max-height", >+ "device-width", "min-device-width", "max-device-width", "device-height", >+ "min-device-height", "max-device-height", "aspect-ratio", >+ "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", >+ "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", >+ "max-color", "color-index", "min-color-index", "max-color-index", >+ "monochrome", "min-monochrome", "max-monochrome", "resolution", >+ "min-resolution", "max-resolution", "scan", "grid", "orientation", >+ "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", >+ "pointer", "any-pointer", "hover", "any-hover" >+ ], mediaFeatures = keySet(mediaFeatures_); >+ >+ var mediaValueKeywords_ = [ >+ "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", >+ "interlace", "progressive" >+ ], mediaValueKeywords = keySet(mediaValueKeywords_); >+ >+ var propertyKeywords_ = [ >+ "align-content", "align-items", "align-self", "alignment-adjust", >+ "alignment-baseline", "anchor-point", "animation", "animation-delay", >+ "animation-direction", "animation-duration", "animation-fill-mode", >+ "animation-iteration-count", "animation-name", "animation-play-state", >+ "animation-timing-function", "appearance", "azimuth", "backface-visibility", >+ "background", "background-attachment", "background-blend-mode", "background-clip", >+ "background-color", "background-image", "background-origin", "background-position", >+ "background-repeat", "background-size", "baseline-shift", "binding", >+ "bleed", "bookmark-label", "bookmark-level", "bookmark-state", >+ "bookmark-target", "border", "border-bottom", "border-bottom-color", >+ "border-bottom-left-radius", "border-bottom-right-radius", >+ "border-bottom-style", "border-bottom-width", "border-collapse", >+ "border-color", "border-image", "border-image-outset", >+ "border-image-repeat", "border-image-slice", "border-image-source", >+ "border-image-width", "border-left", "border-left-color", >+ "border-left-style", "border-left-width", "border-radius", "border-right", >+ "border-right-color", "border-right-style", "border-right-width", >+ "border-spacing", "border-style", "border-top", "border-top-color", >+ "border-top-left-radius", "border-top-right-radius", "border-top-style", >+ "border-top-width", "border-width", "bottom", "box-decoration-break", >+ "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", >+ "caption-side", "caret-color", "clear", "clip", "color", "color-profile", "column-count", >+ "column-fill", "column-gap", "column-rule", "column-rule-color", >+ "column-rule-style", "column-rule-width", "column-span", "column-width", >+ "columns", "content", "counter-increment", "counter-reset", "crop", "cue", >+ "cue-after", "cue-before", "cursor", "direction", "display", >+ "dominant-baseline", "drop-initial-after-adjust", >+ "drop-initial-after-align", "drop-initial-before-adjust", >+ "drop-initial-before-align", "drop-initial-size", "drop-initial-value", >+ "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", >+ "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", >+ "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", >+ "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", >+ "font-stretch", "font-style", "font-synthesis", "font-variant", >+ "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", >+ "font-variant-ligatures", "font-variant-numeric", "font-variant-position", >+ "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", >+ "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-gap", >+ "grid-column-start", "grid-gap", "grid-row", "grid-row-end", "grid-row-gap", >+ "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", >+ "grid-template-rows", "hanging-punctuation", "height", "hyphens", >+ "icon", "image-orientation", "image-rendering", "image-resolution", >+ "inline-box-align", "justify-content", "justify-items", "justify-self", "left", "letter-spacing", >+ "line-break", "line-height", "line-stacking", "line-stacking-ruby", >+ "line-stacking-shift", "line-stacking-strategy", "list-style", >+ "list-style-image", "list-style-position", "list-style-type", "margin", >+ "margin-bottom", "margin-left", "margin-right", "margin-top", >+ "marks", "marquee-direction", "marquee-loop", >+ "marquee-play-count", "marquee-speed", "marquee-style", "max-height", >+ "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", >+ "nav-left", "nav-right", "nav-up", "object-fit", "object-position", >+ "opacity", "order", "orphans", "outline", >+ "outline-color", "outline-offset", "outline-style", "outline-width", >+ "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", >+ "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", >+ "page", "page-break-after", "page-break-before", "page-break-inside", >+ "page-policy", "pause", "pause-after", "pause-before", "perspective", >+ "perspective-origin", "pitch", "pitch-range", "place-content", "place-items", "place-self", "play-during", "position", >+ "presentation-level", "punctuation-trim", "quotes", "region-break-after", >+ "region-break-before", "region-break-inside", "region-fragment", >+ "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", >+ "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", >+ "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", >+ "shape-outside", "size", "speak", "speak-as", "speak-header", >+ "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", >+ "tab-size", "table-layout", "target", "target-name", "target-new", >+ "target-position", "text-align", "text-align-last", "text-decoration", >+ "text-decoration-color", "text-decoration-line", "text-decoration-skip", >+ "text-decoration-style", "text-emphasis", "text-emphasis-color", >+ "text-emphasis-position", "text-emphasis-style", "text-height", >+ "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", >+ "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", >+ "text-wrap", "top", "transform", "transform-origin", "transform-style", >+ "transition", "transition-delay", "transition-duration", >+ "transition-property", "transition-timing-function", "unicode-bidi", >+ "user-select", "vertical-align", "visibility", "voice-balance", "voice-duration", >+ "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", >+ "voice-volume", "volume", "white-space", "widows", "width", "will-change", "word-break", >+ "word-spacing", "word-wrap", "z-index", >+ // SVG-specific >+ "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", >+ "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", >+ "color-interpolation", "color-interpolation-filters", >+ "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", >+ "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", >+ "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", >+ "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", >+ "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", >+ "glyph-orientation-vertical", "text-anchor", "writing-mode" >+ ], propertyKeywords = keySet(propertyKeywords_); >+ >+ var nonStandardPropertyKeywords_ = [ >+ "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", >+ "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", >+ "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", >+ "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", >+ "searchfield-results-decoration", "zoom" >+ ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); >+ >+ var fontProperties_ = [ >+ "font-family", "src", "unicode-range", "font-variant", "font-feature-settings", >+ "font-stretch", "font-weight", "font-style" >+ ], fontProperties = keySet(fontProperties_); >+ >+ var counterDescriptors_ = [ >+ "additive-symbols", "fallback", "negative", "pad", "prefix", "range", >+ "speak-as", "suffix", "symbols", "system" >+ ], counterDescriptors = keySet(counterDescriptors_); >+ >+ var colorKeywords_ = [ >+ "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", >+ "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", >+ "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", >+ "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", >+ "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", >+ "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", >+ "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", >+ "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", >+ "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", >+ "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", >+ "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", >+ "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", >+ "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", >+ "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", >+ "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", >+ "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", >+ "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", >+ "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", >+ "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", >+ "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", >+ "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", >+ "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", >+ "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", >+ "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", >+ "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", >+ "whitesmoke", "yellow", "yellowgreen" >+ ], colorKeywords = keySet(colorKeywords_); >+ >+ var valueKeywords_ = [ >+ "above", "absolute", "activeborder", "additive", "activecaption", "afar", >+ "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", >+ "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", >+ "arabic-indic", "armenian", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", "avoid-page", >+ "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", >+ "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", >+ "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", >+ "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", >+ "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", >+ "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", >+ "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", >+ "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", >+ "compact", "condensed", "contain", "content", "contents", >+ "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", >+ "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", >+ "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", >+ "destination-in", "destination-out", "destination-over", "devanagari", "difference", >+ "disc", "discard", "disclosure-closed", "disclosure-open", "document", >+ "dot-dash", "dot-dot-dash", >+ "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", >+ "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", >+ "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", >+ "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", >+ "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", >+ "ethiopic-halehame-gez", "ethiopic-halehame-om-et", >+ "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", >+ "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", >+ "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed", >+ "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", >+ "forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove", >+ "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew", >+ "help", "hidden", "hide", "higher", "highlight", "highlighttext", >+ "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "icon", "ignore", >+ "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", >+ "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", >+ "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert", >+ "italic", "japanese-formal", "japanese-informal", "justify", "kannada", >+ "katakana", "katakana-iroha", "keep-all", "khmer", >+ "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", >+ "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten", >+ "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", >+ "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", >+ "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", >+ "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "match", "matrix", "matrix3d", >+ "media-controls-background", "media-current-time-display", >+ "media-fullscreen-button", "media-mute-button", "media-play-button", >+ "media-return-to-realtime-button", "media-rewind-button", >+ "media-seek-back-button", "media-seek-forward-button", "media-slider", >+ "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", >+ "media-volume-slider-container", "media-volume-sliderthumb", "medium", >+ "menu", "menulist", "menulist-button", "menulist-text", >+ "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", >+ "mix", "mongolian", "monospace", "move", "multiple", "multiply", "myanmar", "n-resize", >+ "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", >+ "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", >+ "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "opacity", "open-quote", >+ "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", >+ "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", >+ "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", >+ "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", >+ "progress", "push-button", "radial-gradient", "radio", "read-only", >+ "read-write", "read-write-plaintext-only", "rectangle", "region", >+ "relative", "repeat", "repeating-linear-gradient", >+ "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", >+ "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", >+ "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", >+ "s-resize", "sans-serif", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", >+ "scroll", "scrollbar", "scroll-position", "se-resize", "searchfield", >+ "searchfield-cancel-button", "searchfield-decoration", >+ "searchfield-results-button", "searchfield-results-decoration", "self-start", "self-end", >+ "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", >+ "simp-chinese-formal", "simp-chinese-informal", "single", >+ "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", >+ "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", >+ "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali", >+ "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square", >+ "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", >+ "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table", >+ "table-caption", "table-cell", "table-column", "table-column-group", >+ "table-footer-group", "table-header-group", "table-row", "table-row-group", >+ "tamil", >+ "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", >+ "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", >+ "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", >+ "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", >+ "trad-chinese-formal", "trad-chinese-informal", "transform", >+ "translate", "translate3d", "translateX", "translateY", "translateZ", >+ "transparent", "ultra-condensed", "ultra-expanded", "underline", "unset", "up", >+ "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", >+ "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", >+ "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", >+ "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", >+ "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", >+ "xx-large", "xx-small" >+ ], valueKeywords = keySet(valueKeywords_); >+ >+ var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_) >+ .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_) >+ .concat(valueKeywords_); >+ CodeMirror.registerHelper("hintWords", "css", allWords); >+ >+ function tokenCComment(stream, state) { >+ var maybeEnd = false, ch; >+ while ((ch = stream.next()) != null) { >+ if (maybeEnd && ch == "/") { >+ state.tokenize = null; >+ break; >+ } >+ maybeEnd = (ch == "*"); >+ } >+ return ["comment", "comment"]; >+ } >+ >+ CodeMirror.defineMIME("text/css", { >+ documentTypes: documentTypes, >+ mediaTypes: mediaTypes, >+ mediaFeatures: mediaFeatures, >+ mediaValueKeywords: mediaValueKeywords, >+ propertyKeywords: propertyKeywords, >+ nonStandardPropertyKeywords: nonStandardPropertyKeywords, >+ fontProperties: fontProperties, >+ counterDescriptors: counterDescriptors, >+ colorKeywords: colorKeywords, >+ valueKeywords: valueKeywords, >+ tokenHooks: { >+ "/": function(stream, state) { >+ if (!stream.eat("*")) return false; >+ state.tokenize = tokenCComment; >+ return tokenCComment(stream, state); >+ } >+ }, >+ name: "css" >+ }); >+ >+ CodeMirror.defineMIME("text/x-scss", { >+ mediaTypes: mediaTypes, >+ mediaFeatures: mediaFeatures, >+ mediaValueKeywords: mediaValueKeywords, >+ propertyKeywords: propertyKeywords, >+ nonStandardPropertyKeywords: nonStandardPropertyKeywords, >+ colorKeywords: colorKeywords, >+ valueKeywords: valueKeywords, >+ fontProperties: fontProperties, >+ allowNested: true, >+ lineComment: "//", >+ tokenHooks: { >+ "/": function(stream, state) { >+ if (stream.eat("/")) { >+ stream.skipToEnd(); >+ return ["comment", "comment"]; >+ } else if (stream.eat("*")) { >+ state.tokenize = tokenCComment; >+ return tokenCComment(stream, state); >+ } else { >+ return ["operator", "operator"]; >+ } >+ }, >+ ":": function(stream) { >+ if (stream.match(/\s*\{/, false)) >+ return [null, null] >+ return false; >+ }, >+ "$": function(stream) { >+ stream.match(/^[\w-]+/); >+ if (stream.match(/^\s*:/, false)) >+ return ["variable-2", "variable-definition"]; >+ return ["variable-2", "variable"]; >+ }, >+ "#": function(stream) { >+ if (!stream.eat("{")) return false; >+ return [null, "interpolation"]; >+ } >+ }, >+ name: "css", >+ helperType: "scss" >+ }); >+ >+ CodeMirror.defineMIME("text/x-less", { >+ mediaTypes: mediaTypes, >+ mediaFeatures: mediaFeatures, >+ mediaValueKeywords: mediaValueKeywords, >+ propertyKeywords: propertyKeywords, >+ nonStandardPropertyKeywords: nonStandardPropertyKeywords, >+ colorKeywords: colorKeywords, >+ valueKeywords: valueKeywords, >+ fontProperties: fontProperties, >+ allowNested: true, >+ lineComment: "//", >+ tokenHooks: { >+ "/": function(stream, state) { >+ if (stream.eat("/")) { >+ stream.skipToEnd(); >+ return ["comment", "comment"]; >+ } else if (stream.eat("*")) { >+ state.tokenize = tokenCComment; >+ return tokenCComment(stream, state); >+ } else { >+ return ["operator", "operator"]; >+ } >+ }, >+ "@": function(stream) { >+ if (stream.eat("{")) return [null, "interpolation"]; >+ if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i, false)) return false; >+ stream.eatWhile(/[\w\\\-]/); >+ if (stream.match(/^\s*:/, false)) >+ return ["variable-2", "variable-definition"]; >+ return ["variable-2", "variable"]; >+ }, >+ "&": function() { >+ return ["atom", "atom"]; >+ } >+ }, >+ name: "css", >+ helperType: "less" >+ }); >+ >+ CodeMirror.defineMIME("text/x-gss", { >+ documentTypes: documentTypes, >+ mediaTypes: mediaTypes, >+ mediaFeatures: mediaFeatures, >+ propertyKeywords: propertyKeywords, >+ nonStandardPropertyKeywords: nonStandardPropertyKeywords, >+ fontProperties: fontProperties, >+ counterDescriptors: counterDescriptors, >+ colorKeywords: colorKeywords, >+ valueKeywords: valueKeywords, >+ supportsAtComponent: true, >+ tokenHooks: { >+ "/": function(stream, state) { >+ if (!stream.eat("*")) return false; >+ state.tokenize = tokenCComment; >+ return tokenCComment(stream, state); >+ } >+ }, >+ name: "css", >+ helperType: "gss" >+ }); >+ >+}); >diff --git a/koha-tmpl/intranet-tmpl/lib/codemirror/css.min.js b/koha-tmpl/intranet-tmpl/lib/codemirror/css.min.js >new file mode 100644 >index 0000000000..148c5901cd >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/codemirror/css.min.js >@@ -0,0 +1 @@ >+!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(T){"use strict";function e(e){for(var t={},r=0;r<e.length;++r)t[e[r].toLowerCase()]=!0;return t}T.defineMode("css",function(e,t){var r=t.inline;t.propertyKeywords||(t=T.resolveMode("text/css"));var o,i,a=e.indentUnit,n=t.tokenHooks,l=t.documentTypes||{},s=t.mediaTypes||{},c=t.mediaFeatures||{},d=t.mediaValueKeywords||{},p=t.propertyKeywords||{},u=t.nonStandardPropertyKeywords||{},m=t.fontProperties||{},h=t.counterDescriptors||{},g=t.colorKeywords||{},b=t.valueKeywords||{},f=t.allowNested,y=t.lineComment,w=!0===t.supportsAtComponent;function k(e,t){return o=t,e}function v(i){return function(e,t){for(var r,o=!1;null!=(r=e.next());){if(r==i&&!o){")"==i&&e.backUp(1);break}o=!o&&"\\"==r}return(r==i||!o&&")"!=i)&&(t.tokenize=null),k("string","string")}}function x(e,t){return e.next(),e.match(/\s*[\"\')]/,!1)?t.tokenize=null:t.tokenize=v(")"),k(null,"(")}function z(e,t,r){this.type=e,this.indent=t,this.prev=r}function j(e,t,r,o){return e.context=new z(r,t.indentation()+(!1===o?0:a),e.context),r}function q(e){return e.context.prev&&(e.context=e.context.prev),e.context.type}function P(e,t,r){return B[r.context.type](e,t,r)}function K(e,t,r,o){for(var i=o||1;0<i;i--)r.context=r.context.prev;return P(e,t,r)}function C(e){var t=e.current().toLowerCase();i=b.hasOwnProperty(t)?"atom":g.hasOwnProperty(t)?"keyword":"variable"}var B={top:function(e,t,r){if("{"==e)return j(r,t,"block");if("}"==e&&r.context.prev)return q(r);if(w&&/@component/i.test(e))return j(r,t,"atComponentBlock");if(/^@(-moz-)?document$/i.test(e))return j(r,t,"documentTypes");if(/^@(media|supports|(-moz-)?document|import)$/i.test(e))return j(r,t,"atBlock");if(/^@(font-face|counter-style)/i.test(e))return r.stateArg=e,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(e))return"keyframes";if(e&&"@"==e.charAt(0))return j(r,t,"at");if("hash"==e)i="builtin";else if("word"==e)i="tag";else{if("variable-definition"==e)return"maybeprop";if("interpolation"==e)return j(r,t,"interpolation");if(":"==e)return"pseudo";if(f&&"("==e)return j(r,t,"parens")}return r.context.type},block:function(e,t,r){if("word"!=e)return"meta"==e?"block":f||"hash"!=e&&"qualifier"!=e?B.top(e,t,r):(i="error","block");var o=t.current().toLowerCase();return p.hasOwnProperty(o)?(i="property","maybeprop"):u.hasOwnProperty(o)?(i="string-2","maybeprop"):f?(i=t.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(i+=" error","maybeprop")},maybeprop:function(e,t,r){return":"==e?j(r,t,"prop"):P(e,t,r)},prop:function(e,t,r){if(";"==e)return q(r);if("{"==e&&f)return j(r,t,"propBlock");if("}"==e||"{"==e)return K(e,t,r);if("("==e)return j(r,t,"parens");if("hash"!=e||/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(t.current())){if("word"==e)C(t);else if("interpolation"==e)return j(r,t,"interpolation")}else i+=" error";return"prop"},propBlock:function(e,t,r){return"}"==e?q(r):"word"==e?(i="property","maybeprop"):r.context.type},parens:function(e,t,r){return"{"==e||"}"==e?K(e,t,r):")"==e?q(r):"("==e?j(r,t,"parens"):"interpolation"==e?j(r,t,"interpolation"):("word"==e&&C(t),"parens")},pseudo:function(e,t,r){return"meta"==e?"pseudo":"word"==e?(i="variable-3",r.context.type):P(e,t,r)},documentTypes:function(e,t,r){return"word"==e&&l.hasOwnProperty(t.current())?(i="tag",r.context.type):B.atBlock(e,t,r)},atBlock:function(e,t,r){if("("==e)return j(r,t,"atBlock_parens");if("}"==e||";"==e)return K(e,t,r);if("{"==e)return q(r)&&j(r,t,f?"block":"top");if("interpolation"==e)return j(r,t,"interpolation");if("word"==e){var o=t.current().toLowerCase();i="only"==o||"not"==o||"and"==o||"or"==o?"keyword":s.hasOwnProperty(o)?"attribute":c.hasOwnProperty(o)?"property":d.hasOwnProperty(o)?"keyword":p.hasOwnProperty(o)?"property":u.hasOwnProperty(o)?"string-2":b.hasOwnProperty(o)?"atom":g.hasOwnProperty(o)?"keyword":"error"}return r.context.type},atComponentBlock:function(e,t,r){return"}"==e?K(e,t,r):"{"==e?q(r)&&j(r,t,f?"block":"top",!1):("word"==e&&(i="error"),r.context.type)},atBlock_parens:function(e,t,r){return")"==e?q(r):"{"==e||"}"==e?K(e,t,r,2):B.atBlock(e,t,r)},restricted_atBlock_before:function(e,t,r){return"{"==e?j(r,t,"restricted_atBlock"):"word"==e&&"@counter-style"==r.stateArg?(i="variable","restricted_atBlock_before"):P(e,t,r)},restricted_atBlock:function(e,t,r){return"}"==e?(r.stateArg=null,q(r)):"word"==e?(i="@font-face"==r.stateArg&&!m.hasOwnProperty(t.current().toLowerCase())||"@counter-style"==r.stateArg&&!h.hasOwnProperty(t.current().toLowerCase())?"error":"property","maybeprop"):"restricted_atBlock"},keyframes:function(e,t,r){return"word"==e?(i="variable","keyframes"):"{"==e?j(r,t,"top"):P(e,t,r)},at:function(e,t,r){return";"==e?q(r):"{"==e||"}"==e?K(e,t,r):("word"==e?i="tag":"hash"==e&&(i="builtin"),"at")},interpolation:function(e,t,r){return"}"==e?q(r):"{"==e||";"==e?K(e,t,r):("word"==e?i="variable":"variable"!=e&&"("!=e&&")"!=e&&(i="error"),"interpolation")}};return{startState:function(e){return{tokenize:null,state:r?"block":"top",stateArg:null,context:new z(r?"block":"top",e||0,null)}},token:function(e,t){if(!t.tokenize&&e.eatSpace())return null;var r=(t.tokenize||function(e,t){var r=e.next();if(n[r]){var o=n[r](e,t);if(!1!==o)return o}return"@"==r?(e.eatWhile(/[\w\\\-]/),k("def",e.current())):"="==r||("~"==r||"|"==r)&&e.eat("=")?k(null,"compare"):'"'==r||"'"==r?(t.tokenize=v(r),t.tokenize(e,t)):"#"==r?(e.eatWhile(/[\w\\\-]/),k("atom","hash")):"!"==r?(e.match(/^\s*\w*/),k("keyword","important")):/\d/.test(r)||"."==r&&e.eat(/\d/)?(e.eatWhile(/[\w.%]/),k("number","unit")):"-"!==r?/[,+>*\/]/.test(r)?k(null,"select-op"):"."==r&&e.match(/^-?[_a-z][_a-z0-9-]*/i)?k("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(r)?k(null,r):("u"==r||"U"==r)&&e.match(/rl(-prefix)?\(/i)||("d"==r||"D"==r)&&e.match("omain(",!0,!0)||("r"==r||"R"==r)&&e.match("egexp(",!0,!0)?(e.backUp(1),t.tokenize=x,k("property","word")):/[\w\\\-]/.test(r)?(e.eatWhile(/[\w\\\-]/),k("property","word")):k(null,null):/[\d.]/.test(e.peek())?(e.eatWhile(/[\w.%]/),k("number","unit")):e.match(/^-[\w\\\-]+/)?(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?k("variable-2","variable-definition"):k("variable-2","variable")):e.match(/^\w+-/)?k("meta","meta"):void 0})(e,t);return r&&"object"==typeof r&&(o=r[1],r=r[0]),i=r,"comment"!=o&&(t.state=B[t.state](o,e,t)),i},indent:function(e,t){var r=e.context,o=t&&t.charAt(0),i=r.indent;return"prop"!=r.type||"}"!=o&&")"!=o||(r=r.prev),r.prev&&("}"!=o||"block"!=r.type&&"top"!=r.type&&"interpolation"!=r.type&&"restricted_atBlock"!=r.type?(")"!=o||"parens"!=r.type&&"atBlock_parens"!=r.type)&&("{"!=o||"at"!=r.type&&"atBlock"!=r.type)||(i=Math.max(0,r.indent-a)):i=(r=r.prev).indent),i},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:y,fold:"brace"}});var t=["domain","regexp","url","url-prefix"],r=e(t),o=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],i=e(o),a=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","orientation","device-pixel-ratio","min-device-pixel-ratio","max-device-pixel-ratio","pointer","any-pointer","hover","any-hover"],n=e(a),l=["landscape","portrait","none","coarse","fine","on-demand","hover","interlace","progressive"],s=e(l),c=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-gap","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-gap","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","justify-items","justify-self","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","place-content","place-items","place-self","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","user-select","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],d=e(c),p=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],u=e(p),m=e(["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]),h=e(["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"]),g=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],b=e(g),f=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","auto-flow","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","color","color-burn","color-dodge","column","column-reverse","compact","condensed","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","darken","dashed","decimal","decimal-leading-zero","default","default-button","dense","destination-atop","destination-in","destination-out","destination-over","devanagari","difference","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","exclusion","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","flex-end","flex-start","footnotes","forwards","from","geometricPrecision","georgian","graytext","grid","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hard-light","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","hue","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-grid","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","lighten","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","luminosity","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","multiply","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","opacity","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row","row-resize","row-reverse","rtl","run-in","running","s-resize","sans-serif","saturation","scale","scale3d","scaleX","scaleY","scaleZ","screen","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","self-start","self-end","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","soft-light","solid","somali","source-atop","source-in","source-out","source-over","space","space-around","space-between","space-evenly","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","system-ui","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","transform","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","unset","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","wrap","wrap-reverse","x-large","x-small","xor","xx-large","xx-small"],y=e(f),w=t.concat(o).concat(a).concat(l).concat(c).concat(p).concat(g).concat(f);function k(e,t){for(var r,o=!1;null!=(r=e.next());){if(o&&"/"==r){t.tokenize=null;break}o="*"==r}return["comment","comment"]}T.registerHelper("hintWords","css",w),T.defineMIME("text/css",{documentTypes:r,mediaTypes:i,mediaFeatures:n,mediaValueKeywords:s,propertyKeywords:d,nonStandardPropertyKeywords:u,fontProperties:m,counterDescriptors:h,colorKeywords:b,valueKeywords:y,tokenHooks:{"/":function(e,t){return!!e.eat("*")&&(t.tokenize=k)(e,t)}},name:"css"}),T.defineMIME("text/x-scss",{mediaTypes:i,mediaFeatures:n,mediaValueKeywords:s,propertyKeywords:d,nonStandardPropertyKeywords:u,colorKeywords:b,valueKeywords:y,fontProperties:m,allowNested:!0,lineComment:"//",tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=k)(e,t):["operator","operator"]},":":function(e){return!!e.match(/\s*\{/,!1)&&[null,null]},$:function(e){return e.match(/^[\w-]+/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"]},"#":function(e){return!!e.eat("{")&&[null,"interpolation"]}},name:"css",helperType:"scss"}),T.defineMIME("text/x-less",{mediaTypes:i,mediaFeatures:n,mediaValueKeywords:s,propertyKeywords:d,nonStandardPropertyKeywords:u,colorKeywords:b,valueKeywords:y,fontProperties:m,allowNested:!0,lineComment:"//",tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=k)(e,t):["operator","operator"]},"@":function(e){return e.eat("{")?[null,"interpolation"]:!e.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i,!1)&&(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"])},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"}),T.defineMIME("text/x-gss",{documentTypes:r,mediaTypes:i,mediaFeatures:n,propertyKeywords:d,nonStandardPropertyKeywords:u,fontProperties:m,counterDescriptors:h,colorKeywords:b,valueKeywords:y,supportsAtComponent:!0,tokenHooks:{"/":function(e,t){return!!e.eat("*")&&(t.tokenize=k)(e,t)}},name:"css",helperType:"gss"})}); >\ No newline at end of file >diff --git a/koha-tmpl/intranet-tmpl/lib/codemirror/javascript.js b/koha-tmpl/intranet-tmpl/lib/codemirror/javascript.js >new file mode 100644 >index 0000000000..907fdbe533 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/codemirror/javascript.js >@@ -0,0 +1,900 @@ >+/* CodeMirror version: 5.40.2 */ >+// CodeMirror, copyright (c) by Marijn Haverbeke and others >+// Distributed under an MIT license: https://codemirror.net/LICENSE >+ >+(function(mod) { >+ if (typeof exports == "object" && typeof module == "object") // CommonJS >+ mod(require("../../lib/codemirror")); >+ else if (typeof define == "function" && define.amd) // AMD >+ define(["../../lib/codemirror"], mod); >+ else // Plain browser env >+ mod(CodeMirror); >+})(function(CodeMirror) { >+"use strict"; >+ >+CodeMirror.defineMode("javascript", function(config, parserConfig) { >+ var indentUnit = config.indentUnit; >+ var statementIndent = parserConfig.statementIndent; >+ var jsonldMode = parserConfig.jsonld; >+ var jsonMode = parserConfig.json || jsonldMode; >+ var isTS = parserConfig.typescript; >+ var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; >+ >+ // Tokenizer >+ >+ var keywords = function(){ >+ function kw(type) {return {type: type, style: "keyword"};} >+ var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d"); >+ var operator = kw("operator"), atom = {type: "atom", style: "atom"}; >+ >+ return { >+ "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, >+ "return": D, "break": D, "continue": D, "new": kw("new"), "delete": C, "void": C, "throw": C, >+ "debugger": kw("debugger"), "var": kw("var"), "const": kw("var"), "let": kw("var"), >+ "function": kw("function"), "catch": kw("catch"), >+ "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), >+ "in": operator, "typeof": operator, "instanceof": operator, >+ "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, >+ "this": kw("this"), "class": kw("class"), "super": kw("atom"), >+ "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, >+ "await": C >+ }; >+ }(); >+ >+ var isOperatorChar = /[+\-*&%=<>!?|~^@]/; >+ var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; >+ >+ function readRegexp(stream) { >+ var escaped = false, next, inSet = false; >+ while ((next = stream.next()) != null) { >+ if (!escaped) { >+ if (next == "/" && !inSet) return; >+ if (next == "[") inSet = true; >+ else if (inSet && next == "]") inSet = false; >+ } >+ escaped = !escaped && next == "\\"; >+ } >+ } >+ >+ // Used as scratch variables to communicate multiple values without >+ // consing up tons of objects. >+ var type, content; >+ function ret(tp, style, cont) { >+ type = tp; content = cont; >+ return style; >+ } >+ function tokenBase(stream, state) { >+ var ch = stream.next(); >+ if (ch == '"' || ch == "'") { >+ state.tokenize = tokenString(ch); >+ return state.tokenize(stream, state); >+ } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { >+ return ret("number", "number"); >+ } else if (ch == "." && stream.match("..")) { >+ return ret("spread", "meta"); >+ } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { >+ return ret(ch); >+ } else if (ch == "=" && stream.eat(">")) { >+ return ret("=>", "operator"); >+ } else if (ch == "0" && stream.match(/^(?:x[\da-f]+|o[0-7]+|b[01]+)n?/i)) { >+ return ret("number", "number"); >+ } else if (/\d/.test(ch)) { >+ stream.match(/^\d*(?:n|(?:\.\d*)?(?:[eE][+\-]?\d+)?)?/); >+ return ret("number", "number"); >+ } else if (ch == "/") { >+ if (stream.eat("*")) { >+ state.tokenize = tokenComment; >+ return tokenComment(stream, state); >+ } else if (stream.eat("/")) { >+ stream.skipToEnd(); >+ return ret("comment", "comment"); >+ } else if (expressionAllowed(stream, state, 1)) { >+ readRegexp(stream); >+ stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); >+ return ret("regexp", "string-2"); >+ } else { >+ stream.eat("="); >+ return ret("operator", "operator", stream.current()); >+ } >+ } else if (ch == "`") { >+ state.tokenize = tokenQuasi; >+ return tokenQuasi(stream, state); >+ } else if (ch == "#") { >+ stream.skipToEnd(); >+ return ret("error", "error"); >+ } else if (isOperatorChar.test(ch)) { >+ if (ch != ">" || !state.lexical || state.lexical.type != ">") { >+ if (stream.eat("=")) { >+ if (ch == "!" || ch == "=") stream.eat("=") >+ } else if (/[<>*+\-]/.test(ch)) { >+ stream.eat(ch) >+ if (ch == ">") stream.eat(ch) >+ } >+ } >+ return ret("operator", "operator", stream.current()); >+ } else if (wordRE.test(ch)) { >+ stream.eatWhile(wordRE); >+ var word = stream.current() >+ if (state.lastType != ".") { >+ if (keywords.propertyIsEnumerable(word)) { >+ var kw = keywords[word] >+ return ret(kw.type, kw.style, word) >+ } >+ if (word == "async" && stream.match(/^(\s|\/\*.*?\*\/)*[\[\(\w]/, false)) >+ return ret("async", "keyword", word) >+ } >+ return ret("variable", "variable", word) >+ } >+ } >+ >+ function tokenString(quote) { >+ return function(stream, state) { >+ var escaped = false, next; >+ if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ >+ state.tokenize = tokenBase; >+ return ret("jsonld-keyword", "meta"); >+ } >+ while ((next = stream.next()) != null) { >+ if (next == quote && !escaped) break; >+ escaped = !escaped && next == "\\"; >+ } >+ if (!escaped) state.tokenize = tokenBase; >+ return ret("string", "string"); >+ }; >+ } >+ >+ function tokenComment(stream, state) { >+ var maybeEnd = false, ch; >+ while (ch = stream.next()) { >+ if (ch == "/" && maybeEnd) { >+ state.tokenize = tokenBase; >+ break; >+ } >+ maybeEnd = (ch == "*"); >+ } >+ return ret("comment", "comment"); >+ } >+ >+ function tokenQuasi(stream, state) { >+ var escaped = false, next; >+ while ((next = stream.next()) != null) { >+ if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { >+ state.tokenize = tokenBase; >+ break; >+ } >+ escaped = !escaped && next == "\\"; >+ } >+ return ret("quasi", "string-2", stream.current()); >+ } >+ >+ var brackets = "([{}])"; >+ // This is a crude lookahead trick to try and notice that we're >+ // parsing the argument patterns for a fat-arrow function before we >+ // actually hit the arrow token. It only works if the arrow is on >+ // the same line as the arguments and there's no strange noise >+ // (comments) in between. Fallback is to only notice when we hit the >+ // arrow, and not declare the arguments as locals for the arrow >+ // body. >+ function findFatArrow(stream, state) { >+ if (state.fatArrowAt) state.fatArrowAt = null; >+ var arrow = stream.string.indexOf("=>", stream.start); >+ if (arrow < 0) return; >+ >+ if (isTS) { // Try to skip TypeScript return type declarations after the arguments >+ var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)) >+ if (m) arrow = m.index >+ } >+ >+ var depth = 0, sawSomething = false; >+ for (var pos = arrow - 1; pos >= 0; --pos) { >+ var ch = stream.string.charAt(pos); >+ var bracket = brackets.indexOf(ch); >+ if (bracket >= 0 && bracket < 3) { >+ if (!depth) { ++pos; break; } >+ if (--depth == 0) { if (ch == "(") sawSomething = true; break; } >+ } else if (bracket >= 3 && bracket < 6) { >+ ++depth; >+ } else if (wordRE.test(ch)) { >+ sawSomething = true; >+ } else if (/["'\/]/.test(ch)) { >+ return; >+ } else if (sawSomething && !depth) { >+ ++pos; >+ break; >+ } >+ } >+ if (sawSomething && !depth) state.fatArrowAt = pos; >+ } >+ >+ // Parser >+ >+ var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; >+ >+ function JSLexical(indented, column, type, align, prev, info) { >+ this.indented = indented; >+ this.column = column; >+ this.type = type; >+ this.prev = prev; >+ this.info = info; >+ if (align != null) this.align = align; >+ } >+ >+ function inScope(state, varname) { >+ for (var v = state.localVars; v; v = v.next) >+ if (v.name == varname) return true; >+ for (var cx = state.context; cx; cx = cx.prev) { >+ for (var v = cx.vars; v; v = v.next) >+ if (v.name == varname) return true; >+ } >+ } >+ >+ function parseJS(state, style, type, content, stream) { >+ var cc = state.cc; >+ // Communicate our context to the combinators. >+ // (Less wasteful than consing up a hundred closures on every call.) >+ cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; >+ >+ if (!state.lexical.hasOwnProperty("align")) >+ state.lexical.align = true; >+ >+ while(true) { >+ var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; >+ if (combinator(type, content)) { >+ while(cc.length && cc[cc.length - 1].lex) >+ cc.pop()(); >+ if (cx.marked) return cx.marked; >+ if (type == "variable" && inScope(state, content)) return "variable-2"; >+ return style; >+ } >+ } >+ } >+ >+ // Combinator utils >+ >+ var cx = {state: null, column: null, marked: null, cc: null}; >+ function pass() { >+ for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); >+ } >+ function cont() { >+ pass.apply(null, arguments); >+ return true; >+ } >+ function inList(name, list) { >+ for (var v = list; v; v = v.next) if (v.name == name) return true >+ return false; >+ } >+ function register(varname) { >+ var state = cx.state; >+ cx.marked = "def"; >+ if (state.context) { >+ if (state.lexical.info == "var" && state.context && state.context.block) { >+ // FIXME function decls are also not block scoped >+ var newContext = registerVarScoped(varname, state.context) >+ if (newContext != null) { >+ state.context = newContext >+ return >+ } >+ } else if (!inList(varname, state.localVars)) { >+ state.localVars = new Var(varname, state.localVars) >+ return >+ } >+ } >+ // Fall through means this is global >+ if (parserConfig.globalVars && !inList(varname, state.globalVars)) >+ state.globalVars = new Var(varname, state.globalVars) >+ } >+ function registerVarScoped(varname, context) { >+ if (!context) { >+ return null >+ } else if (context.block) { >+ var inner = registerVarScoped(varname, context.prev) >+ if (!inner) return null >+ if (inner == context.prev) return context >+ return new Context(inner, context.vars, true) >+ } else if (inList(varname, context.vars)) { >+ return context >+ } else { >+ return new Context(context.prev, new Var(varname, context.vars), false) >+ } >+ } >+ >+ function isModifier(name) { >+ return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly" >+ } >+ >+ // Combinators >+ >+ function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block } >+ function Var(name, next) { this.name = name; this.next = next } >+ >+ var defaultVars = new Var("this", new Var("arguments", null)) >+ function pushcontext() { >+ cx.state.context = new Context(cx.state.context, cx.state.localVars, false) >+ cx.state.localVars = defaultVars >+ } >+ function pushblockcontext() { >+ cx.state.context = new Context(cx.state.context, cx.state.localVars, true) >+ cx.state.localVars = null >+ } >+ function popcontext() { >+ cx.state.localVars = cx.state.context.vars >+ cx.state.context = cx.state.context.prev >+ } >+ popcontext.lex = true >+ function pushlex(type, info) { >+ var result = function() { >+ var state = cx.state, indent = state.indented; >+ if (state.lexical.type == "stat") indent = state.lexical.indented; >+ else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) >+ indent = outer.indented; >+ state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); >+ }; >+ result.lex = true; >+ return result; >+ } >+ function poplex() { >+ var state = cx.state; >+ if (state.lexical.prev) { >+ if (state.lexical.type == ")") >+ state.indented = state.lexical.indented; >+ state.lexical = state.lexical.prev; >+ } >+ } >+ poplex.lex = true; >+ >+ function expect(wanted) { >+ function exp(type) { >+ if (type == wanted) return cont(); >+ else if (wanted == ";" || type == "}" || type == ")" || type == "]") return pass(); >+ else return cont(exp); >+ }; >+ return exp; >+ } >+ >+ function statement(type, value) { >+ if (type == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); >+ if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); >+ if (type == "keyword b") return cont(pushlex("form"), statement, poplex); >+ if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); >+ if (type == "debugger") return cont(expect(";")); >+ if (type == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); >+ if (type == ";") return cont(); >+ if (type == "if") { >+ if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) >+ cx.state.cc.pop()(); >+ return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); >+ } >+ if (type == "function") return cont(functiondef); >+ if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); >+ if (type == "class" || (isTS && value == "interface")) { cx.marked = "keyword"; return cont(pushlex("form"), className, poplex); } >+ if (type == "variable") { >+ if (isTS && value == "declare") { >+ cx.marked = "keyword" >+ return cont(statement) >+ } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { >+ cx.marked = "keyword" >+ if (value == "enum") return cont(enumdef); >+ else if (value == "type") return cont(typeexpr, expect("operator"), typeexpr, expect(";")); >+ else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) >+ } else if (isTS && value == "namespace") { >+ cx.marked = "keyword" >+ return cont(pushlex("form"), expression, block, poplex) >+ } else if (isTS && value == "abstract") { >+ cx.marked = "keyword" >+ return cont(statement) >+ } else { >+ return cont(pushlex("stat"), maybelabel); >+ } >+ } >+ if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, >+ block, poplex, poplex, popcontext); >+ if (type == "case") return cont(expression, expect(":")); >+ if (type == "default") return cont(expect(":")); >+ if (type == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); >+ if (type == "export") return cont(pushlex("stat"), afterExport, poplex); >+ if (type == "import") return cont(pushlex("stat"), afterImport, poplex); >+ if (type == "async") return cont(statement) >+ if (value == "@") return cont(expression, statement) >+ return pass(pushlex("stat"), expression, expect(";"), poplex); >+ } >+ function maybeCatchBinding(type) { >+ if (type == "(") return cont(funarg, expect(")")) >+ } >+ function expression(type, value) { >+ return expressionInner(type, value, false); >+ } >+ function expressionNoComma(type, value) { >+ return expressionInner(type, value, true); >+ } >+ function parenExpr(type) { >+ if (type != "(") return pass() >+ return cont(pushlex(")"), expression, expect(")"), poplex) >+ } >+ function expressionInner(type, value, noComma) { >+ if (cx.state.fatArrowAt == cx.stream.start) { >+ var body = noComma ? arrowBodyNoComma : arrowBody; >+ if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); >+ else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); >+ } >+ >+ var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; >+ if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); >+ if (type == "function") return cont(functiondef, maybeop); >+ if (type == "class" || (isTS && value == "interface")) { cx.marked = "keyword"; return cont(pushlex("form"), classExpression, poplex); } >+ if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression); >+ if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); >+ if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); >+ if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); >+ if (type == "{") return contCommasep(objprop, "}", null, maybeop); >+ if (type == "quasi") return pass(quasi, maybeop); >+ if (type == "new") return cont(maybeTarget(noComma)); >+ if (type == "import") return cont(expression); >+ return cont(); >+ } >+ function maybeexpression(type) { >+ if (type.match(/[;\}\)\],]/)) return pass(); >+ return pass(expression); >+ } >+ >+ function maybeoperatorComma(type, value) { >+ if (type == ",") return cont(expression); >+ return maybeoperatorNoComma(type, value, false); >+ } >+ function maybeoperatorNoComma(type, value, noComma) { >+ var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; >+ var expr = noComma == false ? expression : expressionNoComma; >+ if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); >+ if (type == "operator") { >+ if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); >+ if (isTS && value == "<" && cx.stream.match(/^([^>]|<.*?>)*>\s*\(/, false)) >+ return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); >+ if (value == "?") return cont(expression, expect(":"), expr); >+ return cont(expr); >+ } >+ if (type == "quasi") { return pass(quasi, me); } >+ if (type == ";") return; >+ if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); >+ if (type == ".") return cont(property, me); >+ if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); >+ if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } >+ if (type == "regexp") { >+ cx.state.lastType = cx.marked = "operator" >+ cx.stream.backUp(cx.stream.pos - cx.stream.start - 1) >+ return cont(expr) >+ } >+ } >+ function quasi(type, value) { >+ if (type != "quasi") return pass(); >+ if (value.slice(value.length - 2) != "${") return cont(quasi); >+ return cont(expression, continueQuasi); >+ } >+ function continueQuasi(type) { >+ if (type == "}") { >+ cx.marked = "string-2"; >+ cx.state.tokenize = tokenQuasi; >+ return cont(quasi); >+ } >+ } >+ function arrowBody(type) { >+ findFatArrow(cx.stream, cx.state); >+ return pass(type == "{" ? statement : expression); >+ } >+ function arrowBodyNoComma(type) { >+ findFatArrow(cx.stream, cx.state); >+ return pass(type == "{" ? statement : expressionNoComma); >+ } >+ function maybeTarget(noComma) { >+ return function(type) { >+ if (type == ".") return cont(noComma ? targetNoComma : target); >+ else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma) >+ else return pass(noComma ? expressionNoComma : expression); >+ }; >+ } >+ function target(_, value) { >+ if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } >+ } >+ function targetNoComma(_, value) { >+ if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } >+ } >+ function maybelabel(type) { >+ if (type == ":") return cont(poplex, statement); >+ return pass(maybeoperatorComma, expect(";"), poplex); >+ } >+ function property(type) { >+ if (type == "variable") {cx.marked = "property"; return cont();} >+ } >+ function objprop(type, value) { >+ if (type == "async") { >+ cx.marked = "property"; >+ return cont(objprop); >+ } else if (type == "variable" || cx.style == "keyword") { >+ cx.marked = "property"; >+ if (value == "get" || value == "set") return cont(getterSetter); >+ var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params >+ if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) >+ cx.state.fatArrowAt = cx.stream.pos + m[0].length >+ return cont(afterprop); >+ } else if (type == "number" || type == "string") { >+ cx.marked = jsonldMode ? "property" : (cx.style + " property"); >+ return cont(afterprop); >+ } else if (type == "jsonld-keyword") { >+ return cont(afterprop); >+ } else if (isTS && isModifier(value)) { >+ cx.marked = "keyword" >+ return cont(objprop) >+ } else if (type == "[") { >+ return cont(expression, maybetype, expect("]"), afterprop); >+ } else if (type == "spread") { >+ return cont(expressionNoComma, afterprop); >+ } else if (value == "*") { >+ cx.marked = "keyword"; >+ return cont(objprop); >+ } else if (type == ":") { >+ return pass(afterprop) >+ } >+ } >+ function getterSetter(type) { >+ if (type != "variable") return pass(afterprop); >+ cx.marked = "property"; >+ return cont(functiondef); >+ } >+ function afterprop(type) { >+ if (type == ":") return cont(expressionNoComma); >+ if (type == "(") return pass(functiondef); >+ } >+ function commasep(what, end, sep) { >+ function proceed(type, value) { >+ if (sep ? sep.indexOf(type) > -1 : type == ",") { >+ var lex = cx.state.lexical; >+ if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; >+ return cont(function(type, value) { >+ if (type == end || value == end) return pass() >+ return pass(what) >+ }, proceed); >+ } >+ if (type == end || value == end) return cont(); >+ return cont(expect(end)); >+ } >+ return function(type, value) { >+ if (type == end || value == end) return cont(); >+ return pass(what, proceed); >+ }; >+ } >+ function contCommasep(what, end, info) { >+ for (var i = 3; i < arguments.length; i++) >+ cx.cc.push(arguments[i]); >+ return cont(pushlex(end, info), commasep(what, end), poplex); >+ } >+ function block(type) { >+ if (type == "}") return cont(); >+ return pass(statement, block); >+ } >+ function maybetype(type, value) { >+ if (isTS) { >+ if (type == ":") return cont(typeexpr); >+ if (value == "?") return cont(maybetype); >+ } >+ } >+ function mayberettype(type) { >+ if (isTS && type == ":") { >+ if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr) >+ else return cont(typeexpr) >+ } >+ } >+ function isKW(_, value) { >+ if (value == "is") { >+ cx.marked = "keyword" >+ return cont() >+ } >+ } >+ function typeexpr(type, value) { >+ if (value == "keyof" || value == "typeof") { >+ cx.marked = "keyword" >+ return cont(value == "keyof" ? typeexpr : expressionNoComma) >+ } >+ if (type == "variable" || value == "void") { >+ cx.marked = "type" >+ return cont(afterType) >+ } >+ if (type == "string" || type == "number" || type == "atom") return cont(afterType); >+ if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) >+ if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType) >+ if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType) >+ if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr) >+ } >+ function maybeReturnType(type) { >+ if (type == "=>") return cont(typeexpr) >+ } >+ function typeprop(type, value) { >+ if (type == "variable" || cx.style == "keyword") { >+ cx.marked = "property" >+ return cont(typeprop) >+ } else if (value == "?") { >+ return cont(typeprop) >+ } else if (type == ":") { >+ return cont(typeexpr) >+ } else if (type == "[") { >+ return cont(expression, maybetype, expect("]"), typeprop) >+ } >+ } >+ function typearg(type, value) { >+ if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg) >+ if (type == ":") return cont(typeexpr) >+ return pass(typeexpr) >+ } >+ function afterType(type, value) { >+ if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) >+ if (value == "|" || type == "." || value == "&") return cont(typeexpr) >+ if (type == "[") return cont(expect("]"), afterType) >+ if (value == "extends" || value == "implements") { cx.marked = "keyword"; return cont(typeexpr) } >+ } >+ function maybeTypeArgs(_, value) { >+ if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) >+ } >+ function typeparam() { >+ return pass(typeexpr, maybeTypeDefault) >+ } >+ function maybeTypeDefault(_, value) { >+ if (value == "=") return cont(typeexpr) >+ } >+ function vardef(_, value) { >+ if (value == "enum") {cx.marked = "keyword"; return cont(enumdef)} >+ return pass(pattern, maybetype, maybeAssign, vardefCont); >+ } >+ function pattern(type, value) { >+ if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(pattern) } >+ if (type == "variable") { register(value); return cont(); } >+ if (type == "spread") return cont(pattern); >+ if (type == "[") return contCommasep(eltpattern, "]"); >+ if (type == "{") return contCommasep(proppattern, "}"); >+ } >+ function proppattern(type, value) { >+ if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { >+ register(value); >+ return cont(maybeAssign); >+ } >+ if (type == "variable") cx.marked = "property"; >+ if (type == "spread") return cont(pattern); >+ if (type == "}") return pass(); >+ return cont(expect(":"), pattern, maybeAssign); >+ } >+ function eltpattern() { >+ return pass(pattern, maybeAssign) >+ } >+ function maybeAssign(_type, value) { >+ if (value == "=") return cont(expressionNoComma); >+ } >+ function vardefCont(type) { >+ if (type == ",") return cont(vardef); >+ } >+ function maybeelse(type, value) { >+ if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); >+ } >+ function forspec(type, value) { >+ if (value == "await") return cont(forspec); >+ if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); >+ } >+ function forspec1(type) { >+ if (type == "var") return cont(vardef, expect(";"), forspec2); >+ if (type == ";") return cont(forspec2); >+ if (type == "variable") return cont(formaybeinof); >+ return pass(expression, expect(";"), forspec2); >+ } >+ function formaybeinof(_type, value) { >+ if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } >+ return cont(maybeoperatorComma, forspec2); >+ } >+ function forspec2(type, value) { >+ if (type == ";") return cont(forspec3); >+ if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } >+ return pass(expression, expect(";"), forspec3); >+ } >+ function forspec3(type) { >+ if (type != ")") cont(expression); >+ } >+ function functiondef(type, value) { >+ if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} >+ if (type == "variable") {register(value); return cont(functiondef);} >+ if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); >+ if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef) >+ } >+ function funarg(type, value) { >+ if (value == "@") cont(expression, funarg) >+ if (type == "spread") return cont(funarg); >+ if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(funarg); } >+ return pass(pattern, maybetype, maybeAssign); >+ } >+ function classExpression(type, value) { >+ // Class expressions may have an optional name. >+ if (type == "variable") return className(type, value); >+ return classNameAfter(type, value); >+ } >+ function className(type, value) { >+ if (type == "variable") {register(value); return cont(classNameAfter);} >+ } >+ function classNameAfter(type, value) { >+ if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter) >+ if (value == "extends" || value == "implements" || (isTS && type == ",")) { >+ if (value == "implements") cx.marked = "keyword"; >+ return cont(isTS ? typeexpr : expression, classNameAfter); >+ } >+ if (type == "{") return cont(pushlex("}"), classBody, poplex); >+ } >+ function classBody(type, value) { >+ if (type == "async" || >+ (type == "variable" && >+ (value == "static" || value == "get" || value == "set" || (isTS && isModifier(value))) && >+ cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) { >+ cx.marked = "keyword"; >+ return cont(classBody); >+ } >+ if (type == "variable" || cx.style == "keyword") { >+ cx.marked = "property"; >+ return cont(isTS ? classfield : functiondef, classBody); >+ } >+ if (type == "[") >+ return cont(expression, maybetype, expect("]"), isTS ? classfield : functiondef, classBody) >+ if (value == "*") { >+ cx.marked = "keyword"; >+ return cont(classBody); >+ } >+ if (type == ";") return cont(classBody); >+ if (type == "}") return cont(); >+ if (value == "@") return cont(expression, classBody) >+ } >+ function classfield(type, value) { >+ if (value == "?") return cont(classfield) >+ if (type == ":") return cont(typeexpr, maybeAssign) >+ if (value == "=") return cont(expressionNoComma) >+ return pass(functiondef) >+ } >+ function afterExport(type, value) { >+ if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } >+ if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } >+ if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); >+ return pass(statement); >+ } >+ function exportField(type, value) { >+ if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); } >+ if (type == "variable") return pass(expressionNoComma, exportField); >+ } >+ function afterImport(type) { >+ if (type == "string") return cont(); >+ if (type == "(") return pass(expression); >+ return pass(importSpec, maybeMoreImports, maybeFrom); >+ } >+ function importSpec(type, value) { >+ if (type == "{") return contCommasep(importSpec, "}"); >+ if (type == "variable") register(value); >+ if (value == "*") cx.marked = "keyword"; >+ return cont(maybeAs); >+ } >+ function maybeMoreImports(type) { >+ if (type == ",") return cont(importSpec, maybeMoreImports) >+ } >+ function maybeAs(_type, value) { >+ if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } >+ } >+ function maybeFrom(_type, value) { >+ if (value == "from") { cx.marked = "keyword"; return cont(expression); } >+ } >+ function arrayLiteral(type) { >+ if (type == "]") return cont(); >+ return pass(commasep(expressionNoComma, "]")); >+ } >+ function enumdef() { >+ return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex) >+ } >+ function enummember() { >+ return pass(pattern, maybeAssign); >+ } >+ >+ function isContinuedStatement(state, textAfter) { >+ return state.lastType == "operator" || state.lastType == "," || >+ isOperatorChar.test(textAfter.charAt(0)) || >+ /[,.]/.test(textAfter.charAt(0)); >+ } >+ >+ function expressionAllowed(stream, state, backUp) { >+ return state.tokenize == tokenBase && >+ /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || >+ (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) >+ } >+ >+ // Interface >+ >+ return { >+ startState: function(basecolumn) { >+ var state = { >+ tokenize: tokenBase, >+ lastType: "sof", >+ cc: [], >+ lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), >+ localVars: parserConfig.localVars, >+ context: parserConfig.localVars && new Context(null, null, false), >+ indented: basecolumn || 0 >+ }; >+ if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") >+ state.globalVars = parserConfig.globalVars; >+ return state; >+ }, >+ >+ token: function(stream, state) { >+ if (stream.sol()) { >+ if (!state.lexical.hasOwnProperty("align")) >+ state.lexical.align = false; >+ state.indented = stream.indentation(); >+ findFatArrow(stream, state); >+ } >+ if (state.tokenize != tokenComment && stream.eatSpace()) return null; >+ var style = state.tokenize(stream, state); >+ if (type == "comment") return style; >+ state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; >+ return parseJS(state, style, type, content, stream); >+ }, >+ >+ indent: function(state, textAfter) { >+ if (state.tokenize == tokenComment) return CodeMirror.Pass; >+ if (state.tokenize != tokenBase) return 0; >+ var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top >+ // Kludge to prevent 'maybelse' from blocking lexical scope pops >+ if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { >+ var c = state.cc[i]; >+ if (c == poplex) lexical = lexical.prev; >+ else if (c != maybeelse) break; >+ } >+ while ((lexical.type == "stat" || lexical.type == "form") && >+ (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) && >+ (top == maybeoperatorComma || top == maybeoperatorNoComma) && >+ !/^[,\.=+\-*:?[\(]/.test(textAfter)))) >+ lexical = lexical.prev; >+ if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") >+ lexical = lexical.prev; >+ var type = lexical.type, closing = firstChar == type; >+ >+ if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0); >+ else if (type == "form" && firstChar == "{") return lexical.indented; >+ else if (type == "form") return lexical.indented + indentUnit; >+ else if (type == "stat") >+ return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); >+ else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) >+ return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); >+ else if (lexical.align) return lexical.column + (closing ? 0 : 1); >+ else return lexical.indented + (closing ? 0 : indentUnit); >+ }, >+ >+ electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, >+ blockCommentStart: jsonMode ? null : "/*", >+ blockCommentEnd: jsonMode ? null : "*/", >+ blockCommentContinue: jsonMode ? null : " * ", >+ lineComment: jsonMode ? null : "//", >+ fold: "brace", >+ closeBrackets: "()[]{}''\"\"``", >+ >+ helperType: jsonMode ? "json" : "javascript", >+ jsonldMode: jsonldMode, >+ jsonMode: jsonMode, >+ >+ expressionAllowed: expressionAllowed, >+ >+ skipExpression: function(state) { >+ var top = state.cc[state.cc.length - 1] >+ if (top == expression || top == expressionNoComma) state.cc.pop() >+ } >+ }; >+}); >+ >+CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); >+ >+CodeMirror.defineMIME("text/javascript", "javascript"); >+CodeMirror.defineMIME("text/ecmascript", "javascript"); >+CodeMirror.defineMIME("application/javascript", "javascript"); >+CodeMirror.defineMIME("application/x-javascript", "javascript"); >+CodeMirror.defineMIME("application/ecmascript", "javascript"); >+CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); >+CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); >+CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); >+CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); >+CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); >+ >+}); >diff --git a/koha-tmpl/intranet-tmpl/lib/codemirror/javascript.min.js b/koha-tmpl/intranet-tmpl/lib/codemirror/javascript.min.js >new file mode 100644 >index 0000000000..0459dee125 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/codemirror/javascript.min.js >@@ -0,0 +1 @@ >+!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(Le){"use strict";Le.defineMode("javascript",function(e,l){var n,a,d=e.indentUnit,p=l.statementIndent,o=l.jsonld,c=l.json||o,s=l.typescript,f=l.wordCharacters||/[\w$\xa1-\uffff]/,u=function(){function e(e){return{type:e,style:"keyword"}}var t=e("keyword a"),r=e("keyword b"),n=e("keyword c"),a=e("keyword d"),i=e("operator"),o={type:"atom",style:"atom"};return{if:e("if"),while:t,with:t,else:r,do:r,try:r,finally:r,return:a,break:a,continue:a,new:e("new"),delete:n,void:n,throw:n,debugger:e("debugger"),var:e("var"),const:e("var"),let:e("var"),function:e("function"),catch:e("catch"),for:e("for"),switch:e("switch"),case:e("case"),default:e("default"),in:i,typeof:i,instanceof:i,true:o,false:o,null:o,undefined:o,NaN:o,Infinity:o,this:e("this"),class:e("class"),super:e("atom"),yield:n,export:e("export"),import:e("import"),extends:n,await:n}}(),m=/[+\-*&%=<>!?|~^@]/,v=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function k(e,t,r){return n=e,a=r,t}function y(e,t){var a,r=e.next();if('"'==r||"'"==r)return t.tokenize=(a=r,function(e,t){var r,n=!1;if(o&&"@"==e.peek()&&e.match(v))return t.tokenize=y,k("jsonld-keyword","meta");for(;null!=(r=e.next())&&(r!=a||n);)n=!n&&"\\"==r;return n||(t.tokenize=y),k("string","string")}),t.tokenize(e,t);if("."==r&&e.match(/^\d+(?:[eE][+\-]?\d+)?/))return k("number","number");if("."==r&&e.match(".."))return k("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(r))return k(r);if("="==r&&e.eat(">"))return k("=>","operator");if("0"==r&&e.match(/^(?:x[\da-f]+|o[0-7]+|b[01]+)n?/i))return k("number","number");if(/\d/.test(r))return e.match(/^\d*(?:n|(?:\.\d*)?(?:[eE][+\-]?\d+)?)?/),k("number","number");if("/"==r)return e.eat("*")?(t.tokenize=w)(e,t):e.eat("/")?(e.skipToEnd(),k("comment","comment")):Ke(e,t,1)?(function(e){for(var t,r=!1,n=!1;null!=(t=e.next());){if(!r){if("/"==t&&!n)return;"["==t?n=!0:n&&"]"==t&&(n=!1)}r=!r&&"\\"==t}}(e),e.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/),k("regexp","string-2")):(e.eat("="),k("operator","operator",e.current()));if("`"==r)return(t.tokenize=b)(e,t);if("#"==r)return e.skipToEnd(),k("error","error");if(m.test(r))return">"==r&&t.lexical&&">"==t.lexical.type||(e.eat("=")?"!"!=r&&"="!=r||e.eat("="):/[<>*+\-]/.test(r)&&(e.eat(r),">"==r&&e.eat(r))),k("operator","operator",e.current());if(f.test(r)){e.eatWhile(f);var n=e.current();if("."!=t.lastType){if(u.propertyIsEnumerable(n)){var i=u[n];return k(i.type,i.style,n)}if("async"==n&&e.match(/^(\s|\/\*.*?\*\/)*[\[\(\w]/,!1))return k("async","keyword",n)}return k("variable","variable",n)}}function w(e,t){for(var r,n=!1;r=e.next();){if("/"==r&&n){t.tokenize=y;break}n="*"==r}return k("comment","comment")}function b(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&("`"==r||"$"==r&&e.eat("{"))){t.tokenize=y;break}n=!n&&"\\"==r}return k("quasi","string-2",e.current())}var x="([{}])";function i(e,t){t.fatArrowAt&&(t.fatArrowAt=null);var r=e.string.indexOf("=>",e.start);if(!(r<0)){if(s){var n=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(e.string.slice(e.start,r));n&&(r=n.index)}for(var a=0,i=!1,o=r-1;0<=o;--o){var c=e.string.charAt(o),u=x.indexOf(c);if(0<=u&&u<3){if(!a){++o;break}if(0==--a){"("==c&&(i=!0);break}}else if(3<=u&&u<6)++a;else if(f.test(c))i=!0;else{if(/["'\/]/.test(c))return;if(i&&!a){++o;break}}}i&&!a&&(t.fatArrowAt=o)}}var h={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,"jsonld-keyword":!0};function g(e,t,r,n,a,i){this.indented=e,this.column=t,this.type=r,this.prev=a,this.info=i,null!=n&&(this.align=n)}function j(e,t){for(var r=e.localVars;r;r=r.next)if(r.name==t)return!0;for(var n=e.context;n;n=n.prev)for(r=n.vars;r;r=r.next)if(r.name==t)return!0}var M={state:null,column:null,marked:null,cc:null};function V(){for(var e=arguments.length-1;0<=e;e--)M.cc.push(arguments[e])}function A(){return V.apply(null,arguments),!0}function E(e,t){for(var r=t;r;r=r.next)if(r.name==e)return!0;return!1}function r(e){var t=M.state;if(M.marked="def",t.context)if("var"==t.lexical.info&&t.context&&t.context.block){var r=function e(t,r){{if(r){if(r.block){var n=e(t,r.prev);return n?n==r.prev?r:new I(n,r.vars,!0):null}return E(t,r.vars)?r:new I(r.prev,new T(t,r.vars),!1)}return null}}(e,t.context);if(null!=r)return void(t.context=r)}else if(!E(e,t.localVars))return void(t.localVars=new T(e,t.localVars));l.globalVars&&!E(e,t.globalVars)&&(t.globalVars=new T(e,t.globalVars))}function z(e){return"public"==e||"private"==e||"protected"==e||"abstract"==e||"readonly"==e}function I(e,t,r){this.prev=e,this.vars=t,this.block=r}function T(e,t){this.name=e,this.next=t}var t=new T("this",new T("arguments",null));function $(){M.state.context=new I(M.state.context,M.state.localVars,!1),M.state.localVars=t}function C(){M.state.context=new I(M.state.context,M.state.localVars,!0),M.state.localVars=null}function q(){M.state.localVars=M.state.context.vars,M.state.context=M.state.context.prev}function O(n,a){var e=function(){var e=M.state,t=e.indented;if("stat"==e.lexical.type)t=e.lexical.indented;else for(var r=e.lexical;r&&")"==r.type&&r.align;r=r.prev)t=r.indented;e.lexical=new g(t,M.stream.column(),n,null,e.lexical,a)};return e.lex=!0,e}function P(){var e=M.state;e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function S(r){return function e(t){return t==r?A():";"==r||"}"==t||")"==t||"]"==t?V():A(e)}}function N(e,t){return"var"==e?A(O("vardef",t),ye,S(";"),P):"keyword a"==e?A(O("form"),W,N,P):"keyword b"==e?A(O("form"),N,P):"keyword d"==e?M.stream.match(/^\s*$/,!1)?A():A(O("stat"),F,S(";"),P):"debugger"==e?A(S(";")):"{"==e?A(O("}"),C,ie,P,q):";"==e?A():"if"==e?("else"==M.state.lexical.info&&M.state.cc[M.state.cc.length-1]==P&&M.state.cc.pop()(),A(O("form"),W,N,P,je)):"function"==e?A(Ie):"for"==e?A(O("form"),Me,N,P):"class"==e||s&&"interface"==t?(M.marked="keyword",A(O("form"),Ce,P)):"variable"==e?s&&"declare"==t?(M.marked="keyword",A(N)):s&&("module"==t||"enum"==t||"type"==t)&&M.stream.match(/^\s*\w/,!1)?(M.marked="keyword","enum"==t?A(Ge):"type"==t?A(se,S("operator"),se,S(";")):A(O("form"),we,S("{"),O("}"),ie,P,P)):s&&"namespace"==t?(M.marked="keyword",A(O("form"),B,ie,P)):s&&"abstract"==t?(M.marked="keyword",A(N)):A(O("stat"),Z):"switch"==e?A(O("form"),W,S("{"),O("}","switch"),C,ie,P,P,q):"case"==e?A(B,S(":")):"default"==e?A(S(":")):"catch"==e?A(O("form"),$,U,N,P,q):"export"==e?A(O("stat"),Se,P):"import"==e?A(O("stat"),Ue,P):"async"==e?A(N):"@"==t?A(B,N):V(O("stat"),B,S(";"),P)}function U(e){if("("==e)return A(Te,S(")"))}function B(e,t){return D(e,t,!1)}function H(e,t){return D(e,t,!0)}function W(e){return"("!=e?V():A(O(")"),B,S(")"),P)}function D(e,t,r){if(M.state.fatArrowAt==M.stream.start){var n=r?R:Q;if("("==e)return A($,O(")"),ne(Te,")"),P,S("=>"),n,q);if("variable"==e)return V($,we,S("=>"),n,q)}var a,i=r?J:G;return h.hasOwnProperty(e)?A(i):"function"==e?A(Ie,i):"class"==e||s&&"interface"==t?(M.marked="keyword",A(O("form"),$e,P)):"keyword c"==e||"async"==e?A(r?H:B):"("==e?A(O(")"),F,S(")"),P,i):"operator"==e||"spread"==e?A(r?H:B):"["==e?A(O("]"),Fe,P,i):"{"==e?ae(ee,"}",null,i):"quasi"==e?V(K,i):"new"==e?A((a=r,function(e){return"."==e?A(a?Y:X):"variable"==e&&s?A(me,a?J:G):V(a?H:B)})):"import"==e?A(B):A()}function F(e){return e.match(/[;\}\)\],]/)?V():V(B)}function G(e,t){return","==e?A(B):J(e,t,!1)}function J(e,t,r){var n=0==r?G:J,a=0==r?B:H;return"=>"==e?A($,r?R:Q,q):"operator"==e?/\+\+|--/.test(t)||s&&"!"==t?A(n):s&&"<"==t&&M.stream.match(/^([^>]|<.*?>)*>\s*\(/,!1)?A(O(">"),ne(se,">"),P,n):"?"==t?A(B,S(":"),a):A(a):"quasi"==e?V(K,n):";"!=e?"("==e?ae(H,")","call",n):"."==e?A(_,n):"["==e?A(O("]"),F,S("]"),P,n):s&&"as"==t?(M.marked="keyword",A(se,n)):"regexp"==e?(M.state.lastType=M.marked="operator",M.stream.backUp(M.stream.pos-M.stream.start-1),A(a)):void 0:void 0}function K(e,t){return"quasi"!=e?V():"${"!=t.slice(t.length-2)?A(K):A(B,L)}function L(e){if("}"==e)return M.marked="string-2",M.state.tokenize=b,A(K)}function Q(e){return i(M.stream,M.state),V("{"==e?N:B)}function R(e){return i(M.stream,M.state),V("{"==e?N:H)}function X(e,t){if("target"==t)return M.marked="keyword",A(G)}function Y(e,t){if("target"==t)return M.marked="keyword",A(J)}function Z(e){return":"==e?A(P,N):V(G,S(";"),P)}function _(e){if("variable"==e)return M.marked="property",A()}function ee(e,t){if("async"==e)return M.marked="property",A(ee);if("variable"==e||"keyword"==M.style){return M.marked="property","get"==t||"set"==t?A(te):(s&&M.state.fatArrowAt==M.stream.start&&(r=M.stream.match(/^\s*:\s*/,!1))&&(M.state.fatArrowAt=M.stream.pos+r[0].length),A(re));var r}else{if("number"==e||"string"==e)return M.marked=o?"property":M.style+" property",A(re);if("jsonld-keyword"==e)return A(re);if(s&&z(t))return M.marked="keyword",A(ee);if("["==e)return A(B,oe,S("]"),re);if("spread"==e)return A(H,re);if("*"==t)return M.marked="keyword",A(ee);if(":"==e)return V(re)}}function te(e){return"variable"!=e?V(re):(M.marked="property",A(Ie))}function re(e){return":"==e?A(H):"("==e?V(Ie):void 0}function ne(n,a,i){function o(e,t){if(i?-1<i.indexOf(e):","==e){var r=M.state.lexical;return"call"==r.info&&(r.pos=(r.pos||0)+1),A(function(e,t){return e==a||t==a?V():V(n)},o)}return e==a||t==a?A():A(S(a))}return function(e,t){return e==a||t==a?A():V(n,o)}}function ae(e,t,r){for(var n=3;n<arguments.length;n++)M.cc.push(arguments[n]);return A(O(t,r),ne(e,t),P)}function ie(e){return"}"==e?A():V(N,ie)}function oe(e,t){if(s){if(":"==e)return A(se);if("?"==t)return A(oe)}}function ce(e){if(s&&":"==e)return M.stream.match(/^\s*\w+\s+is\b/,!1)?A(B,ue,se):A(se)}function ue(e,t){if("is"==t)return M.marked="keyword",A()}function se(e,t){return"keyof"==t||"typeof"==t?(M.marked="keyword",A("keyof"==t?se:H)):"variable"==e||"void"==t?(M.marked="type",A(pe)):"string"==e||"number"==e||"atom"==e?A(pe):"["==e?A(O("]"),ne(se,"]",","),P,pe):"{"==e?A(O("}"),ne(le,"}",",;"),P,pe):"("==e?A(ne(de,")"),fe):"<"==e?A(ne(se,">"),se):void 0}function fe(e){if("=>"==e)return A(se)}function le(e,t){return"variable"==e||"keyword"==M.style?(M.marked="property",A(le)):"?"==t?A(le):":"==e?A(se):"["==e?A(B,oe,S("]"),le):void 0}function de(e,t){return"variable"==e&&M.stream.match(/^\s*[?:]/,!1)||"?"==t?A(de):":"==e?A(se):V(se)}function pe(e,t){return"<"==t?A(O(">"),ne(se,">"),P,pe):"|"==t||"."==e||"&"==t?A(se):"["==e?A(S("]"),pe):"extends"==t||"implements"==t?(M.marked="keyword",A(se)):void 0}function me(e,t){if("<"==t)return A(O(">"),ne(se,">"),P,pe)}function ve(){return V(se,ke)}function ke(e,t){if("="==t)return A(se)}function ye(e,t){return"enum"==t?(M.marked="keyword",A(Ge)):V(we,oe,he,ge)}function we(e,t){return s&&z(t)?(M.marked="keyword",A(we)):"variable"==e?(r(t),A()):"spread"==e?A(we):"["==e?ae(xe,"]"):"{"==e?ae(be,"}"):void 0}function be(e,t){return"variable"!=e||M.stream.match(/^\s*:/,!1)?("variable"==e&&(M.marked="property"),"spread"==e?A(we):"}"==e?V():A(S(":"),we,he)):(r(t),A(he))}function xe(){return V(we,he)}function he(e,t){if("="==t)return A(H)}function ge(e){if(","==e)return A(ye)}function je(e,t){if("keyword b"==e&&"else"==t)return A(O("form","else"),N,P)}function Me(e,t){return"await"==t?A(Me):"("==e?A(O(")"),Ve,S(")"),P):void 0}function Ve(e){return"var"==e?A(ye,S(";"),Ee):";"==e?A(Ee):"variable"==e?A(Ae):V(B,S(";"),Ee)}function Ae(e,t){return"in"==t||"of"==t?(M.marked="keyword",A(B)):A(G,Ee)}function Ee(e,t){return";"==e?A(ze):"in"==t||"of"==t?(M.marked="keyword",A(B)):V(B,S(";"),ze)}function ze(e){")"!=e&&A(B)}function Ie(e,t){return"*"==t?(M.marked="keyword",A(Ie)):"variable"==e?(r(t),A(Ie)):"("==e?A($,O(")"),ne(Te,")"),P,ce,N,q):s&&"<"==t?A(O(">"),ne(ve,">"),P,Ie):void 0}function Te(e,t){return"@"==t&&A(B,Te),"spread"==e?A(Te):s&&z(t)?(M.marked="keyword",A(Te)):V(we,oe,he)}function $e(e,t){return"variable"==e?Ce(e,t):qe(e,t)}function Ce(e,t){if("variable"==e)return r(t),A(qe)}function qe(e,t){return"<"==t?A(O(">"),ne(ve,">"),P,qe):"extends"==t||"implements"==t||s&&","==e?("implements"==t&&(M.marked="keyword"),A(s?se:B,qe)):"{"==e?A(O("}"),Oe,P):void 0}function Oe(e,t){return"async"==e||"variable"==e&&("static"==t||"get"==t||"set"==t||s&&z(t))&&M.stream.match(/^\s+[\w$\xa1-\uffff]/,!1)?(M.marked="keyword",A(Oe)):"variable"==e||"keyword"==M.style?(M.marked="property",A(s?Pe:Ie,Oe)):"["==e?A(B,oe,S("]"),s?Pe:Ie,Oe):"*"==t?(M.marked="keyword",A(Oe)):";"==e?A(Oe):"}"==e?A():"@"==t?A(B,Oe):void 0}function Pe(e,t){return"?"==t?A(Pe):":"==e?A(se,he):"="==t?A(H):V(Ie)}function Se(e,t){return"*"==t?(M.marked="keyword",A(De,S(";"))):"default"==t?(M.marked="keyword",A(B,S(";"))):"{"==e?A(ne(Ne,"}"),De,S(";")):V(N)}function Ne(e,t){return"as"==t?(M.marked="keyword",A(S("variable"))):"variable"==e?V(H,Ne):void 0}function Ue(e){return"string"==e?A():"("==e?V(B):V(Be,He,De)}function Be(e,t){return"{"==e?ae(Be,"}"):("variable"==e&&r(t),"*"==t&&(M.marked="keyword"),A(We))}function He(e){if(","==e)return A(Be,He)}function We(e,t){if("as"==t)return M.marked="keyword",A(Be)}function De(e,t){if("from"==t)return M.marked="keyword",A(B)}function Fe(e){return"]"==e?A():V(ne(H,"]"))}function Ge(){return V(O("form"),we,S("{"),O("}"),ne(Je,"}"),P,P)}function Je(){return V(we,he)}function Ke(e,t,r){return t.tokenize==y&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(t.lastType)||"quasi"==t.lastType&&/\{\s*$/.test(e.string.slice(0,e.pos-(r||0)))}return P.lex=q.lex=!0,{startState:function(e){var t={tokenize:y,lastType:"sof",cc:[],lexical:new g((e||0)-d,0,"block",!1),localVars:l.localVars,context:l.localVars&&new I(null,null,!1),indented:e||0};return l.globalVars&&"object"==typeof l.globalVars&&(t.globalVars=l.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),i(e,t)),t.tokenize!=w&&e.eatSpace())return null;var r=t.tokenize(e,t);return"comment"==n?r:(t.lastType="operator"!=n||"++"!=a&&"--"!=a?n:"incdec",function(e,t,r,n,a){var i=e.cc;for(M.state=e,M.stream=a,M.marked=null,M.cc=i,M.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;)if((i.length?i.pop():c?B:N)(r,n)){for(;i.length&&i[i.length-1].lex;)i.pop()();return M.marked?M.marked:"variable"==r&&j(e,n)?"variable-2":t}}(t,r,n,a,e))},indent:function(e,t){if(e.tokenize==w)return Le.Pass;if(e.tokenize!=y)return 0;var r,n=t&&t.charAt(0),a=e.lexical;if(!/^\s*else\b/.test(t))for(var i=e.cc.length-1;0<=i;--i){var o=e.cc[i];if(o==P)a=a.prev;else if(o!=je)break}for(;("stat"==a.type||"form"==a.type)&&("}"==n||(r=e.cc[e.cc.length-1])&&(r==G||r==J)&&!/^[,\.=+\-*:?[\(]/.test(t));)a=a.prev;p&&")"==a.type&&"stat"==a.prev.type&&(a=a.prev);var c,u,s=a.type,f=n==s;return"vardef"==s?a.indented+("operator"==e.lastType||","==e.lastType?a.info.length+1:0):"form"==s&&"{"==n?a.indented:"form"==s?a.indented+d:"stat"==s?a.indented+(u=t,"operator"==(c=e).lastType||","==c.lastType||m.test(u.charAt(0))||/[,.]/.test(u.charAt(0))?p||d:0):"switch"!=a.info||f||0==l.doubleIndentSwitch?a.align?a.column+(f?0:1):a.indented+(f?0:d):a.indented+(/^(?:case|default)\b/.test(t)?d:2*d)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:c?null:"/*",blockCommentEnd:c?null:"*/",blockCommentContinue:c?null:" * ",lineComment:c?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:c?"json":"javascript",jsonldMode:o,jsonMode:c,expressionAllowed:Ke,skipExpression:function(e){var t=e.cc[e.cc.length-1];t!=B&&t!=H||e.cc.pop()}}}),Le.registerHelper("wordChars","javascript",/[\w$]/),Le.defineMIME("text/javascript","javascript"),Le.defineMIME("text/ecmascript","javascript"),Le.defineMIME("application/javascript","javascript"),Le.defineMIME("application/x-javascript","javascript"),Le.defineMIME("application/ecmascript","javascript"),Le.defineMIME("application/json",{name:"javascript",json:!0}),Le.defineMIME("application/x-json",{name:"javascript",json:!0}),Le.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),Le.defineMIME("text/typescript",{name:"javascript",typescript:!0}),Le.defineMIME("application/typescript",{name:"javascript",typescript:!0})}); >\ No newline at end of file >diff --git a/koha-tmpl/intranet-tmpl/lib/codemirror/xml.js b/koha-tmpl/intranet-tmpl/lib/codemirror/xml.js >new file mode 100644 >index 0000000000..b67bf850b1 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/codemirror/xml.js >@@ -0,0 +1,402 @@ >+// CodeMirror, copyright (c) by Marijn Haverbeke and others >+// Distributed under an MIT license: https://codemirror.net/LICENSE >+ >+(function(mod) { >+ if (typeof exports == "object" && typeof module == "object") // CommonJS >+ mod(require("../../lib/codemirror")); >+ else if (typeof define == "function" && define.amd) // AMD >+ define(["../../lib/codemirror"], mod); >+ else // Plain browser env >+ mod(CodeMirror); >+})(function(CodeMirror) { >+"use strict"; >+ >+var htmlConfig = { >+ autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, >+ 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, >+ 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, >+ 'track': true, 'wbr': true, 'menuitem': true}, >+ implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, >+ 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, >+ 'th': true, 'tr': true}, >+ contextGrabbers: { >+ 'dd': {'dd': true, 'dt': true}, >+ 'dt': {'dd': true, 'dt': true}, >+ 'li': {'li': true}, >+ 'option': {'option': true, 'optgroup': true}, >+ 'optgroup': {'optgroup': true}, >+ 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, >+ 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, >+ 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, >+ 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, >+ 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, >+ 'rp': {'rp': true, 'rt': true}, >+ 'rt': {'rp': true, 'rt': true}, >+ 'tbody': {'tbody': true, 'tfoot': true}, >+ 'td': {'td': true, 'th': true}, >+ 'tfoot': {'tbody': true}, >+ 'th': {'td': true, 'th': true}, >+ 'thead': {'tbody': true, 'tfoot': true}, >+ 'tr': {'tr': true} >+ }, >+ doNotIndent: {"pre": true}, >+ allowUnquoted: true, >+ allowMissing: true, >+ caseFold: true >+} >+ >+var xmlConfig = { >+ autoSelfClosers: {}, >+ implicitlyClosed: {}, >+ contextGrabbers: {}, >+ doNotIndent: {}, >+ allowUnquoted: false, >+ allowMissing: false, >+ allowMissingTagName: false, >+ caseFold: false >+} >+ >+CodeMirror.defineMode("xml", function(editorConf, config_) { >+ var indentUnit = editorConf.indentUnit >+ var config = {} >+ var defaults = config_.htmlMode ? htmlConfig : xmlConfig >+ for (var prop in defaults) config[prop] = defaults[prop] >+ for (var prop in config_) config[prop] = config_[prop] >+ >+ // Return variables for tokenizers >+ var type, setStyle; >+ >+ function inText(stream, state) { >+ function chain(parser) { >+ state.tokenize = parser; >+ return parser(stream, state); >+ } >+ >+ var ch = stream.next(); >+ if (ch == "<") { >+ if (stream.eat("!")) { >+ if (stream.eat("[")) { >+ if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); >+ else return null; >+ } else if (stream.match("--")) { >+ return chain(inBlock("comment", "-->")); >+ } else if (stream.match("DOCTYPE", true, true)) { >+ stream.eatWhile(/[\w\._\-]/); >+ return chain(doctype(1)); >+ } else { >+ return null; >+ } >+ } else if (stream.eat("?")) { >+ stream.eatWhile(/[\w\._\-]/); >+ state.tokenize = inBlock("meta", "?>"); >+ return "meta"; >+ } else { >+ type = stream.eat("/") ? "closeTag" : "openTag"; >+ state.tokenize = inTag; >+ return "tag bracket"; >+ } >+ } else if (ch == "&") { >+ var ok; >+ if (stream.eat("#")) { >+ if (stream.eat("x")) { >+ ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); >+ } else { >+ ok = stream.eatWhile(/[\d]/) && stream.eat(";"); >+ } >+ } else { >+ ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); >+ } >+ return ok ? "atom" : "error"; >+ } else { >+ stream.eatWhile(/[^&<]/); >+ return null; >+ } >+ } >+ inText.isInText = true; >+ >+ function inTag(stream, state) { >+ var ch = stream.next(); >+ if (ch == ">" || (ch == "/" && stream.eat(">"))) { >+ state.tokenize = inText; >+ type = ch == ">" ? "endTag" : "selfcloseTag"; >+ return "tag bracket"; >+ } else if (ch == "=") { >+ type = "equals"; >+ return null; >+ } else if (ch == "<") { >+ state.tokenize = inText; >+ state.state = baseState; >+ state.tagName = state.tagStart = null; >+ var next = state.tokenize(stream, state); >+ return next ? next + " tag error" : "tag error"; >+ } else if (/[\'\"]/.test(ch)) { >+ state.tokenize = inAttribute(ch); >+ state.stringStartCol = stream.column(); >+ return state.tokenize(stream, state); >+ } else { >+ stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); >+ return "word"; >+ } >+ } >+ >+ function inAttribute(quote) { >+ var closure = function(stream, state) { >+ while (!stream.eol()) { >+ if (stream.next() == quote) { >+ state.tokenize = inTag; >+ break; >+ } >+ } >+ return "string"; >+ }; >+ closure.isInAttribute = true; >+ return closure; >+ } >+ >+ function inBlock(style, terminator) { >+ return function(stream, state) { >+ while (!stream.eol()) { >+ if (stream.match(terminator)) { >+ state.tokenize = inText; >+ break; >+ } >+ stream.next(); >+ } >+ return style; >+ } >+ } >+ >+ function doctype(depth) { >+ return function(stream, state) { >+ var ch; >+ while ((ch = stream.next()) != null) { >+ if (ch == "<") { >+ state.tokenize = doctype(depth + 1); >+ return state.tokenize(stream, state); >+ } else if (ch == ">") { >+ if (depth == 1) { >+ state.tokenize = inText; >+ break; >+ } else { >+ state.tokenize = doctype(depth - 1); >+ return state.tokenize(stream, state); >+ } >+ } >+ } >+ return "meta"; >+ }; >+ } >+ >+ function Context(state, tagName, startOfLine) { >+ this.prev = state.context; >+ this.tagName = tagName; >+ this.indent = state.indented; >+ this.startOfLine = startOfLine; >+ if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent)) >+ this.noIndent = true; >+ } >+ function popContext(state) { >+ if (state.context) state.context = state.context.prev; >+ } >+ function maybePopContext(state, nextTagName) { >+ var parentTagName; >+ while (true) { >+ if (!state.context) { >+ return; >+ } >+ parentTagName = state.context.tagName; >+ if (!config.contextGrabbers.hasOwnProperty(parentTagName) || >+ !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) { >+ return; >+ } >+ popContext(state); >+ } >+ } >+ >+ function baseState(type, stream, state) { >+ if (type == "openTag") { >+ state.tagStart = stream.column(); >+ return tagNameState; >+ } else if (type == "closeTag") { >+ return closeTagNameState; >+ } else { >+ return baseState; >+ } >+ } >+ function tagNameState(type, stream, state) { >+ if (type == "word") { >+ state.tagName = stream.current(); >+ setStyle = "tag"; >+ return attrState; >+ } else if (config.allowMissingTagName && type == "endTag") { >+ setStyle = "tag bracket"; >+ return attrState(type, stream, state); >+ } else { >+ setStyle = "error"; >+ return tagNameState; >+ } >+ } >+ function closeTagNameState(type, stream, state) { >+ if (type == "word") { >+ var tagName = stream.current(); >+ if (state.context && state.context.tagName != tagName && >+ config.implicitlyClosed.hasOwnProperty(state.context.tagName)) >+ popContext(state); >+ if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) { >+ setStyle = "tag"; >+ return closeState; >+ } else { >+ setStyle = "tag error"; >+ return closeStateErr; >+ } >+ } else if (config.allowMissingTagName && type == "endTag") { >+ setStyle = "tag bracket"; >+ return closeState(type, stream, state); >+ } else { >+ setStyle = "error"; >+ return closeStateErr; >+ } >+ } >+ >+ function closeState(type, _stream, state) { >+ if (type != "endTag") { >+ setStyle = "error"; >+ return closeState; >+ } >+ popContext(state); >+ return baseState; >+ } >+ function closeStateErr(type, stream, state) { >+ setStyle = "error"; >+ return closeState(type, stream, state); >+ } >+ >+ function attrState(type, _stream, state) { >+ if (type == "word") { >+ setStyle = "attribute"; >+ return attrEqState; >+ } else if (type == "endTag" || type == "selfcloseTag") { >+ var tagName = state.tagName, tagStart = state.tagStart; >+ state.tagName = state.tagStart = null; >+ if (type == "selfcloseTag" || >+ config.autoSelfClosers.hasOwnProperty(tagName)) { >+ maybePopContext(state, tagName); >+ } else { >+ maybePopContext(state, tagName); >+ state.context = new Context(state, tagName, tagStart == state.indented); >+ } >+ return baseState; >+ } >+ setStyle = "error"; >+ return attrState; >+ } >+ function attrEqState(type, stream, state) { >+ if (type == "equals") return attrValueState; >+ if (!config.allowMissing) setStyle = "error"; >+ return attrState(type, stream, state); >+ } >+ function attrValueState(type, stream, state) { >+ if (type == "string") return attrContinuedState; >+ if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;} >+ setStyle = "error"; >+ return attrState(type, stream, state); >+ } >+ function attrContinuedState(type, stream, state) { >+ if (type == "string") return attrContinuedState; >+ return attrState(type, stream, state); >+ } >+ >+ return { >+ startState: function(baseIndent) { >+ var state = {tokenize: inText, >+ state: baseState, >+ indented: baseIndent || 0, >+ tagName: null, tagStart: null, >+ context: null} >+ if (baseIndent != null) state.baseIndent = baseIndent >+ return state >+ }, >+ >+ token: function(stream, state) { >+ if (!state.tagName && stream.sol()) >+ state.indented = stream.indentation(); >+ >+ if (stream.eatSpace()) return null; >+ type = null; >+ var style = state.tokenize(stream, state); >+ if ((style || type) && style != "comment") { >+ setStyle = null; >+ state.state = state.state(type || style, stream, state); >+ if (setStyle) >+ style = setStyle == "error" ? style + " error" : setStyle; >+ } >+ return style; >+ }, >+ >+ indent: function(state, textAfter, fullLine) { >+ var context = state.context; >+ // Indent multi-line strings (e.g. css). >+ if (state.tokenize.isInAttribute) { >+ if (state.tagStart == state.indented) >+ return state.stringStartCol + 1; >+ else >+ return state.indented + indentUnit; >+ } >+ if (context && context.noIndent) return CodeMirror.Pass; >+ if (state.tokenize != inTag && state.tokenize != inText) >+ return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; >+ // Indent the starts of attribute names. >+ if (state.tagName) { >+ if (config.multilineTagIndentPastTag !== false) >+ return state.tagStart + state.tagName.length + 2; >+ else >+ return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1); >+ } >+ if (config.alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0; >+ var tagAfter = textAfter && /^<(\/)?([\w_:\.-]*)/.exec(textAfter); >+ if (tagAfter && tagAfter[1]) { // Closing tag spotted >+ while (context) { >+ if (context.tagName == tagAfter[2]) { >+ context = context.prev; >+ break; >+ } else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) { >+ context = context.prev; >+ } else { >+ break; >+ } >+ } >+ } else if (tagAfter) { // Opening tag spotted >+ while (context) { >+ var grabbers = config.contextGrabbers[context.tagName]; >+ if (grabbers && grabbers.hasOwnProperty(tagAfter[2])) >+ context = context.prev; >+ else >+ break; >+ } >+ } >+ while (context && context.prev && !context.startOfLine) >+ context = context.prev; >+ if (context) return context.indent + indentUnit; >+ else return state.baseIndent || 0; >+ }, >+ >+ electricInput: /<\/[\s\w:]+>$/, >+ blockCommentStart: "<!--", >+ blockCommentEnd: "-->", >+ >+ configuration: config.htmlMode ? "html" : "xml", >+ helperType: config.htmlMode ? "html" : "xml", >+ >+ skipAttribute: function(state) { >+ if (state.state == attrValueState) >+ state.state = attrState >+ } >+ }; >+}); >+ >+CodeMirror.defineMIME("text/xml", "xml"); >+CodeMirror.defineMIME("application/xml", "xml"); >+if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) >+ CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true}); >+ >+}); >diff --git a/koha-tmpl/intranet-tmpl/lib/codemirror/xml.min.js b/koha-tmpl/intranet-tmpl/lib/codemirror/xml.min.js >new file mode 100644 >index 0000000000..939abbd7a3 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/codemirror/xml.min.js >@@ -0,0 +1 @@ >+!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(y){"use strict";var N={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0},z={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,allowMissingTagName:!1,caseFold:!1};y.defineMode("xml",function(t,e){var i,a,l=t.indentUnit,u={},n=e.htmlMode?N:z;for(var r in n)u[r]=n[r];for(var r in e)u[r]=e[r];function d(e,n){function t(t){return(n.tokenize=t)(e,n)}var r=e.next();return"<"==r?e.eat("!")?e.eat("[")?e.match("CDATA[")?t(o("atom","]]>")):null:e.match("--")?t(o("comment","--\x3e")):e.match("DOCTYPE",!0,!0)?(e.eatWhile(/[\w\._\-]/),t(function r(o){return function(t,e){for(var n;null!=(n=t.next());){if("<"==n)return e.tokenize=r(o+1),e.tokenize(t,e);if(">"==n){if(1!=o)return e.tokenize=r(o-1),e.tokenize(t,e);e.tokenize=d;break}}return"meta"}}(1))):null:e.eat("?")?(e.eatWhile(/[\w\._\-]/),n.tokenize=o("meta","?>"),"meta"):(i=e.eat("/")?"closeTag":"openTag",n.tokenize=c,"tag bracket"):"&"!=r?(e.eatWhile(/[^&<]/),null):(e.eat("#")?e.eat("x")?e.eatWhile(/[a-fA-F\d]/)&&e.eat(";"):e.eatWhile(/[\d]/)&&e.eat(";"):e.eatWhile(/[\w\.\-:]/)&&e.eat(";"))?"atom":"error"}function c(t,e){var n=t.next();if(">"==n||"/"==n&&t.eat(">"))return e.tokenize=d,i=">"==n?"endTag":"selfcloseTag","tag bracket";if("="==n)return i="equals",null;if("<"!=n)return/[\'\"]/.test(n)?(e.tokenize=(r=n,(o=function(t,e){for(;!t.eol();)if(t.next()==r){e.tokenize=c;break}return"string"}).isInAttribute=!0,o),e.stringStartCol=t.column(),e.tokenize(t,e)):(t.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word");e.tokenize=d,e.state=g,e.tagName=e.tagStart=null;var r,o,a=e.tokenize(t,e);return a?a+" tag error":"tag error"}function o(n,r){return function(t,e){for(;!t.eol();){if(t.match(r)){e.tokenize=d;break}t.next()}return n}}function s(t,e,n){this.prev=t.context,this.tagName=e,this.indent=t.indented,this.startOfLine=n,(u.doNotIndent.hasOwnProperty(e)||t.context&&t.context.noIndent)&&(this.noIndent=!0)}function f(t){t.context&&(t.context=t.context.prev)}function m(t,e){for(var n;;){if(!t.context)return;if(n=t.context.tagName,!u.contextGrabbers.hasOwnProperty(n)||!u.contextGrabbers[n].hasOwnProperty(e))return;f(t)}}function g(t,e,n){return"openTag"==t?(n.tagStart=e.column(),p):"closeTag"==t?h:g}function p(t,e,n){return"word"==t?(n.tagName=e.current(),a="tag",k):u.allowMissingTagName&&"endTag"==t?(a="tag bracket",k(t,e,n)):(a="error",p)}function h(t,e,n){if("word"!=t)return u.allowMissingTagName&&"endTag"==t?(a="tag bracket",x(t,e,n)):(a="error",b);var r=e.current();return n.context&&n.context.tagName!=r&&u.implicitlyClosed.hasOwnProperty(n.context.tagName)&&f(n),n.context&&n.context.tagName==r||!1===u.matchClosing?(a="tag",x):(a="tag error",b)}function x(t,e,n){return"endTag"!=t?(a="error",x):(f(n),g)}function b(t,e,n){return a="error",x(t,0,n)}function k(t,e,n){if("word"==t)return a="attribute",w;if("endTag"!=t&&"selfcloseTag"!=t)return a="error",k;var r=n.tagName,o=n.tagStart;return n.tagName=n.tagStart=null,"selfcloseTag"==t||u.autoSelfClosers.hasOwnProperty(r)?m(n,r):(m(n,r),n.context=new s(n,r,o==n.indented)),g}function w(t,e,n){return"equals"==t?v:(u.allowMissing||(a="error"),k(t,0,n))}function v(t,e,n){return"string"==t?T:"word"==t&&u.allowUnquoted?(a="string",k):(a="error",k(t,0,n))}function T(t,e,n){return"string"==t?T:k(t,0,n)}return d.isInText=!0,{startState:function(t){var e={tokenize:d,state:g,indented:t||0,tagName:null,tagStart:null,context:null};return null!=t&&(e.baseIndent=t),e},token:function(t,e){if(!e.tagName&&t.sol()&&(e.indented=t.indentation()),t.eatSpace())return null;i=null;var n=e.tokenize(t,e);return(n||i)&&"comment"!=n&&(a=null,e.state=e.state(i||n,t,e),a&&(n="error"==a?n+" error":a)),n},indent:function(t,e,n){var r=t.context;if(t.tokenize.isInAttribute)return t.tagStart==t.indented?t.stringStartCol+1:t.indented+l;if(r&&r.noIndent)return y.Pass;if(t.tokenize!=c&&t.tokenize!=d)return n?n.match(/^(\s*)/)[0].length:0;if(t.tagName)return!1!==u.multilineTagIndentPastTag?t.tagStart+t.tagName.length+2:t.tagStart+l*(u.multilineTagIndentFactor||1);if(u.alignCDATA&&/<!\[CDATA\[/.test(e))return 0;var o=e&&/^<(\/)?([\w_:\.-]*)/.exec(e);if(o&&o[1])for(;r;){if(r.tagName==o[2]){r=r.prev;break}if(!u.implicitlyClosed.hasOwnProperty(r.tagName))break;r=r.prev}else if(o)for(;r;){var a=u.contextGrabbers[r.tagName];if(!a||!a.hasOwnProperty(o[2]))break;r=r.prev}for(;r&&r.prev&&!r.startOfLine;)r=r.prev;return r?r.indent+l:t.baseIndent||0},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",configuration:u.htmlMode?"html":"xml",helperType:u.htmlMode?"html":"xml",skipAttribute:function(t){t.state==v&&(t.state=k)}}}),y.defineMIME("text/xml","xml"),y.defineMIME("application/xml","xml"),y.mimeModes.hasOwnProperty("text/html")||y.defineMIME("text/html",{name:"xml",htmlMode:!0})}); >\ No newline at end of file >diff --git a/koha-tmpl/intranet-tmpl/prog/css/preferences.css b/koha-tmpl/intranet-tmpl/prog/css/preferences.css >index a1efc7c5de..7ecce1be4d 100644 >--- a/koha-tmpl/intranet-tmpl/prog/css/preferences.css >+++ b/koha-tmpl/intranet-tmpl/prog/css/preferences.css >@@ -128,4 +128,10 @@ span.overridden { > > .sortable li.ui-sortable-helper { > background-color: #FFC; >+} >+ >+.CodeMirror { >+ border: 1px solid #EEE; >+ margin: 1em 1em 1em 0; >+ resize: vertical; > } >\ No newline at end of file >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt >index 43e892ff0c..8e36c71461 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt >@@ -8,6 +8,7 @@ > [% Asset.css("css/preferences.css") | $raw %] > [% Asset.css("lib/jquery/plugins/multiple-select/multiple-select.css") | $raw %] > [% Asset.css("css/humanmsg.css") | $raw %] >+[% Asset.css("lib/codemirror/codemirror.css") | $raw %] > </head> > <body id="admin_preferences" class="admin"> > [% INCLUDE 'header.inc' %] >@@ -95,13 +96,13 @@ > <select name="pref_[% CHUNK.name | html %]" id="pref_[% CHUNK.name | html %]" class="preference preference-[% CHUNK.class or "choice" | html %]" multiple="multiple"> > [% FOREACH CHOICE IN CHUNK.CHOICES %][% IF ( CHOICE.selected ) %]<option value="[% CHOICE.value | html %]" selected="selected">[% ELSE %]<option value="[% CHOICE.value | html %]">[% END %][% CHOICE.text | html %]</option>[% END %] > </select> >- [% ELSIF ( CHUNK.type_textarea ) || ( CHUNK.type_htmlarea )%] >- [% IF ( CHUNK.type_htmlarea ) && ( Koha.Preference('UseWYSIWYGinSystemPreferences') ) %] >- <textarea name="pref_[% CHUNK.name | html %]" id="pref_[% CHUNK.name | html %]" class="preference preference-[% CHUNK.class or "short" | html %] mce" rows="20" cols="60">[% CHUNK.value | html %]</textarea> >+ [% ELSIF ( CHUNK.type_textarea )%] >+ [% IF ( CHUNK.syntax == "text/html" && Koha.Preference('UseWYSIWYGinSystemPreferences') ) %] >+ <textarea name="pref_[% CHUNK.name | html %]" id="pref_[% CHUNK.name | html %]" class="preference preference-[% CHUNK.class or "short" | html %] mce" rows="20" cols="60">[% CHUNK.value | html %]</textarea> > [% ELSE %] >- <a class="expand-textarea" style="display: none" href="#">Click to Edit</a> >- <textarea name="pref_[% CHUNK.name | html %]" id="pref_[% CHUNK.name | html %]" class="preference preference-[% CHUNK.class or "short" | html %]" rows="10" cols="40">[% CHUNK.value | html %]</textarea> >- <a class="collapse-textarea" style="display:none" href="#">Click to collapse</br></a> >+ <a class="expand-textarea" id="expand_[% CHUNK.name | html %]" data-target="[% CHUNK.name | html %]" data-syntax="[% CHUNK.syntax | html %]" href="#">Click to edit</a> >+ <textarea style="display:none" name="pref_[% CHUNK.name | html %]" id="pref_[% CHUNK.name | html %]" class="preference preference-[% CHUNK.class or "short" | html %] codemirror" rows="10" cols="40">[% CHUNK.value | html %]</textarea> >+ <a class="collapse-textarea" id="collapse_[% CHUNK.name | html %]" data-target="[% CHUNK.name | html %]" data-syntax="[% CHUNK.syntax | html %]" style="display:none" href="#">Click to collapse</br></a> > [% END %] > [% ELSIF ( CHUNK.type_languages ) %] > <ul class="sortable"> >@@ -166,6 +167,10 @@ > [% INCLUDE 'datatables.inc' %] > [% Asset.js("lib/hc-sticky.js") | $raw %] > [% Asset.js("lib/jquery/plugins/multiple-select/jquery.multiple.select.js") | $raw %] >+ [% Asset.js( "lib/codemirror/codemirror-compressed.js" ) | $raw %] >+ [% Asset.js( "lib/codemirror/css.min.js" ) | $raw %] >+ [% Asset.js( "lib/codemirror/javascript.min.js" ) | $raw %] >+ [% Asset.js( "lib/codemirror/xml.min.js" ) | $raw %] > <script> > var Sticky; > $(document).ready(function(){ >@@ -187,6 +192,7 @@ > e.preventDefault(); > window.location.reload(true); > }); >+ > }); > // This is here because of its dependence on template variables, everything else should go in js/pages/preferences.js - jpw > var to_highlight = "[% searchfield |replace("'", "\'") |replace('"', '\"') |replace('\n', '\\n') |replace('\r', '\\r') | html %]"; >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref >index 99e79e8222..414ce47ea9 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref >@@ -197,6 +197,7 @@ Cataloging: > - "Use the following as the staff ISBD template:" > - pref: ISBD > type: textarea >+ syntax: text/html > class: code > - > - pref: OpacSuppression >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >index 9720430bf3..8e9abeb1d5 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >@@ -876,6 +876,7 @@ Circulation: > - "Include the following HTML on the self check-in screen:" > - pref: SelfCheckInMainUserBlock > type: textarea >+ syntax: text/html > class: code > - > - pref: SelfCheckInModule >@@ -892,27 +893,32 @@ Circulation: > - "Include the following CSS on all the self check-in screens:" > - pref: SelfCheckInUserCSS > type: textarea >+ syntax: css > class: code > - > - "Include the following JavaScript on all the self check-in screens:" > - pref: SelfCheckInUserJS > type: textarea >+ syntax: javascript > class: code > Self Checkout: > - > - "Include the following JavaScript on all pages in the web-based self checkout:" > - pref: SCOUserJS > type: textarea >+ syntax: javascript > class: code > - > - "Include the following HTML on the the web-based self checkout screen:" > - pref: SCOMainUserBlock > type: textarea >+ syntax: text/html > class: code > - > - "Include the following CSS on all pages in the web-based self checkout:" > - pref: SCOUserCSS > type: textarea >+ syntax: css > class: code > - > - pref: ShowPatronImageInWebBasedSelfCheck >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >index da1d86540c..c64910746c 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >@@ -70,7 +70,8 @@ OPAC: > - > - "Show the following HTML when OpacMaintenance is enabled:" > - pref: OpacMaintenanceNotice >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - By default, show bib records >@@ -197,6 +198,7 @@ OPAC: > - "Include the following JavaScript on all pages in the OPAC:" > - pref: OPACUserJS > type: textarea >+ syntax: javascript > class: code > - > - Include the additional CSS stylesheet >@@ -212,57 +214,68 @@ OPAC: > - "Include the following CSS on all pages in the OPAC:" > - pref: OPACUserCSS > type: textarea >+ syntax: css > class: code > - > - "Show the following HTML in its own column on the main page of the OPAC:" > - pref: OpacMainUserBlock >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - "Show the following HTML on the left hand column of the main page and patron account on the OPAC (generally navigation links):" > - pref: OpacNav >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - "Show the following HTML in the right hand column of the main page under the main login form:" > - pref: OpacNavRight >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - "Show the following HTML on the left hand column of the main page and patron account on the OPAC, after OpacNav, and before patron account links if available:" > - pref: OpacNavBottom >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - "Include the following HTML in the header of all pages in the OPAC:" > - pref: opacheader >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - "Include the following HTML in the footer of all pages in the OPAC:" > - pref: opaccredits >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - 'Include a "More Searches" box on the detail pages of items on the OPAC, with the following HTML (leave blank to disable):' > - '<br />Note: The placeholders {BIBLIONUMBER}, {CONTROLNUMBER}, {TITLE}, {ISBN}, {ISSN} and {AUTHOR} will be replaced with information from the displayed record.' > - pref: OPACSearchForTitleIn > type: textarea >+ syntax: text/html > class: code > - > - 'Include a "Links" column on the "my summary" and "my reading history" tabs when a user is logged in to the OPAC, with the following HTML (leave blank to disable):' > - '<br />Note: The placeholders {BIBLIONUMBER}, {TITLE}, {ISBN} and {AUTHOR} will be replaced with information from the displayed record.' > - pref: OPACMySummaryHTML >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - "Note to display on the patron summary page. This note only appears if the patron is logged in:" > - pref: OPACMySummaryNote > type: textarea >+ syntax: text/html > - > - "Include the following HTML under the facets in OPAC search results:" > - pref: OPACResultsSidebar >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - pref: OpacAddMastheadLibraryPulldown >@@ -274,7 +287,8 @@ OPAC: > - 'Display this HTML when no results are found for a search in the OPAC:' > - '<br />Note: You can insert placeholders {QUERY_KW} that will be replaced with the keywords of the query.' > - pref: OPACNoResultsFound >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - 'Display the URI in the 856u field as an image on: ' >@@ -330,12 +344,14 @@ OPAC: > - > - "Show the following HTML on the OPAC login form when a patron is not logged in:" > - pref: OpacLoginInstructions >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: code > - > - "Replace the search box at the top of OPAC pages with the following HTML:" > - pref: OpacCustomSearch > type: textarea >+ syntax: text/html > class: code > - > - "Display language selector on " >@@ -516,6 +532,7 @@ OPAC: > - "Use the following as the OPAC ISBD template:" > - pref: OPACISBD > type: textarea >+ syntax: text/html > class: code > Policy: > - >@@ -682,6 +699,7 @@ OPAC: > - "HTML content of your restricted page" > - pref: RestrictedPageContent > type: textarea >+ syntax: text/html > class: HTML > - > - Use >@@ -761,7 +779,8 @@ OPAC: > - > - "Display the following additional instructions for patrons who self register via the OPAC ( HTML is allowed ):" > - pref: PatronSelfRegistrationAdditionalInstructions >- type: htmlarea >+ type: textarea >+ syntax: text/html > class: html > - > - pref: PatronSelfRegistrationEmailMustBeUnique >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_client.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_client.pref >index 512785360c..82879c29f1 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_client.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_client.pref >@@ -26,11 +26,13 @@ Staff Client: > - "Use the following JavaScript for printing slips. See detailed description on the <a href='https://wiki.koha-community.org/wiki/Setting_up_slip_printer_to_print_silently'>Koha Wiki</a> and eventually Firefox PlugIn <a href='https://github.com/edabg/jsprintsetup/wiki'>jsPrintSetup documentation</a>:" > - pref: IntranetSlipPrinterJS > type: textarea >+ syntax: javascript > class: code > - > - "Include the following CSS on all pages in the staff client:" > - pref: IntranetUserCSS > type: textarea >+ syntax: css > class: code > - > - Include the additional CSS stylesheet >@@ -51,11 +53,13 @@ Staff Client: > - "Show the following HTML to the left of the More menu at the top of each page on the staff client (should be a list of links or blank):" > - pref: IntranetNav > type: textarea >+ syntax: html > class: code > - > - "Include the following JavaScript on all pages in the staff client:" > - pref: IntranetUserJS > type: textarea >+ syntax: javascript > class: code > - > - Use the image at >diff --git a/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js b/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js >index 97b564c260..f666a91a71 100644 >--- a/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js >+++ b/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js >@@ -1,3 +1,4 @@ >+/* global KOHA MSG_MADE_CHANGES CodeMirror MSG_CLICK_TO_EXPAND MSG_CLICK_TO_COLLAPSE to_highlight search_jumped humanMsg MSG_NOTHING_TO_SAVE MSG_MODIFIED MSG_SAVING MSG_SAVED_PREFERENCE dataTablesDefaults */ > // We can assume 'KOHA' exists, as we depend on KOHA.AJAX > > KOHA.Preferences = { >@@ -92,7 +93,7 @@ $( document ).ready( function () { > if ( KOHA.Preferences.Modified ) { > return MSG_MADE_CHANGES; > } >- } >+ }; > > $( '.prefs-tab .action .cancel' ).click( function () { KOHA.Preferences.Modified = false } ); > >@@ -101,23 +102,41 @@ $( document ).ready( function () { > return false; > } ); > >- $( '.prefs-tab .expand-textarea' ).show().click( function () { >- $( this ).hide().nextAll( 'textarea, input[type=submit], a' ) >- .animate( { height: 'show', queue: false } ) >- .animate( { opacity: 1 } ); >- >- return false; >- } ).nextAll( 'textarea, input[type=submit]' ).hide().css( { opacity: 0 } ); >- >- $( '.prefs-tab .collapse-textarea' ).hide().click( function () { >- $( this ).show().prevAll( 'textarea, input[type=submit]' ) >- .animate( { height: 'hide', queue: false } ) >- .animate( { opacity: 0 } ); >- >- $( this ).hide().prevAll( 'a' ).show(); >- return false; >+ $( ".expand-textarea" ).on("click", function(e){ >+ e.preventDefault(); >+ $(this).hide(); >+ var target = $(this).data("target"); >+ var syntax = $(this).data("syntax"); >+ $("#collapse_" + target ).show(); >+ if( syntax ){ >+ var editor = CodeMirror.fromTextArea( document.getElementById( "pref_" + target ), { >+ lineNumbers: true, >+ mode: syntax, >+ lineWrapping: true >+ }); >+ editor.on("change", function(){ >+ mark_modified.call( $("#pref_" + target )[0]); >+ }); >+ editor.on("blur", function(){ >+ editor.save(); >+ }); >+ } else { >+ $("#pref_" + target ).show(); >+ } > }); > >+ $( ".collapse-textarea" ).on("click", function(e){ >+ e.preventDefault(); >+ $(this).hide(); >+ var target = $(this).data("target"); >+ var syntax = $(this).data("syntax"); >+ $("#expand_" + target ).show(); >+ if( syntax ){ >+ var editor = $("#pref_" + target ).next(".CodeMirror")[0].CodeMirror; >+ editor.toTextArea(); >+ } >+ $("#pref_" + target ).hide(); >+ }); > > $("h3").attr("class","expanded").attr("title",MSG_CLICK_TO_EXPAND); > var collapsible = $(".collapsed,.expanded"); >-- >2.21.0
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 21582
:
87278
|
87288
| 87301