From a740ef91e6689f86011b70c7bbe2589abf78ae6b Mon Sep 17 00:00:00 2001 From: patdenice Date: Tue, 12 Apr 2011 11:12:51 +0000 Subject: feature:2262 Replace editarea by Codemirror: http://codemirror.net git-svn-id: http://piwigo.org/svn/trunk@10307 68402e56-0260-453c-a942-63ccdbb3a9ee --- .../codemirror/mode/php/index.html | 52 ++++++++++++++ .../LocalFilesEditor/codemirror/mode/php/php.js | 83 ++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 plugins/LocalFilesEditor/codemirror/mode/php/index.html create mode 100644 plugins/LocalFilesEditor/codemirror/mode/php/php.js (limited to 'plugins/LocalFilesEditor/codemirror/mode/php') diff --git a/plugins/LocalFilesEditor/codemirror/mode/php/index.html b/plugins/LocalFilesEditor/codemirror/mode/php/index.html new file mode 100644 index 000000000..020e24898 --- /dev/null +++ b/plugins/LocalFilesEditor/codemirror/mode/php/index.html @@ -0,0 +1,52 @@ + + + + CodeMirror 2: PHP mode + + + + + + + + + + + + + + + +

CodeMirror 2: PHP mode

+ +
+ + + +

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

+ +

MIME types defined: application/x-httpd-php.

+ + diff --git a/plugins/LocalFilesEditor/codemirror/mode/php/php.js b/plugins/LocalFilesEditor/codemirror/mode/php/php.js new file mode 100644 index 000000000..a23538f6b --- /dev/null +++ b/plugins/LocalFilesEditor/codemirror/mode/php/php.js @@ -0,0 +1,83 @@ +(function() { + function keywords(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var phpKeywords = + keywords("abstract and array as break case catch cfunction 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 try use var while xor"); + + CodeMirror.defineMode("php", function(config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, "text/html"); + var jsMode = CodeMirror.getMode(config, "text/javascript"); + var cssMode = CodeMirror.getMode(config, "text/css"); + var phpMode = CodeMirror.getMode(config, {name: "clike", keywords: phpKeywords, multiLineStrings: true, $vars: true}); + + function dispatch(stream, state) { // TODO open PHP inside text/css + if (state.curMode == htmlMode) { + var style = htmlMode.token(stream, state.curState); + if (style == "xml-processing" && /^<\?/.test(stream.current())) { + state.curMode = phpMode; + state.curState = state.php; + state.curClose = /^\?>/; + } + else if (style == "xml-tag" && stream.current() == ">" && state.curState.context) { + if (/^script$/i.test(state.curState.context.tagName)) { + state.curMode = jsMode; + state.curState = jsMode.startState(htmlMode.indent(state.curState, "")); + state.curClose = /^<\/\s*script\s*>/i; + } + else if (/^style$/i.test(state.curState.context.tagName)) { + state.curMode = cssMode; + state.curState = cssMode.startState(htmlMode.indent(state.curState, "")); + state.curClose = /^<\/\s*style\s*>/i; + } + } + return style; + } + else if (stream.match(state.curClose, false)) { + state.curMode = htmlMode; + state.curState = state.html; + state.curClose = null; + return dispatch(stream, state); + } + else return state.curMode.token(stream, state.curState); + } + + return { + startState: function() { + var html = htmlMode.startState(); + return {html: html, + php: phpMode.startState(), + curMode: htmlMode, + curState: html, + curClose: null} + }, + + copyState: function(state) { + var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), + php = state.php, phpNew = CodeMirror.copyState(phpMode, php), cur; + if (state.curState == html) cur = htmlNew; + else if (state.curState == php) cur = phpNew; + else cur = CodeMirror.copyState(state.curMode, state.curState); + return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, curClose: state.curClose}; + }, + + token: dispatch, + + indent: function(state, textAfter) { + if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || + (state.curMode == phpMode && /^\?>/.test(textAfter))) + return htmlMode.indent(state.html, textAfter); + return state.curMode.indent(state.curState, textAfter); + }, + + electricChars: "/{}:" + } + }); +})(); + +CodeMirror.defineMIME("application/x-httpd-php", "php"); -- cgit v1.2.3