From 9991285d490bef6c73047ddde65ad8d61c4265ca Mon Sep 17 00:00:00 2001 From: Christian von Arnim Date: Fri, 17 May 2013 12:38:37 +0200 Subject: [PATCH] Add FileExtensionTextMode plugin a plugin to customize the join of file extension and the text mode. also add an API to the editor for this. --- components/editor/init.js | 85 ++++----- components/fileExtTextMode/defaultValues.php | 107 +++++++++++ .../fileExtTextMode/fileExtTextModeForm.php | 56 ++++++ .../fileExtTextMode/getFileExtTextModes.php | 19 ++ components/fileExtTextMode/init.js | 167 ++++++++++++++++++ components/fileExtTextMode/plugin.json | 14 ++ components/fileExtTextMode/process.php | 65 +++++++ components/right_bar.json | 5 + 8 files changed, 476 insertions(+), 42 deletions(-) create mode 100644 components/fileExtTextMode/defaultValues.php create mode 100644 components/fileExtTextMode/fileExtTextModeForm.php create mode 100644 components/fileExtTextMode/getFileExtTextModes.php create mode 100644 components/fileExtTextMode/init.js create mode 100644 components/fileExtTextMode/plugin.json create mode 100644 components/fileExtTextMode/process.php diff --git a/components/editor/init.js b/components/editor/init.js index 4475a56..9df0019 100755 --- a/components/editor/init.js +++ b/components/editor/init.js @@ -337,6 +337,8 @@ rootContainer: null, + fileExtensionTextMode: {}, + init: function(){ this.createSplitMenu(); this.createModeMenu(); @@ -747,58 +749,57 @@ ///////////////////////////////////////////////////////////////// // - // Select file mode by extension + // Select file mode by extension case insensitive // // Parameters: - // e - {String} File extension + // e - {String} File extension // ///////////////////////////////////////////////////////////////// selectMode: function(e) { - switch (e) { - case 'html': - case 'htm': - case 'tpl': - return 'html'; - case 'js': - return 'javascript'; - case 'css': - return 'css'; - case 'scss': - case 'sass': - return 'scss'; - case 'less': - return 'less'; - case 'php': - case 'php5': - case 'phtml': - return 'php'; - case 'json': - return 'json'; - case 'xml': - return 'xml'; - case 'sql': - return 'sql'; - case 'md': - return 'markdown'; - case 'c': - case 'cpp': - case 'h': - case 'hpp': - return 'c_cpp'; - case 'py': - return 'python'; - case 'rb': - return 'ruby'; - case 'jade': - return 'jade'; - case 'coffee': - return 'coffee'; - default: + if(typeof(e) != 'string'){ + return 'text'; + } + e = e.toLowerCase(); + + if(e in this.fileExtensionTextMode){ + return this.fileExtensionTextMode[e]; + }else{ return 'text'; } }, + ///////////////////////////////////////////////////////////////// + // + // Add an text mode for an extension + // + // Parameters: + // extension - {String} File Extension + // mode - {String} TextMode for this extension + // + ///////////////////////////////////////////////////////////////// + + addFileExtensionTextMode: function(extension, mode){ + if(typeof(extension) != 'string' || typeof(mode) != 'string'){ + if (console){ + console.warn('wrong usage of addFileExtensionTextMode, both parameters need to be string'); + } + return; + } + mode = mode.toLowerCase(); + this.fileExtensionTextMode[extension] = mode; + }, + + ///////////////////////////////////////////////////////////////// + // + // clear all extension-text mode joins + // + ///////////////////////////////////////////////////////////////// + + clearFileExtensionTextMode: function(){ + this.fileExtensionTextMode = {}; + }, + ///////////////////////////////////////////////////////////////// // // Set the editor mode diff --git a/components/fileExtTextMode/defaultValues.php b/components/fileExtTextMode/defaultValues.php new file mode 100644 index 0000000..dcf71c2 --- /dev/null +++ b/components/fileExtTextMode/defaultValues.php @@ -0,0 +1,107 @@ + 'html', + 'htm' => 'html', + 'tpl' => 'html', + 'js' => 'javascript', + 'css' => 'css', + 'scss' => 'scss', + 'sass' => 'scss', + 'less' => 'less', + 'php' => 'php', + 'php4' => 'php', + 'php5' => 'php', + 'phtml' => 'php', + 'json' => 'json', + 'xml' => 'xml', + 'sql' => 'sql', + 'md' => 'markdown', + 'c' => 'c_cpp', + 'cpp' => 'c_cpp', + 'h' => 'c_cpp', + 'hpp' => 'c_cpp', + 'py' => 'python', + 'rb' => 'ruby', + 'jade' => 'jade', + 'coffee' => 'coffee'); + +$availiableTextModes = array( + 'abap', + 'asciidoc', + 'c9search', + 'c_cpp', + 'clojure', + 'coffee', + 'coldfusion', + 'csharp', + 'css', + 'curly', + 'dart', + 'diff', + 'django', + 'dot', + 'ftl', + 'glsl', + 'golang', + 'groovy', + 'haml', + 'haxe', + 'html', + 'jade', + 'java', + 'javascript', + 'json', + 'jsp', + 'jsx', + 'latex', + 'less', + 'liquid', + 'lisp', + 'livescript', + 'logiql', + 'lsl', + 'lua', + 'luapage', + 'lucene', + 'makefile', + 'markdown', + 'mushcode', + 'objectivec', + 'ocaml', + 'pascal', + 'perl', + 'pgsql', + 'php', + 'powershell', + 'python', + 'r', + 'rdoc', + 'rhtml', + 'ruby', + 'sass', + 'scad', + 'scala', + 'scheme', + 'scss', + 'sh', + 'sql', + 'stylus', + 'svg', + 'tcl', + 'tex', + 'text', + 'textile', + 'tmsnippet', + 'toml', + 'typescript', + 'vbscript', + 'velocity', + 'xml', + 'xquery', + 'yaml' + ); + +?> \ No newline at end of file diff --git a/components/fileExtTextMode/fileExtTextModeForm.php b/components/fileExtTextMode/fileExtTextModeForm.php new file mode 100644 index 0000000..a4be119 --- /dev/null +++ b/components/fileExtTextMode/fileExtTextModeForm.php @@ -0,0 +1,56 @@ +'."\n"; + foreach($availiableTextModes as $textmode){ + $ret .= ' '."\n"; + } + + if(!$find && $extension != ''){ + $ret .= ' '."\n"; + } + + $ret .= ''."\n"; + + return $ret; +} + +$ext = false; +//ignore warnings +$ext = @Common::getJSON('fileExtensions.php'); + +if(!is_array($ext)){ + //default extensions + $ext = $defaultExtensions; +} + +if(!@ksort($ext) || !@ksort($availiableTextModes)){ + die(json_encode(array('status' => 'error', 'msg' => 'Internal PHP error.') )); +} + +//echo '
'."\n"; +echo '
'; + + foreach($ext as $ex => $mode){ + echo '   '; + echo getTextModeSelect($mode) . "
\n"; + } + +echo '
'; +echo 'add field... '."
\n"; +echo ''; +//echo '
'."\n"; +?> \ No newline at end of file diff --git a/components/fileExtTextMode/getFileExtTextModes.php b/components/fileExtTextMode/getFileExtTextModes.php new file mode 100644 index 0000000..20109a9 --- /dev/null +++ b/components/fileExtTextMode/getFileExtTextModes.php @@ -0,0 +1,19 @@ + 'success', 'msg' => 'Extensions send', 'extensions' => $ext)); + +?> \ No newline at end of file diff --git a/components/fileExtTextMode/init.js b/components/fileExtTextMode/init.js new file mode 100644 index 0000000..b878a3c --- /dev/null +++ b/components/fileExtTextMode/init.js @@ -0,0 +1,167 @@ +var debug; +(function(global, $) { + + $(function() { + codiad.fileExtTextMode.init(); + }); + + global.codiad.fileExtTextMode = { + + pluginDir:'components/FileExtTextMode/', + + availableTextModes :[ + 'abap', + 'asciidoc', + 'c9search', + 'c_cpp', + 'clojure', + 'coffee', + 'coldfusion', + 'csharp', + 'css', + 'curly', + 'dart', + 'diff', + 'django', + 'dot', + 'ftl', + 'glsl', + 'golang', + 'groovy', + 'haml', + 'haxe', + 'html', + 'jade', + 'java', + 'javascript', + 'json', + 'jsp', + 'jsx', + 'latex', + 'less', + 'liquid', + 'lisp', + 'livescript', + 'logiql', + 'lsl', + 'lua', + 'luapage', + 'lucene', + 'makefile', + 'markdown', + 'mushcode', + 'objectivec', + 'ocaml', + 'pascal', + 'perl', + 'pgsql', + 'php', + 'powershell', + 'python', + 'r', + 'rdoc', + 'rhtml', + 'ruby', + 'sass', + 'scad', + 'scala', + 'scheme', + 'scss', + 'sh', + 'sql', + 'stylus', + 'svg', + 'tcl', + 'tex', + 'text', + 'textile', + 'tmsnippet', + 'toml', + 'typescript', + 'vbscript', + 'velocity', + 'xml', + 'xquery', + 'yaml' + ], + + init : function() { + this.initEditorFileExtensionTextModes(); + }, + + formWidth : 300, + + open : function() { + codiad.modal.load(this.formWidth, + this.pluginDir+'fileExtTextModeForm.php'); + codiad.modal.hideOverlay(); + }, + + sendForm : function(){ + var $div = $('#FileExtTextModeDiv'); + var extensions = $div.find('.FileExtension'); + var formData = {'extension[]' : [], 'textMode[]' : []}; + for(var i = 0; i < extensions.size(); ++i){ + formData['extension[]'].push(extensions[i].value); + } + + var textMode = $div.find('.textMode'); + for(var i = 0; i < textMode.size(); ++i){ + formData['textMode[]'].push(textMode[i].value); + } + + $.post(this.pluginDir+'process.php', formData, codiad.fileExtTextMode.setEditorFileExtensionTextModes); + + codiad.modal.unload(); + }, + + addFieldToForm : function(){ + var $div = $('#FileExtTextModeDiv'); + + var code = '   '; + code += '
'; + + $div.append(code); + + //scroll as far down as possible + $div.scrollTop(1000000); + }, + + showStatus : function(resp) { + resp = $.parseJSON(resp); + switch (resp.status) { + case 'success': + codiad.message.success(resp.msg); + break; + case 'error': + codiad.message.error(resp.msg); + break; + case 'notice': + codiad.message.notice(resp.msg); + break; + }; + }, + + initEditorFileExtensionTextModes : function(){ + $.get(this.pluginDir+'getFileExtTextModes.php', {}, this.setEditorFileExtensionTextModes); + }, + + setEditorFileExtensionTextModes : function(data){ + resp = $.parseJSON(data); + if(resp.status != 'error' && resp.extensions != undefined){ + codiad.editor.clearFileExtensionTextMode(); + + for(i in resp.extensions){ + codiad.editor.addFileExtensionTextMode(i, resp.extensions[i]); + } + } + codiad.fileExtTextMode.showStatus(data); + } + + + }; +})(this, jQuery); \ No newline at end of file diff --git a/components/fileExtTextMode/plugin.json b/components/fileExtTextMode/plugin.json new file mode 100644 index 0000000..0fe65d0 --- /dev/null +++ b/components/fileExtTextMode/plugin.json @@ -0,0 +1,14 @@ +[{ + "author": "ccvca", + "version": "0.5", + "name": "FileExtentionTextMode", + "url": "", + "rightbar": [ + { + "action": "codiad.fileExtTextMode.open();", + "icon": "icon-tools", + "title": "File extensions" + } + ], + "contextmenu": [] +}] \ No newline at end of file diff --git a/components/fileExtTextMode/process.php b/components/fileExtTextMode/process.php new file mode 100644 index 0000000..d92ec3f --- /dev/null +++ b/components/fileExtTextMode/process.php @@ -0,0 +1,65 @@ + 'success', 'msg' => 'No Content.')); + +//Store Fileextensions and Textmodes in File: + +function validateExtension($extension){ + return preg_match('#^[a-z0-9\_]+$#i', $extension); +} + +function validTextMode($mode){ + global $availiableTextModes; + return in_array($mode, $availiableTextModes); +} + +if(!isset($_POST['extension']) || !is_array($_POST['extension']) + || !isset($_POST['textMode']) || !is_array($_POST['textMode'])){ + die(json_encode(array('status' => 'error', 'msg' => 'incorrect data send'))); +} + +$exMap = array(); + +$warning = ''; + +foreach ($_POST['extension'] as $key => $extension){ + if(trim($extension) == '' ){ + continue; + } + + if(!isset($_POST["textMode"][$key])){ + die(json_encode(array('status' => 'error', 'msg' => 'incorrect data send.'))); + } + + $extension = strtolower(trim($extension)); + $textMode = strtolower(trim($_POST["textMode"][$key])); + + if(!validateExtension($extension)){ + die(json_encode(array('status' => 'error', 'msg' => 'incorrect extension:'.htmlentities($extension)))); + } + + if(!validTextMode($textMode)){ + die(json_encode(array('status' => 'error', 'msg' => 'incorrect text mode:'.htmlentities($textMode)))); + } + + if(isset($exMap[$extension])){ + $warning = htmlentities($extension).' is already set.
'; + }else{ + $exMap[$extension] = $textMode; + } +} + + +Common::saveJSON('fileExtensions.php', $exMap); +if($warning != ''){ + echo json_encode(array('status' => 'warning', 'msg' => $warning, 'extensions' => $exMap )); +}else{ + echo json_encode(array('status' => 'success', 'msg' => 'File extensions are saved successfully.', 'extensions' => $exMap)); +} + +?> \ No newline at end of file diff --git a/components/right_bar.json b/components/right_bar.json index a152c0b..735665b 100755 --- a/components/right_bar.json +++ b/components/right_bar.json @@ -39,6 +39,11 @@ "icon": "icon-doc-text", "onclick": "codiad.modal.load(400, 'components/editor/dialog.php?action=settings');codiad.modal.hideOverlay();" }, + { + "title": "File extensions", + "icon": "icon-tools", + "onclick": "codiad.fileExtTextMode.open();" + }, { "title": "Plugins", "icon": "icon-tag",