forked from jakiestfu/Behave.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbehave.min.js
1 lines (1 loc) · 5.72 KB
/
behave.min.js
1
var Behave=Behave||function(h){if(typeof String.prototype.repeat!=="function"){String.prototype.repeat=function(m){if(m<1){return""}if(m%2){return this.repeat(m-1)+this}var l=this.repeat(m/2);return l+l}}if(typeof Array.prototype.filter!=="function"){Array.prototype.filter=function(q){if(this==null){throw new TypeError()}var p=Object(this),l=p.length>>>0;if(typeof q!="function"){throw new TypeError()}var o=[],n=arguments[1];for(var m=0;m<l;m++){if(m in p){var r=p[m];if(q.call(n,r,m,p)){o.push(r)}}}return o}}var c={textarea:null,replaceTab:true,softTabs:true,softTabSize:4,autoOpen:true,overwrite:true,autoStrip:true,autoIndent:true,fence:false},a,g={keyMap:[{open:'"',close:'"',canBreak:false},{open:"'",close:"'",canBreak:false},{open:"(",close:")",canBreak:false},{open:"[",close:"]",canBreak:true},{open:"{",close:"}",canBreak:true}]},i={cursor:{get:function e(){var l=0;if(typeof c.textarea.selectionStart==="number"){l=c.textarea.selectionStart}else{if(document.selection){c.textarea.focus();var m=document.selection.createRange();m.moveStart("character",-c.textarea.value.length);l=m.text.length}}return l},set:function(m){if(c.textarea.setSelectionRange){c.textarea.focus();c.textarea.setSelectionRange(m,m)}else{if(c.textarea.createTextRange){var l=c.textarea.createTextRange();l.collapse(true);l.moveEnd("character",m);l.moveStart("character",m);l.select()}}},select:function(m,l){c.textarea.selectionStart=m;c.textarea.selectionEnd=l},selection:function(){var m=c.textarea.selectionStart,l=c.textarea.selectionEnd;return m!=l?{start:c.textarea.selectionStart,end:c.textarea.selectionEnd}:false}},editor:{get:function(){return c.textarea.value},set:function(l){c.textarea.value=l}},fenceRange:function(){if(typeof c.fence=="string"){var m=i.editor.get(),p=i.cursor.get(),o=0,l=m.indexOf(c.fence),n=0;while(l>=0){n++;if(p<(l+o)){break}o+=l+c.fence.length;m=m.substring(l+c.fence.length);l=m.indexOf(c.fence)}if((o)<p&&((l+o)>p)&&n%2===0){return true}return false}else{return true}},isEven:function(m,l){return l%2},levelsDeep:function(){var r=i.cursor.get(),m=c.textarea.value;var n=m.substring(0,r),t=0,p,o;for(p=0;p<n.length;p++){for(o=0;o<g.keyMap.length;o++){if(g.keyMap[o].canBreak){if(g.keyMap[o].open==n.charAt(p)){t++}if(g.keyMap[o].close==n.charAt(p)){t--}}}}var q=0,s=["'",'"'];for(p in g.keyMap){if(g.keyMap[p].canBreak){for(o in s){q+=n.split(s[o]).filter(i.isEven).join("").split(g.keyMap[p].open).length-1}}}var l=t-q;return l>=0?l:0},deepExtend:function(l,n){for(var m in n){if(n[m]&&n[m].constructor&&n[m].constructor===Object){l[m]=l[m]||{};i.deepExtend(l[m],n[m])}else{l[m]=n[m]}}return l},addEvent:function d(m,l,n){if(m.addEventListener){m.addEventListener(l,n,false)}else{if(m.attachEvent){m.attachEvent("on"+l,n)}}},preventDefaultEvent:function(l){if(l.preventDefault){l.preventDefault()}else{l.returnValue=false}}},j={tabKey:function(p){if(!i.fenceRange()){return}if(p.keyCode==9){i.preventDefaultEvent(p);var s=i.cursor.selection(),r=i.cursor.get(),l=i.editor.get();if(s){var n=s.start;while(n--){if(l.charAt(n)=="\n"){s.start=n+1;break}}var u=l.substring(s.start,s.end),v=u.split("\n"),o;if(p.shiftKey){for(o in v){if(v[o].substring(0,a.length)==a){v[o]=v[o].substring(a.length)}}u=v.join("\n");i.editor.set(l.substring(0,s.start)+u+l.substring(s.end));i.cursor.select(s.start,s.start+u.length)}else{for(o in v){v[o]=a+v[o]}u=v.join("\n");i.editor.set(l.substring(0,s.start)+u+l.substring(s.end));i.cursor.select(s.start,s.start+u.length)}}else{var m=l.substring(0,r),t=l.substring(r),q=m+a+t;if(p.shiftKey){if(l.substring(r-a.length,r)==a){q=l.substring(0,r-a.length)+t;i.editor.set(q);i.cursor.set(r-a.length)}}else{i.editor.set(q);i.cursor.set(r+a.length);return false}}}return true},enterKey:function(r){if(!i.fenceRange()){return}if(r.keyCode==13){i.preventDefaultEvent(r);var u=i.cursor.get(),n=i.editor.get(),o=n.substring(0,u),v=n.substring(u),x=o.charAt(o.length-1),t=v.charAt(0),p=i.levelsDeep(),m="",l="",w,q;if(!p){w=1}else{while(p--){m+=a}m=m;w=m.length+1;for(q in g.keyMap){if(g.keyMap[q].open==x&&g.keyMap[q].close==t){l="\n"}}}var s=o+"\n"+m+l+(m.substring(0,m.length-a.length))+v;i.editor.set(s);i.cursor.set(u+w)}},deleteKey:function(o){if(!i.fenceRange()){return}if(o.keyCode==8){if(i.cursor.selection()===false){var r=i.cursor.get(),l=i.editor.get(),m=l.substring(0,r),s=l.substring(r),t=m.charAt(m.length-1),q=s.charAt(0),n;for(n in g.keyMap){if(g.keyMap[n].open==t&&g.keyMap[n].close==q){i.preventDefaultEvent(o);var p=l.substring(0,r-1)+l.substring(r+1);i.editor.set(p);i.cursor.set(r-1)}}}}}},f={openedChar:function(l,o){i.preventDefaultEvent(o);var r=i.cursor.get(),p=i.editor.get(),n=p.substring(0,r),m=p.substring(r),q=n+l.open+l.close+m;c.textarea.value=q;i.cursor.set(r+1)},closedChar:function(l,n){var p=i.cursor.get(),o=i.editor.get(),m=o.substring(p,p+1);if(m==l.close){i.preventDefaultEvent(n);i.cursor.set(i.cursor.get()+1);return true}return false}},b={filter:function(n){if(!i.fenceRange()){return}var l=String.fromCharCode(n.which||n.keyCode),m;for(m in g.keyMap){if(g.keyMap[m].close==l){var o=c.overwrite&&f.closedChar(g.keyMap[m],n);if(!o&&g.keyMap[m].open==l&&c.autoOpen){f.openedChar(g.keyMap[m],n)}}else{if(g.keyMap[m].open==l&&c.autoOpen){f.openedChar(g.keyMap[m],n)}}}},listen:function(){if(c.replaceTab){i.addEvent(c.textarea,"keydown",j.tabKey)}if(c.autoIndent){i.addEvent(c.textarea,"keydown",j.enterKey)}if(c.autoStrip){i.addEvent(c.textarea,"keydown",j.deleteKey)}i.addEvent(c.textarea,"keypress",b.filter)}},k=function(l){if(l.textarea){i.deepExtend(c,l);if(c.softTabs){a=" ".repeat(c.softTabSize)}else{a="\t"}b.listen()}};this.destroy=function(){c.textarea.removeEventListener("keydown",j.tabKey);c.textarea.removeEventListener("keydown",j.enterKey);c.textarea.removeEventListener("keydown",j.deleteKey);c.textarea.removeEventListener("keypress",b.filter)};k(h)};