diff options
Diffstat (limited to 'www/wiki/extensions/CodeEditor/modules/ace/ext-beautify.js')
-rw-r--r-- | www/wiki/extensions/CodeEditor/modules/ace/ext-beautify.js | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/www/wiki/extensions/CodeEditor/modules/ace/ext-beautify.js b/www/wiki/extensions/CodeEditor/modules/ace/ext-beautify.js new file mode 100644 index 00000000..ba499b77 --- /dev/null +++ b/www/wiki/extensions/CodeEditor/modules/ace/ext-beautify.js @@ -0,0 +1,334 @@ +ace.define("ace/ext/beautify/php_rules",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; +var TokenIterator = require("ace/token_iterator").TokenIterator; +exports.newLines = [{ + type: 'support.php_tag', + value: '<?php' +}, { + type: 'support.php_tag', + value: '<?' +}, { + type: 'support.php_tag', + value: '?>' +}, { + type: 'paren.lparen', + value: '{', + indent: true +}, { + type: 'paren.rparen', + breakBefore: true, + value: '}', + indent: false +}, { + type: 'paren.rparen', + breakBefore: true, + value: '})', + indent: false, + dontBreak: true +}, { + type: 'comment' +}, { + type: 'text', + value: ';' +}, { + type: 'text', + value: ':', + context: 'php' +}, { + type: 'keyword', + value: 'case', + indent: true, + dontBreak: true +}, { + type: 'keyword', + value: 'default', + indent: true, + dontBreak: true +}, { + type: 'keyword', + value: 'break', + indent: false, + dontBreak: true +}, { + type: 'punctuation.doctype.end', + value: '>' +}, { + type: 'meta.tag.punctuation.end', + value: '>' +}, { + type: 'meta.tag.punctuation.begin', + value: '<', + blockTag: true, + indent: true, + dontBreak: true +}, { + type: 'meta.tag.punctuation.begin', + value: '</', + indent: false, + breakBefore: true, + dontBreak: true +}, { + type: 'punctuation.operator', + value: ';' +}]; + +exports.spaces = [{ + type: 'xml-pe', + prepend: true +},{ + type: 'entity.other.attribute-name', + prepend: true +}, { + type: 'storage.type', + value: 'var', + append: true +}, { + type: 'storage.type', + value: 'function', + append: true +}, { + type: 'keyword.operator', + value: '=' +}, { + type: 'keyword', + value: 'as', + prepend: true, + append: true +}, { + type: 'keyword', + value: 'function', + append: true +}, { + type: 'support.function', + next: /[^\(]/, + append: true +}, { + type: 'keyword', + value: 'or', + append: true, + prepend: true +}, { + type: 'keyword', + value: 'and', + append: true, + prepend: true +}, { + type: 'keyword', + value: 'case', + append: true +}, { + type: 'keyword.operator', + value: '||', + append: true, + prepend: true +}, { + type: 'keyword.operator', + value: '&&', + append: true, + prepend: true +}]; +exports.singleTags = ['!doctype','area','base','br','hr','input','img','link','meta']; + +exports.transform = function(iterator, maxPos, context) { + var token = iterator.getCurrentToken(); + + var newLines = exports.newLines; + var spaces = exports.spaces; + var singleTags = exports.singleTags; + + var code = ''; + + var indentation = 0; + var dontBreak = false; + var tag; + var lastTag; + var lastToken = {}; + var nextTag; + var nextToken = {}; + var breakAdded = false; + var value = ''; + + while (token!==null) { + console.log(token); + + if( !token ){ + token = iterator.stepForward(); + continue; + } + if( token.type == 'support.php_tag' && token.value != '?>' ){ + context = 'php'; + } + else if( token.type == 'support.php_tag' && token.value == '?>' ){ + context = 'html'; + } + else if( token.type == 'meta.tag.name.style' && context != 'css' ){ + context = 'css'; + } + else if( token.type == 'meta.tag.name.style' && context == 'css' ){ + context = 'html'; + } + else if( token.type == 'meta.tag.name.script' && context != 'js' ){ + context = 'js'; + } + else if( token.type == 'meta.tag.name.script' && context == 'js' ){ + context = 'html'; + } + + nextToken = iterator.stepForward(); + if (nextToken && nextToken.type.indexOf('meta.tag.name') == 0) { + nextTag = nextToken.value; + } + if ( lastToken.type == 'support.php_tag' && lastToken.value == '<?=') { + dontBreak = true; + } + if (token.type == 'meta.tag.name') { + token.value = token.value.toLowerCase(); + } + if (token.type == 'text') { + token.value = token.value.trim(); + } + if (!token.value) { + token = nextToken; + continue; + } + value = token.value; + for (var i in spaces) { + if ( + token.type == spaces[i].type && + (!spaces[i].value || token.value == spaces[i].value) && + ( + nextToken && + (!spaces[i].next || spaces[i].next.test(nextToken.value)) + ) + ) { + if (spaces[i].prepend) { + value = ' ' + token.value; + } + + if (spaces[i].append) { + value += ' '; + } + } + } + if (token.type.indexOf('meta.tag.name') == 0) { + tag = token.value; + } + breakAdded = false; + for (i in newLines) { + if ( + token.type == newLines[i].type && + ( + !newLines[i].value || + token.value == newLines[i].value + ) && + ( + !newLines[i].blockTag || + singleTags.indexOf(nextTag) === -1 + ) && + ( + !newLines[i].context || + newLines[i].context === context + ) + ) { + if (newLines[i].indent === false) { + indentation--; + } + + if ( + newLines[i].breakBefore && + ( !newLines[i].prev || newLines[i].prev.test(lastToken.value) ) + ) { + code += "\n"; + breakAdded = true; + for (i = 0; i < indentation; i++) { + code += "\t"; + } + } + + break; + } + } + + if (dontBreak===false) { + for (i in newLines) { + if ( + lastToken.type == newLines[i].type && + ( + !newLines[i].value || lastToken.value == newLines[i].value + ) && + ( + !newLines[i].blockTag || + singleTags.indexOf(tag) === -1 + ) && + ( + !newLines[i].context || + newLines[i].context === context + ) + ) { + if (newLines[i].indent === true) { + indentation++; + } + + if (!newLines[i].dontBreak && !breakAdded) { + code += "\n"; + for (i = 0; i < indentation; i++) { + code += "\t"; + } + } + + break; + } + } + } + + code += value; + if ( lastToken.type == 'support.php_tag' && lastToken.value == '?>' ) { + dontBreak = false; + } + lastTag = tag; + + lastToken = token; + + token = nextToken; + + if (token===null) { + break; + } + } + + return code; +}; + + + +}); + +ace.define("ace/ext/beautify",["require","exports","module","ace/token_iterator","ace/ext/beautify/php_rules"], function(require, exports, module) { +"use strict"; +var TokenIterator = require("ace/token_iterator").TokenIterator; + +var phpTransform = require("./beautify/php_rules").transform; + +exports.beautify = function(session) { + var iterator = new TokenIterator(session, 0, 0); + var token = iterator.getCurrentToken(); + + var context = session.$modeId.split("/").pop(); + + var code = phpTransform(iterator, context); + 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() {}); + })(); +
\ No newline at end of file |