/* * Copyright (c) Codiad & Andr3as, distributed * as-is and without warranty under the MIT License. * See http://opensource.org/licenses/MIT for more information. * This information must remain intact. */ (function(global, $){ var codiad = global.codiad, scripts = document.getElementsByTagName('script'), path = scripts[scripts.length-1].src.split('?')[0], curpath = path.split('/').slice(0, -1).join('/')+'/'; $(function() { codiad.Beautify.init(); }); codiad.Beautify = { path: curpath, beautifyPhp: null, lines: 0, row: 0, settings: { js: false, json: false, html: false, css: false, auto: false }, files: ["html", "htm", "js", "json", "css", "php"], init: function() { var _this = this; //Load libs $.getScript(this.path+"libs/beautify-css.js"); $.getScript(this.path+"libs/beautify-html.js"); $.getScript(this.path+"libs/beautify.js"); $.getScript(this.path+"libs/ext-beautify.js", function() { _this.beautifyPhp = ace.require("ace/ext/beautify"); }); //Load settings this.load(); //Set subscriptions amplify.subscribe('active.onOpen', function(path){ if(codiad.editor.getActive() === null) return; var manager = codiad.editor.getActive().commands; manager.addCommand({ name: "Beautify", bindKey: {win: "Ctrl-Alt-B", mac: "Command-Alt-B"}, exec: function(){ _this.beautify(); } }); }); amplify.subscribe('active.onSave', function(path){ path = path || codiad.active.getPath(); var ext = _this.getExtension(path); if (_this.files.indexOf(ext) != -1) { if (_this.check(path)) { var content = codiad.editor.getContent(); _this.lines = _this.getLines(); _this.row = codiad.editor.getActive().getCursorPosition().row; content = _this.beautifyContent(path, content); if (typeof(content) !== 'string') { return true; } codiad.editor.setContent(content); _this.guessCursorPosition(); } } }); amplify.subscribe('context-menu.onShow', function(obj){ var ext = _this.getExtension(obj.path); if (_this.files.indexOf(ext) != -1 && ext !== "php") { $('#context-menu').append('
'); $('#context-menu').append('Beautify'); } }); amplify.subscribe('context-menu.onHide', function(){ $('.beautify').remove(); }); amplify.subscribe('settings.dialog.save', function(){ if ($('#beautify_form').length > 0) { codiad.Beautify.save(); } }); }, ////////////////////////////////////////////////////////// // // Show settings dialog // ////////////////////////////////////////////////////////// showDialog: function() { codiad.modal.load(200, this.path+"dialog.php"); }, ////////////////////////////////////////////////////////// // // Save new settings // ////////////////////////////////////////////////////////// save: function() { var _this = this; this.checkSettings("js"); this.checkSettings("json"); this.checkSettings("html"); this.checkSettings("css"); this.checkSettings("php"); $.post(this.path+"controller.php?action=save", {settings: JSON.stringify(this.settings)}, function(data){ var json = JSON.parse(data); if (json.status == "error") { codiad.message.error(json.message); } else { codiad.message.success(json.message); } _this.load(); }); }, ////////////////////////////////////////////////////////// // // Load existing settings // ////////////////////////////////////////////////////////// load: function() { var _this = this; $.getJSON(this.path+"controller.php?action=load", function(json){ _this.settings = json; }); }, ////////////////////////////////////////////////////////// // // Display settings in the dialog // ////////////////////////////////////////////////////////// get: function() { this.setSettings("js"); this.setSettings("json"); this.setSettings("html"); this.setSettings("css"); this.setSettings("php"); }, ////////////////////////////////////////////////////////// // // Get number of lines of current document // // Parameters // // content - {string} - (optional) Content of current document // ////////////////////////////////////////////////////////// getLines: function(content) { content = content || codiad.editor.getContent(); return (content.match(/\n/g) || []).length + 1; }, ////////////////////////////////////////////////////////// // // Guess the cursor position after beautifying content // ////////////////////////////////////////////////////////// guessCursorPosition: function() { if (localStorage.getItem("codiad.plugin.beautify.guessCursorPosition") == "true") { var newLines= this.getLines(); var factor = newLines / this.lines; var newRow = Math.floor(factor * this.row); codiad.editor.getActive().clearSelection(); codiad.editor.getActive().moveCursorToPosition({"row":newRow, "column":0}); } }, ////////////////////////////////////////////////////////// // // Set checkbox of dialog given by extension // // Parameters // // ext - {string} - Extension of id of checkbox // ////////////////////////////////////////////////////////// setSettings: function(ext) { if (this.settings.auto[ext] === true) { $('#beautify_'+ext).attr("checked", "checked"); } }, ////////////////////////////////////////////////////////// // // Check checkboxes and store status // // Parameters // // ext - {string} - Extension of id of checkbox // ////////////////////////////////////////////////////////// checkSettings: function(ext) { if ($('#beautify_'+ext).attr("checked") == "checked") { this.settings.auto[ext] = true; } else { this.settings.auto[ext] = false; } }, ////////////////////////////////////////////////////////// // // Function to handle context menu click // // Parameters // // path - {string} - File path of the clicked file // ////////////////////////////////////////////////////////// contextMenu: function(path) { var _this = this; $.get(this.path+"controller.php?action=getContent&path="+path, function(data){ var content = _this.beautifyContent(path, data); $.post(_this.path+"controller.php?action=saveContent&path="+path, {"content": content}, function(result){ var json = JSON.parse(result); if (json.status == "error") { codiad.message.error(json.message); } else { codiad.message.success(json.message); } }); }); }, ////////////////////////////////////////////////////////// // // Beautify content // // Parameters // // path - {string} - File path // content - {string} - Content to beautify // settings - {object} - Settings for beautify // ////////////////////////////////////////////////////////// beautifyContent: function(path, content, settings) { this.checkBeautifySettings(); if (typeof(settings) == 'undefined') { settings = this.settings.beautify; } var ext = this.getExtension(path); if (ext == "html" || ext == "htm") { return html_beautify(content, settings); } else if (ext == "css") { return css_beautify(content, settings); } else if (ext == "js" || ext == "json") { return js_beautify(content, settings); } else if (ext == "php") { this.beautifyPhp.beautify(codiad.editor.getActive().getSession()); return true; } else { return false; } }, ////////////////////////////////////////////////////////// // // Beautify command to handle hotkey // ////////////////////////////////////////////////////////// beautify: function() { var _this = this; var settings = this.settings.beautify; var path = codiad.active.getPath(); var editor = codiad.editor.getActive(); var session = editor.getSession(); var selText = codiad.editor.getSelectedText(); var range = editor.selection.getRange(); var fn = function(range, text) { if (typeof(text) == 'undefined') { settings.indent_level = "keep"; range.start.column = 0; text = session.getTextRange(range); } text = _this.beautifyContent(path, text, settings); if (typeof(text) == 'string') { session.replace(range, text); } }; if (selText !== "") { if (editor.selection.inMultiSelectMode) { var multiRanges = editor.selection.getAllRanges(); for (var i = 0; i < multiRanges.length; i++) { fn(multiRanges[i]); } } else { //Single selection fn(range); } } else { this.row = codiad.editor.getActive().getCursorPosition().row; this.lines = this.getLines(); var content = codiad.editor.getContent(); range = editor.selectAll() || editor.selection.getRange(); fn(range, content); this.guessCursorPosition(); } }, ////////////////////////////////////////////////////////// // // Get settings for given file path // // Parameters // // path - {string} - File path // ////////////////////////////////////////////////////////// check: function(path) { var ext = this.getExtension(path); if (ext == "htm") { ext = "html"; } return this.settings.auto[ext]; }, ////////////////////////////////////////////////////////// // // Check settings for beautify // ////////////////////////////////////////////////////////// checkBeautifySettings: function() { var char = ""; var tab = 1; if (codiad.editor.settings.softTabs) { char = " "; tab = 4; } else { char = "\t"; tab = 1; } this.settings.beautify.indent_char = char; this.settings.beautify.indent_size = tab; }, ////////////////////////////////////////////////////////// // // Get extension of file // // Parameters // // path - {string} - File path // ////////////////////////////////////////////////////////// getExtension: function(path) { return path.substring(path.lastIndexOf(".")+1); } }; })(this, jQuery);