rails_execution 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"],function(e,s,t){"use strict";function i(e){e=(new Date).toLocaleString("en-us",e);return 1==e.length?"0"+e:e}var n=e("./lib/dom"),o=e("./lib/oop"),r=e("./lib/event_emitter").EventEmitter,c=e("./lib/lang"),l=e("./range").Range,h=e("./range_list").RangeList,a=e("./keyboard/hash_handler").HashHandler,p=e("./tokenizer").Tokenizer,d=e("./clipboard"),u={CURRENT_WORD:function(e){return e.session.getTextRange(e.session.getWordRange())},SELECTION:function(e,t,i){e=e.session.getTextRange();return i?e.replace(/\n\r?([ \t]*\S)/g,"\n"+i+"$1"):e},CURRENT_LINE:function(e){return e.session.getLine(e.getCursorPosition().row)},PREV_LINE:function(e){return e.session.getLine(e.getCursorPosition().row-1)},LINE_INDEX:function(e){return e.getCursorPosition().row},LINE_NUMBER:function(e){return e.getCursorPosition().row+1},SOFT_TABS:function(e){return e.session.getUseSoftTabs()?"YES":"NO"},TAB_SIZE:function(e){return e.session.getTabSize()},CLIPBOARD:function(e){return d.getText&&d.getText()},FILENAME:function(e){return/[^/\\]*$/.exec(this.FILEPATH(e))[0]},FILENAME_BASE:function(e){return/[^/\\]*$/.exec(this.FILEPATH(e))[0].replace(/\.[^.]*$/,"")},DIRECTORY:function(e){return this.FILEPATH(e).replace(/[^/\\]*$/,"")},FILEPATH:function(e){return"/not implemented.txt"},WORKSPACE_NAME:function(){return"Unknown"},FULLNAME:function(){return"Unknown"},BLOCK_COMMENT_START:function(e){e=e.session.$mode||{};return e.blockComment&&e.blockComment.start||""},BLOCK_COMMENT_END:function(e){e=e.session.$mode||{};return e.blockComment&&e.blockComment.end||""},LINE_COMMENT:function(e){return(e.session.$mode||{}).lineCommentStart||""},CURRENT_YEAR:i.bind(null,{year:"numeric"}),CURRENT_YEAR_SHORT:i.bind(null,{year:"2-digit"}),CURRENT_MONTH:i.bind(null,{month:"numeric"}),CURRENT_MONTH_NAME:i.bind(null,{month:"long"}),CURRENT_MONTH_NAME_SHORT:i.bind(null,{month:"short"}),CURRENT_DATE:i.bind(null,{day:"2-digit"}),CURRENT_DAY_NAME:i.bind(null,{weekday:"long"}),CURRENT_DAY_NAME_SHORT:i.bind(null,{weekday:"short"}),CURRENT_HOUR:i.bind(null,{hour:"2-digit",hour12:!1}),CURRENT_MINUTE:i.bind(null,{minute:"2-digit"}),CURRENT_SECOND:i.bind(null,{second:"2-digit"})},g=(u.SELECTED_TEXT=u.SELECTION,f.prototype.getTokenizer=function(){return f.$tokenizer||this.createTokenizer()},f.prototype.createTokenizer=function(){function n(e){return e=e.substr(1),/^\d+$/.test(e)?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function e(e){return"(?:[^\\\\"+e+"]|\\\\.)"}var t={regex:"/("+e("/")+"+)/",onMatch:function(e,t,i){i=i[0];return i.fmtString=!0,i.guard=e.slice(1,-1),i.flag=""},next:"formatString"};return f.$tokenizer=new p({start:[{regex:/\\./,onMatch:function(e,t,i){var n=e[1];return[e="}"==n&&i.length||-1!="`$\\".indexOf(n)?n:e]}},{regex:/}/,onMatch:function(e,t,i){return[i.length?i.shift():e]}},{regex:/\$(?:\d+|\w+)/,onMatch:n},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(e,t,i){e=n(e.substr(1));return i.unshift(e[0]),e},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+e("\\|")+"*\\|",onMatch:function(e,t,i){e=e.slice(1,-1).replace(/\\[,|\\]|,/g,function(e){return 2==e.length?e[1]:"\0"}).split("\0").map(function(e){return{value:e}});return[(i[0].choices=e)[0]]},next:"start"},t,{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:/:/,onMatch:function(e,t,i){return i.length&&i[0].expectElse?(i[0].expectElse=!1,i[0].ifEnd={elseEnd:i[0]},[i[0].ifEnd]):":"}},{regex:/\\./,onMatch:function(e,t,i){var n=e[1];return"}"==n&&i.length||-1!="`$\\".indexOf(n)?e=n:"n"==n?e="\n":"t"==n?e="\t":-1!="ulULE".indexOf(n)&&(e={changeCase:n,local:"a"<n}),[e]}},{regex:"/\\w*}",onMatch:function(e,t,i){i=i.shift();return i&&(i.flag=e.slice(1,-1)),this.next=i&&i.tabstopId?"start":"",[i||e]},next:"start"},{regex:/\$(?:\d+|\w+)/,onMatch:function(e,t,i){return[{text:e.slice(1)}]}},{regex:/\${\w+/,onMatch:function(e,t,i){e={text:e.slice(2)};return i.unshift(e),[e]},next:"formatStringVar"},{regex:/\n/,token:"newline",merge:!1},{regex:/}/,onMatch:function(e,t,i){i=i.shift();return this.next=i&&i.tabstopId?"start":"",[i||e]},next:"start"}],formatStringVar:[{regex:/:\/\w+}/,onMatch:function(e,t,i){return i[0].formatFunction=e.slice(2,-1),[i.shift()]},next:"formatString"},t,{regex:/:[\?\-+]?/,onMatch:function(e,t,i){"+"==e[1]&&(i[0].ifEnd=i[0]),"?"==e[1]&&(i[0].expectElse=!0)},next:"formatString"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"formatString"}]})},f.prototype.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map(function(e){return e.value||e})},f.prototype.getVariableValue=function(e,t,i){if(/^\d+$/.test(t))return(this.variables.__||{})[t]||"";if(/^[A-Z]\d+$/.test(t))return(this.variables[t[0]+"__"]||{})[t.substr(1)]||"";if(t=t.replace(/^TM_/,""),!this.variables.hasOwnProperty(t))return"";var n=this.variables[t];return null==(n="function"==typeof n?this.variables[t](e,t,i):n)?"":n},f.prototype.tmStrFormat=function(e,t,s){if(!t.fmt)return e;var i=t.flag||"",n=t.guard,n=new RegExp(n,i.replace(/[^gim]/g,"")),a="string"==typeof t.fmt?this.tokenizeTmSnippet(t.fmt,"formatString"):t.fmt,p=this;return e.replace(n,function(){for(var e=p.variables.__,t=(p.variables.__=[].slice.call(arguments),p.resolveVariables(a,s)),i="E",n=0;n<t.length;n++){var o,r=t[n];"object"==typeof r?(t[n]="",r.changeCase&&r.local?(o=t[n+1])&&"string"==typeof o&&("u"==r.changeCase?t[n]=o[0].toUpperCase():t[n]=o[0].toLowerCase(),t[n+1]=o.substr(1)):r.changeCase&&(i=r.changeCase)):"U"==i?t[n]=r.toUpperCase():"L"==i&&(t[n]=r.toLowerCase())}return p.variables.__=e,t.join("")})},f.prototype.tmFormatFunction=function(e,t,i){return"upcase"==t.formatFunction?e.toUpperCase():"downcase"==t.formatFunction?e.toLowerCase():e},f.prototype.resolveVariables=function(t,e){function i(e){e=t.indexOf(e,s+1);-1!=e&&(s=e)}for(var n=[],o="",r=!0,s=0;s<t.length;s++){var a,p=t[s];"string"==typeof p?(n.push(p),"\n"==p?(r=!0,o=""):r&&(o=/^\t*/.exec(p)[0],r=/\S/.test(p))):p&&(r=!1,p.fmtString&&(-1==(a=t.indexOf(p,s+1))&&(a=t.length),p.fmt=t.slice(s+1,a),s=a),p.text?(a=this.getVariableValue(e,p.text,o)+"",p.fmtString&&(a=this.tmStrFormat(a,p,e)),(a=p.formatFunction?this.tmFormatFunction(a,p,e):a)&&!p.ifEnd?(n.push(a),i(p)):!a&&p.ifEnd&&i(p.ifEnd)):p.elseEnd?i(p.elseEnd):null==p.tabstopId&&null==p.changeCase||n.push(p))}return n},f.prototype.getDisplayTextForSnippet=function(e,t){return m.call(this,e,t).text},f.prototype.insertSnippetForSelection=function(e,t,i){var t=m.call(this,e,t,i=void 0===i?{}:i),i=e.getSelectionRange(),n=e.session.replace(i,t.text),o=new b(e),e=e.inVirtualSelectionMode&&e.selection.index;o.addTabstops(t.tabstops,i.start,n,e)},f.prototype.insertSnippet=function(e,t,i){void 0===i&&(i={});var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t,i);e.forEachSelection(function(){n.insertSnippetForSelection(e,t,i)},null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},f.prototype.$getScope=function(e){var t,i=e.session.$mode.$id||"";return"html"!==(i=i.split("/").pop())&&"php"!==i||("php"!==i||e.session.$mode.inlinePhp||(i="html"),t=e.getCursorPosition(),(e="object"==typeof(e=e.session.getState(t.row))?e[0]:e).substring&&("js-"==e.substring(0,3)?i="javascript":"css-"==e.substring(0,4)?i="css":"php-"==e.substring(0,4)&&(i="php"))),i},f.prototype.getActiveScopes=function(e){var e=this.$getScope(e),t=[e],i=this.snippetMap;return i[e]&&i[e].includeScopes&&t.push.apply(t,i[e].includeScopes),t.push("_"),t},f.prototype.expandWithTab=function(e,t){var i=this,n=e.forEachSelection(function(){return i.expandSnippetForSelection(e,t)},null,{keepOrder:!0});return n&&e.tabstopManager&&e.tabstopManager.tabNext(),n},f.prototype.expandSnippetForSelection=function(e,t){var i,n=e.getCursorPosition(),o=e.session.getLine(n.row),r=o.substring(0,n.column),s=o.substr(n.column),a=this.snippetMap;return this.getActiveScopes(e).some(function(e){e=a[e];return!!(i=e?this.findMatchingSnippet(e,r,s):i)},this),!!i&&(t&&t.dryRun||(e.session.doc.removeInLine(n.row,n.column-i.replaceBefore.length,n.column+i.replaceAfter.length),this.variables.M__=i.matchBefore,this.variables.T__=i.matchAfter,this.insertSnippetForSelection(e,i.content),this.variables.M__=this.variables.T__=null),!0)},f.prototype.findMatchingSnippet=function(e,t,i){for(var n=e.length;n--;){var o=e[n];if((!o.startRe||o.startRe.test(t))&&((!o.endRe||o.endRe.test(i))&&(o.startRe||o.endRe)))return o.matchBefore=o.startRe?o.startRe.exec(t):[""],o.matchAfter=o.endRe?o.endRe.exec(i):[""],o.replaceBefore=o.triggerRe?o.triggerRe.exec(t)[0]:"",o.replaceAfter=o.endTriggerRe?o.endTriggerRe.exec(i)[0]:"",o}},f.prototype.register=function(t,n){function o(e){return(e=e&&!/^\^?\(.*\)\$?$|^\\b$/.test(e)?"(?:"+e+")":e)||""}function r(e,t,i){return e=o(e),t=o(t),i?(e=t+e)&&"$"!=e[e.length-1]&&(e+="$"):(e+=t)&&"^"!=e[0]&&(e="^"+e),new RegExp(e)}function i(e){e.scope||(e.scope=n||"_"),n=e.scope,s[n]||(s[n]=[],a[n]={});var t,i=a[n];e.name&&((t=i[e.name])&&p.unregister(t),i[e.name]=e),s[n].push(e),e.prefix&&(e.tabTrigger=e.prefix),!e.content&&e.body&&(e.content=Array.isArray(e.body)?e.body.join("\n"):e.body),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\w/.test(e.tabTrigger)&&(e.guard="\\b"),e.trigger=c.escapeRegExp(e.tabTrigger)),(e.trigger||e.guard||e.endTrigger||e.endGuard)&&(e.startRe=r(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger),e.endRe=r(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger))}var s=this.snippetMap,a=this.snippetNameMap,p=this;t=t||[],Array.isArray(t)?t.forEach(i):Object.keys(t).forEach(function(e){i(t[e])}),this._signal("registerSnippets",{scope:n})},f.prototype.unregister=function(e,i){function t(e){var t=o[e.scope||i];t&&t[e.name]&&(delete t[e.name],0<=(e=(t=n[e.scope||i])&&t.indexOf(e))&&t.splice(e,1))}var n=this.snippetMap,o=this.snippetNameMap;e.content?t(e):Array.isArray(e)&&e.forEach(t)},f.prototype.parseSnippetFile=function(e){e=e.replace(/\r/g,"");for(var t,i,n,o=[],r={},s=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;i=s.exec(e);){if(i[1])try{r=JSON.parse(i[1]),o.push(r)}catch(e){}i[4]?(r.content=i[4].replace(/^\t/gm,""),o.push(r),r={}):(t=i[2],i=i[3],"regex"==t?(r.guard=(n=/\/((?:[^\/\\]|\\.)*)|$/g).exec(i)[1],r.trigger=n.exec(i)[1],r.endTrigger=n.exec(i)[1],r.endGuard=n.exec(i)[1]):"snippet"==t?(r.tabTrigger=i.match(/^\S*/)[0],r.name||(r.name=i)):t&&(r[t]=i))}return o},f.prototype.getSnippetByName=function(t,e){var i,n=this.snippetNameMap;return this.getActiveScopes(e).some(function(e){e=n[e];return!!(i=e?e[t]:i)},this),i},f);function f(){this.snippetMap={},this.snippetNameMap={},this.variables=u}o.implement(g.prototype,r);var m=function(e,t,i){void 0===i&&(i={});var n=e.getCursorPosition(),o=e.session.getLine(n.row),r=e.session.getTabString(),s=o.match(/^\s*/)[0],a=(n.column<s.length&&(s=s.slice(0,n.column)),t=t.replace(/\r/g,""),this.tokenizeTmSnippet(t));a=(a=this.resolveVariables(a,e)).map(function(e){return"\n"!=e||i.excludeExtraIndent?"string"==typeof e?e.replace(/\t/g,r):e:e+s});for(var p=[],c=(a.forEach(function(e,t){var i,n;"object"==typeof e&&(n=e.tabstopId,(i=p[n])||((i=p[n]=[]).index=n,i.value="",i.parents={}),-1===i.indexOf(e)&&(e.choices&&!i.choices&&(i.choices=e.choices),i.push(e),-1!==(n=a.indexOf(e,t+1))&&((e=a.slice(t+1,n)).some(function(e){return"object"==typeof e})&&!i.value?i.value=e:!e.length||i.value&&"string"==typeof i.value||(i.value=e.join("")))))}),p.forEach(function(e){e.length=0}),{}),l=0;l<a.length;l++){var h,d,u,g=a[l];"object"==typeof g&&(u=g.tabstopId,h=p[u],d=a.indexOf(g,l+1),c[u]?c[u]===g&&(delete c[u],Object.keys(c).forEach(function(e){h.parents[e]=!0})):(c[u]=g,"string"!=typeof(u=h.value)?u=function(e){for(var t=[],i=0;i<e.length;i++){if("object"==typeof(n=e[i])){if(c[n.tabstopId])continue;var n=t[e.lastIndexOf(n,i-1)]||{tabstopId:n.tabstopId}}t[i]=n}return t}(u):g.fmt&&(u=this.tmStrFormat(u,g,e)),a.splice.apply(a,[l+1,Math.max(0,d-l)].concat(u,g)),-1===h.indexOf(g)&&h.push(g)))}var f=0,m=0,b="";return a.forEach(function(e){var t;"string"==typeof e?(1<(t=e.split("\n")).length?(m=t[t.length-1].length,f+=t.length-1):m+=e.length,b+=e):e&&(e.start?e.end={row:f,column:m}:e.start={row:f,column:m})}),{text:b,tabstops:p,tokens:a}},b=(v.prototype.attach=function(e){this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.session=e.session,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},v.prototype.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges.length=0,this.tabstops.length=0,this.selectedTabstop=null,this.editor.off("change",this.$onChange),this.editor.off("changeSelection",this.$onChangeSelection),this.editor.off("changeSession",this.$onChangeSession),this.editor.commands.off("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.session=null,this.editor=null},v.prototype.onChange=function(e){for(var t="r"==e.action[0],i=this.selectedTabstop||{},n=i.parents||{},o=this.tabstops.slice(),r=0;r<o.length;r++){var s=o[r],a=s==i||n[s.index];if(s.rangeList.$bias=a?0:1,"remove"==e.action&&s!==i)for(var a=s.parents&&s.parents[i.index],p=(p=s.rangeList.pointIndex(e.start,a))<0?-p-1:p+1,a=(a=s.rangeList.pointIndex(e.end,a))<0?-a-1:a-1,c=s.rangeList.ranges.slice(p,a),l=0;l<c.length;l++)this.removeRange(c[l]);s.rangeList.$onChange(e)}var h=this.session;this.$inChange||!t||1!=h.getLength()||h.getValue()||this.detach()},v.prototype.updateLinkedFields=function(){var e=this.selectedTabstop;if(e&&e.hasLinkedRanges&&e.firstNonLinked){this.$inChange=!0;for(var t=this.session,i=t.getTextRange(e.firstNonLinked),n=0;n<e.length;n++){var o,r=e[n];r.linked&&(o=r.original,o=s.snippetManager.tmStrFormat(i,o,this.editor),t.replace(r,o))}this.$inChange=!1}},v.prototype.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},v.prototype.onChangeSelection=function(){if(this.editor){for(var e=this.editor.selection.lead,t=this.editor.selection.anchor,i=this.editor.selection.isEmpty(),n=0;n<this.ranges.length;n++)if(!this.ranges[n].linked){var o=this.ranges[n].contains(e.row,e.column),r=i||this.ranges[n].contains(t.row,t.column);if(o&&r)return}this.detach()}},v.prototype.onChangeSession=function(){this.detach()},v.prototype.tabNext=function(e){var t=this.tabstops.length,e=this.index+(e||1),e=Math.min(Math.max(e,1),t);this.selectTabstop(e=e==t?0:e),0===e&&this.detach()},v.prototype.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];if(t&&this.addTabstopMarkers(t),this.index=e,(t=this.tabstops[this.index])&&t.length){e=(this.selectedTabstop=t).firstNonLinked||t;if(t.choices&&(e.cursor=e.start),this.editor.inVirtualSelectionMode)this.editor.selection.fromOrientedRange(e);else{var i=this.editor.multiSelect;i.toSingleRange(e);for(var n=0;n<t.length;n++)t.hasLinkedRanges&&t[n].linked||i.addRange(t[n].clone(),!0)}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler),this.selectedTabstop&&this.selectedTabstop.choices&&this.editor.execCommand("startAutocomplete",{matches:this.selectedTabstop.choices})}},v.prototype.addTabstops=function(e,s,t){var a=this.useLink||!this.editor.getOption("enableMultiselect");this.$openTabstops||(this.$openTabstops=[]),e[0]||(t=l.fromPoints(t,t),x(t.start,s),x(t.end,s),e[0]=[t],e[0].index=0);var p=[this.index+1,0],c=this.ranges;e.forEach(function(e,t){for(var i=this.$openTabstops[t]||e,n=0;n<e.length;n++){var o=e[n],r=l.fromPoints(o.start,o.end||o.start);y(r.start,s),y(r.end,s),r.original=o,r.tabstop=i,c.push(r),i!=e?i.unshift(r):i[n]=r,o.fmtString||i.firstNonLinked&&a?(r.linked=!0,i.hasLinkedRanges=!0):i.firstNonLinked||(i.firstNonLinked=r)}i.firstNonLinked||(i.hasLinkedRanges=!1),i===e&&(p.push(i),this.$openTabstops[t]=i),this.addTabstopMarkers(i),i.rangeList=i.rangeList||new h,i.rangeList.$bias=0,i.rangeList.addList(i)},this),2<p.length&&(this.tabstops.length&&p.push(p.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,p))},v.prototype.addTabstopMarkers=function(e){var t=this.session;e.forEach(function(e){e.markerId||(e.markerId=t.addMarker(e,"ace_snippet-marker","text"))})},v.prototype.removeTabstopMarkers=function(e){var t=this.session;e.forEach(function(e){t.removeMarker(e.markerId),e.markerId=null})},v.prototype.removeRange=function(e){var t=e.tabstop.indexOf(e);-1!=t&&e.tabstop.splice(t,1),-1!=(t=this.ranges.indexOf(e))&&this.ranges.splice(t,1),-1!=(t=e.tabstop.rangeList.ranges.indexOf(e))&&e.tabstop.splice(t,1),this.session.removeMarker(e.markerId),e.tabstop.length||(-1!=(t=this.tabstops.indexOf(e.tabstop))&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},v);function v(e){if(this.index=0,this.ranges=[],this.tabstops=[],e.tabstopManager)return e.tabstopManager;(e.tabstopManager=this).$onChange=this.onChange.bind(this),this.$onChangeSelection=c.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)}b.prototype.keyboardHandler=new a,b.prototype.keyboardHandler.bindKeys({Tab:function(e){s.snippetManager&&s.snippetManager.expandWithTab(e)||(e.tabstopManager.tabNext(1),e.renderer.scrollCursorIntoView())},"Shift-Tab":function(e){e.tabstopManager.tabNext(-1),e.renderer.scrollCursorIntoView()},Esc:function(e){e.tabstopManager.detach()}});var y=function(e,t){0==e.row&&(e.column+=t.column),e.row+=t.row},x=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row},o=(n.importCssString("\n.ace_snippet-marker {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n background: rgba(194, 193, 208, 0.09);\n border: 1px dotted rgba(211, 208, 235, 0.62);\n position: absolute;\n}","snippets.css",!1),s.snippetManager=new g,e("./editor").Editor);!function(){this.insertSnippet=function(e,t){return s.snippetManager.insertSnippet(this,e,t)},this.expandSnippet=function(e){return s.snippetManager.expandWithTab(this,e)}}.call(o.prototype)}),define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/config","ace/lib/useragent"],function(e,t,i){"use strict";function a(e){return"suggest-aria-id:".concat(e)}function p(e){return(e=new o(e)).$maxLines=4,(e=new r(e)).setHighlightActiveLine(!1),e.setShowPrintMargin(!1),e.renderer.setShowGutter(!1),e.renderer.setHighlightGutterLine(!1),e.$mouseHandler.$focusTimeout=0,e.$highlightTagPending=!0,e}function n(e){function t(){}var i=g.createElement("div"),d=p(i);function n(){s(-1)}e&&e.appendChild(i),i.style.display="none",d.renderer.content.style.cursor="default",d.renderer.setStyle("ace_autocomplete"),d.renderer.$textLayer.element.setAttribute("role",m),d.renderer.$textLayer.element.setAttribute("aria-roledescription",f("Autocomplete suggestions")),d.renderer.$textLayer.element.setAttribute("aria-label",f("Autocomplete suggestions")),d.renderer.textarea.setAttribute("aria-hidden","true"),d.setOption("displayIndentGuides",!1),d.setOption("dragDelay",150),d.focus=t,d.$isFocused=!0,d.renderer.$cursorLayer.restartTimer=t,d.renderer.$cursorLayer.element.style.opacity="0",d.renderer.$maxLines=8,d.renderer.$keepTextAreaAtCursor=!1,d.setHighlightActiveLine(!1),d.session.highlight(""),d.session.$searchHighlight.clazz="ace_highlight-marker",d.on("mousedown",function(e){var t=e.getDocumentPosition();d.selection.moveToPosition(t),r.start.row=r.end.row=t.row,e.stop()});var u,o=new c(-1,0,-1,1/0),r=new c(-1,0,-1,1/0),s=(r.id=d.session.addMarker(r,"ace_active-line","fullLine"),d.setSelectOnHover=function(e){e?o.id&&(d.session.removeMarker(o.id),o.id=null):o.id=d.session.addMarker(o,"ace_line-hover","fullLine")},d.setSelectOnHover(!1),d.on("mousemove",function(e){var t;u?u.x==e.x&&u.y==e.y||((u=e).scrollTop=d.renderer.scrollTop,d.isMouseOver=!0,t=u.getDocumentPosition().row,o.start.row!=t&&(o.id||d.setRow(t),s(t))):u=e}),d.renderer.on("beforeRender",function(){var e;u&&-1!=o.start.row&&(u.$pos=null,e=u.getDocumentPosition().row,o.id||d.setRow(e),s(e,!0))}),d.renderer.on("afterRender",function(){var e,t=d.getRow(),i=d.renderer.$textLayer,n=i.element.childNodes[t-i.config.firstRow],o=document.activeElement;n!==d.selectedNode&&d.selectedNode&&(g.removeCssClass(d.selectedNode,"ace_selected"),o.removeAttribute("aria-activedescendant"),d.selectedNode.removeAttribute(v),d.selectedNode.removeAttribute("id")),(d.selectedNode=n)&&(g.addCssClass(n,"ace_selected"),e=a(t),n.id=e,i.element.setAttribute("aria-activedescendant",e),o.setAttribute("aria-activedescendant",e),n.setAttribute("role",b),n.setAttribute("aria-roledescription",f("item")),n.setAttribute("aria-label",d.getData(t).caption||d.getData(t).value),n.setAttribute("aria-setsize",d.data.length),n.setAttribute("aria-posinset",t+1),n.setAttribute("aria-describedby","doc-tooltip"),n.setAttribute(v,"true"))}),function(e,t){e!==o.start.row&&(o.start.row=o.end.row=e,t||d.session._emit("changeBackMarker"),d._emit("changeHoverMarker"))});return d.getHoveredRow=function(){return o.start.row},l.addListener(d.container,"mouseout",function(){d.isMouseOver=!1,n()}),d.on("hide",n),d.on("changeSelection",n),d.session.doc.getLength=function(){return d.data.length},d.session.doc.getLine=function(e){e=d.data[e];return"string"==typeof e?e:e&&e.value||""},(e=d.session.bgTokenizer).$tokenizeRow=function(e){function t(e,t){e&&n.push({type:(i.className||"")+(t||""),value:e})}var i=d.data[e],n=[];if(!i)return n;for(var o=(i="string"==typeof i?{value:i}:i).caption||i.value||i.name,r=o.toLowerCase(),s=(d.filterText||"").toLowerCase(),a=0,p=0,c=0;c<=s.length;c++)if(c!=p&&(i.matchMask&1<<c||c==s.length)){var l=s.slice(p,c),p=c,h=r.indexOf(l,a);if(-1==h)continue;t(o.slice(a,h),""),a=h+l.length,t(o.slice(h,a),"completion-highlight")}return t(o.slice(a,o.length),""),n.push({type:"completion-spacer",value:" "}),i.meta&&n.push({type:"completion-meta",value:i.meta}),i.message&&n.push({type:"completion-message",value:i.message}),n},e.$updateOnChange=t,e.start=t,d.session.$computeWidth=function(){return this.screenWidth=0},d.isOpen=!1,d.isTopdown=!1,d.autoSelect=!0,d.filterText="",d.isMouseOver=!1,d.data=[],d.setData=function(e,t){d.filterText=t||"",d.setValue(h.stringRepeat("\n",e.length),-1),d.data=e||[],d.setRow(0)},d.getData=function(e){return d.data[e]},d.getRow=function(){return r.start.row},d.setRow=function(e){e=Math.max(this.autoSelect?0:-1,Math.min(this.data.length-1,e)),r.start.row!=e&&(d.selection.clearSelection(),r.start.row=r.end.row=e||0,d.session._emit("changeBackMarker"),d.moveCursorTo(e||0,0),d.isOpen&&d._signal("select"))},d.on("changeSelection",function(){d.isOpen&&d.setRow(d.selection.lead.row),d.renderer.scrollCursorIntoView()}),d.hide=function(){this.container.style.display="none",d.anchorPos=null,d.anchor=null,d.isOpen&&(d.isOpen=!1,this._signal("hide"))},d.tryShow=function(e,t,i,n){if(!n&&d.isOpen&&d.anchorPos&&d.anchor&&d.anchorPos.top===e.top&&d.anchorPos.left===e.left&&d.anchor===i)return!0;var o=this.container,r=window.innerHeight,s=window.innerWidth,a=this.renderer,p=a.$maxLines*t*1.4,c={top:0,bottom:0,left:0},l=r-e.top-3*this.$borderSize-t,h=e.top-3*this.$borderSize,t=("top"===(i=i||(h<=l||p<=l?"bottom":"top"))?(c.bottom=e.top-this.$borderSize,c.top=c.bottom-p):"bottom"===i&&(c.top=e.top+t+this.$borderSize,c.bottom=c.top+p),0<=c.top&&c.bottom<=r);if(!n&&!t)return!1;a.$maxPixelHeight=t?null:"top"===i?h:l,"top"===i?(o.style.top="",o.style.bottom=r-c.bottom+"px",d.isTopdown=!1):(o.style.top=c.top+"px",o.style.bottom="",d.isTopdown=!0),o.style.display="";p=e.left;return p+o.offsetWidth>s&&(p=s-o.offsetWidth),o.style.left=p+"px",o.style.right="",d.isOpen||(d.isOpen=!0,this._signal("show"),u=null),d.anchorPos=e,d.anchor=i,!0},d.show=function(e,t,i){this.tryShow(e,t,i?"bottom":void 0,!0)},d.goTo=function(e){var t=this.getRow(),i=this.session.getLength()-1;switch(e){case"up":t=t<=0?i:t-1;break;case"down":t=i<=t?-1:t+1;break;case"start":t=0;break;case"end":t=i}this.setRow(t)},d.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize},d.$imageSize=0,d.$borderSize=1,d}var o=e("../virtual_renderer").VirtualRenderer,r=e("../editor").Editor,c=e("../range").Range,l=e("../lib/event"),h=e("../lib/lang"),g=e("../lib/dom"),f=e("../config").nls,e=e("./../lib/useragent"),m=e.isSafari?"menu":"listbox",b=e.isSafari?"menuitem":"option",v=e.isSafari?"aria-current":"aria-selected";g.importCssString('\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #CAD6FA;\n z-index: 1;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #3a674e;\n}\n.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid #abbffe;\n margin-top: -1px;\n background: rgba(233,233,253,0.4);\n position: absolute;\n z-index: 2;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid rgba(109, 150, 13, 0.8);\n background: rgba(58, 103, 78, 0.62);\n}\n.ace_completion-meta {\n opacity: 0.5;\n margin-left: 0.9em;\n}\n.ace_completion-message {\n margin-left: 0.9em;\n color: blue;\n}\n.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #2d69c7;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #93ca12;\n}\n.ace_editor.ace_autocomplete {\n width: 300px;\n z-index: 200000;\n border: 1px lightgray solid;\n position: fixed;\n box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n line-height: 1.4;\n background: #fefefe;\n color: #111;\n}\n.ace_dark.ace_editor.ace_autocomplete {\n border: 1px #484747 solid;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\n line-height: 1.4;\n background: #25282c;\n color: #c1c1c1;\n}\n.ace_autocomplete .ace_text-layer {\n width: calc(100% - 8px);\n}\n.ace_autocomplete .ace_line {\n display: flex;\n align-items: center;\n}\n.ace_autocomplete .ace_line > * {\n min-width: 0;\n flex: 0 0 auto;\n}\n.ace_autocomplete .ace_line .ace_ {\n flex: 0 1 auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ace_autocomplete .ace_completion-spacer {\n flex: 1;\n}\n.ace_autocomplete.ace_loading:after {\n content: "";\n position: absolute;\n top: 0px;\n height: 2px;\n width: 8%;\n background: blue;\n z-index: 100;\n animation: ace_progress 3s infinite linear;\n animation-delay: 300ms;\n transform: translateX(-100%) scaleX(1);\n}\n@keyframes ace_progress {\n 0% { transform: translateX(-100%) scaleX(1) }\n 50% { transform: translateX(625%) scaleX(2) } \n 100% { transform: translateX(1500%) scaleX(3) } \n}\n@media (prefers-reduced-motion) {\n .ace_autocomplete.ace_loading:after {\n transform: translateX(625%) scaleX(2);\n animation: none;\n }\n}\n',"autocompletion.css",!1),t.AcePopup=n,t.$singleLineEditor=p,t.getAriaId=a}),define("ace/autocomplete/inline_screenreader",["require","exports","module"],function(e,t,i){"use strict";function n(e){this.editor=e,this.screenReaderDiv=document.createElement("div"),this.screenReaderDiv.classList.add("ace_screenreader-only"),this.editor.container.appendChild(this.screenReaderDiv)}n.prototype.setScreenReaderContent=function(e){for(!this.popup&&this.editor.completer&&this.editor.completer.popup&&(this.popup=this.editor.completer.popup,this.popup.renderer.on("afterRender",function(){var e=this.popup.getRow(),t=this.popup.renderer.$textLayer,e=t.element.childNodes[e-t.config.firstRow];if(e){for(var i="doc-tooltip ",n=0;n<this._lines.length;n++)i+="ace-inline-screenreader-line-".concat(n," ");e.setAttribute("aria-describedby",i)}}.bind(this)));this.screenReaderDiv.firstChild;)this.screenReaderDiv.removeChild(this.screenReaderDiv.firstChild);this._lines=e.split(/\r\n|\r|\n/);e=this.createCodeBlock();this.screenReaderDiv.appendChild(e)},n.prototype.destroy=function(){this.screenReaderDiv.remove()},n.prototype.createCodeBlock=function(){var e=document.createElement("pre");e.setAttribute("id","ace-inline-screenreader");for(var t=0;t<this._lines.length;t++){var i=document.createElement("code"),n=(i.setAttribute("id","ace-inline-screenreader-line-".concat(t)),document.createTextNode(this._lines[t]));i.appendChild(n),e.appendChild(i)}return e},t.AceInlineScreenReader=n}),define("ace/autocomplete/inline",["require","exports","module","ace/snippets","ace/autocomplete/inline_screenreader"],function(e,t,i){"use strict";var o=e("../snippets").snippetManager,r=e("./inline_screenreader").AceInlineScreenReader;function n(){this.editor=null}n.prototype.show=function(e,t,i){if(i=i||"",e&&this.editor&&this.editor!==e&&(this.hide(),this.editor=null,this.inlineScreenReader=null),!e||!t)return!1;this.inlineScreenReader||(this.inlineScreenReader=new r(e));var n=t.snippet?o.getDisplayTextForSnippet(e,t.snippet):t.value;return!(t.hideInlinePreview||!n||!n.startsWith(i))&&(this.editor=e,this.inlineScreenReader.setScreenReaderContent(n),""===(n=n.slice(i.length))?e.removeGhostText():e.setGhostText(n),!0)},n.prototype.isOpen=function(){return!!this.editor&&!!this.editor.renderer.$ghostText},n.prototype.hide=function(){return!!this.editor&&(this.editor.removeGhostText(),!0)},n.prototype.destroy=function(){this.hide(),this.editor=null,this.inlineScreenReader&&(this.inlineScreenReader.destroy(),this.inlineScreenReader=null)},t.AceInline=n}),define("ace/autocomplete/util",["require","exports","module"],function(e,t,i){"use strict";t.parForEach=function(e,t,i){var n=0,o=e.length;0===o&&i();for(var r=0;r<o;r++)t(e[r],function(e,t){++n===o&&i(e,t)})};var r=/[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/;t.retrievePrecedingIdentifier=function(e,t,i){i=i||r;for(var n=[],o=t-1;0<=o&&i.test(e[o]);o--)n.push(e[o]);return n.reverse().join("")},t.retrieveFollowingIdentifier=function(e,t,i){i=i||r;for(var n=[],o=t;o<e.length&&i.test(e[o]);o++)n.push(e[o]);return n},t.getCompletionPrefix=function(e){var t,i=e.getCursorPosition(),n=e.session.getLine(i.row);return e.completers.forEach(function(e){e.identifierRegexps&&e.identifierRegexps.forEach(function(e){!t&&e&&(t=this.retrievePrecedingIdentifier(n,i.column,e))}.bind(this))}.bind(this)),t||this.retrievePrecedingIdentifier(n,i.column)},t.triggerAutocomplete=function(e){var t=e.getCursorPosition(),i=e.session.getLine(t.row)[0===t.column?0:t.column-1];return e.completers.some(function(e){if(e.triggerCharacters&&Array.isArray(e.triggerCharacters))return e.triggerCharacters.includes(i)})}}),define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/inline","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config","ace/lib/event","ace/lib/scroll"],function(e,t,i){"use strict";function n(e,t){t.completer&&t.completer.destroy()}var o=e("./keyboard/hash_handler").HashHandler,r=e("./autocomplete/popup").AcePopup,s=e("./autocomplete/inline").AceInline,a=e("./autocomplete/popup").getAriaId,c=e("./autocomplete/util"),p=e("./lib/lang"),l=e("./lib/dom"),h=e("./snippets").snippetManager,d=e("./config"),u=e("./lib/event"),g=e("./lib/scroll").preventParentScroll,f=(Object.defineProperty(m,"completionsForLoading",{get:function(){return[{caption:d.nls("Loading..."),value:""}]},enumerable:!1,configurable:!0}),m.prototype.$init=function(){return this.popup=new r(this.parentNode||document.body||document.documentElement),this.popup.on("click",function(e){this.insertMatch(),e.stop()}.bind(this)),this.popup.focus=this.editor.focus.bind(this.editor),this.popup.on("show",this.$onPopupShow.bind(this)),this.popup.on("hide",this.$onHidePopup.bind(this)),this.popup.on("select",this.$onPopupChange.bind(this)),u.addListener(this.popup.container,"mouseout",this.mouseOutListener.bind(this)),this.popup.on("changeHoverMarker",this.tooltipTimer.bind(null,null)),this.popup.renderer.on("afterRender",this.$onPopupRender.bind(this)),this.popup},m.prototype.$initInline=function(){if(this.inlineEnabled&&!this.inlineRenderer)return this.inlineRenderer=new s,this.inlineRenderer},m.prototype.getPopup=function(){return this.popup||this.$init()},m.prototype.$onHidePopup=function(){this.inlineRenderer&&this.inlineRenderer.hide(),this.hideDocTooltip(),this.stickySelectionTimer.cancel(),this.popupTimer.cancel(),this.stickySelection=!1},m.prototype.$seen=function(e){!this.hasSeen.has(e)&&e&&e.completer&&e.completer.onSeen&&"function"==typeof e.completer.onSeen&&(e.completer.onSeen(this.editor,e),this.hasSeen.add(e))},m.prototype.$onPopupChange=function(e){this.inlineRenderer&&this.inlineEnabled?(e=e?null:this.popup.getData(this.popup.getRow()),this.$updateGhostText(e),this.popup.isMouseOver&&this.setSelectOnHover?this.tooltipTimer.call(null,null):(this.popupTimer.schedule(),this.tooltipTimer.schedule())):(this.popupTimer.call(null,null),this.tooltipTimer.call(null,null))},m.prototype.$updateGhostText=function(e){var t=this.base.row,i=this.base.column,n=this.editor.getCursorPosition().column,t=this.editor.session.getLine(t).slice(i,n);this.inlineRenderer.show(this.editor,e,t)?this.$seen(e):this.inlineRenderer.hide()},m.prototype.$onPopupRender=function(){var e=this.inlineRenderer&&this.inlineEnabled;if(this.completions&&this.completions.filtered&&0<this.completions.filtered.length)for(var t=this.popup.getFirstVisibleRow();t<=this.popup.getLastVisibleRow();t++){var i=this.popup.getData(t);!i||e&&!i.hideInlinePreview||this.$seen(i)}},m.prototype.$onPopupShow=function(e){this.$onPopupChange(e),this.stickySelection=!1,0<=this.stickySelectionDelay&&this.stickySelectionTimer.schedule(this.stickySelectionDelay)},m.prototype.observeLayoutChanges=function(){if(!this.$elements&&this.editor){window.addEventListener("resize",this.onLayoutChange,{passive:!0}),window.addEventListener("wheel",this.mousewheelListener);for(var e=this.editor.container.parentNode,t=[];e;)t.push(e),e.addEventListener("scroll",this.onLayoutChange,{passive:!0}),e=e.parentNode;this.$elements=t}},m.prototype.unObserveLayoutChanges=function(){var t=this;window.removeEventListener("resize",this.onLayoutChange,{passive:!0}),window.removeEventListener("wheel",this.mousewheelListener),this.$elements&&this.$elements.forEach(function(e){e.removeEventListener("scroll",t.onLayoutChange,{passive:!0})}),this.$elements=null},m.prototype.onLayoutChange=function(){if(!this.popup.isOpen)return this.unObserveLayoutChanges();this.$updatePopupPosition(),this.updateDocTooltip()},m.prototype.$updatePopupPosition=function(){var e=this.editor,t=e.renderer,i=t.layerConfig.lineHeight,n=t.$cursorLayer.getPixelPosition(this.base,!0),o=(n.left-=this.popup.getTextLeftOffset(),e.container.getBoundingClientRect()),o=(n.top+=o.top-t.layerConfig.offset,n.left+=o.left-e.renderer.scrollLeft,n.left+=t.gutterWidth,{top:n.top,left:n.left}),t=(t.$ghostText&&t.$ghostTextWidget&&this.base.row===t.$ghostText.position.row&&(o.top+=t.$ghostTextWidget.el.offsetHeight),e.container.getBoundingClientRect().bottom-i),e=t<o.top?{top:t,left:o.left}:o;this.popup.tryShow(e,i,"bottom")||this.popup.tryShow(n,i,"top")||this.popup.show(n,i)},m.prototype.openPopup=function(e,t,i){this.$firstOpenTimer.cancel(),this.popup||this.$init(),this.inlineEnabled&&!this.inlineRenderer&&this.$initInline(),this.popup.autoSelect=this.autoSelect,this.popup.setSelectOnHover(this.setSelectOnHover);var n,o=this.popup.getRow(),r=this.popup.data[o],r=(this.popup.setData(this.completions.filtered,this.completions.filterText),this.editor.textInput.setAriaOptions&&this.editor.textInput.setAriaOptions({activeDescendant:a(this.popup.getRow()),inline:this.inlineEnabled}),e.keyBinding.addKeyboardHandler(this.keyboardHandler),(n=this.stickySelection?this.popup.data.indexOf(r):n)&&-1!==n||(n=0),this.popup.setRow(this.autoSelect?n:-1),n===o&&r!==this.completions.filtered[n]&&this.$onPopupChange(),this.inlineRenderer&&this.inlineEnabled);n===o&&r&&(n=this.popup.getData(this.popup.getRow()),this.$updateGhostText(n)),i?t||this.detach():(this.popup.setTheme(e.getTheme()),this.popup.setFontSize(e.getFontSize()),this.$updatePopupPosition(),this.tooltipNode&&this.updateDocTooltip()),this.changeTimer.cancel(),this.observeLayoutChanges()},m.prototype.detach=function(){this.editor&&(this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.off("changeSelection",this.changeListener),this.editor.off("blur",this.blurListener),this.editor.off("mousedown",this.mousedownListener),this.editor.off("mousewheel",this.mousewheelListener)),this.$firstOpenTimer.cancel(),this.changeTimer.cancel(),this.hideDocTooltip(),this.completionProvider&&this.completionProvider.detach(),this.popup&&this.popup.isOpen&&this.popup.hide(),this.popup&&this.popup.renderer&&this.popup.renderer.off("afterRender",this.$onPopupRender),this.base&&this.base.detach(),this.activated=!1,this.completionProvider=this.completions=this.base=null,this.unObserveLayoutChanges()},m.prototype.changeListener=function(e){var t=this.editor.selection.lead;(t.row!=this.base.row||t.column<this.base.column)&&this.detach(),this.activated?this.changeTimer.schedule():this.detach()},m.prototype.blurListener=function(e){var t=document.activeElement,i=this.editor.textInput.getElement(),n=e.relatedTarget&&this.tooltipNode&&this.tooltipNode.contains(e.relatedTarget),o=this.popup&&this.popup.container;t==i||t.parentNode==o||n||t==this.tooltipNode||e.relatedTarget==i||this.detach()},m.prototype.mousedownListener=function(e){this.detach()},m.prototype.mousewheelListener=function(e){this.popup.isMouseOver||this.detach()},m.prototype.mouseOutListener=function(e){this.popup.isOpen&&this.$updatePopupPosition()},m.prototype.goTo=function(e){this.popup.goTo(e)},m.prototype.insertMatch=function(e,t){if(!(e=e||this.popup.getData(this.popup.getRow())))return!1;if(""===e.value)return this.detach();var i=this.completions,e=this.getCompletionProvider().insertMatch(this.editor,e,i.filterText,t);return this.completions==i&&this.detach(),e},m.prototype.showPopup=function(e,t){this.editor&&this.detach(),this.activated=!0,(this.editor=e).completer!=this&&(e.completer&&e.completer.detach(),e.completer=this),e.on("changeSelection",this.changeListener),e.on("blur",this.blurListener),e.on("mousedown",this.mousedownListener),e.on("mousewheel",this.mousewheelListener),this.updateCompletions(!1,t)},m.prototype.getCompletionProvider=function(e){return this.completionProvider||(this.completionProvider=new b(e)),this.completionProvider},m.prototype.gatherCompletions=function(e,t){return this.getCompletionProvider().gatherCompletions(e,t)},m.prototype.updateCompletions=function(s,e){if(s&&this.base&&this.completions)return t=this.editor.getCursorPosition(),(i=this.editor.session.getTextRange({start:this.base,end:t}))==this.completions.filterText?void 0:(this.completions.setFilter(i),this.completions.filtered.length&&(1!=this.completions.filtered.length||this.completions.filtered[0].value!=i||this.completions.filtered[0].snippet)?void this.openPopup(this.editor,i,s):this.detach());if(e&&e.matches)return t=this.editor.getSelectionRange().start,this.base=this.editor.session.doc.createAnchor(t.row,t.column),this.base.$insertRight=!0,this.completions=new v(e.matches),this.getCompletionProvider().completions=this.completions,this.openPopup(this.editor,"",s);var e=this.editor.getSession(),t=this.editor.getCursorPosition(),i=c.getCompletionPrefix(this.editor),e=(this.base=e.doc.createAnchor(t.row,t.column-i.length),this.base.$insertRight=!0,{exactMatch:this.exactMatch,ignoreCaption:this.ignoreCaption});this.getCompletionProvider({prefix:i,pos:t}).provideCompletions(this.editor,e,function(e,t,i){var n,o=t.filtered,r=c.getCompletionPrefix(this.editor);if(this.$firstOpenTimer.cancel(),i){if(!o.length)return(n="function"==typeof(n=!this.autoShown&&this.emptyMessage)?this.emptyMessage(r):n)?(this.completions=new v([{caption:n,value:""}]),this.openPopup(this.editor,r,s),void this.popup.renderer.setStyle("ace_loading",!1)):this.detach();if(1==o.length&&o[0].value==r&&!o[0].snippet)return this.detach();if(this.autoInsert&&!this.autoShown&&1==o.length)return this.insertMatch(o[0])}this.completions=!i&&this.showLoadingState?new v(m.completionsForLoading.concat(o),t.filterText):t,this.openPopup(this.editor,r,s),this.popup.renderer.setStyle("ace_loading",!i)}.bind(this)),!this.showLoadingState||this.autoShown||this.popup&&this.popup.isOpen||this.$firstOpenTimer.delay(this.stickySelectionDelay/2)},m.prototype.cancelContextMenu=function(){this.editor.$mouseHandler.cancelContextMenu()},m.prototype.updateDocTooltip=function(){var e=this.popup,t=this.completions.filtered,i=t&&(t[e.getHoveredRow()]||t[e.getRow()]),n=null;if(!i||!this.editor||!this.popup.isOpen)return this.hideDocTooltip();for(var o=this.editor.completers.length,r=0;r<o;r++){var s=this.editor.completers[r];if(s.getDocTooltip&&i.completerId===s.id){n=s.getDocTooltip(i);break}}if(!(n="string"==typeof(n=n||"string"==typeof i?n:i)?{docText:n}:n)||!n.docHTML&&!n.docText)return this.hideDocTooltip();this.showDocTooltip(n)},m.prototype.showDocTooltip=function(e){this.tooltipNode||(this.tooltipNode=l.createElement("div"),this.tooltipNode.style.margin="0",this.tooltipNode.style.pointerEvents="auto",this.tooltipNode.style.overscrollBehavior="contain",this.tooltipNode.tabIndex=-1,this.tooltipNode.onblur=this.blurListener.bind(this),this.tooltipNode.onclick=this.onTooltipClick.bind(this),this.tooltipNode.id="doc-tooltip",this.tooltipNode.setAttribute("role","tooltip"),this.tooltipNode.addEventListener("wheel",g));var t=this.editor.renderer.theme,t=(this.tooltipNode.className="ace_tooltip ace_doc-tooltip "+(t.isDark?"ace_dark ":"")+(t.cssClass||""),this.tooltipNode),e=(e.docHTML?t.innerHTML=e.docHTML:e.docText&&(t.textContent=e.docText),t.parentNode||this.popup.container.appendChild(this.tooltipNode),this.popup),i=e.container.getBoundingClientRect();t.style.top=e.container.style.top,t.style.bottom=e.container.style.bottom,t.style.display="block",window.innerWidth-i.right<320?i.left<320?(e.isTopdown?t.style.top=i.bottom+"px":t.style.top=e.container.offsetTop-t.offsetHeight+"px",t.style.left=i.left+"px",t.style.right="",t.style.bottom=""):(t.style.right=window.innerWidth-i.left+"px",t.style.left=""):(t.style.left=i.right+1+"px",t.style.right="")},m.prototype.hideDocTooltip=function(){var e;this.tooltipTimer.cancel(),this.tooltipNode&&(e=this.tooltipNode,this.editor.isFocused()||document.activeElement!=e||this.editor.focus(),this.tooltipNode=null,e.parentNode&&e.parentNode.removeChild(e))},m.prototype.onTooltipClick=function(e){for(var t=e.target;t&&t!=this.tooltipNode;){if("A"==t.nodeName&&t.href){t.rel="noreferrer",t.target="_blank";break}t=t.parentNode}},m.prototype.destroy=function(){var e;this.detach(),this.popup&&(this.popup.destroy(),(e=this.popup.container)&&e.parentNode&&e.parentNode.removeChild(e)),this.editor&&this.editor.completer==this&&(this.editor.off("destroy",n),this.editor.completer=null),this.inlineRenderer=this.popup=this.editor=null},m);function m(){this.autoInsert=!1,this.autoSelect=!0,this.autoShown=!1,this.exactMatch=!1,this.inlineEnabled=!1,this.keyboardHandler=new o,this.keyboardHandler.bindKeys(this.commands),this.parentNode=null,this.setSelectOnHover=!1,this.hasSeen=new Set,this.showLoadingState=!1,this.stickySelectionDelay=500,this.blurListener=this.blurListener.bind(this),this.changeListener=this.changeListener.bind(this),this.mousedownListener=this.mousedownListener.bind(this),this.mousewheelListener=this.mousewheelListener.bind(this),this.onLayoutChange=this.onLayoutChange.bind(this),this.changeTimer=p.delayedCall(function(){this.updateCompletions(!0)}.bind(this)),this.tooltipTimer=p.delayedCall(this.updateDocTooltip.bind(this),50),this.popupTimer=p.delayedCall(this.$updatePopupPosition.bind(this),50),this.stickySelectionTimer=p.delayedCall(function(){this.stickySelection=!0}.bind(this),this.stickySelectionDelay),this.$firstOpenTimer=p.delayedCall(function(){var e=this.completionProvider&&this.completionProvider.initialPosition;this.autoShown||this.popup&&this.popup.isOpen||!e||0===this.editor.completers.length||(this.completions=new v(m.completionsForLoading),this.openPopup(this.editor,e.prefix,!1),this.popup.renderer.setStyle("ace_loading",!0))}.bind(this),this.stickySelectionDelay)}f.prototype.commands={Up:function(e){e.completer.goTo("up")},Down:function(e){e.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(e){e.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(e){e.completer.goTo("end")},Esc:function(e){e.completer.detach()},Return:function(e){return e.completer.insertMatch()},"Shift-Return":function(e){e.completer.insertMatch(null,{deleteSuffix:!0})},Tab:function(e){var t=e.completer.insertMatch();if(t||e.tabstopManager)return t;e.completer.goTo("down")},PageUp:function(e){e.completer.popup.gotoPageUp()},PageDown:function(e){e.completer.popup.gotoPageDown()}},f.for=function(e){return e.completer instanceof f||(e.completer&&(e.completer.destroy(),e.completer=null),d.get("sharedPopups")?(f.$sharedInstance||(f.$sharedInstance=new f),e.completer=f.$sharedInstance):(e.completer=new f,e.once("destroy",n))),e.completer},f.startCommand={name:"startAutocomplete",exec:function(e,t){var i=f.for(e);i.autoInsert=!1,i.autoSelect=!0,i.autoShown=!1,i.showPopup(e,t),i.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};x.prototype.insertByIndex=function(e,t,i){return!(!this.completions||!this.completions.filtered)&&this.insertMatch(e,this.completions.filtered[t],i)},x.prototype.insertMatch=function(e,t,i){if(!t)return!1;if(e.startOperation({command:{name:"insertMatch"}}),t.completer&&t.completer.insertMatch)t.completer.insertMatch(e,t);else{if(!this.completions)return!1;var n=this.completions.filterText.length,o=0;if(t.range&&t.range.start.row===t.range.end.row&&(n=(n-=this.initialPosition.prefix.length)+(this.initialPosition.pos.column-t.range.start.column),o+=t.range.end.column-this.initialPosition.pos.column),n||o)for(var r,s=e.selection.getAllRanges?e.selection.getAllRanges():[e.getSelectionRange()],a=0;r=s[a];a++)r.start.column-=n,r.end.column+=o,e.session.remove(r);t.snippet?h.insertSnippet(e,t.snippet):this.$insertString(e,t),t.completer&&t.completer.onInsert&&"function"==typeof t.completer.onInsert&&t.completer.onInsert(e,t),t.command&&"startAutocomplete"===t.command&&e.execCommand(t.command)}return e.endOperation(),!0},x.prototype.$insertString=function(e,t){t=t.value||t;e.execCommand("insertstring",t)},x.prototype.gatherCompletions=function(n,o){var t=n.getSession(),r=n.getCursorPosition(),s=c.getCompletionPrefix(n),a=[],p=(this.completers=n.completers,n.completers.length);return n.completers.forEach(function(i,e){i.getCompletions(n,t,r,s,function(e,t){i.hideInlinePreview&&(t=t.map(function(e){return Object.assign(e,{hideInlinePreview:i.hideInlinePreview})})),!e&&t&&(a=a.concat(t)),o(null,{prefix:c.getCompletionPrefix(n),matches:a,finished:0==--p})})}),!0},x.prototype.provideCompletions=function(e,n,o){var i=function(e){var t=e.prefix,i=e.matches;this.completions=new v(i),n.exactMatch&&(this.completions.exactMatch=!0),n.ignoreCaption&&(this.completions.ignoreCaption=!0),this.completions.setFilter(t),(e.finished||this.completions.filtered.length)&&o(null,this.completions,e.finished)}.bind(this),r=!0,s=null;this.gatherCompletions(e,function(e,t){this.active&&(e&&(o(e,[],!0),this.detach()),0===t.prefix.indexOf(t.prefix)&&(r?s=t:i(t)))}.bind(this)),r=!1,s&&(e=s,s=null,i(e))},x.prototype.detach=function(){this.active=!1,this.completers&&this.completers.forEach(function(e){"function"==typeof e.cancel&&e.cancel()})};var b=x,v=(y.prototype.setFilter=function(e){t=e.length>this.filterText&&0===e.lastIndexOf(this.filterText,0)?this.filtered:this.all,this.filterText=e,t=(t=this.filterCompletions(t,this.filterText)).sort(function(e,t){return t.exactMatch-e.exactMatch||t.$score-e.$score||(e.caption||e.value).localeCompare(t.caption||t.value)});var t,i=null;t=t.filter(function(e){e=e.snippet||e.caption||e.value;return e!==i&&(i=e,!0)}),this.filtered=t},y.prototype.filterCompletions=function(e,t){var i=[],n=t.toUpperCase(),o=t.toLowerCase();e:for(var r,s=0;r=e[s];s++){var a=!this.ignoreCaption&&r.caption||r.value||r.snippet;if(a){var p=-1,c=0,l=0;if(this.exactMatch){if(t!==a.substr(0,t.length))continue}else{var h=a.toLowerCase().indexOf(o);if(-1<h)l=h;else for(var d=0;d<t.length;d++){var u=a.indexOf(o[d],p+1),g=a.indexOf(n[d],p+1);if((u=0<=u&&(g<0||u<g)?u:g)<0)continue e;0<(g=u-p-1)&&(-1===p&&(l+=10),l+=g,c|=1<<d),p=u}}r.matchMask=c,r.exactMatch=l?0:1,r.$score=(r.score||0)-l,i.push(r)}}return i},y);function y(e,t){this.all=e,this.filtered=e,this.filterText=t||"",this.exactMatch=!1,this.ignoreCaption=!1}function x(e){this.initialPosition=e,this.active=!0}t.Autocomplete=f,t.CompletionProvider=b,t.FilteredList=v}),define("ace/autocomplete/text_completer",["require","exports","module","ace/range"],function(e,t,i){function s(e,t){var i=e.getTextRange(a.fromPoints({row:0,column:0},t)).split(p).length-1,n=e.getValue().split(p),o=Object.create(null),r=n[i];return n.forEach(function(e,t){e&&e!==r&&(t=Math.abs(i-t),t=n.length-t,o[e]?o[e]=Math.max(t,o[e]):o[e]=t)}),o}var a=e("../range").Range,p=/[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/;t.getCompletions=function(e,t,i,n,o){var r=s(t,i);o(null,Object.keys(r).map(function(e){return{caption:e,value:e,score:r[e],meta:"local"}}))}}),define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"],function(e,t,i){"use strict";function n(e,t){m(t.session.$mode)}function o(e){var t=e.editor,i=t.completer&&t.completer.activated;"backspace"===e.command.name?i&&!l.getCompletionPrefix(t)&&t.completer.detach():"insertstring"!==e.command.name||i||((t=(r=e).editor.$liveAutocompletionDelay)?v.delay(t):y(e))}var r,p=e("../snippets").snippetManager,s=e("../autocomplete").Autocomplete,a=e("../config"),c=e("../lib/lang"),l=e("../autocomplete/util"),h=e("../autocomplete/text_completer"),d={getCompletions:function(e,t,i,n,o){if(t.$mode.completer)return t.$mode.completer.getCompletions(e,t,i,n,o);e=e.session.getState(i.row);o(null,t.$mode.getCompletions(e,t,i,n).map(function(e){return e.completerId=d.id,e}))},id:"keywordCompleter"},u={getCompletions:function(e,t,i,n,o){var r=[],t=t.getTokenAt(i.row,i.column),s=(t&&t.type.match(/(tag-name|tag-open|tag-whitespace|attribute-name|attribute-value)\.xml$/)?r.push("html-tag"):r=p.getActiveScopes(e),p.snippetMap),a=[];r.forEach(function(e){for(var t=s[e]||[],i=t.length;i--;){var n=t[i],o=n.name||n.tabTrigger;o&&a.push({caption:o,snippet:n.content,meta:n.tabTrigger&&!n.name?n.tabTrigger+"⇥ ":"snippet",completerId:u.id})}},this),o(null,a)},getDocTooltip:function(e){var o;e.snippet&&!e.docHTML&&(e.docHTML=["<b>",c.escapeHTML(e.caption),"</b>","<hr></hr>",c.escapeHTML((e=e.snippet,o={},e.replace(/\${(\d+)(:(.*?))?}/g,function(e,t,i,n){return o[t]=n||""}).replace(/\$(\d+?)/g,function(e,t){return o[t]})))].join(""))},id:"snippetCompleter"},g=[u,h,d],f=(t.setCompleters=function(e){g.length=0,e&&g.push.apply(g,e)},t.addCompleter=function(e){g.push(e)},t.textCompleter=h,t.keyWordCompleter=d,t.snippetCompleter=u,{name:"expandSnippet",exec:function(e){return p.expandWithTab(e)},bindKey:"Tab"}),m=function(e){(e="string"==typeof e?a.$modes[e]:e)&&(p.files||(p.files={}),b(e.$id,e.snippetFileId),e.modes&&e.modes.forEach(m))},b=function(t,e){e&&t&&!p.files[t]&&(p.files[t]={},a.loadModule(e,function(e){e&&(!(p.files[t]=e).snippets&&e.snippetText&&(e.snippets=p.parseSnippetFile(e.snippetText)),p.register(e.snippets||[],e.scope),e.includeScopes&&(p.snippetMap[e.scope].includeScopes=e.includeScopes,e.includeScopes.forEach(function(e){m("ace/mode/"+e)})))}))},v=c.delayedCall(function(){y(r)},0),y=function(e){var e=e.editor,t=l.getCompletionPrefix(e),i=l.triggerAutocomplete(e);(t&&t.length>=e.$liveAutocompletionThreshold||i)&&((t=s.for(e)).autoShown=!0,t.showPopup(e))},h=e("../editor").Editor;e("../config").defineOptions(h.prototype,"editor",{enableBasicAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:g),this.commands.addCommand(s.startCommand)):this.commands.removeCommand(s.startCommand)},value:!1},enableLiveAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:g),this.commands.on("afterExec",o)):this.commands.off("afterExec",o)},value:!1},liveAutocompletionDelay:{initialValue:0},liveAutocompletionThreshold:{initialValue:0},enableSnippets:{set:function(e){e?(this.commands.addCommand(f),this.on("changeMode",n),n(0,this)):(this.commands.removeCommand(f),this.off("changeMode",n))},value:!1}})}),window.require(["ace/ext/language_tools"],function(e){"object"==typeof module&&"object"==typeof exports&&module&&(module.exports=e)});
@@ -1 +1 @@
1
- define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function r(){var e=this.$keywords=this.createKeywordMapper({keyword:"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield|__ENCODING__|prepend","constant.language":"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING|RUBY_PATCHLEVEL|RUBY_REVISION|RUBY_COPYRIGHT|RUBY_ENGINE|RUBY_ENGINE_VERSION|RUBY_DESCRIPTION","variable.language":"$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self","support.function":"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many|p|warn|refine|using|module_function|extend|alias_method|private_class_method|remove_method|undef_method","invalid.deprecated":"debugger"},"identifier"),t="\\\\(?:n(?:[1-7][0-7]{0,2}|0)|[nsrtvfbae'\"\\\\]|c(?:\\\\M-)?.|M-(?:\\\\C-|\\\\c)?.|C-(?:\\\\M-)?.|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4}|u{[\\da-fA-F]{1,6}(?:\\s[\\da-fA-F]{1,6})*})",r={"(":")","[":"]","{":"}","<":">","^":"^","|":"|","%":"%"};this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"comment.multiline",regex:"^=begin(?=$|\\s.*$)",next:"comment"},{token:"string.regexp",regex:/[/](?=.*\/)/,next:"regex"},[{token:["constant.other.symbol.ruby","string.start"],regex:/(:)?(")/,push:[{token:"constant.language.escape",regex:t},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/"/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/`/,push:[{token:"constant.language.escape",regex:t},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/`/,next:"pop"},{defaultToken:"string"}]},{token:["constant.other.symbol.ruby","string.start"],regex:/(:)?(')/,push:[{token:"constant.language.escape",regex:/\\['\\]/},{token:"string.end",regex:/'/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/%[qwx]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="qStateWithoutInterpolation",this.token}},{token:"string.start",regex:/%[QWX]?([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="qStateWithInterpolation",this.token}},{token:"constant.other.symbol.ruby",regex:/%[si]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="sStateWithoutInterpolation",this.token}},{token:"constant.other.symbol.ruby",regex:/%[SI]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="sStateWithInterpolation",this.token}},{token:"string.regexp",regex:/%[r]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="rState",this.token}}],{token:"punctuation",regex:"::"},d,{token:"variable.global",regex:"[$][a-zA-Z_\\d]+"},{token:"support.class",regex:"[A-Z][a-zA-Z_\\d]*"},{token:["punctuation.operator","support.function"],regex:/(\.)([a-zA-Z_\d]+)(?=\()/},{token:["punctuation.operator","identifier"],regex:/(\.)([a-zA-Z_][a-zA-Z_\d]*)/},{token:"string.character",regex:"\\B\\?(?:"+t+"|\\S)"},{token:"punctuation.operator",regex:/\?(?=.+:)/},g,u,s,o,h,i,l,c,{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:e,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"punctuation.separator.key-value",regex:"=>"},{stateName:"heredoc",onMatch:function(e,t,n){var r="-"==e[2]||"~"==e[2]?"indentedHeredoc":"heredoc",e=e.split(this.splitRegex);return n.push(r,e[3]),[{type:"constant",value:e[1]},{type:"string",value:e[2]},{type:"support.class",value:e[3]},{type:"string",value:e[4]}]},regex:"(<<[-~]?)(['\"`]?)([\\w]+)(['\"`]?)",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}],indentedHeredoc:[{token:"string",regex:"^ +"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}]}},{regex:"$",token:"empty",next:function(e,t){return"heredoc"===t[0]||"indentedHeredoc"===t[0]?t[0]:e}},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|/|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\||\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]",onMatch:function(e,t,n){return this.next="","}"==e&&1<n.length&&"start"!=n[1]&&(n.shift(),this.next=n.shift()),this.token}},{token:"text",regex:"\\s+"},{token:"punctuation.operator",regex:/[?:,;.]/}],comment:[{token:"comment.multiline",regex:"^=end(?=$|\\s.*$)",next:"start"},{token:"comment",regex:".+"}],qStateWithInterpolation:[{token:"string.start",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"string"}},{token:"constant.language.escape",regex:t},{token:"constant.language.escape",regex:/\\./},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","string")}},{defaultToken:"string"}],qStateWithoutInterpolation:[{token:"string.start",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"string"}},{token:"constant.language.escape",regex:/\\['\\]/},{token:"constant.language.escape",regex:/\\./},{token:"string.end",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","string")}},{defaultToken:"string"}],sStateWithoutInterpolation:[{token:"constant.other.symbol.ruby",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"constant.other.symbol.ruby"}},{token:"constant.other.symbol.ruby",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","constant.other.symbol.ruby")}},{defaultToken:"constant.other.symbol.ruby"}],sStateWithInterpolation:[{token:"constant.other.symbol.ruby",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"constant.other.symbol.ruby"}},{token:"constant.language.escape",regex:t},{token:"constant.language.escape",regex:/\\./},{token:"paren.start",regex:/#{/,push:"start"},{token:"constant.other.symbol.ruby",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","constant.other.symbol.ruby")}},{defaultToken:"constant.other.symbol.ruby"}],rState:[{token:"string.regexp",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"constant.language.escape"}},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.regexp",regex:/\//},{token:"string.regexp",regex:/[)\]>}^|%][imxouesn]*/,onMatch:function(e,t,n){return n.length&&e[0]===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","constant.language.escape")}},{include:"regex"},{defaultToken:"string.regexp"}],regex:[{token:"regexp.keyword",regex:/\\[wWdDhHsS]/},{token:"constant.language.escape",regex:/\\[AGbBzZ]/},{token:"constant.language.escape",regex:/\\g<[a-zA-Z0-9]*>/},{token:["constant.language.escape","regexp.keyword","constant.language.escape"],regex:/(\\p{\^?)(Alnum|Alpha|Blank|Cntrl|Digit|Graph|Lower|Print|Punct|Space|Upper|XDigit|Word|ASCII|Any|Assigned|Arabic|Armenian|Balinese|Bengali|Bopomofo|Braille|Buginese|Buhid|Canadian_Aboriginal|Carian|Cham|Cherokee|Common|Coptic|Cuneiform|Cypriot|Cyrillic|Deseret|Devanagari|Ethiopic|Georgian|Glagolitic|Gothic|Greek|Gujarati|Gurmukhi|Han|Hangul|Hanunoo|Hebrew|Hiragana|Inherited|Kannada|Katakana|Kayah_Li|Kharoshthi|Khmer|Lao|Latin|Lepcha|Limbu|Linear_B|Lycian|Lydian|Malayalam|Mongolian|Myanmar|New_Tai_Lue|Nko|Ogham|Ol_Chiki|Old_Italic|Old_Persian|Oriya|Osmanya|Phags_Pa|Phoenician|Rejang|Runic|Saurashtra|Shavian|Sinhala|Sundanese|Syloti_Nagri|Syriac|Tagalog|Tagbanwa|Tai_Le|Tamil|Telugu|Thaana|Thai|Tibetan|Tifinagh|Ugaritic|Vai|Yi|Ll|Lm|Lt|Lu|Lo|Mn|Mc|Me|Nd|Nl|Pc|Pd|Ps|Pe|Pi|Pf|Po|No|Sm|Sc|Sk|So|Zs|Zl|Zp|Cc|Cf|Cn|Co|Cs|N|L|M|P|S|Z|C)(})/},{token:["constant.language.escape","invalid","constant.language.escape"],regex:/(\\p{\^?)([^/]*)(})/},{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:/[/][imxouesn]*/,next:"start"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?(?:[:=!>]|<'?[a-zA-Z]*'?>|<[=!])|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"regexp.keyword",regex:/\[\[:(?:alnum|alpha|blank|cntrl|digit|graph|lower|print|punct|space|upper|xdigit|word|ascii):\]\]/},{token:"constant.language.escape",regex:/\[\^?/,push:"regex_character_class"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.keyword",regex:/\\[wWdDhHsS]/},{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:/&?&?\[\^?/,push:"regex_character_class"},{token:"constant.language.escape",regex:"]",next:"pop"},{token:"constant.language.escape",regex:"-"},{defaultToken:"string.regexp.characterclass"}]},this.normalizeRules()}var a=e("../lib/oop"),e=e("./text_highlight_rules").TextHighlightRules,s=t.constantOtherSymbol={token:"constant.other.symbol.ruby",regex:"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"},o=(t.qString={token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},t.qqString={token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},t.tString={token:"string",regex:"[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"},t.constantNumericHex={token:"constant.numeric",regex:"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"}),i=t.constantNumericBinary={token:"constant.numeric",regex:/\b(0[bB][01](?:[01]|_(?=[01]))*)\b/},l=t.constantNumericDecimal={token:"constant.numeric",regex:/\b(0[dD](?:[1-9](?:[\d]|_(?=[\d]))*|0))\b/},c=t.constantNumericDecimal={token:"constant.numeric",regex:/\b(0[oO]?(?:[1-7](?:[0-7]|_(?=[0-7]))*|0))\b/},g=t.constantNumericRational={token:"constant.numeric",regex:/\b([\d]+(?:[./][\d]+)?ri?)\b/},u=t.constantNumericComplex={token:"constant.numeric",regex:/\b([\d]i)\b/},h=t.constantNumericFloat={token:"constant.numeric",regex:"[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?i?\\b"},d=t.instanceVariable={token:"variable.instance",regex:"@{1,2}[a-zA-Z_\\d]+"};a.inherits(r,e),t.RubyHighlightRules=r}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";function r(){}var a=e("../range").Range;(function(){this.checkOutdent=function(e,t){return!!/^\s+$/.test(e)&&/^\s*\}/.test(t)},this.autoOutdent=function(e,t){var n=e.getLine(t).match(/^(\s*\})/);if(!n)return 0;var n=n[1].length,r=e.findMatchingBracket({row:t,column:n});if(!r||r.row==t)return 0;r=this.$getIndent(e.getLine(r.row));e.replace(new a(t,0,t,n-1),r)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(r.prototype),t.MatchingBraceOutdent=r}),define("ace/mode/folding/ruby",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),a=e("./fold_mode").FoldMode,p=e("../../range").Range,k=e("../../token_iterator").TokenIterator,e=t.FoldMode=function(){};r.inherits(e,a),function(){this.indentKeywords={class:1,def:1,module:1,do:1,unless:1,if:1,while:1,for:1,until:1,begin:1,else:0,elsif:0,rescue:0,ensure:0,when:0,end:-1,case:1,"=begin":1,"=end":-1},this.foldingStartMarker=/(?:\s|^)(def|do|while|class|unless|module|if|for|until|begin|else|elsif|case|rescue|ensure|when)\b|({\s*$)|(=begin)/,this.foldingStopMarker=/(=end(?=$|\s.*$))|(^\s*})|\b(end)\b/,this.getFoldWidget=function(e,t,n){var r,a=e.getLine(n),s=this.foldingStartMarker.test(a),o=this.foldingStopMarker.test(a);if(s&&!o)if((r=a.match(this.foldingStartMarker))[1]){if("if"==r[1]||"else"==r[1]||"while"==r[1]||"until"==r[1]||"unless"==r[1]){if("else"==r[1]&&!1===/^\s*else\s*$/.test(a))return;if(!1===/^\s*(?:if|else|while|until|unless)\s*/.test(a))return}if("when"==r[1]&&!0===/\sthen\s/.test(a))return;if("keyword"===e.getTokenAt(n,r.index+2).type)return"start"}else{if(!r[3])return"start";if("comment.multiline"===e.getTokenAt(n,r.index+1).type)return"start"}return"markbeginend"!=t||!o||s&&o?"":"end"!==(r=a.match(this.foldingStopMarker))[3]?!r[1]||"comment.multiline"===e.getTokenAt(n,r.index+1).type?"end":void 0:"keyword"===e.getTokenAt(n,r.index+1).type?"end":void 0},this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getLine(n),a=this.foldingStartMarker.exec(r);return a?a[1]||a[3]?this.rubyBlock(e,n,a.index+2):this.openingBracketBlock(e,"{",n,a.index):(a=this.foldingStopMarker.exec(r))?"end"===a[3]&&"keyword"===e.getTokenAt(n,a.index+1).type||"=end"===a[1]&&"comment.multiline"===e.getTokenAt(n,a.index+1).type?this.rubyBlock(e,n,a.index+1):this.closingBracketBlock(e,"}",n,a.index+a[0].length):void 0},this.rubyBlock=function(e,t,n,r){var a=new k(e,t,n),s=a.getCurrentToken();if(s&&("keyword"==s.type||"comment.multiline"==s.type)){var o=s.value,i=e.getLine(t);switch(s.value){case"if":case"unless":case"while":case"until":if(!new RegExp("^\\s*"+s.value).test(i))return;var l=this.indentKeywords[o];break;case"when":if(/\sthen\s/.test(i))return;case"elsif":case"rescue":case"ensure":l=1;break;case"else":if(!new RegExp("^\\s*"+s.value+"\\s*$").test(i))return;l=1;break;default:l=this.indentKeywords[o]}var c=[o];if(l){var g=(-1===l?e.getLine(t-1):e.getLine(t)).length,n=t,u=[];if(u.push(a.getCurrentTokenRange()),a.step=-1===l?a.stepBackward:a.stepForward,"comment.multiline"==s.type){for(;s=a.step();)if("comment.multiline"===s.type)if(1==l){if(g=6,"=end"==s.value)break}else if("=begin"==s.value)break}else for(;s=a.step();){var h=!1;if("keyword"===s.type){var d=l*this.indentKeywords[s.value],i=e.getLine(a.getCurrentTokenRow());switch(s.value){case"do":for(var _=a.$tokenIndex-1;0<=_;_--){var f=a.$rowTokens[_];if(f&&("while"==f.value||"until"==f.value||"for"==f.value)){d=0;break}}break;case"else":new RegExp("^\\s*"+s.value+"\\s*$").test(i)&&"case"!=o||(h=!(d=0));break;case"if":case"unless":case"while":case"until":new RegExp("^\\s*"+s.value).test(i)||(h=!(d=0));break;case"when":!/\sthen\s/.test(i)&&"case"!=o||(h=!(d=0))}if(0<d)c.unshift(s.value);else if(d<=0&&!1===h){if(c.shift(),!c.length){if(("while"==o||"until"==o||"for"==o)&&"do"!=s.value)break;if("do"==s.value&&-1==l&&0!=d)break;if("do"!=s.value)break}0===d&&c.unshift(s.value)}}}if(!s)return null;if(r)return u.push(a.getCurrentTokenRange()),u;t=a.getCurrentTokenRow();return-1===l?(r="comment.multiline"===s.type?6:e.getLine(t).length,new p(t,r,n-1,g)):new p(n,g,t-1,e.getLine(t-1).length)}}}}.call(e.prototype)}),define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/ruby"],function(e,t,n){"use strict";function r(){this.HighlightRules=o,this.$outdent=new i,this.$behaviour=new c,this.foldingRules=new g,this.indentKeywords=this.foldingRules.indentKeywords}var a=e("../lib/oop"),s=e("./text").Mode,o=e("./ruby_highlight_rules").RubyHighlightRules,i=e("./matching_brace_outdent").MatchingBraceOutdent,l=e("../range").Range,c=e("./behaviour/cstyle").CstyleBehaviour,g=e("./folding/ruby").FoldMode;a.inherits(r,s),function(){this.lineCommentStart="#",this.getNextLineIndent=function(e,t,n){var r,a=this.$getIndent(t),s=this.getTokenizer().getLineTokens(t,e).tokens;return s.length&&"comment"==s[s.length-1].type||"start"==e&&(s=t.match(/^.*[\{\(\[]\s*$/),e=t.match(/^\s*(class|def|module)\s.*$/),r=t.match(/.*do(\s*|\s+\|.*\|\s*)$/),t=t.match(/^\s*(if|else|when|elsif|unless|while|for|begin|rescue|ensure)\s*/),(s||e||r||t)&&(a+=n)),a},this.checkOutdent=function(e,t,n){return/^\s+(end|else|rescue|ensure)$/.test(t+n)||this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){var r=t.getLine(n);if(/}/.test(r))return this.$outdent.autoOutdent(t,n);var r=this.$getIndent(r),a=t.getLine(n-1),a=this.$getIndent(a),s=t.getTabString();a.length<=r.length&&r.slice(-s.length)==s&&t.remove(new l(n,r.length-s.length,n,r.length))},this.getMatching=function(e,t,n){null==t&&(n=(r=e.selection.lead).column,t=r.row);var r=e.getTokenAt(t,n);if(r&&r.value in this.indentKeywords)return this.foldingRules.rubyBlock(e,t,n,!0)},this.$id="ace/mode/ruby",this.snippetFileId="ace/snippets/ruby"}.call(r.prototype),t.Mode=r}),window.require(["ace/mode/ruby"],function(e){"object"==typeof module&&"object"==typeof exports&&module&&(module.exports=e)});
1
+ define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function r(){var e=this.$keywords=this.createKeywordMapper({keyword:"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield|__ENCODING__|prepend","constant.language":"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING|RUBY_PATCHLEVEL|RUBY_REVISION|RUBY_COPYRIGHT|RUBY_ENGINE|RUBY_ENGINE_VERSION|RUBY_DESCRIPTION","variable.language":"$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|$!|root_url|flash|session|cookies|params|request|response|logger|self","support.function":"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|validates_inclusion_of|validates_numericality_of|validates_with|validates_each|authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|cache|expire_fragment|expire_cache_for|observe|cache_sweeper|has_many|has_one|belongs_to|has_and_belongs_to_many|p|warn|refine|using|module_function|extend|alias_method|private_class_method|remove_method|undef_method","invalid.deprecated":"debugger"},"identifier"),t="\\\\(?:n(?:[1-7][0-7]{0,2}|0)|[nsrtvfbae'\"\\\\]|c(?:\\\\M-)?.|M-(?:\\\\C-|\\\\c)?.|C-(?:\\\\M-)?.|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4}|u{[\\da-fA-F]{1,6}(?:\\s[\\da-fA-F]{1,6})*})",r={"(":")","[":"]","{":"}","<":">","^":"^","|":"|","%":"%"};this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"comment.multiline",regex:"^=begin(?=$|\\s.*$)",next:"comment"},{token:"string.regexp",regex:/[/](?=.*\/)/,next:"regex"},[{token:["constant.other.symbol.ruby","string.start"],regex:/(:)?(")/,push:[{token:"constant.language.escape",regex:t},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/"/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/`/,push:[{token:"constant.language.escape",regex:t},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/`/,next:"pop"},{defaultToken:"string"}]},{token:["constant.other.symbol.ruby","string.start"],regex:/(:)?(')/,push:[{token:"constant.language.escape",regex:/\\['\\]/},{token:"string.end",regex:/'/,next:"pop"},{defaultToken:"string"}]},{token:"string.start",regex:/%[qwx]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="qStateWithoutInterpolation",this.token}},{token:"string.start",regex:/%[QWX]?([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="qStateWithInterpolation",this.token}},{token:"constant.other.symbol.ruby",regex:/%[si]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="sStateWithoutInterpolation",this.token}},{token:"constant.other.symbol.ruby",regex:/%[SI]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="sStateWithInterpolation",this.token}},{token:"string.regexp",regex:/%[r]([(\[<{^|%])/,onMatch:function(e,t,n){n.length&&(n=[]);e=e[e.length-1];return n.unshift(e,t),this.next="rState",this.token}}],{token:"punctuation",regex:"::"},d,{token:"variable.global",regex:"[$][a-zA-Z_\\d]+"},{token:"support.class",regex:"[A-Z][a-zA-Z_\\d]*"},{token:["punctuation.operator","support.function"],regex:/(\.)([a-zA-Z_\d]+)(?=\()/},{token:["punctuation.operator","identifier"],regex:/(\.)([a-zA-Z_][a-zA-Z_\d]*)/},{token:"string.character",regex:"\\B\\?(?:"+t+"|\\S)"},{token:"punctuation.operator",regex:/\?(?=.+:)/},g,u,s,o,h,i,l,c,{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:e,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"punctuation.separator.key-value",regex:"=>"},{stateName:"heredoc",onMatch:function(e,t,n){var r="-"==e[2]||"~"==e[2]?"indentedHeredoc":"heredoc",e=e.split(this.splitRegex);return n.push(r,e[3]),[{type:"constant",value:e[1]},{type:"string",value:e[2]},{type:"support.class",value:e[3]},{type:"string",value:e[4]}]},regex:"(<<[-~]?)(['\"`]?)([\\w]+)(['\"`]?)",rules:{heredoc:[{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}],indentedHeredoc:[{token:"string",regex:"^ +"},{onMatch:function(e,t,n){return e===n[1]?(n.shift(),n.shift(),this.next=n[0]||"start","support.class"):(this.next="","string")},regex:".*$",next:"start"}]}},{regex:"$",token:"empty",next:function(e,t){return"heredoc"===t[0]||"indentedHeredoc"===t[0]?t[0]:e}},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|/|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\||\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]",onMatch:function(e,t,n){return this.next="","}"==e&&1<n.length&&"start"!=n[1]&&(n.shift(),this.next=n.shift()),this.token}},{token:"text",regex:"\\s+"},{token:"punctuation.operator",regex:/[?:,;.]/}],comment:[{token:"comment.multiline",regex:"^=end(?=$|\\s.*$)",next:"start"},{token:"comment",regex:".+"}],qStateWithInterpolation:[{token:"string.start",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"string"}},{token:"constant.language.escape",regex:t},{token:"constant.language.escape",regex:/\\./},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.end",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","string")}},{defaultToken:"string"}],qStateWithoutInterpolation:[{token:"string.start",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"string"}},{token:"constant.language.escape",regex:/\\['\\]/},{token:"constant.language.escape",regex:/\\./},{token:"string.end",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","string")}},{defaultToken:"string"}],sStateWithoutInterpolation:[{token:"constant.other.symbol.ruby",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"constant.other.symbol.ruby"}},{token:"constant.other.symbol.ruby",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","constant.other.symbol.ruby")}},{defaultToken:"constant.other.symbol.ruby"}],sStateWithInterpolation:[{token:"constant.other.symbol.ruby",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"constant.other.symbol.ruby"}},{token:"constant.language.escape",regex:t},{token:"constant.language.escape",regex:/\\./},{token:"paren.start",regex:/#{/,push:"start"},{token:"constant.other.symbol.ruby",regex:/[)\]>}^|%]/,onMatch:function(e,t,n){return n.length&&e===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","constant.other.symbol.ruby")}},{defaultToken:"constant.other.symbol.ruby"}],rState:[{token:"string.regexp",regex:/[(\[<{]/,onMatch:function(e,t,n){return n.length&&e===n[0]?(n.unshift(e,t),this.token):"constant.language.escape"}},{token:"paren.start",regex:/#{/,push:"start"},{token:"string.regexp",regex:/\//},{token:"string.regexp",regex:/[)\]>}^|%][imxouesn]*/,onMatch:function(e,t,n){return n.length&&e[0]===r[n[0]]?(n.shift(),this.next=n.shift(),this.token):(this.next="","constant.language.escape")}},{include:"regex"},{defaultToken:"string.regexp"}],regex:[{token:"regexp.keyword",regex:/\\[wWdDhHsS]/},{token:"constant.language.escape",regex:/\\[AGbBzZ]/},{token:"constant.language.escape",regex:/\\g<[a-zA-Z0-9]*>/},{token:["constant.language.escape","regexp.keyword","constant.language.escape"],regex:/(\\p{\^?)(Alnum|Alpha|Blank|Cntrl|Digit|Graph|Lower|Print|Punct|Space|Upper|XDigit|Word|ASCII|Any|Assigned|Arabic|Armenian|Balinese|Bengali|Bopomofo|Braille|Buginese|Buhid|Canadian_Aboriginal|Carian|Cham|Cherokee|Common|Coptic|Cuneiform|Cypriot|Cyrillic|Deseret|Devanagari|Ethiopic|Georgian|Glagolitic|Gothic|Greek|Gujarati|Gurmukhi|Han|Hangul|Hanunoo|Hebrew|Hiragana|Inherited|Kannada|Katakana|Kayah_Li|Kharoshthi|Khmer|Lao|Latin|Lepcha|Limbu|Linear_B|Lycian|Lydian|Malayalam|Mongolian|Myanmar|New_Tai_Lue|Nko|Ogham|Ol_Chiki|Old_Italic|Old_Persian|Oriya|Osmanya|Phags_Pa|Phoenician|Rejang|Runic|Saurashtra|Shavian|Sinhala|Sundanese|Syloti_Nagri|Syriac|Tagalog|Tagbanwa|Tai_Le|Tamil|Telugu|Thaana|Thai|Tibetan|Tifinagh|Ugaritic|Vai|Yi|Ll|Lm|Lt|Lu|Lo|Mn|Mc|Me|Nd|Nl|Pc|Pd|Ps|Pe|Pi|Pf|Po|No|Sm|Sc|Sk|So|Zs|Zl|Zp|Cc|Cf|Cn|Co|Cs|N|L|M|P|S|Z|C)(})/},{token:["constant.language.escape","invalid","constant.language.escape"],regex:/(\\p{\^?)([^/]*)(})/},{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:/[/][imxouesn]*/,next:"start"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?(?:[:=!>]|<'?[a-zA-Z]*'?>|<[=!])|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"regexp.keyword",regex:/\[\[:(?:alnum|alpha|blank|cntrl|digit|graph|lower|print|punct|space|upper|xdigit|word|ascii):\]\]/},{token:"constant.language.escape",regex:/\[\^?/,push:"regex_character_class"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.keyword",regex:/\\[wWdDhHsS]/},{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:/&?&?\[\^?/,push:"regex_character_class"},{token:"constant.language.escape",regex:"]",next:"pop"},{token:"constant.language.escape",regex:"-"},{defaultToken:"string.regexp.characterclass"}]},this.normalizeRules()}var a=e("../lib/oop"),e=e("./text_highlight_rules").TextHighlightRules,s=t.constantOtherSymbol={token:"constant.other.symbol.ruby",regex:"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?"},o=(t.qString={token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},t.qqString={token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},t.tString={token:"string",regex:"[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]"},t.constantNumericHex={token:"constant.numeric",regex:"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b"}),i=t.constantNumericBinary={token:"constant.numeric",regex:/\b(0[bB][01](?:[01]|_(?=[01]))*)\b/},l=t.constantNumericDecimal={token:"constant.numeric",regex:/\b(0[dD](?:[1-9](?:[\d]|_(?=[\d]))*|0))\b/},c=t.constantNumericDecimal={token:"constant.numeric",regex:/\b(0[oO]?(?:[1-7](?:[0-7]|_(?=[0-7]))*|0))\b/},g=t.constantNumericRational={token:"constant.numeric",regex:/\b([\d]+(?:[./][\d]+)?ri?)\b/},u=t.constantNumericComplex={token:"constant.numeric",regex:/\b([\d]i)\b/},h=t.constantNumericFloat={token:"constant.numeric",regex:"[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?i?\\b"},d=t.instanceVariable={token:"variable.instance",regex:"@{1,2}[a-zA-Z_\\d]+"};a.inherits(r,e),t.RubyHighlightRules=r}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";function r(){}var a=e("../range").Range;(function(){this.checkOutdent=function(e,t){return!!/^\s+$/.test(e)&&/^\s*\}/.test(t)},this.autoOutdent=function(e,t){var n=e.getLine(t).match(/^(\s*\})/);if(!n)return 0;var n=n[1].length,r=e.findMatchingBracket({row:t,column:n});if(!r||r.row==t)return 0;r=this.$getIndent(e.getLine(r.row));e.replace(new a(t,0,t,n-1),r)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(r.prototype),t.MatchingBraceOutdent=r}),define("ace/mode/folding/ruby",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),a=e("./fold_mode").FoldMode,p=e("../../range").Range,k=e("../../token_iterator").TokenIterator,e=t.FoldMode=function(){};r.inherits(e,a),function(){this.indentKeywords={class:1,def:1,module:1,do:1,unless:1,if:1,while:1,for:1,until:1,begin:1,else:0,elsif:0,rescue:0,ensure:0,when:0,end:-1,case:1,"=begin":1,"=end":-1},this.foldingStartMarker=/(?:\s|^)(def|do|while|class|unless|module|if|for|until|begin|else|elsif|case|rescue|ensure|when)\b|({\s*$)|(=begin)/,this.foldingStopMarker=/(=end(?=$|\s.*$))|(^\s*})|\b(end)\b/,this.getFoldWidget=function(e,t,n){var r,a=e.getLine(n),s=this.foldingStartMarker.test(a),o=this.foldingStopMarker.test(a);if(s&&!o)if((r=a.match(this.foldingStartMarker))[1]){if("if"==r[1]||"else"==r[1]||"while"==r[1]||"until"==r[1]||"unless"==r[1]){if("else"==r[1]&&!1===/^\s*else\s*$/.test(a))return;if(!1===/^\s*(?:if|else|while|until|unless)\s*/.test(a))return}if("when"==r[1]&&!0===/\sthen\s/.test(a))return;if("keyword"===e.getTokenAt(n,r.index+2).type)return"start"}else{if(!r[3])return"start";if("comment.multiline"===e.getTokenAt(n,r.index+1).type)return"start"}return"markbeginend"!=t||!o||s&&o?"":"end"!==(r=a.match(this.foldingStopMarker))[3]?!r[1]||"comment.multiline"===e.getTokenAt(n,r.index+1).type?"end":void 0:"keyword"===e.getTokenAt(n,r.index+1).type?"end":void 0},this.getFoldWidgetRange=function(e,t,n){var r=e.doc.getLine(n),a=this.foldingStartMarker.exec(r);return a?a[1]||a[3]?this.rubyBlock(e,n,a.index+2):this.openingBracketBlock(e,"{",n,a.index):(a=this.foldingStopMarker.exec(r))?"end"===a[3]&&"keyword"===e.getTokenAt(n,a.index+1).type||"=end"===a[1]&&"comment.multiline"===e.getTokenAt(n,a.index+1).type?this.rubyBlock(e,n,a.index+1):this.closingBracketBlock(e,"}",n,a.index+a[0].length):void 0},this.rubyBlock=function(e,t,n,r){var a=new k(e,t,n),s=a.getCurrentToken();if(s&&("keyword"==s.type||"comment.multiline"==s.type)){var o=s.value,i=e.getLine(t);switch(s.value){case"if":case"unless":case"while":case"until":if(!new RegExp("^\\s*"+s.value).test(i))return;var l=this.indentKeywords[o];break;case"when":if(/\sthen\s/.test(i))return;case"elsif":case"rescue":case"ensure":l=1;break;case"else":if(!new RegExp("^\\s*"+s.value+"\\s*$").test(i))return;l=1;break;default:l=this.indentKeywords[o]}var c=[o];if(l){var g=(-1===l?e.getLine(t-1):e.getLine(t)).length,n=t,u=[];if(u.push(a.getCurrentTokenRange()),a.step=-1===l?a.stepBackward:a.stepForward,"comment.multiline"==s.type){for(;s=a.step();)if("comment.multiline"===s.type)if(1==l){if(g=6,"=end"==s.value)break}else if("=begin"==s.value)break}else for(;s=a.step();){var h=!1;if("keyword"===s.type){var d=l*this.indentKeywords[s.value],i=e.getLine(a.getCurrentTokenRow());switch(s.value){case"do":for(var _=a.$tokenIndex-1;0<=_;_--){var f=a.$rowTokens[_];if(f&&("while"==f.value||"until"==f.value||"for"==f.value)){d=0;break}}break;case"else":new RegExp("^\\s*"+s.value+"\\s*$").test(i)&&"case"!=o||(h=!(d=0));break;case"if":case"unless":case"while":case"until":new RegExp("^\\s*"+s.value).test(i)||(h=!(d=0));break;case"when":!/\sthen\s/.test(i)&&"case"!=o||(h=!(d=0))}if(0<d)c.unshift(s.value);else if(d<=0&&!1===h){if(c.shift(),!c.length){if(("while"==o||"until"==o||"for"==o)&&"do"!=s.value)break;if("do"==s.value&&-1==l&&0!=d)break;if("do"!=s.value)break}0===d&&c.unshift(s.value)}}}if(!s)return null;if(r)return u.push(a.getCurrentTokenRange()),u;t=a.getCurrentTokenRow();return-1===l?(r="comment.multiline"===s.type?6:e.getLine(t).length,new p(t,r,n-1,g)):new p(n,g,t-1,e.getLine(t-1).length)}}}}.call(e.prototype)}),define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/folding/ruby"],function(e,t,n){"use strict";function r(){this.HighlightRules=o,this.$outdent=new i,this.$behaviour=this.$defaultBehaviour,this.foldingRules=new c,this.indentKeywords=this.foldingRules.indentKeywords}var a=e("../lib/oop"),s=e("./text").Mode,o=e("./ruby_highlight_rules").RubyHighlightRules,i=e("./matching_brace_outdent").MatchingBraceOutdent,l=e("../range").Range,c=e("./folding/ruby").FoldMode;a.inherits(r,s),function(){this.lineCommentStart="#",this.getNextLineIndent=function(e,t,n){var r,a=this.$getIndent(t),s=this.getTokenizer().getLineTokens(t,e).tokens;return s.length&&"comment"==s[s.length-1].type||"start"==e&&(s=t.match(/^.*[\{\(\[]\s*$/),e=t.match(/^\s*(class|def|module)\s.*$/),r=t.match(/.*do(\s*|\s+\|.*\|\s*)$/),t=t.match(/^\s*(if|else|when|elsif|unless|while|for|begin|rescue|ensure)\s*/),(s||e||r||t)&&(a+=n)),a},this.checkOutdent=function(e,t,n){return/^\s+(end|else|rescue|ensure)$/.test(t+n)||this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){var r=t.getLine(n);if(/}/.test(r))return this.$outdent.autoOutdent(t,n);var r=this.$getIndent(r),a=t.getLine(n-1),a=this.$getIndent(a),s=t.getTabString();a.length<=r.length&&r.slice(-s.length)==s&&t.remove(new l(n,r.length-s.length,n,r.length))},this.getMatching=function(e,t,n){null==t&&(n=(r=e.selection.lead).column,t=r.row);var r=e.getTokenAt(t,n);if(r&&r.value in this.indentKeywords)return this.foldingRules.rubyBlock(e,t,n,!0)},this.$id="ace/mode/ruby",this.snippetFileId="ace/snippets/ruby"}.call(r.prototype),t.Mode=r}),window.require(["ace/mode/ruby"],function(e){"object"==typeof module&&"object"==typeof exports&&module&&(module.exports=e)});
@@ -0,0 +1 @@
1
+ define("ace/snippets/ruby.snippets",["require","exports","module"],function(n,t,e){e.exports='########################################\n# Ruby snippets - for Rails, see below #\n########################################\n\n# encoding for Ruby 1.9\nsnippet enc\n\t# encoding: utf-8\n\n# #!/usr/bin/env ruby\nsnippet #!\n\t#!/usr/bin/env ruby\n\t# encoding: utf-8\n\n# New Block\nsnippet =b\n\t=begin rdoc\n\t\t${1}\n\t=end\nsnippet y\n\t:yields: ${1:arguments}\nsnippet rb\n\t#!/usr/bin/env ruby -wKU\nsnippet beg\n\tbegin\n\t\t${3}\n\trescue ${1:Exception} => ${2:e}\n\tend\n\nsnippet req require\n\trequire "${1}"${2}\nsnippet #\n\t# =>\nsnippet end\n\t__END__\nsnippet case\n\tcase ${1:object}\n\twhen ${2:condition}\n\t\t${3}\n\tend\nsnippet when\n\twhen ${1:condition}\n\t\t${2}\nsnippet def\n\tdef ${1:method_name}\n\t\t${2}\n\tend\nsnippet deft\n\tdef test_${1:case_name}\n\t\t${2}\n\tend\nsnippet if\n\tif ${1:condition}\n\t\t${2}\n\tend\nsnippet ife\n\tif ${1:condition}\n\t\t${2}\n\telse\n\t\t${3}\n\tend\nsnippet elsif\n\telsif ${1:condition}\n\t\t${2}\nsnippet unless\n\tunless ${1:condition}\n\t\t${2}\n\tend\nsnippet while\n\twhile ${1:condition}\n\t\t${2}\n\tend\nsnippet for\n\tfor ${1:e} in ${2:c}\n\t\t${3}\n\tend\nsnippet until\n\tuntil ${1:condition}\n\t\t${2}\n\tend\nsnippet cla class .. end\n\tclass ${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`}\n\t\t${2}\n\tend\nsnippet cla class .. initialize .. end\n\tclass ${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`}\n\t\tdef initialize(${2:args})\n\t\t\t${3}\n\t\tend\n\tend\nsnippet cla class .. < ParentClass .. initialize .. end\n\tclass ${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`} < ${2:ParentClass}\n\t\tdef initialize(${3:args})\n\t\t\t${4}\n\t\tend\n\tend\nsnippet cla ClassName = Struct .. do .. end\n\t${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`} = Struct.new(:${2:attr_names}) do\n\t\tdef ${3:method_name}\n\t\t\t${4}\n\t\tend\n\tend\nsnippet cla class BlankSlate .. initialize .. end\n\tclass ${1:BlankSlate}\n\t\tinstance_methods.each { |meth| undef_method(meth) unless meth =~ /\\A__/ }\n\tend\nsnippet cla class << self .. end\n\tclass << ${1:self}\n\t\t${2}\n\tend\n# class .. < DelegateClass .. initialize .. end\nsnippet cla-\n\tclass ${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`} < DelegateClass(${2:ParentClass})\n\t\tdef initialize(${3:args})\n\t\t\tsuper(${4:del_obj})\n\n\t\t\t${5}\n\t\tend\n\tend\nsnippet mod module .. end\n\tmodule ${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`}\n\t\t${2}\n\tend\nsnippet mod module .. module_function .. end\n\tmodule ${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`}\n\t\tmodule_function\n\n\t\t${2}\n\tend\nsnippet mod module .. ClassMethods .. end\n\tmodule ${1:`substitute(Filename(), \'\\(_\\|^\\)\\(.\\)\', \'\\u\\2\', \'g\')`}\n\t\tmodule ClassMethods\n\t\t\t${2}\n\t\tend\n\n\t\tmodule InstanceMethods\n\n\t\tend\n\n\t\tdef self.included(receiver)\n\t\t\treceiver.extend ClassMethods\n\t\t\treceiver.send :include, InstanceMethods\n\t\tend\n\tend\n# attr_reader\nsnippet r\n\tattr_reader :${1:attr_names}\n# attr_writer\nsnippet w\n\tattr_writer :${1:attr_names}\n# attr_accessor\nsnippet rw\n\tattr_accessor :${1:attr_names}\nsnippet atp\n\tattr_protected :${1:attr_names}\nsnippet ata\n\tattr_accessible :${1:attr_names}\n# include Enumerable\nsnippet Enum\n\tinclude Enumerable\n\n\tdef each(&block)\n\t\t${1}\n\tend\n# include Comparable\nsnippet Comp\n\tinclude Comparable\n\n\tdef <=>(other)\n\t\t${1}\n\tend\n# extend Forwardable\nsnippet Forw-\n\textend Forwardable\n# def self\nsnippet defs\n\tdef self.${1:class_method_name}\n\t\t${2}\n\tend\n# def method_missing\nsnippet defmm\n\tdef method_missing(meth, *args, &blk)\n\t\t${1}\n\tend\nsnippet defd\n\tdef_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name}\nsnippet defds\n\tdef_delegators :${1:@del_obj}, :${2:del_methods}\nsnippet am\n\talias_method :${1:new_name}, :${2:old_name}\nsnippet app\n\tif __FILE__ == $PROGRAM_NAME\n\t\t${1}\n\tend\n# usage_if()\nsnippet usai\n\tif ARGV.${1}\n\t\tabort "Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}"${3}\n\tend\n# usage_unless()\nsnippet usau\n\tunless ARGV.${1}\n\t\tabort "Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}"${3}\n\tend\nsnippet array\n\tArray.new(${1:10}) { |${2:i}| ${3} }\nsnippet hash\n\tHash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} }\nsnippet file File.foreach() { |line| .. }\n\tFile.foreach(${1:"path/to/file"}) { |${2:line}| ${3} }\nsnippet file File.read()\n\tFile.read(${1:"path/to/file"})${2}\nsnippet Dir Dir.global() { |file| .. }\n\tDir.glob(${1:"dir/glob/*"}) { |${2:file}| ${3} }\nsnippet Dir Dir[".."]\n\tDir[${1:"glob/**/*.rb"}]${2}\nsnippet dir\n\tFilename.dirname(__FILE__)\nsnippet deli\n\tdelete_if { |${1:e}| ${2} }\nsnippet fil\n\tfill(${1:range}) { |${2:i}| ${3} }\n# flatten_once()\nsnippet flao\n\tinject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3}\nsnippet zip\n\tzip(${1:enums}) { |${2:row}| ${3} }\n# downto(0) { |n| .. }\nsnippet dow\n\tdownto(${1:0}) { |${2:n}| ${3} }\nsnippet ste\n\tstep(${1:2}) { |${2:n}| ${3} }\nsnippet tim\n\ttimes { |${1:n}| ${2} }\nsnippet upt\n\tupto(${1:1.0/0.0}) { |${2:n}| ${3} }\nsnippet loo\n\tloop { ${1} }\nsnippet ea\n\teach { |${1:e}| ${2} }\nsnippet ead\n\teach do |${1:e}|\n\t\t${2}\n\tend\nsnippet eab\n\teach_byte { |${1:byte}| ${2} }\nsnippet eac- each_char { |chr| .. }\n\teach_char { |${1:chr}| ${2} }\nsnippet eac- each_cons(..) { |group| .. }\n\teach_cons(${1:2}) { |${2:group}| ${3} }\nsnippet eai\n\teach_index { |${1:i}| ${2} }\nsnippet eaid\n\teach_index do |${1:i}|\n\t\t${2}\n\tend\nsnippet eak\n\teach_key { |${1:key}| ${2} }\nsnippet eakd\n\teach_key do |${1:key}|\n\t\t${2}\n\tend\nsnippet eal\n\teach_line { |${1:line}| ${2} }\nsnippet eald\n\teach_line do |${1:line}|\n\t\t${2}\n\tend\nsnippet eap\n\teach_pair { |${1:name}, ${2:val}| ${3} }\nsnippet eapd\n\teach_pair do |${1:name}, ${2:val}|\n\t\t${3}\n\tend\nsnippet eas-\n\teach_slice(${1:2}) { |${2:group}| ${3} }\nsnippet easd-\n\teach_slice(${1:2}) do |${2:group}|\n\t\t${3}\n\tend\nsnippet eav\n\teach_value { |${1:val}| ${2} }\nsnippet eavd\n\teach_value do |${1:val}|\n\t\t${2}\n\tend\nsnippet eawi\n\teach_with_index { |${1:e}, ${2:i}| ${3} }\nsnippet eawid\n\teach_with_index do |${1:e},${2:i}|\n\t\t${3}\n\tend\nsnippet reve\n\treverse_each { |${1:e}| ${2} }\nsnippet reved\n\treverse_each do |${1:e}|\n\t\t${2}\n\tend\nsnippet inj\n\tinject(${1:init}) { |${2:mem}, ${3:var}| ${4} }\nsnippet injd\n\tinject(${1:init}) do |${2:mem}, ${3:var}|\n\t\t${4}\n\tend\nsnippet map\n\tmap { |${1:e}| ${2} }\nsnippet mapd\n\tmap do |${1:e}|\n\t\t${2}\n\tend\nsnippet mapwi-\n\tenum_with_index.map { |${1:e}, ${2:i}| ${3} }\nsnippet sor\n\tsort { |a, b| ${1} }\nsnippet sorb\n\tsort_by { |${1:e}| ${2} }\nsnippet ran\n\tsort_by { rand }\nsnippet all\n\tall? { |${1:e}| ${2} }\nsnippet any\n\tany? { |${1:e}| ${2} }\nsnippet cl\n\tclassify { |${1:e}| ${2} }\nsnippet col\n\tcollect { |${1:e}| ${2} }\nsnippet cold\n\tcollect do |${1:e}|\n\t\t${2}\n\tend\nsnippet det\n\tdetect { |${1:e}| ${2} }\nsnippet detd\n\tdetect do |${1:e}|\n\t\t${2}\n\tend\nsnippet fet\n\tfetch(${1:name}) { |${2:key}| ${3} }\nsnippet fin\n\tfind { |${1:e}| ${2} }\nsnippet find\n\tfind do |${1:e}|\n\t\t${2}\n\tend\nsnippet fina\n\tfind_all { |${1:e}| ${2} }\nsnippet finad\n\tfind_all do |${1:e}|\n\t\t${2}\n\tend\nsnippet gre\n\tgrep(${1:/pattern/}) { |${2:match}| ${3} }\nsnippet sub\n\t${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} }\nsnippet sca\n\tscan(${1:/pattern/}) { |${2:match}| ${3} }\nsnippet scad\n\tscan(${1:/pattern/}) do |${2:match}|\n\t\t${3}\n\tend\nsnippet max\n\tmax { |a, b| ${1} }\nsnippet min\n\tmin { |a, b| ${1} }\nsnippet par\n\tpartition { |${1:e}| ${2} }\nsnippet pard\n\tpartition do |${1:e}|\n\t\t${2}\n\tend\nsnippet rej\n\treject { |${1:e}| ${2} }\nsnippet rejd\n\treject do |${1:e}|\n\t\t${2}\n\tend\nsnippet sel\n\tselect { |${1:e}| ${2} }\nsnippet seld\n\tselect do |${1:e}|\n\t\t${2}\n\tend\nsnippet lam\n\tlambda { |${1:args}| ${2} }\nsnippet doo\n\tdo\n\t\t${1}\n\tend\nsnippet dov\n\tdo |${1:variable}|\n\t\t${2}\n\tend\nsnippet :\n\t:${1:key} => ${2:"value"}${3}\nsnippet ope\n\topen(${1:"path/or/url/or/pipe"}, "${2:w}") { |${3:io}| ${4} }\n# path_from_here()\nsnippet fpath\n\tFile.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2}\n# unix_filter {}\nsnippet unif\n\tARGF.each_line${1} do |${2:line}|\n\t\t${3}\n\tend\n# option_parse {}\nsnippet optp\n\trequire "optparse"\n\n\toptions = {${1:default => "args"}}\n\n\tARGV.options do |opts|\n\t\topts.banner = "Usage: #{File.basename($PROGRAM_NAME)}\nsnippet opt\n\topts.on( "-${1:o}", "--${2:long-option-name}", ${3:String},\n\t "${4:Option description.}") do |${5:opt}|\n\t\t${6}\n\tend\nsnippet tc\n\trequire "test/unit"\n\n\trequire "${1:library_file_name}"\n\n\tclass Test${2:$1} < Test::Unit::TestCase\n\t\tdef test_${3:case_name}\n\t\t\t${4}\n\t\tend\n\tend\nsnippet ts\n\trequire "test/unit"\n\n\trequire "tc_${1:test_case_file}"\n\trequire "tc_${2:test_case_file}"${3}\nsnippet as\n\tassert ${1:test}, "${2:Failure message.}"${3}\nsnippet ase\n\tassert_equal ${1:expected}, ${2:actual}${3}\nsnippet asne\n\tassert_not_equal ${1:unexpected}, ${2:actual}${3}\nsnippet asid\n\tassert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:2 ** -20}${4}\nsnippet asio\n\tassert_instance_of ${1:ExpectedClass}, ${2:actual_instance}${3}\nsnippet asko\n\tassert_kind_of ${1:ExpectedKind}, ${2:actual_instance}${3}\nsnippet asn\n\tassert_nil ${1:instance}${2}\nsnippet asnn\n\tassert_not_nil ${1:instance}${2}\nsnippet asm\n\tassert_match /${1:expected_pattern}/, ${2:actual_string}${3}\nsnippet asnm\n\tassert_no_match /${1:unexpected_pattern}/, ${2:actual_string}${3}\nsnippet aso\n\tassert_operator ${1:left}, :${2:operator}, ${3:right}${4}\nsnippet asr\n\tassert_raise ${1:Exception} { ${2} }\nsnippet asrd\n\tassert_raise ${1:Exception} do\n\t\t${2}\n\tend\nsnippet asnr\n\tassert_nothing_raised ${1:Exception} { ${2} }\nsnippet asnrd\n\tassert_nothing_raised ${1:Exception} do\n\t\t${2}\n\tend\nsnippet asrt\n\tassert_respond_to ${1:object}, :${2:method}${3}\nsnippet ass assert_same(..)\n\tassert_same ${1:expected}, ${2:actual}${3}\nsnippet ass assert_send(..)\n\tassert_send [${1:object}, :${2:message}, ${3:args}]${4}\nsnippet asns\n\tassert_not_same ${1:unexpected}, ${2:actual}${3}\nsnippet ast\n\tassert_throws :${1:expected} { ${2} }\nsnippet astd\n\tassert_throws :${1:expected} do\n\t\t${2}\n\tend\nsnippet asnt\n\tassert_nothing_thrown { ${1} }\nsnippet asntd\n\tassert_nothing_thrown do\n\t\t${1}\n\tend\nsnippet fl\n\tflunk "${1:Failure message.}"${2}\n# Benchmark.bmbm do .. end\nsnippet bm-\n\tTESTS = ${1:10_000}\n\tBenchmark.bmbm do |results|\n\t\t${2}\n\tend\nsnippet rep\n\tresults.report("${1:name}:") { TESTS.times { ${2} }}\n# Marshal.dump(.., file)\nsnippet Md\n\tFile.open(${1:"path/to/file.dump"}, "wb") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4}\n# Mashal.load(obj)\nsnippet Ml\n\tFile.open(${1:"path/to/file.dump"}, "rb") { |${2:file}| Marshal.load($2) }${3}\n# deep_copy(..)\nsnippet deec\n\tMarshal.load(Marshal.dump(${1:obj_to_copy}))${2}\nsnippet Pn-\n\tPStore.new(${1:"file_name.pstore"})${2}\nsnippet tra\n\ttransaction(${1:true}) { ${2} }\n# xmlread(..)\nsnippet xml-\n\tREXML::Document.new(File.read(${1:"path/to/file"}))${2}\n# xpath(..) { .. }\nsnippet xpa\n\telements.each(${1:"//Xpath"}) do |${2:node}|\n\t\t${3}\n\tend\n# class_from_name()\nsnippet clafn\n\tsplit("::").inject(Object) { |par, const| par.const_get(const) }\n# singleton_class()\nsnippet sinc\n\tclass << self; self end\nsnippet nam\n\tnamespace :${1:`Filename()`} do\n\t\t${2}\n\tend\nsnippet tas\n\tdesc "${1:Task description}"\n\ttask :${2:task_name => [:dependent, :tasks]} do\n\t\t${3}\n\tend\n# block\nsnippet b\n\t{ |${1:var}| ${2} }\nsnippet begin\n\tbegin\n\t\traise \'A test exception.\'\n\trescue Exception => e\n\t\tputs e.message\n\t\tputs e.backtrace.inspect\n\telse\n\t\t# other exception\n\tensure\n\t\t# always executed\n\tend\n\n#debugging\nsnippet debug\n\trequire \'ruby-debug\'; debugger; true;\nsnippet pry\n\trequire \'pry\'; binding.pry\n\n#############################################\n# Rails snippets - for pure Ruby, see above #\n#############################################\nsnippet art\n\tassert_redirected_to ${1::action => "${2:index}"}\nsnippet artnp\n\tassert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${4:@$2})\nsnippet artnpp\n\tassert_redirected_to ${1:parent}_${2:child}_path(${3:@$1})\nsnippet artp\n\tassert_redirected_to ${1:model}_path(${2:@$1})\nsnippet artpp\n\tassert_redirected_to ${1:model}s_path\nsnippet asd\n\tassert_difference "${1:Model}.${2:count}", $1 do\n\t\t${3}\n\tend\nsnippet asnd\n\tassert_no_difference "${1:Model}.${2:count}" do\n\t\t${3}\n\tend\nsnippet asre\n\tassert_response :${1:success}, @response.body${2}\nsnippet asrj\n\tassert_rjs :${1:replace}, "${2:dom id}"\nsnippet ass assert_select(..)\n\tassert_select \'${1:path}\', :${2:text} => \'${3:inner_html\' ${4:do}\nsnippet bf\n\tbefore_filter :${1:method}\nsnippet bt\n\tbelongs_to :${1:association}\nsnippet crw\n\tcattr_accessor :${1:attr_names}\nsnippet defcreate\n\tdef create\n\t\t@${1:model_class_name} = ${2:ModelClassName}.new(params[:$1])\n\n\t\trespond_to do |wants|\n\t\t\tif @$1.save\n\t\t\t\tflash[:notice] = \'$2 was successfully created.\'\n\t\t\t\twants.html { redirect_to(@$1) }\n\t\t\t\twants.xml { render :xml => @$1, :status => :created, :location => @$1 }\n\t\t\telse\n\t\t\t\twants.html { render :action => "new" }\n\t\t\t\twants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\t\t\tend\n\t\tend\n\tend${3}\nsnippet defdestroy\n\tdef destroy\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\t\t@$1.destroy\n\n\t\trespond_to do |wants|\n\t\t\twants.html { redirect_to($1s_url) }\n\t\t\twants.xml { head :ok }\n\t\tend\n\tend${3}\nsnippet defedit\n\tdef edit\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\tend\nsnippet defindex\n\tdef index\n\t\t@${1:model_class_name} = ${2:ModelClassName}.all\n\n\t\trespond_to do |wants|\n\t\t\twants.html # index.html.erb\n\t\t\twants.xml { render :xml => @$1s }\n\t\tend\n\tend${3}\nsnippet defnew\n\tdef new\n\t\t@${1:model_class_name} = ${2:ModelClassName}.new\n\n\t\trespond_to do |wants|\n\t\t\twants.html # new.html.erb\n\t\t\twants.xml { render :xml => @$1 }\n\t\tend\n\tend${3}\nsnippet defshow\n\tdef show\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\n\t\trespond_to do |wants|\n\t\t\twants.html # show.html.erb\n\t\t\twants.xml { render :xml => @$1 }\n\t\tend\n\tend${3}\nsnippet defupdate\n\tdef update\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\n\t\trespond_to do |wants|\n\t\t\tif @$1.update_attributes(params[:$1])\n\t\t\t\tflash[:notice] = \'$2 was successfully updated.\'\n\t\t\t\twants.html { redirect_to(@$1) }\n\t\t\t\twants.xml { head :ok }\n\t\t\telse\n\t\t\t\twants.html { render :action => "edit" }\n\t\t\t\twants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\t\t\tend\n\t\tend\n\tend${3}\nsnippet flash\n\tflash[:${1:notice}] = "${2}"\nsnippet habtm\n\thas_and_belongs_to_many :${1:object}, :join_table => "${2:table_name}", :foreign_key => "${3}_id"${4}\nsnippet hm\n\thas_many :${1:object}\nsnippet hmd\n\thas_many :${1:other}s, :class_name => "${2:$1}", :foreign_key => "${3:$1}_id", :dependent => :destroy${4}\nsnippet hmt\n\thas_many :${1:object}, :through => :${2:object}\nsnippet ho\n\thas_one :${1:object}\nsnippet i18\n\tI18n.t(\'${1:type.key}\')${2}\nsnippet ist\n\t<%= image_submit_tag("${1:agree.png}", :id => "${2:id}"${3} %>\nsnippet log\n\tRails.logger.${1:debug} ${2}\nsnippet log2\n\tRAILS_DEFAULT_LOGGER.${1:debug} ${2}\nsnippet logd\n\tlogger.debug { "${1:message}" }${2}\nsnippet loge\n\tlogger.error { "${1:message}" }${2}\nsnippet logf\n\tlogger.fatal { "${1:message}" }${2}\nsnippet logi\n\tlogger.info { "${1:message}" }${2}\nsnippet logw\n\tlogger.warn { "${1:message}" }${2}\nsnippet mapc\n\t${1:map}.${2:connect} \'${3:controller/:action/:id}\'\nsnippet mapca\n\t${1:map}.catch_all "*${2:anything}", :controller => "${3:default}", :action => "${4:error}"${5}\nsnippet mapr\n\t${1:map}.resource :${2:resource}\nsnippet maprs\n\t${1:map}.resources :${2:resource}\nsnippet mapwo\n\t${1:map}.with_options :${2:controller} => \'${3:thing}\' do |$3|\n\t\t${4}\n\tend\nsnippet mbs\n\tbefore_save :${1:method}\nsnippet mcht\n\tchange_table :${1:table_name} do |t|\n\t\t${2}\n\tend\nsnippet mp\n\tmap(&:${1:id})\nsnippet mrw\n\tmattr_accessor :${1:attr_names}\nsnippet oa\n\torder("${1:field}")\nsnippet od\n\torder("${1:field} DESC")\nsnippet pa\n\tparams[:${1:id}]${2}\nsnippet ra\n\trender :action => "${1:action}"\nsnippet ral\n\trender :action => "${1:action}", :layout => "${2:layoutname}"\nsnippet rest\n\trespond_to do |wants|\n\t\twants.${1:html} { ${2} }\n\tend\nsnippet rf\n\trender :file => "${1:filepath}"\nsnippet rfu\n\trender :file => "${1:filepath}", :use_full_path => ${2:false}\nsnippet ri\n\trender :inline => "${1:<%= \'hello\' %>}"\nsnippet ril\n\trender :inline => "${1:<%= \'hello\' %>}", :locals => { ${2::name} => "${3:value}"${4} }\nsnippet rit\n\trender :inline => "${1:<%= \'hello\' %>}", :type => ${2::rxml}\nsnippet rjson\n\trender :json => ${1:text to render}\nsnippet rl\n\trender :layout => "${1:layoutname}"\nsnippet rn\n\trender :nothing => ${1:true}\nsnippet rns\n\trender :nothing => ${1:true}, :status => ${2:401}\nsnippet rp\n\trender :partial => "${1:item}"\nsnippet rpc\n\trender :partial => "${1:item}", :collection => ${2:@$1s}\nsnippet rpl\n\trender :partial => "${1:item}", :locals => { :${2:$1} => ${3:@$1}\nsnippet rpo\n\trender :partial => "${1:item}", :object => ${2:@$1}\nsnippet rps\n\trender :partial => "${1:item}", :status => ${2:500}\nsnippet rt\n\trender :text => "${1:text to render}"\nsnippet rtl\n\trender :text => "${1:text to render}", :layout => "${2:layoutname}"\nsnippet rtlt\n\trender :text => "${1:text to render}", :layout => ${2:true}\nsnippet rts\n\trender :text => "${1:text to render}", :status => ${2:401}\nsnippet ru\n\trender :update do |${1:page}|\n\t\t$1.${2}\n\tend\nsnippet rxml\n\trender :xml => ${1:text to render}\nsnippet sc\n\tscope :${1:name}, :where(:@${2:field} => ${3:value})\nsnippet sl\n\tscope :${1:name}, lambda do |${2:value}|\n\t\twhere("${3:field = ?}", ${4:bind var})\n\tend\nsnippet sha1\n\tDigest::SHA1.hexdigest(${1:string})\nsnippet sweeper\n\tclass ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper\n\t\tobserve $1\n\n\t\tdef after_save(${2:model_class_name})\n\t\t\texpire_cache($2)\n\t\tend\n\n\t\tdef after_destroy($2)\n\t\t\texpire_cache($2)\n\t\tend\n\n\t\tdef expire_cache($2)\n\t\t\texpire_page\n\t\tend\n\tend\nsnippet tcb\n\tt.boolean :${1:title}\n\t${2}\nsnippet tcbi\n\tt.binary :${1:title}, :limit => ${2:2}.megabytes\n\t${3}\nsnippet tcd\n\tt.decimal :${1:title}, :precision => ${2:10}, :scale => ${3:2}\n\t${4}\nsnippet tcda\n\tt.date :${1:title}\n\t${2}\nsnippet tcdt\n\tt.datetime :${1:title}\n\t${2}\nsnippet tcf\n\tt.float :${1:title}\n\t${2}\nsnippet tch\n\tt.change :${1:name}, :${2:string}, :${3:limit} => ${4:80}\n\t${5}\nsnippet tci\n\tt.integer :${1:title}\n\t${2}\nsnippet tcl\n\tt.integer :lock_version, :null => false, :default => 0\n\t${1}\nsnippet tcr\n\tt.references :${1:taggable}, :polymorphic => { :default => \'${2:Photo}\' }\n\t${3}\nsnippet tcs\n\tt.string :${1:title}\n\t${2}\nsnippet tct\n\tt.text :${1:title}\n\t${2}\nsnippet tcti\n\tt.time :${1:title}\n\t${2}\nsnippet tcts\n\tt.timestamp :${1:title}\n\t${2}\nsnippet tctss\n\tt.timestamps\n\t${1}\nsnippet va\n\tvalidates_associated :${1:attribute}\nsnippet vao\n\tvalidates_acceptance_of :${1:terms}\nsnippet vc\n\tvalidates_confirmation_of :${1:attribute}\nsnippet ve\n\tvalidates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )}\nsnippet vf\n\tvalidates_format_of :${1:attribute}, :with => /${2:regex}/\nsnippet vi\n\tvalidates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi })\nsnippet vl\n\tvalidates_length_of :${1:attribute}, :within => ${2:3}..${3:20}\nsnippet vn\n\tvalidates_numericality_of :${1:attribute}\nsnippet vpo\n\tvalidates_presence_of :${1:attribute}\nsnippet vu\n\tvalidates_uniqueness_of :${1:attribute}\nsnippet wants\n\twants.${1:js|xml|html} { ${2} }\nsnippet wc\n\twhere(${1:"conditions"}${2:, bind_var})\nsnippet wh\n\twhere(${1:field} => ${2:value})\nsnippet xdelete\n\txhr :delete, :${1:destroy}, :id => ${2:1}${3}\nsnippet xget\n\txhr :get, :${1:show}, :id => ${2:1}${3}\nsnippet xpost\n\txhr :post, :${1:create}, :${2:object} => { ${3} }\nsnippet xput\n\txhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5}\nsnippet test\n\ttest "should ${1:do something}" do\n\t\t${2}\n\tend\n#migrations\nsnippet mac\n\tadd_column :${1:table_name}, :${2:column_name}, :${3:data_type}\nsnippet mrc\n\tremove_column :${1:table_name}, :${2:column_name}\nsnippet mrnc\n\trename_column :${1:table_name}, :${2:old_column_name}, :${3:new_column_name}\nsnippet mcc\n\tchange_column :${1:table}, :${2:column}, :${3:type}\nsnippet mccc\n\tt.column :${1:title}, :${2:string}\nsnippet mct\n\tcreate_table :${1:table_name} do |t|\n\t\tt.column :${2:name}, :${3:type}\n\tend\nsnippet migration\n\tclass ${1:class_name} < ActiveRecord::Migration\n\t\tdef self.up\n\t\t\t${2}\n\t\tend\n\n\t\tdef self.down\n\t\tend\n\tend\n\nsnippet trc\n\tt.remove :${1:column}\nsnippet tre\n\tt.rename :${1:old_column_name}, :${2:new_column_name}\n\t${3}\nsnippet tref\n\tt.references :${1:model}\n\n#rspec\nsnippet it\n\tit "${1:spec_name}" do\n\t\t${2}\n\tend\nsnippet itp\n\tit "${1:spec_name}"\n\t${2}\nsnippet desc\n\tdescribe ${1:class_name} do\n\t\t${2}\n\tend\nsnippet cont\n\tcontext "${1:message}" do\n\t\t${2}\n\tend\nsnippet bef\n\tbefore :${1:each} do\n\t\t${2}\n\tend\nsnippet aft\n\tafter :${1:each} do\n\t\t${2}\n\tend\n'}),define("ace/snippets/ruby",["require","exports","module","ace/snippets/ruby.snippets"],function(n,t,e){"use strict";t.snippetText=n("./ruby.snippets"),t.scope="ruby"}),window.require(["ace/snippets/ruby"],function(n){"object"==typeof module&&"object"==typeof exports&&module&&(module.exports=n)});
@@ -1 +1 @@
1
- define("ace/theme/solarized_dark.css",["require","exports","module"],function(a,e,r){r.exports='.ace-solarized-dark .ace_gutter {\n background: #01313f;\n color: #d0edf7\n}\n\n.ace-solarized-dark .ace_print-margin {\n width: 1px;\n background: #33555E\n}\n\n.ace-solarized-dark {\n background-color: #002B36;\n color: #93A1A1\n}\n\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-solarized-dark .ace_storage {\n color: #93A1A1\n}\n\n.ace-solarized-dark .ace_cursor,\n.ace-solarized-dark .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_active-line,\n.ace-solarized-dark .ace_marker-layer .ace_selection {\n background: rgba(255, 255, 255, 0.1)\n}\n\n.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002B36;\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_gutter-active-line {\n background-color: #0d3440\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #073642\n}\n\n.ace-solarized-dark .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_keyword,\n.ace-solarized-dark .ace_meta,\n.ace-solarized-dark .ace_support.ace_class,\n.ace-solarized-dark .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-dark .ace_constant.ace_character,\n.ace-solarized-dark .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-dark .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-dark .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-dark .ace_fold {\n background-color: #268BD2;\n border-color: #93A1A1\n}\n\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\n.ace-solarized-dark .ace_support.ace_function,\n.ace-solarized-dark .ace_variable,\n.ace-solarized-dark .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-dark .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-dark .ace_comment {\n font-style: italic;\n color: #657B83\n}\n\n.ace-solarized-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-dark .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n}\n'}),define("ace/theme/solarized_dark",["require","exports","module","ace/theme/solarized_dark.css","ace/lib/dom"],function(a,e,r){e.isDark=!0,e.cssClass="ace-solarized-dark",e.cssText=a("./solarized_dark.css"),a("../lib/dom").importCssString(e.cssText,e.cssClass,!1)}),window.require(["ace/theme/solarized_dark"],function(a){"object"==typeof module&&"object"==typeof exports&&module&&(module.exports=a)});
1
+ define("ace/theme/solarized_dark-css",["require","exports","module"],function(a,e,r){r.exports=".ace-solarized-dark .ace_gutter {\n background: #01313f;\n color: #d0edf7\n}\n\n.ace-solarized-dark .ace_print-margin {\n width: 1px;\n background: #33555E\n}\n\n.ace-solarized-dark {\n background-color: #002B36;\n color: #839496\n}\n\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-solarized-dark .ace_storage {\n color: #839496\n}\n\n.ace-solarized-dark .ace_cursor,\n.ace-solarized-dark .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_active-line,\n.ace-solarized-dark .ace_marker-layer .ace_selection {\n background: rgba(255, 255, 255, 0.1)\n}\n\n.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002B36;\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_gutter-active-line {\n background-color: #0d3440\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #073642\n}\n\n.ace-solarized-dark .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_keyword,\n.ace-solarized-dark .ace_meta,\n.ace-solarized-dark .ace_support.ace_class,\n.ace-solarized-dark .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-dark .ace_constant.ace_character,\n.ace-solarized-dark .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-dark .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-dark .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-dark .ace_fold {\n background-color: #268BD2;\n border-color: #93A1A1\n}\n\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\n.ace-solarized-dark .ace_support.ace_function,\n.ace-solarized-dark .ace_variable,\n.ace-solarized-dark .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-dark .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-dark .ace_comment {\n font-style: italic;\n color: #657B83\n}\n\n.ace-solarized-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),define("ace/theme/solarized_dark",["require","exports","module","ace/theme/solarized_dark-css","ace/lib/dom"],function(a,e,r){e.isDark=!0,e.cssClass="ace-solarized-dark",e.cssText=a("./solarized_dark-css"),a("../lib/dom").importCssString(e.cssText,e.cssClass,!1)}),window.require(["ace/theme/solarized_dark"],function(a){"object"==typeof module&&"object"==typeof exports&&module&&(module.exports=a)});
@@ -1,3 +1,4 @@
1
+ //= require_tree ./ace.1.32.5
1
2
  //= require_tree .
2
3
 
3
4
  document.addEventListener("DOMContentLoaded", function() {
@@ -187,6 +187,12 @@ module RailsExecution
187
187
  redirect_to(action: :show)
188
188
  end
189
189
 
190
+ def auto_suggestions
191
+ return render json: [] if RailsExecution.configuration.auto_suggestions.empty?
192
+
193
+ render json: RailsExecution::AutoSuggestionsService.new.call
194
+ end
195
+
190
196
  private
191
197
 
192
198
  def current_task
@@ -0,0 +1,36 @@
1
+ class RailsExecution::AutoSuggestionsService
2
+
3
+ def initialize
4
+ @all_names = []
5
+ @patterns = Array(RailsExecution.configuration.auto_suggestions)
6
+ end
7
+
8
+ def call
9
+ load_folders!
10
+ all_names.uniq
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :patterns
16
+ attr_reader :all_names
17
+
18
+ def load_folders!
19
+ patterns.each do |pattern|
20
+ Dir[Rails.root.join(pattern, '**', '*.rb')].each do |file|
21
+ load_file(file)
22
+ end
23
+ end
24
+ end
25
+
26
+ def load_file(file)
27
+ modules = []
28
+ File.readlines(file).each do |line|
29
+ if match_data = line.match(/module\s+([\w:]+)|class\s+([\w:]+)/)
30
+ modules << match_data.captures.compact.join('::')
31
+ end
32
+ end
33
+ classname = modules.join('::')
34
+ @all_names << classname
35
+ end
36
+ end
@@ -42,7 +42,7 @@ class RailsExecution::Tasks::FilterService
42
42
  end
43
43
 
44
44
  def order_by_recently_updated
45
- sort_by = params[:recently_updated] == '1' ? { updated_at: :desc } : { updated_at: :asc }
45
+ sort_by = params[:recently_updated] == 'asc' ? { updated_at: :asc } : { updated_at: :desc }
46
46
  @tasks_query_object = @tasks_query_object.order(sort_by)
47
47
  end
48
48
 
@@ -13,8 +13,22 @@
13
13
 
14
14
  - if task.new_record? || task.in_processing?
15
15
  :javascript
16
- var editor = ace.edit("script-editor", { printMarginColumn: false });
16
+ var editor = ace.edit("script-editor", { printMarginColumn: false, enableSnippets: true });
17
17
  var RubyMode = ace.require("ace/mode/ruby").Mode;
18
+ var langTools = ace.require("ace/ext/language_tools");
19
+ var suggestionData = [];
20
+ var autoCompletionOptions = [];
21
+
22
+ function loadAutoCompletionOptions() {
23
+ $.ajax({
24
+ url: "#{auto_suggestions_tasks_path}",
25
+ type: 'GET',
26
+ success: function(data) {
27
+ autoCompletionOptions = data;
28
+ }
29
+ });
30
+ }
31
+
18
32
  editor.setTheme("ace/theme/solarized_dark");
19
33
  editor.session.setMode(new RubyMode());
20
34
  editor.renderer.setPadding(15);
@@ -22,6 +36,56 @@
22
36
  editor.getSession().on("change", function () {
23
37
  $("#main-script").val(editor.getValue());
24
38
  });
39
+ editor.setOptions({
40
+ enableBasicAutocompletion: true,
41
+ enableLiveAutocompletion: true,
42
+ });
43
+
44
+ var stepLineCompleter = {
45
+ getCompletions: function(editor, session, pos, prefix, callback) {
46
+ var completions = [];
47
+ if (suggestionData) {
48
+ suggestionData.forEach(function(w) {
49
+ completions.push({ value: w });
50
+ });
51
+ callback(null, completions);
52
+ }
53
+ }
54
+ }
55
+ langTools.setCompleters([stepLineCompleter]);
56
+ langTools.addCompleter(stepLineCompleter);
57
+ loadAutoCompletionOptions();
58
+
59
+ var snippetManager = ace.require("ace/snippets").snippetManager;
60
+ var railsSnippets = [
61
+ { content: "map { |${1:item}| ${0:# code} }", name: "map", tabTrigger: "map" },
62
+ { content: "select { |${1:item}| ${0:# code} }", name: "select", tabTrigger: "select" },
63
+ { content: "each { |${1:item}| ${0:# code} }", name: "each", tabTrigger: "each" },
64
+ { content: "find_each(batch_size: ${1:1000}) do |${2:record}|\n\t${0:# code}\nend", name: "find_each", tabTrigger: "find_each" },
65
+ { content: "pluck(:${1:attribute})", name: "pluck", tabTrigger: "pluck" },
66
+ { content: "find(${1:id})", name: "find", tabTrigger: "find" },
67
+ { content: "find_or_initialize_by(${1:attribute}: ${2:value})", name: "find_or_initialize_by", tabTrigger: "find_or_initialize_by" },
68
+ { content: "update(${1:id}, ${2:attributes})", name: "update", tabTrigger: "update" },
69
+ { content: "update_all(${1:attributes})", name: "update_all", tabTrigger: "update_all" },
70
+ { content: "where(${1:conditions})", name: "where", tabTrigger: "where" },
71
+ { content: "where.not(${1:conditions})", name: "where.not", tabTrigger: "where.not" },
72
+ { content: "joins(:${1:association})", name: "joins", tabTrigger: "joins" },
73
+ { content: "preload(:${1:association})", name: "preload", tabTrigger: "preload" },
74
+ { content: "includes(:${1:association})", name: "includes", tabTrigger: "includes" },
75
+ ];
76
+ snippetManager.register(railsSnippets);
77
+
78
+ editor.getSession().on('change', function() {
79
+ var cursorPosition = editor.getCursorPosition();
80
+ var wordRange = editor.session.getWordRange(cursorPosition.row, cursorPosition.column);
81
+ var currentWord = editor.session.getTextRange(wordRange);
82
+
83
+ if (currentWord.length && /^[A-Z]/.test(currentWord)) {
84
+ suggestionData = autoCompletionOptions;
85
+ } else {
86
+ suggestionData = [];
87
+ }
88
+ });
25
89
 
26
90
  $('#click2full').click(function() {
27
91
  $('#script-editor-container').toggleClass('fullscreen');
@@ -32,4 +96,3 @@
32
96
  AddMoreFile();
33
97
  return false;
34
98
  });
35
-
@@ -7,10 +7,10 @@
7
7
  Only my tasks
8
8
  = hidden_field_tag :my_task, params[:my_task]
9
9
  %button.btn.quick-filter-btn{ type: 'button', 'data-target': '#recently_updated' }
10
- - if params[:recently_updated] == '1'
11
- %i.bi.bi-sort-numeric-down-alt
12
- - else
10
+ - if params[:recently_updated] == 'asc'
13
11
  %i.bi.bi-sort-numeric-down
12
+ - else
13
+ %i.bi.bi-sort-numeric-down-alt
14
14
  Last updated
15
15
  = hidden_field_tag :recently_updated, params[:recently_updated]
16
16
 
@@ -18,7 +18,7 @@
18
18
  $(document).ready(function() {
19
19
  $('.quick-filter-btn').on('click', function() {
20
20
  var isFilterActivatedInput = $($(this).attr('data-target'));
21
- var isFilterActivated = isFilterActivatedInput.val() == '1' ? '0' : '1';
21
+ var isFilterActivated = isFilterActivatedInput.val() == 'asc' ? 'desc' : 'asc';
22
22
  isFilterActivatedInput.val(isFilterActivated)
23
23
  $('#filter-form').submit();
24
24
  })
data/config/routes.rb CHANGED
@@ -20,6 +20,7 @@ RailsExecution::Engine.routes.draw do
20
20
  collection do
21
21
  get :completed
22
22
  get :closed
23
+ get :auto_suggestions
23
24
  end
24
25
 
25
26
  resources :comments, only: [:create, :update, :destroy]
@@ -2,6 +2,11 @@ RailsExecution.configuration do |config|
2
2
 
3
3
  config.solo_mode = true # Without reviewing process
4
4
 
5
+ config.auto_suggestions = [
6
+ 'app/models',
7
+ 'app/jobs',
8
+ ]
9
+
5
10
  # Owner display
6
11
  # config.owner_model = 'User'
7
12
  # config.owner_method = :current_user
@@ -41,6 +41,7 @@ module RailsExecution
41
41
  attr_accessor :task_background
42
42
  attr_accessor :task_background_executor # lambda
43
43
  attr_accessor :acceptable_file_types
44
+ attr_accessor :auto_suggestions # On/Off the code editor auto suggestion
44
45
 
45
46
  # Logger
46
47
  attr_accessor :logging # lambda
@@ -60,6 +61,10 @@ module RailsExecution
60
61
  self.owner_name_method = :name
61
62
  self.owner_avatar = ->(_) { nil }
62
63
 
64
+ self.auto_suggestions = [
65
+ 'app/models',
66
+ 'app/jobs',
67
+ ]
63
68
  self.file_upload = false
64
69
  self.acceptable_file_types = DEFAULT_FILE_TYPES
65
70
  self.file_uploader = ::RailsExecution::Files::Uploader
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'net/http'
4
4
  require 'tempfile'
5
- require 'open-uri'
5
+ require 'uri'
6
6
 
7
7
  module RailsExecution
8
8
  module Files
@@ -33,7 +33,7 @@ module RailsExecution
33
33
  attr_reader :task
34
34
 
35
35
  def save_to_tempfile(file_name, url)
36
- file = URI.open(url)
36
+ file = open(url)
37
37
  return file if file.is_a?(Tempfile)
38
38
 
39
39
  raise "Unsupported the Filetype #{file.class.name}" unless file.is_a?(StringIO)
@@ -80,6 +80,8 @@ module RailsExecution
80
80
 
81
81
  def storing_log_file!
82
82
  ::RailsExecution.configuration.logging.call(@tempfile, task)
83
+ rescue => e
84
+ ::Rails.logger.error(e)
83
85
  end
84
86
 
85
87
  def restore_logger!
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsExecution
4
- VERSION = '0.1.11'
4
+ VERSION = '0.1.12'
5
5
  end