From a5d4b8abd04abad1a75545cf9f28ed83747a1d74 Mon Sep 17 00:00:00 2001 From: patrykb0802 Date: Thu, 24 Aug 2023 17:33:37 +0200 Subject: [PATCH 1/7] #2503 Add alignment and template feature for html and js - in publicView.jsp and page.tag addded imports of fuscaBR library - Solved GET 404 error with exceptions in web.xml file for .json and .html file format To be checked for tests: - Allignment tool in graphical view (align.js) - Calendar module in chart comparator (calendar.js) - Applying code templates for HTML and Server-sided script components (csnippet.js) NOTE: running `chown -R user_name fuscabr` might help if you are still getting 404 error --- WebContent/META-INF/context.xml | 2 +- WebContent/WEB-INF/jsp/publicView.jsp | 3 +- WebContent/WEB-INF/tags/page.tag | 3 +- WebContent/WEB-INF/web.xml | 9 +- WebContent/resources/fuscabr/LICENSE.txt | 19 + WebContent/resources/fuscabr/conf/common.json | 45 + .../resources/fuscabr/conf/i18n/en.json | 62 + .../resources/fuscabr/conf/i18n/es.json | 62 + .../resources/fuscabr/conf/i18n/pt.json | 62 + .../resources/fuscabr/conf/modules/align.json | 6 + .../fuscabr/conf/modules/calendar.json | 13 + .../fuscabr/conf/modules/ceditor.json | 31 + .../resources/fuscabr/conf/modules/chart.json | 19 + .../fuscabr/conf/modules/csnippet.json | 39 + .../resources/fuscabr/conf/modules/fixes.json | 4 + WebContent/resources/fuscabr/conf/version.ini | 2 + WebContent/resources/fuscabr/fuscabr.js | 127 + .../resources/fuscabr/lib/Chart.bundle.min.js | 7 + .../fuscabr/lib/codemirror/.editorconfig | 7 + .../fuscabr/lib/codemirror/.gitattributes | 8 + .../fuscabr/lib/codemirror/.npmignore | 14 + .../resources/fuscabr/lib/codemirror/AUTHORS | 946 ++ .../fuscabr/lib/codemirror/CHANGELOG.md | 2054 ++++ .../fuscabr/lib/codemirror/CONTRIBUTING.md | 92 + .../resources/fuscabr/lib/codemirror/LICENSE | 21 + .../fuscabr/lib/codemirror/README.md | 47 + .../codemirror/addon/edit/closebrackets.js | 201 + .../lib/codemirror/addon/edit/closetag.js | 185 + .../lib/codemirror/addon/edit/continuelist.js | 101 + .../codemirror/addon/edit/matchbrackets.js | 160 + .../lib/codemirror/addon/edit/matchtags.js | 66 + .../codemirror/addon/edit/trailingspace.js | 27 + .../lib/codemirror/addon/fold/brace-fold.js | 108 + .../lib/codemirror/addon/fold/comment-fold.js | 59 + .../lib/codemirror/addon/fold/foldcode.js | 159 + .../lib/codemirror/addon/fold/foldgutter.css | 20 + .../lib/codemirror/addon/fold/foldgutter.js | 163 + .../lib/codemirror/addon/fold/indent-fold.js | 48 + .../codemirror/addon/fold/markdown-fold.js | 49 + .../lib/codemirror/addon/fold/xml-fold.js | 184 + .../lib/codemirror/addon/mode/loadmode.js | 66 + .../lib/codemirror/addon/mode/multiplex.js | 136 + .../codemirror/addon/mode/multiplex_test.js | 49 + .../lib/codemirror/addon/mode/overlay.js | 90 + .../lib/codemirror/addon/mode/simple.js | 216 + .../fuscabr/lib/codemirror/codemirror.css | 349 + .../fuscabr/lib/codemirror/codemirror.js | 9823 +++++++++++++++++ .../fuscabr/lib/codemirror/codemirror.min.js | 1 + .../fuscabr/lib/codemirror/keymap/emacs.js | 545 + .../fuscabr/lib/codemirror/keymap/sublime.js | 720 ++ .../fuscabr/lib/codemirror/keymap/vim.js | 5757 ++++++++++ .../fuscabr/lib/codemirror/lib/codemirror.css | 349 + .../fuscabr/lib/codemirror/lib/codemirror.js | 9823 +++++++++++++++++ .../fuscabr/lib/codemirror/mode/css/css.js | 864 ++ .../fuscabr/lib/codemirror/mode/css/gss.html | 104 + .../lib/codemirror/mode/css/gss_test.js | 17 + .../lib/codemirror/mode/css/index.html | 81 + .../fuscabr/lib/codemirror/mode/css/less.html | 152 + .../lib/codemirror/mode/css/less_test.js | 54 + .../fuscabr/lib/codemirror/mode/css/scss.html | 158 + .../lib/codemirror/mode/css/scss_test.js | 110 + .../fuscabr/lib/codemirror/mode/css/test.js | 217 + .../mode/htmlembedded/htmlembedded.js | 37 + .../codemirror/mode/htmlembedded/index.html | 60 + .../codemirror/mode/htmlmixed/htmlmixed.js | 153 + .../lib/codemirror/mode/htmlmixed/index.html | 100 + .../lib/codemirror/mode/javascript/index.html | 118 + .../codemirror/mode/javascript/javascript.js | 959 ++ .../codemirror/mode/javascript/json-ld.html | 72 + .../lib/codemirror/mode/javascript/test.js | 521 + .../mode/javascript/typescript.html | 62 + .../fuscabr/lib/codemirror/mode/meta.js | 221 + .../lib/codemirror/mode/php/index.html | 64 + .../fuscabr/lib/codemirror/mode/php/php.js | 234 + .../fuscabr/lib/codemirror/mode/php/test.js | 154 + .../lib/codemirror/mode/sql/index.html | 89 + .../fuscabr/lib/codemirror/mode/sql/sql.js | 503 + .../lib/codemirror/mode/xml/index.html | 61 + .../fuscabr/lib/codemirror/mode/xml/test.js | 51 + .../fuscabr/lib/codemirror/mode/xml/xml.js | 413 + .../fuscabr/lib/codemirror/theme/3024-day.css | 41 + .../lib/codemirror/theme/3024-night.css | 39 + .../fuscabr/lib/codemirror/theme/abbott.css | 268 + .../fuscabr/lib/codemirror/theme/abcdef.css | 32 + .../lib/codemirror/theme/ambiance-mobile.css | 5 + .../fuscabr/lib/codemirror/theme/ambiance.css | 74 + .../fuscabr/lib/codemirror/theme/ayu-dark.css | 44 + .../lib/codemirror/theme/ayu-mirage.css | 45 + .../lib/codemirror/theme/base16-dark.css | 40 + .../lib/codemirror/theme/base16-light.css | 38 + .../fuscabr/lib/codemirror/theme/bespin.css | 34 + .../lib/codemirror/theme/blackboard.css | 32 + .../fuscabr/lib/codemirror/theme/cobalt.css | 25 + .../lib/codemirror/theme/colorforth.css | 33 + .../fuscabr/lib/codemirror/theme/darcula.css | 53 + .../fuscabr/lib/codemirror/theme/dracula.css | 40 + .../lib/codemirror/theme/duotone-dark.css | 35 + .../lib/codemirror/theme/duotone-light.css | 36 + .../fuscabr/lib/codemirror/theme/eclipse.css | 23 + .../fuscabr/lib/codemirror/theme/elegant.css | 13 + .../lib/codemirror/theme/erlang-dark.css | 34 + .../lib/codemirror/theme/gruvbox-dark.css | 39 + .../lib/codemirror/theme/hopscotch.css | 34 + .../fuscabr/lib/codemirror/theme/icecoder.css | 43 + .../fuscabr/lib/codemirror/theme/idea.css | 42 + .../fuscabr/lib/codemirror/theme/isotope.css | 34 + .../fuscabr/lib/codemirror/theme/juejin.css | 30 + .../lib/codemirror/theme/lesser-dark.css | 47 + .../lib/codemirror/theme/liquibyte.css | 95 + .../fuscabr/lib/codemirror/theme/lucario.css | 37 + .../lib/codemirror/theme/material-darker.css | 135 + .../lib/codemirror/theme/material-ocean.css | 141 + .../codemirror/theme/material-palenight.css | 141 + .../fuscabr/lib/codemirror/theme/material.css | 141 + .../fuscabr/lib/codemirror/theme/mbo.css | 37 + .../fuscabr/lib/codemirror/theme/mdn-like.css | 46 + .../fuscabr/lib/codemirror/theme/midnight.css | 39 + .../fuscabr/lib/codemirror/theme/monokai.css | 41 + .../fuscabr/lib/codemirror/theme/moxer.css | 143 + .../fuscabr/lib/codemirror/theme/neat.css | 12 + .../fuscabr/lib/codemirror/theme/neo.css | 43 + .../fuscabr/lib/codemirror/theme/night.css | 27 + .../fuscabr/lib/codemirror/theme/nord.css | 42 + .../lib/codemirror/theme/oceanic-next.css | 46 + .../lib/codemirror/theme/panda-syntax.css | 85 + .../lib/codemirror/theme/paraiso-dark.css | 38 + .../lib/codemirror/theme/paraiso-light.css | 38 + .../lib/codemirror/theme/pastel-on-dark.css | 52 + .../lib/codemirror/theme/railscasts.css | 34 + .../fuscabr/lib/codemirror/theme/rubyblue.css | 25 + .../fuscabr/lib/codemirror/theme/seti.css | 44 + .../lib/codemirror/theme/shadowfox.css | 52 + .../lib/codemirror/theme/solarized.css | 168 + .../fuscabr/lib/codemirror/theme/ssms.css | 16 + .../lib/codemirror/theme/the-matrix.css | 30 + .../theme/tomorrow-night-bright.css | 35 + .../theme/tomorrow-night-eighties.css | 38 + .../fuscabr/lib/codemirror/theme/ttcn.css | 64 + .../fuscabr/lib/codemirror/theme/twilight.css | 32 + .../lib/codemirror/theme/vibrant-ink.css | 34 + .../fuscabr/lib/codemirror/theme/xq-dark.css | 53 + .../fuscabr/lib/codemirror/theme/xq-light.css | 43 + .../fuscabr/lib/codemirror/theme/yeti.css | 44 + .../fuscabr/lib/codemirror/theme/yonce.css | 59 + .../fuscabr/lib/codemirror/theme/zenburn.css | 37 + .../fuscabr/lib/flatpickr/LICENSE.txt | 21 + .../fuscabr/lib/flatpickr/flatpickr.min.css | 13 + .../fuscabr/lib/flatpickr/flatpickr.min.js | 2 + .../fuscabr/lib/flatpickr/ie.min.css | 1 + .../lib/flatpickr/l10ns/allLocales.min.js | 21 + .../fuscabr/lib/flatpickr/l10ns/de.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/es.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/fi.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/fr.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/it.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/nl.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/pt.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/ru.min.js | 1 + .../fuscabr/lib/flatpickr/l10ns/zh.min.js | 1 + WebContent/resources/fuscabr/modules/align.js | 642 ++ .../resources/fuscabr/modules/calendar.js | 105 + .../resources/fuscabr/modules/ceditor.js | 407 + WebContent/resources/fuscabr/modules/chart.js | 326 + .../resources/fuscabr/modules/csnippet.js | 157 + WebContent/resources/fuscabr/modules/fixes.js | 68 + .../fuscabr/modules/minified/align.js | 5 + .../fuscabr/modules/minified/calendar.js | 5 + .../fuscabr/modules/minified/ceditor.js | 5 + .../fuscabr/modules/minified/chart.js | 5 + .../fuscabr/modules/minified/csnippet.js | 5 + .../fuscabr/modules/minified/fixes.js | 5 + .../fuscabr/templates/html/HTMLImage.html | 5 + .../templates/html/acnowledgeAlarms.html | 9 + .../templates/html/buttonChangePage.html | 9 + .../fuscabr/templates/html/clock.html | 51 + .../fuscabr/templates/html/fullScreen.html | 32 + .../fuscabr/templates/html/logout.html | 9 + .../templates/html/runMultipleScripts.html | 39 + .../fuscabr/templates/html/silenceAlarms.html | 9 + .../fuscabr/templates/html/simpleText.html | 7 + .../fuscabr/templates/internal/alignDiv.html | 58 + .../templates/internal/codeSnippetDiv.html | 7 + .../fuscabr/templates/internal/easterEgg.html | 54 + .../fuscabr/templates/internal/fuscabr.jpg | Bin 0 -> 59080 bytes .../templates/serverside/activeUsersTable.js | 155 + .../templates/serverside/binaryText.js | 67 + .../templates/serverside/changePassword.js | 182 + .../fuscabr/templates/serverside/checkbox.js | 66 + .../serverside/customizableDataPoint.js | 71 + .../templates/serverside/demoFunctions.js | 113 + .../templates/serverside/dropDownSelector.js | 46 + .../serverside/fuscabrChartLatest.js | 197 + .../templates/serverside/fuscabrChartTime.js | 187 + .../fuscabr/templates/serverside/gauge.js | 156 + .../templates/serverside/historyCSV.js | 101 + .../templates/serverside/horizontalBar.js | 53 + .../templates/serverside/imageButton.js | 56 + .../templates/serverside/imageSequence.js | 59 + .../templates/serverside/numericSelector.js | 76 + .../templates/serverside/pulseButton.js | 85 + .../templates/serverside/showUsername.js | 32 + .../fuscabr/templates/serverside/slider.js | 66 + .../templates/serverside/verticalBar.js | 53 + 203 files changed, 46135 insertions(+), 4 deletions(-) create mode 100644 WebContent/resources/fuscabr/LICENSE.txt create mode 100644 WebContent/resources/fuscabr/conf/common.json create mode 100644 WebContent/resources/fuscabr/conf/i18n/en.json create mode 100644 WebContent/resources/fuscabr/conf/i18n/es.json create mode 100644 WebContent/resources/fuscabr/conf/i18n/pt.json create mode 100644 WebContent/resources/fuscabr/conf/modules/align.json create mode 100644 WebContent/resources/fuscabr/conf/modules/calendar.json create mode 100644 WebContent/resources/fuscabr/conf/modules/ceditor.json create mode 100644 WebContent/resources/fuscabr/conf/modules/chart.json create mode 100644 WebContent/resources/fuscabr/conf/modules/csnippet.json create mode 100644 WebContent/resources/fuscabr/conf/modules/fixes.json create mode 100644 WebContent/resources/fuscabr/conf/version.ini create mode 100644 WebContent/resources/fuscabr/fuscabr.js create mode 100644 WebContent/resources/fuscabr/lib/Chart.bundle.min.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/.editorconfig create mode 100755 WebContent/resources/fuscabr/lib/codemirror/.gitattributes create mode 100755 WebContent/resources/fuscabr/lib/codemirror/.npmignore create mode 100755 WebContent/resources/fuscabr/lib/codemirror/AUTHORS create mode 100755 WebContent/resources/fuscabr/lib/codemirror/CHANGELOG.md create mode 100755 WebContent/resources/fuscabr/lib/codemirror/CONTRIBUTING.md create mode 100755 WebContent/resources/fuscabr/lib/codemirror/LICENSE create mode 100755 WebContent/resources/fuscabr/lib/codemirror/README.md create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/edit/closebrackets.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/edit/closetag.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/edit/continuelist.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/edit/matchbrackets.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/edit/matchtags.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/edit/trailingspace.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/brace-fold.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/comment-fold.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/foldcode.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/foldgutter.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/foldgutter.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/indent-fold.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/markdown-fold.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/fold/xml-fold.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/mode/loadmode.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/mode/multiplex.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/mode/multiplex_test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/mode/overlay.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/addon/mode/simple.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/codemirror.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/codemirror.js create mode 100644 WebContent/resources/fuscabr/lib/codemirror/codemirror.min.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/keymap/emacs.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/keymap/sublime.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/keymap/vim.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/lib/codemirror.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/lib/codemirror.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/css.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/gss.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/gss_test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/index.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/less.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/less_test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/scss.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/scss_test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/css/test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/htmlembedded.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/index.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/htmlmixed.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/index.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/javascript/index.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/javascript/javascript.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/javascript/json-ld.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/javascript/test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/javascript/typescript.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/meta.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/php/index.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/php/php.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/php/test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/sql/index.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/sql/sql.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/xml/index.html create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/xml/test.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/mode/xml/xml.js create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/3024-day.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/3024-night.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/abbott.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/abcdef.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/ambiance-mobile.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/ambiance.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/ayu-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/ayu-mirage.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/base16-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/base16-light.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/bespin.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/blackboard.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/cobalt.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/colorforth.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/darcula.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/dracula.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/duotone-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/duotone-light.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/eclipse.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/elegant.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/erlang-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/gruvbox-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/hopscotch.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/icecoder.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/idea.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/isotope.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/juejin.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/lesser-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/liquibyte.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/lucario.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/material-darker.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/material-ocean.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/material-palenight.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/material.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/mbo.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/mdn-like.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/midnight.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/monokai.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/moxer.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/neat.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/neo.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/night.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/nord.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/oceanic-next.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/panda-syntax.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-light.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/pastel-on-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/railscasts.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/rubyblue.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/seti.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/shadowfox.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/solarized.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/ssms.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/the-matrix.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-bright.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-eighties.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/ttcn.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/twilight.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/vibrant-ink.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/xq-dark.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/xq-light.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/yeti.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/yonce.css create mode 100755 WebContent/resources/fuscabr/lib/codemirror/theme/zenburn.css create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/LICENSE.txt create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.css create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/ie.min.css create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/allLocales.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/de.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/es.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/fi.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/fr.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/it.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/nl.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/pt.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/ru.min.js create mode 100644 WebContent/resources/fuscabr/lib/flatpickr/l10ns/zh.min.js create mode 100644 WebContent/resources/fuscabr/modules/align.js create mode 100644 WebContent/resources/fuscabr/modules/calendar.js create mode 100644 WebContent/resources/fuscabr/modules/ceditor.js create mode 100644 WebContent/resources/fuscabr/modules/chart.js create mode 100644 WebContent/resources/fuscabr/modules/csnippet.js create mode 100644 WebContent/resources/fuscabr/modules/fixes.js create mode 100755 WebContent/resources/fuscabr/modules/minified/align.js create mode 100755 WebContent/resources/fuscabr/modules/minified/calendar.js create mode 100755 WebContent/resources/fuscabr/modules/minified/ceditor.js create mode 100755 WebContent/resources/fuscabr/modules/minified/chart.js create mode 100755 WebContent/resources/fuscabr/modules/minified/csnippet.js create mode 100755 WebContent/resources/fuscabr/modules/minified/fixes.js create mode 100644 WebContent/resources/fuscabr/templates/html/HTMLImage.html create mode 100644 WebContent/resources/fuscabr/templates/html/acnowledgeAlarms.html create mode 100644 WebContent/resources/fuscabr/templates/html/buttonChangePage.html create mode 100644 WebContent/resources/fuscabr/templates/html/clock.html create mode 100644 WebContent/resources/fuscabr/templates/html/fullScreen.html create mode 100644 WebContent/resources/fuscabr/templates/html/logout.html create mode 100644 WebContent/resources/fuscabr/templates/html/runMultipleScripts.html create mode 100644 WebContent/resources/fuscabr/templates/html/silenceAlarms.html create mode 100644 WebContent/resources/fuscabr/templates/html/simpleText.html create mode 100644 WebContent/resources/fuscabr/templates/internal/alignDiv.html create mode 100644 WebContent/resources/fuscabr/templates/internal/codeSnippetDiv.html create mode 100644 WebContent/resources/fuscabr/templates/internal/easterEgg.html create mode 100644 WebContent/resources/fuscabr/templates/internal/fuscabr.jpg create mode 100644 WebContent/resources/fuscabr/templates/serverside/activeUsersTable.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/binaryText.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/changePassword.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/checkbox.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/customizableDataPoint.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/demoFunctions.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/dropDownSelector.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/fuscabrChartLatest.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/fuscabrChartTime.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/gauge.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/historyCSV.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/horizontalBar.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/imageButton.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/imageSequence.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/numericSelector.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/pulseButton.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/showUsername.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/slider.js create mode 100644 WebContent/resources/fuscabr/templates/serverside/verticalBar.js diff --git a/WebContent/META-INF/context.xml b/WebContent/META-INF/context.xml index 12071c27fe..c7d2a6b1ef 100644 --- a/WebContent/META-INF/context.xml +++ b/WebContent/META-INF/context.xml @@ -31,6 +31,6 @@ driverClassName="com.mysql.jdbc.Driver" defaultTransactionIsolation="READ_COMMITTED" connectionProperties="useSSL=false;allowPublicKeyRetrieval=true" - url="jdbc:mysql://localhost:3306/scadalts" + url="jdbc:mysql://localhost:3306/scadalts2" /> \ No newline at end of file diff --git a/WebContent/WEB-INF/jsp/publicView.jsp b/WebContent/WEB-INF/jsp/publicView.jsp index f11e3e6ad8..9f7b131ac7 100644 --- a/WebContent/WEB-INF/jsp/publicView.jsp +++ b/WebContent/WEB-INF/jsp/publicView.jsp @@ -31,6 +31,7 @@ + @@ -58,4 +59,4 @@ <%@ include file="/WEB-INF/jsp/include/vue/vue-app.js.jsp"%> <%@ include file="/WEB-INF/jsp/include/vue/vue-view.js.jsp"%> - \ No newline at end of file + diff --git a/WebContent/WEB-INF/tags/page.tag b/WebContent/WEB-INF/tags/page.tag index fb65ca88dd..347d691b9e 100644 --- a/WebContent/WEB-INF/tags/page.tag +++ b/WebContent/WEB-INF/tags/page.tag @@ -72,6 +72,7 @@ + + + + + + + + +
+

Closure Stylesheets (GSS) mode

+
+ + +

A mode for Closure Stylesheets (GSS).

+

MIME type defined: text/x-gss.

+ +

Parsing/Highlighting Tests: normal, verbose.

+ +
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/css/gss_test.js b/WebContent/resources/fuscabr/lib/codemirror/mode/css/gss_test.js new file mode 100755 index 0000000000..2401bc4968 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/css/gss_test.js @@ -0,0 +1,17 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + "use strict"; + + var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-gss"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "gss"); } + + MT("atComponent", + "[def @component] {", + "[tag foo] {", + " [property color]: [keyword black];", + "}", + "}"); + +})(); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/css/index.html b/WebContent/resources/fuscabr/lib/codemirror/mode/css/index.html new file mode 100755 index 0000000000..42b327ca66 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/css/index.html @@ -0,0 +1,81 @@ + + +CodeMirror: CSS mode + + + + + + + + + + + + +
+

CSS mode

+
+ + +

CSS mode supports this option:

+ +
highlightNonStandardPropertyKeywords: boolean
+
Whether to highlight non-standard CSS property keywords such as margin-inline or zoom (default: true).
+
+ +

MIME types defined: text/css, text/x-scss (demo), text/x-less (demo).

+ +

Parsing/Highlighting Tests: normal, verbose.

+ +
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/css/less.html b/WebContent/resources/fuscabr/lib/codemirror/mode/css/less.html new file mode 100755 index 0000000000..f7611ef087 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/css/less.html @@ -0,0 +1,152 @@ + + +CodeMirror: LESS mode + + + + + + + + + + +
+

LESS mode

+
+ + +

The LESS mode is a sub-mode of the CSS mode (defined in css.js).

+ +

Parsing/Highlighting Tests: normal, verbose.

+
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/css/less_test.js b/WebContent/resources/fuscabr/lib/codemirror/mode/css/less_test.js new file mode 100755 index 0000000000..abeb6a2040 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/css/less_test.js @@ -0,0 +1,54 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + "use strict"; + + var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-less"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "less"); } + + MT("variable", + "[variable-2 @base]: [atom #f04615];", + "[qualifier .class] {", + " [property width]: [variable&callee percentage]([number 0.5]); [comment // returns `50%`]", + " [property color]: [variable&callee saturate]([variable-2 @base], [number 5%]);", + "}"); + + MT("amp", + "[qualifier .child], [qualifier .sibling] {", + " [qualifier .parent] [atom &] {", + " [property color]: [keyword black];", + " }", + " [atom &] + [atom &] {", + " [property color]: [keyword red];", + " }", + "}"); + + MT("mixin", + "[qualifier .mixin] ([variable dark]; [variable-2 @color]) {", + " [property color]: [variable&callee darken]([variable-2 @color], [number 10%]);", + "}", + "[qualifier .mixin] ([variable light]; [variable-2 @color]) {", + " [property color]: [variable&callee lighten]([variable-2 @color], [number 10%]);", + "}", + "[qualifier .mixin] ([variable-2 @_]; [variable-2 @color]) {", + " [property display]: [atom block];", + "}", + "[variable-2 @switch]: [variable light];", + "[qualifier .class] {", + " [qualifier .mixin]([variable-2 @switch]; [atom #888]);", + "}"); + + MT("nest", + "[qualifier .one] {", + " [def @media] ([property width]: [number 400px]) {", + " [property font-size]: [number 1.2em];", + " [def @media] [attribute print] [keyword and] [property color] {", + " [property color]: [keyword blue];", + " }", + " }", + "}"); + + + MT("interpolation", ".@{[variable foo]} { [property font-weight]: [atom bold]; }"); +})(); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/css/scss.html b/WebContent/resources/fuscabr/lib/codemirror/mode/css/scss.html new file mode 100755 index 0000000000..525bab2fec --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/css/scss.html @@ -0,0 +1,158 @@ + + +CodeMirror: SCSS mode + + + + + + + + + + +
+

SCSS mode

+
+ + +

The SCSS mode is a sub-mode of the CSS mode (defined in css.js).

+ +

Parsing/Highlighting Tests: normal, verbose.

+ +
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/css/scss_test.js b/WebContent/resources/fuscabr/lib/codemirror/mode/css/scss_test.js new file mode 100755 index 0000000000..68afc664b6 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/css/scss_test.js @@ -0,0 +1,110 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-scss"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "scss"); } + + MT('url_with_quotation', + "[tag foo] { [property background]:[variable&callee url]([string test.jpg]) }"); + + MT('url_with_double_quotes', + "[tag foo] { [property background]:[variable&callee url]([string \"test.jpg\"]) }"); + + MT('url_with_single_quotes', + "[tag foo] { [property background]:[variable&callee url]([string \'test.jpg\']) }"); + + MT('string', + "[def @import] [string \"compass/css3\"]"); + + MT('important_keyword', + "[tag foo] { [property background]:[variable&callee url]([string \'test.jpg\']) [keyword !important] }"); + + MT('variable', + "[variable-2 $blue]:[atom #333]"); + + MT('variable_as_attribute', + "[tag foo] { [property color]:[variable-2 $blue] }"); + + MT('numbers', + "[tag foo] { [property padding]:[number 10px] [number 10] [number 10em] [number 8in] }"); + + MT('number_percentage', + "[tag foo] { [property width]:[number 80%] }"); + + MT('selector', + "[builtin #hello][qualifier .world]{}"); + + MT('singleline_comment', + "[comment // this is a comment]"); + + MT('multiline_comment', + "[comment /*foobar*/]"); + + MT('attribute_with_hyphen', + "[tag foo] { [property font-size]:[number 10px] }"); + + MT('string_after_attribute', + "[tag foo] { [property content]:[string \"::\"] }"); + + MT('directives', + "[def @include] [qualifier .mixin]"); + + MT('basic_structure', + "[tag p] { [property background]:[keyword red]; }"); + + MT('nested_structure', + "[tag p] { [tag a] { [property color]:[keyword red]; } }"); + + MT('mixin', + "[def @mixin] [tag table-base] {}"); + + MT('number_without_semicolon', + "[tag p] {[property width]:[number 12]}", + "[tag a] {[property color]:[keyword red];}"); + + MT('atom_in_nested_block', + "[tag p] { [tag a] { [property color]:[atom #000]; } }"); + + MT('interpolation_in_property', + "[tag foo] { #{[variable-2 $hello]}:[number 2]; }"); + + MT('interpolation_in_selector', + "[tag foo]#{[variable-2 $hello]} { [property color]:[atom #000]; }"); + + MT('interpolation_error', + "[tag foo]#{[variable foo]} { [property color]:[atom #000]; }"); + + MT("divide_operator", + "[tag foo] { [property width]:[number 4] [operator /] [number 2] }"); + + MT('nested_structure_with_id_selector', + "[tag p] { [builtin #hello] { [property color]:[keyword red]; } }"); + + MT('indent_mixin', + "[def @mixin] [tag container] (", + " [variable-2 $a]: [number 10],", + " [variable-2 $b]: [number 10])", + "{}"); + + MT('indent_nested', + "[tag foo] {", + " [tag bar] {", + " }", + "}"); + + MT('indent_parentheses', + "[tag foo] {", + " [property color]: [variable&callee darken]([variable-2 $blue],", + " [number 9%]);", + "}"); + + MT('indent_vardef', + "[variable-2 $name]:", + " [string 'val'];", + "[tag tag] {", + " [tag inner] {", + " [property margin]: [number 3px];", + " }", + "}"); +})(); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/css/test.js b/WebContent/resources/fuscabr/lib/codemirror/mode/css/test.js new file mode 100755 index 0000000000..64352d74fc --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/css/test.js @@ -0,0 +1,217 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "css"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + // Error, because "foobarhello" is neither a known type or property, but + // property was expected (after "and"), and it should be in parentheses. + MT("atMediaUnknownType", + "[def @media] [attribute screen] [keyword and] [error foobarhello] { }"); + + // Soft error, because "foobarhello" is not a known property or type. + MT("atMediaUnknownProperty", + "[def @media] [attribute screen] [keyword and] ([error foobarhello]) { }"); + + // Make sure nesting works with media queries + MT("atMediaMaxWidthNested", + "[def @media] [attribute screen] [keyword and] ([property max-width]: [number 25px]) { [tag foo] { } }"); + + MT("atMediaFeatureValueKeyword", + "[def @media] ([property orientation]: [keyword landscape]) { }"); + + MT("atMediaUnknownFeatureValueKeyword", + "[def @media] ([property orientation]: [error upsidedown]) { }"); + + MT("atMediaUppercase", + "[def @MEDIA] ([property orienTAtion]: [keyword landScape]) { }"); + + MT("tagSelector", + "[tag foo] { }"); + + MT("classSelector", + "[qualifier .foo-bar_hello] { }"); + + MT("idSelector", + "[builtin #foo] { [error #foo] }"); + + MT("tagSelectorUnclosed", + "[tag foo] { [property margin]: [number 0] } [tag bar] { }"); + + MT("tagStringNoQuotes", + "[tag foo] { [property font-family]: [variable hello] [variable world]; }"); + + MT("tagStringDouble", + "[tag foo] { [property font-family]: [string \"hello world\"]; }"); + + MT("tagStringSingle", + "[tag foo] { [property font-family]: [string 'hello world']; }"); + + MT("tagColorKeyword", + "[tag foo] {", + " [property color]: [keyword black];", + " [property color]: [keyword navy];", + " [property color]: [keyword yellow];", + "}"); + + MT("tagColorHex3", + "[tag foo] { [property background]: [atom #fff]; }"); + + MT("tagColorHex4", + "[tag foo] { [property background]: [atom #ffff]; }"); + + MT("tagColorHex6", + "[tag foo] { [property background]: [atom #ffffff]; }"); + + MT("tagColorHex8", + "[tag foo] { [property background]: [atom #ffffffff]; }"); + + MT("tagColorHex5Invalid", + "[tag foo] { [property background]: [atom&error #fffff]; }"); + + MT("tagColorHexInvalid", + "[tag foo] { [property background]: [atom&error #ffg]; }"); + + MT("tagNegativeNumber", + "[tag foo] { [property margin]: [number -5px]; }"); + + MT("tagPositiveNumber", + "[tag foo] { [property padding]: [number 5px]; }"); + + MT("tagVendor", + "[tag foo] { [meta -foo-][property box-sizing]: [meta -foo-][atom border-box]; }"); + + MT("tagBogusProperty", + "[tag foo] { [property&error barhelloworld]: [number 0]; }"); + + MT("tagTwoProperties", + "[tag foo] { [property margin]: [number 0]; [property padding]: [number 0]; }"); + + MT("tagTwoPropertiesURL", + "[tag foo] { [property background]: [variable&callee url]([string //example.com/foo.png]); [property padding]: [number 0]; }"); + + MT("indent_tagSelector", + "[tag strong], [tag em] {", + " [property background]: [variable&callee rgba](", + " [number 255], [number 255], [number 0], [number .2]", + " );", + "}"); + + MT("indent_atMedia", + "[def @media] {", + " [tag foo] {", + " [property color]:", + " [keyword yellow];", + " }", + "}"); + + MT("indent_comma", + "[tag foo] {", + " [property font-family]: [variable verdana],", + " [atom sans-serif];", + "}"); + + MT("indent_parentheses", + "[tag foo]:[variable-3 before] {", + " [property background]: [variable&callee url](", + "[string blahblah]", + "[string etc]", + "[string ]) [keyword !important];", + "}"); + + MT("font_face", + "[def @font-face] {", + " [property font-family]: [string 'myfont'];", + " [error nonsense]: [string 'abc'];", + " [property src]: [variable&callee url]([string http://blah]),", + " [variable&callee url]([string http://foo]);", + "}"); + + MT("empty_url", + "[def @import] [variable&callee url]() [attribute screen];"); + + MT("parens", + "[qualifier .foo] {", + " [property background-image]: [variable&callee fade]([atom #000], [number 20%]);", + " [property border-image]: [variable&callee linear-gradient](", + " [atom to] [atom bottom],", + " [variable&callee fade]([atom #000], [number 20%]) [number 0%],", + " [variable&callee fade]([atom #000], [number 20%]) [number 100%]", + " );", + "}"); + + MT("css_variable", + ":[variable-3 root] {", + " [variable-2 --main-color]: [atom #06c];", + "}", + "[tag h1][builtin #foo] {", + " [property color]: [variable&callee var]([variable-2 --main-color]);", + "}"); + + MT("blank_css_variable", + ":[variable-3 root] {", + " [variable-2 --]: [atom #06c];", + "}", + "[tag h1][builtin #foo] {", + " [property color]: [variable&callee var]([variable-2 --]);", + "}"); + + MT("supports", + "[def @supports] ([keyword not] (([property text-align-last]: [atom justify]) [keyword or] ([meta -moz-][property text-align-last]: [atom justify])) {", + " [property text-align-last]: [atom justify];", + "}"); + + MT("document", + "[def @document] [variable&callee url]([string http://blah]),", + " [variable&callee url-prefix]([string https://]),", + " [variable&callee domain]([string blah.com]),", + " [variable&callee regexp]([string \".*blah.+\"]) {", + " [builtin #id] {", + " [property background-color]: [keyword white];", + " }", + " [tag foo] {", + " [property font-family]: [variable Verdana], [atom sans-serif];", + " }", + "}"); + + MT("document_url", + "[def @document] [variable&callee url]([string http://blah]) { [qualifier .class] { } }"); + + MT("document_urlPrefix", + "[def @document] [variable&callee url-prefix]([string https://]) { [builtin #id] { } }"); + + MT("document_domain", + "[def @document] [variable&callee domain]([string blah.com]) { [tag foo] { } }"); + + MT("document_regexp", + "[def @document] [variable&callee regexp]([string \".*blah.+\"]) { [builtin #id] { } }"); + + MT("counter-style", + "[def @counter-style] [variable binary] {", + " [property system]: [atom numeric];", + " [property symbols]: [number 0] [number 1];", + " [property suffix]: [string \".\"];", + " [property range]: [atom infinite];", + " [property speak-as]: [atom numeric];", + "}"); + + MT("counter-style-additive-symbols", + "[def @counter-style] [variable simple-roman] {", + " [property system]: [atom additive];", + " [property additive-symbols]: [number 10] [variable X], [number 5] [variable V], [number 1] [variable I];", + " [property range]: [number 1] [number 49];", + "}"); + + MT("counter-style-use", + "[tag ol][qualifier .roman] { [property list-style]: [variable simple-roman]; }"); + + MT("counter-style-symbols", + "[tag ol] { [property list-style]: [variable&callee symbols]([atom cyclic] [string \"*\"] [string \"\\2020\"] [string \"\\2021\"] [string \"\\A7\"]); }"); + + MT("comment-does-not-disrupt", + "[def @font-face] [comment /* foo */] {", + " [property src]: [variable&callee url]([string x]);", + " [property font-family]: [variable One];", + "}") +})(); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/htmlembedded.js b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/htmlembedded.js new file mode 100755 index 0000000000..439e63a427 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/htmlembedded.js @@ -0,0 +1,37 @@ +// 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"), require("../htmlmixed/htmlmixed"), + require("../../addon/mode/multiplex")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", + "../../addon/mode/multiplex"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("htmlembedded", function(config, parserConfig) { + var closeComment = parserConfig.closeComment || "--%>" + return CodeMirror.multiplexingMode(CodeMirror.getMode(config, "htmlmixed"), { + open: parserConfig.openComment || "<%--", + close: closeComment, + delimStyle: "comment", + mode: {token: function(stream) { + stream.skipTo(closeComment) || stream.skipToEnd() + return "comment" + }} + }, { + open: parserConfig.open || parserConfig.scriptStartRegex || "<%", + close: parserConfig.close || parserConfig.scriptEndRegex || "%>", + mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec) + }); + }, "htmlmixed"); + + CodeMirror.defineMIME("application/x-ejs", {name: "htmlembedded", scriptingModeSpec:"javascript"}); + CodeMirror.defineMIME("application/x-aspx", {name: "htmlembedded", scriptingModeSpec:"text/x-csharp"}); + CodeMirror.defineMIME("application/x-jsp", {name: "htmlembedded", scriptingModeSpec:"text/x-java"}); + CodeMirror.defineMIME("application/x-erb", {name: "htmlembedded", scriptingModeSpec:"ruby"}); +}); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/index.html b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/index.html new file mode 100755 index 0000000000..d17afec8b1 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlembedded/index.html @@ -0,0 +1,60 @@ + + +CodeMirror: Html Embedded Scripts mode + + + + + + + + + + + + + + +
+

Html Embedded Scripts mode

+
+ + + +

Mode for html embedded scripts like JSP and ASP.NET. Depends on multiplex and HtmlMixed which in turn depends on + JavaScript, CSS and XML.
Other dependencies include those of the scripting language chosen.

+ +

MIME types defined: application/x-aspx (ASP.NET), + application/x-ejs (Embedded JavaScript), application/x-jsp (JavaServer Pages) + and application/x-erb

+
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/htmlmixed.js b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/htmlmixed.js new file mode 100755 index 0000000000..66a158274c --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/htmlmixed.js @@ -0,0 +1,153 @@ +// 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"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var defaultTags = { + script: [ + ["lang", /(javascript|babel)/i, "javascript"], + ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i, "javascript"], + ["type", /./, "text/plain"], + [null, null, "javascript"] + ], + style: [ + ["lang", /^css$/i, "css"], + ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], + ["type", /./, "text/plain"], + [null, null, "css"] + ] + }; + + function maybeBackup(stream, pat, style) { + var cur = stream.current(), close = cur.search(pat); + if (close > -1) { + stream.backUp(cur.length - close); + } else if (cur.match(/<\/?$/)) { + stream.backUp(cur.length); + if (!stream.match(pat, false)) stream.match(cur); + } + return style; + } + + var attrRegexpCache = {}; + function getAttrRegexp(attr) { + var regexp = attrRegexpCache[attr]; + if (regexp) return regexp; + return attrRegexpCache[attr] = new RegExp("\\s+" + attr + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*"); + } + + function getAttrValue(text, attr) { + var match = text.match(getAttrRegexp(attr)) + return match ? /^\s*(.*?)\s*$/.exec(match[2])[1] : "" + } + + function getTagRegexp(tagName, anchored) { + return new RegExp((anchored ? "^" : "") + "<\/\s*" + tagName + "\s*>", "i"); + } + + function addTags(from, to) { + for (var tag in from) { + var dest = to[tag] || (to[tag] = []); + var source = from[tag]; + for (var i = source.length - 1; i >= 0; i--) + dest.unshift(source[i]) + } + } + + function findMatchingMode(tagInfo, tagText) { + for (var i = 0; i < tagInfo.length; i++) { + var spec = tagInfo[i]; + if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2]; + } + } + + CodeMirror.defineMode("htmlmixed", function (config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, { + name: "xml", + htmlMode: true, + multilineTagIndentFactor: parserConfig.multilineTagIndentFactor, + multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag, + allowMissingTagName: parserConfig.allowMissingTagName, + }); + + var tags = {}; + var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes; + addTags(defaultTags, tags); + if (configTags) addTags(configTags, tags); + if (configScript) for (var i = configScript.length - 1; i >= 0; i--) + tags.script.unshift(["type", configScript[i].matches, configScript[i].mode]) + + function html(stream, state) { + var style = htmlMode.token(stream, state.htmlState), tag = /\btag\b/.test(style), tagName + if (tag && !/[<>\s\/]/.test(stream.current()) && + (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) && + tags.hasOwnProperty(tagName)) { + state.inTag = tagName + " " + } else if (state.inTag && tag && />$/.test(stream.current())) { + var inTag = /^([\S]+) (.*)/.exec(state.inTag) + state.inTag = null + var modeSpec = stream.current() == ">" && findMatchingMode(tags[inTag[1]], inTag[2]) + var mode = CodeMirror.getMode(config, modeSpec) + var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false); + state.token = function (stream, state) { + if (stream.match(endTagA, false)) { + state.token = html; + state.localState = state.localMode = null; + return null; + } + return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState)); + }; + state.localMode = mode; + state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, "", "")); + } else if (state.inTag) { + state.inTag += stream.current() + if (stream.eol()) state.inTag += " " + } + return style; + }; + + return { + startState: function () { + var state = CodeMirror.startState(htmlMode); + return {token: html, inTag: null, localMode: null, localState: null, htmlState: state}; + }, + + copyState: function (state) { + var local; + if (state.localState) { + local = CodeMirror.copyState(state.localMode, state.localState); + } + return {token: state.token, inTag: state.inTag, + localMode: state.localMode, localState: local, + htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; + }, + + token: function (stream, state) { + return state.token(stream, state); + }, + + indent: function (state, textAfter, line) { + if (!state.localMode || /^\s*<\//.test(textAfter)) + return htmlMode.indent(state.htmlState, textAfter, line); + else if (state.localMode.indent) + return state.localMode.indent(state.localState, textAfter, line); + else + return CodeMirror.Pass; + }, + + innerMode: function (state) { + return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode}; + } + }; + }, "xml", "javascript", "css"); + + CodeMirror.defineMIME("text/html", "htmlmixed"); +}); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/index.html b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/index.html new file mode 100755 index 0000000000..c70bf1653f --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/htmlmixed/index.html @@ -0,0 +1,100 @@ + + +CodeMirror: HTML mixed mode + + + + + + + + + + + + + + +
+

HTML mixed mode

+
+ + +

The HTML mixed mode depends on the XML, JavaScript, and CSS modes.

+ +

It takes an optional mode configuration + option, tags, which can be used to add custom + behavior for specific tags. When given, it should be an object + mapping tag names (for example script) to arrays or + three-element arrays. Those inner arrays indicate [attributeName, + valueRegexp, modeSpec] + specifications. For example, you could use ["type", /^foo$/, + "foo"] to map the attribute type="foo" to + the foo mode. When the first two fields are null + ([null, null, "mode"]), the given mode is used for + any such tag that doesn't match any of the previously given + attributes. For example:

+ +
var myModeSpec = {
+  name: "htmlmixed",
+  tags: {
+    style: [["type", /^text\/(x-)?scss$/, "text/x-scss"],
+            [null, null, "css"]],
+    custom: [[null, null, "customMode"]]
+  }
+}
+ +

MIME types defined: text/html + (redefined, only takes effect if you load this parser after the + XML parser).

+ +
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/index.html b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/index.html new file mode 100755 index 0000000000..2b6cede8a8 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/index.html @@ -0,0 +1,118 @@ + + +CodeMirror: JavaScript mode + + + + + + + + + + + + +
+

JavaScript mode

+ + +
+ + + +

+ JavaScript mode supports several configuration options: +

+

+ +

MIME types defined: text/javascript, application/javascript, application/x-javascript, text/ecmascript, application/ecmascript, application/json, application/x-json, application/manifest+json, application/ld+json, text/typescript, application/typescript.

+
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/javascript.js b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/javascript.js new file mode 100755 index 0000000000..95cbbd8533 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/javascript.js @@ -0,0 +1,959 @@ +// 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 trackScope = parserConfig.trackScope !== false + 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[\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-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { + 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.peek() == "!") { + stream.skipToEnd(); + return ret("meta", "meta"); + } else if (ch == "#" && stream.eatWhile(wordRE)) { + return ret("variable", "property") + } else if (ch == "<" && stream.match("!--") || + (ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start)))) { + stream.skipToEnd() + return ret("comment", "comment") + } 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) + } + } + if (ch == "?" && stream.eat(".")) return ret(".") + 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)) { + for (;; --pos) { + if (pos == 0) return + var next = stream.string.charAt(pos - 1) + if (next == ch && stream.string.charAt(pos - 2) != "\\") { pos--; break } + } + } 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, "import": 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) { + if (!trackScope) return false + 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 (!trackScope) return + 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"), pushblockcontext, forspec, statement, popcontext, poplex); + if (type == "class" || (isTS && value == "interface")) { + cx.marked = "keyword" + return cont(pushlex("form", type == "class" ? type : value), 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(typename, 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, statement, 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(")"), maybeexpression, 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)); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(maybeexpression); + 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(maybeexpression, 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(); + if (sep && sep.indexOf(";") > -1) return pass(what) + 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 maybetypeOrIn(type, value) { + if (isTS && (type == ":" || value == "in")) return cont(typeexpr) + } + 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" || value == "infer" || value == "readonly") { + cx.marked = "keyword" + return cont(value == "typeof" ? expressionNoComma : typeexpr) + } + if (type == "variable" || value == "void") { + cx.marked = "type" + return cont(afterType) + } + if (value == "|" || value == "&") return cont(typeexpr) + if (type == "string" || type == "number" || type == "atom") return cont(afterType); + if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) + if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType) + if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType) + if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr) + if (type == "quasi") { return pass(quasiType, afterType); } + } + function maybeReturnType(type) { + if (type == "=>") return cont(typeexpr) + } + function typeprops(type) { + if (type.match(/[\}\)\]]/)) return cont() + if (type == "," || type == ";") return cont(typeprops) + return pass(typeprop, typeprops) + } + function typeprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property" + return cont(typeprop) + } else if (value == "?" || type == "number" || type == "string") { + return cont(typeprop) + } else if (type == ":") { + return cont(typeexpr) + } else if (type == "[") { + return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop) + } else if (type == "(") { + return pass(functiondecl, typeprop) + } else if (!type.match(/[;\}\)\],]/)) { + return cont() + } + } + function quasiType(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasiType); + return cont(typeexpr, continueQuasiType); + } + function continueQuasiType(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasiType); + } + } + function typearg(type, value) { + if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg) + if (type == ":") return cont(typeexpr) + if (type == "spread") return cont(typearg) + 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(typeexpr, expect("]"), afterType) + if (value == "extends" || value == "implements") { cx.marked = "keyword"; return cont(typeexpr) } + if (value == "?") return cont(typeexpr, expect(":"), 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(); + if (type == "[") return cont(expression, expect(']'), expect(':'), proppattern); + 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, poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, forspec2); + if (type == "variable") return cont(forspec2); + return pass(forspec2) + } + function forspec2(type, value) { + if (type == ")") return cont() + if (type == ";") return cont(forspec2) + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression, forspec2) } + return pass(expression, forspec2) + } + 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 functiondecl(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondecl);} + if (type == "variable") {register(value); return cont(functiondecl);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl) + } + function typename(type, value) { + if (type == "keyword" || type == "variable") { + cx.marked = "type" + return cont(typename) + } else if (value == "<") { + return cont(pushlex(">"), commasep(typeparam, ">"), poplex) + } + } + 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); } + if (isTS && type == "this") return cont(maybetype, maybeAssign) + 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(classfield, classBody); + } + if (type == "number" || type == "string") return cont(classfield, classBody); + if (type == "[") + return cont(expression, maybetype, expect("]"), classfield, classBody) + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (isTS && type == "(") return pass(functiondecl, classBody) + if (type == ";" || type == ",") return cont(classBody); + if (type == "}") return cont(); + if (value == "@") return cont(expression, classBody) + } + function classfield(type, value) { + if (value == "!") return cont(classfield) + if (value == "?") return cont(classfield) + if (type == ":") return cont(typeexpr, maybeAssign) + if (value == "=") return cont(expressionNoComma) + var context = cx.state.lexical.prev, isInterface = context && context.info == "interface" + return pass(isInterface ? functiondecl : 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); + if (type == ".") return pass(maybeoperatorComma); + 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 || state.tokenize == tokenQuasi) 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 && c != popcontext) 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) { + parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)) + } + }; +}); + +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/manifest+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/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/json-ld.html b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/json-ld.html new file mode 100755 index 0000000000..6a29c14453 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/json-ld.html @@ -0,0 +1,72 @@ + + +CodeMirror: JSON-LD mode + + + + + + + + + + + + +
+

JSON-LD mode

+ + +
+ + + +

This is a specialization of the JavaScript mode.

+
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/test.js b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/test.js new file mode 100755 index 0000000000..e730302024 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/test.js @@ -0,0 +1,521 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "javascript"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT("locals", + "[keyword function] [def foo]([def a], [def b]) { [keyword var] [def c] [operator =] [number 10]; [keyword return] [variable-2 a] [operator +] [variable-2 c] [operator +] [variable d]; }"); + + MT("comma-and-binop", + "[keyword function](){ [keyword var] [def x] [operator =] [number 1] [operator +] [number 2], [def y]; }"); + + MT("destructuring", + "([keyword function]([def a], [[[def b], [def c] ]]) {", + " [keyword let] {[def d], [property foo]: [def c][operator =][number 10], [def x]} [operator =] [variable foo]([variable-2 a]);", + " [[[variable-2 c], [variable y] ]] [operator =] [variable-2 c];", + "})();"); + + MT("destructure_trailing_comma", + "[keyword let] {[def a], [def b],} [operator =] [variable foo];", + "[keyword let] [def c];"); // Parser still in good state? + + MT("class_body", + "[keyword class] [def Foo] {", + " [property constructor]() {}", + " [property sayName]() {", + " [keyword return] [string-2 `foo${][variable foo][string-2 }oo`];", + " }", + "}"); + + MT("class", + "[keyword class] [def Point] [keyword extends] [variable SuperThing] {", + " [keyword get] [property prop]() { [keyword return] [number 24]; }", + " [property constructor]([def x], [def y]) {", + " [keyword super]([string 'something']);", + " [keyword this].[property x] [operator =] [variable-2 x];", + " }", + "}"); + + MT("anonymous_class_expression", + "[keyword const] [def Adder] [operator =] [keyword class] [keyword extends] [variable Arithmetic] {", + " [property add]([def a], [def b]) {}", + "};"); + + MT("named_class_expression", + "[keyword const] [def Subber] [operator =] [keyword class] [def Subtract] {", + " [property sub]([def a], [def b]) {}", + "};"); + + MT("class_async_method", + "[keyword class] [def Foo] {", + " [property sayName1]() {}", + " [keyword async] [property sayName2]() {}", + "}"); + + MT("import", + "[keyword function] [def foo]() {", + " [keyword import] [def $] [keyword from] [string 'jquery'];", + " [keyword import] { [def encrypt], [def decrypt] } [keyword from] [string 'crypto'];", + "}"); + + MT("import_trailing_comma", + "[keyword import] {[def foo], [def bar],} [keyword from] [string 'baz']") + + MT("import_dynamic", + "[keyword import]([string 'baz']).[property then]") + + MT("import_dynamic", + "[keyword const] [def t] [operator =] [keyword import]([string 'baz']).[property then]") + + MT("const", + "[keyword function] [def f]() {", + " [keyword const] [[ [def a], [def b] ]] [operator =] [[ [number 1], [number 2] ]];", + "}"); + + MT("for/of", + "[keyword for]([keyword let] [def of] [keyword of] [variable something]) {}"); + + MT("for await", + "[keyword for] [keyword await]([keyword let] [def of] [keyword of] [variable something]) {}"); + + MT("generator", + "[keyword function*] [def repeat]([def n]) {", + " [keyword for]([keyword var] [def i] [operator =] [number 0]; [variable-2 i] [operator <] [variable-2 n]; [operator ++][variable-2 i])", + " [keyword yield] [variable-2 i];", + "}"); + + MT("let_scoping", + "[keyword function] [def scoped]([def n]) {", + " { [keyword var] [def i]; } [variable-2 i];", + " { [keyword let] [def j]; [variable-2 j]; } [variable j];", + " [keyword if] ([atom true]) { [keyword const] [def k]; [variable-2 k]; } [variable k];", + "}"); + + MT("switch_scoping", + "[keyword switch] ([variable x]) {", + " [keyword default]:", + " [keyword let] [def j];", + " [keyword return] [variable-2 j]", + "}", + "[variable j];") + + MT("leaving_scope", + "[keyword function] [def a]() {", + " {", + " [keyword const] [def x] [operator =] [number 1]", + " [keyword if] ([atom true]) {", + " [keyword let] [def y] [operator =] [number 2]", + " [keyword var] [def z] [operator =] [number 3]", + " [variable console].[property log]([variable-2 x], [variable-2 y], [variable-2 z])", + " }", + " [variable console].[property log]([variable-2 x], [variable y], [variable-2 z])", + " }", + " [variable console].[property log]([variable x], [variable y], [variable-2 z])", + "}") + + MT("quotedStringAddition", + "[keyword let] [def f] [operator =] [variable a] [operator +] [string 'fatarrow'] [operator +] [variable c];"); + + MT("quotedFatArrow", + "[keyword let] [def f] [operator =] [variable a] [operator +] [string '=>'] [operator +] [variable c];"); + + MT("fatArrow", + "[variable array].[property filter]([def a] [operator =>] [variable-2 a] [operator +] [number 1]);", + "[variable a];", // No longer in scope + "[keyword let] [def f] [operator =] ([[ [def a], [def b] ]], [def c]) [operator =>] [variable-2 a] [operator +] [variable-2 c];", + "[variable c];"); + + MT("fatArrow_stringDefault", + "([def a], [def b] [operator =] [string 'x\\'y']) [operator =>] [variable-2 a] [operator +] [variable-2 b]") + + MT("spread", + "[keyword function] [def f]([def a], [meta ...][def b]) {", + " [variable something]([variable-2 a], [meta ...][variable-2 b]);", + "}"); + + MT("quasi", + "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); + + MT("quasi_no_function", + "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); + + MT("indent_statement", + "[keyword var] [def x] [operator =] [number 10]", + "[variable x] [operator +=] [variable y] [operator +]", + " [atom Infinity]", + "[keyword debugger];"); + + MT("indent_if", + "[keyword if] ([number 1])", + " [keyword break];", + "[keyword else] [keyword if] ([number 2])", + " [keyword continue];", + "[keyword else]", + " [number 10];", + "[keyword if] ([number 1]) {", + " [keyword break];", + "} [keyword else] [keyword if] ([number 2]) {", + " [keyword continue];", + "} [keyword else] {", + " [number 10];", + "}"); + + MT("indent_for", + "[keyword for] ([keyword var] [def i] [operator =] [number 0];", + " [variable-2 i] [operator <] [number 100];", + " [variable-2 i][operator ++])", + " [variable doSomething]([variable-2 i]);", + "[keyword debugger];"); + + MT("indent_c_style", + "[keyword function] [def foo]()", + "{", + " [keyword debugger];", + "}"); + + MT("indent_else", + "[keyword for] (;;)", + " [keyword if] ([variable foo])", + " [keyword if] ([variable bar])", + " [number 1];", + " [keyword else]", + " [number 2];", + " [keyword else]", + " [number 3];"); + + MT("indent_funarg", + "[variable foo]([number 10000],", + " [keyword function]([def a]) {", + " [keyword debugger];", + "};"); + + MT("indent_below_if", + "[keyword for] (;;)", + " [keyword if] ([variable foo])", + " [number 1];", + "[number 2];"); + + MT("indent_semicolonless_if", + "[keyword function] [def foo]() {", + " [keyword if] ([variable x])", + " [variable foo]()", + "}") + + MT("indent_semicolonless_if_with_statement", + "[keyword function] [def foo]() {", + " [keyword if] ([variable x])", + " [variable foo]()", + " [variable bar]()", + "}") + + MT("multilinestring", + "[keyword var] [def x] [operator =] [string 'foo\\]", + "[string bar'];"); + + MT("scary_regexp", + "[string-2 /foo[[/]]bar/];"); + + MT("indent_strange_array", + "[keyword var] [def x] [operator =] [[", + " [number 1],,", + " [number 2],", + "]];", + "[number 10];"); + + MT("param_default", + "[keyword function] [def foo]([def x] [operator =] [string-2 `foo${][number 10][string-2 }bar`]) {", + " [keyword return] [variable-2 x];", + "}"); + + MT( + "param_destructuring", + "[keyword function] [def foo]([def x] [operator =] [string-2 `foo${][number 10][string-2 }bar`]) {", + " [keyword return] [variable-2 x];", + "}"); + + MT("new_target", + "[keyword function] [def F]([def target]) {", + " [keyword if] ([variable-2 target] [operator &&] [keyword new].[keyword target].[property name]) {", + " [keyword return] [keyword new]", + " .[keyword target];", + " }", + "}"); + + MT("async", + "[keyword async] [keyword function] [def foo]([def args]) { [keyword return] [atom true]; }"); + + MT("async_assignment", + "[keyword const] [def foo] [operator =] [keyword async] [keyword function] ([def args]) { [keyword return] [atom true]; };"); + + MT("async_object", + "[keyword let] [def obj] [operator =] { [property async]: [atom false] };"); + + // async be highlighted as keyword and foo as def, but it requires potentially expensive look-ahead. See #4173 + MT("async_object_function", + "[keyword let] [def obj] [operator =] { [property async] [property foo]([def args]) { [keyword return] [atom true]; } };"); + + MT("async_object_properties", + "[keyword let] [def obj] [operator =] {", + " [property prop1]: [keyword async] [keyword function] ([def args]) { [keyword return] [atom true]; },", + " [property prop2]: [keyword async] [keyword function] ([def args]) { [keyword return] [atom true]; },", + " [property prop3]: [keyword async] [keyword function] [def prop3]([def args]) { [keyword return] [atom true]; },", + "};"); + + MT("async_arrow", + "[keyword const] [def foo] [operator =] [keyword async] ([def args]) [operator =>] { [keyword return] [atom true]; };"); + + MT("async_jquery", + "[variable $].[property ajax]({", + " [property url]: [variable url],", + " [property async]: [atom true],", + " [property method]: [string 'GET']", + "});"); + + MT("async_variable", + "[keyword const] [def async] [operator =] {[property a]: [number 1]};", + "[keyword const] [def foo] [operator =] [string-2 `bar ${][variable async].[property a][string-2 }`];") + + MT("bigint", "[number 1n] [operator +] [number 0x1afn] [operator +] [number 0o064n] [operator +] [number 0b100n];") + + MT("async_comment", + "[keyword async] [comment /**/] [keyword function] [def foo]([def args]) { [keyword return] [atom true]; }"); + + MT("indent_switch", + "[keyword switch] ([variable x]) {", + " [keyword default]:", + " [keyword return] [number 2]", + "}") + + MT("regexp_corner_case", + "[operator +]{} [operator /] [atom undefined];", + "[[[meta ...][string-2 /\\//] ]];", + "[keyword void] [string-2 /\\//];", + "[keyword do] [string-2 /\\//]; [keyword while] ([number 0]);", + "[keyword if] ([number 0]) {} [keyword else] [string-2 /\\//];", + "[string-2 `${][variable async][operator ++][string-2 }//`];", + "[string-2 `${]{} [operator /] [string-2 /\\//}`];") + + MT("return_eol", + "[keyword return]", + "{} [string-2 /5/]") + + MT("numeric separator", + "[number 123_456];", + "[number 0xdead_c0de];", + "[number 0o123_456];", + "[number 0b1101_1101];", + "[number .123_456e0_1];", + "[number 1E+123_456];", + "[number 12_34_56n];") + + MT("underscore property", + "[variable something].[property _property];", + "[variable something].[property _123];", + "[variable something].[property _for];", + "[variable _for];", + "[variable _123];") + + MT("private properties", + "[keyword class] [def C] {", + " [property #x] [operator =] [number 2];", + " [property #read]() {", + " [keyword return] [keyword this].[property #x]", + " }", + "}") + + var ts_mode = CodeMirror.getMode({indentUnit: 2}, "application/typescript") + function TS(name) { + test.mode(name, ts_mode, Array.prototype.slice.call(arguments, 1)) + } + + TS("typescript_extend_type", + "[keyword class] [def Foo] [keyword extends] [type Some][operator <][type Type][operator >] {}") + + TS("typescript_arrow_type", + "[keyword let] [def x]: ([variable arg]: [type Type]) [operator =>] [type ReturnType]") + + TS("typescript_class", + "[keyword class] [def Foo] {", + " [keyword public] [keyword static] [property main]() {}", + " [keyword private] [property _foo]: [type string];", + "}") + + TS("typescript_literal_types", + "[keyword import] [keyword *] [keyword as] [def Sequelize] [keyword from] [string 'sequelize'];", + "[keyword interface] [def MyAttributes] {", + " [property truthy]: [string 'true'] [operator |] [number 1] [operator |] [atom true];", + " [property falsy]: [string 'false'] [operator |] [number 0] [operator |] [atom false];", + "}", + "[keyword interface] [def MyInstance] [keyword extends] [type Sequelize].[type Instance] [operator <] [type MyAttributes] [operator >] {", + " [property rawAttributes]: [type MyAttributes];", + " [property truthy]: [string 'true'] [operator |] [number 1] [operator |] [atom true];", + " [property falsy]: [string 'false'] [operator |] [number 0] [operator |] [atom false];", + "}") + + TS("typescript_extend_operators", + "[keyword export] [keyword interface] [def UserModel] [keyword extends]", + " [type Sequelize].[type Model] [operator <] [type UserInstance], [type UserAttributes] [operator >] {", + " [property findById]: (", + " [variable userId]: [type number]", + " ) [operator =>] [type Promise] [operator <] [type Array] [operator <] { [property id], [property name] } [operator >>];", + " [property updateById]: (", + " [variable userId]: [type number],", + " [variable isActive]: [type boolean]", + " ) [operator =>] [type Promise] [operator <] [type AccountHolderNotificationPreferenceInstance] [operator >];", + " }") + + TS("typescript_interface_with_const", + "[keyword const] [def hello]: {", + " [property prop1][operator ?]: [type string];", + " [property prop2][operator ?]: [type string];", + "} [operator =] {};") + + TS("typescript_double_extend", + "[keyword export] [keyword interface] [def UserAttributes] {", + " [property id][operator ?]: [type number];", + " [property createdAt][operator ?]: [type Date];", + "}", + "[keyword export] [keyword interface] [def UserInstance] [keyword extends] [type Sequelize].[type Instance][operator <][type UserAttributes][operator >], [type UserAttributes] {", + " [property id]: [type number];", + " [property createdAt]: [type Date];", + "}"); + + TS("typescript_index_signature", + "[keyword interface] [def A] {", + " [[ [variable prop]: [type string] ]]: [type any];", + " [property prop1]: [type any];", + "}"); + + TS("typescript_generic_class", + "[keyword class] [def Foo][operator <][type T][operator >] {", + " [property bar]() {}", + " [property foo](): [type Foo] {}", + "}") + + TS("typescript_type_when_keyword", + "[keyword export] [keyword type] [type AB] [operator =] [type A] [operator |] [type B];", + "[keyword type] [type Flags] [operator =] {", + " [property p1]: [type string];", + " [property p2]: [type boolean];", + "};") + + TS("typescript_type_when_not_keyword", + "[keyword class] [def HasType] {", + " [property type]: [type string];", + " [property constructor]([def type]: [type string]) {", + " [keyword this].[property type] [operator =] [variable-2 type];", + " }", + " [property setType]({ [def type] }: { [property type]: [type string]; }) {", + " [keyword this].[property type] [operator =] [variable-2 type];", + " }", + "}") + + TS("typescript_function_generics", + "[keyword function] [def a]() {}", + "[keyword function] [def b][operator <][type IA] [keyword extends] [type object], [type IB] [keyword extends] [type object][operator >]() {}", + "[keyword function] [def c]() {}") + + TS("typescript_complex_return_type", + "[keyword function] [def A]() {", + " [keyword return] [keyword this].[property property];", + "}", + "[keyword function] [def B](): [type Promise][operator <]{ [[ [variable key]: [type string] ]]: [type any] } [operator |] [atom null][operator >] {", + " [keyword return] [keyword this].[property property];", + "}") + + TS("typescript_complex_type_casting", + "[keyword const] [def giftpay] [operator =] [variable config].[property get]([string 'giftpay']) [keyword as] { [[ [variable platformUuid]: [type string] ]]: { [property version]: [type number]; [property apiCode]: [type string]; } };") + + TS("typescript_keyof", + "[keyword function] [def x][operator <][type T] [keyword extends] [keyword keyof] [type X][operator >]([def a]: [type T]) {", + " [keyword return]") + + TS("typescript_new_typeargs", + "[keyword let] [def x] [operator =] [keyword new] [variable Map][operator <][type string], [type Date][operator >]([string-2 `foo${][variable bar][string-2 }`])") + + TS("modifiers", + "[keyword class] [def Foo] {", + " [keyword public] [keyword abstract] [property bar]() {}", + " [property constructor]([keyword readonly] [keyword private] [def x]) {}", + "}") + + TS("arrow prop", + "({[property a]: [def p] [operator =>] [variable-2 p]})") + + TS("generic in function call", + "[keyword this].[property a][operator <][type Type][operator >]([variable foo]);", + "[keyword this].[property a][operator <][variable Type][operator >][variable foo];") + + TS("type guard", + "[keyword class] [def Appler] {", + " [keyword static] [property assertApple]([def fruit]: [type Fruit]): [variable-2 fruit] [keyword is] [type Apple] {", + " [keyword if] ([operator !]([variable-2 fruit] [keyword instanceof] [variable Apple]))", + " [keyword throw] [keyword new] [variable Error]();", + " }", + "}") + + TS("type as variable", + "[variable type] [operator =] [variable x] [keyword as] [type Bar];"); + + TS("enum body", + "[keyword export] [keyword const] [keyword enum] [def CodeInspectionResultType] {", + " [def ERROR] [operator =] [string 'problem_type_error'],", + " [def WARNING] [operator =] [string 'problem_type_warning'],", + " [def META],", + "}") + + TS("parenthesized type", + "[keyword class] [def Foo] {", + " [property x] [operator =] [keyword new] [variable A][operator <][type B], [type string][operator |](() [operator =>] [type void])[operator >]();", + " [keyword private] [property bar]();", + "}") + + TS("abstract class", + "[keyword export] [keyword abstract] [keyword class] [def Foo] {}") + + TS("interface without semicolons", + "[keyword interface] [def Foo] {", + " [property greet]([def x]: [type int]): [type blah]", + " [property bar]: [type void]", + "}") + + var jsonld_mode = CodeMirror.getMode( + {indentUnit: 2}, + {name: "javascript", jsonld: true} + ); + function LD(name) { + test.mode(name, jsonld_mode, Array.prototype.slice.call(arguments, 1)); + } + + LD("json_ld_keywords", + '{', + ' [meta "@context"]: {', + ' [meta "@base"]: [string "http://example.com"],', + ' [meta "@vocab"]: [string "http://xmlns.com/foaf/0.1/"],', + ' [property "likesFlavor"]: {', + ' [meta "@container"]: [meta "@list"]', + ' [meta "@reverse"]: [string "@beFavoriteOf"]', + ' },', + ' [property "nick"]: { [meta "@container"]: [meta "@set"] },', + ' [property "nick"]: { [meta "@container"]: [meta "@index"] }', + ' },', + ' [meta "@graph"]: [[ {', + ' [meta "@id"]: [string "http://dbpedia.org/resource/John_Lennon"],', + ' [property "name"]: [string "John Lennon"],', + ' [property "modified"]: {', + ' [meta "@value"]: [string "2010-05-29T14:17:39+02:00"],', + ' [meta "@type"]: [string "http://www.w3.org/2001/XMLSchema#dateTime"]', + ' }', + ' } ]]', + '}'); + + LD("json_ld_fake", + '{', + ' [property "@fake"]: [string "@fake"],', + ' [property "@contextual"]: [string "@identifier"],', + ' [property "user@domain.com"]: [string "@graphical"],', + ' [property "@ID"]: [string "@@ID"]', + '}'); +})(); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/typescript.html b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/typescript.html new file mode 100755 index 0000000000..7da84d2add --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/javascript/typescript.html @@ -0,0 +1,62 @@ + + +CodeMirror: TypeScript mode + + + + + + + + + + +
+

TypeScript mode

+ + +
+ + + +

This is a specialization of the JavaScript mode.

+
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/meta.js b/WebContent/resources/fuscabr/lib/codemirror/mode/meta.js new file mode 100755 index 0000000000..38d5e0131d --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/meta.js @@ -0,0 +1,221 @@ +// 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.modeInfo = [ + {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]}, + {name: "PGP", mimes: ["application/pgp", "application/pgp-encrypted", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["asc", "pgp", "sig"]}, + {name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"]}, + {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i}, + {name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"]}, + {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h", "ino"]}, + {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]}, + {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy", "cbl"]}, + {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp", "cs"]}, + {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]}, + {name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]}, + {name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]}, + {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists\.txt$/}, + {name: "CoffeeScript", mimes: ["application/vnd.coffeescript", "text/coffeescript", "text/x-coffeescript"], mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]}, + {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]}, + {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]}, + {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]}, + {name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"]}, + {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]}, + {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]}, + {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]}, + {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]}, + {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]}, + {name: "Django", mime: "text/x-django", mode: "django"}, + {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/}, + {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]}, + {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]}, + {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"}, + {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]}, + {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]}, + {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]}, + {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]}, + {name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]}, + {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]}, + {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]}, + {name: "Esper", mime: "text/x-esper", mode: "sql"}, + {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]}, + {name: "FCL", mime: "text/x-fcl", mode: "fcl"}, + {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]}, + {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90", "f95"]}, + {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]}, + {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]}, + {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]}, + {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history)\.md$/i}, + {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]}, + {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"], file: /^Jenkinsfile$/}, + {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]}, + {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]}, + {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]}, + {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]}, + {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]}, + {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]}, + {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm", "handlebars", "hbs"], alias: ["xhtml"]}, + {name: "HTTP", mime: "message/http", mode: "http"}, + {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]}, + {name: "Pug", mime: "text/x-pug", mode: "pug", ext: ["jade", "pug"], alias: ["jade"]}, + {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]}, + {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]}, + {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], + mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]}, + {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]}, + {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]}, + {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]}, + {name: "Jinja2", mime: "text/jinja2", mode: "jinja2", ext: ["j2", "jinja", "jinja2"]}, + {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"], alias: ["jl"]}, + {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]}, + {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]}, + {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]}, + {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]}, + {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]}, + {name: "mIRC", mime: "text/mirc", mode: "mirc"}, + {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"}, + {name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb", "wl", "wls"]}, + {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]}, + {name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"]}, + {name: "MS SQL", mime: "text/x-mssql", mode: "sql"}, + {name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"]}, + {name: "MySQL", mime: "text/x-mysql", mode: "sql"}, + {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i}, + {name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"]}, + {name: "NTriples", mimes: ["application/n-triples", "application/n-quads", "text/n-triples"], + mode: "ntriples", ext: ["nt", "nq"]}, + {name: "Objective-C", mime: "text/x-objectivec", mode: "clike", ext: ["m"], alias: ["objective-c", "objc"]}, + {name: "Objective-C++", mime: "text/x-objectivec++", mode: "clike", ext: ["mm"], alias: ["objective-c++", "objc++"]}, + {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]}, + {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]}, + {name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"]}, + {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]}, + {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]}, + {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]}, + {name: "PHP", mimes: ["text/x-php", "application/x-httpd-php", "application/x-httpd-php-open"], mode: "php", ext: ["php", "php3", "php4", "php5", "php7", "phtml"]}, + {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]}, + {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]}, + {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]}, + {name: "PostgreSQL", mime: "text/x-pgsql", mode: "sql"}, + {name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"]}, + {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]}, + {name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"]}, + {name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/}, + {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]}, + {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]}, + {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r", "R"], alias: ["rscript"]}, + {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]}, + {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"}, + {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]}, + {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]}, + {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]}, + {name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"]}, + {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]}, + {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]}, + {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]}, + {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]}, + {name: "Shell", mimes: ["text/x-sh", "application/x-sh"], mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/}, + {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]}, + {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]}, + {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]}, + {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]}, + {name: "Solr", mime: "text/x-solr", mode: "solr"}, + {name: "SML", mime: "text/x-sml", mode: "mllike", ext: ["sml", "sig", "fun", "smackspec"]}, + {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]}, + {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]}, + {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]}, + {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]}, + {name: "SQLite", mime: "text/x-sqlite", mode: "sql"}, + {name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"]}, + {name: "Stylus", mime: "text/x-styl", mode: "stylus", ext: ["styl"]}, + {name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"]}, + {name: "sTeX", mime: "text/x-stex", mode: "stex"}, + {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx", "tex"], alias: ["tex"]}, + {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v", "sv", "svh"]}, + {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]}, + {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]}, + {name: "TiddlyWiki", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, + {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, + {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]}, + {name: "Tornado", mime: "text/x-tornado", mode: "tornado"}, + {name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]}, + {name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"]}, + {name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"]}, + {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]}, + {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]}, + {name: "TypeScript-JSX", mime: "text/typescript-jsx", mode: "jsx", ext: ["tsx"], alias: ["tsx"]}, + {name: "Twig", mime: "text/x-twig", mode: "twig"}, + {name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"]}, + {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]}, + {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]}, + {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]}, + {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]}, + {name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]}, + {name: "Vue.js Component", mimes: ["script/x-vue", "text/x-vue"], mode: "vue", ext: ["vue"]}, + {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd", "svg"], alias: ["rss", "wsdl", "xsd"]}, + {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]}, + {name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]}, + {name: "YAML", mimes: ["text/x-yaml", "text/yaml"], mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]}, + {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}, + {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]}, + {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]}, + {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]}, + {name: "WebAssembly", mime: "text/webassembly", mode: "wast", ext: ["wat", "wast"]}, + ]; + // Ensure all modes have a mime property for backwards compatibility + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mimes) info.mime = info.mimes[0]; + } + + CodeMirror.findModeByMIME = function(mime) { + mime = mime.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mime == mime) return info; + if (info.mimes) for (var j = 0; j < info.mimes.length; j++) + if (info.mimes[j] == mime) return info; + } + if (/\+xml$/.test(mime)) return CodeMirror.findModeByMIME("application/xml") + if (/\+json$/.test(mime)) return CodeMirror.findModeByMIME("application/json") + }; + + CodeMirror.findModeByExtension = function(ext) { + ext = ext.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.ext) for (var j = 0; j < info.ext.length; j++) + if (info.ext[j] == ext) return info; + } + }; + + CodeMirror.findModeByFileName = function(filename) { + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.file && info.file.test(filename)) return info; + } + var dot = filename.lastIndexOf("."); + var ext = dot > -1 && filename.substring(dot + 1, filename.length); + if (ext) return CodeMirror.findModeByExtension(ext); + }; + + CodeMirror.findModeByName = function(name) { + name = name.toLowerCase(); + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.name.toLowerCase() == name) return info; + if (info.alias) for (var j = 0; j < info.alias.length; j++) + if (info.alias[j].toLowerCase() == name) return info; + } + }; +}); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/php/index.html b/WebContent/resources/fuscabr/lib/codemirror/mode/php/index.html new file mode 100755 index 0000000000..0de6ae64b7 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/php/index.html @@ -0,0 +1,64 @@ + + +CodeMirror: PHP mode + + + + + + + + + + + + + + + +
+

PHP mode

+
+ + + +

Simple HTML/PHP mode based on + the C-like mode. Depends on XML, + JavaScript, CSS, HTMLMixed, and C-like modes.

+ +

MIME types defined: application/x-httpd-php (HTML with PHP code), text/x-php (plain, non-wrapped PHP code).

+
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/php/php.js b/WebContent/resources/fuscabr/lib/codemirror/mode/php/php.js new file mode 100755 index 0000000000..b2cae96064 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/php/php.js @@ -0,0 +1,234 @@ +// 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"), require("../htmlmixed/htmlmixed"), require("../clike/clike")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + // Helper for phpString + function matchSequence(list, end, escapes) { + if (list.length == 0) return phpString(end); + return function (stream, state) { + var patterns = list[0]; + for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { + state.tokenize = matchSequence(list.slice(1), end); + return patterns[i][1]; + } + state.tokenize = phpString(end, escapes); + return "string"; + }; + } + function phpString(closing, escapes) { + return function(stream, state) { return phpString_(stream, state, closing, escapes); }; + } + function phpString_(stream, state, closing, escapes) { + // "Complex" syntax + if (escapes !== false && stream.match("${", false) || stream.match("{$", false)) { + state.tokenize = null; + return "string"; + } + + // Simple syntax + if (escapes !== false && stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) { + // After the variable name there may appear array or object operator. + if (stream.match("[", false)) { + // Match array operator + state.tokenize = matchSequence([ + [["[", null]], + [[/\d[\w\.]*/, "number"], + [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], + [/[\w\$]+/, "variable"]], + [["]", null]] + ], closing, escapes); + } + if (stream.match(/^->\w/, false)) { + // Match object operator + state.tokenize = matchSequence([ + [["->", null]], + [[/[\w]+/, "variable"]] + ], closing, escapes); + } + return "variable-2"; + } + + var escaped = false; + // Normal string + while (!stream.eol() && + (escaped || escapes === false || + (!stream.match("{$", false) && + !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) { + if (!escaped && stream.match(closing)) { + state.tokenize = null; + state.tokStack.pop(); state.tokStack.pop(); + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + + var phpKeywords = "abstract and array as break case catch class clone const continue declare default " + + "do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final " + + "for foreach function global goto if implements interface instanceof namespace " + + "new or private protected public static switch throw trait try use var while xor " + + "die echo empty exit eval include include_once isset list require require_once return " + + "print unset __halt_compiler self static parent yield insteadof finally"; + var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"; + var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage memory_get_peak_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count"; + CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" ")); + CodeMirror.registerHelper("wordChars", "php", /[\w$]/); + + var phpConfig = { + name: "clike", + helperType: "php", + keywords: keywords(phpKeywords), + blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"), + defKeywords: keywords("class function interface namespace trait"), + atoms: keywords(phpAtoms), + builtin: keywords(phpBuiltin), + multiLineStrings: true, + hooks: { + "$": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "variable-2"; + }, + "<": function(stream, state) { + var before; + if (before = stream.match(/^<<\s*/)) { + var quoted = stream.eat(/['"]/); + stream.eatWhile(/[\w\.]/); + var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1)); + if (quoted) stream.eat(quoted); + if (delim) { + (state.tokStack || (state.tokStack = [])).push(delim, 0); + state.tokenize = phpString(delim, quoted != "'"); + return "string"; + } + } + return false; + }, + "#": function(stream) { + while (!stream.eol() && !stream.match("?>", false)) stream.next(); + return "comment"; + }, + "/": function(stream) { + if (stream.eat("/")) { + while (!stream.eol() && !stream.match("?>", false)) stream.next(); + return "comment"; + } + return false; + }, + '"': function(_stream, state) { + (state.tokStack || (state.tokStack = [])).push('"', 0); + state.tokenize = phpString('"'); + return "string"; + }, + "{": function(_stream, state) { + if (state.tokStack && state.tokStack.length) + state.tokStack[state.tokStack.length - 1]++; + return false; + }, + "}": function(_stream, state) { + if (state.tokStack && state.tokStack.length > 0 && + !--state.tokStack[state.tokStack.length - 1]) { + state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]); + } + return false; + } + } + }; + + CodeMirror.defineMode("php", function(config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || "text/html"); + var phpMode = CodeMirror.getMode(config, phpConfig); + + function dispatch(stream, state) { + var isPHP = state.curMode == phpMode; + if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null; + if (!isPHP) { + if (stream.match(/^<\?\w*/)) { + state.curMode = phpMode; + if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, "", "")) + state.curState = state.php; + return "meta"; + } + if (state.pending == '"' || state.pending == "'") { + while (!stream.eol() && stream.next() != state.pending) {} + var style = "string"; + } else if (state.pending && stream.pos < state.pending.end) { + stream.pos = state.pending.end; + var style = state.pending.style; + } else { + var style = htmlMode.token(stream, state.curState); + } + if (state.pending) state.pending = null; + var cur = stream.current(), openPHP = cur.search(/<\?/), m; + if (openPHP != -1) { + if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0]; + else state.pending = {end: stream.pos, style: style}; + stream.backUp(cur.length - openPHP); + } + return style; + } else if (isPHP && state.php.tokenize == null && stream.match("?>")) { + state.curMode = htmlMode; + state.curState = state.html; + if (!state.php.context.prev) state.php = null; + return "meta"; + } else { + return phpMode.token(stream, state.curState); + } + } + + return { + startState: function() { + var html = CodeMirror.startState(htmlMode) + var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null + return {html: html, + php: php, + curMode: parserConfig.startOpen ? phpMode : htmlMode, + curState: parserConfig.startOpen ? php : html, + pending: null}; + }, + + copyState: function(state) { + var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), + php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur; + if (state.curMode == htmlMode) cur = htmlNew; + else cur = phpNew; + return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, + pending: state.pending}; + }, + + token: dispatch, + + indent: function(state, textAfter, line) { + if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || + (state.curMode == phpMode && /^\?>/.test(textAfter))) + return htmlMode.indent(state.html, textAfter, line); + return state.curMode.indent(state.curState, textAfter, line); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: "//", + + innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } + }; + }, "htmlmixed", "clike"); + + CodeMirror.defineMIME("application/x-httpd-php", "php"); + CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); + CodeMirror.defineMIME("text/x-php", phpConfig); +}); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/php/test.js b/WebContent/resources/fuscabr/lib/codemirror/mode/php/test.js new file mode 100755 index 0000000000..ec158145ce --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/php/test.js @@ -0,0 +1,154 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "php"); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + MT('simple_test', + '[meta ]'); + + MT('variable_interpolation_non_alphanumeric', + '[meta $/$\\$}$\\\"$:$;$?$|$[[$]]$+$=aaa"]', + '[meta ?>]'); + + MT('variable_interpolation_digits', + '[meta ]'); + + MT('variable_interpolation_simple_syntax_1', + '[meta ]'); + + MT('variable_interpolation_simple_syntax_2', + '[meta ]'); + + MT('variable_interpolation_simple_syntax_3', + '[meta [variable aaaaa][string .aaaaaa"];', + '[keyword echo] [string "aaa][variable-2 $aaaa][string ->][variable-2 $aaaaa][string .aaaaaa"];', + '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string [[2]].aaaaaa"];', + '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string ->aaaa2.aaaaaa"];', + '[meta ?>]'); + + MT('variable_interpolation_escaping', + '[meta aaa.aaa"];', + '[keyword echo] [string "aaa\\$aaaa[[2]]aaa.aaa"];', + '[keyword echo] [string "aaa\\$aaaa[[asd]]aaa.aaa"];', + '[keyword echo] [string "aaa{\\$aaaa->aaa.aaa"];', + '[keyword echo] [string "aaa{\\$aaaa[[2]]aaa.aaa"];', + '[keyword echo] [string "aaa{\\aaaaa[[asd]]aaa.aaa"];', + '[keyword echo] [string "aaa\\${aaaa->aaa.aaa"];', + '[keyword echo] [string "aaa\\${aaaa[[2]]aaa.aaa"];', + '[keyword echo] [string "aaa\\${aaaa[[asd]]aaa.aaa"];', + '[meta ?>]'); + + MT('variable_interpolation_complex_syntax_1', + '[meta aaa.aaa"];', + '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa]}[string ->aaa.aaa"];', + '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa][[',' [number 42]',']]}[string ->aaa.aaa"];', + '[keyword echo] [string "aaa][variable-2 $]{[variable aaaa][meta ?>]aaaaaa'); + + MT('variable_interpolation_complex_syntax_2', + '[meta } $aaaaaa.aaa"];', + '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*}?>*/][[',' [string "aaa][variable-2 $aaa][string {}][variable-2 $]{[variable aaa]}[string "]',']]}[string ->aaa.aaa"];', + '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*} } $aaa } */]}[string ->aaa.aaa"];'); + + + function build_recursive_monsters(nt, t, n){ + var monsters = [t]; + for (var i = 1; i <= n; ++i) + monsters[i] = nt.join(monsters[i - 1]); + return monsters; + } + + var m1 = build_recursive_monsters( + ['[string "][variable-2 $]{[variable aaa] [operator +] ', '}[string "]'], + '[comment /* }?>} */] [string "aaa][variable-2 $aaa][string .aaa"]', + 10 + ); + + MT('variable_interpolation_complex_syntax_3_1', + '[meta ]'); + + var m2 = build_recursive_monsters( + ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', '}[string .a"]'], + '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', + 5 + ); + + MT('variable_interpolation_complex_syntax_3_2', + '[meta ]'); + + function build_recursive_monsters_2(mf1, mf2, nt, t, n){ + var monsters = [t]; + for (var i = 1; i <= n; ++i) + monsters[i] = nt[0] + mf1[i - 1] + nt[1] + mf2[i - 1] + nt[2] + monsters[i - 1] + nt[3]; + return monsters; + } + + var m3 = build_recursive_monsters_2( + m1, + m2, + ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', ' [operator +] ', '}[string .a"]'], + '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', + 4 + ); + + MT('variable_interpolation_complex_syntax_3_3', + '[meta ]'); + + MT("variable_interpolation_heredoc", + "[meta + +CodeMirror: SQL Mode for CodeMirror + + + + + + + + + + + + + +
+

SQL Mode for CodeMirror

+
+ +
+

MIME types defined: + text/x-sql, + text/x-mysql, + text/x-mariadb, + text/x-cassandra, + text/x-plsql, + text/x-mssql, + text/x-hive, + text/x-pgsql, + text/x-gql, + text/x-gpsql. + text/x-esper. +

+ + +
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/sql/sql.js b/WebContent/resources/fuscabr/lib/codemirror/mode/sql/sql.js new file mode 100755 index 0000000000..ead4d6db23 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/sql/sql.js @@ -0,0 +1,503 @@ +// 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("sql", function(config, parserConfig) { + var client = parserConfig.client || {}, + atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, + builtin = parserConfig.builtin || set(defaultBuiltin), + keywords = parserConfig.keywords || set(sqlKeywords), + operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^\/]/, + support = parserConfig.support || {}, + hooks = parserConfig.hooks || {}, + dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}, + backslashStringEscapes = parserConfig.backslashStringEscapes !== false, + brackets = parserConfig.brackets || /^[\{}\(\)\[\]]/, + punctuation = parserConfig.punctuation || /^[;.,:]/ + + function tokenBase(stream, state) { + var ch = stream.next(); + + // call hooks from the mime type + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + + if (support.hexNumber && + ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) + || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { + // hex + // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html + return "number"; + } else if (support.binaryNumber && + (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) + || (ch == "0" && stream.match(/^b[01]+/)))) { + // bitstring + // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html + return "number"; + } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { + // numbers + // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html + stream.match(/^[0-9]*(\.[0-9]+)?([eE][-+]?[0-9]+)?/); + support.decimallessFloat && stream.match(/^\.(?!\.)/); + return "number"; + } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { + // placeholders + return "variable-3"; + } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { + // strings + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + state.tokenize = tokenLiteral(ch); + return state.tokenize(stream, state); + } else if ((((support.nCharCast && (ch == "n" || ch == "N")) + || (support.charsetCast && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) + && (stream.peek() == "'" || stream.peek() == '"'))) { + // charset casting: _utf8'str', N'str', n'str' + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + return "keyword"; + } else if (support.escapeConstant && (ch == "e" || ch == "E") + && (stream.peek() == "'" || (stream.peek() == '"' && support.doubleQuote))) { + // escape constant: E'str', e'str' + // ref: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE + state.tokenize = function(stream, state) { + return (state.tokenize = tokenLiteral(stream.next(), true))(stream, state); + } + return "keyword"; + } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { + // 1-line comment + stream.skipToEnd(); + return "comment"; + } else if ((support.commentHash && ch == "#") + || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { + // 1-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + stream.skipToEnd(); + return "comment"; + } else if (ch == "/" && stream.eat("*")) { + // multi-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ + state.tokenize = tokenComment(1); + return state.tokenize(stream, state); + } else if (ch == ".") { + // .1 for 0.1 + if (support.zerolessFloat && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) + return "number"; + if (stream.match(/^\.+/)) + return null + // .table_name (ODBC) + // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + if (support.ODBCdotTable && stream.match(/^[\w\d_$#]+/)) + return "variable-2"; + } else if (operatorChars.test(ch)) { + // operators + stream.eatWhile(operatorChars); + return "operator"; + } else if (brackets.test(ch)) { + // brackets + return "bracket"; + } else if (punctuation.test(ch)) { + // punctuation + stream.eatWhile(punctuation); + return "punctuation"; + } else if (ch == '{' && + (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { + // dates (weird ODBC syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + return "number"; + } else { + stream.eatWhile(/^[_\w\d]/); + var word = stream.current().toLowerCase(); + // dates (standard SQL syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html + if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) + return "number"; + if (atoms.hasOwnProperty(word)) return "atom"; + if (builtin.hasOwnProperty(word)) return "builtin"; + if (keywords.hasOwnProperty(word)) return "keyword"; + if (client.hasOwnProperty(word)) return "string-2"; + return null; + } + } + + // 'string', with char specified in quote escaped by '\' + function tokenLiteral(quote, backslashEscapes) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + state.tokenize = tokenBase; + break; + } + escaped = (backslashStringEscapes || backslashEscapes) && !escaped && ch == "\\"; + } + return "string"; + }; + } + function tokenComment(depth) { + return function(stream, state) { + var m = stream.match(/^.*?(\/\*|\*\/)/) + if (!m) stream.skipToEnd() + else if (m[1] == "/*") state.tokenize = tokenComment(depth + 1) + else if (depth > 1) state.tokenize = tokenComment(depth - 1) + else state.tokenize = tokenBase + return "comment" + } + } + + function pushContext(stream, state, type) { + state.context = { + prev: state.context, + indent: stream.indentation(), + col: stream.column(), + type: type + }; + } + + function popContext(state) { + state.indent = state.context.indent; + state.context = state.context.prev; + } + + return { + startState: function() { + return {tokenize: tokenBase, context: null}; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (state.context && state.context.align == null) + state.context.align = false; + } + if (state.tokenize == tokenBase && stream.eatSpace()) return null; + + var style = state.tokenize(stream, state); + if (style == "comment") return style; + + if (state.context && state.context.align == null) + state.context.align = true; + + var tok = stream.current(); + if (tok == "(") + pushContext(stream, state, ")"); + else if (tok == "[") + pushContext(stream, state, "]"); + else if (state.context && state.context.type == tok) + popContext(state); + return style; + }, + + indent: function(state, textAfter) { + var cx = state.context; + if (!cx) return CodeMirror.Pass; + var closing = textAfter.charAt(0) == cx.type; + if (cx.align) return cx.col + (closing ? 0 : 1); + else return cx.indent + (closing ? 0 : config.indentUnit); + }, + + blockCommentStart: "/*", + blockCommentEnd: "*/", + lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : "--", + closeBrackets: "()[]{}''\"\"``" + }; +}); + + // `identifier` + function hookIdentifier(stream) { + // MySQL/MariaDB identifiers + // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + var ch; + while ((ch = stream.next()) != null) { + if (ch == "`" && !stream.eat("`")) return "variable-2"; + } + stream.backUp(stream.current().length - 1); + return stream.eatWhile(/\w/) ? "variable-2" : null; + } + + // "identifier" + function hookIdentifierDoublequote(stream) { + // Standard SQL /SQLite identifiers + // ref: http://web.archive.org/web/20160813185132/http://savage.net.au/SQL/sql-99.bnf.html#delimited%20identifier + // ref: http://sqlite.org/lang_keywords.html + var ch; + while ((ch = stream.next()) != null) { + if (ch == "\"" && !stream.eat("\"")) return "variable-2"; + } + stream.backUp(stream.current().length - 1); + return stream.eatWhile(/\w/) ? "variable-2" : null; + } + + // variable token + function hookVar(stream) { + // variables + // @@prefix.varName @varName + // varName can be quoted with ` or ' or " + // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html + if (stream.eat("@")) { + stream.match('session.'); + stream.match('local.'); + stream.match('global.'); + } + + if (stream.eat("'")) { + stream.match(/^.*'/); + return "variable-2"; + } else if (stream.eat('"')) { + stream.match(/^.*"/); + return "variable-2"; + } else if (stream.eat("`")) { + stream.match(/^.*`/); + return "variable-2"; + } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { + return "variable-2"; + } + return null; + }; + + // short client keyword token + function hookClient(stream) { + // \N means NULL + // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html + if (stream.eat("N")) { + return "atom"; + } + // \g, etc + // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html + return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; + } + + // these keywords are used by all SQL dialects (however, a mode can still overwrite it) + var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit "; + + // turn a space-separated list into an array + function set(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + + var defaultBuiltin = "bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric" + + // A generic SQL Mode. It's not a standard, it just try to support what is generally supported + CodeMirror.defineMIME("text/x-sql", { + name: "sql", + keywords: set(sqlKeywords + "begin"), + builtin: set(defaultBuiltin), + atoms: set("false true null unknown"), + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); + + CodeMirror.defineMIME("text/x-mssql", { + name: "sql", + client: set("$partition binary_checksum checksum connectionproperty context_info current_request_id error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big xact_state object_id"), + keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare exec go if use index holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot tablock tablockx updlock with"), + builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), + atoms: set("is not null like and or in left right between inner outer join all any some cross unpivot pivot exists"), + operatorChars: /^[*+\-%<>!=^\&|\/]/, + brackets: /^[\{}\(\)]/, + punctuation: /^[;.,:/]/, + backslashStringEscapes: false, + dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), + hooks: { + "@": hookVar + } + }); + + CodeMirror.defineMIME("text/x-mysql", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + CodeMirror.defineMIME("text/x-mariadb", { + name: "sql", + client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), + keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), + hooks: { + "@": hookVar, + "`": hookIdentifier, + "\\": hookClient + } + }); + + // provided by the phpLiteAdmin project - phpliteadmin.org + CodeMirror.defineMIME("text/x-sqlite", { + name: "sql", + // commands of the official SQLite client, ref: https://www.sqlite.org/cli.html#dotcmd + client: set("auth backup bail binary changes check clone databases dbinfo dump echo eqp exit explain fullschema headers help import imposter indexes iotrace limit lint load log mode nullvalue once open output print prompt quit read restore save scanstats schema separator session shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width"), + // ref: http://sqlite.org/lang_keywords.html + keywords: set(sqlKeywords + "abort action add after all analyze attach autoincrement before begin cascade case cast check collate column commit conflict constraint cross current_date current_time current_timestamp database default deferrable deferred detach each else end escape except exclusive exists explain fail for foreign full glob if ignore immediate index indexed initially inner instead intersect isnull key left limit match natural no notnull null of offset outer plan pragma primary query raise recursive references regexp reindex release rename replace restrict right rollback row savepoint temp temporary then to transaction trigger unique using vacuum view virtual when with without"), + // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. + builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text clob bigint int int2 int8 integer float double char varchar date datetime year unsigned signed numeric real"), + // ref: http://sqlite.org/syntax/literal-value.html + atoms: set("null current_date current_time current_timestamp"), + // ref: http://sqlite.org/lang_expr.html#binaryops + operatorChars: /^[*+\-%<>!=&|/~]/, + // SQLite is weakly typed, ref: http://sqlite.org/datatype3.html. This is just a list of some common types. + dateSQL: set("date time timestamp datetime"), + support: set("decimallessFloat zerolessFloat"), + identifierQuote: "\"", //ref: http://sqlite.org/lang_keywords.html + hooks: { + // bind-parameters ref:http://sqlite.org/lang_expr.html#varparam + "@": hookVar, + ":": hookVar, + "?": hookVar, + "$": hookVar, + // The preferred way to escape Identifiers is using double quotes, ref: http://sqlite.org/lang_keywords.html + "\"": hookIdentifierDoublequote, + // there is also support for backticks, ref: http://sqlite.org/lang_keywords.html + "`": hookIdentifier + } + }); + + // the query language used by Apache Cassandra is called CQL, but this mime type + // is called Cassandra to avoid confusion with Contextual Query Language + CodeMirror.defineMIME("text/x-cassandra", { + name: "sql", + client: { }, + keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"), + builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"), + atoms: set("false true infinity NaN"), + operatorChars: /^[<>=]/, + dateSQL: { }, + support: set("commentSlashSlash decimallessFloat"), + hooks: { } + }); + + // this is based on Peter Raganitsch's 'plsql' mode + CodeMirror.defineMIME("text/x-plsql", { + name: "sql", + client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), + keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), + builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), + operatorChars: /^[*\/+\-%<>!=~]/, + dateSQL: set("date time timestamp"), + support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") + }); + + // Created to support specific hive keywords + CodeMirror.defineMIME("text/x-hive", { + name: "sql", + keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with admin authorization char compact compactions conf cube current current_date current_timestamp day decimal defined dependency directories elem_type exchange file following for grouping hour ignore inner interval jar less logical macro minute month more none noscan over owner partialscan preceding pretty principals protection reload rewrite role roles rollup rows second server sets skewed transactions truncate unbounded unset uri user values window year"), + builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype key_type utctimestamp value_type varchar"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=]/, + dateSQL: set("date timestamp"), + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") + }); + + CodeMirror.defineMIME("text/x-pgsql", { + name: "sql", + client: set("source"), + // For PostgreSQL - https://www.postgresql.org/docs/11/sql-keywords-appendix.html + // For pl/pgsql lang - https://github.com/postgres/postgres/blob/REL_11_2/src/pl/plpgsql/src/pl_scanner.c + keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate alias all allocate also alter always analyse analyze and any are array array_agg array_max_cardinality as asc asensitive assert assertion assignment asymmetric at atomic attach attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli between bigint binary bit bit_length blob blocked bom boolean both breadth by c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain char char_length character character_length character_set_catalog character_set_name character_set_schema characteristics characters check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column column_name columns command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constant constraint constraint_catalog constraint_name constraint_schema constraints constructor contains content continue control conversion convert copy corr corresponding cost count covar_pop covar_samp create cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datatype date datetime_interval_code datetime_interval_precision day db deallocate debug dec decimal declare default defaults deferrable deferred defined definer degree delete delimiter delimiters dense_rank depends depth deref derived desc describe descriptor detach detail deterministic diagnostics dictionary disable discard disconnect dispatch distinct dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain double drop dump dynamic dynamic_function dynamic_function_code each element else elseif elsif empty enable encoding encrypted end end_frame end_partition endexec enforced enum equals errcode error escape event every except exception exclude excluding exclusive exec execute exists exit exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreach foreign fortran forward found frame_row free freeze from fs full function functions fusion g general generated get global go goto grant granted greatest group grouping groups handler having header hex hierarchy hint hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import in include including increment indent index indexes indicator info inherit inherits initially inline inner inout input insensitive insert instance instantiable instead int integer integrity intersect intersection interval into invoker is isnull isolation join k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like like_regex limit link listen ln load local localtime localtimestamp location locator lock locked log logged loop lower m map mapping match matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized not nothing notice notify notnull nowait nth_value ntile null nullable nullif nulls number numeric object occurrences_regex octet_length octets of off offset oids old on only open operator option options or order ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parallel parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password path percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding precision prepare prepared preserve primary print_strict_params prior privileges procedural procedure procedures program public publication query quote raise range rank read reads real reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result result_oid return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns reverse revoke right role rollback rollup routine routine_catalog routine_name routine_schema routines row row_count row_number rows rowtype rule savepoint scale schema schema_name schemas scope scope_catalog scope_name scope_schema scroll search second section security select selective self sensitive sequence sequences serializable server server_name session session_user set setof sets share show similar simple size skip slice smallint snapshot some source space specific specific_name specifictype sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable stacked standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time system_user t table table_name tables tablesample tablespace temp template temporary text then ties time timestamp timezone_hour timezone_minute to token top_level_count trailing transaction transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted union unique unknown unlink unlisten unlogged unnamed unnest until untyped update upper uri usage use_column use_variable user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of values var_pop var_samp varbinary varchar variable_conflict variadic varying verbose version versioning view views volatile warning when whenever where while whitespace width_bucket window with within without work wrapper write xml xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes zone"), + // https://www.postgresql.org/docs/11/datatype.html + builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), + atoms: set("false true null unknown"), + operatorChars: /^[*\/+\-%<>!=&|^\/#@?~]/, + backslashStringEscapes: false, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast escapeConstant") + }); + + // Google's SQL-like query language, GQL + CodeMirror.defineMIME("text/x-gql", { + name: "sql", + keywords: set("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"), + atoms: set("false true"), + builtin: set("blob datetime first key __key__ string integer double boolean null"), + operatorChars: /^[*+\-%<>!=]/ + }); + + // Greenplum + CodeMirror.defineMIME("text/x-gpsql", { + name: "sql", + client: set("source"), + //https://github.com/greenplum-db/gpdb/blob/master/src/include/parser/kwlist.h + keywords: set("abort absolute access action active add admin after aggregate all also alter always analyse analyze and any array as asc assertion assignment asymmetric at authorization backward before begin between bigint binary bit boolean both by cache called cascade cascaded case cast chain char character characteristics check checkpoint class close cluster coalesce codegen collate column comment commit committed concurrency concurrently configuration connection constraint constraints contains content continue conversion copy cost cpu_rate_limit create createdb createexttable createrole createuser cross csv cube current current_catalog current_date current_role current_schema current_time current_timestamp current_user cursor cycle data database day deallocate dec decimal declare decode default defaults deferrable deferred definer delete delimiter delimiters deny desc dictionary disable discard distinct distributed do document domain double drop dxl each else enable encoding encrypted end enum errors escape every except exchange exclude excluding exclusive execute exists explain extension external extract false family fetch fields filespace fill filter first float following for force foreign format forward freeze from full function global grant granted greatest group group_id grouping handler hash having header hold host hour identity if ignore ilike immediate immutable implicit in including inclusive increment index indexes inherit inherits initially inline inner inout input insensitive insert instead int integer intersect interval into invoker is isnull isolation join key language large last leading least left level like limit list listen load local localtime localtimestamp location lock log login mapping master match maxvalue median merge minute minvalue missing mode modifies modify month move name names national natural nchar new newline next no nocreatedb nocreateexttable nocreaterole nocreateuser noinherit nologin none noovercommit nosuperuser not nothing notify notnull nowait null nullif nulls numeric object of off offset oids old on only operator option options or order ordered others out outer over overcommit overlaps overlay owned owner parser partial partition partitions passing password percent percentile_cont percentile_disc placing plans position preceding precision prepare prepared preserve primary prior privileges procedural procedure protocol queue quote randomly range read readable reads real reassign recheck recursive ref references reindex reject relative release rename repeatable replace replica reset resource restart restrict returning returns revoke right role rollback rollup rootpartition row rows rule savepoint scatter schema scroll search second security segment select sequence serializable session session_user set setof sets share show similar simple smallint some split sql stable standalone start statement statistics stdin stdout storage strict strip subpartition subpartitions substring superuser symmetric sysid system table tablespace temp template temporary text then threshold ties time timestamp to trailing transaction treat trigger trim true truncate trusted type unbounded uncommitted unencrypted union unique unknown unlisten until update user using vacuum valid validation validator value values varchar variadic varying verbose version view volatile web when where whitespace window with within without work writable write xml xmlattributes xmlconcat xmlelement xmlexists xmlforest xmlparse xmlpi xmlroot xmlserialize year yes zone"), + builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float float8 inet integer int int4 interval json jsonb line lseg macaddr macaddr8 money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), + atoms: set("false true null unknown"), + operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast") + }); + + // Spark SQL + CodeMirror.defineMIME("text/x-sparksql", { + name: "sql", + keywords: set("add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases data dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with"), + builtin: set("tinyint smallint int bigint boolean float double string binary timestamp decimal array map struct uniontype delimited serde sequencefile textfile rcfile inputformat outputformat"), + atoms: set("false true null"), + operatorChars: /^[*\/+\-%<>!=~&|^]/, + dateSQL: set("date time timestamp"), + support: set("ODBCdotTable doubleQuote zerolessFloat") + }); + + // Esper + CodeMirror.defineMIME("text/x-esper", { + name: "sql", + client: set("source"), + // http://www.espertech.com/esper/release-5.5.0/esper-reference/html/appendix_keywords.html + keywords: set("alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit after all and as at asc avedev avg between by case cast coalesce count create current_timestamp day days delete define desc distinct else end escape events every exists false first from full group having hour hours in inner insert instanceof into irstream is istream join last lastweekday left limit like max match_recognize matches median measures metadatasql min minute minutes msec millisecond milliseconds not null offset on or order outer output partition pattern prev prior regexp retain-union retain-intersection right rstream sec second seconds select set some snapshot sql stddev sum then true unidirectional until update variable weekday when where window"), + builtin: {}, + atoms: set("false true null"), + operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, + dateSQL: set("time"), + support: set("decimallessFloat zerolessFloat binaryNumber hexNumber") + }); +}); + +/* + How Properties of Mime Types are used by SQL Mode + ================================================= + + keywords: + A list of keywords you want to be highlighted. + builtin: + A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). + operatorChars: + All characters that must be handled as operators. + client: + Commands parsed and executed by the client (not the server). + support: + A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. + * ODBCdotTable: .tableName + * zerolessFloat: .1 + * doubleQuote + * nCharCast: N'string' + * charsetCast: _utf8'string' + * commentHash: use # char for comments + * commentSlashSlash: use // for comments + * commentSpaceRequired: require a space after -- for comments + atoms: + Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: + UNKNOWN, INFINITY, UNDERFLOW, NaN... + dateSQL: + Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. +*/ diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/xml/index.html b/WebContent/resources/fuscabr/lib/codemirror/mode/xml/index.html new file mode 100755 index 0000000000..c0dec45904 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/xml/index.html @@ -0,0 +1,61 @@ + + +CodeMirror: XML mode + + + + + + + + + +
+

XML mode

+
+ +

The XML mode supports these configuration parameters:

+
+
htmlMode (boolean)
+
This switches the mode to parse HTML instead of XML. This + means attributes do not have to be quoted, and some elements + (such as br) do not require a closing tag.
+
matchClosing (boolean)
+
Controls whether the mode checks that close tags match the + corresponding opening tag, and highlights mismatches as errors. + Defaults to true.
+
alignCDATA (boolean)
+
Setting this to true will force the opening tag of CDATA + blocks to not be indented.
+
+ +

MIME types defined: application/xml, text/html.

+
diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/xml/test.js b/WebContent/resources/fuscabr/lib/codemirror/mode/xml/test.js new file mode 100755 index 0000000000..b586d2b459 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/xml/test.js @@ -0,0 +1,51 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 2}, "xml"), mname = "xml"; + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), mname); } + + MT("matching", + "[tag&bracket <][tag top][tag&bracket >]", + " text", + " [tag&bracket <][tag inner][tag&bracket />]", + "[tag&bracket ]"); + + MT("nonmatching", + "[tag&bracket <][tag top][tag&bracket >]", + " [tag&bracket <][tag inner][tag&bracket />]", + " [tag&bracket ]"); + + MT("doctype", + "[meta ]", + "[tag&bracket <][tag top][tag&bracket />]"); + + MT("cdata", + "[tag&bracket <][tag top][tag&bracket >]", + " [atom ]", + "[tag&bracket ]"); + + // HTML tests + mode = CodeMirror.getMode({indentUnit: 2}, "text/html"); + + MT("selfclose", + "[tag&bracket <][tag html][tag&bracket >]", + " [tag&bracket <][tag link] [attribute rel]=[string stylesheet] [attribute href]=[string \"/foobar\"][tag&bracket >]", + "[tag&bracket ]"); + + MT("list", + "[tag&bracket <][tag ol][tag&bracket >]", + " [tag&bracket <][tag li][tag&bracket >]one", + " [tag&bracket <][tag li][tag&bracket >]two", + "[tag&bracket ]"); + + MT("valueless", + "[tag&bracket <][tag input] [attribute type]=[string checkbox] [attribute checked][tag&bracket />]"); + + MT("pThenArticle", + "[tag&bracket <][tag p][tag&bracket >]", + " foo", + "[tag&bracket <][tag article][tag&bracket >]bar"); + +})(); diff --git a/WebContent/resources/fuscabr/lib/codemirror/mode/xml/xml.js b/WebContent/resources/fuscabr/lib/codemirror/mode/xml/xml.js new file mode 100755 index 0000000000..46806ac425 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/mode/xml/xml.js @@ -0,0 +1,413 @@ +// 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 && /$/, + blockCommentStart: "", + + configuration: config.htmlMode ? "html" : "xml", + helperType: config.htmlMode ? "html" : "xml", + + skipAttribute: function(state) { + if (state.state == attrValueState) + state.state = attrState + }, + + xmlCurrentTag: function(state) { + return state.tagName ? {name: state.tagName, close: state.type == "closeTag"} : null + }, + + xmlCurrentContext: function(state) { + var context = [] + for (var cx = state.context; cx; cx = cx.prev) + context.push(cx.tagName) + return context.reverse() + } + }; +}); + +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/WebContent/resources/fuscabr/lib/codemirror/theme/3024-day.css b/WebContent/resources/fuscabr/lib/codemirror/theme/3024-day.css new file mode 100755 index 0000000000..7132655306 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/3024-day.css @@ -0,0 +1,41 @@ +/* + + Name: 3024 day + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-day.CodeMirror { background: #f7f7f7; color: #3a3432; } +.cm-s-3024-day div.CodeMirror-selected { background: #d6d5d4; } + +.cm-s-3024-day .CodeMirror-line::selection, .cm-s-3024-day .CodeMirror-line > span::selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d6d5d4; } +.cm-s-3024-day .CodeMirror-line::-moz-selection, .cm-s-3024-day .CodeMirror-line > span::-moz-selection, .cm-s-3024-day .CodeMirror-line > span > span::selection { background: #d9d9d9; } + +.cm-s-3024-day .CodeMirror-gutters { background: #f7f7f7; border-right: 0px; } +.cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; } +.cm-s-3024-day .CodeMirror-linenumber { color: #807d7c; } + +.cm-s-3024-day .CodeMirror-cursor { border-left: 1px solid #5c5855; } + +.cm-s-3024-day span.cm-comment { color: #cdab53; } +.cm-s-3024-day span.cm-atom { color: #a16a94; } +.cm-s-3024-day span.cm-number { color: #a16a94; } + +.cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute { color: #01a252; } +.cm-s-3024-day span.cm-keyword { color: #db2d20; } +.cm-s-3024-day span.cm-string { color: #fded02; } + +.cm-s-3024-day span.cm-variable { color: #01a252; } +.cm-s-3024-day span.cm-variable-2 { color: #01a0e4; } +.cm-s-3024-day span.cm-def { color: #e8bbd0; } +.cm-s-3024-day span.cm-bracket { color: #3a3432; } +.cm-s-3024-day span.cm-tag { color: #db2d20; } +.cm-s-3024-day span.cm-link { color: #a16a94; } +.cm-s-3024-day span.cm-error { background: #db2d20; color: #5c5855; } + +.cm-s-3024-day .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/3024-night.css b/WebContent/resources/fuscabr/lib/codemirror/theme/3024-night.css new file mode 100755 index 0000000000..adc5900ad1 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/3024-night.css @@ -0,0 +1,39 @@ +/* + + Name: 3024 night + Author: Jan T. Sott (http://github.com/idleberg) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-3024-night.CodeMirror { background: #090300; color: #d6d5d4; } +.cm-s-3024-night div.CodeMirror-selected { background: #3a3432; } +.cm-s-3024-night .CodeMirror-line::selection, .cm-s-3024-night .CodeMirror-line > span::selection, .cm-s-3024-night .CodeMirror-line > span > span::selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night .CodeMirror-line::-moz-selection, .cm-s-3024-night .CodeMirror-line > span::-moz-selection, .cm-s-3024-night .CodeMirror-line > span > span::-moz-selection { background: rgba(58, 52, 50, .99); } +.cm-s-3024-night .CodeMirror-gutters { background: #090300; border-right: 0px; } +.cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; } +.cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; } +.cm-s-3024-night .CodeMirror-linenumber { color: #5c5855; } + +.cm-s-3024-night .CodeMirror-cursor { border-left: 1px solid #807d7c; } + +.cm-s-3024-night span.cm-comment { color: #cdab53; } +.cm-s-3024-night span.cm-atom { color: #a16a94; } +.cm-s-3024-night span.cm-number { color: #a16a94; } + +.cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute { color: #01a252; } +.cm-s-3024-night span.cm-keyword { color: #db2d20; } +.cm-s-3024-night span.cm-string { color: #fded02; } + +.cm-s-3024-night span.cm-variable { color: #01a252; } +.cm-s-3024-night span.cm-variable-2 { color: #01a0e4; } +.cm-s-3024-night span.cm-def { color: #e8bbd0; } +.cm-s-3024-night span.cm-bracket { color: #d6d5d4; } +.cm-s-3024-night span.cm-tag { color: #db2d20; } +.cm-s-3024-night span.cm-link { color: #a16a94; } +.cm-s-3024-night span.cm-error { background: #db2d20; color: #807d7c; } + +.cm-s-3024-night .CodeMirror-activeline-background { background: #2F2F2F; } +.cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/abbott.css b/WebContent/resources/fuscabr/lib/codemirror/theme/abbott.css new file mode 100755 index 0000000000..3e516a67f9 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/abbott.css @@ -0,0 +1,268 @@ +/* + * abbott.css + * A warm, dark theme for prose and code, with pastels and pretty greens. + * + * Ported from abbott.vim (https://github.com/bcat/abbott.vim) version 2.1. + * Original design and CodeMirror port by Jonathan Rascher. + * + * This theme shares the following color palette with the Vim color scheme. + * + * Brown shades: + * bistre: #231c14 + * chocolate: #3c3022 + * cocoa: #745d42 + * vanilla_cream: #fef3b4 + * + * Red shades: + * crimson: #d80450 + * cinnabar: #f63f05 + * + * Green shades: + * dark_olive: #273900 + * forest_green: #24a507 + * chartreuse: #a0ea00 + * pastel_chartreuse: #d8ff84 + * + * Yellow shades: + * marigold: #fbb32f + * lemon_meringue: #fbec5d + * + * Blue shades: + * cornflower_blue: #3f91f1 + * periwinkle_blue: #8ccdf0 + * + * Magenta shades: + * french_pink: #ec6c99 + * lavender: #e6a2f3 + * + * Cyan shades: + * zomp: #39a78d + * seafoam_green: #00ff7f + */ + +/* Style the UI: */ + +/* Equivalent to Vim's Normal group. */ +.cm-s-abbott.CodeMirror { + background: #231c14 /* bistre */; + color: #d8ff84 /* pastel_chartreuse */; +} + +/* Roughly equivalent to Vim's LineNr group. */ +.cm-s-abbott .CodeMirror-gutters { + background: #231c14 /* bistre */; + border: none; +} +.cm-s-abbott .CodeMirror-linenumber { color: #fbec5d /* lemon_meringue */; } + +.cm-s-abbott .CodeMirror-guttermarker { color: #f63f05 /* cinnabar */; } + +/* Roughly equivalent to Vim's FoldColumn group. */ +.cm-s-abbott .CodeMirror-guttermarker-subtle { color: #fbb32f /* marigold */; } + +/* + * Roughly equivalent to Vim's CursorColumn group. (We use a brighter color + * since Vim's cursorcolumn option highlights a whole column, whereas + * CodeMirror's rule just highlights a thin line.) + */ +.cm-s-abbott .CodeMirror-ruler { border-color: #745d42 /* cocoa */; } + +/* Equivalent to Vim's Cursor group in insert mode. */ +.cm-s-abbott .CodeMirror-cursor { border-color: #a0ea00 /* chartreuse */; } + +/* Equivalent to Vim's Cursor group in normal mode. */ +.cm-s-abbott.cm-fat-cursor .CodeMirror-cursor, +.cm-s-abbott .cm-animate-fat-cursor { + /* + * CodeMirror doesn't allow changing the foreground color of the character + * under the cursor, so we can't use a reverse video effect for the cursor. + * Instead, make it semitransparent. + */ + background: rgba(160, 234, 0, 0.5) /* chartreuse */; +} +.cm-s-abbott.cm-fat-cursor .CodeMirror-cursors { + /* + * Boost the z-index so the fat cursor shows up on top of text and + * matchingbracket/matchingtag highlights. + */ + z-index: 3; +} + +/* Equivalent to Vim's Cursor group in replace mode. */ +.cm-s-abbott .CodeMirror-overwrite .CodeMirror-cursor { + border-bottom: 1px solid #a0ea00 /* chartreuse */; + border-left: none; + width: auto; +} + +/* Roughly equivalent to Vim's CursorIM group. */ +.cm-s-abbott .CodeMirror-secondarycursor { + border-color: #00ff7f /* seafoam_green */; +} + +/* Roughly equivalent to Vim's Visual group. */ +.cm-s-abbott .CodeMirror-selected, +.cm-s-abbott.CodeMirror-focused .CodeMirror-selected { + background: #273900 /* dark_olive */; +} +.cm-s-abbott .CodeMirror-line::selection, +.cm-s-abbott .CodeMirror-line > span::selection, +.cm-s-abbott .CodeMirror-line > span > span::selection { + background: #273900 /* dark_olive */; +} +.cm-s-abbott .CodeMirror-line::-moz-selection, +.cm-s-abbott .CodeMirror-line > span::-moz-selection, +.cm-s-abbott .CodeMirror-line > span > span::-moz-selection { + background: #273900 /* dark_olive */; +} + +/* Roughly equivalent to Vim's SpecialKey group. */ +.cm-s-abbott .cm-tab { color: #00ff7f /* seafoam_green */; } + +/* Equivalent to Vim's Search group. */ +.cm-s-abbott .cm-searching { + background: #fef3b4 /* vanilla_cream */ !important; + color: #231c14 /* bistre */ !important; +} + +/* Style syntax highlighting modes: */ + +/* Equivalent to Vim's Comment group. */ +.cm-s-abbott span.cm-comment { + color: #fbb32f /* marigold */; + font-style: italic; +} + +/* Equivalent to Vim's String group. */ +.cm-s-abbott span.cm-string, +.cm-s-abbott span.cm-string-2 { + color: #e6a2f3 /* lavender */; +} + +/* Equivalent to Vim's Constant group. */ +.cm-s-abbott span.cm-number, +.cm-s-abbott span.cm-string.cm-url { color: #f63f05 /* cinnabar */; } + +/* Roughly equivalent to Vim's SpecialKey group. */ +.cm-s-abbott span.cm-invalidchar { color: #00ff7f /* seafoam_green */; } + +/* Equivalent to Vim's Special group. */ +.cm-s-abbott span.cm-atom { color: #fef3b4 /* vanilla_cream */; } + +/* Equivalent to Vim's Delimiter group. */ +.cm-s-abbott span.cm-bracket, +.cm-s-abbott span.cm-punctuation { + color: #fef3b4 /* vanilla_cream */; +} + +/* Equivalent Vim's Operator group. */ +.cm-s-abbott span.cm-operator { font-weight: bold; } + +/* Roughly equivalent to Vim's Identifier group. */ +.cm-s-abbott span.cm-def, +.cm-s-abbott span.cm-variable, +.cm-s-abbott span.cm-variable-2, +.cm-s-abbott span.cm-variable-3 { + color: #8ccdf0 /* periwinkle_blue */; +} + +/* Roughly equivalent to Vim's Function group. */ +.cm-s-abbott span.cm-builtin, +.cm-s-abbott span.cm-property, +.cm-s-abbott span.cm-qualifier { + color: #3f91f1 /* cornflower_blue */; +} + +/* Equivalent to Vim's Type group. */ +.cm-s-abbott span.cm-type { color: #24a507 /* forest_green */; } + +/* Equivalent to Vim's Keyword group. */ +.cm-s-abbott span.cm-keyword { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's PreProc group. */ +.cm-s-abbott span.cm-meta { color: #ec6c99 /* french_pink */; } + +/* Equivalent to Vim's htmlTagName group (linked to Statement). */ +.cm-s-abbott span.cm-tag { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's htmlArg group (linked to Type). */ +.cm-s-abbott span.cm-attribute { color: #24a507 /* forest_green */; } + +/* Equivalent to Vim's htmlH1, markdownH1, etc. groups (linked to Title). */ +.cm-s-abbott span.cm-header { + color: #d80450 /* crimson */; + font-weight: bold; +} + +/* Equivalent to Vim's markdownRule group (linked to PreProc). */ +.cm-s-abbott span.cm-hr { color: #ec6c99 /* french_pink */; } + +/* Roughly equivalent to Vim's Underlined group. */ +.cm-s-abbott span.cm-link { color: #e6a2f3 /* lavender */; } + +/* Equivalent to Vim's diffRemoved group. */ +.cm-s-abbott span.cm-negative { + background: #d80450 /* crimson */; + color: #231c14 /* bistre */; +} + +/* Equivalent to Vim's diffAdded group. */ +.cm-s-abbott span.cm-positive { + background: #a0ea00 /* chartreuse */; + color: #231c14 /* bistre */; + font-weight: bold; +} + +/* Equivalent to Vim's Error group. */ +.cm-s-abbott span.cm-error { + background: #d80450 /* crimson */; + color: #231c14 /* bistre */; +} + +/* Style addons: */ + +/* Equivalent to Vim's MatchParen group. */ +.cm-s-abbott span.CodeMirror-matchingbracket { + background: #745d42 /* cocoa */ !important; + color: #231c14 /* bistre */ !important; + font-weight: bold; +} + +/* + * Roughly equivalent to Vim's Error group. (Vim doesn't seem to have a direct + * equivalent in its own matchparen plugin, but many syntax highlighting plugins + * mark mismatched brackets as Error.) + */ +.cm-s-abbott span.CodeMirror-nonmatchingbracket { + background: #d80450 /* crimson */ !important; + color: #231c14 /* bistre */ !important; +} + +.cm-s-abbott .CodeMirror-matchingtag, +.cm-s-abbott .cm-matchhighlight { + outline: 1px solid #39a78d /* zomp */; +} + +/* Equivalent to Vim's CursorLine group. */ +.cm-s-abbott .CodeMirror-activeline-background, +.cm-s-abbott .CodeMirror-activeline-gutter { + background: #3c3022 /* chocolate */; +} + +/* Equivalent to Vim's CursorLineNr group. */ +.cm-s-abbott .CodeMirror-activeline-gutter .CodeMirror-linenumber { + color: #d8ff84 /* pastel_chartreuse */; + font-weight: bold; +} + +/* Roughly equivalent to Vim's Folded group. */ +.cm-s-abbott .CodeMirror-foldmarker { + color: #f63f05 /* cinnabar */; + text-shadow: none; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/abcdef.css b/WebContent/resources/fuscabr/lib/codemirror/theme/abcdef.css new file mode 100755 index 0000000000..cf93530946 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/abcdef.css @@ -0,0 +1,32 @@ +.cm-s-abcdef.CodeMirror { background: #0f0f0f; color: #defdef; } +.cm-s-abcdef div.CodeMirror-selected { background: #515151; } +.cm-s-abcdef .CodeMirror-line::selection, .cm-s-abcdef .CodeMirror-line > span::selection, .cm-s-abcdef .CodeMirror-line > span > span::selection { background: rgba(56, 56, 56, 0.99); } +.cm-s-abcdef .CodeMirror-line::-moz-selection, .cm-s-abcdef .CodeMirror-line > span::-moz-selection, .cm-s-abcdef .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 56, 56, 0.99); } +.cm-s-abcdef .CodeMirror-gutters { background: #555; border-right: 2px solid #314151; } +.cm-s-abcdef .CodeMirror-guttermarker { color: #222; } +.cm-s-abcdef .CodeMirror-guttermarker-subtle { color: azure; } +.cm-s-abcdef .CodeMirror-linenumber { color: #FFFFFF; } +.cm-s-abcdef .CodeMirror-cursor { border-left: 1px solid #00FF00; } + +.cm-s-abcdef span.cm-keyword { color: darkgoldenrod; font-weight: bold; } +.cm-s-abcdef span.cm-atom { color: #77F; } +.cm-s-abcdef span.cm-number { color: violet; } +.cm-s-abcdef span.cm-def { color: #fffabc; } +.cm-s-abcdef span.cm-variable { color: #abcdef; } +.cm-s-abcdef span.cm-variable-2 { color: #cacbcc; } +.cm-s-abcdef span.cm-variable-3, .cm-s-abcdef span.cm-type { color: #def; } +.cm-s-abcdef span.cm-property { color: #fedcba; } +.cm-s-abcdef span.cm-operator { color: #ff0; } +.cm-s-abcdef span.cm-comment { color: #7a7b7c; font-style: italic;} +.cm-s-abcdef span.cm-string { color: #2b4; } +.cm-s-abcdef span.cm-meta { color: #C9F; } +.cm-s-abcdef span.cm-qualifier { color: #FFF700; } +.cm-s-abcdef span.cm-builtin { color: #30aabc; } +.cm-s-abcdef span.cm-bracket { color: #8a8a8a; } +.cm-s-abcdef span.cm-tag { color: #FFDD44; } +.cm-s-abcdef span.cm-attribute { color: #DDFF00; } +.cm-s-abcdef span.cm-error { color: #FF0000; } +.cm-s-abcdef span.cm-header { color: aquamarine; font-weight: bold; } +.cm-s-abcdef span.cm-link { color: blueviolet; } + +.cm-s-abcdef .CodeMirror-activeline-background { background: #314151; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/ambiance-mobile.css b/WebContent/resources/fuscabr/lib/codemirror/theme/ambiance-mobile.css new file mode 100755 index 0000000000..88d332e1a7 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/ambiance-mobile.css @@ -0,0 +1,5 @@ +.cm-s-ambiance.CodeMirror { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/ambiance.css b/WebContent/resources/fuscabr/lib/codemirror/theme/ambiance.css new file mode 100755 index 0000000000..782fca43f5 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/ambiance.css @@ -0,0 +1,74 @@ +/* ambiance theme for codemirror */ + +/* Color scheme */ + +.cm-s-ambiance .cm-header { color: blue; } +.cm-s-ambiance .cm-quote { color: #24C2C7; } + +.cm-s-ambiance .cm-keyword { color: #cda869; } +.cm-s-ambiance .cm-atom { color: #CF7EA9; } +.cm-s-ambiance .cm-number { color: #78CF8A; } +.cm-s-ambiance .cm-def { color: #aac6e3; } +.cm-s-ambiance .cm-variable { color: #ffb795; } +.cm-s-ambiance .cm-variable-2 { color: #eed1b3; } +.cm-s-ambiance .cm-variable-3, .cm-s-ambiance .cm-type { color: #faded3; } +.cm-s-ambiance .cm-property { color: #eed1b3; } +.cm-s-ambiance .cm-operator { color: #fa8d6a; } +.cm-s-ambiance .cm-comment { color: #555; font-style:italic; } +.cm-s-ambiance .cm-string { color: #8f9d6a; } +.cm-s-ambiance .cm-string-2 { color: #9d937c; } +.cm-s-ambiance .cm-meta { color: #D2A8A1; } +.cm-s-ambiance .cm-qualifier { color: yellow; } +.cm-s-ambiance .cm-builtin { color: #9999cc; } +.cm-s-ambiance .cm-bracket { color: #24C2C7; } +.cm-s-ambiance .cm-tag { color: #fee4ff; } +.cm-s-ambiance .cm-attribute { color: #9B859D; } +.cm-s-ambiance .cm-hr { color: pink; } +.cm-s-ambiance .cm-link { color: #F4C20B; } +.cm-s-ambiance .cm-special { color: #FF9D00; } +.cm-s-ambiance .cm-error { color: #AF2018; } + +.cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } +.cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } + +.cm-s-ambiance div.CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } +.cm-s-ambiance.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance .CodeMirror-line::selection, .cm-s-ambiance .CodeMirror-line > span::selection, .cm-s-ambiance .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-ambiance .CodeMirror-line::-moz-selection, .cm-s-ambiance .CodeMirror-line > span::-moz-selection, .cm-s-ambiance .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } + +/* Editor styling */ + +.cm-s-ambiance.CodeMirror { + line-height: 1.40em; + color: #E6E1DC; + background-color: #202020; + -webkit-box-shadow: inset 0 0 10px black; + -moz-box-shadow: inset 0 0 10px black; + box-shadow: inset 0 0 10px black; +} + +.cm-s-ambiance .CodeMirror-gutters { + background: #3D3D3D; + border-right: 1px solid #4D4D4D; + box-shadow: 0 10px 20px black; +} + +.cm-s-ambiance .CodeMirror-linenumber { + text-shadow: 0px 1px 1px #4d4d4d; + color: #111; + padding: 0 5px; +} + +.cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; } +.cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; } + +.cm-s-ambiance .CodeMirror-cursor { border-left: 1px solid #7991E8; } + +.cm-s-ambiance .CodeMirror-activeline-background { + background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); +} + +.cm-s-ambiance.CodeMirror, +.cm-s-ambiance .CodeMirror-gutters { + background-image: url("data:image/png;base64,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"); +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/ayu-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/ayu-dark.css new file mode 100755 index 0000000000..13656b94bb --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/ayu-dark.css @@ -0,0 +1,44 @@ +/* Based on https://github.com/dempfi/ayu */ + +.cm-s-ayu-dark.CodeMirror { background: #0a0e14; color: #b3b1ad; } +.cm-s-ayu-dark div.CodeMirror-selected { background: #273747; } +.cm-s-ayu-dark .CodeMirror-line::selection, .cm-s-ayu-dark .CodeMirror-line > span::selection, .cm-s-ayu-dark .CodeMirror-line > span > span::selection { background: rgba(39, 55, 71, 99); } +.cm-s-ayu-dark .CodeMirror-line::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span::-moz-selection, .cm-s-ayu-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 55, 71, 99); } +.cm-s-ayu-dark .CodeMirror-gutters { background: #0a0e14; border-right: 0px; } +.cm-s-ayu-dark .CodeMirror-guttermarker { color: white; } +.cm-s-ayu-dark .CodeMirror-guttermarker-subtle { color: #3d424d; } +.cm-s-ayu-dark .CodeMirror-linenumber { color: #3d424d; } +.cm-s-ayu-dark .CodeMirror-cursor { border-left: 1px solid #e6b450; } +.cm-s-ayu-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; } +.cm-s-ayu-dark .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-ayu-dark span.cm-comment { color: #626a73; } +.cm-s-ayu-dark span.cm-atom { color: #ae81ff; } +.cm-s-ayu-dark span.cm-number { color: #e6b450; } + +.cm-s-ayu-dark span.cm-comment.cm-attribute { color: #ffb454; } +.cm-s-ayu-dark span.cm-comment.cm-def { color: rgba(57, 186, 230, 80); } +.cm-s-ayu-dark span.cm-comment.cm-tag { color: #39bae6; } +.cm-s-ayu-dark span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-ayu-dark span.cm-property, .cm-s-ayu-dark span.cm-attribute { color: #ffb454; } +.cm-s-ayu-dark span.cm-keyword { color: #ff8f40; } +.cm-s-ayu-dark span.cm-builtin { color: #e6b450; } +.cm-s-ayu-dark span.cm-string { color: #c2d94c; } + +.cm-s-ayu-dark span.cm-variable { color: #b3b1ad; } +.cm-s-ayu-dark span.cm-variable-2 { color: #f07178; } +.cm-s-ayu-dark span.cm-variable-3 { color: #39bae6; } +.cm-s-ayu-dark span.cm-type { color: #ff8f40; } +.cm-s-ayu-dark span.cm-def { color: #ffee99; } +.cm-s-ayu-dark span.cm-bracket { color: #f8f8f2; } +.cm-s-ayu-dark span.cm-tag { color: rgba(57, 186, 230, 80); } +.cm-s-ayu-dark span.cm-header { color: #c2d94c; } +.cm-s-ayu-dark span.cm-link { color: #39bae6; } +.cm-s-ayu-dark span.cm-error { color: #ff3333; } + +.cm-s-ayu-dark .CodeMirror-activeline-background { background: #01060e; } +.cm-s-ayu-dark .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/ayu-mirage.css b/WebContent/resources/fuscabr/lib/codemirror/theme/ayu-mirage.css new file mode 100755 index 0000000000..19403cefb5 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/ayu-mirage.css @@ -0,0 +1,45 @@ +/* Based on https://github.com/dempfi/ayu */ + +.cm-s-ayu-mirage.CodeMirror { background: #1f2430; color: #cbccc6; } +.cm-s-ayu-mirage div.CodeMirror-selected { background: #34455a; } +.cm-s-ayu-mirage .CodeMirror-line::selection, .cm-s-ayu-mirage .CodeMirror-line > span::selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::selection { background: #34455a; } +.cm-s-ayu-mirage .CodeMirror-line::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span::-moz-selection, .cm-s-ayu-mirage .CodeMirror-line > span > span::-moz-selection { background: rgba(25, 30, 42, 99); } +.cm-s-ayu-mirage .CodeMirror-gutters { background: #1f2430; border-right: 0px; } +.cm-s-ayu-mirage .CodeMirror-guttermarker { color: white; } +.cm-s-ayu-mirage .CodeMirror-guttermarker-subtle { color: rgba(112, 122, 140, 66); } +.cm-s-ayu-mirage .CodeMirror-linenumber { color: rgba(61, 66, 77, 99); } +.cm-s-ayu-mirage .CodeMirror-cursor { border-left: 1px solid #ffcc66; } +.cm-s-ayu-mirage.cm-fat-cursor .CodeMirror-cursor {background-color: #a2a8a175 !important;} +.cm-s-ayu-mirage .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-ayu-mirage span.cm-comment { color: #5c6773; font-style:italic; } +.cm-s-ayu-mirage span.cm-atom { color: #ae81ff; } +.cm-s-ayu-mirage span.cm-number { color: #ffcc66; } + +.cm-s-ayu-mirage span.cm-comment.cm-attribute { color: #ffd580; } +.cm-s-ayu-mirage span.cm-comment.cm-def { color: #d4bfff; } +.cm-s-ayu-mirage span.cm-comment.cm-tag { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-ayu-mirage span.cm-property { color: #f29e74; } +.cm-s-ayu-mirage span.cm-attribute { color: #ffd580; } +.cm-s-ayu-mirage span.cm-keyword { color: #ffa759; } +.cm-s-ayu-mirage span.cm-builtin { color: #ffcc66; } +.cm-s-ayu-mirage span.cm-string { color: #bae67e; } + +.cm-s-ayu-mirage span.cm-variable { color: #cbccc6; } +.cm-s-ayu-mirage span.cm-variable-2 { color: #f28779; } +.cm-s-ayu-mirage span.cm-variable-3 { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-type { color: #ffa759; } +.cm-s-ayu-mirage span.cm-def { color: #ffd580; } +.cm-s-ayu-mirage span.cm-bracket { color: rgba(92, 207, 230, 80); } +.cm-s-ayu-mirage span.cm-tag { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-header { color: #bae67e; } +.cm-s-ayu-mirage span.cm-link { color: #5ccfe6; } +.cm-s-ayu-mirage span.cm-error { color: #ff3333; } + +.cm-s-ayu-mirage .CodeMirror-activeline-background { background: #191e2a; } +.cm-s-ayu-mirage .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/base16-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/base16-dark.css new file mode 100755 index 0000000000..b3c31aba20 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/base16-dark.css @@ -0,0 +1,40 @@ +/* + + Name: Base16 Default Dark + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-dark.CodeMirror { background: #151515; color: #e0e0e0; } +.cm-s-base16-dark div.CodeMirror-selected { background: #303030; } +.cm-s-base16-dark .CodeMirror-line::selection, .cm-s-base16-dark .CodeMirror-line > span::selection, .cm-s-base16-dark .CodeMirror-line > span > span::selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark .CodeMirror-line::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span::-moz-selection, .cm-s-base16-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(48, 48, 48, .99); } +.cm-s-base16-dark .CodeMirror-gutters { background: #151515; border-right: 0px; } +.cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; } +.cm-s-base16-dark .CodeMirror-linenumber { color: #505050; } +.cm-s-base16-dark .CodeMirror-cursor { border-left: 1px solid #b0b0b0; } +.cm-s-base16-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; } +.cm-s-base16-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; } + +.cm-s-base16-dark span.cm-comment { color: #8f5536; } +.cm-s-base16-dark span.cm-atom { color: #aa759f; } +.cm-s-base16-dark span.cm-number { color: #aa759f; } + +.cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute { color: #90a959; } +.cm-s-base16-dark span.cm-keyword { color: #ac4142; } +.cm-s-base16-dark span.cm-string { color: #f4bf75; } + +.cm-s-base16-dark span.cm-variable { color: #90a959; } +.cm-s-base16-dark span.cm-variable-2 { color: #6a9fb5; } +.cm-s-base16-dark span.cm-def { color: #d28445; } +.cm-s-base16-dark span.cm-bracket { color: #e0e0e0; } +.cm-s-base16-dark span.cm-tag { color: #ac4142; } +.cm-s-base16-dark span.cm-link { color: #aa759f; } +.cm-s-base16-dark span.cm-error { background: #ac4142; color: #b0b0b0; } + +.cm-s-base16-dark .CodeMirror-activeline-background { background: #202020; } +.cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/base16-light.css b/WebContent/resources/fuscabr/lib/codemirror/theme/base16-light.css new file mode 100755 index 0000000000..1d5f582f6a --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/base16-light.css @@ -0,0 +1,38 @@ +/* + + Name: Base16 Default Light + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-light.CodeMirror { background: #f5f5f5; color: #202020; } +.cm-s-base16-light div.CodeMirror-selected { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::selection, .cm-s-base16-light .CodeMirror-line > span::selection, .cm-s-base16-light .CodeMirror-line > span > span::selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::-moz-selection, .cm-s-base16-light .CodeMirror-line > span::-moz-selection, .cm-s-base16-light .CodeMirror-line > span > span::-moz-selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-gutters { background: #f5f5f5; border-right: 0px; } +.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-linenumber { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-cursor { border-left: 1px solid #505050; } + +.cm-s-base16-light span.cm-comment { color: #8f5536; } +.cm-s-base16-light span.cm-atom { color: #aa759f; } +.cm-s-base16-light span.cm-number { color: #aa759f; } + +.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute { color: #90a959; } +.cm-s-base16-light span.cm-keyword { color: #ac4142; } +.cm-s-base16-light span.cm-string { color: #f4bf75; } + +.cm-s-base16-light span.cm-variable { color: #90a959; } +.cm-s-base16-light span.cm-variable-2 { color: #6a9fb5; } +.cm-s-base16-light span.cm-def { color: #d28445; } +.cm-s-base16-light span.cm-bracket { color: #202020; } +.cm-s-base16-light span.cm-tag { color: #ac4142; } +.cm-s-base16-light span.cm-link { color: #aa759f; } +.cm-s-base16-light span.cm-error { background: #ac4142; color: #505050; } + +.cm-s-base16-light .CodeMirror-activeline-background { background: #DDDCDC; } +.cm-s-base16-light .CodeMirror-matchingbracket { color: #f5f5f5 !important; background-color: #6A9FB5 !important} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/bespin.css b/WebContent/resources/fuscabr/lib/codemirror/theme/bespin.css new file mode 100755 index 0000000000..60913ba938 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/bespin.css @@ -0,0 +1,34 @@ +/* + + Name: Bespin + Author: Mozilla / Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-bespin.CodeMirror {background: #28211c; color: #9d9b97;} +.cm-s-bespin div.CodeMirror-selected {background: #36312e !important;} +.cm-s-bespin .CodeMirror-gutters {background: #28211c; border-right: 0px;} +.cm-s-bespin .CodeMirror-linenumber {color: #666666;} +.cm-s-bespin .CodeMirror-cursor {border-left: 1px solid #797977 !important;} + +.cm-s-bespin span.cm-comment {color: #937121;} +.cm-s-bespin span.cm-atom {color: #9b859d;} +.cm-s-bespin span.cm-number {color: #9b859d;} + +.cm-s-bespin span.cm-property, .cm-s-bespin span.cm-attribute {color: #54be0d;} +.cm-s-bespin span.cm-keyword {color: #cf6a4c;} +.cm-s-bespin span.cm-string {color: #f9ee98;} + +.cm-s-bespin span.cm-variable {color: #54be0d;} +.cm-s-bespin span.cm-variable-2 {color: #5ea6ea;} +.cm-s-bespin span.cm-def {color: #cf7d34;} +.cm-s-bespin span.cm-error {background: #cf6a4c; color: #797977;} +.cm-s-bespin span.cm-bracket {color: #9d9b97;} +.cm-s-bespin span.cm-tag {color: #cf6a4c;} +.cm-s-bespin span.cm-link {color: #9b859d;} + +.cm-s-bespin .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-bespin .CodeMirror-activeline-background { background: #404040; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/blackboard.css b/WebContent/resources/fuscabr/lib/codemirror/theme/blackboard.css new file mode 100755 index 0000000000..b6eaedb180 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/blackboard.css @@ -0,0 +1,32 @@ +/* Port of TextMate's Blackboard theme */ + +.cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } +.cm-s-blackboard div.CodeMirror-selected { background: #253B76; } +.cm-s-blackboard .CodeMirror-line::selection, .cm-s-blackboard .CodeMirror-line > span::selection, .cm-s-blackboard .CodeMirror-line > span > span::selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-line::-moz-selection, .cm-s-blackboard .CodeMirror-line > span::-moz-selection, .cm-s-blackboard .CodeMirror-line > span > span::-moz-selection { background: rgba(37, 59, 118, .99); } +.cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } +.cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; } +.cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; } +.cm-s-blackboard .CodeMirror-linenumber { color: #888; } +.cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7; } + +.cm-s-blackboard .cm-keyword { color: #FBDE2D; } +.cm-s-blackboard .cm-atom { color: #D8FA3C; } +.cm-s-blackboard .cm-number { color: #D8FA3C; } +.cm-s-blackboard .cm-def { color: #8DA6CE; } +.cm-s-blackboard .cm-variable { color: #FF6400; } +.cm-s-blackboard .cm-operator { color: #FBDE2D; } +.cm-s-blackboard .cm-comment { color: #AEAEAE; } +.cm-s-blackboard .cm-string { color: #61CE3C; } +.cm-s-blackboard .cm-string-2 { color: #61CE3C; } +.cm-s-blackboard .cm-meta { color: #D8FA3C; } +.cm-s-blackboard .cm-builtin { color: #8DA6CE; } +.cm-s-blackboard .cm-tag { color: #8DA6CE; } +.cm-s-blackboard .cm-attribute { color: #8DA6CE; } +.cm-s-blackboard .cm-header { color: #FF6400; } +.cm-s-blackboard .cm-hr { color: #AEAEAE; } +.cm-s-blackboard .cm-link { color: #8DA6CE; } +.cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } + +.cm-s-blackboard .CodeMirror-activeline-background { background: #3C3636; } +.cm-s-blackboard .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/cobalt.css b/WebContent/resources/fuscabr/lib/codemirror/theme/cobalt.css new file mode 100755 index 0000000000..bbbda3b543 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/cobalt.css @@ -0,0 +1,25 @@ +.cm-s-cobalt.CodeMirror { background: #002240; color: white; } +.cm-s-cobalt div.CodeMirror-selected { background: #b36539; } +.cm-s-cobalt .CodeMirror-line::selection, .cm-s-cobalt .CodeMirror-line > span::selection, .cm-s-cobalt .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt .CodeMirror-line::-moz-selection, .cm-s-cobalt .CodeMirror-line > span::-moz-selection, .cm-s-cobalt .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; } +.cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-cobalt span.cm-comment { color: #08f; } +.cm-s-cobalt span.cm-atom { color: #845dc4; } +.cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } +.cm-s-cobalt span.cm-keyword { color: #ffee80; } +.cm-s-cobalt span.cm-string { color: #3ad900; } +.cm-s-cobalt span.cm-meta { color: #ff9d00; } +.cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } +.cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def, .cm-s-cobalt .cm-type { color: white; } +.cm-s-cobalt span.cm-bracket { color: #d8d8d8; } +.cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } +.cm-s-cobalt span.cm-link { color: #845dc4; } +.cm-s-cobalt span.cm-error { color: #9d1e15; } + +.cm-s-cobalt .CodeMirror-activeline-background { background: #002D57; } +.cm-s-cobalt .CodeMirror-matchingbracket { outline:1px solid grey;color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/colorforth.css b/WebContent/resources/fuscabr/lib/codemirror/theme/colorforth.css new file mode 100755 index 0000000000..19095e41d9 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/colorforth.css @@ -0,0 +1,33 @@ +.cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; } +.cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; } +.cm-s-colorforth .CodeMirror-linenumber { color: #bababa; } +.cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-colorforth span.cm-comment { color: #ededed; } +.cm-s-colorforth span.cm-def { color: #ff1c1c; font-weight:bold; } +.cm-s-colorforth span.cm-keyword { color: #ffd900; } +.cm-s-colorforth span.cm-builtin { color: #00d95a; } +.cm-s-colorforth span.cm-variable { color: #73ff00; } +.cm-s-colorforth span.cm-string { color: #007bff; } +.cm-s-colorforth span.cm-number { color: #00c4ff; } +.cm-s-colorforth span.cm-atom { color: #606060; } + +.cm-s-colorforth span.cm-variable-2 { color: #EEE; } +.cm-s-colorforth span.cm-variable-3, .cm-s-colorforth span.cm-type { color: #DDD; } +.cm-s-colorforth span.cm-property {} +.cm-s-colorforth span.cm-operator {} + +.cm-s-colorforth span.cm-meta { color: yellow; } +.cm-s-colorforth span.cm-qualifier { color: #FFF700; } +.cm-s-colorforth span.cm-bracket { color: #cc7; } +.cm-s-colorforth span.cm-tag { color: #FFBD40; } +.cm-s-colorforth span.cm-attribute { color: #FFF700; } +.cm-s-colorforth span.cm-error { color: #f00; } + +.cm-s-colorforth div.CodeMirror-selected { background: #333d53; } + +.cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); } + +.cm-s-colorforth .CodeMirror-activeline-background { background: #253540; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/darcula.css b/WebContent/resources/fuscabr/lib/codemirror/theme/darcula.css new file mode 100755 index 0000000000..2ec81a3557 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/darcula.css @@ -0,0 +1,53 @@ +/** + Name: IntelliJ IDEA darcula theme + From IntelliJ IDEA by JetBrains + */ + +.cm-s-darcula { font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;} +.cm-s-darcula.CodeMirror { background: #2B2B2B; color: #A9B7C6; } + +.cm-s-darcula span.cm-meta { color: #BBB529; } +.cm-s-darcula span.cm-number { color: #6897BB; } +.cm-s-darcula span.cm-keyword { color: #CC7832; line-height: 1em; font-weight: bold; } +.cm-s-darcula span.cm-def { color: #A9B7C6; font-style: italic; } +.cm-s-darcula span.cm-variable { color: #A9B7C6; } +.cm-s-darcula span.cm-variable-2 { color: #A9B7C6; } +.cm-s-darcula span.cm-variable-3 { color: #9876AA; } +.cm-s-darcula span.cm-type { color: #AABBCC; font-weight: bold; } +.cm-s-darcula span.cm-property { color: #FFC66D; } +.cm-s-darcula span.cm-operator { color: #A9B7C6; } +.cm-s-darcula span.cm-string { color: #6A8759; } +.cm-s-darcula span.cm-string-2 { color: #6A8759; } +.cm-s-darcula span.cm-comment { color: #61A151; font-style: italic; } +.cm-s-darcula span.cm-link { color: #CC7832; } +.cm-s-darcula span.cm-atom { color: #CC7832; } +.cm-s-darcula span.cm-error { color: #BC3F3C; } +.cm-s-darcula span.cm-tag { color: #629755; font-weight: bold; font-style: italic; text-decoration: underline; } +.cm-s-darcula span.cm-attribute { color: #6897bb; } +.cm-s-darcula span.cm-qualifier { color: #6A8759; } +.cm-s-darcula span.cm-bracket { color: #A9B7C6; } +.cm-s-darcula span.cm-builtin { color: #FF9E59; } +.cm-s-darcula span.cm-special { color: #FF9E59; } +.cm-s-darcula span.cm-matchhighlight { color: #FFFFFF; background-color: rgba(50, 89, 48, .7); font-weight: normal;} +.cm-s-darcula span.cm-searching { color: #FFFFFF; background-color: rgba(61, 115, 59, .7); font-weight: normal;} + +.cm-s-darcula .CodeMirror-cursor { border-left: 1px solid #A9B7C6; } +.cm-s-darcula .CodeMirror-activeline-background { background: #323232; } +.cm-s-darcula .CodeMirror-gutters { background: #313335; border-right: 1px solid #313335; } +.cm-s-darcula .CodeMirror-guttermarker { color: #FFEE80; } +.cm-s-darcula .CodeMirror-guttermarker-subtle { color: #D0D0D0; } +.cm-s-darcula .CodeMirrir-linenumber { color: #606366; } +.cm-s-darcula .CodeMirror-matchingbracket { background-color: #3B514D; color: #FFEF28 !important; font-weight: bold; } + +.cm-s-darcula div.CodeMirror-selected { background: #214283; } + +.CodeMirror-hints.darcula { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; + color: #9C9E9E; + background-color: #3B3E3F !important; +} + +.CodeMirror-hints.darcula .CodeMirror-hint-active { + background-color: #494D4E !important; + color: #9C9E9E !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/dracula.css b/WebContent/resources/fuscabr/lib/codemirror/theme/dracula.css new file mode 100755 index 0000000000..253133efe7 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/dracula.css @@ -0,0 +1,40 @@ +/* + + Name: dracula + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme) + +*/ + + +.cm-s-dracula.CodeMirror, .cm-s-dracula .CodeMirror-gutters { + background-color: #282a36 !important; + color: #f8f8f2 !important; + border: none; +} +.cm-s-dracula .CodeMirror-gutters { color: #282a36; } +.cm-s-dracula .CodeMirror-cursor { border-left: solid thin #f8f8f0; } +.cm-s-dracula .CodeMirror-linenumber { color: #6D8A88; } +.cm-s-dracula .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula .CodeMirror-line::selection, .cm-s-dracula .CodeMirror-line > span::selection, .cm-s-dracula .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula .CodeMirror-line::-moz-selection, .cm-s-dracula .CodeMirror-line > span::-moz-selection, .cm-s-dracula .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-dracula span.cm-comment { color: #6272a4; } +.cm-s-dracula span.cm-string, .cm-s-dracula span.cm-string-2 { color: #f1fa8c; } +.cm-s-dracula span.cm-number { color: #bd93f9; } +.cm-s-dracula span.cm-variable { color: #50fa7b; } +.cm-s-dracula span.cm-variable-2 { color: white; } +.cm-s-dracula span.cm-def { color: #50fa7b; } +.cm-s-dracula span.cm-operator { color: #ff79c6; } +.cm-s-dracula span.cm-keyword { color: #ff79c6; } +.cm-s-dracula span.cm-atom { color: #bd93f9; } +.cm-s-dracula span.cm-meta { color: #f8f8f2; } +.cm-s-dracula span.cm-tag { color: #ff79c6; } +.cm-s-dracula span.cm-attribute { color: #50fa7b; } +.cm-s-dracula span.cm-qualifier { color: #50fa7b; } +.cm-s-dracula span.cm-property { color: #66d9ef; } +.cm-s-dracula span.cm-builtin { color: #50fa7b; } +.cm-s-dracula span.cm-variable-3, .cm-s-dracula span.cm-type { color: #ffb86c; } + +.cm-s-dracula .CodeMirror-activeline-background { background: rgba(255,255,255,0.1); } +.cm-s-dracula .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/duotone-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/duotone-dark.css new file mode 100755 index 0000000000..88fdc76c8e --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/duotone-dark.css @@ -0,0 +1,35 @@ +/* +Name: DuoTone-Dark +Author: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes) + +CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/) +*/ + +.cm-s-duotone-dark.CodeMirror { background: #2a2734; color: #6c6783; } +.cm-s-duotone-dark div.CodeMirror-selected { background: #545167!important; } +.cm-s-duotone-dark .CodeMirror-gutters { background: #2a2734; border-right: 0px; } +.cm-s-duotone-dark .CodeMirror-linenumber { color: #545167; } + +/* begin cursor */ +.cm-s-duotone-dark .CodeMirror-cursor { border-left: 1px solid #ffad5c; /* border-left: 1px solid #ffad5c80; */ border-right: .5em solid #ffad5c; /* border-right: .5em solid #ffad5c80; */ opacity: .5; } +.cm-s-duotone-dark .CodeMirror-activeline-background { background: #363342; /* background: #36334280; */ opacity: .5;} +.cm-s-duotone-dark .cm-fat-cursor .CodeMirror-cursor { background: #ffad5c; /* background: #ffad5c80; */ opacity: .5;} +/* end cursor */ + +.cm-s-duotone-dark span.cm-atom, .cm-s-duotone-dark span.cm-number, .cm-s-duotone-dark span.cm-keyword, .cm-s-duotone-dark span.cm-variable, .cm-s-duotone-dark span.cm-attribute, .cm-s-duotone-dark span.cm-quote, .cm-s-duotone-dark span.cm-hr, .cm-s-duotone-dark span.cm-link { color: #ffcc99; } + +.cm-s-duotone-dark span.cm-property { color: #9a86fd; } +.cm-s-duotone-dark span.cm-punctuation, .cm-s-duotone-dark span.cm-unit, .cm-s-duotone-dark span.cm-negative { color: #e09142; } +.cm-s-duotone-dark span.cm-string { color: #ffb870; } +.cm-s-duotone-dark span.cm-operator { color: #ffad5c; } +.cm-s-duotone-dark span.cm-positive { color: #6a51e6; } + +.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-type, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; } +.cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; } +.cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; } + +/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ +.cm-s-duotone-dark span.cm-error, .cm-s-duotone-dark span.cm-invalidchar { color: #f00; } + +.cm-s-duotone-dark span.cm-header { font-weight: normal; } +.cm-s-duotone-dark .CodeMirror-matchingbracket { text-decoration: underline; color: #eeebff !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/duotone-light.css b/WebContent/resources/fuscabr/lib/codemirror/theme/duotone-light.css new file mode 100755 index 0000000000..d99480f7c4 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/duotone-light.css @@ -0,0 +1,36 @@ +/* +Name: DuoTone-Light +Author: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes) + +CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/) +*/ + +.cm-s-duotone-light.CodeMirror { background: #faf8f5; color: #b29762; } +.cm-s-duotone-light div.CodeMirror-selected { background: #e3dcce !important; } +.cm-s-duotone-light .CodeMirror-gutters { background: #faf8f5; border-right: 0px; } +.cm-s-duotone-light .CodeMirror-linenumber { color: #cdc4b1; } + +/* begin cursor */ +.cm-s-duotone-light .CodeMirror-cursor { border-left: 1px solid #93abdc; /* border-left: 1px solid #93abdc80; */ border-right: .5em solid #93abdc; /* border-right: .5em solid #93abdc80; */ opacity: .5; } +.cm-s-duotone-light .CodeMirror-activeline-background { background: #e3dcce; /* background: #e3dcce80; */ opacity: .5; } +.cm-s-duotone-light .cm-fat-cursor .CodeMirror-cursor { background: #93abdc; /* #93abdc80; */ opacity: .5; } +/* end cursor */ + +.cm-s-duotone-light span.cm-atom, .cm-s-duotone-light span.cm-number, .cm-s-duotone-light span.cm-keyword, .cm-s-duotone-light span.cm-variable, .cm-s-duotone-light span.cm-attribute, .cm-s-duotone-light span.cm-quote, .cm-s-duotone-light-light span.cm-hr, .cm-s-duotone-light-light span.cm-link { color: #063289; } + +.cm-s-duotone-light span.cm-property { color: #b29762; } +.cm-s-duotone-light span.cm-punctuation, .cm-s-duotone-light span.cm-unit, .cm-s-duotone-light span.cm-negative { color: #063289; } +.cm-s-duotone-light span.cm-string, .cm-s-duotone-light span.cm-operator { color: #1659df; } +.cm-s-duotone-light span.cm-positive { color: #896724; } + +.cm-s-duotone-light span.cm-variable-2, .cm-s-duotone-light span.cm-variable-3, .cm-s-duotone-light span.cm-type, .cm-s-duotone-light span.cm-string-2, .cm-s-duotone-light span.cm-url { color: #896724; } +.cm-s-duotone-light span.cm-def, .cm-s-duotone-light span.cm-tag, .cm-s-duotone-light span.cm-builtin, .cm-s-duotone-light span.cm-qualifier, .cm-s-duotone-light span.cm-header, .cm-s-duotone-light span.cm-em { color: #2d2006; } +.cm-s-duotone-light span.cm-bracket, .cm-s-duotone-light span.cm-comment { color: #b6ad9a; } + +/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ +/* .cm-s-duotone-light span.cm-error { background: #896724; color: #728fcb; } */ +.cm-s-duotone-light span.cm-error, .cm-s-duotone-light span.cm-invalidchar { color: #f00; } + +.cm-s-duotone-light span.cm-header { font-weight: normal; } +.cm-s-duotone-light .CodeMirror-matchingbracket { text-decoration: underline; color: #faf8f5 !important; } + diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/eclipse.css b/WebContent/resources/fuscabr/lib/codemirror/theme/eclipse.css new file mode 100755 index 0000000000..800d603f6d --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/eclipse.css @@ -0,0 +1,23 @@ +.cm-s-eclipse span.cm-meta { color: #FF1717; } +.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } +.cm-s-eclipse span.cm-atom { color: #219; } +.cm-s-eclipse span.cm-number { color: #164; } +.cm-s-eclipse span.cm-def { color: #00f; } +.cm-s-eclipse span.cm-variable { color: black; } +.cm-s-eclipse span.cm-variable-2 { color: #0000C0; } +.cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; } +.cm-s-eclipse span.cm-property { color: black; } +.cm-s-eclipse span.cm-operator { color: black; } +.cm-s-eclipse span.cm-comment { color: #3F7F5F; } +.cm-s-eclipse span.cm-string { color: #2A00FF; } +.cm-s-eclipse span.cm-string-2 { color: #f50; } +.cm-s-eclipse span.cm-qualifier { color: #555; } +.cm-s-eclipse span.cm-builtin { color: #30a; } +.cm-s-eclipse span.cm-bracket { color: #cc7; } +.cm-s-eclipse span.cm-tag { color: #170; } +.cm-s-eclipse span.cm-attribute { color: #00c; } +.cm-s-eclipse span.cm-link { color: #219; } +.cm-s-eclipse span.cm-error { color: #f00; } + +.cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/elegant.css b/WebContent/resources/fuscabr/lib/codemirror/theme/elegant.css new file mode 100755 index 0000000000..45b3ea655e --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/elegant.css @@ -0,0 +1,13 @@ +.cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom { color: #762; } +.cm-s-elegant span.cm-comment { color: #262; font-style: italic; line-height: 1em; } +.cm-s-elegant span.cm-meta { color: #555; font-style: italic; line-height: 1em; } +.cm-s-elegant span.cm-variable { color: black; } +.cm-s-elegant span.cm-variable-2 { color: #b11; } +.cm-s-elegant span.cm-qualifier { color: #555; } +.cm-s-elegant span.cm-keyword { color: #730; } +.cm-s-elegant span.cm-builtin { color: #30a; } +.cm-s-elegant span.cm-link { color: #762; } +.cm-s-elegant span.cm-error { background-color: #fdd; } + +.cm-s-elegant .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-elegant .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/erlang-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/erlang-dark.css new file mode 100755 index 0000000000..8c8a4171a6 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/erlang-dark.css @@ -0,0 +1,34 @@ +.cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } +.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539; } +.cm-s-erlang-dark .CodeMirror-line::selection, .cm-s-erlang-dark .CodeMirror-line > span::selection, .cm-s-erlang-dark .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-line::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; } +.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-erlang-dark span.cm-quote { color: #ccc; } +.cm-s-erlang-dark span.cm-atom { color: #f133f1; } +.cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } +.cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } +.cm-s-erlang-dark span.cm-builtin { color: #eaa; } +.cm-s-erlang-dark span.cm-comment { color: #77f; } +.cm-s-erlang-dark span.cm-def { color: #e7a; } +.cm-s-erlang-dark span.cm-keyword { color: #ffee80; } +.cm-s-erlang-dark span.cm-meta { color: #50fefe; } +.cm-s-erlang-dark span.cm-number { color: #ffd0d0; } +.cm-s-erlang-dark span.cm-operator { color: #d55; } +.cm-s-erlang-dark span.cm-property { color: #ccc; } +.cm-s-erlang-dark span.cm-qualifier { color: #ccc; } +.cm-s-erlang-dark span.cm-special { color: #ffbbbb; } +.cm-s-erlang-dark span.cm-string { color: #3ad900; } +.cm-s-erlang-dark span.cm-string-2 { color: #ccc; } +.cm-s-erlang-dark span.cm-tag { color: #9effff; } +.cm-s-erlang-dark span.cm-variable { color: #50fe50; } +.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } +.cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; } +.cm-s-erlang-dark span.cm-error { color: #9d1e15; } + +.cm-s-erlang-dark .CodeMirror-activeline-background { background: #013461; } +.cm-s-erlang-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/gruvbox-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/gruvbox-dark.css new file mode 100755 index 0000000000..d712dda08d --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/gruvbox-dark.css @@ -0,0 +1,39 @@ +/* + + Name: gruvbox-dark + Author: kRkk (https://github.com/krkk) + + Original gruvbox color scheme by Pavel Pertsev (https://github.com/morhetz/gruvbox) + +*/ + +.cm-s-gruvbox-dark.CodeMirror, .cm-s-gruvbox-dark .CodeMirror-gutters { background-color: #282828; color: #bdae93; } +.cm-s-gruvbox-dark .CodeMirror-gutters {background: #282828; border-right: 0px;} +.cm-s-gruvbox-dark .CodeMirror-linenumber {color: #7c6f64;} +.cm-s-gruvbox-dark .CodeMirror-cursor { border-left: 1px solid #ebdbb2; } +.cm-s-gruvbox-dark.cm-fat-cursor .CodeMirror-cursor { background-color: #8e8d8875 !important; } +.cm-s-gruvbox-dark .cm-animate-fat-cursor { background-color: #8e8d8875 !important; } +.cm-s-gruvbox-dark div.CodeMirror-selected { background: #928374; } +.cm-s-gruvbox-dark span.cm-meta { color: #83a598; } + +.cm-s-gruvbox-dark span.cm-comment { color: #928374; } +.cm-s-gruvbox-dark span.cm-number, span.cm-atom { color: #d3869b; } +.cm-s-gruvbox-dark span.cm-keyword { color: #f84934; } + +.cm-s-gruvbox-dark span.cm-variable { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-variable-2 { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-variable-3, .cm-s-gruvbox-dark span.cm-type { color: #fabd2f; } +.cm-s-gruvbox-dark span.cm-operator { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-callee { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-def { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-property { color: #ebdbb2; } +.cm-s-gruvbox-dark span.cm-string { color: #b8bb26; } +.cm-s-gruvbox-dark span.cm-string-2 { color: #8ec07c; } +.cm-s-gruvbox-dark span.cm-qualifier { color: #8ec07c; } +.cm-s-gruvbox-dark span.cm-attribute { color: #8ec07c; } + +.cm-s-gruvbox-dark .CodeMirror-activeline-background { background: #3c3836; } +.cm-s-gruvbox-dark .CodeMirror-matchingbracket { background: #928374; color:#282828 !important; } + +.cm-s-gruvbox-dark span.cm-builtin { color: #fe8019; } +.cm-s-gruvbox-dark span.cm-tag { color: #fe8019; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/hopscotch.css b/WebContent/resources/fuscabr/lib/codemirror/theme/hopscotch.css new file mode 100755 index 0000000000..7d05431bdc --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/hopscotch.css @@ -0,0 +1,34 @@ +/* + + Name: Hopscotch + Author: Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-hopscotch.CodeMirror {background: #322931; color: #d5d3d5;} +.cm-s-hopscotch div.CodeMirror-selected {background: #433b42 !important;} +.cm-s-hopscotch .CodeMirror-gutters {background: #322931; border-right: 0px;} +.cm-s-hopscotch .CodeMirror-linenumber {color: #797379;} +.cm-s-hopscotch .CodeMirror-cursor {border-left: 1px solid #989498 !important;} + +.cm-s-hopscotch span.cm-comment {color: #b33508;} +.cm-s-hopscotch span.cm-atom {color: #c85e7c;} +.cm-s-hopscotch span.cm-number {color: #c85e7c;} + +.cm-s-hopscotch span.cm-property, .cm-s-hopscotch span.cm-attribute {color: #8fc13e;} +.cm-s-hopscotch span.cm-keyword {color: #dd464c;} +.cm-s-hopscotch span.cm-string {color: #fdcc59;} + +.cm-s-hopscotch span.cm-variable {color: #8fc13e;} +.cm-s-hopscotch span.cm-variable-2 {color: #1290bf;} +.cm-s-hopscotch span.cm-def {color: #fd8b19;} +.cm-s-hopscotch span.cm-error {background: #dd464c; color: #989498;} +.cm-s-hopscotch span.cm-bracket {color: #d5d3d5;} +.cm-s-hopscotch span.cm-tag {color: #dd464c;} +.cm-s-hopscotch span.cm-link {color: #c85e7c;} + +.cm-s-hopscotch .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-hopscotch .CodeMirror-activeline-background { background: #302020; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/icecoder.css b/WebContent/resources/fuscabr/lib/codemirror/theme/icecoder.css new file mode 100755 index 0000000000..5440fbe27c --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/icecoder.css @@ -0,0 +1,43 @@ +/* +ICEcoder default theme by Matt Pass, used in code editor available at https://icecoder.net +*/ + +.cm-s-icecoder { color: #666; background: #1d1d1b; } + +.cm-s-icecoder span.cm-keyword { color: #eee; font-weight:bold; } /* off-white 1 */ +.cm-s-icecoder span.cm-atom { color: #e1c76e; } /* yellow */ +.cm-s-icecoder span.cm-number { color: #6cb5d9; } /* blue */ +.cm-s-icecoder span.cm-def { color: #b9ca4a; } /* green */ + +.cm-s-icecoder span.cm-variable { color: #6cb5d9; } /* blue */ +.cm-s-icecoder span.cm-variable-2 { color: #cc1e5c; } /* pink */ +.cm-s-icecoder span.cm-variable-3, .cm-s-icecoder span.cm-type { color: #f9602c; } /* orange */ + +.cm-s-icecoder span.cm-property { color: #eee; } /* off-white 1 */ +.cm-s-icecoder span.cm-operator { color: #9179bb; } /* purple */ +.cm-s-icecoder span.cm-comment { color: #97a3aa; } /* grey-blue */ + +.cm-s-icecoder span.cm-string { color: #b9ca4a; } /* green */ +.cm-s-icecoder span.cm-string-2 { color: #6cb5d9; } /* blue */ + +.cm-s-icecoder span.cm-meta { color: #555; } /* grey */ + +.cm-s-icecoder span.cm-qualifier { color: #555; } /* grey */ +.cm-s-icecoder span.cm-builtin { color: #214e7b; } /* bright blue */ +.cm-s-icecoder span.cm-bracket { color: #cc7; } /* grey-yellow */ + +.cm-s-icecoder span.cm-tag { color: #e8e8e8; } /* off-white 2 */ +.cm-s-icecoder span.cm-attribute { color: #099; } /* teal */ + +.cm-s-icecoder span.cm-header { color: #6a0d6a; } /* purple-pink */ +.cm-s-icecoder span.cm-quote { color: #186718; } /* dark green */ +.cm-s-icecoder span.cm-hr { color: #888; } /* mid-grey */ +.cm-s-icecoder span.cm-link { color: #e1c76e; } /* yellow */ +.cm-s-icecoder span.cm-error { color: #d00; } /* red */ + +.cm-s-icecoder .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-icecoder div.CodeMirror-selected { color: #fff; background: #037; } +.cm-s-icecoder .CodeMirror-gutters { background: #1d1d1b; min-width: 41px; border-right: 0; } +.cm-s-icecoder .CodeMirror-linenumber { color: #555; cursor: default; } +.cm-s-icecoder .CodeMirror-matchingbracket { color: #fff !important; background: #555 !important; } +.cm-s-icecoder .CodeMirror-activeline-background { background: #000; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/idea.css b/WebContent/resources/fuscabr/lib/codemirror/theme/idea.css new file mode 100755 index 0000000000..eab36717ad --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/idea.css @@ -0,0 +1,42 @@ +/** + Name: IDEA default theme + From IntelliJ IDEA by JetBrains + */ + +.cm-s-idea span.cm-meta { color: #808000; } +.cm-s-idea span.cm-number { color: #0000FF; } +.cm-s-idea span.cm-keyword { line-height: 1em; font-weight: bold; color: #000080; } +.cm-s-idea span.cm-atom { font-weight: bold; color: #000080; } +.cm-s-idea span.cm-def { color: #000000; } +.cm-s-idea span.cm-variable { color: black; } +.cm-s-idea span.cm-variable-2 { color: black; } +.cm-s-idea span.cm-variable-3, .cm-s-idea span.cm-type { color: black; } +.cm-s-idea span.cm-property { color: black; } +.cm-s-idea span.cm-operator { color: black; } +.cm-s-idea span.cm-comment { color: #808080; } +.cm-s-idea span.cm-string { color: #008000; } +.cm-s-idea span.cm-string-2 { color: #008000; } +.cm-s-idea span.cm-qualifier { color: #555; } +.cm-s-idea span.cm-error { color: #FF0000; } +.cm-s-idea span.cm-attribute { color: #0000FF; } +.cm-s-idea span.cm-tag { color: #000080; } +.cm-s-idea span.cm-link { color: #0000FF; } +.cm-s-idea .CodeMirror-activeline-background { background: #FFFAE3; } + +.cm-s-idea span.cm-builtin { color: #30a; } +.cm-s-idea span.cm-bracket { color: #cc7; } +.cm-s-idea { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;} + + +.cm-s-idea .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } + +.CodeMirror-hints.idea { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; + color: #616569; + background-color: #ebf3fd !important; +} + +.CodeMirror-hints.idea .CodeMirror-hint-active { + background-color: #a2b8c9 !important; + color: #5c6065 !important; +} \ No newline at end of file diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/isotope.css b/WebContent/resources/fuscabr/lib/codemirror/theme/isotope.css new file mode 100755 index 0000000000..d0d6263cf4 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/isotope.css @@ -0,0 +1,34 @@ +/* + + Name: Isotope + Author: David Desandro / Jan T. Sott + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-isotope.CodeMirror {background: #000000; color: #e0e0e0;} +.cm-s-isotope div.CodeMirror-selected {background: #404040 !important;} +.cm-s-isotope .CodeMirror-gutters {background: #000000; border-right: 0px;} +.cm-s-isotope .CodeMirror-linenumber {color: #808080;} +.cm-s-isotope .CodeMirror-cursor {border-left: 1px solid #c0c0c0 !important;} + +.cm-s-isotope span.cm-comment {color: #3300ff;} +.cm-s-isotope span.cm-atom {color: #cc00ff;} +.cm-s-isotope span.cm-number {color: #cc00ff;} + +.cm-s-isotope span.cm-property, .cm-s-isotope span.cm-attribute {color: #33ff00;} +.cm-s-isotope span.cm-keyword {color: #ff0000;} +.cm-s-isotope span.cm-string {color: #ff0099;} + +.cm-s-isotope span.cm-variable {color: #33ff00;} +.cm-s-isotope span.cm-variable-2 {color: #0066ff;} +.cm-s-isotope span.cm-def {color: #ff9900;} +.cm-s-isotope span.cm-error {background: #ff0000; color: #c0c0c0;} +.cm-s-isotope span.cm-bracket {color: #e0e0e0;} +.cm-s-isotope span.cm-tag {color: #ff0000;} +.cm-s-isotope span.cm-link {color: #cc00ff;} + +.cm-s-isotope .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-isotope .CodeMirror-activeline-background { background: #202020; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/juejin.css b/WebContent/resources/fuscabr/lib/codemirror/theme/juejin.css new file mode 100755 index 0000000000..38cf7fe373 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/juejin.css @@ -0,0 +1,30 @@ +.cm-s-juejin.CodeMirror { + background: #f8f9fa; +} +.cm-s-juejin .cm-header, +.cm-s-juejin .cm-def { + color: #1ba2f0; +} +.cm-s-juejin .cm-comment { + color: #009e9d; +} +.cm-s-juejin .cm-quote, +.cm-s-juejin .cm-link, +.cm-s-juejin .cm-strong, +.cm-s-juejin .cm-attribute { + color: #fd7741; +} +.cm-s-juejin .cm-url, +.cm-s-juejin .cm-keyword, +.cm-s-juejin .cm-builtin { + color: #bb51b8; +} +.cm-s-juejin .cm-hr { + color: #909090; +} +.cm-s-juejin .cm-tag { + color: #107000; +} +.cm-s-juejin .cm-variable-2 { + color: #0050a0; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/lesser-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/lesser-dark.css new file mode 100755 index 0000000000..f96bf430c2 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/lesser-dark.css @@ -0,0 +1,47 @@ +/* +http://lesscss.org/ dark theme +Ported to CodeMirror by Peter Kroon +*/ +.cm-s-lesser-dark { + line-height: 1.3em; +} +.cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } +.cm-s-lesser-dark div.CodeMirror-selected { background: #45443B; } /* 33322B*/ +.cm-s-lesser-dark .CodeMirror-line::selection, .cm-s-lesser-dark .CodeMirror-line > span::selection, .cm-s-lesser-dark .CodeMirror-line > span > span::selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark .CodeMirror-line::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span::-moz-selection, .cm-s-lesser-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(69, 68, 59, .99); } +.cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ + +.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ + +.cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } +.cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; } +.cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } + +.cm-s-lesser-dark span.cm-header { color: #a0a; } +.cm-s-lesser-dark span.cm-quote { color: #090; } +.cm-s-lesser-dark span.cm-keyword { color: #599eff; } +.cm-s-lesser-dark span.cm-atom { color: #C2B470; } +.cm-s-lesser-dark span.cm-number { color: #B35E4D; } +.cm-s-lesser-dark span.cm-def { color: white; } +.cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } +.cm-s-lesser-dark span.cm-variable-2 { color: #669199; } +.cm-s-lesser-dark span.cm-variable-3, .cm-s-lesser-dark span.cm-type { color: white; } +.cm-s-lesser-dark span.cm-property { color: #92A75C; } +.cm-s-lesser-dark span.cm-operator { color: #92A75C; } +.cm-s-lesser-dark span.cm-comment { color: #666; } +.cm-s-lesser-dark span.cm-string { color: #BCD279; } +.cm-s-lesser-dark span.cm-string-2 { color: #f50; } +.cm-s-lesser-dark span.cm-meta { color: #738C73; } +.cm-s-lesser-dark span.cm-qualifier { color: #555; } +.cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } +.cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } +.cm-s-lesser-dark span.cm-tag { color: #669199; } +.cm-s-lesser-dark span.cm-attribute { color: #81a4d5; } +.cm-s-lesser-dark span.cm-hr { color: #999; } +.cm-s-lesser-dark span.cm-link { color: #7070E6; } +.cm-s-lesser-dark span.cm-error { color: #9d1e15; } + +.cm-s-lesser-dark .CodeMirror-activeline-background { background: #3C3A3A; } +.cm-s-lesser-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/liquibyte.css b/WebContent/resources/fuscabr/lib/codemirror/theme/liquibyte.css new file mode 100755 index 0000000000..393825e029 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/liquibyte.css @@ -0,0 +1,95 @@ +.cm-s-liquibyte.CodeMirror { + background-color: #000; + color: #fff; + line-height: 1.2em; + font-size: 1em; +} +.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight { + text-decoration: underline; + text-decoration-color: #0f0; + text-decoration-style: wavy; +} +.cm-s-liquibyte .cm-trailingspace { + text-decoration: line-through; + text-decoration-color: #f00; + text-decoration-style: dotted; +} +.cm-s-liquibyte .cm-tab { + text-decoration: line-through; + text-decoration-color: #404040; + text-decoration-style: dotted; +} +.cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; } +.cm-s-liquibyte .CodeMirror-gutter-elt div { font-size: 1.2em; } +.cm-s-liquibyte .CodeMirror-guttermarker { } +.cm-s-liquibyte .CodeMirror-guttermarker-subtle { } +.cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0; } +.cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee; } + +.cm-s-liquibyte span.cm-comment { color: #008000; } +.cm-s-liquibyte span.cm-def { color: #ffaf40; font-weight: bold; } +.cm-s-liquibyte span.cm-keyword { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-builtin { color: #ffaf40; font-weight: bold; } +.cm-s-liquibyte span.cm-variable { color: #5967ff; font-weight: bold; } +.cm-s-liquibyte span.cm-string { color: #ff8000; } +.cm-s-liquibyte span.cm-number { color: #0f0; font-weight: bold; } +.cm-s-liquibyte span.cm-atom { color: #bf3030; font-weight: bold; } + +.cm-s-liquibyte span.cm-variable-2 { color: #007f7f; font-weight: bold; } +.cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-property { color: #999; font-weight: bold; } +.cm-s-liquibyte span.cm-operator { color: #fff; } + +.cm-s-liquibyte span.cm-meta { color: #0f0; } +.cm-s-liquibyte span.cm-qualifier { color: #fff700; font-weight: bold; } +.cm-s-liquibyte span.cm-bracket { color: #cc7; } +.cm-s-liquibyte span.cm-tag { color: #ff0; font-weight: bold; } +.cm-s-liquibyte span.cm-attribute { color: #c080ff; font-weight: bold; } +.cm-s-liquibyte span.cm-error { color: #f00; } + +.cm-s-liquibyte div.CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25); } + +.cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); } + +.cm-s-liquibyte .CodeMirror-activeline-background { background-color: rgba(0, 255, 0, 0.15); } + +/* Default styles for common addons */ +.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; } +.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; } +.CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); } +/* Scrollbars */ +/* Simple */ +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover { + background-color: rgba(80, 80, 80, .7); +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div { + background-color: rgba(80, 80, 80, .3); + border: 1px solid #404040; + border-radius: 5px; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div { + border-top: 1px solid #404040; + border-bottom: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div { + border-left: 1px solid #404040; + border-right: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-vertical { + background-color: #262626; +} +.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal { + background-color: #262626; + border-top: 1px solid #404040; +} +/* Overlay */ +.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div { + background-color: #404040; + border-radius: 5px; +} +.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div { + border: 1px solid #404040; +} +.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div { + border: 1px solid #404040; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/lucario.css b/WebContent/resources/fuscabr/lib/codemirror/theme/lucario.css new file mode 100755 index 0000000000..17a1551032 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/lucario.css @@ -0,0 +1,37 @@ +/* + Name: lucario + Author: Raphael Amorim + + Original Lucario color scheme (https://github.com/raphamorim/lucario) +*/ + +.cm-s-lucario.CodeMirror, .cm-s-lucario .CodeMirror-gutters { + background-color: #2b3e50 !important; + color: #f8f8f2 !important; + border: none; +} +.cm-s-lucario .CodeMirror-gutters { color: #2b3e50; } +.cm-s-lucario .CodeMirror-cursor { border-left: solid thin #E6C845; } +.cm-s-lucario .CodeMirror-linenumber { color: #f8f8f2; } +.cm-s-lucario .CodeMirror-selected { background: #243443; } +.cm-s-lucario .CodeMirror-line::selection, .cm-s-lucario .CodeMirror-line > span::selection, .cm-s-lucario .CodeMirror-line > span > span::selection { background: #243443; } +.cm-s-lucario .CodeMirror-line::-moz-selection, .cm-s-lucario .CodeMirror-line > span::-moz-selection, .cm-s-lucario .CodeMirror-line > span > span::-moz-selection { background: #243443; } +.cm-s-lucario span.cm-comment { color: #5c98cd; } +.cm-s-lucario span.cm-string, .cm-s-lucario span.cm-string-2 { color: #E6DB74; } +.cm-s-lucario span.cm-number { color: #ca94ff; } +.cm-s-lucario span.cm-variable { color: #f8f8f2; } +.cm-s-lucario span.cm-variable-2 { color: #f8f8f2; } +.cm-s-lucario span.cm-def { color: #72C05D; } +.cm-s-lucario span.cm-operator { color: #66D9EF; } +.cm-s-lucario span.cm-keyword { color: #ff6541; } +.cm-s-lucario span.cm-atom { color: #bd93f9; } +.cm-s-lucario span.cm-meta { color: #f8f8f2; } +.cm-s-lucario span.cm-tag { color: #ff6541; } +.cm-s-lucario span.cm-attribute { color: #66D9EF; } +.cm-s-lucario span.cm-qualifier { color: #72C05D; } +.cm-s-lucario span.cm-property { color: #f8f8f2; } +.cm-s-lucario span.cm-builtin { color: #72C05D; } +.cm-s-lucario span.cm-variable-3, .cm-s-lucario span.cm-type { color: #ffb86c; } + +.cm-s-lucario .CodeMirror-activeline-background { background: #243443; } +.cm-s-lucario .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/material-darker.css b/WebContent/resources/fuscabr/lib/codemirror/theme/material-darker.css new file mode 100755 index 0000000000..45b64efb25 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/material-darker.css @@ -0,0 +1,135 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-darker.CodeMirror { + background-color: #212121; + color: #EEFFFF; +} + +.cm-s-material-darker .CodeMirror-gutters { + background: #212121; + color: #545454; + border: none; +} + +.cm-s-material-darker .CodeMirror-guttermarker, +.cm-s-material-darker .CodeMirror-guttermarker-subtle, +.cm-s-material-darker .CodeMirror-linenumber { + color: #545454; +} + +.cm-s-material-darker .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} + +.cm-s-material-darker div.CodeMirror-selected { + background: rgba(97, 97, 97, 0.2); +} + +.cm-s-material-darker.CodeMirror-focused div.CodeMirror-selected { + background: rgba(97, 97, 97, 0.2); +} + +.cm-s-material-darker .CodeMirror-line::selection, +.cm-s-material-darker .CodeMirror-line>span::selection, +.cm-s-material-darker .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-darker .CodeMirror-line::-moz-selection, +.cm-s-material-darker .CodeMirror-line>span::-moz-selection, +.cm-s-material-darker .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-darker .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-darker .cm-keyword { + color: #C792EA; +} + +.cm-s-material-darker .cm-operator { + color: #89DDFF; +} + +.cm-s-material-darker .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-darker .cm-variable-3, +.cm-s-material-darker .cm-type { + color: #f07178; +} + +.cm-s-material-darker .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-darker .cm-atom { + color: #F78C6C; +} + +.cm-s-material-darker .cm-number { + color: #FF5370; +} + +.cm-s-material-darker .cm-def { + color: #82AAFF; +} + +.cm-s-material-darker .cm-string { + color: #C3E88D; +} + +.cm-s-material-darker .cm-string-2 { + color: #f07178; +} + +.cm-s-material-darker .cm-comment { + color: #545454; +} + +.cm-s-material-darker .cm-variable { + color: #f07178; +} + +.cm-s-material-darker .cm-tag { + color: #FF5370; +} + +.cm-s-material-darker .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-darker .cm-attribute { + color: #C792EA; +} + +.cm-s-material-darker .cm-property { + color: #C792EA; +} + +.cm-s-material-darker .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-darker .cm-variable-3, +.cm-s-material-darker .cm-type { + color: #DECB6B; +} + + +.cm-s-material-darker .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-darker .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} \ No newline at end of file diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/material-ocean.css b/WebContent/resources/fuscabr/lib/codemirror/theme/material-ocean.css new file mode 100755 index 0000000000..404178de22 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/material-ocean.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-ocean.CodeMirror { + background-color: #0F111A; + color: #8F93A2; +} + +.cm-s-material-ocean .CodeMirror-gutters { + background: #0F111A; + color: #464B5D; + border: none; +} + +.cm-s-material-ocean .CodeMirror-guttermarker, +.cm-s-material-ocean .CodeMirror-guttermarker-subtle, +.cm-s-material-ocean .CodeMirror-linenumber { + color: #464B5D; +} + +.cm-s-material-ocean .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material-ocean.cm-fat-cursor .CodeMirror-cursor { + background-color: #a2a8a175 !important; +} +.cm-s-material-ocean .cm-animate-fat-cursor { + background-color: #a2a8a175 !important; +} + +.cm-s-material-ocean div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-ocean.CodeMirror-focused div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-ocean .CodeMirror-line::selection, +.cm-s-material-ocean .CodeMirror-line>span::selection, +.cm-s-material-ocean .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-ocean .CodeMirror-line::-moz-selection, +.cm-s-material-ocean .CodeMirror-line>span::-moz-selection, +.cm-s-material-ocean .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-ocean .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-ocean .cm-keyword { + color: #C792EA; +} + +.cm-s-material-ocean .cm-operator { + color: #89DDFF; +} + +.cm-s-material-ocean .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-ocean .cm-variable-3, +.cm-s-material-ocean .cm-type { + color: #f07178; +} + +.cm-s-material-ocean .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-ocean .cm-atom { + color: #F78C6C; +} + +.cm-s-material-ocean .cm-number { + color: #FF5370; +} + +.cm-s-material-ocean .cm-def { + color: #82AAFF; +} + +.cm-s-material-ocean .cm-string { + color: #C3E88D; +} + +.cm-s-material-ocean .cm-string-2 { + color: #f07178; +} + +.cm-s-material-ocean .cm-comment { + color: #464B5D; +} + +.cm-s-material-ocean .cm-variable { + color: #f07178; +} + +.cm-s-material-ocean .cm-tag { + color: #FF5370; +} + +.cm-s-material-ocean .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-ocean .cm-attribute { + color: #C792EA; +} + +.cm-s-material-ocean .cm-property { + color: #C792EA; +} + +.cm-s-material-ocean .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-ocean .cm-variable-3, +.cm-s-material-ocean .cm-type { + color: #DECB6B; +} + + +.cm-s-material-ocean .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-ocean .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/material-palenight.css b/WebContent/resources/fuscabr/lib/codemirror/theme/material-palenight.css new file mode 100755 index 0000000000..6712c43a0e --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/material-palenight.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material-palenight.CodeMirror { + background-color: #292D3E; + color: #A6ACCD; +} + +.cm-s-material-palenight .CodeMirror-gutters { + background: #292D3E; + color: #676E95; + border: none; +} + +.cm-s-material-palenight .CodeMirror-guttermarker, +.cm-s-material-palenight .CodeMirror-guttermarker-subtle, +.cm-s-material-palenight .CodeMirror-linenumber { + color: #676E95; +} + +.cm-s-material-palenight .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material-palenight.cm-fat-cursor .CodeMirror-cursor { + background-color: #607c8b80 !important; +} +.cm-s-material-palenight .cm-animate-fat-cursor { + background-color: #607c8b80 !important; +} + +.cm-s-material-palenight div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-palenight.CodeMirror-focused div.CodeMirror-selected { + background: rgba(113, 124, 180, 0.2); +} + +.cm-s-material-palenight .CodeMirror-line::selection, +.cm-s-material-palenight .CodeMirror-line>span::selection, +.cm-s-material-palenight .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-palenight .CodeMirror-line::-moz-selection, +.cm-s-material-palenight .CodeMirror-line>span::-moz-selection, +.cm-s-material-palenight .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material-palenight .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material-palenight .cm-keyword { + color: #C792EA; +} + +.cm-s-material-palenight .cm-operator { + color: #89DDFF; +} + +.cm-s-material-palenight .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material-palenight .cm-variable-3, +.cm-s-material-palenight .cm-type { + color: #f07178; +} + +.cm-s-material-palenight .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material-palenight .cm-atom { + color: #F78C6C; +} + +.cm-s-material-palenight .cm-number { + color: #FF5370; +} + +.cm-s-material-palenight .cm-def { + color: #82AAFF; +} + +.cm-s-material-palenight .cm-string { + color: #C3E88D; +} + +.cm-s-material-palenight .cm-string-2 { + color: #f07178; +} + +.cm-s-material-palenight .cm-comment { + color: #676E95; +} + +.cm-s-material-palenight .cm-variable { + color: #f07178; +} + +.cm-s-material-palenight .cm-tag { + color: #FF5370; +} + +.cm-s-material-palenight .cm-meta { + color: #FFCB6B; +} + +.cm-s-material-palenight .cm-attribute { + color: #C792EA; +} + +.cm-s-material-palenight .cm-property { + color: #C792EA; +} + +.cm-s-material-palenight .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material-palenight .cm-variable-3, +.cm-s-material-palenight .cm-type { + color: #DECB6B; +} + + +.cm-s-material-palenight .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material-palenight .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/material.css b/WebContent/resources/fuscabr/lib/codemirror/theme/material.css new file mode 100755 index 0000000000..a7848499a7 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/material.css @@ -0,0 +1,141 @@ +/* + Name: material + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://material-theme.site/ +*/ + +.cm-s-material.CodeMirror { + background-color: #263238; + color: #EEFFFF; +} + +.cm-s-material .CodeMirror-gutters { + background: #263238; + color: #546E7A; + border: none; +} + +.cm-s-material .CodeMirror-guttermarker, +.cm-s-material .CodeMirror-guttermarker-subtle, +.cm-s-material .CodeMirror-linenumber { + color: #546E7A; +} + +.cm-s-material .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} +.cm-s-material.cm-fat-cursor .CodeMirror-cursor { + background-color: #5d6d5c80 !important; +} +.cm-s-material .cm-animate-fat-cursor { + background-color: #5d6d5c80 !important; +} + +.cm-s-material div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material.CodeMirror-focused div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-line::selection, +.cm-s-material .CodeMirror-line>span::selection, +.cm-s-material .CodeMirror-line>span>span::selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-line::-moz-selection, +.cm-s-material .CodeMirror-line>span::-moz-selection, +.cm-s-material .CodeMirror-line>span>span::-moz-selection { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-material .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.5); +} + +.cm-s-material .cm-keyword { + color: #C792EA; +} + +.cm-s-material .cm-operator { + color: #89DDFF; +} + +.cm-s-material .cm-variable-2 { + color: #EEFFFF; +} + +.cm-s-material .cm-variable-3, +.cm-s-material .cm-type { + color: #f07178; +} + +.cm-s-material .cm-builtin { + color: #FFCB6B; +} + +.cm-s-material .cm-atom { + color: #F78C6C; +} + +.cm-s-material .cm-number { + color: #FF5370; +} + +.cm-s-material .cm-def { + color: #82AAFF; +} + +.cm-s-material .cm-string { + color: #C3E88D; +} + +.cm-s-material .cm-string-2 { + color: #f07178; +} + +.cm-s-material .cm-comment { + color: #546E7A; +} + +.cm-s-material .cm-variable { + color: #f07178; +} + +.cm-s-material .cm-tag { + color: #FF5370; +} + +.cm-s-material .cm-meta { + color: #FFCB6B; +} + +.cm-s-material .cm-attribute { + color: #C792EA; +} + +.cm-s-material .cm-property { + color: #C792EA; +} + +.cm-s-material .cm-qualifier { + color: #DECB6B; +} + +.cm-s-material .cm-variable-3, +.cm-s-material .cm-type { + color: #DECB6B; +} + + +.cm-s-material .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-material .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/mbo.css b/WebContent/resources/fuscabr/lib/codemirror/theme/mbo.css new file mode 100755 index 0000000000..e164fcf42a --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/mbo.css @@ -0,0 +1,37 @@ +/****************************************************************/ +/* Based on mbonaci's Brackets mbo theme */ +/* https://github.com/mbonaci/global/blob/master/Mbo.tmTheme */ +/* Create your own: http://tmtheme-editor.herokuapp.com */ +/****************************************************************/ + +.cm-s-mbo.CodeMirror { background: #2c2c2c; color: #ffffec; } +.cm-s-mbo div.CodeMirror-selected { background: #716C62; } +.cm-s-mbo .CodeMirror-line::selection, .cm-s-mbo .CodeMirror-line > span::selection, .cm-s-mbo .CodeMirror-line > span > span::selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo .CodeMirror-line::-moz-selection, .cm-s-mbo .CodeMirror-line > span::-moz-selection, .cm-s-mbo .CodeMirror-line > span > span::-moz-selection { background: rgba(113, 108, 98, .99); } +.cm-s-mbo .CodeMirror-gutters { background: #4e4e4e; border-right: 0px; } +.cm-s-mbo .CodeMirror-guttermarker { color: white; } +.cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; } +.cm-s-mbo .CodeMirror-linenumber { color: #dadada; } +.cm-s-mbo .CodeMirror-cursor { border-left: 1px solid #ffffec; } + +.cm-s-mbo span.cm-comment { color: #95958a; } +.cm-s-mbo span.cm-atom { color: #00a8c6; } +.cm-s-mbo span.cm-number { color: #00a8c6; } + +.cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute { color: #9ddfe9; } +.cm-s-mbo span.cm-keyword { color: #ffb928; } +.cm-s-mbo span.cm-string { color: #ffcf6c; } +.cm-s-mbo span.cm-string.cm-property { color: #ffffec; } + +.cm-s-mbo span.cm-variable { color: #ffffec; } +.cm-s-mbo span.cm-variable-2 { color: #00a8c6; } +.cm-s-mbo span.cm-def { color: #ffffec; } +.cm-s-mbo span.cm-bracket { color: #fffffc; font-weight: bold; } +.cm-s-mbo span.cm-tag { color: #9ddfe9; } +.cm-s-mbo span.cm-link { color: #f54b07; } +.cm-s-mbo span.cm-error { border-bottom: #636363; color: #ffffec; } +.cm-s-mbo span.cm-qualifier { color: #ffffec; } + +.cm-s-mbo .CodeMirror-activeline-background { background: #494b41; } +.cm-s-mbo .CodeMirror-matchingbracket { color: #ffb928 !important; } +.cm-s-mbo .CodeMirror-matchingtag { background: rgba(255, 255, 255, .37); } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/mdn-like.css b/WebContent/resources/fuscabr/lib/codemirror/theme/mdn-like.css new file mode 100755 index 0000000000..622ed3efb7 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/mdn-like.css @@ -0,0 +1,46 @@ +/* + MDN-LIKE Theme - Mozilla + Ported to CodeMirror by Peter Kroon + Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues + GitHub: @peterkroon + + The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation + +*/ +.cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; } +.cm-s-mdn-like div.CodeMirror-selected { background: #cfc; } +.cm-s-mdn-like .CodeMirror-line::selection, .cm-s-mdn-like .CodeMirror-line > span::selection, .cm-s-mdn-like .CodeMirror-line > span > span::selection { background: #cfc; } +.cm-s-mdn-like .CodeMirror-line::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span::-moz-selection, .cm-s-mdn-like .CodeMirror-line > span > span::-moz-selection { background: #cfc; } + +.cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; } +.cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; padding-left: 8px; } +.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; } + +.cm-s-mdn-like .cm-keyword { color: #6262FF; } +.cm-s-mdn-like .cm-atom { color: #F90; } +.cm-s-mdn-like .cm-number { color: #ca7841; } +.cm-s-mdn-like .cm-def { color: #8DA6CE; } +.cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } +.cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def, .cm-s-mdn-like span.cm-type { color: #07a; } + +.cm-s-mdn-like .cm-variable { color: #07a; } +.cm-s-mdn-like .cm-property { color: #905; } +.cm-s-mdn-like .cm-qualifier { color: #690; } + +.cm-s-mdn-like .cm-operator { color: #cda869; } +.cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; } +.cm-s-mdn-like .cm-string { color:#07a; font-style:italic; } +.cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/ +.cm-s-mdn-like .cm-meta { color: #000; } /*?*/ +.cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/ +.cm-s-mdn-like .cm-tag { color: #997643; } +.cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-mdn-like .cm-header { color: #FF6400; } +.cm-s-mdn-like .cm-hr { color: #AEAEAE; } +.cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } +.cm-s-mdn-like .cm-error { border-bottom: 1px solid red; } + +div.cm-s-mdn-like .CodeMirror-activeline-background { background: #efefff; } +div.cm-s-mdn-like span.CodeMirror-matchingbracket { outline:1px solid grey; color: inherit; } + +.cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,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); } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/midnight.css b/WebContent/resources/fuscabr/lib/codemirror/theme/midnight.css new file mode 100755 index 0000000000..fc26474a4a --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/midnight.css @@ -0,0 +1,39 @@ +/* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */ + +/**/ +.cm-s-midnight .CodeMirror-activeline-background { background: #253540; } + +.cm-s-midnight.CodeMirror { + background: #0F192A; + color: #D1EDFF; +} + +.cm-s-midnight div.CodeMirror-selected { background: #314D67; } +.cm-s-midnight .CodeMirror-line::selection, .cm-s-midnight .CodeMirror-line > span::selection, .cm-s-midnight .CodeMirror-line > span > span::selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight .CodeMirror-line::-moz-selection, .cm-s-midnight .CodeMirror-line > span::-moz-selection, .cm-s-midnight .CodeMirror-line > span > span::-moz-selection { background: rgba(49, 77, 103, .99); } +.cm-s-midnight .CodeMirror-gutters { background: #0F192A; border-right: 1px solid; } +.cm-s-midnight .CodeMirror-guttermarker { color: white; } +.cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-midnight .CodeMirror-linenumber { color: #D0D0D0; } +.cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0; } + +.cm-s-midnight span.cm-comment { color: #428BDD; } +.cm-s-midnight span.cm-atom { color: #AE81FF; } +.cm-s-midnight span.cm-number { color: #D1EDFF; } + +.cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute { color: #A6E22E; } +.cm-s-midnight span.cm-keyword { color: #E83737; } +.cm-s-midnight span.cm-string { color: #1DC116; } + +.cm-s-midnight span.cm-variable { color: #FFAA3E; } +.cm-s-midnight span.cm-variable-2 { color: #FFAA3E; } +.cm-s-midnight span.cm-def { color: #4DD; } +.cm-s-midnight span.cm-bracket { color: #D1EDFF; } +.cm-s-midnight span.cm-tag { color: #449; } +.cm-s-midnight span.cm-link { color: #AE81FF; } +.cm-s-midnight span.cm-error { background: #F92672; color: #F8F8F0; } + +.cm-s-midnight .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/monokai.css b/WebContent/resources/fuscabr/lib/codemirror/theme/monokai.css new file mode 100755 index 0000000000..cd4cd55720 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/monokai.css @@ -0,0 +1,41 @@ +/* Based on Sublime Text's Monokai theme */ + +.cm-s-monokai.CodeMirror { background: #272822; color: #f8f8f2; } +.cm-s-monokai div.CodeMirror-selected { background: #49483E; } +.cm-s-monokai .CodeMirror-line::selection, .cm-s-monokai .CodeMirror-line > span::selection, .cm-s-monokai .CodeMirror-line > span > span::selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai .CodeMirror-line::-moz-selection, .cm-s-monokai .CodeMirror-line > span::-moz-selection, .cm-s-monokai .CodeMirror-line > span > span::-moz-selection { background: rgba(73, 72, 62, .99); } +.cm-s-monokai .CodeMirror-gutters { background: #272822; border-right: 0px; } +.cm-s-monokai .CodeMirror-guttermarker { color: white; } +.cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-monokai .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-monokai .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } + +.cm-s-monokai span.cm-comment { color: #75715e; } +.cm-s-monokai span.cm-atom { color: #ae81ff; } +.cm-s-monokai span.cm-number { color: #ae81ff; } + +.cm-s-monokai span.cm-comment.cm-attribute { color: #97b757; } +.cm-s-monokai span.cm-comment.cm-def { color: #bc9262; } +.cm-s-monokai span.cm-comment.cm-tag { color: #bc6283; } +.cm-s-monokai span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute { color: #a6e22e; } +.cm-s-monokai span.cm-keyword { color: #f92672; } +.cm-s-monokai span.cm-builtin { color: #66d9ef; } +.cm-s-monokai span.cm-string { color: #e6db74; } + +.cm-s-monokai span.cm-variable { color: #f8f8f2; } +.cm-s-monokai span.cm-variable-2 { color: #9effff; } +.cm-s-monokai span.cm-variable-3, .cm-s-monokai span.cm-type { color: #66d9ef; } +.cm-s-monokai span.cm-def { color: #fd971f; } +.cm-s-monokai span.cm-bracket { color: #f8f8f2; } +.cm-s-monokai span.cm-tag { color: #f92672; } +.cm-s-monokai span.cm-header { color: #ae81ff; } +.cm-s-monokai span.cm-link { color: #ae81ff; } +.cm-s-monokai span.cm-error { background: #f92672; color: #f8f8f0; } + +.cm-s-monokai .CodeMirror-activeline-background { background: #373831; } +.cm-s-monokai .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/moxer.css b/WebContent/resources/fuscabr/lib/codemirror/theme/moxer.css new file mode 100755 index 0000000000..b3ca35e385 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/moxer.css @@ -0,0 +1,143 @@ +/* + Name: Moxer Theme + Author: Mattia Astorino (http://github.com/equinusocio) + Website: https://github.com/moxer-theme/moxer-code +*/ + +.cm-s-moxer.CodeMirror { + background-color: #090A0F; + color: #8E95B4; + line-height: 1.8; +} + +.cm-s-moxer .CodeMirror-gutters { + background: #090A0F; + color: #35394B; + border: none; +} + +.cm-s-moxer .CodeMirror-guttermarker, +.cm-s-moxer .CodeMirror-guttermarker-subtle, +.cm-s-moxer .CodeMirror-linenumber { + color: #35394B; +} + + +.cm-s-moxer .CodeMirror-cursor { + border-left: 1px solid #FFCC00; +} + +.cm-s-moxer div.CodeMirror-selected { + background: rgba(128, 203, 196, 0.2); +} + +.cm-s-moxer.CodeMirror-focused div.CodeMirror-selected { + background: #212431; +} + +.cm-s-moxer .CodeMirror-line::selection, +.cm-s-moxer .CodeMirror-line>span::selection, +.cm-s-moxer .CodeMirror-line>span>span::selection { + background: #212431; +} + +.cm-s-moxer .CodeMirror-line::-moz-selection, +.cm-s-moxer .CodeMirror-line>span::-moz-selection, +.cm-s-moxer .CodeMirror-line>span>span::-moz-selection { + background: #212431; +} + +.cm-s-moxer .CodeMirror-activeline-background, +.cm-s-moxer .CodeMirror-activeline-gutter .CodeMirror-linenumber { + background: rgba(33, 36, 49, 0.5); +} + +.cm-s-moxer .cm-keyword { + color: #D46C6C; +} + +.cm-s-moxer .cm-operator { + color: #D46C6C; +} + +.cm-s-moxer .cm-variable-2 { + color: #81C5DA; +} + + +.cm-s-moxer .cm-variable-3, +.cm-s-moxer .cm-type { + color: #f07178; +} + +.cm-s-moxer .cm-builtin { + color: #FFCB6B; +} + +.cm-s-moxer .cm-atom { + color: #A99BE2; +} + +.cm-s-moxer .cm-number { + color: #7CA4C0; +} + +.cm-s-moxer .cm-def { + color: #F5DFA5; +} + +.cm-s-moxer .CodeMirror-line .cm-def ~ .cm-def { + color: #81C5DA; +} + +.cm-s-moxer .cm-string { + color: #B2E4AE; +} + +.cm-s-moxer .cm-string-2 { + color: #f07178; +} + +.cm-s-moxer .cm-comment { + color: #3F445A; +} + +.cm-s-moxer .cm-variable { + color: #8E95B4; +} + +.cm-s-moxer .cm-tag { + color: #FF5370; +} + +.cm-s-moxer .cm-meta { + color: #FFCB6B; +} + +.cm-s-moxer .cm-attribute { + color: #C792EA; +} + +.cm-s-moxer .cm-property { + color: #81C5DA; +} + +.cm-s-moxer .cm-qualifier { + color: #DECB6B; +} + +.cm-s-moxer .cm-variable-3, +.cm-s-moxer .cm-type { + color: #DECB6B; +} + + +.cm-s-moxer .cm-error { + color: rgba(255, 255, 255, 1.0); + background-color: #FF5370; +} + +.cm-s-moxer .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} \ No newline at end of file diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/neat.css b/WebContent/resources/fuscabr/lib/codemirror/theme/neat.css new file mode 100755 index 0000000000..4267b1a37d --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/neat.css @@ -0,0 +1,12 @@ +.cm-s-neat span.cm-comment { color: #a86; } +.cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } +.cm-s-neat span.cm-string { color: #a22; } +.cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } +.cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } +.cm-s-neat span.cm-variable { color: black; } +.cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } +.cm-s-neat span.cm-meta { color: #555; } +.cm-s-neat span.cm-link { color: #3a3; } + +.cm-s-neat .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-neat .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/neo.css b/WebContent/resources/fuscabr/lib/codemirror/theme/neo.css new file mode 100755 index 0000000000..b28d5c65fa --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/neo.css @@ -0,0 +1,43 @@ +/* neo theme for codemirror */ + +/* Color scheme */ + +.cm-s-neo.CodeMirror { + background-color:#ffffff; + color:#2e383c; + line-height:1.4375; +} +.cm-s-neo .cm-comment { color:#75787b; } +.cm-s-neo .cm-keyword, .cm-s-neo .cm-property { color:#1d75b3; } +.cm-s-neo .cm-atom,.cm-s-neo .cm-number { color:#75438a; } +.cm-s-neo .cm-node,.cm-s-neo .cm-tag { color:#9c3328; } +.cm-s-neo .cm-string { color:#b35e14; } +.cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier { color:#047d65; } + + +/* Editor styling */ + +.cm-s-neo pre { + padding:0; +} + +.cm-s-neo .CodeMirror-gutters { + border:none; + border-right:10px solid transparent; + background-color:transparent; +} + +.cm-s-neo .CodeMirror-linenumber { + padding:0; + color:#e0e2e5; +} + +.cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } +.cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } + +.cm-s-neo .CodeMirror-cursor { + width: auto; + border: 0; + background: rgba(155,157,162,0.37); + z-index: 1; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/night.css b/WebContent/resources/fuscabr/lib/codemirror/theme/night.css new file mode 100755 index 0000000000..f631bf42c7 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/night.css @@ -0,0 +1,27 @@ +/* Loosely based on the Midnight Textmate theme */ + +.cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-night div.CodeMirror-selected { background: #447; } +.cm-s-night .CodeMirror-line::selection, .cm-s-night .CodeMirror-line > span::selection, .cm-s-night .CodeMirror-line > span > span::selection { background: rgba(68, 68, 119, .99); } +.cm-s-night .CodeMirror-line::-moz-selection, .cm-s-night .CodeMirror-line > span::-moz-selection, .cm-s-night .CodeMirror-line > span > span::-moz-selection { background: rgba(68, 68, 119, .99); } +.cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-night .CodeMirror-guttermarker { color: white; } +.cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; } +.cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-night .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-night span.cm-comment { color: #8900d1; } +.cm-s-night span.cm-atom { color: #845dc4; } +.cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } +.cm-s-night span.cm-keyword { color: #599eff; } +.cm-s-night span.cm-string { color: #37f14a; } +.cm-s-night span.cm-meta { color: #7678e2; } +.cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } +.cm-s-night span.cm-variable-3, .cm-s-night span.cm-def, .cm-s-night span.cm-type { color: white; } +.cm-s-night span.cm-bracket { color: #8da6ce; } +.cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } +.cm-s-night span.cm-link { color: #845dc4; } +.cm-s-night span.cm-error { color: #9d1e15; } + +.cm-s-night .CodeMirror-activeline-background { background: #1C005A; } +.cm-s-night .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/nord.css b/WebContent/resources/fuscabr/lib/codemirror/theme/nord.css new file mode 100755 index 0000000000..41a8ad7782 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/nord.css @@ -0,0 +1,42 @@ +/* Based on arcticicestudio's Nord theme */ +/* https://github.com/arcticicestudio/nord */ + +.cm-s-nord.CodeMirror { background: #2e3440; color: #d8dee9; } +.cm-s-nord div.CodeMirror-selected { background: #434c5e; } +.cm-s-nord .CodeMirror-line::selection, .cm-s-nord .CodeMirror-line > span::selection, .cm-s-nord .CodeMirror-line > span > span::selection { background: #3b4252; } +.cm-s-nord .CodeMirror-line::-moz-selection, .cm-s-nord .CodeMirror-line > span::-moz-selection, .cm-s-nord .CodeMirror-line > span > span::-moz-selection { background: #3b4252; } +.cm-s-nord .CodeMirror-gutters { background: #2e3440; border-right: 0px; } +.cm-s-nord .CodeMirror-guttermarker { color: #4c566a; } +.cm-s-nord .CodeMirror-guttermarker-subtle { color: #4c566a; } +.cm-s-nord .CodeMirror-linenumber { color: #4c566a; } +.cm-s-nord .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } + +.cm-s-nord span.cm-comment { color: #4c566a; } +.cm-s-nord span.cm-atom { color: #b48ead; } +.cm-s-nord span.cm-number { color: #b48ead; } + +.cm-s-nord span.cm-comment.cm-attribute { color: #97b757; } +.cm-s-nord span.cm-comment.cm-def { color: #bc9262; } +.cm-s-nord span.cm-comment.cm-tag { color: #bc6283; } +.cm-s-nord span.cm-comment.cm-type { color: #5998a6; } + +.cm-s-nord span.cm-property, .cm-s-nord span.cm-attribute { color: #8FBCBB; } +.cm-s-nord span.cm-keyword { color: #81A1C1; } +.cm-s-nord span.cm-builtin { color: #81A1C1; } +.cm-s-nord span.cm-string { color: #A3BE8C; } + +.cm-s-nord span.cm-variable { color: #d8dee9; } +.cm-s-nord span.cm-variable-2 { color: #d8dee9; } +.cm-s-nord span.cm-variable-3, .cm-s-nord span.cm-type { color: #d8dee9; } +.cm-s-nord span.cm-def { color: #8FBCBB; } +.cm-s-nord span.cm-bracket { color: #81A1C1; } +.cm-s-nord span.cm-tag { color: #bf616a; } +.cm-s-nord span.cm-header { color: #b48ead; } +.cm-s-nord span.cm-link { color: #b48ead; } +.cm-s-nord span.cm-error { background: #bf616a; color: #f8f8f0; } + +.cm-s-nord .CodeMirror-activeline-background { background: #3b4252; } +.cm-s-nord .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/oceanic-next.css b/WebContent/resources/fuscabr/lib/codemirror/theme/oceanic-next.css new file mode 100755 index 0000000000..f3d0d08acb --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/oceanic-next.css @@ -0,0 +1,46 @@ +/* + + Name: oceanic-next + Author: Filype Pereira (https://github.com/fpereira1) + + Original oceanic-next color scheme by Dmitri Voronianski (https://github.com/voronianski/oceanic-next-color-scheme) + +*/ + +.cm-s-oceanic-next.CodeMirror { background: #304148; color: #f8f8f2; } +.cm-s-oceanic-next div.CodeMirror-selected { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-line::selection, .cm-s-oceanic-next .CodeMirror-line > span::selection, .cm-s-oceanic-next .CodeMirror-line > span > span::selection { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-line::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span::-moz-selection, .cm-s-oceanic-next .CodeMirror-line > span > span::-moz-selection { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-gutters { background: #304148; border-right: 10px; } +.cm-s-oceanic-next .CodeMirror-guttermarker { color: white; } +.cm-s-oceanic-next .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-oceanic-next .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-oceanic-next .CodeMirror-cursor { border-left: 1px solid #f8f8f0; } +.cm-s-oceanic-next.cm-fat-cursor .CodeMirror-cursor { background-color: #a2a8a175 !important; } +.cm-s-oceanic-next .cm-animate-fat-cursor { background-color: #a2a8a175 !important; } + +.cm-s-oceanic-next span.cm-comment { color: #65737E; } +.cm-s-oceanic-next span.cm-atom { color: #C594C5; } +.cm-s-oceanic-next span.cm-number { color: #F99157; } + +.cm-s-oceanic-next span.cm-property { color: #99C794; } +.cm-s-oceanic-next span.cm-attribute, +.cm-s-oceanic-next span.cm-keyword { color: #C594C5; } +.cm-s-oceanic-next span.cm-builtin { color: #66d9ef; } +.cm-s-oceanic-next span.cm-string { color: #99C794; } + +.cm-s-oceanic-next span.cm-variable, +.cm-s-oceanic-next span.cm-variable-2, +.cm-s-oceanic-next span.cm-variable-3 { color: #f8f8f2; } +.cm-s-oceanic-next span.cm-def { color: #6699CC; } +.cm-s-oceanic-next span.cm-bracket { color: #5FB3B3; } +.cm-s-oceanic-next span.cm-tag { color: #C594C5; } +.cm-s-oceanic-next span.cm-header { color: #C594C5; } +.cm-s-oceanic-next span.cm-link { color: #C594C5; } +.cm-s-oceanic-next span.cm-error { background: #C594C5; color: #f8f8f0; } + +.cm-s-oceanic-next .CodeMirror-activeline-background { background: rgba(101, 115, 126, 0.33); } +.cm-s-oceanic-next .CodeMirror-matchingbracket { + text-decoration: underline; + color: white !important; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/panda-syntax.css b/WebContent/resources/fuscabr/lib/codemirror/theme/panda-syntax.css new file mode 100755 index 0000000000..de14e91124 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/panda-syntax.css @@ -0,0 +1,85 @@ +/* + Name: Panda Syntax + Author: Siamak Mokhtari (http://github.com/siamak/) + CodeMirror template by Siamak Mokhtari (https://github.com/siamak/atom-panda-syntax) +*/ +.cm-s-panda-syntax { + background: #292A2B; + color: #E6E6E6; + line-height: 1.5; + font-family: 'Operator Mono', 'Source Code Pro', Menlo, Monaco, Consolas, Courier New, monospace; +} +.cm-s-panda-syntax .CodeMirror-cursor { border-color: #ff2c6d; } +.cm-s-panda-syntax .CodeMirror-activeline-background { + background: rgba(99, 123, 156, 0.1); +} +.cm-s-panda-syntax .CodeMirror-selected { + background: #FFF; +} +.cm-s-panda-syntax .cm-comment { + font-style: italic; + color: #676B79; +} +.cm-s-panda-syntax .cm-operator { + color: #f3f3f3; +} +.cm-s-panda-syntax .cm-string { + color: #19F9D8; +} +.cm-s-panda-syntax .cm-string-2 { + color: #FFB86C; +} + +.cm-s-panda-syntax .cm-tag { + color: #ff2c6d; +} +.cm-s-panda-syntax .cm-meta { + color: #b084eb; +} + +.cm-s-panda-syntax .cm-number { + color: #FFB86C; +} +.cm-s-panda-syntax .cm-atom { + color: #ff2c6d; +} +.cm-s-panda-syntax .cm-keyword { + color: #FF75B5; +} +.cm-s-panda-syntax .cm-variable { + color: #ffb86c; +} +.cm-s-panda-syntax .cm-variable-2 { + color: #ff9ac1; +} +.cm-s-panda-syntax .cm-variable-3, .cm-s-panda-syntax .cm-type { + color: #ff9ac1; +} + +.cm-s-panda-syntax .cm-def { + color: #e6e6e6; +} +.cm-s-panda-syntax .cm-property { + color: #f3f3f3; +} +.cm-s-panda-syntax .cm-unit { + color: #ffb86c; +} + +.cm-s-panda-syntax .cm-attribute { + color: #ffb86c; +} + +.cm-s-panda-syntax .CodeMirror-matchingbracket { + border-bottom: 1px dotted #19F9D8; + padding-bottom: 2px; + color: #e6e6e6; +} +.cm-s-panda-syntax .CodeMirror-gutters { + background: #292a2b; + border-right-color: rgba(255, 255, 255, 0.1); +} +.cm-s-panda-syntax .CodeMirror-linenumber { + color: #e6e6e6; + opacity: 0.6; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-dark.css new file mode 100755 index 0000000000..aa9d207e6d --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-dark.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Dark) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-dark.CodeMirror { background: #2f1e2e; color: #b9b6b0; } +.cm-s-paraiso-dark div.CodeMirror-selected { background: #41323f; } +.cm-s-paraiso-dark .CodeMirror-line::selection, .cm-s-paraiso-dark .CodeMirror-line > span::selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark .CodeMirror-line::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(65, 50, 63, .99); } +.cm-s-paraiso-dark .CodeMirror-gutters { background: #2f1e2e; border-right: 0px; } +.cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; } +.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; } +.cm-s-paraiso-dark .CodeMirror-linenumber { color: #776e71; } +.cm-s-paraiso-dark .CodeMirror-cursor { border-left: 1px solid #8d8687; } + +.cm-s-paraiso-dark span.cm-comment { color: #e96ba8; } +.cm-s-paraiso-dark span.cm-atom { color: #815ba4; } +.cm-s-paraiso-dark span.cm-number { color: #815ba4; } + +.cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute { color: #48b685; } +.cm-s-paraiso-dark span.cm-keyword { color: #ef6155; } +.cm-s-paraiso-dark span.cm-string { color: #fec418; } + +.cm-s-paraiso-dark span.cm-variable { color: #48b685; } +.cm-s-paraiso-dark span.cm-variable-2 { color: #06b6ef; } +.cm-s-paraiso-dark span.cm-def { color: #f99b15; } +.cm-s-paraiso-dark span.cm-bracket { color: #b9b6b0; } +.cm-s-paraiso-dark span.cm-tag { color: #ef6155; } +.cm-s-paraiso-dark span.cm-link { color: #815ba4; } +.cm-s-paraiso-dark span.cm-error { background: #ef6155; color: #8d8687; } + +.cm-s-paraiso-dark .CodeMirror-activeline-background { background: #4D344A; } +.cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-light.css b/WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-light.css new file mode 100755 index 0000000000..ae0c755f89 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/paraiso-light.css @@ -0,0 +1,38 @@ +/* + + Name: Paraíso (Light) + Author: Jan T. Sott + + Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) + +*/ + +.cm-s-paraiso-light.CodeMirror { background: #e7e9db; color: #41323f; } +.cm-s-paraiso-light div.CodeMirror-selected { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-line::selection, .cm-s-paraiso-light .CodeMirror-line > span::selection, .cm-s-paraiso-light .CodeMirror-line > span > span::selection { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-line::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span::-moz-selection, .cm-s-paraiso-light .CodeMirror-line > span > span::-moz-selection { background: #b9b6b0; } +.cm-s-paraiso-light .CodeMirror-gutters { background: #e7e9db; border-right: 0px; } +.cm-s-paraiso-light .CodeMirror-guttermarker { color: black; } +.cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; } +.cm-s-paraiso-light .CodeMirror-linenumber { color: #8d8687; } +.cm-s-paraiso-light .CodeMirror-cursor { border-left: 1px solid #776e71; } + +.cm-s-paraiso-light span.cm-comment { color: #e96ba8; } +.cm-s-paraiso-light span.cm-atom { color: #815ba4; } +.cm-s-paraiso-light span.cm-number { color: #815ba4; } + +.cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute { color: #48b685; } +.cm-s-paraiso-light span.cm-keyword { color: #ef6155; } +.cm-s-paraiso-light span.cm-string { color: #fec418; } + +.cm-s-paraiso-light span.cm-variable { color: #48b685; } +.cm-s-paraiso-light span.cm-variable-2 { color: #06b6ef; } +.cm-s-paraiso-light span.cm-def { color: #f99b15; } +.cm-s-paraiso-light span.cm-bracket { color: #41323f; } +.cm-s-paraiso-light span.cm-tag { color: #ef6155; } +.cm-s-paraiso-light span.cm-link { color: #815ba4; } +.cm-s-paraiso-light span.cm-error { background: #ef6155; color: #776e71; } + +.cm-s-paraiso-light .CodeMirror-activeline-background { background: #CFD1C4; } +.cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/pastel-on-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/pastel-on-dark.css new file mode 100755 index 0000000000..60435dd15e --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/pastel-on-dark.css @@ -0,0 +1,52 @@ +/** + * Pastel On Dark theme ported from ACE editor + * @license MIT + * @copyright AtomicPages LLC 2014 + * @author Dennis Thompson, AtomicPages LLC + * @version 1.1 + * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme + */ + +.cm-s-pastel-on-dark.CodeMirror { + background: #2c2827; + color: #8F938F; + line-height: 1.5; +} +.cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2); } +.cm-s-pastel-on-dark .CodeMirror-line::selection, .cm-s-pastel-on-dark .CodeMirror-line > span::selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::selection { background: rgba(221,240,255,0.2); } +.cm-s-pastel-on-dark .CodeMirror-line::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span::-moz-selection, .cm-s-pastel-on-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(221,240,255,0.2); } + +.cm-s-pastel-on-dark .CodeMirror-gutters { + background: #34302f; + border-right: 0px; + padding: 0 3px; +} +.cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; } +.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; } +.cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7; } +.cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; } +.cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; } +.cm-s-pastel-on-dark span.cm-property { color: #8F938F; } +.cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; } +.cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-string { color: #66A968; } +.cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } +.cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } +.cm-s-pastel-on-dark span.cm-variable-3, .cm-s-pastel-on-dark span.cm-type { color: #DE8E30; } +.cm-s-pastel-on-dark span.cm-def { color: #757aD8; } +.cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } +.cm-s-pastel-on-dark span.cm-tag { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-link { color: #ae81ff; } +.cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; } +.cm-s-pastel-on-dark span.cm-error { + background: #757aD8; + color: #f8f8f0; +} +.cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031); } +.cm-s-pastel-on-dark .CodeMirror-matchingbracket { + border: 1px solid rgba(255,255,255,0.25); + color: #8F938F !important; + margin: -1px -1px 0 -1px; +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/railscasts.css b/WebContent/resources/fuscabr/lib/codemirror/theme/railscasts.css new file mode 100755 index 0000000000..aeff0449d5 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/railscasts.css @@ -0,0 +1,34 @@ +/* + + Name: Railscasts + Author: Ryan Bates (http://railscasts.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-railscasts.CodeMirror {background: #2b2b2b; color: #f4f1ed;} +.cm-s-railscasts div.CodeMirror-selected {background: #272935 !important;} +.cm-s-railscasts .CodeMirror-gutters {background: #2b2b2b; border-right: 0px;} +.cm-s-railscasts .CodeMirror-linenumber {color: #5a647e;} +.cm-s-railscasts .CodeMirror-cursor {border-left: 1px solid #d4cfc9 !important;} + +.cm-s-railscasts span.cm-comment {color: #bc9458;} +.cm-s-railscasts span.cm-atom {color: #b6b3eb;} +.cm-s-railscasts span.cm-number {color: #b6b3eb;} + +.cm-s-railscasts span.cm-property, .cm-s-railscasts span.cm-attribute {color: #a5c261;} +.cm-s-railscasts span.cm-keyword {color: #da4939;} +.cm-s-railscasts span.cm-string {color: #ffc66d;} + +.cm-s-railscasts span.cm-variable {color: #a5c261;} +.cm-s-railscasts span.cm-variable-2 {color: #6d9cbe;} +.cm-s-railscasts span.cm-def {color: #cc7833;} +.cm-s-railscasts span.cm-error {background: #da4939; color: #d4cfc9;} +.cm-s-railscasts span.cm-bracket {color: #f4f1ed;} +.cm-s-railscasts span.cm-tag {color: #da4939;} +.cm-s-railscasts span.cm-link {color: #b6b3eb;} + +.cm-s-railscasts .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} +.cm-s-railscasts .CodeMirror-activeline-background { background: #303040; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/rubyblue.css b/WebContent/resources/fuscabr/lib/codemirror/theme/rubyblue.css new file mode 100755 index 0000000000..1f181b06ec --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/rubyblue.css @@ -0,0 +1,25 @@ +.cm-s-rubyblue.CodeMirror { background: #112435; color: white; } +.cm-s-rubyblue div.CodeMirror-selected { background: #38566F; } +.cm-s-rubyblue .CodeMirror-line::selection, .cm-s-rubyblue .CodeMirror-line > span::selection, .cm-s-rubyblue .CodeMirror-line > span > span::selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue .CodeMirror-line::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span::-moz-selection, .cm-s-rubyblue .CodeMirror-line > span > span::-moz-selection { background: rgba(56, 86, 111, 0.99); } +.cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } +.cm-s-rubyblue .CodeMirror-guttermarker { color: white; } +.cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; } +.cm-s-rubyblue .CodeMirror-linenumber { color: white; } +.cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } +.cm-s-rubyblue span.cm-atom { color: #F4C20B; } +.cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } +.cm-s-rubyblue span.cm-keyword { color: #F0F; } +.cm-s-rubyblue span.cm-string { color: #F08047; } +.cm-s-rubyblue span.cm-meta { color: #F0F; } +.cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } +.cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def, .cm-s-rubyblue span.cm-type { color: white; } +.cm-s-rubyblue span.cm-bracket { color: #F0F; } +.cm-s-rubyblue span.cm-link { color: #F4C20B; } +.cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } +.cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } +.cm-s-rubyblue span.cm-error { color: #AF2018; } + +.cm-s-rubyblue .CodeMirror-activeline-background { background: #173047; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/seti.css b/WebContent/resources/fuscabr/lib/codemirror/theme/seti.css new file mode 100755 index 0000000000..814f76f7de --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/seti.css @@ -0,0 +1,44 @@ +/* + + Name: seti + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original seti color scheme by Jesse Weed (https://github.com/jesseweed/seti-syntax) + +*/ + + +.cm-s-seti.CodeMirror { + background-color: #151718 !important; + color: #CFD2D1 !important; + border: none; +} +.cm-s-seti .CodeMirror-gutters { + color: #404b53; + background-color: #0E1112; + border: none; +} +.cm-s-seti .CodeMirror-cursor { border-left: solid thin #f8f8f0; } +.cm-s-seti .CodeMirror-linenumber { color: #6D8A88; } +.cm-s-seti.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti .CodeMirror-line::selection, .cm-s-seti .CodeMirror-line > span::selection, .cm-s-seti .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti .CodeMirror-line::-moz-selection, .cm-s-seti .CodeMirror-line > span::-moz-selection, .cm-s-seti .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); } +.cm-s-seti span.cm-comment { color: #41535b; } +.cm-s-seti span.cm-string, .cm-s-seti span.cm-string-2 { color: #55b5db; } +.cm-s-seti span.cm-number { color: #cd3f45; } +.cm-s-seti span.cm-variable { color: #55b5db; } +.cm-s-seti span.cm-variable-2 { color: #a074c4; } +.cm-s-seti span.cm-def { color: #55b5db; } +.cm-s-seti span.cm-keyword { color: #ff79c6; } +.cm-s-seti span.cm-operator { color: #9fca56; } +.cm-s-seti span.cm-keyword { color: #e6cd69; } +.cm-s-seti span.cm-atom { color: #cd3f45; } +.cm-s-seti span.cm-meta { color: #55b5db; } +.cm-s-seti span.cm-tag { color: #55b5db; } +.cm-s-seti span.cm-attribute { color: #9fca56; } +.cm-s-seti span.cm-qualifier { color: #9fca56; } +.cm-s-seti span.cm-property { color: #a074c4; } +.cm-s-seti span.cm-variable-3, .cm-s-seti span.cm-type { color: #9fca56; } +.cm-s-seti span.cm-builtin { color: #9fca56; } +.cm-s-seti .CodeMirror-activeline-background { background: #101213; } +.cm-s-seti .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/shadowfox.css b/WebContent/resources/fuscabr/lib/codemirror/theme/shadowfox.css new file mode 100755 index 0000000000..32d59b139a --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/shadowfox.css @@ -0,0 +1,52 @@ +/* + + Name: shadowfox + Author: overdodactyl (http://github.com/overdodactyl) + + Original shadowfox color scheme by Firefox + +*/ + +.cm-s-shadowfox.CodeMirror { background: #2a2a2e; color: #b1b1b3; } +.cm-s-shadowfox div.CodeMirror-selected { background: #353B48; } +.cm-s-shadowfox .CodeMirror-line::selection, .cm-s-shadowfox .CodeMirror-line > span::selection, .cm-s-shadowfox .CodeMirror-line > span > span::selection { background: #353B48; } +.cm-s-shadowfox .CodeMirror-line::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span::-moz-selection, .cm-s-shadowfox .CodeMirror-line > span > span::-moz-selection { background: #353B48; } +.cm-s-shadowfox .CodeMirror-gutters { background: #0c0c0d ; border-right: 1px solid #0c0c0d; } +.cm-s-shadowfox .CodeMirror-guttermarker { color: #555; } +.cm-s-shadowfox .CodeMirror-linenumber { color: #939393; } +.cm-s-shadowfox .CodeMirror-cursor { border-left: 1px solid #fff; } + +.cm-s-shadowfox span.cm-comment { color: #939393; } +.cm-s-shadowfox span.cm-atom { color: #FF7DE9; } +.cm-s-shadowfox span.cm-quote { color: #FF7DE9; } +.cm-s-shadowfox span.cm-builtin { color: #FF7DE9; } +.cm-s-shadowfox span.cm-attribute { color: #FF7DE9; } +.cm-s-shadowfox span.cm-keyword { color: #FF7DE9; } +.cm-s-shadowfox span.cm-error { color: #FF7DE9; } + +.cm-s-shadowfox span.cm-number { color: #6B89FF; } +.cm-s-shadowfox span.cm-string { color: #6B89FF; } +.cm-s-shadowfox span.cm-string-2 { color: #6B89FF; } + +.cm-s-shadowfox span.cm-meta { color: #939393; } +.cm-s-shadowfox span.cm-hr { color: #939393; } + +.cm-s-shadowfox span.cm-header { color: #75BFFF; } +.cm-s-shadowfox span.cm-qualifier { color: #75BFFF; } +.cm-s-shadowfox span.cm-variable-2 { color: #75BFFF; } + +.cm-s-shadowfox span.cm-property { color: #86DE74; } + +.cm-s-shadowfox span.cm-def { color: #75BFFF; } +.cm-s-shadowfox span.cm-bracket { color: #75BFFF; } +.cm-s-shadowfox span.cm-tag { color: #75BFFF; } +.cm-s-shadowfox span.cm-link:visited { color: #75BFFF; } + +.cm-s-shadowfox span.cm-variable { color: #B98EFF; } +.cm-s-shadowfox span.cm-variable-3 { color: #d7d7db; } +.cm-s-shadowfox span.cm-link { color: #737373; } +.cm-s-shadowfox span.cm-operator { color: #b1b1b3; } +.cm-s-shadowfox span.cm-special { color: #d7d7db; } + +.cm-s-shadowfox .CodeMirror-activeline-background { background: rgba(185, 215, 253, .15) } +.cm-s-shadowfox .CodeMirror-matchingbracket { outline: solid 1px rgba(255, 255, 255, .25); color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/solarized.css b/WebContent/resources/fuscabr/lib/codemirror/theme/solarized.css new file mode 100755 index 0000000000..9c6b1265c1 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/solarized.css @@ -0,0 +1,168 @@ +/* +Solarized theme for code-mirror +http://ethanschoonover.com/solarized +*/ + +/* +Solarized color palette +http://ethanschoonover.com/solarized/img/solarized-palette.png +*/ + +.solarized.base03 { color: #002b36; } +.solarized.base02 { color: #073642; } +.solarized.base01 { color: #586e75; } +.solarized.base00 { color: #657b83; } +.solarized.base0 { color: #839496; } +.solarized.base1 { color: #93a1a1; } +.solarized.base2 { color: #eee8d5; } +.solarized.base3 { color: #fdf6e3; } +.solarized.solar-yellow { color: #b58900; } +.solarized.solar-orange { color: #cb4b16; } +.solarized.solar-red { color: #dc322f; } +.solarized.solar-magenta { color: #d33682; } +.solarized.solar-violet { color: #6c71c4; } +.solarized.solar-blue { color: #268bd2; } +.solarized.solar-cyan { color: #2aa198; } +.solarized.solar-green { color: #859900; } + +/* Color scheme for code-mirror */ + +.cm-s-solarized { + line-height: 1.45em; + color-profile: sRGB; + rendering-intent: auto; +} +.cm-s-solarized.cm-s-dark { + color: #839496; + background-color: #002b36; + text-shadow: #002b36 0 1px; +} +.cm-s-solarized.cm-s-light { + background-color: #fdf6e3; + color: #657b83; + text-shadow: #eee8d5 0 1px; +} + +.cm-s-solarized .CodeMirror-widget { + text-shadow: none; +} + +.cm-s-solarized .cm-header { color: #586e75; } +.cm-s-solarized .cm-quote { color: #93a1a1; } + +.cm-s-solarized .cm-keyword { color: #cb4b16; } +.cm-s-solarized .cm-atom { color: #d33682; } +.cm-s-solarized .cm-number { color: #d33682; } +.cm-s-solarized .cm-def { color: #2aa198; } + +.cm-s-solarized .cm-variable { color: #839496; } +.cm-s-solarized .cm-variable-2 { color: #b58900; } +.cm-s-solarized .cm-variable-3, .cm-s-solarized .cm-type { color: #6c71c4; } + +.cm-s-solarized .cm-property { color: #2aa198; } +.cm-s-solarized .cm-operator { color: #6c71c4; } + +.cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } + +.cm-s-solarized .cm-string { color: #859900; } +.cm-s-solarized .cm-string-2 { color: #b58900; } + +.cm-s-solarized .cm-meta { color: #859900; } +.cm-s-solarized .cm-qualifier { color: #b58900; } +.cm-s-solarized .cm-builtin { color: #d33682; } +.cm-s-solarized .cm-bracket { color: #cb4b16; } +.cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } +.cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } +.cm-s-solarized .cm-tag { color: #93a1a1; } +.cm-s-solarized .cm-attribute { color: #2aa198; } +.cm-s-solarized .cm-hr { + color: transparent; + border-top: 1px solid #586e75; + display: block; +} +.cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } +.cm-s-solarized .cm-special { color: #6c71c4; } +.cm-s-solarized .cm-em { + color: #999; + text-decoration: underline; + text-decoration-style: dotted; +} +.cm-s-solarized .cm-error, +.cm-s-solarized .cm-invalidchar { + color: #586e75; + border-bottom: 1px dotted #dc322f; +} + +.cm-s-solarized.cm-s-dark div.CodeMirror-selected { background: #073642; } +.cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); } +.cm-s-solarized.cm-s-dark .CodeMirror-line::-moz-selection, .cm-s-dark .CodeMirror-line > span::-moz-selection, .cm-s-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(7, 54, 66, 0.99); } + +.cm-s-solarized.cm-s-light div.CodeMirror-selected { background: #eee8d5; } +.cm-s-solarized.cm-s-light .CodeMirror-line::selection, .cm-s-light .CodeMirror-line > span::selection, .cm-s-light .CodeMirror-line > span > span::selection { background: #eee8d5; } +.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection, .cm-s-light .CodeMirror-line > span::-moz-selection, .cm-s-light .CodeMirror-line > span > span::-moz-selection { background: #eee8d5; } + +/* Editor styling */ + + + +/* Little shadow on the view-port of the buffer view */ +.cm-s-solarized.CodeMirror { + -moz-box-shadow: inset 7px 0 12px -6px #000; + -webkit-box-shadow: inset 7px 0 12px -6px #000; + box-shadow: inset 7px 0 12px -6px #000; +} + +/* Remove gutter border */ +.cm-s-solarized .CodeMirror-gutters { + border-right: 0; +} + +/* Gutter colors and line number styling based of color scheme (dark / light) */ + +/* Dark */ +.cm-s-solarized.cm-s-dark .CodeMirror-gutters { + background-color: #073642; +} + +.cm-s-solarized.cm-s-dark .CodeMirror-linenumber { + color: #586e75; + text-shadow: #021014 0 -1px; +} + +/* Light */ +.cm-s-solarized.cm-s-light .CodeMirror-gutters { + background-color: #eee8d5; +} + +.cm-s-solarized.cm-s-light .CodeMirror-linenumber { + color: #839496; +} + +/* Common */ +.cm-s-solarized .CodeMirror-linenumber { + padding: 0 5px; +} +.cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; } +.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; } +.cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; } + +.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { + color: #586e75; +} + +/* Cursor */ +.cm-s-solarized .CodeMirror-cursor { border-left: 1px solid #819090; } + +/* Fat cursor */ +.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor { background: #77ee77; } +.cm-s-solarized.cm-s-light .cm-animate-fat-cursor { background-color: #77ee77; } +.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor { background: #586e75; } +.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor { background-color: #586e75; } + +/* Active line */ +.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background { + background: rgba(255, 255, 255, 0.06); +} +.cm-s-solarized.cm-s-light .CodeMirror-activeline-background { + background: rgba(0, 0, 0, 0.06); +} diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/ssms.css b/WebContent/resources/fuscabr/lib/codemirror/theme/ssms.css new file mode 100755 index 0000000000..9494c14c20 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/ssms.css @@ -0,0 +1,16 @@ +.cm-s-ssms span.cm-keyword { color: blue; } +.cm-s-ssms span.cm-comment { color: darkgreen; } +.cm-s-ssms span.cm-string { color: red; } +.cm-s-ssms span.cm-def { color: black; } +.cm-s-ssms span.cm-variable { color: black; } +.cm-s-ssms span.cm-variable-2 { color: black; } +.cm-s-ssms span.cm-atom { color: darkgray; } +.cm-s-ssms .CodeMirror-linenumber { color: teal; } +.cm-s-ssms .CodeMirror-activeline-background { background: #ffffff; } +.cm-s-ssms span.cm-string-2 { color: #FF00FF; } +.cm-s-ssms span.cm-operator, +.cm-s-ssms span.cm-bracket, +.cm-s-ssms span.cm-punctuation { color: darkgray; } +.cm-s-ssms .CodeMirror-gutters { border-right: 3px solid #ffee62; background-color: #ffffff; } +.cm-s-ssms div.CodeMirror-selected { background: #ADD6FF; } + diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/the-matrix.css b/WebContent/resources/fuscabr/lib/codemirror/theme/the-matrix.css new file mode 100755 index 0000000000..c4c93c11ea --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/the-matrix.css @@ -0,0 +1,30 @@ +.cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; } +.cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D; } +.cm-s-the-matrix .CodeMirror-line::selection, .cm-s-the-matrix .CodeMirror-line > span::selection, .cm-s-the-matrix .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix .CodeMirror-line::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span::-moz-selection, .cm-s-the-matrix .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; } +.cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; } +.cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; } +.cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; } +.cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00; } + +.cm-s-the-matrix span.cm-keyword { color: #008803; font-weight: bold; } +.cm-s-the-matrix span.cm-atom { color: #3FF; } +.cm-s-the-matrix span.cm-number { color: #FFB94F; } +.cm-s-the-matrix span.cm-def { color: #99C; } +.cm-s-the-matrix span.cm-variable { color: #F6C; } +.cm-s-the-matrix span.cm-variable-2 { color: #C6F; } +.cm-s-the-matrix span.cm-variable-3, .cm-s-the-matrix span.cm-type { color: #96F; } +.cm-s-the-matrix span.cm-property { color: #62FFA0; } +.cm-s-the-matrix span.cm-operator { color: #999; } +.cm-s-the-matrix span.cm-comment { color: #CCCCCC; } +.cm-s-the-matrix span.cm-string { color: #39C; } +.cm-s-the-matrix span.cm-meta { color: #C9F; } +.cm-s-the-matrix span.cm-qualifier { color: #FFF700; } +.cm-s-the-matrix span.cm-builtin { color: #30a; } +.cm-s-the-matrix span.cm-bracket { color: #cc7; } +.cm-s-the-matrix span.cm-tag { color: #FFBD40; } +.cm-s-the-matrix span.cm-attribute { color: #FFF700; } +.cm-s-the-matrix span.cm-error { color: #FF0000; } + +.cm-s-the-matrix .CodeMirror-activeline-background { background: #040; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-bright.css b/WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-bright.css new file mode 100755 index 0000000000..b6dd4a9278 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-bright.css @@ -0,0 +1,35 @@ +/* + + Name: Tomorrow Night - Bright + Author: Chris Kempson + + Port done by Gerard Braad + +*/ + +.cm-s-tomorrow-night-bright.CodeMirror { background: #000000; color: #eaeaea; } +.cm-s-tomorrow-night-bright div.CodeMirror-selected { background: #424242; } +.cm-s-tomorrow-night-bright .CodeMirror-gutters { background: #000000; border-right: 0px; } +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; } +.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-bright .CodeMirror-linenumber { color: #424242; } +.cm-s-tomorrow-night-bright .CodeMirror-cursor { border-left: 1px solid #6A6A6A; } + +.cm-s-tomorrow-night-bright span.cm-comment { color: #d27b53; } +.cm-s-tomorrow-night-bright span.cm-atom { color: #a16a94; } +.cm-s-tomorrow-night-bright span.cm-number { color: #a16a94; } + +.cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute { color: #99cc99; } +.cm-s-tomorrow-night-bright span.cm-keyword { color: #d54e53; } +.cm-s-tomorrow-night-bright span.cm-string { color: #e7c547; } + +.cm-s-tomorrow-night-bright span.cm-variable { color: #b9ca4a; } +.cm-s-tomorrow-night-bright span.cm-variable-2 { color: #7aa6da; } +.cm-s-tomorrow-night-bright span.cm-def { color: #e78c45; } +.cm-s-tomorrow-night-bright span.cm-bracket { color: #eaeaea; } +.cm-s-tomorrow-night-bright span.cm-tag { color: #d54e53; } +.cm-s-tomorrow-night-bright span.cm-link { color: #a16a94; } +.cm-s-tomorrow-night-bright span.cm-error { background: #d54e53; color: #6A6A6A; } + +.cm-s-tomorrow-night-bright .CodeMirror-activeline-background { background: #2a2a2a; } +.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-eighties.css b/WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-eighties.css new file mode 100755 index 0000000000..2a9debc327 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/tomorrow-night-eighties.css @@ -0,0 +1,38 @@ +/* + + Name: Tomorrow Night - Eighties + Author: Chris Kempson + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-tomorrow-night-eighties.CodeMirror { background: #000000; color: #CCCCCC; } +.cm-s-tomorrow-night-eighties div.CodeMirror-selected { background: #2D2D2D; } +.cm-s-tomorrow-night-eighties .CodeMirror-line::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties .CodeMirror-line::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span::-moz-selection, .cm-s-tomorrow-night-eighties .CodeMirror-line > span > span::-moz-selection { background: rgba(45, 45, 45, 0.99); } +.cm-s-tomorrow-night-eighties .CodeMirror-gutters { background: #000000; border-right: 0px; } +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; } +.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; } +.cm-s-tomorrow-night-eighties .CodeMirror-linenumber { color: #515151; } +.cm-s-tomorrow-night-eighties .CodeMirror-cursor { border-left: 1px solid #6A6A6A; } + +.cm-s-tomorrow-night-eighties span.cm-comment { color: #d27b53; } +.cm-s-tomorrow-night-eighties span.cm-atom { color: #a16a94; } +.cm-s-tomorrow-night-eighties span.cm-number { color: #a16a94; } + +.cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute { color: #99cc99; } +.cm-s-tomorrow-night-eighties span.cm-keyword { color: #f2777a; } +.cm-s-tomorrow-night-eighties span.cm-string { color: #ffcc66; } + +.cm-s-tomorrow-night-eighties span.cm-variable { color: #99cc99; } +.cm-s-tomorrow-night-eighties span.cm-variable-2 { color: #6699cc; } +.cm-s-tomorrow-night-eighties span.cm-def { color: #f99157; } +.cm-s-tomorrow-night-eighties span.cm-bracket { color: #CCCCCC; } +.cm-s-tomorrow-night-eighties span.cm-tag { color: #f2777a; } +.cm-s-tomorrow-night-eighties span.cm-link { color: #a16a94; } +.cm-s-tomorrow-night-eighties span.cm-error { background: #f2777a; color: #6A6A6A; } + +.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background { background: #343600; } +.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/ttcn.css b/WebContent/resources/fuscabr/lib/codemirror/theme/ttcn.css new file mode 100755 index 0000000000..0b14ac35d6 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/ttcn.css @@ -0,0 +1,64 @@ +.cm-s-ttcn .cm-quote { color: #090; } +.cm-s-ttcn .cm-negative { color: #d44; } +.cm-s-ttcn .cm-positive { color: #292; } +.cm-s-ttcn .cm-header, .cm-strong { font-weight: bold; } +.cm-s-ttcn .cm-em { font-style: italic; } +.cm-s-ttcn .cm-link { text-decoration: underline; } +.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; } +.cm-s-ttcn .cm-header { color: #00f; font-weight: bold; } + +.cm-s-ttcn .cm-atom { color: #219; } +.cm-s-ttcn .cm-attribute { color: #00c; } +.cm-s-ttcn .cm-bracket { color: #997; } +.cm-s-ttcn .cm-comment { color: #333333; } +.cm-s-ttcn .cm-def { color: #00f; } +.cm-s-ttcn .cm-em { font-style: italic; } +.cm-s-ttcn .cm-error { color: #f00; } +.cm-s-ttcn .cm-hr { color: #999; } +.cm-s-ttcn .cm-invalidchar { color: #f00; } +.cm-s-ttcn .cm-keyword { font-weight:bold; } +.cm-s-ttcn .cm-link { color: #00c; text-decoration: underline; } +.cm-s-ttcn .cm-meta { color: #555; } +.cm-s-ttcn .cm-negative { color: #d44; } +.cm-s-ttcn .cm-positive { color: #292; } +.cm-s-ttcn .cm-qualifier { color: #555; } +.cm-s-ttcn .cm-strikethrough { text-decoration: line-through; } +.cm-s-ttcn .cm-string { color: #006400; } +.cm-s-ttcn .cm-string-2 { color: #f50; } +.cm-s-ttcn .cm-strong { font-weight: bold; } +.cm-s-ttcn .cm-tag { color: #170; } +.cm-s-ttcn .cm-variable { color: #8B2252; } +.cm-s-ttcn .cm-variable-2 { color: #05a; } +.cm-s-ttcn .cm-variable-3, .cm-s-ttcn .cm-type { color: #085; } + +.cm-s-ttcn .cm-invalidchar { color: #f00; } + +/* ASN */ +.cm-s-ttcn .cm-accessTypes, +.cm-s-ttcn .cm-compareTypes { color: #27408B; } +.cm-s-ttcn .cm-cmipVerbs { color: #8B2252; } +.cm-s-ttcn .cm-modifier { color:#D2691E; } +.cm-s-ttcn .cm-status { color:#8B4545; } +.cm-s-ttcn .cm-storage { color:#A020F0; } +.cm-s-ttcn .cm-tags { color:#006400; } + +/* CFG */ +.cm-s-ttcn .cm-externalCommands { color: #8B4545; font-weight:bold; } +.cm-s-ttcn .cm-fileNCtrlMaskOptions, +.cm-s-ttcn .cm-sectionTitle { color: #2E8B57; font-weight:bold; } + +/* TTCN */ +.cm-s-ttcn .cm-booleanConsts, +.cm-s-ttcn .cm-otherConsts, +.cm-s-ttcn .cm-verdictConsts { color: #006400; } +.cm-s-ttcn .cm-configOps, +.cm-s-ttcn .cm-functionOps, +.cm-s-ttcn .cm-portOps, +.cm-s-ttcn .cm-sutOps, +.cm-s-ttcn .cm-timerOps, +.cm-s-ttcn .cm-verdictOps { color: #0000FF; } +.cm-s-ttcn .cm-preprocessor, +.cm-s-ttcn .cm-templateMatch, +.cm-s-ttcn .cm-ttcn3Macros { color: #27408B; } +.cm-s-ttcn .cm-types { color: #A52A2A; font-weight:bold; } +.cm-s-ttcn .cm-visibilityModifiers { font-weight:bold; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/twilight.css b/WebContent/resources/fuscabr/lib/codemirror/theme/twilight.css new file mode 100755 index 0000000000..b2b1b2aa93 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/twilight.css @@ -0,0 +1,32 @@ +.cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ +.cm-s-twilight div.CodeMirror-selected { background: #323232; } /**/ +.cm-s-twilight .CodeMirror-line::selection, .cm-s-twilight .CodeMirror-line > span::selection, .cm-s-twilight .CodeMirror-line > span > span::selection { background: rgba(50, 50, 50, 0.99); } +.cm-s-twilight .CodeMirror-line::-moz-selection, .cm-s-twilight .CodeMirror-line > span::-moz-selection, .cm-s-twilight .CodeMirror-line > span > span::-moz-selection { background: rgba(50, 50, 50, 0.99); } + +.cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } +.cm-s-twilight .CodeMirror-guttermarker { color: white; } +.cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; } +.cm-s-twilight .CodeMirror-linenumber { color: #aaa; } +.cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ +.cm-s-twilight .cm-atom { color: #FC0; } +.cm-s-twilight .cm-number { color: #ca7841; } /**/ +.cm-s-twilight .cm-def { color: #8DA6CE; } +.cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ +.cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def, .cm-s-twilight span.cm-type { color: #607392; } /**/ +.cm-s-twilight .cm-operator { color: #cda869; } /**/ +.cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ +.cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ +.cm-s-twilight .cm-string-2 { color:#bd6b18; } /*?*/ +.cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ +.cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ +.cm-s-twilight .cm-tag { color: #997643; } /**/ +.cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ +.cm-s-twilight .cm-header { color: #FF6400; } +.cm-s-twilight .cm-hr { color: #AEAEAE; } +.cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ +.cm-s-twilight .cm-error { border-bottom: 1px solid red; } + +.cm-s-twilight .CodeMirror-activeline-background { background: #27282E; } +.cm-s-twilight .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/vibrant-ink.css b/WebContent/resources/fuscabr/lib/codemirror/theme/vibrant-ink.css new file mode 100755 index 0000000000..6358ad3655 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/vibrant-ink.css @@ -0,0 +1,34 @@ +/* Taken from the popular Visual Studio Vibrant Ink Schema */ + +.cm-s-vibrant-ink.CodeMirror { background: black; color: white; } +.cm-s-vibrant-ink div.CodeMirror-selected { background: #35493c; } +.cm-s-vibrant-ink .CodeMirror-line::selection, .cm-s-vibrant-ink .CodeMirror-line > span::selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::selection { background: rgba(53, 73, 60, 0.99); } +.cm-s-vibrant-ink .CodeMirror-line::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span::-moz-selection, .cm-s-vibrant-ink .CodeMirror-line > span > span::-moz-selection { background: rgba(53, 73, 60, 0.99); } + +.cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; } +.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-vibrant-ink .cm-keyword { color: #CC7832; } +.cm-s-vibrant-ink .cm-atom { color: #FC0; } +.cm-s-vibrant-ink .cm-number { color: #FFEE98; } +.cm-s-vibrant-ink .cm-def { color: #8DA6CE; } +.cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D; } +.cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def, .cm-s-vibrant span.cm-type { color: #FFC66D; } +.cm-s-vibrant-ink .cm-operator { color: #888; } +.cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } +.cm-s-vibrant-ink .cm-string { color: #A5C25C; } +.cm-s-vibrant-ink .cm-string-2 { color: red; } +.cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } +.cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } +.cm-s-vibrant-ink .cm-header { color: #FF6400; } +.cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } +.cm-s-vibrant-ink .cm-link { color: #5656F3; } +.cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } + +.cm-s-vibrant-ink .CodeMirror-activeline-background { background: #27282E; } +.cm-s-vibrant-ink .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/xq-dark.css b/WebContent/resources/fuscabr/lib/codemirror/theme/xq-dark.css new file mode 100755 index 0000000000..7da1a0f705 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/xq-dark.css @@ -0,0 +1,53 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } +.cm-s-xq-dark div.CodeMirror-selected { background: #27007A; } +.cm-s-xq-dark .CodeMirror-line::selection, .cm-s-xq-dark .CodeMirror-line > span::selection, .cm-s-xq-dark .CodeMirror-line > span > span::selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark .CodeMirror-line::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span::-moz-selection, .cm-s-xq-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(39, 0, 122, 0.99); } +.cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } +.cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; } +.cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } +.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-xq-dark span.cm-keyword { color: #FFBD40; } +.cm-s-xq-dark span.cm-atom { color: #6C8CD5; } +.cm-s-xq-dark span.cm-number { color: #164; } +.cm-s-xq-dark span.cm-def { color: #FFF; text-decoration:underline; } +.cm-s-xq-dark span.cm-variable { color: #FFF; } +.cm-s-xq-dark span.cm-variable-2 { color: #EEE; } +.cm-s-xq-dark span.cm-variable-3, .cm-s-xq-dark span.cm-type { color: #DDD; } +.cm-s-xq-dark span.cm-property {} +.cm-s-xq-dark span.cm-operator {} +.cm-s-xq-dark span.cm-comment { color: gray; } +.cm-s-xq-dark span.cm-string { color: #9FEE00; } +.cm-s-xq-dark span.cm-meta { color: yellow; } +.cm-s-xq-dark span.cm-qualifier { color: #FFF700; } +.cm-s-xq-dark span.cm-builtin { color: #30a; } +.cm-s-xq-dark span.cm-bracket { color: #cc7; } +.cm-s-xq-dark span.cm-tag { color: #FFBD40; } +.cm-s-xq-dark span.cm-attribute { color: #FFF700; } +.cm-s-xq-dark span.cm-error { color: #f00; } + +.cm-s-xq-dark .CodeMirror-activeline-background { background: #27282E; } +.cm-s-xq-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/xq-light.css b/WebContent/resources/fuscabr/lib/codemirror/theme/xq-light.css new file mode 100755 index 0000000000..7b182ea997 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/xq-light.css @@ -0,0 +1,43 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-light span.cm-keyword { line-height: 1em; font-weight: bold; color: #5A5CAD; } +.cm-s-xq-light span.cm-atom { color: #6C8CD5; } +.cm-s-xq-light span.cm-number { color: #164; } +.cm-s-xq-light span.cm-def { text-decoration:underline; } +.cm-s-xq-light span.cm-variable { color: black; } +.cm-s-xq-light span.cm-variable-2 { color:black; } +.cm-s-xq-light span.cm-variable-3, .cm-s-xq-light span.cm-type { color: black; } +.cm-s-xq-light span.cm-property {} +.cm-s-xq-light span.cm-operator {} +.cm-s-xq-light span.cm-comment { color: #0080FF; font-style: italic; } +.cm-s-xq-light span.cm-string { color: red; } +.cm-s-xq-light span.cm-meta { color: yellow; } +.cm-s-xq-light span.cm-qualifier { color: grey; } +.cm-s-xq-light span.cm-builtin { color: #7EA656; } +.cm-s-xq-light span.cm-bracket { color: #cc7; } +.cm-s-xq-light span.cm-tag { color: #3F7F7F; } +.cm-s-xq-light span.cm-attribute { color: #7F007F; } +.cm-s-xq-light span.cm-error { color: #f00; } + +.cm-s-xq-light .CodeMirror-activeline-background { background: #e8f2ff; } +.cm-s-xq-light .CodeMirror-matchingbracket { outline:1px solid grey;color:black !important;background:yellow; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/yeti.css b/WebContent/resources/fuscabr/lib/codemirror/theme/yeti.css new file mode 100755 index 0000000000..d085f72497 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/yeti.css @@ -0,0 +1,44 @@ +/* + + Name: yeti + Author: Michael Kaminsky (http://github.com/mkaminsky11) + + Original yeti color scheme by Jesse Weed (https://github.com/jesseweed/yeti-syntax) + +*/ + + +.cm-s-yeti.CodeMirror { + background-color: #ECEAE8 !important; + color: #d1c9c0 !important; + border: none; +} + +.cm-s-yeti .CodeMirror-gutters { + color: #adaba6; + background-color: #E5E1DB; + border: none; +} +.cm-s-yeti .CodeMirror-cursor { border-left: solid thin #d1c9c0; } +.cm-s-yeti .CodeMirror-linenumber { color: #adaba6; } +.cm-s-yeti.CodeMirror-focused div.CodeMirror-selected { background: #DCD8D2; } +.cm-s-yeti .CodeMirror-line::selection, .cm-s-yeti .CodeMirror-line > span::selection, .cm-s-yeti .CodeMirror-line > span > span::selection { background: #DCD8D2; } +.cm-s-yeti .CodeMirror-line::-moz-selection, .cm-s-yeti .CodeMirror-line > span::-moz-selection, .cm-s-yeti .CodeMirror-line > span > span::-moz-selection { background: #DCD8D2; } +.cm-s-yeti span.cm-comment { color: #d4c8be; } +.cm-s-yeti span.cm-string, .cm-s-yeti span.cm-string-2 { color: #96c0d8; } +.cm-s-yeti span.cm-number { color: #a074c4; } +.cm-s-yeti span.cm-variable { color: #55b5db; } +.cm-s-yeti span.cm-variable-2 { color: #a074c4; } +.cm-s-yeti span.cm-def { color: #55b5db; } +.cm-s-yeti span.cm-operator { color: #9fb96e; } +.cm-s-yeti span.cm-keyword { color: #9fb96e; } +.cm-s-yeti span.cm-atom { color: #a074c4; } +.cm-s-yeti span.cm-meta { color: #96c0d8; } +.cm-s-yeti span.cm-tag { color: #96c0d8; } +.cm-s-yeti span.cm-attribute { color: #9fb96e; } +.cm-s-yeti span.cm-qualifier { color: #96c0d8; } +.cm-s-yeti span.cm-property { color: #a074c4; } +.cm-s-yeti span.cm-builtin { color: #a074c4; } +.cm-s-yeti span.cm-variable-3, .cm-s-yeti span.cm-type { color: #96c0d8; } +.cm-s-yeti .CodeMirror-activeline-background { background: #E7E4E0; } +.cm-s-yeti .CodeMirror-matchingbracket { text-decoration: underline; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/yonce.css b/WebContent/resources/fuscabr/lib/codemirror/theme/yonce.css new file mode 100755 index 0000000000..975f0788a2 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/yonce.css @@ -0,0 +1,59 @@ +/* + + Name: yoncé + Author: Thomas MacLean (http://github.com/thomasmaclean) + + Original yoncé color scheme by Mina Markham (https://github.com/minamarkham) + +*/ + +.cm-s-yonce.CodeMirror { background: #1C1C1C; color: #d4d4d4; } /**/ +.cm-s-yonce div.CodeMirror-selected { background: rgba(252, 69, 133, 0.478); } /**/ +.cm-s-yonce .CodeMirror-selectedtext, +.cm-s-yonce .CodeMirror-selected, +.cm-s-yonce .CodeMirror-line::selection, +.cm-s-yonce .CodeMirror-line > span::selection, +.cm-s-yonce .CodeMirror-line > span > span::selection, +.cm-s-yonce .CodeMirror-line::-moz-selection, +.cm-s-yonce .CodeMirror-line > span::-moz-selection, +.cm-s-yonce .CodeMirror-line > span > span::-moz-selection { background: rgba(252, 67, 132, 0.47); } + +.cm-s-yonce.CodeMirror pre { padding-left: 0px; } +.cm-s-yonce .CodeMirror-gutters {background: #1C1C1C; border-right: 0px;} +.cm-s-yonce .CodeMirror-linenumber {color: #777777; padding-right: 10px; } +.cm-s-yonce .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: #1C1C1C; color: #fc4384; } +.cm-s-yonce .CodeMirror-linenumber { color: #777; } +.cm-s-yonce .CodeMirror-cursor { border-left: 2px solid #FC4384; } +.cm-s-yonce .cm-searching { background: rgba(243, 155, 53, .3) !important; outline: 1px solid #F39B35; } +.cm-s-yonce .cm-searching.CodeMirror-selectedtext { background: rgba(243, 155, 53, .7) !important; color: white; } + +.cm-s-yonce .cm-keyword { color: #00A7AA; } /**/ +.cm-s-yonce .cm-atom { color: #F39B35; } +.cm-s-yonce .cm-number, .cm-s-yonce span.cm-type { color: #A06FCA; } /**/ +.cm-s-yonce .cm-def { color: #98E342; } +.cm-s-yonce .cm-property, +.cm-s-yonce span.cm-variable { color: #D4D4D4; font-style: italic; } +.cm-s-yonce span.cm-variable-2 { color: #da7dae; font-style: italic; } +.cm-s-yonce span.cm-variable-3 { color: #A06FCA; } +.cm-s-yonce .cm-type.cm-def { color: #FC4384; font-style: normal; text-decoration: underline; } +.cm-s-yonce .cm-property.cm-def { color: #FC4384; font-style: normal; } +.cm-s-yonce .cm-callee { color: #FC4384; font-style: normal; } +.cm-s-yonce .cm-operator { color: #FC4384; } /**/ +.cm-s-yonce .cm-qualifier, +.cm-s-yonce .cm-tag { color: #FC4384; } +.cm-s-yonce .cm-tag.cm-bracket { color: #D4D4D4; } +.cm-s-yonce .cm-attribute { color: #A06FCA; } +.cm-s-yonce .cm-comment { color:#696d70; font-style:italic; font-weight:normal; } /**/ +.cm-s-yonce .cm-comment.cm-tag { color: #FC4384 } +.cm-s-yonce .cm-comment.cm-attribute { color: #D4D4D4; } +.cm-s-yonce .cm-string { color:#E6DB74; } /**/ +.cm-s-yonce .cm-string-2 { color:#F39B35; } /*?*/ +.cm-s-yonce .cm-meta { color: #D4D4D4; background: inherit; } +.cm-s-yonce .cm-builtin { color: #FC4384; } /*?*/ +.cm-s-yonce .cm-header { color: #da7dae; } +.cm-s-yonce .cm-hr { color: #98E342; } +.cm-s-yonce .cm-link { color:#696d70; font-style:italic; text-decoration:none; } /**/ +.cm-s-yonce .cm-error { border-bottom: 1px solid #C42412; } + +.cm-s-yonce .CodeMirror-activeline-background { background: #272727; } +.cm-s-yonce .CodeMirror-matchingbracket { outline:1px solid grey; color:#D4D4D4 !important; } diff --git a/WebContent/resources/fuscabr/lib/codemirror/theme/zenburn.css b/WebContent/resources/fuscabr/lib/codemirror/theme/zenburn.css new file mode 100755 index 0000000000..4eb4247c92 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/codemirror/theme/zenburn.css @@ -0,0 +1,37 @@ +/** + * " + * Using Zenburn color palette from the Emacs Zenburn Theme + * https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el + * + * Also using parts of https://github.com/xavi/coderay-lighttable-theme + * " + * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css + */ + +.cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; } +.cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; } +.cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white; } +.cm-s-zenburn.CodeMirror { background-color: #3f3f3f; color: #dcdccc; } +.cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; } +.cm-s-zenburn span.cm-comment { color: #7f9f7f; } +.cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; } +.cm-s-zenburn span.cm-atom { color: #bfebbf; } +.cm-s-zenburn span.cm-def { color: #dcdccc; } +.cm-s-zenburn span.cm-variable { color: #dfaf8f; } +.cm-s-zenburn span.cm-variable-2 { color: #dcdccc; } +.cm-s-zenburn span.cm-string { color: #cc9393; } +.cm-s-zenburn span.cm-string-2 { color: #cc9393; } +.cm-s-zenburn span.cm-number { color: #dcdccc; } +.cm-s-zenburn span.cm-tag { color: #93e0e3; } +.cm-s-zenburn span.cm-property { color: #dfaf8f; } +.cm-s-zenburn span.cm-attribute { color: #dfaf8f; } +.cm-s-zenburn span.cm-qualifier { color: #7cb8bb; } +.cm-s-zenburn span.cm-meta { color: #f0dfaf; } +.cm-s-zenburn span.cm-header { color: #f0efd0; } +.cm-s-zenburn span.cm-operator { color: #f0efd0; } +.cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; } +.cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; } +.cm-s-zenburn .CodeMirror-activeline { background: #000000; } +.cm-s-zenburn .CodeMirror-activeline-background { background: #000000; } +.cm-s-zenburn div.CodeMirror-selected { background: #545454; } +.cm-s-zenburn .CodeMirror-focused div.CodeMirror-selected { background: #4f4f4f; } diff --git a/WebContent/resources/fuscabr/lib/flatpickr/LICENSE.txt b/WebContent/resources/fuscabr/lib/flatpickr/LICENSE.txt new file mode 100644 index 0000000000..f611f3399d --- /dev/null +++ b/WebContent/resources/fuscabr/lib/flatpickr/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Gregory Petrosyan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.css b/WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.css new file mode 100644 index 0000000000..8920a67e01 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.css @@ -0,0 +1,13 @@ +.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/* + /*rtl:begin:ignore*/left:0/* + /*rtl:end:ignore*/}/* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{/* + /*rtl:begin:ignore*/right:0/* + /*rtl:end:ignore*/}/* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}} diff --git a/WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.js b/WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.js new file mode 100644 index 0000000000..357a860a20 --- /dev/null +++ b/WebContent/resources/fuscabr/lib/flatpickr/flatpickr.min.js @@ -0,0 +1,2 @@ +/* flatpickr v4.6.9,, @license MIT */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).flatpickr=t()}(this,(function(){"use strict";var e=function(){return(e=Object.assign||function(e){for(var t,n=1,a=arguments.length;n",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},i={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var t=e%100;if(t>3&&t<21)return"th";switch(t%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},o=function(e,t){return void 0===t&&(t=2),("000"+e).slice(-1*t)},r=function(e){return!0===e?1:0};function l(e,t){var n;return function(){var a=this;clearTimeout(n),n=setTimeout((function(){return e.apply(a,arguments)}),t)}}var c=function(e){return e instanceof Array?e:[e]};function d(e,t,n){if(!0===n)return e.classList.add(t);e.classList.remove(t)}function s(e,t,n){var a=window.document.createElement(e);return t=t||"",n=n||"",a.className=t,void 0!==n&&(a.textContent=n),a}function u(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function f(e,t){return t(e)?e:e.parentNode?f(e.parentNode,t):void 0}function m(e,t){var n=s("div","numInputWrapper"),a=s("input","numInput "+e),i=s("span","arrowUp"),o=s("span","arrowDown");if(-1===navigator.userAgent.indexOf("MSIE 9.0")?a.type="number":(a.type="text",a.pattern="\\d*"),void 0!==t)for(var r in t)a.setAttribute(r,t[r]);return n.appendChild(a),n.appendChild(i),n.appendChild(o),n}function g(e){try{return"function"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(t){return e.target}}var p=function(){},h=function(e,t,n){return n.months[t?"shorthand":"longhand"][e]},v={D:p,F:function(e,t,n){e.setMonth(n.months.longhand.indexOf(t))},G:function(e,t){e.setHours(parseFloat(t))},H:function(e,t){e.setHours(parseFloat(t))},J:function(e,t){e.setDate(parseFloat(t))},K:function(e,t,n){e.setHours(e.getHours()%12+12*r(new RegExp(n.amPM[1],"i").test(t)))},M:function(e,t,n){e.setMonth(n.months.shorthand.indexOf(t))},S:function(e,t){e.setSeconds(parseFloat(t))},U:function(e,t){return new Date(1e3*parseFloat(t))},W:function(e,t,n){var a=parseInt(t),i=new Date(e.getFullYear(),0,2+7*(a-1),0,0,0,0);return i.setDate(i.getDate()-i.getDay()+n.firstDayOfWeek),i},Y:function(e,t){e.setFullYear(parseFloat(t))},Z:function(e,t){return new Date(t)},d:function(e,t){e.setDate(parseFloat(t))},h:function(e,t){e.setHours(parseFloat(t))},i:function(e,t){e.setMinutes(parseFloat(t))},j:function(e,t){e.setDate(parseFloat(t))},l:p,m:function(e,t){e.setMonth(parseFloat(t)-1)},n:function(e,t){e.setMonth(parseFloat(t)-1)},s:function(e,t){e.setSeconds(parseFloat(t))},u:function(e,t){return new Date(parseFloat(t))},w:p,y:function(e,t){e.setFullYear(2e3+parseFloat(t))}},D={D:"(\\w+)",F:"(\\w+)",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"(\\w+)",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"(\\w+)",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},w={Z:function(e){return e.toISOString()},D:function(e,t,n){return t.weekdays.shorthand[w.w(e,t,n)]},F:function(e,t,n){return h(w.n(e,t,n)-1,!1,t)},G:function(e,t,n){return o(w.h(e,t,n))},H:function(e){return o(e.getHours())},J:function(e,t){return void 0!==t.ordinal?e.getDate()+t.ordinal(e.getDate()):e.getDate()},K:function(e,t){return t.amPM[r(e.getHours()>11)]},M:function(e,t){return h(e.getMonth(),!0,t)},S:function(e){return o(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,t,n){return n.getWeek(e)},Y:function(e){return o(e.getFullYear(),4)},d:function(e){return o(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return o(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,t){return t.weekdays.longhand[e.getDay()]},m:function(e){return o(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var t=e.config,n=void 0===t?a:t,o=e.l10n,r=void 0===o?i:o,l=e.isMobile,c=void 0!==l&&l;return function(e,t,a){var i=a||r;return void 0===n.formatDate||c?t.split("").map((function(t,a,o){return w[t]&&"\\"!==o[a-1]?w[t](e,i,n):"\\"!==t?t:""})).join(""):n.formatDate(e,t,i)}},C=function(e){var t=e.config,n=void 0===t?a:t,o=e.l10n,r=void 0===o?i:o;return function(e,t,i,o){if(0===e||e){var l,c=o||r,d=e;if(e instanceof Date)l=new Date(e.getTime());else if("string"!=typeof e&&void 0!==e.toFixed)l=new Date(e);else if("string"==typeof e){var s=t||(n||a).dateFormat,u=String(e).trim();if("today"===u)l=new Date,i=!0;else if(/Z$/.test(u)||/GMT$/.test(u))l=new Date(e);else if(n&&n.parseDate)l=n.parseDate(e,s);else{l=n&&n.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0);for(var f=void 0,m=[],g=0,p=0,h="";g=0?new Date:new Date(w.config.minDate.getTime()),n=x(w.config);t.setHours(n.hours,n.minutes,n.seconds,t.getMilliseconds()),w.selectedDates=[t],w.latestSelectedDateObj=t}void 0!==e&&"blur"!==e.type&&function(e){e.preventDefault();var t="keydown"===e.type,n=g(e),a=n;void 0!==w.amPM&&n===w.amPM&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]);var i=parseFloat(a.getAttribute("min")),l=parseFloat(a.getAttribute("max")),c=parseFloat(a.getAttribute("step")),d=parseInt(a.value,10),s=e.delta||(t?38===e.which?1:-1:0),u=d+c*s;if(void 0!==a.value&&2===a.value.length){var f=a===w.hourElement,m=a===w.minuteElement;ul&&(u=a===w.hourElement?u-l-r(!w.amPM):i,m&&j(void 0,1,w.hourElement)),w.amPM&&f&&(1===c?u+d===23:Math.abs(u-d)>c)&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]),a.value=o(u)}}(e);var a=w._input.value;S(),be(),w._input.value!==a&&w._debouncedChange()}function S(){if(void 0!==w.hourElement&&void 0!==w.minuteElement){var e,t,n=(parseInt(w.hourElement.value.slice(-2),10)||0)%24,a=(parseInt(w.minuteElement.value,10)||0)%60,i=void 0!==w.secondElement?(parseInt(w.secondElement.value,10)||0)%60:0;void 0!==w.amPM&&(e=n,t=w.amPM.textContent,n=e%12+12*r(t===w.l10n.amPM[1]));var o=void 0!==w.config.minTime||w.config.minDate&&w.minDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.minDate,!0);if(void 0!==w.config.maxTime||w.config.maxDate&&w.maxDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.maxDate,!0)){var l=void 0!==w.config.maxTime?w.config.maxTime:w.config.maxDate;(n=Math.min(n,l.getHours()))===l.getHours()&&(a=Math.min(a,l.getMinutes())),a===l.getMinutes()&&(i=Math.min(i,l.getSeconds()))}if(o){var c=void 0!==w.config.minTime?w.config.minTime:w.config.minDate;(n=Math.max(n,c.getHours()))===c.getHours()&&a=12)]),void 0!==w.secondElement&&(w.secondElement.value=o(n)))}function F(e){var t=g(e),n=parseInt(t.value)+(e.delta||0);(n/1e3>1||"Enter"===e.key&&!/[^\d]/.test(n.toString()))&&Q(n)}function A(e,t,n,a){return t instanceof Array?t.forEach((function(t){return A(e,t,n,a)})):e instanceof Array?e.forEach((function(e){return A(e,t,n,a)})):(e.addEventListener(t,n,a),void w._handlers.push({remove:function(){return e.removeEventListener(t,n)}}))}function N(){pe("onChange")}function P(e,t){var n=void 0!==e?w.parseDate(e):w.latestSelectedDateObj||(w.config.minDate&&w.config.minDate>w.now?w.config.minDate:w.config.maxDate&&w.config.maxDate=0&&M(e,w.selectedDates[1])<=0)}(t)&&!ve(t)&&o.classList.add("inRange"),w.weekNumbers&&1===w.config.showMonths&&"prevMonthDay"!==e&&n%7==1&&w.weekNumbers.insertAdjacentHTML("beforeend",""+w.config.getWeek(t)+""),pe("onDayCreate",o),o}function L(e){e.focus(),"range"===w.config.mode&&ae(e)}function W(e){for(var t=e>0?0:w.config.showMonths-1,n=e>0?w.config.showMonths:-1,a=t;a!=n;a+=e)for(var i=w.daysContainer.children[a],o=e>0?0:i.children.length-1,r=e>0?i.children.length:-1,l=o;l!=r;l+=e){var c=i.children[l];if(-1===c.className.indexOf("hidden")&&X(c.dateObj))return c}}function R(e,t){var n=ee(document.activeElement||document.body),a=void 0!==e?e:n?document.activeElement:void 0!==w.selectedDateElem&&ee(w.selectedDateElem)?w.selectedDateElem:void 0!==w.todayDateElem&&ee(w.todayDateElem)?w.todayDateElem:W(t>0?1:-1);void 0===a?w._input.focus():n?function(e,t){for(var n=-1===e.className.indexOf("Month")?e.dateObj.getMonth():w.currentMonth,a=t>0?w.config.showMonths:-1,i=t>0?1:-1,o=n-w.currentMonth;o!=a;o+=i)for(var r=w.daysContainer.children[o],l=n-w.currentMonth===o?e.$i+t:t<0?r.children.length-1:0,c=r.children.length,d=l;d>=0&&d0?c:-1);d+=i){var s=r.children[d];if(-1===s.className.indexOf("hidden")&&X(s.dateObj)&&Math.abs(e.$i-d)>=Math.abs(t))return L(s)}w.changeMonth(i),R(W(i),0)}(a,t):L(a)}function B(e,t){for(var n=(new Date(e,t,1).getDay()-w.l10n.firstDayOfWeek+7)%7,a=w.utils.getDaysInMonth((t-1+12)%12,e),i=w.utils.getDaysInMonth(t,e),o=window.document.createDocumentFragment(),r=w.config.showMonths>1,l=r?"prevMonthDay hidden":"prevMonthDay",c=r?"nextMonthDay hidden":"nextMonthDay",d=a+1-n,u=0;d<=a;d++,u++)o.appendChild(H(l,new Date(e,t-1,d),d,u));for(d=1;d<=i;d++,u++)o.appendChild(H("",new Date(e,t,d),d,u));for(var f=i+1;f<=42-n&&(1===w.config.showMonths||u%7!=0);f++,u++)o.appendChild(H(c,new Date(e,t+1,f%i),f,u));var m=s("div","dayContainer");return m.appendChild(o),m}function J(){if(void 0!==w.daysContainer){u(w.daysContainer),w.weekNumbers&&u(w.weekNumbers);for(var e=document.createDocumentFragment(),t=0;t1||"dropdown"!==w.config.monthSelectorType)){var e=function(e){return!(void 0!==w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&ew.config.maxDate.getMonth())};w.monthsDropdownContainer.tabIndex=-1,w.monthsDropdownContainer.innerHTML="";for(var t=0;t<12;t++)if(e(t)){var n=s("option","flatpickr-monthDropdown-month");n.value=new Date(w.currentYear,t).getMonth().toString(),n.textContent=h(t,w.config.shorthandCurrentMonth,w.l10n),n.tabIndex=-1,w.currentMonth===t&&(n.selected=!0),w.monthsDropdownContainer.appendChild(n)}}}function U(){var e,t=s("div","flatpickr-month"),n=window.document.createDocumentFragment();w.config.showMonths>1||"static"===w.config.monthSelectorType?e=s("span","cur-month"):(w.monthsDropdownContainer=s("select","flatpickr-monthDropdown-months"),w.monthsDropdownContainer.setAttribute("aria-label",w.l10n.monthAriaLabel),A(w.monthsDropdownContainer,"change",(function(e){var t=g(e),n=parseInt(t.value,10);w.changeMonth(n-w.currentMonth),pe("onMonthChange")})),K(),e=w.monthsDropdownContainer);var a=m("cur-year",{tabindex:"-1"}),i=a.getElementsByTagName("input")[0];i.setAttribute("aria-label",w.l10n.yearAriaLabel),w.config.minDate&&i.setAttribute("min",w.config.minDate.getFullYear().toString()),w.config.maxDate&&(i.setAttribute("max",w.config.maxDate.getFullYear().toString()),i.disabled=!!w.config.minDate&&w.config.minDate.getFullYear()===w.config.maxDate.getFullYear());var o=s("div","flatpickr-current-month");return o.appendChild(e),o.appendChild(a),n.appendChild(o),t.appendChild(n),{container:t,yearElement:i,monthElement:e}}function q(){u(w.monthNav),w.monthNav.appendChild(w.prevMonthNav),w.config.showMonths&&(w.yearElements=[],w.monthElements=[]);for(var e=w.config.showMonths;e--;){var t=U();w.yearElements.push(t.yearElement),w.monthElements.push(t.monthElement),w.monthNav.appendChild(t.container)}w.monthNav.appendChild(w.nextMonthNav)}function $(){w.weekdayContainer?u(w.weekdayContainer):w.weekdayContainer=s("div","flatpickr-weekdays");for(var e=w.config.showMonths;e--;){var t=s("div","flatpickr-weekdaycontainer");w.weekdayContainer.appendChild(t)}return z(),w.weekdayContainer}function z(){if(w.weekdayContainer){var e=w.l10n.firstDayOfWeek,n=t(w.l10n.weekdays.shorthand);e>0&&e\n "+n.join("")+"\n \n "}}function G(e,t){void 0===t&&(t=!0);var n=t?e:e-w.currentMonth;n<0&&!0===w._hidePrevMonthArrow||n>0&&!0===w._hideNextMonthArrow||(w.currentMonth+=n,(w.currentMonth<0||w.currentMonth>11)&&(w.currentYear+=w.currentMonth>11?1:-1,w.currentMonth=(w.currentMonth+12)%12,pe("onYearChange"),K()),J(),pe("onMonthChange"),De())}function V(e){return!(!w.config.appendTo||!w.config.appendTo.contains(e))||w.calendarContainer.contains(e)}function Z(e){if(w.isOpen&&!w.config.inline){var t=g(e),n=V(t),a=t===w.input||t===w.altInput||w.element.contains(t)||e.path&&e.path.indexOf&&(~e.path.indexOf(w.input)||~e.path.indexOf(w.altInput)),i="blur"===e.type?a&&e.relatedTarget&&!V(e.relatedTarget):!a&&!n&&!V(e.relatedTarget),o=!w.config.ignoredFocusElements.some((function(e){return e.contains(t)}));i&&o&&(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement&&""!==w.input.value&&void 0!==w.input.value&&I(),w.close(),w.config&&"range"===w.config.mode&&1===w.selectedDates.length&&(w.clear(!1),w.redraw()))}}function Q(e){if(!(!e||w.config.minDate&&ew.config.maxDate.getFullYear())){var t=e,n=w.currentYear!==t;w.currentYear=t||w.currentYear,w.config.maxDate&&w.currentYear===w.config.maxDate.getFullYear()?w.currentMonth=Math.min(w.config.maxDate.getMonth(),w.currentMonth):w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&(w.currentMonth=Math.max(w.config.minDate.getMonth(),w.currentMonth)),n&&(w.redraw(),pe("onYearChange"),K())}}function X(e,t){var n;void 0===t&&(t=!0);var a=w.parseDate(e,void 0,t);if(w.config.minDate&&a&&M(a,w.config.minDate,void 0!==t?t:!w.minDateHasTime)<0||w.config.maxDate&&a&&M(a,w.config.maxDate,void 0!==t?t:!w.maxDateHasTime)>0)return!1;if(!w.config.enable&&0===w.config.disable.length)return!0;if(void 0===a)return!1;for(var i=!!w.config.enable,o=null!==(n=w.config.enable)&&void 0!==n?n:w.config.disable,r=0,l=void 0;r=l.from.getTime()&&a.getTime()<=l.to.getTime())return i}return!i}function ee(e){return void 0!==w.daysContainer&&(-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&w.daysContainer.contains(e))}function te(e){!(e.target===w._input)||!(w.selectedDates.length>0||w._input.value.length>0)||e.relatedTarget&&V(e.relatedTarget)||w.setDate(w._input.value,!0,e.target===w.altInput?w.config.altFormat:w.config.dateFormat)}function ne(e){var t=g(e),n=w.config.wrap?p.contains(t):t===w._input,a=w.config.allowInput,i=w.isOpen&&(!a||!n),o=w.config.inline&&n&&!a;if(13===e.keyCode&&n){if(a)return w.setDate(w._input.value,!0,t===w.altInput?w.config.altFormat:w.config.dateFormat),t.blur();w.open()}else if(V(t)||i||o){var r=!!w.timeContainer&&w.timeContainer.contains(t);switch(e.keyCode){case 13:r?(e.preventDefault(),I(),se()):ue(e);break;case 27:e.preventDefault(),se();break;case 8:case 46:n&&!w.config.allowInput&&(e.preventDefault(),w.clear());break;case 37:case 39:if(r||n)w.hourElement&&w.hourElement.focus();else if(e.preventDefault(),void 0!==w.daysContainer&&(!1===a||document.activeElement&&ee(document.activeElement))){var l=39===e.keyCode?1:-1;e.ctrlKey?(e.stopPropagation(),G(l),R(W(1),0)):R(void 0,l)}break;case 38:case 40:e.preventDefault();var c=40===e.keyCode?1:-1;w.daysContainer&&void 0!==t.$i||t===w.input||t===w.altInput?e.ctrlKey?(e.stopPropagation(),Q(w.currentYear-c),R(W(1),0)):r||R(void 0,7*c):t===w.currentYearElement?Q(w.currentYear-c):w.config.enableTime&&(!r&&w.hourElement&&w.hourElement.focus(),I(e),w._debouncedChange());break;case 9:if(r){var d=[w.hourElement,w.minuteElement,w.secondElement,w.amPM].concat(w.pluginElements).filter((function(e){return e})),s=d.indexOf(t);if(-1!==s){var u=d[s+(e.shiftKey?-1:1)];e.preventDefault(),(u||w._input).focus()}}else!w.config.noCalendar&&w.daysContainer&&w.daysContainer.contains(t)&&e.shiftKey&&(e.preventDefault(),w._input.focus())}}if(void 0!==w.amPM&&t===w.amPM)switch(e.key){case w.l10n.amPM[0].charAt(0):case w.l10n.amPM[0].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[0],S(),be();break;case w.l10n.amPM[1].charAt(0):case w.l10n.amPM[1].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[1],S(),be()}(n||V(t))&&pe("onKeyDown",e)}function ae(e){if(1===w.selectedDates.length&&(!e||e.classList.contains("flatpickr-day")&&!e.classList.contains("flatpickr-disabled"))){for(var t=e?e.dateObj.getTime():w.days.firstElementChild.dateObj.getTime(),n=w.parseDate(w.selectedDates[0],void 0,!0).getTime(),a=Math.min(t,w.selectedDates[0].getTime()),i=Math.max(t,w.selectedDates[0].getTime()),o=!1,r=0,l=0,c=a;ca&&cr)?r=c:c>n&&(!l||c0&&m0&&m>l;return g?(f.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach((function(e){f.classList.remove(e)})),"continue"):o&&!g?"continue":(["startRange","inRange","endRange","notAllowed"].forEach((function(e){f.classList.remove(e)})),void(void 0!==e&&(e.classList.add(t<=w.selectedDates[0].getTime()?"startRange":"endRange"),nt&&m===n&&f.classList.add("endRange"),m>=r&&(0===l||m<=l)&&(d=n,u=t,(c=m)>Math.min(d,u)&&c0||n.getMinutes()>0||n.getSeconds()>0),w.selectedDates&&(w.selectedDates=w.selectedDates.filter((function(e){return X(e)})),w.selectedDates.length||"min"!==e||_(n),be()),w.daysContainer&&(de(),void 0!==n?w.currentYearElement[e]=n.getFullYear().toString():w.currentYearElement.removeAttribute(e),w.currentYearElement.disabled=!!a&&void 0!==n&&a.getFullYear()===n.getFullYear())}}function re(){return w.config.wrap?p.querySelector("[data-input]"):p}function le(){"object"!=typeof w.config.locale&&void 0===T.l10ns[w.config.locale]&&w.config.errorHandler(new Error("flatpickr: invalid locale "+w.config.locale)),w.l10n=e(e({},T.l10ns.default),"object"==typeof w.config.locale?w.config.locale:"default"!==w.config.locale?T.l10ns[w.config.locale]:void 0),D.K="("+w.l10n.amPM[0]+"|"+w.l10n.amPM[1]+"|"+w.l10n.amPM[0].toLowerCase()+"|"+w.l10n.amPM[1].toLowerCase()+")",void 0===e(e({},v),JSON.parse(JSON.stringify(p.dataset||{}))).time_24hr&&void 0===T.defaultConfig.time_24hr&&(w.config.time_24hr=w.l10n.time_24hr),w.formatDate=b(w),w.parseDate=C({config:w.config,l10n:w.l10n})}function ce(e){if("function"!=typeof w.config.position){if(void 0!==w.calendarContainer){pe("onPreCalendarPosition");var t=e||w._positionElement,n=Array.prototype.reduce.call(w.calendarContainer.children,(function(e,t){return e+t.offsetHeight}),0),a=w.calendarContainer.offsetWidth,i=w.config.position.split(" "),o=i[0],r=i.length>1?i[1]:null,l=t.getBoundingClientRect(),c=window.innerHeight-l.bottom,s="above"===o||"below"!==o&&cn,u=window.pageYOffset+l.top+(s?-n-2:t.offsetHeight+2);if(d(w.calendarContainer,"arrowTop",!s),d(w.calendarContainer,"arrowBottom",s),!w.config.inline){var f=window.pageXOffset+l.left,m=!1,g=!1;"center"===r?(f-=(a-l.width)/2,m=!0):"right"===r&&(f-=a-l.width,g=!0),d(w.calendarContainer,"arrowLeft",!m&&!g),d(w.calendarContainer,"arrowCenter",m),d(w.calendarContainer,"arrowRight",g);var p=window.document.body.offsetWidth-(window.pageXOffset+l.right),h=f+a>window.document.body.offsetWidth,v=p+a>window.document.body.offsetWidth;if(d(w.calendarContainer,"rightMost",h),!w.config.static)if(w.calendarContainer.style.top=u+"px",h)if(v){var D=function(){for(var e=null,t=0;tw.currentMonth+w.config.showMonths-1)&&"range"!==w.config.mode;if(w.selectedDateElem=n,"single"===w.config.mode)w.selectedDates=[a];else if("multiple"===w.config.mode){var o=ve(a);o?w.selectedDates.splice(parseInt(o),1):w.selectedDates.push(a)}else"range"===w.config.mode&&(2===w.selectedDates.length&&w.clear(!1,!1),w.latestSelectedDateObj=a,w.selectedDates.push(a),0!==M(a,w.selectedDates[0],!0)&&w.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()})));if(S(),i){var r=w.currentYear!==a.getFullYear();w.currentYear=a.getFullYear(),w.currentMonth=a.getMonth(),r&&(pe("onYearChange"),K()),pe("onMonthChange")}if(De(),J(),be(),i||"range"===w.config.mode||1!==w.config.showMonths?void 0!==w.selectedDateElem&&void 0===w.hourElement&&w.selectedDateElem&&w.selectedDateElem.focus():L(n),void 0!==w.hourElement&&void 0!==w.hourElement&&w.hourElement.focus(),w.config.closeOnSelect){var l="single"===w.config.mode&&!w.config.enableTime,c="range"===w.config.mode&&2===w.selectedDates.length&&!w.config.enableTime;(l||c)&&se()}N()}}w.parseDate=C({config:w.config,l10n:w.l10n}),w._handlers=[],w.pluginElements=[],w.loadedPlugins=[],w._bind=A,w._setHoursFromDate=_,w._positionCalendar=ce,w.changeMonth=G,w.changeYear=Q,w.clear=function(e,t){void 0===e&&(e=!0);void 0===t&&(t=!0);w.input.value="",void 0!==w.altInput&&(w.altInput.value="");void 0!==w.mobileInput&&(w.mobileInput.value="");w.selectedDates=[],w.latestSelectedDateObj=void 0,!0===t&&(w.currentYear=w._initialDate.getFullYear(),w.currentMonth=w._initialDate.getMonth());if(!0===w.config.enableTime){var n=x(w.config),a=n.hours,i=n.minutes,o=n.seconds;O(a,i,o)}w.redraw(),e&&pe("onChange")},w.close=function(){w.isOpen=!1,w.isMobile||(void 0!==w.calendarContainer&&w.calendarContainer.classList.remove("open"),void 0!==w._input&&w._input.classList.remove("active"));pe("onClose")},w._createElement=s,w.destroy=function(){void 0!==w.config&&pe("onDestroy");for(var e=w._handlers.length;e--;)w._handlers[e].remove();if(w._handlers=[],w.mobileInput)w.mobileInput.parentNode&&w.mobileInput.parentNode.removeChild(w.mobileInput),w.mobileInput=void 0;else if(w.calendarContainer&&w.calendarContainer.parentNode)if(w.config.static&&w.calendarContainer.parentNode){var t=w.calendarContainer.parentNode;if(t.lastChild&&t.removeChild(t.lastChild),t.parentNode){for(;t.firstChild;)t.parentNode.insertBefore(t.firstChild,t);t.parentNode.removeChild(t)}}else w.calendarContainer.parentNode.removeChild(w.calendarContainer);w.altInput&&(w.input.type="text",w.altInput.parentNode&&w.altInput.parentNode.removeChild(w.altInput),delete w.altInput);w.input&&(w.input.type=w.input._type,w.input.classList.remove("flatpickr-input"),w.input.removeAttribute("readonly"));["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach((function(e){try{delete w[e]}catch(e){}}))},w.isEnabled=X,w.jumpToDate=P,w.open=function(e,t){void 0===t&&(t=w._positionElement);if(!0===w.isMobile){if(e){e.preventDefault();var n=g(e);n&&n.blur()}return void 0!==w.mobileInput&&(w.mobileInput.focus(),w.mobileInput.click()),void pe("onOpen")}if(w._input.disabled||w.config.inline)return;var a=w.isOpen;w.isOpen=!0,a||(w.calendarContainer.classList.add("open"),w._input.classList.add("active"),pe("onOpen"),ce(t));!0===w.config.enableTime&&!0===w.config.noCalendar&&(!1!==w.config.allowInput||void 0!==e&&w.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return w.hourElement.select()}),50))},w.redraw=de,w.set=function(e,t){if(null!==e&&"object"==typeof e)for(var a in Object.assign(w.config,e),e)void 0!==fe[a]&&fe[a].forEach((function(e){return e()}));else w.config[e]=t,void 0!==fe[e]?fe[e].forEach((function(e){return e()})):n.indexOf(e)>-1&&(w.config[e]=c(t));w.redraw(),be(!0)},w.setDate=function(e,t,n){void 0===t&&(t=!1);void 0===n&&(n=w.config.dateFormat);if(0!==e&&!e||e instanceof Array&&0===e.length)return w.clear(t);me(e,n),w.latestSelectedDateObj=w.selectedDates[w.selectedDates.length-1],w.redraw(),P(void 0,t),_(),0===w.selectedDates.length&&w.clear(!1);be(t),t&&pe("onChange")},w.toggle=function(e){if(!0===w.isOpen)return w.close();w.open(e)};var fe={locale:[le,z],showMonths:[q,k,$],minDate:[P],maxDate:[P],clickOpens:[function(){!0===w.config.clickOpens?(A(w._input,"focus",w.open),A(w._input,"click",w.open)):(w._input.removeEventListener("focus",w.open),w._input.removeEventListener("click",w.open))}]};function me(e,t){var n=[];if(e instanceof Array)n=e.map((function(e){return w.parseDate(e,t)}));else if(e instanceof Date||"number"==typeof e)n=[w.parseDate(e,t)];else if("string"==typeof e)switch(w.config.mode){case"single":case"time":n=[w.parseDate(e,t)];break;case"multiple":n=e.split(w.config.conjunction).map((function(e){return w.parseDate(e,t)}));break;case"range":n=e.split(w.l10n.rangeSeparator).map((function(e){return w.parseDate(e,t)}))}else w.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(e)));w.selectedDates=w.config.allowInvalidPreload?n:n.filter((function(e){return e instanceof Date&&X(e,!1)})),"range"===w.config.mode&&w.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()}))}function ge(e){return e.slice().map((function(e){return"string"==typeof e||"number"==typeof e||e instanceof Date?w.parseDate(e,void 0,!0):e&&"object"==typeof e&&e.from&&e.to?{from:w.parseDate(e.from,void 0),to:w.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function pe(e,t){if(void 0!==w.config){var n=w.config[e];if(void 0!==n&&n.length>0)for(var a=0;n[a]&&a1||"static"===w.config.monthSelectorType?w.monthElements[t].textContent=h(n.getMonth(),w.config.shorthandCurrentMonth,w.l10n)+" ":w.monthsDropdownContainer.value=n.getMonth().toString(),e.value=n.getFullYear().toString()})),w._hidePrevMonthArrow=void 0!==w.config.minDate&&(w.currentYear===w.config.minDate.getFullYear()?w.currentMonth<=w.config.minDate.getMonth():w.currentYearw.config.maxDate.getMonth():w.currentYear>w.config.maxDate.getFullYear()))}function we(e){return w.selectedDates.map((function(t){return w.formatDate(t,e)})).filter((function(e,t,n){return"range"!==w.config.mode||w.config.enableTime||n.indexOf(e)===t})).join("range"!==w.config.mode?w.config.conjunction:w.l10n.rangeSeparator)}function be(e){void 0===e&&(e=!0),void 0!==w.mobileInput&&w.mobileFormatStr&&(w.mobileInput.value=void 0!==w.latestSelectedDateObj?w.formatDate(w.latestSelectedDateObj,w.mobileFormatStr):""),w.input.value=we(w.config.dateFormat),void 0!==w.altInput&&(w.altInput.value=we(w.config.altFormat)),!1!==e&&pe("onValueUpdate")}function Ce(e){var t=g(e),n=w.prevMonthNav.contains(t),a=w.nextMonthNav.contains(t);n||a?G(n?-1:1):w.yearElements.indexOf(t)>=0?t.select():t.classList.contains("arrowUp")?w.changeYear(w.currentYear+1):t.classList.contains("arrowDown")&&w.changeYear(w.currentYear-1)}return function(){w.element=w.input=p,w.isOpen=!1,function(){var t=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],i=e(e({},JSON.parse(JSON.stringify(p.dataset||{}))),v),o={};w.config.parseDate=i.parseDate,w.config.formatDate=i.formatDate,Object.defineProperty(w.config,"enable",{get:function(){return w.config._enable},set:function(e){w.config._enable=ge(e)}}),Object.defineProperty(w.config,"disable",{get:function(){return w.config._disable},set:function(e){w.config._disable=ge(e)}});var r="time"===i.mode;if(!i.dateFormat&&(i.enableTime||r)){var l=T.defaultConfig.dateFormat||a.dateFormat;o.dateFormat=i.noCalendar||r?"H:i"+(i.enableSeconds?":S":""):l+" H:i"+(i.enableSeconds?":S":"")}if(i.altInput&&(i.enableTime||r)&&!i.altFormat){var d=T.defaultConfig.altFormat||a.altFormat;o.altFormat=i.noCalendar||r?"h:i"+(i.enableSeconds?":S K":" K"):d+" h:i"+(i.enableSeconds?":S":"")+" K"}Object.defineProperty(w.config,"minDate",{get:function(){return w.config._minDate},set:oe("min")}),Object.defineProperty(w.config,"maxDate",{get:function(){return w.config._maxDate},set:oe("max")});var s=function(e){return function(t){w.config["min"===e?"_minTime":"_maxTime"]=w.parseDate(t,"H:i:S")}};Object.defineProperty(w.config,"minTime",{get:function(){return w.config._minTime},set:s("min")}),Object.defineProperty(w.config,"maxTime",{get:function(){return w.config._maxTime},set:s("max")}),"time"===i.mode&&(w.config.noCalendar=!0,w.config.enableTime=!0);Object.assign(w.config,o,i);for(var u=0;u-1?w.config[m]=c(f[m]).map(E).concat(w.config[m]):void 0===i[m]&&(w.config[m]=f[m])}i.altInputClass||(w.config.altInputClass=re().className+" "+w.config.altInputClass);pe("onParseConfig")}(),le(),function(){if(w.input=re(),!w.input)return void w.config.errorHandler(new Error("Invalid input element specified"));w.input._type=w.input.type,w.input.type="text",w.input.classList.add("flatpickr-input"),w._input=w.input,w.config.altInput&&(w.altInput=s(w.input.nodeName,w.config.altInputClass),w._input=w.altInput,w.altInput.placeholder=w.input.placeholder,w.altInput.disabled=w.input.disabled,w.altInput.required=w.input.required,w.altInput.tabIndex=w.input.tabIndex,w.altInput.type="text",w.input.setAttribute("type","hidden"),!w.config.static&&w.input.parentNode&&w.input.parentNode.insertBefore(w.altInput,w.input.nextSibling));w.config.allowInput||w._input.setAttribute("readonly","readonly");w._positionElement=w.config.positionElement||w._input}(),function(){w.selectedDates=[],w.now=w.parseDate(w.config.now)||new Date;var e=w.config.defaultDate||("INPUT"!==w.input.nodeName&&"TEXTAREA"!==w.input.nodeName||!w.input.placeholder||w.input.value!==w.input.placeholder?w.input.value:null);e&&me(e,w.config.dateFormat);w._initialDate=w.selectedDates.length>0?w.selectedDates[0]:w.config.minDate&&w.config.minDate.getTime()>w.now.getTime()?w.config.minDate:w.config.maxDate&&w.config.maxDate.getTime()0&&(w.latestSelectedDateObj=w.selectedDates[0]);void 0!==w.config.minTime&&(w.config.minTime=w.parseDate(w.config.minTime,"H:i"));void 0!==w.config.maxTime&&(w.config.maxTime=w.parseDate(w.config.maxTime,"H:i"));w.minDateHasTime=!!w.config.minDate&&(w.config.minDate.getHours()>0||w.config.minDate.getMinutes()>0||w.config.minDate.getSeconds()>0),w.maxDateHasTime=!!w.config.maxDate&&(w.config.maxDate.getHours()>0||w.config.maxDate.getMinutes()>0||w.config.maxDate.getSeconds()>0)}(),w.utils={getDaysInMonth:function(e,t){return void 0===e&&(e=w.currentMonth),void 0===t&&(t=w.currentYear),1===e&&(t%4==0&&t%100!=0||t%400==0)?29:w.l10n.daysInMonth[e]}},w.isMobile||function(){var e=window.document.createDocumentFragment();if(w.calendarContainer=s("div","flatpickr-calendar"),w.calendarContainer.tabIndex=-1,!w.config.noCalendar){if(e.appendChild((w.monthNav=s("div","flatpickr-months"),w.yearElements=[],w.monthElements=[],w.prevMonthNav=s("span","flatpickr-prev-month"),w.prevMonthNav.innerHTML=w.config.prevArrow,w.nextMonthNav=s("span","flatpickr-next-month"),w.nextMonthNav.innerHTML=w.config.nextArrow,q(),Object.defineProperty(w,"_hidePrevMonthArrow",{get:function(){return w.__hidePrevMonthArrow},set:function(e){w.__hidePrevMonthArrow!==e&&(d(w.prevMonthNav,"flatpickr-disabled",e),w.__hidePrevMonthArrow=e)}}),Object.defineProperty(w,"_hideNextMonthArrow",{get:function(){return w.__hideNextMonthArrow},set:function(e){w.__hideNextMonthArrow!==e&&(d(w.nextMonthNav,"flatpickr-disabled",e),w.__hideNextMonthArrow=e)}}),w.currentYearElement=w.yearElements[0],De(),w.monthNav)),w.innerContainer=s("div","flatpickr-innerContainer"),w.config.weekNumbers){var t=function(){w.calendarContainer.classList.add("hasWeeks");var e=s("div","flatpickr-weekwrapper");e.appendChild(s("span","flatpickr-weekday",w.l10n.weekAbbreviation));var t=s("div","flatpickr-weeks");return e.appendChild(t),{weekWrapper:e,weekNumbers:t}}(),n=t.weekWrapper,a=t.weekNumbers;w.innerContainer.appendChild(n),w.weekNumbers=a,w.weekWrapper=n}w.rContainer=s("div","flatpickr-rContainer"),w.rContainer.appendChild($()),w.daysContainer||(w.daysContainer=s("div","flatpickr-days"),w.daysContainer.tabIndex=-1),J(),w.rContainer.appendChild(w.daysContainer),w.innerContainer.appendChild(w.rContainer),e.appendChild(w.innerContainer)}w.config.enableTime&&e.appendChild(function(){w.calendarContainer.classList.add("hasTime"),w.config.noCalendar&&w.calendarContainer.classList.add("noCalendar");var e=x(w.config);w.timeContainer=s("div","flatpickr-time"),w.timeContainer.tabIndex=-1;var t=s("span","flatpickr-time-separator",":"),n=m("flatpickr-hour",{"aria-label":w.l10n.hourAriaLabel});w.hourElement=n.getElementsByTagName("input")[0];var a=m("flatpickr-minute",{"aria-label":w.l10n.minuteAriaLabel});w.minuteElement=a.getElementsByTagName("input")[0],w.hourElement.tabIndex=w.minuteElement.tabIndex=-1,w.hourElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getHours():w.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),w.minuteElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getMinutes():e.minutes),w.hourElement.setAttribute("step",w.config.hourIncrement.toString()),w.minuteElement.setAttribute("step",w.config.minuteIncrement.toString()),w.hourElement.setAttribute("min",w.config.time_24hr?"0":"1"),w.hourElement.setAttribute("max",w.config.time_24hr?"23":"12"),w.hourElement.setAttribute("maxlength","2"),w.minuteElement.setAttribute("min","0"),w.minuteElement.setAttribute("max","59"),w.minuteElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(n),w.timeContainer.appendChild(t),w.timeContainer.appendChild(a),w.config.time_24hr&&w.timeContainer.classList.add("time24hr");if(w.config.enableSeconds){w.timeContainer.classList.add("hasSeconds");var i=m("flatpickr-second");w.secondElement=i.getElementsByTagName("input")[0],w.secondElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getSeconds():e.seconds),w.secondElement.setAttribute("step",w.minuteElement.getAttribute("step")),w.secondElement.setAttribute("min","0"),w.secondElement.setAttribute("max","59"),w.secondElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(s("span","flatpickr-time-separator",":")),w.timeContainer.appendChild(i)}w.config.time_24hr||(w.amPM=s("span","flatpickr-am-pm",w.l10n.amPM[r((w.latestSelectedDateObj?w.hourElement.value:w.config.defaultHour)>11)]),w.amPM.title=w.l10n.toggleTitle,w.amPM.tabIndex=-1,w.timeContainer.appendChild(w.amPM));return w.timeContainer}());d(w.calendarContainer,"rangeMode","range"===w.config.mode),d(w.calendarContainer,"animate",!0===w.config.animate),d(w.calendarContainer,"multiMonth",w.config.showMonths>1),w.calendarContainer.appendChild(e);var i=void 0!==w.config.appendTo&&void 0!==w.config.appendTo.nodeType;if((w.config.inline||w.config.static)&&(w.calendarContainer.classList.add(w.config.inline?"inline":"static"),w.config.inline&&(!i&&w.element.parentNode?w.element.parentNode.insertBefore(w.calendarContainer,w._input.nextSibling):void 0!==w.config.appendTo&&w.config.appendTo.appendChild(w.calendarContainer)),w.config.static)){var l=s("div","flatpickr-wrapper");w.element.parentNode&&w.element.parentNode.insertBefore(l,w.element),l.appendChild(w.element),w.altInput&&l.appendChild(w.altInput),l.appendChild(w.calendarContainer)}w.config.static||w.config.inline||(void 0!==w.config.appendTo?w.config.appendTo:window.document.body).appendChild(w.calendarContainer)}(),function(){w.config.wrap&&["open","close","toggle","clear"].forEach((function(e){Array.prototype.forEach.call(w.element.querySelectorAll("[data-"+e+"]"),(function(t){return A(t,"click",w[e])}))}));if(w.isMobile)return void function(){var e=w.config.enableTime?w.config.noCalendar?"time":"datetime-local":"date";w.mobileInput=s("input",w.input.className+" flatpickr-mobile"),w.mobileInput.tabIndex=1,w.mobileInput.type=e,w.mobileInput.disabled=w.input.disabled,w.mobileInput.required=w.input.required,w.mobileInput.placeholder=w.input.placeholder,w.mobileFormatStr="datetime-local"===e?"Y-m-d\\TH:i:S":"date"===e?"Y-m-d":"H:i:S",w.selectedDates.length>0&&(w.mobileInput.defaultValue=w.mobileInput.value=w.formatDate(w.selectedDates[0],w.mobileFormatStr));w.config.minDate&&(w.mobileInput.min=w.formatDate(w.config.minDate,"Y-m-d"));w.config.maxDate&&(w.mobileInput.max=w.formatDate(w.config.maxDate,"Y-m-d"));w.input.getAttribute("step")&&(w.mobileInput.step=String(w.input.getAttribute("step")));w.input.type="hidden",void 0!==w.altInput&&(w.altInput.type="hidden");try{w.input.parentNode&&w.input.parentNode.insertBefore(w.mobileInput,w.input.nextSibling)}catch(e){}A(w.mobileInput,"change",(function(e){w.setDate(g(e).value,!1,w.mobileFormatStr),pe("onChange"),pe("onClose")}))}();var e=l(ie,50);w._debouncedChange=l(N,300),w.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&A(w.daysContainer,"mouseover",(function(e){"range"===w.config.mode&&ae(g(e))}));A(window.document.body,"keydown",ne),w.config.inline||w.config.static||A(window,"resize",e);void 0!==window.ontouchstart?A(window.document,"touchstart",Z):A(window.document,"mousedown",Z);A(window.document,"focus",Z,{capture:!0}),!0===w.config.clickOpens&&(A(w._input,"focus",w.open),A(w._input,"click",w.open));void 0!==w.daysContainer&&(A(w.monthNav,"click",Ce),A(w.monthNav,["keyup","increment"],F),A(w.daysContainer,"click",ue));if(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement){var t=function(e){return g(e).select()};A(w.timeContainer,["increment"],I),A(w.timeContainer,"blur",I,{capture:!0}),A(w.timeContainer,"click",Y),A([w.hourElement,w.minuteElement],["focus","click"],t),void 0!==w.secondElement&&A(w.secondElement,"focus",(function(){return w.secondElement&&w.secondElement.select()})),void 0!==w.amPM&&A(w.amPM,"click",(function(e){I(e),N()}))}w.config.allowInput&&A(w._input,"blur",te)}(),(w.selectedDates.length||w.config.noCalendar)&&(w.config.enableTime&&_(w.config.noCalendar?w.latestSelectedDateObj:void 0),be(!1)),k();var t=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!w.isMobile&&t&&ce(),pe("onReady")}(),w}function k(e,t){for(var n=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),a=[],i=0;i div:not(.fuscabr-align):not(.windowDiv)"); + for (var element of elements) { + this.hoverResponsivity(element, true); + element.classList.add("fuscabr-align"); + + // Create a div to prevent accidental clicks + var pcDiv = document.createElement("div"); + pcDiv.classList.add("fuscabr-align-preventclick"); + pcDiv.style = "position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;"; + element.appendChild(pcDiv); + } + }, + + stopSelectionMode: function() { + // Remove update trigger + var updateTrigger = document.getElementById("fuscabr-update-trigger"); + updateTrigger.removeEventListener("click", fuscabr.align.updateSelectionMode); + updateTrigger.id = ""; + + // Make all View components not selectable + var elements = document.querySelectorAll("#viewContent > div.fuscabr-align"); + for (var element of elements) { + this.hoverResponsivity(element, false); + element.classList.remove("fuscabr-align"); + + // Remove accidental click protection + element.querySelector(".fuscabr-align-preventclick").remove(); + } + + // Unselect previously selected items + for (var i = 0; i < this.selectedItems.length; i++) { + if (i == 0) + this.unmakeAnchor(this.selectedItems[i]); + else + this.unmakeSelected(this.selectedItems[i]); + } + this.selectedItems = []; + }, + + updateSelectionMode: function() { + setTimeout(function() { + fuscabr.align.startSelectionMode.call(fuscabr.align); + }, 200); + }, + + // Enable or disable responsiveness to mouse clicks or hovering + hoverResponsivity: function(element, enable) { + if (enable) { + element.addEventListener("mouseover", fuscabr.align.drawHoverBorder); + element.addEventListener("mouseout", fuscabr.align.clearHoverBorder); + element.addEventListener("click", fuscabr.align.selectItem); + } else { + element.removeEventListener("mouseover", fuscabr.align.drawHoverBorder); + element.removeEventListener("mouseout", fuscabr.align.clearHoverBorder); + element.removeEventListener("click", fuscabr.align.selectItem); + // Clear remanescent borders + element.style.margin = ""; + element.style.border = ""; + } + }, + + drawHoverBorder: function() { + var conf = fuscabr.align.conf; + this.style.margin = "-2px"; + this.style.border = "2px solid " + conf.hoverBorderColor; + }, + + clearHoverBorder: function() { + this.style.margin = ""; + this.style.border = ""; + }, + + + /** + * Element selection and anchor-related methods + * + * In FUScaBR Align module, the "anchor element" is always + * the first selected element. This element is used as a + * reference to alignment methods (except for "distribution"). + */ + + + // Select elements that can be aligned + selectItem: function() { + fuscabr.align.selectedItems.push(this); + + // Remove responsivity + fuscabr.align.hoverResponsivity(this, false); + + // Select the element + if (fuscabr.align.selectedItems.length == 1) + fuscabr.align.makeAnchor(this); + else + fuscabr.align.makeSelected(this); + }, + + makeSelected: function(element) { + var conf = fuscabr.align.conf; + element.style.margin = "-2px"; + element.style.border = "2px solid " + conf.elementBorderColor; + }, + + unmakeSelected: function(element) { + element.style.margin = ""; + element.style.border = ""; + }, + + makeAnchor: function(element) { + var conf = fuscabr.align.conf; + // Anchor borders + element.style.margin = "-2px"; + element.style.border = "2px solid " + conf.anchorBorderColor; + // Anchor label + var label = document.createElement("span"); + label.id = "fuscabr-anchor"; + label.innerHTML = fuscabr.common.i18n.align["anchor"] || "Anchor"; + label.style = "text-transform: uppercase; font-size: 9px; z-index: 20; \ + position: absolute; top: -15px; color: " + conf.anchorBorderColor; + element.appendChild(label); + // Anchor listeners + element.addEventListener("mouseup", fuscabr.align.updateAnchorPosition); + + fuscabr.align.updateAnchorPosition(true); + }, + + unmakeAnchor: function(element) { + // Remove borders + this.unmakeSelected(element); + // Remove label + document.getElementById("fuscabr-anchor").remove(); + // Remove listeners + element.removeEventListener("mouseup", fuscabr.align.updateAnchorPosition); + // Clear anchor position in GUI + document.getElementById("fuscabr-align-x-anchor").value = ""; + document.getElementById("fuscabr-align-y-anchor").value = ""; + }, + + enableAnchorFollowing: function(enable) { + if (enable) { + this.elementsFollowAnchor = true; + } else { + this.elementsFollowAnchor = false; + document.getElementById("fuscabr-anchor-following").checked = false; + } + }, + + // Get current position of anchor element + getAnchorPosition: function() { + // Get anchor's CSS position + var xPos = fuscabr.align.selectedItems[0].style.left.replace("px", ""); + var yPos = fuscabr.align.selectedItems[0].style.top.replace("px", ""); + + return {x: xPos, y: yPos}; + }, + + // Update current position of anchor element + updateAnchorPosition: function() { + // Get anchor's CSS position + var pos = fuscabr.align.getAnchorPosition(); + + if (fuscabr.align.currentAnchorPosition != {}) + fuscabr.align.lastAnchorPosition = fuscabr.align.currentAnchorPosition; + + fuscabr.align.currentAnchorPosition = pos; + + // Update GUI position values + document.getElementById("fuscabr-align-x-anchor").value = pos.x; + document.getElementById("fuscabr-align-y-anchor").value = pos.y; + + updateViewComponentLocation(fuscabr.align.selectedItems[0].id); + + if (fuscabr.align.elementsFollowAnchor) { + fuscabr.align.followAnchor(); + } + }, + + + /** + * Keyboard shortcut methods + */ + + + // Enable/disable shortcuts to move the anchor + enableMovingShortcuts: function(enable) { + if (enable) { + window.addEventListener("keydown", fuscabr.align.moveKeyboardShortcuts); + } else { + window.removeEventListener("keydown", fuscabr.align.moveKeyboardShortcuts); + document.getElementById("fuscabr-keyboard-moving").checked = false; + } + }, + + // Enable/disable shortcuts to align elements + enableAlignShortcuts: function(enable) { + if (enable) + document.body.addEventListener("keyup", fuscabr.align.alignKeyboardShortcuts); + else + document.body.removeEventListener("keyup", fuscabr.align.alignKeyboardShortcuts); + }, + + // Define keyboard shortcuts to alignment functions + alignKeyboardShortcuts: function(evt) { + if (evt.code == "KeyA") { + fuscabr.align.alignLeft(); + } else if (evt.code == "KeyD") { + fuscabr.align.alignRight(); + } else if (evt.code == "KeyW") { + fuscabr.align.alignTop(); + } else if (evt.code == "KeyX") { + fuscabr.align.alignBottom(); + } else if (evt.code == "KeyF") { + fuscabr.align.centerHorizontal(); + } else if (evt.code == "KeyG") { + fuscabr.align.centerVertical(); + } else if (evt.code == "KeyR") { + fuscabr.align.distributeHorizontal(); + } else if (evt.code == "KeyT") { + fuscabr.align.distributeVertical(); + } else if (evt.code == "Escape") { + fuscabr.align.stop(); + } else if (evt.code == "KeyS") { + fuscabr.align.restart(); + } + }, + + // Define shortcuts to use keyboard arrows in anchor moving + moveKeyboardShortcuts: function(evt) { + var offset = fuscabr.align.conf.moveAnchorOffset; + if (evt.code == "ArrowUp") { + evt.preventDefault(); + fuscabr.align.relativeMoveAnchor(0, -(offset)); + } else if (evt.code == "ArrowDown") { + fuscabr.align.relativeMoveAnchor(0, +(offset)); + evt.preventDefault(); + } else if (evt.code == "ArrowLeft") { + fuscabr.align.relativeMoveAnchor(-(offset), 0); + evt.preventDefault(); + } else if (evt.code == "ArrowRight") { + fuscabr.align.relativeMoveAnchor(+(offset), 0); + evt.preventDefault(); + } + }, + + + /** + * Moving/align methods + */ + + + // Move all selected elements to follow anchor displacement + followAnchor: function() { + var cap = this.currentAnchorPosition; + var lap = this.lastAnchorPosition; + + var xOffset = cap.x - lap.x; + var yOffset = cap.y - lap.y; + + var elements = fuscabr.align.selectedItems; + + for (var i = 1; i < elements.length; i++) { + var currentX = parseInt(elements[i].style.left.replace("px", "")); + var currentY = parseInt(elements[i].style.top.replace("px", "")); + + elements[i].style.left = (currentX + xOffset) + "px"; + elements[i].style.top = (currentY + yOffset) + "px"; + + updateViewComponentLocation(elements[i].id); + } + + }, + + // Move anchor to an absolute coordinate (called from GUI) + absoluteMoveAnchor: function() { + // Get position specified in GUI + var xPos = document.getElementById("fuscabr-align-x-anchor").value; + var yPos = document.getElementById("fuscabr-align-y-anchor").value; + + // Update position + fuscabr.align.selectedItems[0].style.left = Math.round(xPos) + "px"; + fuscabr.align.selectedItems[0].style.top = Math.round(yPos) + "px"; + + fuscabr.align.updateAnchorPosition(); + }, + + // Move anchor relatively (called from keyboard arrows shortcut) + relativeMoveAnchor: function(xOffset, yOffset) { + // Get actual position + var pos = fuscabr.align.getAnchorPosition(); + + // Calc the offset and move anchor + if (xOffset) { + var newX = pos.x - (pos.x % xOffset) + xOffset; + fuscabr.align.selectedItems[0].style.left = Math.round(newX) + "px"; + } + if (yOffset) { + var newY = pos.y - (pos.y % yOffset) + yOffset; + fuscabr.align.selectedItems[0].style.top = Math.round(newY) + "px"; + } + + fuscabr.align.updateAnchorPosition(); + }, + + // Align elements to the left + alignLeft: function() { + // Use anchor position as reference + var x = this.selectedItems[0].style.left; + // Copy the anchor position + for (var i of this.selectedItems) { + i.style.left = x; + updateViewComponentLocation(i.id); + } + }, + + // Align elements to the top + alignTop: function() { + // Use anchor position as reference + var y = this.selectedItems[0].style.top; + // Copy the anchor position + for (var i of this.selectedItems) { + i.style.top = y; + updateViewComponentLocation(i.id); + } + }, + + // Align elements to the right + alignRight: function() { + // Use anchor position as reference + var xLeft = Number(this.selectedItems[0].style.left.replace("px", "")); + var width = Number(this.selectedItems[0].clientWidth); + var xRight = xLeft + width; + + // Align other elements relative to the anchor + for (var i of this.selectedItems) { + var loopXLeft = Number(i.style.left.replace("px", "")); + var loopWidth = Number(i.clientWidth); + var loopXRight = loopXLeft + loopWidth; + + var newX = loopXLeft + (xRight - loopXRight); + i.style.left = Math.round(newX) + "px"; + updateViewComponentLocation(i.id); + } + }, + + // Align elements to the bottom + alignBottom: function() { + // Use anchor position as reference + var yTop = Number(this.selectedItems[0].style.top.replace("px", "")); + var height = Number(this.selectedItems[0].clientHeight); + var yBottom = yTop + height; + + // Align other elements relative to the anchor + for (var i of this.selectedItems) { + var loopYTop = Number(i.style.top.replace("px", "")); + var loopHeight = Number(i.clientHeight); + var loopYBottom = loopYTop + loopHeight; + + var newY = loopYTop + (yBottom - loopYBottom); + i.style.top = Math.round(newY) + "px"; + updateViewComponentLocation(i.id); + } + }, + + // Center elements horizontally + centerHorizontal: function() { + // Use anchor position as reference + var xLeft = Number(this.selectedItems[0].style.left.replace("px", "")); + var width = Number(this.selectedItems[0].clientWidth); + var xCenter = xLeft + (width / 2); + + // Center other elements relative to the anchor + for (var i of this.selectedItems) { + var loopXLeft = Number(i.style.left.replace("px", "")); + var loopWidth = Number(i.clientWidth); + var loopXCenter = loopXLeft + (loopWidth / 2); + + var newX = loopXLeft + (xCenter- loopXCenter); + i.style.left = Math.round(newX) + "px"; + updateViewComponentLocation(i.id); + } + }, + + // Center elements vertically + centerVertical: function() { + // Use anchor position as reference + var yTop = Number(this.selectedItems[0].style.top.replace("px", "")); + var height = Number(this.selectedItems[0].clientHeight); + var yCenter = yTop + (height / 2); + + // Center other elements relative to the anchor + for (var i of this.selectedItems) { + var loopYTop = Number(i.style.top.replace("px", "")); + var loopHeight = Number(i.clientHeight); + var loopYCenter = loopYTop + (loopHeight / 2); + + var newY = loopYTop + (yCenter - loopYCenter); + i.style.top = Math.round(newY) + "px"; + updateViewComponentLocation(i.id); + } + }, + + // Distribute elements horizontally + distributeHorizontal: function() { + // Ignore if less than 3 selected items + if (this.selectedItems.length < 3) { + return; + } + + // Order elements by position + var copyArray = this.selectedItems.slice(); + copyArray.sort( function (a, b) { + var aa = Number(a.style.left.replace("px", "")); + var bb = Number(b.style.left.replace("px", "")); + return (aa > bb ? 1 : -1); + }); + + // Calc free space between elements + var foo = copyArray.length - 1; + var minX = Number(copyArray[0].style.left.replace("px", "")); + var maxX = Number(copyArray[foo].style.left.replace("px", "")); + var space = (maxX - minX); + + for (var i = 0; i < foo; i++) { + space -= copyArray[i].clientWidth; + } + space = space / foo; + + // Disable anchor following + var followingDisabled = false; + if (this.elementsFollowAnchor) { + this.elementsFollowAnchor = false; + followingDisabled = true; + } + + // Position elements equally spaced from each other + for (var i = 1; i < foo; i++) { + var pastX = Number(copyArray[(i - 1)].style.left.replace("px", "")); + var pastWidth = Number(copyArray[(i - 1)].clientWidth); + + var newX = pastX + pastWidth + space; + copyArray[i].style.left = Math.round(newX) + "px"; + updateViewComponentLocation(copyArray[i].id); + + // Update anchor position + this.updateAnchorPosition(); + } + + // Re-enable anchor following + if (followingDisabled) { + this.elementsFollowAnchor = true; + followingDisabled = false; + } + + }, + + // Distribute elements vertically + distributeVertical: function() { + // Ignore if less than 3 selected items + if (this.selectedItems.length < 3) { + return; + } + + // Order elements by position + var copyArray = this.selectedItems.slice(); + copyArray.sort( function (a, b) { + var aa = Number(a.style.top.replace("px", "")); + var bb = Number(b.style.top.replace("px", "")); + return (aa > bb ? 1 : -1); + }); + + // Calc free space between elements + var foo = copyArray.length - 1; + var minY = Number(copyArray[0].style.top.replace("px", "")); + var maxY = Number(copyArray[foo].style.top.replace("px", "")); + var space = (maxY - minY); + + for (var i = 0; i < foo; i++) { + space -= copyArray[i].clientHeight; + } + space = space / foo; + + // Disable anchor following + var followingDisabled = false; + if (this.elementsFollowAnchor) { + this.elementsFollowAnchor = false; + followingDisabled = true; + } + + // Position elements equally spaced from each other + for (var i = 1; i < foo; i++) { + var pastY = Number(copyArray[(i - 1)].style.top.replace("px", "")); + var pastHeight = Number(copyArray[(i - 1)].clientHeight); + + var newY = pastY + pastHeight + space; + copyArray[i].style.top = Math.round(newY) + "px"; + updateViewComponentLocation(copyArray[i].id); + + // Update anchor position + this.updateAnchorPosition(); + } + + // Re-enable anchor following + if (followingDisabled) { + this.elementsFollowAnchor = true; + followingDisabled = false; + } + }, + + + /** + * Main methods + */ + + + // Start alignment + start: function() { + this.startSelectionMode(); + this.enableAlignShortcuts(true); + this.preventDeleteElements(true); + this.showInterface(true); + }, + + // Stop alignment + stop: function() { + this.stopSelectionMode(); + this.enableAlignShortcuts(false); + this.enableMovingShortcuts(false); + this.enableAnchorFollowing(false); + this.preventDeleteElements(false); + this.showInterface(false); + }, + + // Restart alignment (clear selection) + restart: function() { + this.stopSelectionMode(); + this.startSelectionMode(); + }, + + // Get module settings + getSettings: function() { + ajaxGetJson("resources/fuscabr/conf/modules/align.json", function(response) { + fuscabr.align.conf = response; + fuscabr.align.init(); + }); + }, + + // Init module + init: function() { + if (!fuscabr.align.conf) { + fuscabr.align.getSettings(); + } else { + fuscabr.align.createInterface(); + //console.info("Align module loaded."); + } + } +} + +fuscabr.align.init(); diff --git a/WebContent/resources/fuscabr/modules/calendar.js b/WebContent/resources/fuscabr/modules/calendar.js new file mode 100644 index 0000000000..468ba42241 --- /dev/null +++ b/WebContent/resources/fuscabr/modules/calendar.js @@ -0,0 +1,105 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ + "use strict"; + +fuscabr.calendar = { + start: function() { + if (this.shouldCreateCalendars()) { + if (typeof flatpickr == "undefined") { + this.loadFlatpickr(); + } else { + this.localizeFlatpickr(); + this.createCalendars(); + } + } + }, + + createCalendars: function() { + // Create date-time calendars with Flatpickr library + flatpickr(".fuscabr-calendar", { enableTime: true, altInput: true, dateFormat: "d/m/Y H:i:S" }); + }, + + // Test if create calendars is needed + shouldCreateCalendars: function() { + for (var i of this.conf.rules) { + for (var j of i.pages) { + if (window.location.pathname.includes(j)) { + // Identify all calendar entries by a custom HTML class + var inputs = document.querySelectorAll(i.inputSelector); + for (var k of inputs) { + k.classList.add("fuscabr-calendar"); + } + // Return true. New calendars need to be created. + if (inputs.length) + return true; + } + } + } + + // Return false if module doesn't need to create + // new calendars + return false; + }, + + // Load Flatpickr library + loadFlatpickr: function() { + if (!this.loadStarted) { + this.loadStarted = true; + + var fpL10n = document.createElement("script"); + fpL10n.src = this.conf.flatpickrLocaleFile; + fpL10n.onload = function() { + fuscabr.calendar.start(); + }; + + var fpCss = document.createElement("link"); + fpCss.href = this.conf.flatpickrCSSFile; + fpCss.rel = "stylesheet"; + + var fp = document.createElement("script"); + fp.src = this.conf.flatpickrFile; + fp.onload = function() { + document.getElementById("fuscabr-modules").appendChild(fpL10n); + }; + + document.getElementById("fuscabr-modules").appendChild(fp); + document.getElementById("fuscabr-modules").appendChild(fpCss); + } + }, + + localizeFlatpickr: function() { + var locale = fuscabr.common.conf.language; + // Detect browser locale + if (this.conf.detectBrowserLocale) + locale = (navigator.language || navigator.userLanguage).replace(/-.*/, ""); + + // Localize flatpickr (if given locale exists) + if (flatpickr.l10ns[locale]) + flatpickr.localize(flatpickr.l10ns[locale]); + else + console.warn("Flatpickr locale not found. Using default locale (English)."); + }, + + // Get module settings + getSettings: function() { + ajaxGetJson("resources/fuscabr/conf/modules/calendar.json", function(response) { + fuscabr.calendar.conf = response; + fuscabr.calendar.init(); + }); + }, + + // Init module + init: function() { + if (!fuscabr.calendar.conf) { + fuscabr.calendar.getSettings(); + } else { + //console.info("Calendar module loaded."); + fuscabr.calendar.start(); + } + } + + } + +fuscabr.calendar.init(); diff --git a/WebContent/resources/fuscabr/modules/ceditor.js b/WebContent/resources/fuscabr/modules/ceditor.js new file mode 100644 index 0000000000..abc3a906e6 --- /dev/null +++ b/WebContent/resources/fuscabr/modules/ceditor.js @@ -0,0 +1,407 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ + "use strict"; + + fuscabr.ceditor = { + createdEditors: [], + watchdog: null, + fileCounter: [0, 0], + + + /* + * Dependency management methods + */ + + + + // Load a dependency (a Javascript or CSS file) + loadDependency: function(src, type, callback) { + var htmlTag; + if (type == "script") { + htmlTag = document.createElement("script"); + htmlTag.src = src; + } else if (type == "style") { + htmlTag = document.createElement("link"); + htmlTag.rel = "stylesheet"; + htmlTag.href = src; + } + + if (callback) + htmlTag.addEventListener("load", callback); + + document.getElementById("fuscabr-modules").appendChild(htmlTag); + }, + + // Load CodeMirror main script, and call start() function + loadCodeMirror: function() { + var conf = this.conf; + this.loadDependency(conf.baseFolder + "codemirror.css", "style"); + if (conf.theme != "codemirror.css" && conf.theme != "default") + this.loadDependency(conf.themesFolder + conf.theme, "style"); + + this.loadDependency(conf.baseFolder + "codemirror.min.js", "script", fuscabr.ceditor.start); + }, + + // Load all CodeMirror dependencies for the given language + loadLanguage: function(language, callback) { + var modesFolder = this.conf.modesFolder; + var addonsFolder = this.conf.addonsFolder; + var scriptSrc = []; + + // Define the files needed to each programming language mode + if (language == "html") { + // Addons + scriptSrc.push(addonsFolder + "fold/xml-fold.js"); + scriptSrc.push(addonsFolder + "edit/closebrackets.js"); + scriptSrc.push(addonsFolder + "edit/closetag.js"); + scriptSrc.push(addonsFolder + "edit/matchbrackets.js"); + // Languages + scriptSrc.push(modesFolder + "xml/xml.js"); + scriptSrc.push(modesFolder + "javascript/javascript.js"); + scriptSrc.push(modesFolder + "css/css.js"); + scriptSrc.push(modesFolder + "htmlmixed/htmlmixed.js"); + } else if (language == "javascript" || language == "json") { + // Addons + scriptSrc.push(addonsFolder + "edit/closebrackets.js"); + scriptSrc.push(addonsFolder + "edit/matchbrackets.js"); + // Languages + scriptSrc.push(modesFolder + "javascript/javascript.js"); + } else if (language == "sql") { + // Addons + scriptSrc.push(addonsFolder + "edit/closebrackets.js"); + scriptSrc.push(addonsFolder + "edit/matchbrackets.js"); + // Languages + scriptSrc.push(modesFolder + "sql/sql.js"); + } + + + // Load the files (if not already loaded) + var notLoadedScripts = []; + for (var i = 0; i < scriptSrc.length; i++) { + if (!document.querySelector("#fuscabr-modules script[src*='" + scriptSrc[i] + "']")) { + notLoadedScripts.push(scriptSrc[i]); + } + } + + if (notLoadedScripts.length) { + for (var i of notLoadedScripts) { + var index = fuscabr.ceditor.fileCounter[0] > 0 ? 1 : 0; + this.loadDependency(i, "script", function() { + fuscabr.ceditor.loadLanguageCb(notLoadedScripts.length, index, callback); + }); + } + } else { + setTimeout(callback, 200); + } + }, + + loadLanguageCb: function(counter, index, callback) { + fuscabr.ceditor.fileCounter[index]++; + + if (counter == fuscabr.ceditor.fileCounter[index]) { + fuscabr.ceditor.fileCounter[index] = 0; + callback(); + } + }, + + + /* + * Runtime methods + */ + + + + // Update all editors with the respective textareas content + updateEditors: function() { + for (var cm of fuscabr.ceditor.createdEditors) + cm.setValue(cm.getTextArea().value); + }, + + // Update all textareas with the respective editors content + updateTextAreas: function() { + for (var cm of fuscabr.ceditor.createdEditors) + cm.save(); + }, + + // Watchdog to update editors (general use) + generalWatchdog: function(targetElement) { + var element = document.querySelector(targetElement); + this.watchdog = element.value; + + // Detect if the value of the given has changed + setInterval(function() { + if (fuscabr.ceditor.watchdog != document.querySelector(targetElement).value) { + fuscabr.ceditor.watchdog = document.querySelector(targetElement).value; + fuscabr.ceditor.updateEditors(); + } + }, this.conf.watchdogInterval); + }, + + // Watchdog to update editors (used in Import/Export page) + emportWatchdog: function(targetElement) { + var element = document.querySelector(targetElement); + + // Detect if the element is enabled (input property "disabled") + var watchdogFunc = function() { + if (!element.disabled) { + fuscabr.ceditor.updateEditors(); + clearInterval(fuscabr.ceditor.watchdog); + } + } + + this.watchdog = setInterval(watchdogFunc, this.conf.watchdogInterval); + }, + + // Watchdog to update editors (used in View Edit page) + viewEditWatchdog: function(targetElement) { + var element = document.querySelector(targetElement); + + // Detect if the element is hiden (CSS property "display") + var watchdogFunc = function() { + if (element.style.display != "none") { + fuscabr.ceditor.updateEditors(); + clearInterval(fuscabr.ceditor.watchdog); + } + } + + this.watchdog = setInterval(watchdogFunc, this.conf.watchdogInterval); + }, + + + + /* + * Initialization methods + */ + + + + // Create a new CodeMirror editor instance + createEditor: function(textAreaSelector, mode, pageRef) { + var textArea = document.querySelector(textAreaSelector); + var editorConf = { lineNumbers: true, indentUnit: 4 }; + + // Define editor's theme + if (this.conf.theme != "default" && this.conf.theme != "codemirror.css") + editorConf.theme = this.conf.theme.replace(".css", ""); + + // General Addons + editorConf.autoCloseBrackets = true; + editorConf.matchBrackets = true; + + // Define editor's programming language + if (mode == "html" || mode == "htmlmixed") { + editorConf.mode = "htmlmixed"; + // Addons + editorConf.autoCloseTags = true; + } else if (mode == "javascript" || mode == "json") { + editorConf.mode = { name: "javascript" }; + editorConf.mode.json = (mode == "json") ? true : false; + } else if (mode == "sql") { + editorConf.mode = "sql"; + } + + var cm = CodeMirror.fromTextArea(textArea, editorConf); + + // Define editor's size + var size = this.conf.editorSize; + if (size[pageRef]) + cm.setSize(size[pageRef].width, size[pageRef].height); + else + cm.setSize(size.default.width, size.default.height); + cm.refresh(); + + this.createdEditors.push(cm); + }, + + // Create event listeners + createListener: function(selector, eventType, funcObj, catchParent) { + var element = document.querySelector(selector); + + if (catchParent) + element = element.parentElement; + + if (element) + element.addEventListener(eventType, funcObj, true); + }, + + // Apply a custom CSS to CodeMirror instances + createCustomCSS: function() { + var stylesheet = document.createElement("style"); + stylesheet.innerHTML = ".CodeMirror { border: 1px solid " + this.conf.editorBorderColor + ";" + stylesheet.innerHTML += "font-size: " + this.conf.editorFontSize + "}"; + + document.getElementById("fuscabr-modules").appendChild(stylesheet); + }, + + // Main function, detect current page and create editors + start: function() { + var pageUrl = window.location.href; + var ceditor = fuscabr.ceditor; + ceditor.createCustomCSS(); + + if (pageUrl.includes("sql.shtm")) { + // SQL page + + // Editor + ceditor.loadLanguage("sql", function(){ + ceditor.createEditor("#sqlString", "sql", "sql.shtm"); + }); + + } else if (pageUrl.includes("emport.shtm")) { + // Import/Export page + + // Editor + ceditor.loadLanguage("json", function() { + ceditor.createEditor("#emportData", "json", "emport.shtm"); + }); + // Listeners and watchdog + ceditor.createListener("#exportJsonBtn", "click", function() { + ceditor.emportWatchdog("#exportJsonBtn"); + }); + ceditor.createListener("#importJsonBtn", "click", ceditor.updateTextAreas); + + } else if (pageUrl.includes("point_links.shtm")) { + // Point link page + + // Editor + ceditor.loadLanguage("javascript", function() { + ceditor.createEditor("#script", "javascript", "point_links.shtm"); + }); + // Watchdog + ceditor.generalWatchdog("#xid"); + // Listeners + ceditor.createListener("img[onclick*='savePointLink()']", "click", ceditor.updateTextAreas, true); + ceditor.createListener("img[onclick*='validateScript()']", "click", ceditor.updateTextAreas, true); + + } else if (pageUrl.includes("compound_events.shtm")) { + // Compound events page + + // Editor + ceditor.loadLanguage("javascript", function() { + ceditor.createEditor("#condition", "javascript", "compound_events.shtm"); + }); + // Watchdog + ceditor.generalWatchdog("#xid"); + // Listeners + ceditor.createListener("img[onclick*='saveCompoundEvent()']", "click", ceditor.updateTextAreas, true); + ceditor.createListener("img[onclick*='validate()']", "click", ceditor.updateTextAreas, true); + // Re-asign insertText() function + insertText = function(text) { + ceditor.createdEditors[0].replaceSelection(text); + }; + + } else if (pageUrl.includes("scripting.shtm")) { + // Scripting page + + // Editor + ceditor.loadLanguage("javascript", function() { + ceditor.createEditor("#script", "javascript", "scripting.shtm"); + }); + // Watchdog + ceditor.generalWatchdog("#xid"); + // Listeners + ceditor.createListener("#executeScriptImg", "click", ceditor.updateTextAreas, true); + ceditor.createListener("img[onclick*='saveScript()']", "click", ceditor.updateTextAreas, true); + + } else if (pageUrl.includes("view_edit.shtm")) { + // Graphic View Edit page + + // Editors + ceditor.loadLanguage("javascript", function() { + ceditor.createEditor("#graphicRendererScriptScript", "javascript", "view_edit.shtm"); + }); + ceditor.loadLanguage("html", function() { + ceditor.createEditor("#staticPointContent", "html", "view_edit.shtm"); + }); + // Listeners + ceditor.createListener("#graphicRendererScriptScript", "change", ceditor.updateEditors); + ceditor.createListener("#staticPointContent", "change", ceditor.updateEditors); + ceditor.createListener("#graphicRendererEditorPopup .fuscabr-csnippet-apply", "click", ceditor.updateEditors); + ceditor.createListener("#htmlEditor .fuscabr-csnippet-apply", "click", ceditor.updateEditors); + ceditor.createListener("img[onclick*='staticEditor.save()']", "click", ceditor.updateTextAreas, true); + ceditor.createListener("img[onclick*='graphicRendererEditor.save()']", "click", ceditor.updateTextAreas, true); + // Re-asign functions, adding the watchdog + openStaticEditor = function(cid) { + closeEditors(); + fuscabr.ceditor.viewEditWatchdog("#staticEditorPopup"); + staticEditor.open(cid); + } + openGraphicRendererEditor = function(cid) { + closeEditors(); + fuscabr.ceditor.viewEditWatchdog("#graphicRendererEditorPopup"); + graphicRendererEditor.open(cid); + } + + } else if (pageUrl.includes("data_source_edit.shtm")) { + // Data sources + if (document.getElementById("webcamLiveFeedCode")) { + // HTTP Image data source + + // Editor + ceditor.loadLanguage("html", function() { + ceditor.createEditor("#webcamLiveFeedCode", "html", "httpimage_ds"); + }); + // Watchdog + ceditor.generalWatchdog("#xid"); + // Listener + ceditor.createListener("img[onclick*='savePoint()']", "click", ceditor.updateTextAreas, true); + + } else if (document.getElementById("script")) { + // Meta data source + + //Editor + ceditor.loadLanguage("javascript", function() { + ceditor.createEditor("#script", "javascript", "meta_ds"); + }); + // Watchdog + ceditor.generalWatchdog("#xid"); + // Listeners + ceditor.createListener("img[onclick*='validateScript()']", "click", ceditor.updateTextAreas, true); + ceditor.createListener("img[onclick*='savePoint()']", "click", ceditor.updateTextAreas, true); + + } else if (document.getElementById("selectStatement")) { + // SQL data source + + // Editors + ceditor.loadLanguage("sql", function() { + ceditor.createEditor("#selectStatement", "sql", "sql_ds_1"); + }); + ceditor.loadLanguage("sql", function() { + ceditor.createEditor("textarea[name='updateStatement']", "sql", "sql_ds_2"); + }); + // Watchdog + ceditor.generalWatchdog("#xid"); + // Listeners + ceditor.createListener("#sqlTestBtn", "click", ceditor.updateTextAreas, true); + ceditor.createListener("img[onclick*='saveDataSource()']", "click", ceditor.updateTextAreas, true); + ceditor.createListener("img[onclick*='savePoint()']", "click", ceditor.updateTextAreas, true); + + } else { + // Other data source type. Do nothing + //console.log("Hello!"); + } + } + }, + + // Get module settings + getSettings: function() { + ajaxGetJson("resources/fuscabr/conf/modules/ceditor.json", function(response) { + fuscabr.ceditor.conf = response; + fuscabr.ceditor.init(); + }); + }, + + // Init module + init: function() { + if (!fuscabr.ceditor.conf) { + fuscabr.ceditor.getSettings(); + } else { + //console.info("Code Editor module loaded."); + fuscabr.ceditor.loadCodeMirror(); + } + } + } + +fuscabr.ceditor.init(); diff --git a/WebContent/resources/fuscabr/modules/chart.js b/WebContent/resources/fuscabr/modules/chart.js new file mode 100644 index 0000000000..0557ab452b --- /dev/null +++ b/WebContent/resources/fuscabr/modules/chart.js @@ -0,0 +1,326 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ + "use strict"; + +fuscabr.chart = { + createdCharts: [], + + // Main loop + loop: function() { + // Create new charts, if needed + var inputData = document.querySelectorAll("div:not(.fuscabr-chart-container) > div > input.fuscabr-chart-data"); + cont = inputData.length; + for (var i = 0; i < cont; i++) { + fuscabr.chart.createNewCharts(inputData[i]); + } + + // Update already created charts + var cont = fuscabr.chart.createdCharts.length; + for (var i = 0; i < cont; i++) { + var err = fuscabr.chart.updateCharts(fuscabr.chart.createdCharts[i]); + if (err == -1) { + fuscabr.chart.createdCharts.splice(i, 1); + } + } + + }, + + // Create new charts + createNewCharts: function(element) { + // Load Chart.js if not present + if (typeof Chart == "undefined") { + this.loadChartJs(); + return; + } + + // Create HTML elements and get chart data + var formatedData = this.formatData(element.value); + var container = element.parentElement.parentElement; + var conf = formatedData[0]; + var newCanvas = document.createElement("canvas"); + var newDiv = document.createElement("div"); + + // Get time format options for time-based charts + var timeOptions = this.conf.timeOptions; + + // Add elements to the page structure + newCanvas.classList.add("fuscabr-chart-canvas"); + newDiv.style = "position: relative; height: " + conf.height + "px; width: " + conf.width + "px;"; + newDiv.appendChild(newCanvas); + container.appendChild(newDiv); + container.classList.add("fuscabr-chart-container"); + + // Create a chart + var ctx = newCanvas.getContext("2d"); + var chart = new Chart(ctx, { + type: conf.type, + data: conf.data + }); + chart.options.elements.line.tension = 0; + chart.options.maintainAspectRatio = false; + + // Adjust chart parameters + if (conf.beginAtZero == true) { + chart.options.scales.yAxes[0].ticks.beginAtZero = true; + } + if (conf.animations == false) { + chart.options.animation.duration = 0; + } + if (conf.timeBased == true) { + chart.options.scales.xAxes[0].type = "time"; + chart.options.scales.xAxes[0].time = timeOptions; + } else { + chart.options.scales.xAxes[0].ticks.display = false; + chart.options.scales.xAxes[0].gridLines.drawTicks = false; + } + if (conf.showTitle == true) { + chart.options.title.display = true; + chart.options.title.text = conf.title; + } + + if (this.conf.enableDatapointWarnings) { + this.invalidDatapointWarning(container, formatedData[1]); + } + + // Update chart and save it in "createdCharts" array + chart.update(); + fuscabr.chart.createdCharts.push(chart); + }, + + // Update already created charts + updateCharts: function(element) { + var container = element.canvas.parentElement.parentElement; + var formatedData = new Array(); + var conf = {}; + // Destroy chart if server script goes missing + try { + formatedData = this.formatData(container.querySelector(".fuscabr-chart-data").value); + conf = formatedData[0]; + } catch { + fuscabr.chart.destroyChart(element); + return -1; + } + + // Destroy chart if chart type changes (to recreate it later) + if (element.config.type != conf.type) { + fuscabr.chart.destroyChart(element); + return -1; + } + + // Destroy chart if scale type changes (to recreate it later) + if (element.options.scales.xAxes[0]) { + var isTimeInChart = element.options.scales.xAxes[0].type == "time"; + var isTimeInConf = conf.timeBased; + if (isTimeInChart != isTimeInConf) { + fuscabr.chart.destroyChart(element); + return -1; + } + } + + // Destroy chart if more series are added + if (element.data.datasets.length != conf.data.datasets.length) { + fuscabr.chart.destroyChart(element); + return -1; + } + + // Update chart height/width + element.canvas.parentElement.style.height = conf.height + "px"; + element.canvas.parentElement.style.width = conf.width + "px"; + + // Update chart parameters + var changed = false; + var foo = element.options.scales.yAxes[0].ticks.beginAtZero; + if (foo != conf.beginAtZero) { + element.options.scales.yAxes[0].ticks.beginAtZero = conf.beginAtZero; + changed = true; + } + foo = (element.options.animation.duration > 0); + if (foo != conf.animations) { + element.options.animation.duration = (conf.animations == true) ? 1000 : 0; + changed = true; + } + foo = element.options.title; + if (foo.display != conf.showTitle || foo.text != conf.title) { + element.options.title.display = conf.showTitle; + element.options.title.text = conf.title; + changed = true; + } + + // Update numeric chart data + var size = conf.data.datasets.length; + for (var i = 0; i < size; i++) { + var chartData = element.data.datasets[i].data; + var newData = conf.data.datasets[i].data; + if (JSON.stringify(chartData) != JSON.stringify(newData)) { + element.data.datasets[i].data = newData; + changed = true; + } + + chartData = element.data.datasets[i].label; + newData = conf.data.datasets[i].label; + if (chartData != newData) { + element.data.datasets[i].label = newData; + changed = true; + } + + chartData = element.data.datasets[i].backgroundColor; + newData = conf.data.datasets[i].backgroundColor; + if (chartData != newData) { + element.data.datasets[i].backgroundColor = newData; + changed = true; + } + + chartData = element.data.datasets[i].borderColor; + newData = conf.data.datasets[i].borderColor; + if (chartData != newData) { + element.data.datasets[i].borderColor = newData; + changed = true; + } + } + + if (this.conf.enableDatapointWarnings) { + this.invalidDatapointWarning(container, formatedData[1]); + } + + // Redraw chart if there are changes + if (changed == true) { + element.update(); + } + + }, + + // Destroy charts when needed + destroyChart: function(element) { + // Get chart parents + var parent = element.canvas.parentElement; + var container = parent.parentElement; + + // Destroy chart an its parents + container.classList.remove("fuscabr-chart-container"); + element.destroy(); + parent.remove(); + }, + + // Create an warning about incompatible data recieved + invalidDatapointWarning: function(container, message) { + if (!container.querySelector(".fuscabr-chart-warning")) { + var warn = document.createElement("span"); + warn.className = "fuscabr-chart-warning"; + warn.innerHTML = message; + container.appendChild(warn); + } else { + container.querySelector(".fuscabr-chart-warning").innerHTML = message; + } + }, + + // Format data recieved + formatData: function(dataStr) { + var dataObj = JSON.parse(dataStr); + + var returnArr = [ {}, "" ]; + returnArr[0] = dataObj; + + for (var i in returnArr[0].data.datasets) { + var dataset = returnArr[0].data.datasets[i]; + + if (dataset.backgroundColor == "undefined") + returnArr[0].data.datasets[i].backgroundColor = this.conf.fallbackBackgroundColor; + + if (dataset.borderColor == "undefined") + returnArr[0].data.datasets[i].borderColor = this.conf.fallbackBorderColor; + + // No data for datapoint + if (dataset.data.length == 0) + continue; + + if (returnArr[0].timeBased) { + var foo = String(dataset.data[0].y); + + if (isNaN(parseFloat(foo)) == false) { + // Numeric dataset, ignore + continue; + } else if (foo == "false" || foo == "true") { + // Binary dataset, convert to numeric + for (var i of returnArr[0].data.datasets[i].data) { + if (String(i.y) == "true") + i.y = 1; + else + i.y = 0; + } + continue; + } else { + // Alphanumeric dataset, remove from response + returnArr[0].data.datasets.splice(i, 1); + + // Create an warning, if enabled + if (this.conf.enableDatapointWarnings) + returnArr[1] += """ + dataset.label + "" is not a numeric or binary datapoint
"; + } + + } else { + var foo = String(dataset.data[0]); + + if (isNaN(parseFloat(foo)) == false) { + // Numeric dataset, ignore + continue; + } else if (foo == "false" || foo == "true") { + // Binary dataset, convert to numeric + for (var i of returnArr[0].data.datasets[i].data) { + if (String(i) == "true") + i = 1; + else + i = 0; + } + continue; + } else { + // Alphanumeric dataset, remove from response + returnArr[0].data.datasets.splice(i, 1); + + // Create an warning, if enabled + if (this.conf.enableDatapointWarnings) + returnArr[1] += """ + dataset.label + "" is not a numeric or binary datapoint
"; + } + + } + + }; + return returnArr; + }, + + // Load Chart.js script + loadChartJs: function() { + if (!document.getElementById("fuscabr-chartjs")) { + var chartJs = document.createElement("script"); + chartJs.src = this.conf.chartJsFile; + chartJs.id = "fuscabr-chartjs"; + chartJs.onload = fuscabr.chart.loop; + + document.getElementById("fuscabr-modules").appendChild(chartJs); + } + }, + + // Get module settings + getSettings: function() { + ajaxGetJson("resources/fuscabr/conf/modules/chart.json", function(response) { + fuscabr.chart.conf = response; + fuscabr.chart.init(); + }); + }, + + // Init module + init: function() { + if (!fuscabr.chart.conf) { + fuscabr.chart.getSettings(); + } else { + //console.info("Chart module loaded."); + fuscabr.chart.loop(); + setInterval(function() { + fuscabr.chart.loop.call(fuscabr.chart); + }, fuscabr.chart.conf.refreshTime); + } + } +} + +fuscabr.chart.init(); diff --git a/WebContent/resources/fuscabr/modules/csnippet.js b/WebContent/resources/fuscabr/modules/csnippet.js new file mode 100644 index 0000000000..1f208a1096 --- /dev/null +++ b/WebContent/resources/fuscabr/modules/csnippet.js @@ -0,0 +1,157 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ +"use strict"; + +fuscabr.csnippet = { + loadHtmlTemplate: function() { + var conf = fuscabr.csnippet.conf; + var select = document.getElementById("fuscabr-csnippet-html-select"); + var selectedOption = select[select.selectedIndex].value; + select.disabled = true; + + var changeEvent = new Event("change"); + var textarea = document.getElementById("staticPointContent"); + + ajaxGet(conf.htmlTemplatesFolder + selectedOption, function(response) { + textarea.value = response; + textarea.dispatchEvent(changeEvent); + select.disabled = false; + }, conf.templatesLoadTimeout, function() { + textarea.value = ""; + textarea.dispatchEvent(changeEvent); + select.disabled = false; + }, function() { + textarea.value = ""; + textarea.dispatchEvent(changeEvent); + select.disabled = false; + }); + }, + + loadServerScriptTemplate: function() { + var conf = fuscabr.csnippet.conf; + var select = document.getElementById("fuscabr-csnippet-script-select"); + var selectedOption = select[select.selectedIndex].value; + select.disabled = true; + + var changeEvent = new Event("change"); + var textarea = document.getElementById("graphicRendererScriptScript"); + + ajaxGet(conf.serverScriptTemplatesFolder + selectedOption, function(response) { + textarea.value = response; + textarea.dispatchEvent(changeEvent); + select.disabled = false; + }, conf.templatesLoadTimeout, function() { + textarea.value = "/* Connection Timeout, please try again */"; + textarea.dispatchEvent(changeEvent); + select.disabled = false; + }, function() { + textarea.value = "/* Error! Template file not found. */"; + textarea.dispatchEvent(changeEvent); + select.disabled = false; + }); + }, + + createHtmlInterface: function() { + ajaxGet("resources/fuscabr/templates/internal/codeSnippetDiv.html", function(response) { + var newHtml = response.replace("TEMPLATE", "html"); + + var editor = document.getElementById("htmlEditor"); + editor.innerHTML = newHtml + editor.innerHTML; + editor.querySelector("img").addEventListener("click", fuscabr.csnippet.loadHtmlTemplate); + + var localizable = editor.querySelectorAll("*[data-i18n]"); + for (var i of localizable) { + var message = i.getAttribute("data-i18n"); + if (fuscabr.common.i18n.csnippet[message]) + localizeElement(i, fuscabr.common.i18n.csnippet[message]); + } + + var optionsArr = new Array(); + optionsArr.push(document.createElement("option")); + for (var i of fuscabr.csnippet.conf.htmlTemplates) { + var option = document.createElement("option"); + option.value = i.file; + option.innerHTML = fuscabr.common.i18n.csnippet[i.i18n] || i.desc; + optionsArr.push(option); + } + optionsArr.sort(function(a, b) { + return (a.innerHTML.localeCompare(b.innerHTML)); + }); + + var fragment = document.createDocumentFragment(); + for (var i in optionsArr) + fragment.appendChild(optionsArr[i]); + + document.getElementById("fuscabr-csnippet-html-select").appendChild(fragment); + document.querySelector("#staticEditorPopup td[align='right']").addEventListener("click", fuscabr.csnippet.resetSelectedTemplates, true); + + }); + }, + + createServerScriptInterface: function() { + ajaxGet("resources/fuscabr/templates/internal/codeSnippetDiv.html", function(response) { + var newHtml = response.replace("TEMPLATE", "script"); + + var editor = document.getElementById("graphicRenderer_script"); + editor.innerHTML = editor.innerHTML.replace("
", newHtml); + editor.querySelector("img").addEventListener("click", fuscabr.csnippet.loadServerScriptTemplate); + + var localizable = editor.querySelectorAll("*[data-i18n]"); + for (var i of localizable) { + var message = i.getAttribute("data-i18n"); + if (fuscabr.common.i18n.csnippet[message]) + localizeElement(i, fuscabr.common.i18n.csnippet[message]); + } + + var optionsArr = new Array(); + optionsArr.push(document.createElement("option")); + for (var i of fuscabr.csnippet.conf.serverScriptTemplates) { + var option = document.createElement("option"); + option.value = i.file; + option.innerHTML = fuscabr.common.i18n.csnippet[i.i18n] || i.desc; + optionsArr.push(option); + } + optionsArr.sort(function(a, b) { + return (a.innerHTML.localeCompare(b.innerHTML)); + }); + + var fragment = document.createDocumentFragment(); + for (var i in optionsArr) + fragment.appendChild(optionsArr[i]); + + document.getElementById("fuscabr-csnippet-script-select").appendChild(fragment); + document.querySelector("#graphicRendererEditorPopup td[align='right']").addEventListener("click", fuscabr.csnippet.resetSelectedTemplates, true); + + }); + }, + + resetSelectedTemplates: function() { + var htmlSelect = document.getElementById("fuscabr-csnippet-html-select"); + var scriptSelect = document.getElementById("fuscabr-csnippet-script-select"); + htmlSelect.selectedIndex = 0; + scriptSelect.selectedIndex = 0; + }, + + // Get module settings + getSettings: function() { + ajaxGetJson("resources/fuscabr/conf/modules/csnippet.json", function(response) { + fuscabr.csnippet.conf = response; + fuscabr.csnippet.init(); + }); + }, + + // Init module + init: function() { + if (!fuscabr.csnippet.conf) { + fuscabr.csnippet.getSettings(); + } else { + //console.info("Code Snippet module loaded."); + fuscabr.csnippet.createHtmlInterface(); + fuscabr.csnippet.createServerScriptInterface(); + } + } + } + +fuscabr.csnippet.init(); diff --git a/WebContent/resources/fuscabr/modules/fixes.js b/WebContent/resources/fuscabr/modules/fixes.js new file mode 100644 index 0000000000..d49fc17e29 --- /dev/null +++ b/WebContent/resources/fuscabr/modules/fixes.js @@ -0,0 +1,68 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ + "use strict"; + +fuscabr.fixes = { + // Prevent the Graphic View from being accidentally deleted + preventAccidentalViewDeleting: function() { + var btnDelete = document.querySelector("input[name='delete']"); + btnDelete.type = "button"; + btnDelete.name = "delete-disabled"; + btnDelete.addEventListener("click", fuscabr.fixes.deleteView); + }, + + // Delete the Graphical View after confirmation + deleteView: function() { + if (window.confirm("WARNING! \nYou are about to DELETE this Graphical View! \n\nContinue?")) { + var viewForm = document.querySelector("form[name='view']"); + var hiddenInput = document.createElement("input"); + hiddenInput.type = "hidden"; + hiddenInput.name = "delete"; + hiddenInput.value = "Apagar"; + viewForm.appendChild(hiddenInput); + viewForm.submit(); + } + }, + + // Change ScadaBR's "positionEditor()" function + changePositionEditor: function() { + var positionEditor_backup = positionEditor; + positionEditor = this.positionEditor; + }, + + // Alternative function for the standard "positionEditor()" + positionEditor: function (compId, editorId) { + // (FUScaBR) + // Position and display the renderer editor. + var pDim = getNodeBounds($("c"+ compId)); + var editDiv = document.getElementById(editorId); + editDiv.style.left = (pDim.x + 20) + "px"; + editDiv.style.top = (pDim.y + 10) + "px"; + }, + + // Get module settings + getSettings: function() { + ajaxGetJson("resources/fuscabr/conf/modules/fixes.json", function(response) { + fuscabr.fixes.conf = response; + fuscabr.fixes.init(); + }); + }, + + // Init module + init: function() { + if (!fuscabr.fixes.conf) { + fuscabr.fixes.getSettings(); + } else { + //console.info("Fixes module loaded."); + if (fuscabr.fixes.conf.enablePreventViewDeleting) + fuscabr.fixes.preventAccidentalViewDeleting(); + + if (fuscabr.fixes.conf.enableChangePositionEditor) + fuscabr.fixes.changePositionEditor(); + } + } +} + +fuscabr.fixes.init(); diff --git a/WebContent/resources/fuscabr/modules/minified/align.js b/WebContent/resources/fuscabr/modules/minified/align.js new file mode 100755 index 0000000000..bd53ac1470 --- /dev/null +++ b/WebContent/resources/fuscabr/modules/minified/align.js @@ -0,0 +1,5 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ +"use strict";fuscabr.align={selectedItems:[],lastAnchorPosition:{},currentAnchorPosition:{},elementsFollowAnchor:!1,createInterface:function(){if(!document.getElementById("fuscabr-align")){var e=document.createElement("div");e.id="fuscabr-align",e.className="borderDiv",ajaxGet("resources/fuscabr/templates/internal/alignDiv.html",function(t){e.innerHTML=t,document.getElementById("viewContent").parentElement.parentElement.appendChild(e),fuscabr.align.localizeInterface()})}},showInterface:function(e){e?(document.getElementById("fuscabr-align-start-stop").value=fuscabr.common.i18n.align.stop_alignment,document.getElementById("fuscabr-align-start-stop").setAttribute("onclick","fuscabr.align.stop()"),document.getElementById("fuscabr-align-controls").style.display=""):(document.getElementById("fuscabr-align-start-stop").value=fuscabr.common.i18n.align.start_alignment,document.getElementById("fuscabr-align-start-stop").setAttribute("onclick","fuscabr.align.start()"),document.getElementById("fuscabr-align-controls").style.display="none")},localizeInterface:function(){var e=document.querySelectorAll("#fuscabr-align *[data-i18n]");for(var t of e){var n=t.getAttribute("data-i18n");fuscabr.common.i18n.align[n]&&localizeElement(t,fuscabr.common.i18n.align[n])}},preventDeleteElements:function(e){e?(this.deleteViewComponentBackup=deleteViewComponent,deleteViewComponent=function(){alert(fuscabr.common.i18n.align.cannot_delete_components)}):(deleteViewComponent=this.deleteViewComponentBackup,this.deleteViewComponentBackup=null)},startSelectionMode:function(){if(!document.getElementById("fuscabr-update-trigger")){var e=document.querySelector("img[onclick='addViewComponent()']");e.addEventListener("click",fuscabr.align.updateSelectionMode),e.id="fuscabr-update-trigger"}var t=document.querySelectorAll("#viewContent > div:not(.fuscabr-align):not(.windowDiv)");for(var n of t){this.hoverResponsivity(n,!0),n.classList.add("fuscabr-align");var o=document.createElement("div");o.classList.add("fuscabr-align-preventclick"),o.style="position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;",n.appendChild(o)}},stopSelectionMode:function(){var e=document.getElementById("fuscabr-update-trigger");e.removeEventListener("click",fuscabr.align.updateSelectionMode),e.id="";var t=document.querySelectorAll("#viewContent > div.fuscabr-align");for(var n of t)this.hoverResponsivity(n,!1),n.classList.remove("fuscabr-align"),n.querySelector(".fuscabr-align-preventclick").remove();for(var o=0;oNumber(t.style.left.replace("px",""))?1:-1});for(var t=e.length-1,n=Number(e[0].style.left.replace("px","")),o=Number(e[t].style.left.replace("px",""))-n,r=0;rNumber(t.style.top.replace("px",""))?1:-1});for(var t=e.length-1,n=Number(e[0].style.top.replace("px","")),o=Number(e[t].style.top.replace("px",""))-n,r=0;r0?1:0;this.loadDependency(o,"script",function(){fuscabr.ceditor.loadLanguageCb(i.length,s,t)})}else setTimeout(t,200)},loadLanguageCb:function(e,t,c){fuscabr.ceditor.fileCounter[t]++,e==fuscabr.ceditor.fileCounter[t]&&(fuscabr.ceditor.fileCounter[t]=0,c())},updateEditors:function(){for(var e of fuscabr.ceditor.createdEditors)e.setValue(e.getTextArea().value)},updateTextAreas:function(){for(var e of fuscabr.ceditor.createdEditors)e.save()},generalWatchdog:function(e){var t=document.querySelector(e);this.watchdog=t.value,setInterval(function(){fuscabr.ceditor.watchdog!=document.querySelector(e).value&&(fuscabr.ceditor.watchdog=document.querySelector(e).value,fuscabr.ceditor.updateEditors())},this.conf.watchdogInterval)},emportWatchdog:function(e){var t=document.querySelector(e);this.watchdog=setInterval(function(){t.disabled||(fuscabr.ceditor.updateEditors(),clearInterval(fuscabr.ceditor.watchdog))},this.conf.watchdogInterval)},viewEditWatchdog:function(e){var t=document.querySelector(e);this.watchdog=setInterval(function(){"none"!=t.style.display&&(fuscabr.ceditor.updateEditors(),clearInterval(fuscabr.ceditor.watchdog))},this.conf.watchdogInterval)},createEditor:function(e,t,c){var r=document.querySelector(e),a={lineNumbers:!0,indentUnit:4};"default"!=this.conf.theme&&"codemirror.css"!=this.conf.theme&&(a.theme=this.conf.theme.replace(".css","")),a.autoCloseBrackets=!0,a.matchBrackets=!0,"html"==t||"htmlmixed"==t?(a.mode="htmlmixed",a.autoCloseTags=!0):"javascript"==t||"json"==t?(a.mode={name:"javascript"},a.mode.json="json"==t):"sql"==t&&(a.mode="sql");var i=CodeMirror.fromTextArea(r,a),o=this.conf.editorSize;o[c]?i.setSize(o[c].width,o[c].height):i.setSize(o.default.width,o.default.height),i.refresh(),this.createdEditors.push(i)},createListener:function(e,t,c,r){var a=document.querySelector(e);r&&(a=a.parentElement),a&&a.addEventListener(t,c,!0)},createCustomCSS:function(){var e=document.createElement("style");e.innerHTML=".CodeMirror { border: 1px solid "+this.conf.editorBorderColor+";",e.innerHTML+="font-size: "+this.conf.editorFontSize+"}",document.getElementById("fuscabr-modules").appendChild(e)},start:function(){var e=window.location.href,t=fuscabr.ceditor;t.createCustomCSS(),e.includes("sql.shtm")?t.loadLanguage("sql",function(){t.createEditor("#sqlString","sql","sql.shtm")}):e.includes("emport.shtm")?(t.loadLanguage("json",function(){t.createEditor("#emportData","json","emport.shtm")}),t.createListener("#exportJsonBtn","click",function(){t.emportWatchdog("#exportJsonBtn")}),t.createListener("#importJsonBtn","click",t.updateTextAreas)):e.includes("point_links.shtm")?(t.loadLanguage("javascript",function(){t.createEditor("#script","javascript","point_links.shtm")}),t.generalWatchdog("#xid"),t.createListener("img[onclick*='savePointLink()']","click",t.updateTextAreas,!0),t.createListener("img[onclick*='validateScript()']","click",t.updateTextAreas,!0)):e.includes("compound_events.shtm")?(t.loadLanguage("javascript",function(){t.createEditor("#condition","javascript","compound_events.shtm")}),t.generalWatchdog("#xid"),t.createListener("img[onclick*='saveCompoundEvent()']","click",t.updateTextAreas,!0),t.createListener("img[onclick*='validate()']","click",t.updateTextAreas,!0),insertText=function(e){t.createdEditors[0].replaceSelection(e)}):e.includes("scripting.shtm")?(t.loadLanguage("javascript",function(){t.createEditor("#script","javascript","scripting.shtm")}),t.generalWatchdog("#xid"),t.createListener("#executeScriptImg","click",t.updateTextAreas,!0),t.createListener("img[onclick*='saveScript()']","click",t.updateTextAreas,!0)):e.includes("view_edit.shtm")?(t.loadLanguage("javascript",function(){t.createEditor("#graphicRendererScriptScript","javascript","view_edit.shtm")}),t.loadLanguage("html",function(){t.createEditor("#staticPointContent","html","view_edit.shtm")}),t.createListener("#graphicRendererScriptScript","change",t.updateEditors),t.createListener("#staticPointContent","change",t.updateEditors),t.createListener("#graphicRendererEditorPopup .fuscabr-csnippet-apply","click",t.updateEditors),t.createListener("#htmlEditor .fuscabr-csnippet-apply","click",t.updateEditors),t.createListener("img[onclick*='staticEditor.save()']","click",t.updateTextAreas,!0),t.createListener("img[onclick*='graphicRendererEditor.save()']","click",t.updateTextAreas,!0),openStaticEditor=function(e){closeEditors(),fuscabr.ceditor.viewEditWatchdog("#staticEditorPopup"),staticEditor.open(e)},openGraphicRendererEditor=function(e){closeEditors(),fuscabr.ceditor.viewEditWatchdog("#graphicRendererEditorPopup"),graphicRendererEditor.open(e)}):e.includes("data_source_edit.shtm")&&(document.getElementById("webcamLiveFeedCode")?(t.loadLanguage("html",function(){t.createEditor("#webcamLiveFeedCode","html","httpimage_ds")}),t.generalWatchdog("#xid"),t.createListener("img[onclick*='savePoint()']","click",t.updateTextAreas,!0)):document.getElementById("script")?(t.loadLanguage("javascript",function(){t.createEditor("#script","javascript","meta_ds")}),t.generalWatchdog("#xid"),t.createListener("img[onclick*='validateScript()']","click",t.updateTextAreas,!0),t.createListener("img[onclick*='savePoint()']","click",t.updateTextAreas,!0)):document.getElementById("selectStatement")&&(t.loadLanguage("sql",function(){t.createEditor("#selectStatement","sql","sql_ds_1")}),t.loadLanguage("sql",function(){t.createEditor("textarea[name='updateStatement']","sql","sql_ds_2")}),t.generalWatchdog("#xid"),t.createListener("#sqlTestBtn","click",t.updateTextAreas,!0),t.createListener("img[onclick*='saveDataSource()']","click",t.updateTextAreas,!0),t.createListener("img[onclick*='savePoint()']","click",t.updateTextAreas,!0)))},getSettings:function(){ajaxGetJson("resources/fuscabr/conf/modules/ceditor.json",function(e){fuscabr.ceditor.conf=e,fuscabr.ceditor.init()})},init:function(){fuscabr.ceditor.conf?fuscabr.ceditor.loadCodeMirror():fuscabr.ceditor.getSettings()}},fuscabr.ceditor.init(); diff --git a/WebContent/resources/fuscabr/modules/minified/chart.js b/WebContent/resources/fuscabr/modules/minified/chart.js new file mode 100755 index 0000000000..294307ea38 --- /dev/null +++ b/WebContent/resources/fuscabr/modules/minified/chart.js @@ -0,0 +1,5 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ +"use strict";fuscabr.chart={createdCharts:[],loop:function(){var t=document.querySelectorAll("div:not(.fuscabr-chart-container) > div > input.fuscabr-chart-data");e=t.length;for(var a=0;a0)!=r.animations&&(t.options.animation.duration=1==r.animations?1e3:0,s=!0),(n=t.options.title).display==r.showTitle&&n.text==r.title||(t.options.title.display=r.showTitle,t.options.title.text=r.title,s=!0);for(var i=r.data.datasets.length,o=0;o")}else{n=String(s.data[0]);if(0==isNaN(parseFloat(n)))continue;if("false"==n||"true"==n){for(var r of e[0].data.datasets[r].data)r="true"==String(r)?1:0;continue}e[0].data.datasets.splice(r,1),this.conf.enableDatapointWarnings&&(e[1]+="""+s.label+"" is not a numeric or binary datapoint
")}}return e},loadChartJs:function(){if(!document.getElementById("fuscabr-chartjs")){var t=document.createElement("script");t.src=this.conf.chartJsFile,t.id="fuscabr-chartjs",t.onload=fuscabr.chart.loop,document.getElementById("fuscabr-modules").appendChild(t)}},getSettings:function(){ajaxGetJson("resources/fuscabr/conf/modules/chart.json",function(t){fuscabr.chart.conf=t,fuscabr.chart.init()})},init:function(){fuscabr.chart.conf?(fuscabr.chart.loop(),setInterval(function(){fuscabr.chart.loop.call(fuscabr.chart)},fuscabr.chart.conf.refreshTime)):fuscabr.chart.getSettings()}},fuscabr.chart.init(); diff --git a/WebContent/resources/fuscabr/modules/minified/csnippet.js b/WebContent/resources/fuscabr/modules/minified/csnippet.js new file mode 100755 index 0000000000..8188d58ffa --- /dev/null +++ b/WebContent/resources/fuscabr/modules/minified/csnippet.js @@ -0,0 +1,5 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ +"use strict";fuscabr.csnippet={loadHtmlTemplate:function(){var e=fuscabr.csnippet.conf,t=document.getElementById("fuscabr-csnippet-html-select"),n=t[t.selectedIndex].value;t.disabled=!0;var c=new Event("change"),r=document.getElementById("staticPointContent");ajaxGet(e.htmlTemplatesFolder+n,function(e){r.value=e,r.dispatchEvent(c),t.disabled=!1},e.templatesLoadTimeout,function(){r.value="\x3c!-- Connection Timeout, please try again --\x3e",r.dispatchEvent(c),t.disabled=!1},function(){r.value="\x3c!-- Error! Template file not found. --\x3e",r.dispatchEvent(c),t.disabled=!1})},loadServerScriptTemplate:function(){var e=fuscabr.csnippet.conf,t=document.getElementById("fuscabr-csnippet-script-select"),n=t[t.selectedIndex].value;t.disabled=!0;var c=new Event("change"),r=document.getElementById("graphicRendererScriptScript");ajaxGet(e.serverScriptTemplatesFolder+n,function(e){r.value=e,r.dispatchEvent(c),t.disabled=!1},e.templatesLoadTimeout,function(){r.value="/* Connection Timeout, please try again */",r.dispatchEvent(c),t.disabled=!1},function(){r.value="/* Error! Template file not found. */",r.dispatchEvent(c),t.disabled=!1})},createHtmlInterface:function(){ajaxGet("resources/fuscabr/templates/internal/codeSnippetDiv.html",function(e){var t=e.replace("TEMPLATE","html"),n=document.getElementById("htmlEditor");n.innerHTML=t+n.innerHTML,n.querySelector("img").addEventListener("click",fuscabr.csnippet.loadHtmlTemplate);var c=n.querySelectorAll("*[data-i18n]");for(var r of c){var a=r.getAttribute("data-i18n");fuscabr.common.i18n.csnippet[a]&&localizeElement(r,fuscabr.common.i18n.csnippet[a])}var i=new Array;for(var r of(i.push(document.createElement("option")),fuscabr.csnippet.conf.htmlTemplates)){var s=document.createElement("option");s.value=r.file,s.innerHTML=fuscabr.common.i18n.csnippet[r.i18n]||r.desc,i.push(s)}i.sort(function(e,t){return e.innerHTML.localeCompare(t.innerHTML)});var p=document.createDocumentFragment();for(var r in i)p.appendChild(i[r]);document.getElementById("fuscabr-csnippet-html-select").appendChild(p),document.querySelector("#staticEditorPopup td[align='right']").addEventListener("click",fuscabr.csnippet.resetSelectedTemplates,!0)})},createServerScriptInterface:function(){ajaxGet("resources/fuscabr/templates/internal/codeSnippetDiv.html",function(e){var t=e.replace("TEMPLATE","script"),n=document.getElementById("graphicRenderer_script");n.innerHTML=n.innerHTML.replace("
",t),n.querySelector("img").addEventListener("click",fuscabr.csnippet.loadServerScriptTemplate);var c=n.querySelectorAll("*[data-i18n]");for(var r of c){var a=r.getAttribute("data-i18n");fuscabr.common.i18n.csnippet[a]&&localizeElement(r,fuscabr.common.i18n.csnippet[a])}var i=new Array;for(var r of(i.push(document.createElement("option")),fuscabr.csnippet.conf.serverScriptTemplates)){var s=document.createElement("option");s.value=r.file,s.innerHTML=fuscabr.common.i18n.csnippet[r.i18n]||r.desc,i.push(s)}i.sort(function(e,t){return e.innerHTML.localeCompare(t.innerHTML)});var p=document.createDocumentFragment();for(var r in i)p.appendChild(i[r]);document.getElementById("fuscabr-csnippet-script-select").appendChild(p),document.querySelector("#graphicRendererEditorPopup td[align='right']").addEventListener("click",fuscabr.csnippet.resetSelectedTemplates,!0)})},resetSelectedTemplates:function(){var e=document.getElementById("fuscabr-csnippet-html-select"),t=document.getElementById("fuscabr-csnippet-script-select");e.selectedIndex=0,t.selectedIndex=0},getSettings:function(){ajaxGetJson("resources/fuscabr/conf/modules/csnippet.json",function(e){fuscabr.csnippet.conf=e,fuscabr.csnippet.init()})},init:function(){fuscabr.csnippet.conf?(fuscabr.csnippet.createHtmlInterface(),fuscabr.csnippet.createServerScriptInterface()):fuscabr.csnippet.getSettings()}},fuscabr.csnippet.init(); diff --git a/WebContent/resources/fuscabr/modules/minified/fixes.js b/WebContent/resources/fuscabr/modules/minified/fixes.js new file mode 100755 index 0000000000..814ae672f6 --- /dev/null +++ b/WebContent/resources/fuscabr/modules/minified/fixes.js @@ -0,0 +1,5 @@ +/****************************************** + * FUScaBR - "Funções úteis para o ScadaBR" + * License: MIT + ******************************************/ +"use strict";fuscabr.fixes={preventAccidentalViewDeleting:function(){var e=document.querySelector("input[name='delete']");e.type="button",e.name="delete-disabled",e.addEventListener("click",fuscabr.fixes.deleteView)},deleteView:function(){if(window.confirm("WARNING! \nYou are about to DELETE this Graphical View! \n\nContinue?")){var e=document.querySelector("form[name='view']"),i=document.createElement("input");i.type="hidden",i.name="delete",i.value="Apagar",e.appendChild(i),e.submit()}},changePositionEditor:function(){positionEditor;positionEditor=this.positionEditor},positionEditor:function(e,i){/* FUScaBR */ var t=getNodeBounds($("c"+e)),n=document.getElementById(i);n.style.left=t.x+20+"px",n.style.top=t.y+10+"px"},getSettings:function(){ajaxGetJson("resources/fuscabr/conf/modules/fixes.json",function(e){fuscabr.fixes.conf=e,fuscabr.fixes.init()})},init:function(){fuscabr.fixes.conf?(fuscabr.fixes.conf.enablePreventViewDeleting&&fuscabr.fixes.preventAccidentalViewDeleting(),fuscabr.fixes.conf.enableChangePositionEditor&&fuscabr.fixes.changePositionEditor()):fuscabr.fixes.getSettings()}},fuscabr.fixes.init(); diff --git a/WebContent/resources/fuscabr/templates/html/HTMLImage.html b/WebContent/resources/fuscabr/templates/html/HTMLImage.html new file mode 100644 index 0000000000..0d014ec746 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/HTMLImage.html @@ -0,0 +1,5 @@ + + + + + diff --git a/WebContent/resources/fuscabr/templates/html/acnowledgeAlarms.html b/WebContent/resources/fuscabr/templates/html/acnowledgeAlarms.html new file mode 100644 index 0000000000..37ec5b633c --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/acnowledgeAlarms.html @@ -0,0 +1,9 @@ + + + + + diff --git a/WebContent/resources/fuscabr/templates/html/buttonChangePage.html b/WebContent/resources/fuscabr/templates/html/buttonChangePage.html new file mode 100644 index 0000000000..42267350ce --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/buttonChangePage.html @@ -0,0 +1,9 @@ + + + + + diff --git a/WebContent/resources/fuscabr/templates/html/clock.html b/WebContent/resources/fuscabr/templates/html/clock.html new file mode 100644 index 0000000000..3cc621cda0 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/clock.html @@ -0,0 +1,51 @@ + + + + + + 00:00:00 AM + + + + + +
+ + + +
\ No newline at end of file diff --git a/WebContent/resources/fuscabr/templates/html/fullScreen.html b/WebContent/resources/fuscabr/templates/html/fullScreen.html new file mode 100644 index 0000000000..6afa94dd86 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/fullScreen.html @@ -0,0 +1,32 @@ + + + + + + +
+ +
diff --git a/WebContent/resources/fuscabr/templates/html/logout.html b/WebContent/resources/fuscabr/templates/html/logout.html new file mode 100644 index 0000000000..4ebe5497fd --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/logout.html @@ -0,0 +1,9 @@ + + + + + diff --git a/WebContent/resources/fuscabr/templates/html/runMultipleScripts.html b/WebContent/resources/fuscabr/templates/html/runMultipleScripts.html new file mode 100644 index 0000000000..e6f4874fed --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/runMultipleScripts.html @@ -0,0 +1,39 @@ + + + + + + +
+ +
diff --git a/WebContent/resources/fuscabr/templates/html/silenceAlarms.html b/WebContent/resources/fuscabr/templates/html/silenceAlarms.html new file mode 100644 index 0000000000..7c03d43a83 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/silenceAlarms.html @@ -0,0 +1,9 @@ + + + + + diff --git a/WebContent/resources/fuscabr/templates/html/simpleText.html b/WebContent/resources/fuscabr/templates/html/simpleText.html new file mode 100644 index 0000000000..f8b82c8400 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/html/simpleText.html @@ -0,0 +1,7 @@ + + + + + + Wellcome to ScadaBR! + diff --git a/WebContent/resources/fuscabr/templates/internal/alignDiv.html b/WebContent/resources/fuscabr/templates/internal/alignDiv.html new file mode 100644 index 0000000000..4811d33811 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/internal/alignDiv.html @@ -0,0 +1,58 @@ + + +
+

Align Elements

+ +
+ + + diff --git a/WebContent/resources/fuscabr/templates/internal/codeSnippetDiv.html b/WebContent/resources/fuscabr/templates/internal/codeSnippetDiv.html new file mode 100644 index 0000000000..3d75ac3a1e --- /dev/null +++ b/WebContent/resources/fuscabr/templates/internal/codeSnippetDiv.html @@ -0,0 +1,7 @@ +
+ + Template: + + + +
\ No newline at end of file diff --git a/WebContent/resources/fuscabr/templates/internal/easterEgg.html b/WebContent/resources/fuscabr/templates/internal/easterEgg.html new file mode 100644 index 0000000000..319efd4605 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/internal/easterEgg.html @@ -0,0 +1,54 @@ +
+
+ +

Copyright (c) 2021 Celso Dell Anhol Ubaldo

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE + OR OTHER DEALINGS IN THE SOFTWARE.

+ + FuscaBR on GitHub + +

(Click anywhere to close)

+
+
+ diff --git a/WebContent/resources/fuscabr/templates/internal/fuscabr.jpg b/WebContent/resources/fuscabr/templates/internal/fuscabr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8eb7ebac93b2cc863aa6b8c96c260fa35493d84f GIT binary patch literal 59080 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 bI03Eicq4F7AgR"; + body += "" + thisUser.id + ""; + } + + header += "" + user_header + ""; + body += "" + thisUser.username + ""; + + if (show_email) { + header += "" + email_header + ""; + body += "" + thisUser.email + ""; + } + if (show_telephone) { + header += "" + telephone_header + ""; + body += "" + thisUser.phone + ""; + } + if (show_admin) { + header += "" + admin_header + ""; + if (thisUser.admin) { + body += "" + admin_yes + ""; + } else { + body += "" + admin_no + ""; + } + } + if (show_last_login) { + header += "" + last_login_header + ""; + if (!thisUser.isFirstLogin()) { + body += "" + time.format(thisUser.lastLogin) + ""; + } else { + body += "" + last_login_never + ""; + } + } + header += ""; + body += ""; + } + + return "" + header + body + "
"; +} + +// This function generates an built-in basic CSS style to tables +function createCSS() { + var css = ""; + + css += ""; + + return css; +} diff --git a/WebContent/resources/fuscabr/templates/serverside/binaryText.js b/WebContent/resources/fuscabr/templates/serverside/binaryText.js new file mode 100644 index 0000000000..c7cb600aae --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/binaryText.js @@ -0,0 +1,67 @@ +/* @license MIT */ + +var true_format = { + text: "Text at true state", + color: "#15AA1A", + font_size: "12px", + bold: false +}; + +var false_format = { + text: "Text at false state", + color: "#FF0000", + font_size: "12px", + bold: false +}; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Check if data point type is compatible +if (getDataPointType(point.id) != "BINARY") + return "The selected data point is not binary. Please select a binary data point." + +// Return variable +var s = ""; + +s += ""; +} else { + s += "style='color:" + false_format.color + ";"; + s += "font-size:" + false_format.font_size + ";"; + s += "font-weight:" + s += (false_format.bold) ? "bold;" : "normal;" + s += "' >" + false_format.text + ""; +} + +return s; + +function getDataPointType(identifier) { + var types = { + 0: "UNKNOWN", + 1: "BINARY", + 2: "MULTISTATE", + 3: "NUMERIC", + 4: "ALPHANUMERIC", + 5: "IMAGE" + } + + var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dp = dpDAO.getDataPoint(identifier); + var locator = dp.getPointLocator(); + return types[locator.getDataTypeId()]; +} \ No newline at end of file diff --git a/WebContent/resources/fuscabr/templates/serverside/changePassword.js b/WebContent/resources/fuscabr/templates/serverside/changePassword.js new file mode 100644 index 0000000000..763580206c --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/changePassword.js @@ -0,0 +1,182 @@ +/* @license MIT */ + +/* + * This experimental script generates a + * simple form to change current logged + * user's password. + * + * To run it, you need create a exclusive + * alphanumeric data point (that can have + * data erased). + * + * LIMITATIONS: This script will not work + * if the current user doesn't have write + * permissions for data point or graphical + * view. SENSITIVE DATA (PASSWORDS) MAY + * REMAIN STORED IN THE ALPHANUMERIC DATA + * POINT. + */ + +// Form messages (translate to your language) +var current_password = "Current password:"; +var new_password = "New password:"; +var confirm_new_password = "Confirm new password:"; +var change_button = "Change password"; + +// Success messages (translate to your language) +var change_success = "Success! Password changed."; + +// Error messages (translate to your language) +var err_dont_match = "Error! <> and <> fields do not match."; +var err_wrong_psswd = "Error! Wrong password in field <>."; +var err_blocked_psswd = "Error! You cannot use the password 1234!"; +var err_empty_fields = "Error! All fields must be filled."; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Check if data point type is compatible +if (getDataPointType(point.id) != "ALPHANUMERIC") + return "Invalid data point type. Please select an alphanumeric data point." + +// Return variable +var s = "" + +// Get HTML code from createHtml() function +s += createHtml(); + +// Detect a password change request +if (value && value != "1234") { + if (!changePassword()) { + s += ""; + } else { + s += ""; + } +} + +return s; + + +// This function generates the main form HTML code +function createHtml() { + var html = ""; + html += "

" + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += "
" + html += "" + + return html; +} + +// This function creates Javascript code to validate form +// and set the "password changer" data point +function createCommandStr() { + var command = ""; + command += "var currPsswd = $get(\"current-password\");" + command += "var newPsswd = $get(\"new-password\");" + command += "var newPsswd2 = $get(\"confirm-new-password\");" + command += "if (!currPsswd || !newPsswd || !newPsswd2) {"; + command += "setTimeout(alert(\"" + err_empty_fields + "\"), 200);"; + command += "} else if (newPsswd != newPsswd2) {"; + command += "setTimeout(alert(\"" + err_dont_match + "\"), 200);"; + command += "} else if (newPsswd == \"1234\") {"; + command += "setTimeout(alert(\"" + err_blocked_psswd + "\"), 200);"; + command += "} else {" + command += "mango.view.setPoint(" + point.id + ", " + pointComponent.id + ", (currPsswd + \"&&&\" + newPsswd));"; + command += "}"; + + return command; +} + +// This function changes the user password +function changePassword() { + var userDAO = new com.serotonin.mango.db.dao.UserDao(); + var userId = new com.serotonin.mango.Common.getUser().getId(); + var user = userDAO.getUser(userId); + + var passwords = String(value).split("&&&"); + var currPasswd = new com.serotonin.mango.Common.encrypt(passwords[0]); + var newPasswd = passwords[1]; + + var pvDAO = new com.serotonin.mango.db.dao.PointValueDao(); + try { + backgroundSetPoint(point.id, "1234"); + // Try to clear point values history (for privacy) + pvDAO.deletePointValues(point.id); + } catch (e) { + s += ""; + }; + + if (user.getPassword().equals(currPasswd)) { + user.setPassword(new com.serotonin.mango.Common.encrypt(newPasswd)); + userDAO.saveUser(user); + return 1; + } + + return 0; +} + +// This function tries to set a data point in background. +// It can fail if you don't have necessary permissions. +function backgroundSetPoint(pointId, newValue) { + var pvDAO = new com.serotonin.mango.db.dao.PointValueDao(); + var lastValue = pvDAO.getLatestPointValue(pointId).value; + + if (typeof newValue == "string") + lastValue = String(lastValue); + else if (typeof newValue == "number") + lastValue = Number(lastValue); + + // Only set point if values differ + if (lastValue != newValue) { + // The real component id does not matter in this context + var componentId = 0; + + var viewDwr = com.serotonin.mango.web.dwr.ViewDwr(); + viewDwr.setPoint(pointId, componentId, newValue); + + // Return 1 if value was changed + return 1; + } + + // Return 0 if value was not changed + return 0; +} + +// This function returns the data type of a given data point +function getDataPointType(identifier) { + var types = { + 0: "UNKNOWN", + 1: "BINARY", + 2: "MULTISTATE", + 3: "NUMERIC", + 4: "ALPHANUMERIC", + 5: "IMAGE" + } + + var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dp = dpDAO.getDataPoint(identifier); + var locator = dp.getPointLocator(); + return types[locator.getDataTypeId()]; +} diff --git a/WebContent/resources/fuscabr/templates/serverside/checkbox.js b/WebContent/resources/fuscabr/templates/serverside/checkbox.js new file mode 100644 index 0000000000..45e4ca98d3 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/checkbox.js @@ -0,0 +1,66 @@ +/* @license MIT */ + +// Checkbox label appearance +var checkbox_label = "Click me!"; +var font_size = 11; +var text_color = "#000000"; + +// This will invert the checkbox logic +// (checked when data point is false and +// unchecked when it is true) +var inverted_logic = false; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Check if data point type is compatible +if (getDataPointType(point.id) != "BINARY") + return "The selected data point is not binary. Please select a binary data point." + +var checkbox_id = "checkbox-script" + pointComponent.id; +var logic_value = value; + +if (inverted_logic) + logic_value = !value; + +var command = "mango.view.setPoint(" + point.id + ", " + pointComponent.id + ", " + !value + ");"; + +// Return variable +var s = ""; + +// Generate HTML code +s += ""; +s += ""; +s += "" + point_label + ""; +s += "" + display_value + ""; +s += ""; + +// Create CSS style +s += ""; + +return s; diff --git a/WebContent/resources/fuscabr/templates/serverside/demoFunctions.js b/WebContent/resources/fuscabr/templates/serverside/demoFunctions.js new file mode 100644 index 0000000000..a887f8783f --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/demoFunctions.js @@ -0,0 +1,113 @@ +/* @license MIT */ + +/* + * This is a set of useful functions to + * include in your own server-side scripts. + */ + + +return "You have selected a demo server-side script." + +// This function gets the data type of a given +// data point, converting a number constant to +// a string with data type +function getDataPointType(identifier) { + var types = { + 0: "UNKNOWN", + 1: "BINARY", + 2: "MULTISTATE", + 3: "NUMERIC", + 4: "ALPHANUMERIC", + 5: "IMAGE" + } + + var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dp = dpDAO.getDataPoint(identifier); + var locator = dp.getPointLocator(); + return types[locator.getDataTypeId()]; +} + + +// This function returns a simple string for the set point. +// This string needs to be included in your script's return +// variable, within an HTML event or within a "; + +return s; + +function getDataPointType(identifier) { + var types = { + 0: "UNKNOWN", + 1: "BINARY", + 2: "MULTISTATE", + 3: "NUMERIC", + 4: "ALPHANUMERIC", + 5: "IMAGE" + } + + var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dp = dpDAO.getDataPoint(identifier); + var locator = dp.getPointLocator(); + return types[locator.getDataTypeId()]; +} \ No newline at end of file diff --git a/WebContent/resources/fuscabr/templates/serverside/historyCSV.js b/WebContent/resources/fuscabr/templates/serverside/historyCSV.js new file mode 100644 index 0000000000..d68d6d8b35 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/historyCSV.js @@ -0,0 +1,101 @@ +/* @license MIT */ + +// Button label +var label = "Download point history"; + +// The name of CSV file to download +var filename = "Point History.csv"; + +// Data points included in history (ID or XID) +var points = [ point.id ]; + +// History period (select time unit above) +var time_period = 2; + +// History time unit: +// 0 -> minutes +// 1 -> hours +// 2 -> days +var time_unit = 1; + +// Change SimpleDateFormat time pattern (advanced!) +var time_pattern = "yyyy-MM-dd KK:mm a"; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Convert time to milliseconds +time_unit = time_unit > 2 ? 2 : time_unit; +var units = [ 60000, 3600000, 43200000]; +var startTime = new Date().getTime() - (time_period * units[time_unit]); + +// Create onclick command +var command = ""; +command += "var element = document.createElement(\"a\");"; +command += "element.setAttribute(\"href\", \"data:text/plain;charset=utf-8,\" + \"" + createFinalCSV() + "\");"; +command += "element.setAttribute(\"download\", \"" + filename + "\");"; +command += "element.style.display = \"none\";"; +command += "document.body.appendChild(element);"; +command += "element.click();"; +command += "document.body.removeChild(element);"; + +// Return variable +var s = ""; + +// Create HTML download button +s += ""; + +return s; + +// +//// Functions +// + +// Create final CSV file content +function createFinalCSV() { + var csv = encodeURIComponent("Data source,Data point,Value,Time") + "%0A"; + + for (var i in points) { + var pointInfo = getDataPointInfo(points[i]); + csv += createCSVHistory(pointInfo, startTime); + } + + return csv; +} + +// Create CSV history for each data point specified +function createCSVHistory(point, startTime) { + var pvDAO = new com.serotonin.mango.db.dao.PointValueDao(); + var history = pvDAO.getPointValues(point.id, startTime); + var sdf = new java.text.SimpleDateFormat(time_pattern); + + var length = history.size() - 1; + var csv = ""; + + for (var i = length; i >= 0; i--) { + var data = point.source + "," + point.name + "," + history.get(i).value + "," + sdf.format(history.get(i).time); + csv += encodeURIComponent(data) + "%0A"; + } + + return csv; +} + +// Get data point information (id, xid, point name and data source name) +function getDataPointInfo(identifier) { + var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dp = dpDAO.getDataPoint(identifier); + + var pointId = dp.getId(); + var pointXid = String(dp.getXid()); + var pointName = String(dp.getName()); + var sourceName = String(dp.getDataSourceName()); + return { id: pointId, xid: pointXid, name: pointName, source: sourceName }; +} \ No newline at end of file diff --git a/WebContent/resources/fuscabr/templates/serverside/horizontalBar.js b/WebContent/resources/fuscabr/templates/serverside/horizontalBar.js new file mode 100644 index 0000000000..05d4f4b6e5 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/horizontalBar.js @@ -0,0 +1,53 @@ +/* @license MIT */ + +// The maximum and minimum for data point scale +var scale_min = 0; +var scale_max = 100; + +// Customize bar +var bar_height = 20; +var bar_width = 150; + +var background_color = "#FFFFFF"; +var foreground_color = "#12CE00"; +var border_color = "#555555"; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Conversion of data point scale to percentage +var percentage = 0; +if (value > scale_max) { + percentage = 100; +} else if (value < scale_min) { + percentage = 0; +} else { + percentage = ((value - scale_min) / (scale_max - scale_min)) * 100; +} + +// Return variable +var s = ""; + +s += "
"; +s += "
"; +s += "
"; + +return s; diff --git a/WebContent/resources/fuscabr/templates/serverside/imageButton.js b/WebContent/resources/fuscabr/templates/serverside/imageButton.js new file mode 100644 index 0000000000..77462a9f84 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/imageButton.js @@ -0,0 +1,56 @@ +/* @license MIT */ + +// Button image when value is true +var image_true = "graphics/Botao-3D/botao10.png"; + +// Button image when value is false +var image_false = "graphics/Botao-3D/botao20.png"; + +// Display a confirmation prompt before change value +var enable_confirm_prompt = false; +var confirm_message = "Change value?"; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Check if data point type is compatible +if (getDataPointType(point.id) != "BINARY") + return "The selected data point is not binary. Please select a binary data point." + +var confirm = "if (window.confirm("" + confirm_message + "")) "; +var command = "mango.view.setPoint(" + point.id + ", " + pointComponent.id + ", " + !value + ")"; +if (enable_confirm_prompt) + command = confirm + command; + +// Return variable +var s = ""; + +if (value) + s += ""; +else + s += ""; + +return s; + +function getDataPointType(identifier) { + var types = { + 0: "UNKNOWN", + 1: "BINARY", + 2: "MULTISTATE", + 3: "NUMERIC", + 4: "ALPHANUMERIC", + 5: "IMAGE" + } + + var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dp = dpDAO.getDataPoint(identifier); + var locator = dp.getPointLocator(); + return types[locator.getDataTypeId()]; +} diff --git a/WebContent/resources/fuscabr/templates/serverside/imageSequence.js b/WebContent/resources/fuscabr/templates/serverside/imageSequence.js new file mode 100644 index 0000000000..d4cdc24cfc --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/imageSequence.js @@ -0,0 +1,59 @@ +/* @license MIT */ + +// The figure description +var description = "Image sequence"; + +// Configure here all images of the sequence, and its values +var images = [ + { src: "graphics/GreenThermo/thermometer0.jpg", initial_value: 0}, + { src: "graphics/GreenThermo/thermometer1.jpg", initial_value: 10}, + { src: "graphics/GreenThermo/thermometer2.jpg", initial_value: 20}, + { src: "graphics/GreenThermo/thermometer3.jpg", initial_value: 30}, + { src: "graphics/GreenThermo/thermometer4.jpg", initial_value: 40}, + { src: "graphics/GreenThermo/thermometer5.jpg", initial_value: 50}, + { src: "graphics/GreenThermo/thermometer6.jpg", initial_value: 60}, + { src: "graphics/GreenThermo/thermometer7.jpg", initial_value: 70}, +]; + +// Use this image as fallback +var image_fallback = "/ScadaBR/graphics/GreenThermo/thermometer0.jpg"; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Return variable +var s = ""; + +// Sort images by value (ascending) +images.sort(function(a, b) { + return a.initial_value - b.initial_value; +}); + +for (var i = 0; i < images.length; i++) { + var loop_value = images[i].initial_value; + var data_point_value = value; + + // Change the image source + if (data_point_value >= loop_value) + s = " tag +s += ">" + +return s; \ No newline at end of file diff --git a/WebContent/resources/fuscabr/templates/serverside/numericSelector.js b/WebContent/resources/fuscabr/templates/serverside/numericSelector.js new file mode 100644 index 0000000000..a9abeb8c3d --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/numericSelector.js @@ -0,0 +1,76 @@ +/* @license MIT */ + +// Appearance settings +var height = 25; +var width = 60; + +var background_color = "#FFFFFF"; +var text_color = "#000000"; + +// Restrict insertion of values +var restrict_values = false; +var step = 1; +var minimum = 0; +var maximum = 100; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Check if data point type is compatible +if (getDataPointType(point.id) != "MULTISTATE" && getDataPointType(point.id) != "NUMERIC") + return "Invalid data point type. Please select a numeric or multistate data point." + +var padding = 2; +var border = 1; +height = height - 2 * (border + padding); +width = width - 2 * (border + padding); + +var command = "mango.view.setPoint(" + point.id + ", " + pointComponent.id + ", value)" ; +var restriction = "if (this.checkValidity()) " + command; + +// Return variable +var s = ""; + +s += ""; +s += preffix + " " + getUsername() + " " + suffix; +s += "
"; + +return s; diff --git a/WebContent/resources/fuscabr/templates/serverside/slider.js b/WebContent/resources/fuscabr/templates/serverside/slider.js new file mode 100644 index 0000000000..59c5097133 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/slider.js @@ -0,0 +1,66 @@ +/* @license MIT */ + +// Slider width (in pixels) +var width = 150; + +// Slider scale +var maximum = 10; +var minimum = 0; +var step = 1; + +// Show a text with the data point value +var show_value = false; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Check if data point type is compatible +if (getDataPointType(point.id) != "MULTISTATE" && getDataPointType(point.id) != "NUMERIC") + return "Invalid data point type. Please select a numeric or multistate data point." + +var command = "mango.view.setPoint(" + point.id + ", " + pointComponent.id + ", value);"; + +// Return variable +var s = ""; + +s += "
" + +s += ""; +} +s += "
"; + +return s; + +function getDataPointType(identifier) { + var types = { + 0: "UNKNOWN", + 1: "BINARY", + 2: "MULTISTATE", + 3: "NUMERIC", + 4: "ALPHANUMERIC", + 5: "IMAGE" + } + + var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dp = dpDAO.getDataPoint(identifier); + var locator = dp.getPointLocator(); + return types[locator.getDataTypeId()]; +} diff --git a/WebContent/resources/fuscabr/templates/serverside/verticalBar.js b/WebContent/resources/fuscabr/templates/serverside/verticalBar.js new file mode 100644 index 0000000000..46be27c4f5 --- /dev/null +++ b/WebContent/resources/fuscabr/templates/serverside/verticalBar.js @@ -0,0 +1,53 @@ +/* @license MIT */ + +// The maximum and minimum for data point scale +var scale_min = 0; +var scale_max = 100; + +// Customize bar +var bar_height = 150; +var bar_width = 20; + +var background_color = "#FFFFFF"; +var foreground_color = "#12CE00"; +var border_color = "#555555"; + + + + +// +// DON'T CHANGE THE CODE BELOW +// + + + + +// Conversion of data point scale to percentage +var percentage = 0; +if (value > scale_max) { + percentage = 100; +} else if (value < scale_min) { + percentage = 0; +} else { + percentage = ((value - scale_min) / (scale_max - scale_min)) * 100; +} + +// Return variable +var s = ""; + +s += "
"; +s += "
"; +s += "
"; + +return s; From 42e43e626377b79f421d9bc50bcd026f6d709d11 Mon Sep 17 00:00:00 2001 From: patrykb0802 Date: Thu, 24 Aug 2023 17:37:29 +0200 Subject: [PATCH 2/7] #2503 Add alignment and template feature for html and js - in publicView.jsp and page.tag addded imports of fuscaBR library - Solved GET 404 error with exceptions in web.xml file for .json and .html file format To be checked for tests: - Allignment tool in graphical view (align.js) - Calendar module in chart comparator (calendar.js) - Applying code templates for HTML and Server-sided script components (csnippet.js) NOTE: running `chown -R user_name fuscabr` might help if you are still getting 404 error --- WebContent/META-INF/context.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebContent/META-INF/context.xml b/WebContent/META-INF/context.xml index c7d2a6b1ef..12071c27fe 100644 --- a/WebContent/META-INF/context.xml +++ b/WebContent/META-INF/context.xml @@ -31,6 +31,6 @@ driverClassName="com.mysql.jdbc.Driver" defaultTransactionIsolation="READ_COMMITTED" connectionProperties="useSSL=false;allowPublicKeyRetrieval=true" - url="jdbc:mysql://localhost:3306/scadalts2" + url="jdbc:mysql://localhost:3306/scadalts" /> \ No newline at end of file From 13b0111af67baa11ddb4b688f96da0f56508933c Mon Sep 17 00:00:00 2001 From: patrykb0802 Date: Mon, 25 Sep 2023 16:18:25 +0200 Subject: [PATCH 3/7] #2668 Fixed alignment tool making components go out of bounds in graphical view --- src/com/serotonin/mango/view/View.java | 6 ++++-- .../serotonin/mango/view/component/ViewComponent.java | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/com/serotonin/mango/view/View.java b/src/com/serotonin/mango/view/View.java index 66fd54bfb8..f8989063ad 100644 --- a/src/com/serotonin/mango/view/View.java +++ b/src/com/serotonin/mango/view/View.java @@ -396,8 +396,10 @@ else if (!new ViewService().isXidUnique(xid, id)) response.addMessage("xid", new LocalizableMessage( "validate.xidUsed")); - for (ViewComponent vc : viewComponents) - vc.validate(response); + for (int i = 0; i < viewComponents.size(); i++) { + var vc = viewComponents.get(i); + vc.validate("viewComponents[" + i + "].", response); + } } // diff --git a/src/com/serotonin/mango/view/component/ViewComponent.java b/src/com/serotonin/mango/view/component/ViewComponent.java index 2b60a0fd2d..0091b57b79 100644 --- a/src/com/serotonin/mango/view/component/ViewComponent.java +++ b/src/com/serotonin/mango/view/component/ViewComponent.java @@ -282,6 +282,15 @@ public void validate(DwrResponseI18n response) { "validate.cannotBeNegative")); } + public void validate(String prefix, DwrResponseI18n response) { + if (x < 0) + response.addMessage(prefix + "x", new LocalizableMessage( + "validate.cannotBeNegative")); + if (y < 0) + response.addMessage(prefix + "y", new LocalizableMessage( + "validate.cannotBeNegative")); + } + // // / // / Serialization From 5540e461b7ae7018b301b420023389f38a399b6e Mon Sep 17 00:00:00 2001 From: patrykb0802 Date: Tue, 26 Sep 2023 10:46:04 +0200 Subject: [PATCH 4/7] #2668 Fixed alignment tool making components go out of bounds in graphical view - Added in ViewDwr.java 'if' validation for: x, y, z of view component for negative values - Added z variable validation for 'z' inside ViewComponent.java --- src/com/serotonin/mango/view/component/ViewComponent.java | 6 ++++++ src/com/serotonin/mango/web/dwr/ViewDwr.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/com/serotonin/mango/view/component/ViewComponent.java b/src/com/serotonin/mango/view/component/ViewComponent.java index 0091b57b79..9e7cb7d66e 100644 --- a/src/com/serotonin/mango/view/component/ViewComponent.java +++ b/src/com/serotonin/mango/view/component/ViewComponent.java @@ -280,6 +280,9 @@ public void validate(DwrResponseI18n response) { if (y < 0) response.addMessage("y", new LocalizableMessage( "validate.cannotBeNegative")); + if (z < 0) + response.addMessage("z", new LocalizableMessage( + "validate.cannotBeNegative")); } public void validate(String prefix, DwrResponseI18n response) { @@ -289,6 +292,9 @@ public void validate(String prefix, DwrResponseI18n response) { if (y < 0) response.addMessage(prefix + "y", new LocalizableMessage( "validate.cannotBeNegative")); + if (z < 0) + response.addMessage(prefix + "z", new LocalizableMessage( + "validate.cannotBeNegative")); } // diff --git a/src/com/serotonin/mango/web/dwr/ViewDwr.java b/src/com/serotonin/mango/web/dwr/ViewDwr.java index c665fd184e..f1dd722052 100644 --- a/src/com/serotonin/mango/web/dwr/ViewDwr.java +++ b/src/com/serotonin/mango/web/dwr/ViewDwr.java @@ -427,11 +427,17 @@ public ViewComponent addComponent(String componentName, int viewId) { public void setViewComponentLocation(String viewComponentId, int x, int y, int viewId) { + if(x < 0) + x = 0; + if(y < 0) + y = 0; getViewComponent(viewComponentId, viewId).setLocation(x, y); } public void setViewComponentZIndex(String viewComponentId, int zIndex, int viewId) { + if(zIndex < 1) + zIndex = 1; getViewComponent(viewComponentId, viewId).setZ(zIndex); } From 92392f7cf776d46bf36d82e96f553ff373cf476a Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 15 May 2024 14:19:23 +0200 Subject: [PATCH 5/7] #2503 add alignment and template feature for html and js: - corrected template acknowledgeAlarms.html; --- WebContent/resources/fuscabr/conf/modules/csnippet.json | 2 +- .../html/{acnowledgeAlarms.html => acknowledgeAlarms.html} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename WebContent/resources/fuscabr/templates/html/{acnowledgeAlarms.html => acknowledgeAlarms.html} (73%) diff --git a/WebContent/resources/fuscabr/conf/modules/csnippet.json b/WebContent/resources/fuscabr/conf/modules/csnippet.json index 8df9d387b4..7d64811f47 100644 --- a/WebContent/resources/fuscabr/conf/modules/csnippet.json +++ b/WebContent/resources/fuscabr/conf/modules/csnippet.json @@ -4,7 +4,7 @@ "templatesLoadTimeout": 15000, "htmlTemplates": [ - { "file": "acnowledgeAlarms.html", "i18n": "acknowledge_alarms", "desc": "Acknowledge alarms button" }, + { "file": "acknowledgeAlarms.html", "i18n": "acknowledge_alarms", "desc": "Acknowledge alarms button" }, { "file": "buttonChangePage.html", "i18n": "button_change_page", "desc": "Button (change page)" }, { "file": "clock.html", "i18n": "clock", "desc": "Digital clock" }, { "file": "fullScreen.html", "i18n": "full_screen", "desc": "Toggle Full Screen" }, diff --git a/WebContent/resources/fuscabr/templates/html/acnowledgeAlarms.html b/WebContent/resources/fuscabr/templates/html/acknowledgeAlarms.html similarity index 73% rename from WebContent/resources/fuscabr/templates/html/acnowledgeAlarms.html rename to WebContent/resources/fuscabr/templates/html/acknowledgeAlarms.html index 37ec5b633c..7ad33ec5fc 100644 --- a/WebContent/resources/fuscabr/templates/html/acnowledgeAlarms.html +++ b/WebContent/resources/fuscabr/templates/html/acknowledgeAlarms.html @@ -5,5 +5,5 @@ From 9ecee6b909ce61b167b0a1042c380ac84b7407fa Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 15 May 2024 16:47:13 +0200 Subject: [PATCH 6/7] #2503 add alignment and template feature for html and js - fixed templates: binaryText.js changePassword.js checkbox.js demoFunctions.js fuscabrChartLatest.js fuscabrChartTime.js gauge.js historyCSV.js imageButton.js numericSelector.js pulseButton.js slider.js --- .../resources/fuscabr/templates/serverside/binaryText.js | 2 +- .../fuscabr/templates/serverside/changePassword.js | 2 +- .../resources/fuscabr/templates/serverside/checkbox.js | 2 +- .../fuscabr/templates/serverside/demoFunctions.js | 8 ++++---- .../fuscabr/templates/serverside/fuscabrChartLatest.js | 4 ++-- .../fuscabr/templates/serverside/fuscabrChartTime.js | 4 ++-- .../resources/fuscabr/templates/serverside/gauge.js | 2 +- .../resources/fuscabr/templates/serverside/historyCSV.js | 2 +- .../resources/fuscabr/templates/serverside/imageButton.js | 2 +- .../fuscabr/templates/serverside/numericSelector.js | 2 +- .../resources/fuscabr/templates/serverside/pulseButton.js | 6 +++--- .../resources/fuscabr/templates/serverside/slider.js | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/WebContent/resources/fuscabr/templates/serverside/binaryText.js b/WebContent/resources/fuscabr/templates/serverside/binaryText.js index c7cb600aae..26e219ce6c 100644 --- a/WebContent/resources/fuscabr/templates/serverside/binaryText.js +++ b/WebContent/resources/fuscabr/templates/serverside/binaryText.js @@ -60,7 +60,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/changePassword.js b/WebContent/resources/fuscabr/templates/serverside/changePassword.js index 763580206c..da30e6ff3e 100644 --- a/WebContent/resources/fuscabr/templates/serverside/changePassword.js +++ b/WebContent/resources/fuscabr/templates/serverside/changePassword.js @@ -175,7 +175,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/checkbox.js b/WebContent/resources/fuscabr/templates/serverside/checkbox.js index 45e4ca98d3..76b773f114 100644 --- a/WebContent/resources/fuscabr/templates/serverside/checkbox.js +++ b/WebContent/resources/fuscabr/templates/serverside/checkbox.js @@ -59,7 +59,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/demoFunctions.js b/WebContent/resources/fuscabr/templates/serverside/demoFunctions.js index a887f8783f..b968a08290 100644 --- a/WebContent/resources/fuscabr/templates/serverside/demoFunctions.js +++ b/WebContent/resources/fuscabr/templates/serverside/demoFunctions.js @@ -21,7 +21,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; @@ -35,7 +35,7 @@ function getDataPointType(identifier) { // To run it you must have write permission for the Graphical // View. function setPoint(pointIdentifier, value) { - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var pointId = dpDAO.getDataPoint(pointIdentifier).getId(); return "mango.view.setPoint(" + pointId + "," + pointComponent.id + "," + value + ");"; } @@ -92,7 +92,7 @@ function getUserInfo() { // This function returns an object with useful data point // informations (id, xid, point name and data source name) function getDataPointInfo(identifier) { - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var pointId = dp.getId(); @@ -107,7 +107,7 @@ function getDataPointInfo(identifier) { // that returns only the data point ID (useful to get an ID // from a XID) function getDataPointId(identifier) { - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); return dp.getId(); } \ No newline at end of file diff --git a/WebContent/resources/fuscabr/templates/serverside/fuscabrChartLatest.js b/WebContent/resources/fuscabr/templates/serverside/fuscabrChartLatest.js index 3b6c82f66b..2d8b3cf3d9 100644 --- a/WebContent/resources/fuscabr/templates/serverside/fuscabrChartLatest.js +++ b/WebContent/resources/fuscabr/templates/serverside/fuscabrChartLatest.js @@ -56,7 +56,7 @@ var invalid_html = ""; // Get datapoint identifiers (ID/XID) function getDataPointIds(identifier) { - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var point_id = dp.getId(); @@ -75,7 +75,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/fuscabrChartTime.js b/WebContent/resources/fuscabr/templates/serverside/fuscabrChartTime.js index 70d78cbebe..e547668808 100644 --- a/WebContent/resources/fuscabr/templates/serverside/fuscabrChartTime.js +++ b/WebContent/resources/fuscabr/templates/serverside/fuscabrChartTime.js @@ -57,7 +57,7 @@ var invalid_html = ""; // Get datapoint identifiers (ID/XID) function getDataPointIds(identifier) { - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var point_id = dp.getId(); @@ -76,7 +76,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/gauge.js b/WebContent/resources/fuscabr/templates/serverside/gauge.js index e15d3fc687..41a3e2b45a 100644 --- a/WebContent/resources/fuscabr/templates/serverside/gauge.js +++ b/WebContent/resources/fuscabr/templates/serverside/gauge.js @@ -149,7 +149,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/historyCSV.js b/WebContent/resources/fuscabr/templates/serverside/historyCSV.js index d68d6d8b35..ff789095e1 100644 --- a/WebContent/resources/fuscabr/templates/serverside/historyCSV.js +++ b/WebContent/resources/fuscabr/templates/serverside/historyCSV.js @@ -90,7 +90,7 @@ function createCSVHistory(point, startTime) { // Get data point information (id, xid, point name and data source name) function getDataPointInfo(identifier) { - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var pointId = dp.getId(); diff --git a/WebContent/resources/fuscabr/templates/serverside/imageButton.js b/WebContent/resources/fuscabr/templates/serverside/imageButton.js index 77462a9f84..36bc67f927 100644 --- a/WebContent/resources/fuscabr/templates/serverside/imageButton.js +++ b/WebContent/resources/fuscabr/templates/serverside/imageButton.js @@ -49,7 +49,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/numericSelector.js b/WebContent/resources/fuscabr/templates/serverside/numericSelector.js index a9abeb8c3d..7b530e61df 100644 --- a/WebContent/resources/fuscabr/templates/serverside/numericSelector.js +++ b/WebContent/resources/fuscabr/templates/serverside/numericSelector.js @@ -69,7 +69,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/pulseButton.js b/WebContent/resources/fuscabr/templates/serverside/pulseButton.js index da7f0fb7d1..ee5deae5dd 100644 --- a/WebContent/resources/fuscabr/templates/serverside/pulseButton.js +++ b/WebContent/resources/fuscabr/templates/serverside/pulseButton.js @@ -37,8 +37,8 @@ var command = ""; command += "var setPoint = ViewDwr.setViewPoint;" command += "if (window.location.pathname.includes("views.shtm")) {"; command += "show(c" + pc_id + "Changing);"; -command += "setPoint(" + pc_id + ", " + value_on_click + ", function() {"; -command += "setPoint(" + pc_id + ", " + !value_on_click + ", function() {"; +command += "setPoint(" + pc_id + ", " + value_on_click + ", mango.longPoll.pollRequest.viewId, function() {"; +command += "setPoint(" + pc_id + ", " + !value_on_click + ", mango.longPoll.pollRequest.viewId, function() {"; command += "hide(c" + pc_id + "Changing);"; command += "});"; command += "});"; @@ -78,7 +78,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; diff --git a/WebContent/resources/fuscabr/templates/serverside/slider.js b/WebContent/resources/fuscabr/templates/serverside/slider.js index 59c5097133..d314cf372b 100644 --- a/WebContent/resources/fuscabr/templates/serverside/slider.js +++ b/WebContent/resources/fuscabr/templates/serverside/slider.js @@ -59,7 +59,7 @@ function getDataPointType(identifier) { 5: "IMAGE" } - var dpDAO = new com.serotonin.mango.db.dao.DataPointDao(); + var dpDAO = new org.scada_lts.mango.service.DataPointService(); var dp = dpDAO.getDataPoint(identifier); var locator = dp.getPointLocator(); return types[locator.getDataTypeId()]; From 0fd2d54a1df0326c1963d52a6dea575891e6e326 Mon Sep 17 00:00:00 2001 From: patrykb0802 Date: Thu, 16 May 2024 16:31:50 +0200 Subject: [PATCH 7/7] #2503 add alignment and template feature for html and js --- .../resources/fuscabr/templates/serverside/pulseButton.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebContent/resources/fuscabr/templates/serverside/pulseButton.js b/WebContent/resources/fuscabr/templates/serverside/pulseButton.js index ee5deae5dd..deca1c9f94 100644 --- a/WebContent/resources/fuscabr/templates/serverside/pulseButton.js +++ b/WebContent/resources/fuscabr/templates/serverside/pulseButton.js @@ -47,7 +47,7 @@ command += "else if (window.location.pathname.includes("public_view.htm&quo command += "setPoint = ViewDwr.setViewPointAnon;"; command += "show(c" + pc_id + "Changing);"; command += "setPoint(mango.view.anon.viewId, " + pc_id + ", " + value_on_click + ", function() {"; -command += "setPoint(mango.view.anon.viewId, " + pc_id + ", " + value_on_click + ", function() {"; +command += "setPoint(mango.view.anon.viewId, " + pc_id + ", " + !value_on_click + ", function() {"; command += "hide(c" + pc_id + "Changing);"; command += "});"; command += "});";