123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- ace.define("ace/ext/beautify",[], function(require, exports, module) {
- "use strict";
- var TokenIterator = require("../token_iterator").TokenIterator;
- function is(token, type) {
- return token.type.lastIndexOf(type + ".xml") > -1;
- }
- exports.singletonTags = ["area", "base", "br", "col", "command", "embed", "hr", "html", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"];
- exports.blockTags = ["article", "aside", "blockquote", "body", "div", "dl", "fieldset", "footer", "form", "head", "header", "html", "nav", "ol", "p", "script", "section", "style", "table", "tbody", "tfoot", "thead", "ul"];
- exports.beautify = function(session) {
- var iterator = new TokenIterator(session, 0, 0);
- var token = iterator.getCurrentToken();
- var tabString = session.getTabString();
- var singletonTags = exports.singletonTags;
- var blockTags = exports.blockTags;
- var nextToken;
- var breakBefore = false;
- var spaceBefore = false;
- var spaceAfter = false;
- var code = "";
- var value = "";
- var tagName = "";
- var depth = 0;
- var lastDepth = 0;
- var lastIndent = 0;
- var indent = 0;
- var unindent = 0;
- var roundDepth = 0;
- var onCaseLine = false;
- var row;
- var curRow = 0;
- var rowsToAdd = 0;
- var rowTokens = [];
- var abort = false;
- var i;
- var indentNextLine = false;
- var inTag = false;
- var inCSS = false;
- var inBlock = false;
- var levels = {0: 0};
- var parents = {};
- var trimNext = function() {
- if (nextToken && nextToken.value && nextToken.type !== 'string.regexp')
- nextToken.value = nextToken.value.trim();
- };
- var trimLine = function() {
- code = code.replace(/ +$/, "");
- };
- var trimCode = function() {
- code = code.trimRight();
- breakBefore = false;
- };
- while (token !== null) {
- curRow = iterator.getCurrentTokenRow();
- rowTokens = iterator.$rowTokens;
- nextToken = iterator.stepForward();
- if (typeof token !== "undefined") {
- value = token.value;
- unindent = 0;
- inCSS = (tagName === "style" || session.$modeId === "ace/mode/css");
- if (is(token, "tag-open")) {
- inTag = true;
- if (nextToken)
- inBlock = (blockTags.indexOf(nextToken.value) !== -1);
- if (value === "</") {
- if (inBlock && !breakBefore && rowsToAdd < 1)
- rowsToAdd++;
- if (inCSS)
- rowsToAdd = 1;
- unindent = 1;
- inBlock = false;
- }
- } else if (is(token, "tag-close")) {
- inTag = false;
- } else if (is(token, "comment.start")) {
- inBlock = true;
- } else if (is(token, "comment.end")) {
- inBlock = false;
- }
- if (!inTag && !rowsToAdd && token.type === "paren.rparen" && token.value.substr(0, 1) === "}") {
- rowsToAdd++;
- }
- if (curRow !== row) {
- rowsToAdd = curRow;
- if (row)
- rowsToAdd -= row;
- }
- if (rowsToAdd) {
- trimCode();
- for (; rowsToAdd > 0; rowsToAdd--)
- code += "\n";
- breakBefore = true;
- if (!is(token, "comment") && !token.type.match(/^(comment|string)$/))
- value = value.trimLeft();
- }
- if (value) {
- if (token.type === "keyword" && value.match(/^(if|else|elseif|for|foreach|while|switch)$/)) {
- parents[depth] = value;
- trimNext();
- spaceAfter = true;
- if (value.match(/^(else|elseif)$/)) {
- if (code.match(/\}[\s]*$/)) {
- trimCode();
- spaceBefore = true;
- }
- }
- } else if (token.type === "paren.lparen") {
- trimNext();
- if (value.substr(-1) === "{") {
- spaceAfter = true;
- indentNextLine = false;
- if(!inTag)
- rowsToAdd = 1;
- }
- if (value.substr(0, 1) === "{") {
- spaceBefore = true;
- if (code.substr(-1) !== '[' && code.trimRight().substr(-1) === '[') {
- trimCode();
- spaceBefore = false;
- } else if (code.trimRight().substr(-1) === ')') {
- trimCode();
- } else {
- trimLine();
- }
- }
- } else if (token.type === "paren.rparen") {
- unindent = 1;
- if (value.substr(0, 1) === "}") {
- if (parents[depth-1] === 'case')
- unindent++;
- if (code.trimRight().substr(-1) === '{') {
- trimCode();
- } else {
- spaceBefore = true;
- if (inCSS)
- rowsToAdd+=2;
- }
- }
- if (value.substr(0, 1) === "]") {
- if (code.substr(-1) !== '}' && code.trimRight().substr(-1) === '}') {
- spaceBefore = false;
- indent++;
- trimCode();
- }
- }
- if (value.substr(0, 1) === ")") {
- if (code.substr(-1) !== '(' && code.trimRight().substr(-1) === '(') {
- spaceBefore = false;
- indent++;
- trimCode();
- }
- }
- trimLine();
- } else if ((token.type === "keyword.operator" || token.type === "keyword") && value.match(/^(=|==|===|!=|!==|&&|\|\||and|or|xor|\+=|.=|>|>=|<|<=|=>)$/)) {
- trimCode();
- trimNext();
- spaceBefore = true;
- spaceAfter = true;
- } else if (token.type === "punctuation.operator" && value === ';') {
- trimCode();
- trimNext();
- spaceAfter = true;
- if (inCSS)
- rowsToAdd++;
- } else if (token.type === "punctuation.operator" && value.match(/^(:|,)$/)) {
- trimCode();
- trimNext();
- spaceAfter = true;
- breakBefore = false;
- } else if (token.type === "support.php_tag" && value === "?>" && !breakBefore) {
- trimCode();
- spaceBefore = true;
- } else if (is(token, "attribute-name") && code.substr(-1).match(/^\s$/)) {
- spaceBefore = true;
- } else if (is(token, "attribute-equals")) {
- trimLine();
- trimNext();
- } else if (is(token, "tag-close")) {
- trimLine();
- if(value === "/>")
- spaceBefore = true;
- }
- if (breakBefore && !(token.type.match(/^(comment)$/) && !value.substr(0, 1).match(/^[/#]$/)) && !(token.type.match(/^(string)$/) && !value.substr(0, 1).match(/^['"]$/))) {
- indent = lastIndent;
- if(depth > lastDepth) {
- indent++;
- for (i=depth; i > lastDepth; i--)
- levels[i] = indent;
- } else if(depth < lastDepth)
- indent = levels[depth];
- lastDepth = depth;
- lastIndent = indent;
- if(unindent)
- indent -= unindent;
- if (indentNextLine && !roundDepth) {
- indent++;
- indentNextLine = false;
- }
- for (i = 0; i < indent; i++)
- code += tabString;
- }
- if (token.type === "keyword" && value.match(/^(case|default)$/)) {
- parents[depth] = value;
- depth++;
- }
- if (token.type === "keyword" && value.match(/^(break)$/)) {
- if(parents[depth-1] && parents[depth-1].match(/^(case|default)$/)) {
- depth--;
- }
- }
- if (token.type === "paren.lparen") {
- roundDepth += (value.match(/\(/g) || []).length;
- depth += value.length;
- }
- if (token.type === "keyword" && value.match(/^(if|else|elseif|for|while)$/)) {
- indentNextLine = true;
- roundDepth = 0;
- } else if (!roundDepth && value.trim() && token.type !== "comment")
- indentNextLine = false;
- if (token.type === "paren.rparen") {
- roundDepth -= (value.match(/\)/g) || []).length;
- for (i = 0; i < value.length; i++) {
- depth--;
- if(value.substr(i, 1)==='}' && parents[depth]==='case') {
- depth--;
- }
- }
- }
- if (spaceBefore && !breakBefore) {
- trimLine();
- if (code.substr(-1) !== "\n")
- code += " ";
- }
- code += value;
- if (spaceAfter)
- code += " ";
- breakBefore = false;
- spaceBefore = false;
- spaceAfter = false;
- if ((is(token, "tag-close") && (inBlock || blockTags.indexOf(tagName) !== -1)) || (is(token, "doctype") && value === ">")) {
- if (inBlock && nextToken && nextToken.value === "</")
- rowsToAdd = -1;
- else
- rowsToAdd = 1;
- }
- if (is(token, "tag-open") && value === "</") {
- depth--;
- } else if (is(token, "tag-open") && value === "<" && singletonTags.indexOf(nextToken.value) === -1) {
- depth++;
- } else if (is(token, "tag-name")) {
- tagName = value;
- } else if (is(token, "tag-close") && value === "/>" && singletonTags.indexOf(tagName) === -1){
- depth--;
- }
- row = curRow;
- }
- }
- token = nextToken;
- }
- code = code.trim();
- session.doc.setValue(code);
- };
- exports.commands = [{
- name: "beautify",
- exec: function(editor) {
- exports.beautify(editor.session);
- },
- bindKey: "Ctrl-Shift-B"
- }];
- });
- (function() {
- ace.require(["ace/ext/beautify"], function(m) {
- if (typeof module == "object" && typeof exports == "object" && module) {
- module.exports = m;
- }
- });
- })();
-
|