Permalink
Please sign in to comment.
Showing
with
87 additions
and 85,689 deletions.
- +4 −2 bower.json
- +4 −4 client/commonFramework.js
- +72 −2 gulpfile.js
- +7 −0 package.json
- +0 −6 public/js/lib/bootstrap.min.js
- +0 −231 public/js/lib/chai/chai-jquery.js
- +0 −4,800 public/js/lib/chai/chai.js
- +0 −1 public/js/lib/codemirror-accessible/.gitignore
- +0 −3 public/js/lib/codemirror-accessible/README.md
- +0 −80 public/js/lib/codemirror-accessible/accessible.js
- +0 −5,828 public/js/lib/codemirror-accessible/codemirror-accessible.js
- +0 −5,848 public/js/lib/codemirror-accessible/codemirror-accessible2.js
- +0 −5,799 public/js/lib/codemirror-accessible/codemirror-original.js
- +0 −258 public/js/lib/codemirror-accessible/codemirror.css
- +0 −9,941 public/js/lib/codemirror-accessible/index.html
- +0 −482 public/js/lib/codemirror-accessible/javascript.js
- +0 −749 public/js/lib/codemirror-accessible/stress.html
- +0 −8 public/js/lib/codemirror/.gitattributes
- +0 −8 public/js/lib/codemirror/.gitignore
- +0 −3 public/js/lib/codemirror/.travis.yml
- +0 −423 public/js/lib/codemirror/AUTHORS
- +0 −76 public/js/lib/codemirror/CONTRIBUTING.md
- +0 −19 public/js/lib/codemirror/LICENSE
- +0 −11 public/js/lib/codemirror/README.md
- +0 −183 public/js/lib/codemirror/addon/comment/comment.js
- +0 −85 public/js/lib/codemirror/addon/comment/continuecomment.js
- +0 −32 public/js/lib/codemirror/addon/dialog/dialog.css
- +0 −155 public/js/lib/codemirror/addon/dialog/dialog.js
- +0 −6 public/js/lib/codemirror/addon/display/fullscreen.css
- +0 −41 public/js/lib/codemirror/addon/display/fullscreen.js
- +0 −94 public/js/lib/codemirror/addon/display/panel.js
- +0 −58 public/js/lib/codemirror/addon/display/placeholder.js
- +0 −64 public/js/lib/codemirror/addon/display/rulers.js
- +0 −159 public/js/lib/codemirror/addon/edit/closebrackets.js
- +0 −159 public/js/lib/codemirror/addon/edit/closetag.js
- +0 −51 public/js/lib/codemirror/addon/edit/continuelist.js
- +0 −120 public/js/lib/codemirror/addon/edit/matchbrackets.js
- +0 −66 public/js/lib/codemirror/addon/edit/matchtags.js
- +0 −27 public/js/lib/codemirror/addon/edit/trailingspace.js
- +0 −43,080 public/js/lib/codemirror/addon/emmet/emmet.js
- +0 −105 public/js/lib/codemirror/addon/fold/brace-fold.js
- +0 −57 public/js/lib/codemirror/addon/fold/comment-fold.js
- +0 −145 public/js/lib/codemirror/addon/fold/foldcode.js
- +0 −20 public/js/lib/codemirror/addon/fold/foldgutter.css
- +0 −134 public/js/lib/codemirror/addon/fold/foldgutter.js
- +0 −44 public/js/lib/codemirror/addon/fold/indent-fold.js
- +0 −49 public/js/lib/codemirror/addon/fold/markdown-fold.js
- +0 −182 public/js/lib/codemirror/addon/fold/xml-fold.js
- +0 −41 public/js/lib/codemirror/addon/hint/anyword-hint.js
- +0 −56 public/js/lib/codemirror/addon/hint/css-hint.js
- +0 −348 public/js/lib/codemirror/addon/hint/html-hint.js
- +0 −146 public/js/lib/codemirror/addon/hint/javascript-hint.js
- +0 −38 public/js/lib/codemirror/addon/hint/show-hint.css
- +0 −389 public/js/lib/codemirror/addon/hint/show-hint.js
- +0 −197 public/js/lib/codemirror/addon/hint/sql-hint.js
- +0 −110 public/js/lib/codemirror/addon/hint/xml-hint.js
- +0 −41 public/js/lib/codemirror/addon/lint/coffeescript-lint.js
- +0 −35 public/js/lib/codemirror/addon/lint/css-lint.js
- +0 −136 public/js/lib/codemirror/addon/lint/javascript-lint.js
- +0 −31 public/js/lib/codemirror/addon/lint/json-lint.js
- +0 −73 public/js/lib/codemirror/addon/lint/lint.css
- +0 −204 public/js/lib/codemirror/addon/lint/lint.js
- +0 −28 public/js/lib/codemirror/addon/lint/yaml-lint.js
- +0 −112 public/js/lib/codemirror/addon/merge/merge.css
- +0 −643 public/js/lib/codemirror/addon/merge/merge.js
- +0 −64 public/js/lib/codemirror/addon/mode/loadmode.js
- +0 −118 public/js/lib/codemirror/addon/mode/multiplex.js
- +0 −33 public/js/lib/codemirror/addon/mode/multiplex_test.js
- +0 −85 public/js/lib/codemirror/addon/mode/overlay.js
- +0 −213 public/js/lib/codemirror/addon/mode/simple.js
- +0 −40 public/js/lib/codemirror/addon/runmode/colorize.js
- +0 −157 public/js/lib/codemirror/addon/runmode/runmode-standalone.js
- +0 −72 public/js/lib/codemirror/addon/runmode/runmode.js
- +0 −120 public/js/lib/codemirror/addon/runmode/runmode.node.js
- +0 −76 public/js/lib/codemirror/addon/scroll/annotatescrollbar.js
- +0 −46 public/js/lib/codemirror/addon/scroll/scrollpastend.js
- +0 −66 public/js/lib/codemirror/addon/scroll/simplescrollbars.css
- +0 −139 public/js/lib/codemirror/addon/scroll/simplescrollbars.js
- +0 −128 public/js/lib/codemirror/addon/search/match-highlighter.js
- +0 −8 public/js/lib/codemirror/addon/search/matchesonscrollbar.css
- +0 −90 public/js/lib/codemirror/addon/search/matchesonscrollbar.js
- +0 −164 public/js/lib/codemirror/addon/search/search.js
- +0 −189 public/js/lib/codemirror/addon/search/searchcursor.js
- +0 −71 public/js/lib/codemirror/addon/selection/active-line.js
- +0 −118 public/js/lib/codemirror/addon/selection/mark-selection.js
- +0 −86 public/js/lib/codemirror/addon/tern/tern.css
- +0 −670 public/js/lib/codemirror/addon/tern/tern.js
- +0 −44 public/js/lib/codemirror/addon/tern/worker.js
- +0 −139 public/js/lib/codemirror/addon/wrap/hardwrap.js
- +0 −6 public/js/lib/codemirror/bin/authors.sh
- +0 −92 public/js/lib/codemirror/bin/compress
- +0 −16 public/js/lib/codemirror/bin/lint
- +0 −46 public/js/lib/codemirror/bin/release
- +0 −51 public/js/lib/codemirror/bin/source-highlight
- +0 −16 public/js/lib/codemirror/bower.json
- +0 −200 public/js/lib/codemirror/index.html
6
bower.json
8
client/commonFramework.js
74
gulpfile.js
7
package.json
6
public/js/lib/bootstrap.min.js
@@ -1,6 +0,0 @@ | ||
-/*! | ||
- * Bootstrap v3.1.0 (http://getbootstrap.com) | ||
- * Copyright 2011-2014 Twitter, Inc. | ||
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | ||
- */ | ||
-if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHeight:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b.left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); |
231
public/js/lib/chai/chai-jquery.js
@@ -1,231 +0,0 @@ | ||
-(function (chaiJquery) { | ||
- // Module systems magic dance. | ||
- if (typeof require === "function" && typeof exports === "object" && typeof module === "object") { | ||
- // NodeJS | ||
- module.exports = chaiJquery; | ||
- } else if (typeof define === "function" && define.amd) { | ||
- // AMD | ||
- define(['jquery'], function ($) { | ||
- return function (chai, utils) { | ||
- return chaiJquery(chai, utils, $); | ||
- }; | ||
- }); | ||
- } else { | ||
- // Other environment (usually <script> tag): plug in to global chai instance directly. | ||
- chai.use(function (chai, utils) { | ||
- return chaiJquery(chai, utils, jQuery); | ||
- }); | ||
- } | ||
-}(function (chai, utils, $) { | ||
- var inspect = utils.inspect, | ||
- flag = utils.flag; | ||
- $ = $ || jQuery; | ||
- | ||
- var setPrototypeOf = '__proto__' in Object ? | ||
- function (object, prototype) { | ||
- object.__proto__ = prototype; | ||
- } : | ||
- function (object, prototype) { | ||
- var excludeNames = /^(?:length|name|arguments|caller)$/; | ||
- | ||
- function copyProperties(dst, src) { | ||
- Object.getOwnPropertyNames(src).forEach(function (name) { | ||
- if (!excludeNames.test(name)) { | ||
- Object.defineProperty(dst, name, | ||
- Object.getOwnPropertyDescriptor(src, name)); | ||
- } | ||
- }); | ||
- } | ||
- | ||
- copyProperties(object, prototype); | ||
- copyProperties(object, Object.getPrototypeOf(prototype)); | ||
- }; | ||
- | ||
- $.fn.inspect = function (depth) { | ||
- var el = $('<div />').append(this.clone()); | ||
- if (depth !== undefined) { | ||
- var children = el.children(); | ||
- while (depth-- > 0) | ||
- children = children.children(); | ||
- children.html('...'); | ||
- } | ||
- return el.html(); | ||
- }; | ||
- | ||
- var props = {attr: 'attribute', css: 'CSS property', prop: 'property'}; | ||
- for (var prop in props) { | ||
- (function (prop, description) { | ||
- chai.Assertion.addMethod(prop, function (name, val) { | ||
- var actual = flag(this, 'object')[prop](name); | ||
- | ||
- if (!flag(this, 'negate') || undefined === val) { | ||
- this.assert( | ||
- undefined !== actual | ||
- , 'expected #{this} to have a #{exp} ' + description | ||
- , 'expected #{this} not to have a #{exp} ' + description | ||
- , name | ||
- ); | ||
- } | ||
- | ||
- if (undefined !== val) { | ||
- this.assert( | ||
- val === actual | ||
- , 'expected #{this} to have a ' + inspect(name) + ' ' + description + ' with the value #{exp}, but the value was #{act}' | ||
- , 'expected #{this} not to have a ' + inspect(name) + ' ' + description + ' with the value #{act}' | ||
- , val | ||
- , actual | ||
- ); | ||
- } | ||
- | ||
- flag(this, 'object', actual); | ||
- }); | ||
- })(prop, props[prop]); | ||
- } | ||
- | ||
- chai.Assertion.addMethod('data', function (name, val) { | ||
- // Work around a chai bug (https://github.com/logicalparadox/chai/issues/16) | ||
- if (flag(this, 'negate') && undefined !== val && undefined === flag(this, 'object').data(name)) { | ||
- return; | ||
- } | ||
- | ||
- var assertion = new chai.Assertion(flag(this, 'object').data()); | ||
- if (flag(this, 'negate')) | ||
- assertion = assertion.not; | ||
- return assertion.property(name, val); | ||
- }); | ||
- | ||
- chai.Assertion.addMethod('class', function (className) { | ||
- this.assert( | ||
- flag(this, 'object').hasClass(className) | ||
- , 'expected #{this} to have class #{exp}' | ||
- , 'expected #{this} not to have class #{exp}' | ||
- , className | ||
- ); | ||
- }); | ||
- | ||
- chai.Assertion.addMethod('id', function (id) { | ||
- this.assert( | ||
- flag(this, 'object').attr('id') === id | ||
- , 'expected #{this} to have id #{exp}' | ||
- , 'expected #{this} not to have id #{exp}' | ||
- , id | ||
- ); | ||
- }); | ||
- | ||
- chai.Assertion.addMethod('html', function (html) { | ||
- var actual = flag(this, 'object').html(); | ||
- this.assert( | ||
- actual === html | ||
- , 'expected #{this} to have HTML #{exp}, but the HTML was #{act}' | ||
- , 'expected #{this} not to have HTML #{exp}' | ||
- , html | ||
- , actual | ||
- ); | ||
- }); | ||
- | ||
- chai.Assertion.addMethod('text', function (text) { | ||
- var actual = flag(this, 'object').text(); | ||
- this.assert( | ||
- actual === text | ||
- , 'expected #{this} to have text #{exp}, but the text was #{act}' | ||
- , 'expected #{this} not to have text #{exp}' | ||
- , text | ||
- , actual | ||
- ); | ||
- }); | ||
- | ||
- chai.Assertion.addMethod('value', function (value) { | ||
- var actual = flag(this, 'object').val(); | ||
- this.assert( | ||
- flag(this, 'object').val() === value | ||
- , 'expected #{this} to have value #{exp}, but the value was #{act}' | ||
- , 'expected #{this} not to have value #{exp}' | ||
- , value | ||
- , actual | ||
- ); | ||
- }); | ||
- | ||
- chai.Assertion.addMethod('descendants', function (selector) { | ||
- this.assert( | ||
- flag(this, 'object').has(selector).length > 0 | ||
- , 'expected #{this} to have #{exp}' | ||
- , 'expected #{this} not to have #{exp}' | ||
- , selector | ||
- ); | ||
- }); | ||
- | ||
- $.each(['visible', 'hidden', 'selected', 'checked', 'enabled', 'disabled'], function (i, attr) { | ||
- chai.Assertion.addProperty(attr, function () { | ||
- this.assert( | ||
- flag(this, 'object').is(':' + attr) | ||
- , 'expected #{this} to be ' + attr | ||
- , 'expected #{this} not to be ' + attr); | ||
- }); | ||
- }); | ||
- | ||
- chai.Assertion.overwriteProperty('exist', function (_super) { | ||
- return function () { | ||
- var obj = flag(this, 'object'); | ||
- if (obj instanceof $) { | ||
- this.assert( | ||
- obj.length > 0 | ||
- , 'expected ' + inspect(obj.selector) + ' to exist' | ||
- , 'expected ' + inspect(obj.selector) + ' not to exist'); | ||
- } else { | ||
- _super.apply(this, arguments); | ||
- } | ||
- }; | ||
- }); | ||
- | ||
- chai.Assertion.overwriteProperty('empty', function (_super) { | ||
- return function () { | ||
- var obj = flag(this, 'object'); | ||
- if (obj instanceof $) { | ||
- this.assert( | ||
- obj.is(':empty') | ||
- , 'expected #{this} to be empty' | ||
- , 'expected #{this} not to be empty'); | ||
- } else { | ||
- _super.apply(this, arguments); | ||
- } | ||
- }; | ||
- }); | ||
- | ||
- chai.Assertion.overwriteMethod('match', function (_super) { | ||
- return function (selector) { | ||
- var obj = flag(this, 'object'); | ||
- if (obj instanceof $) { | ||
- this.assert( | ||
- obj.is(selector) | ||
- , 'expected #{this} to match #{exp}' | ||
- , 'expected #{this} not to match #{exp}' | ||
- , selector | ||
- ); | ||
- } else { | ||
- _super.apply(this, arguments); | ||
- } | ||
- } | ||
- }); | ||
- | ||
- chai.Assertion.overwriteChainableMethod('contain', | ||
- function (_super) { | ||
- return function (text) { | ||
- var obj = flag(this, 'object'); | ||
- if (obj instanceof $) { | ||
- this.assert( | ||
- obj.is(':contains(\'' + text + '\')') | ||
- , 'expected #{this} to contain #{exp}' | ||
- , 'expected #{this} not to contain #{exp}' | ||
- , text); | ||
- } else { | ||
- _super.apply(this, arguments); | ||
- } | ||
- } | ||
- }, | ||
- function(_super) { | ||
- return function() { | ||
- _super.call(this); | ||
- }; | ||
- } | ||
- ); | ||
-})); |
4,800
public/js/lib/chai/chai.js
0 additions,
4,800 deletions
not shown because the diff is too large. Please use a local Git client to view these changes.
1
public/js/lib/codemirror-accessible/.gitignore
@@ -1 +0,0 @@ | ||
-.DS_Store |
3
public/js/lib/codemirror-accessible/README.md
@@ -1,3 +0,0 @@ | ||
-# CodeMirror Accessible | ||
- | ||
-Read more at the project page: http://bgrins.github.io/codemirror-accessible/ |
80
public/js/lib/codemirror-accessible/accessible.js
@@ -1,80 +0,0 @@ | ||
-window.onload=function(){ | ||
- if (!window.waitToLoad) { | ||
- load(); | ||
- } | ||
-}; | ||
- | ||
-function load() { | ||
- if (window.loaded) { | ||
- return; | ||
- } | ||
- window.loaded = true; | ||
- | ||
- var myTextArea = document.getElementById("editor"); | ||
- var textareaEditor = document.getElementById('textarea-editor'); | ||
- var clonedTextArea = document.getElementById('editor2'); | ||
- | ||
- textareaEditor.value = clonedTextArea.value = myTextArea.value; | ||
- | ||
- document.getElementById("original-demo").appendChild(clonedTextArea); | ||
- var myScreenreader = document.getElementById("editor-screenreader"); | ||
- | ||
- var myContentEditable = document.getElementById("content-editable"); | ||
- var button = document.getElementById("toggle-textarea-visibility"); | ||
- | ||
- | ||
- var editor = window.editor = CodeMirror.fromTextArea(myTextArea, { | ||
- lineNumbers: true, | ||
- matchBrackets: true, | ||
- continueComments: "Enter", | ||
- extraKeys: {"Ctrl-Q": "toggleComment"} | ||
- }); | ||
- | ||
- var editor2 = window.editor2 = CodeMirrorOriginal.fromTextArea(clonedTextArea, { | ||
- lineNumbers: true, | ||
- matchBrackets: true, | ||
- continueComments: "Enter", | ||
- extraKeys: {"Ctrl-Q": "toggleComment"} | ||
- }); | ||
- | ||
- | ||
- var textareaVisible = false; | ||
- function toggleTextareaDisplay() { | ||
- | ||
- if (!editor.display.input.getAttribute("backup-style")) { | ||
- editor.display.input.setAttribute("backup-style", editor.display.input.getAttribute("style")); | ||
- editor.display.input.parentNode.setAttribute("backup-style", editor.display.input.parentNode.getAttribute("style")); | ||
- } | ||
- | ||
- if (textareaVisible) { | ||
- editor.display.input.setAttribute("style", editor.display.input.getAttribute("backup-style")); | ||
- editor.display.input.parentNode.setAttribute("style", editor.display.input.parentNode.getAttribute("backup-style")); | ||
- editor2.display.input.setAttribute("style", editor.display.input.getAttribute("backup-style")); | ||
- editor2.display.input.parentNode.setAttribute("style", editor.display.input.parentNode.getAttribute("backup-style")); | ||
- } | ||
- else { | ||
- editor.display.input.setAttribute("style", "height: 100px; width: 95%; margin-left: 3%; "); | ||
- editor.display.input.parentNode.setAttribute("style", ""); | ||
- editor2.display.input.setAttribute("style", "height: 100px; width: 95%; margin-left: 3%; "); | ||
- editor2.display.input.parentNode.setAttribute("style", ""); | ||
- } | ||
- | ||
- textareaVisible = !textareaVisible; | ||
- | ||
- if (window.localStorage) { | ||
- if (textareaVisible) { | ||
- window.localStorage["toggleTextareaDisplay"] = "1"; | ||
- } | ||
- else { | ||
- window.localStorage.removeKey("toggleTextareaDisplay"); | ||
- } | ||
- } | ||
- } | ||
- | ||
- button.onclick = toggleTextareaDisplay; | ||
- | ||
- if (window.localStorage && window.localStorage["toggleTextareaDisplay"]) { | ||
- toggleTextareaDisplay(); | ||
- } | ||
- | ||
-} |
5,828
public/js/lib/codemirror-accessible/codemirror-accessible.js
0 additions,
5,828 deletions
not shown because the diff is too large. Please use a local Git client to view these changes.
5,848
public/js/lib/codemirror-accessible/codemirror-accessible2.js
0 additions,
5,848 deletions
not shown because the diff is too large. Please use a local Git client to view these changes.
5,799
public/js/lib/codemirror-accessible/codemirror-original.js
0 additions,
5,799 deletions
not shown because the diff is too large. Please use a local Git client to view these changes.
258
public/js/lib/codemirror-accessible/codemirror.css
@@ -1,258 +0,0 @@ | ||
-/* BASICS */ | ||
- | ||
-.CodeMirror { | ||
- /* Set height, width, borders, and global font properties here */ | ||
- font-family: monospace; | ||
- height: 300px; | ||
-} | ||
-.CodeMirror-scroll { | ||
- /* Set scrolling behaviour here */ | ||
- overflow: auto; | ||
-} | ||
- | ||
-/* PADDING */ | ||
- | ||
-.CodeMirror-lines { | ||
- padding: 4px 0; /* Vertical padding around content */ | ||
-} | ||
-.CodeMirror pre { | ||
- padding: 0 4px; /* Horizontal padding of content */ | ||
-} | ||
- | ||
-.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { | ||
- background-color: white; /* The little square between H and V scrollbars */ | ||
-} | ||
- | ||
-/* GUTTER */ | ||
- | ||
-.CodeMirror-gutters { | ||
- border-right: 1px solid #ddd; | ||
- background-color: #f7f7f7; | ||
- white-space: nowrap; | ||
-} | ||
-.CodeMirror-linenumbers {} | ||
-.CodeMirror-linenumber { | ||
- padding: 0 3px 0 5px; | ||
- min-width: 20px; | ||
- text-align: right; | ||
- color: #999; | ||
-} | ||
- | ||
-/* CURSOR */ | ||
- | ||
-.CodeMirror div.CodeMirror-cursor { | ||
- border-left: 1px solid black; | ||
- z-index: 3; | ||
-} | ||
-/* Shown when moving in bi-directional text */ | ||
-.CodeMirror div.CodeMirror-secondarycursor { | ||
- border-left: 1px solid silver; | ||
-} | ||
-.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor { | ||
- width: auto; | ||
- border: 0; | ||
- background: #7e7; | ||
- z-index: 1; | ||
-} | ||
-/* Can style cursor different in overwrite (non-insert) mode */ | ||
-.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {} | ||
- | ||
-.cm-tab { display: inline-block; } | ||
- | ||
-/* DEFAULT THEME */ | ||
- | ||
-.cm-s-default .cm-keyword {color: #708;} | ||
-.cm-s-default .cm-atom {color: #219;} | ||
-.cm-s-default .cm-number {color: #164;} | ||
-.cm-s-default .cm-def {color: #00f;} | ||
-.cm-s-default .cm-variable {color: black;} | ||
-.cm-s-default .cm-variable-2 {color: #05a;} | ||
-.cm-s-default .cm-variable-3 {color: #085;} | ||
-.cm-s-default .cm-property {color: black;} | ||
-.cm-s-default .cm-operator {color: black;} | ||
-.cm-s-default .cm-comment {color: #a50;} | ||
-.cm-s-default .cm-string {color: #a11;} | ||
-.cm-s-default .cm-string-2 {color: #f50;} | ||
-.cm-s-default .cm-meta {color: #555;} | ||
-.cm-s-default .cm-error {color: #f00;} | ||
-.cm-s-default .cm-qualifier {color: #555;} | ||
-.cm-s-default .cm-builtin {color: #30a;} | ||
-.cm-s-default .cm-bracket {color: #997;} | ||
-.cm-s-default .cm-tag {color: #170;} | ||
-.cm-s-default .cm-attribute {color: #00c;} | ||
-.cm-s-default .cm-header {color: blue;} | ||
-.cm-s-default .cm-quote {color: #090;} | ||
-.cm-s-default .cm-hr {color: #999;} | ||
-.cm-s-default .cm-link {color: #00c;} | ||
- | ||
-.cm-negative {color: #d44;} | ||
-.cm-positive {color: #292;} | ||
-.cm-header, .cm-strong {font-weight: bold;} | ||
-.cm-em {font-style: italic;} | ||
-.cm-link {text-decoration: underline;} | ||
- | ||
-.cm-invalidchar {color: #f00;} | ||
- | ||
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} | ||
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} | ||
- | ||
-/* STOP */ | ||
- | ||
-/* The rest of this file contains styles related to the mechanics of | ||
- the editor. You probably shouldn't touch them. */ | ||
- | ||
-.CodeMirror { | ||
- line-height: 1; | ||
- position: relative; | ||
- overflow: hidden; | ||
- background: white; | ||
- color: black; | ||
-} | ||
- | ||
-.CodeMirror-scroll { | ||
- /* 30px is the magic margin used to hide the element's real scrollbars */ | ||
- /* See overflow: hidden in .CodeMirror */ | ||
- margin-bottom: -30px; margin-right: -30px; | ||
- padding-bottom: 30px; padding-right: 30px; | ||
- height: 100%; | ||
- outline: none; /* Prevent dragging from highlighting the element */ | ||
- position: relative; | ||
-} | ||
-.CodeMirror-sizer { | ||
- position: relative; | ||
-} | ||
- | ||
-/* The fake, visible scrollbars. Used to force redraw during scrolling | ||
- before actuall scrolling happens, thus preventing shaking and | ||
- flickering artifacts. */ | ||
-.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { | ||
- position: absolute; | ||
- z-index: 6; | ||
- display: none; | ||
-} | ||
-.CodeMirror-vscrollbar { | ||
- right: 0; top: 0; | ||
- overflow-x: hidden; | ||
- overflow-y: scroll; | ||
-} | ||
-.CodeMirror-hscrollbar { | ||
- bottom: 0; left: 0; | ||
- overflow-y: hidden; | ||
- overflow-x: scroll; | ||
-} | ||
-.CodeMirror-scrollbar-filler { | ||
- right: 0; bottom: 0; | ||
-} | ||
-.CodeMirror-gutter-filler { | ||
- left: 0; bottom: 0; | ||
-} | ||
- | ||
-.CodeMirror-gutters { | ||
- position: absolute; left: 0; top: 0; | ||
- padding-bottom: 30px; | ||
- z-index: 3; | ||
-} | ||
-.CodeMirror-gutter { | ||
- white-space: normal; | ||
- height: 100%; | ||
- padding-bottom: 30px; | ||
- margin-bottom: -32px; | ||
- display: inline-block; | ||
- /* Hack to make IE7 behave */ | ||
- *zoom:1; | ||
- *display:inline; | ||
-} | ||
-.CodeMirror-gutter-elt { | ||
- position: absolute; | ||
- cursor: default; | ||
- z-index: 4; | ||
-} | ||
- | ||
-.CodeMirror-lines { | ||
- cursor: text; | ||
-} | ||
-.CodeMirror pre { | ||
- /* Reset some styles that the rest of the page might have set */ | ||
- -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; | ||
- border-width: 0; | ||
- background: transparent; | ||
- font-family: inherit; | ||
- font-size: inherit; | ||
- margin: 0; | ||
- white-space: pre; | ||
- word-wrap: normal; | ||
- line-height: inherit; | ||
- color: inherit; | ||
- z-index: 2; | ||
- position: relative; | ||
- overflow: visible; | ||
-} | ||
-.CodeMirror-wrap pre { | ||
- word-wrap: break-word; | ||
- white-space: pre-wrap; | ||
- word-break: normal; | ||
-} | ||
-.CodeMirror-code pre { | ||
- border-right: 30px solid transparent; | ||
- width: -webkit-fit-content; | ||
- width: -moz-fit-content; | ||
- width: fit-content; | ||
-} | ||
-.CodeMirror-wrap .CodeMirror-code pre { | ||
- border-right: none; | ||
- width: auto; | ||
-} | ||
-.CodeMirror-linebackground { | ||
- position: absolute; | ||
- left: 0; right: 0; top: 0; bottom: 0; | ||
- z-index: 0; | ||
-} | ||
- | ||
-.CodeMirror-linewidget { | ||
- position: relative; | ||
- z-index: 2; | ||
- overflow: auto; | ||
-} | ||
- | ||
-.CodeMirror-widget { | ||
-} | ||
- | ||
-.CodeMirror-wrap .CodeMirror-scroll { | ||
- overflow-x: hidden; | ||
-} | ||
- | ||
-.CodeMirror-measure { | ||
- position: absolute; | ||
- width: 100%; height: 0px; | ||
- overflow: hidden; | ||
- visibility: hidden; | ||
-} | ||
-.CodeMirror-measure pre { position: static; } | ||
- | ||
-.CodeMirror div.CodeMirror-cursor { | ||
- position: absolute; | ||
- visibility: hidden; | ||
- border-right: none; | ||
- width: 0; | ||
-} | ||
-.CodeMirror-focused div.CodeMirror-cursor { | ||
- visibility: visible; | ||
-} | ||
- | ||
-.CodeMirror-selected { background: #d9d9d9; } | ||
-.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } | ||
- | ||
-.cm-searching { | ||
- background: #ffa; | ||
- background: rgba(255, 255, 0, .4); | ||
-} | ||
- | ||
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */ | ||
-.CodeMirror span { *vertical-align: text-bottom; } | ||
- | ||
-@media print { | ||
- /* Hide the cursor when printing */ | ||
- .CodeMirror div.CodeMirror-cursor { | ||
- visibility: hidden; | ||
- } | ||
-} |
9,941
public/js/lib/codemirror-accessible/index.html
0 additions,
9,941 deletions
not shown because the diff is too large. Please use a local Git client to view these changes.
482
public/js/lib/codemirror-accessible/javascript.js
@@ -1,482 +0,0 @@ | ||
-// TODO actually recognize syntax of TypeScript constructs | ||
- | ||
- | ||
-var opts= function(config, parserConfig) { | ||
- var indentUnit = config.indentUnit; | ||
- var statementIndent = parserConfig.statementIndent; | ||
- var jsonMode = parserConfig.json; | ||
- var isTS = parserConfig.typescript; | ||
- | ||
- // Tokenizer | ||
- | ||
- var keywords = function(){ | ||
- function kw(type) {return {type: type, style: "keyword"};} | ||
- var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); | ||
- var operator = kw("operator"), atom = {type: "atom", style: "atom"}; | ||
- | ||
- var jsKeywords = { | ||
- "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, | ||
- "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, | ||
- "var": kw("var"), "const": kw("var"), "let": kw("var"), | ||
- "function": kw("function"), "catch": kw("catch"), | ||
- "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), | ||
- "in": operator, "typeof": operator, "instanceof": operator, | ||
- "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, | ||
- "this": kw("this") | ||
- }; | ||
- | ||
- // Extend the 'normal' keywords with the TypeScript language extensions | ||
- if (isTS) { | ||
- var type = {type: "variable", style: "variable-3"}; | ||
- var tsKeywords = { | ||
- // object-like things | ||
- "interface": kw("interface"), | ||
- "class": kw("class"), | ||
- "extends": kw("extends"), | ||
- "constructor": kw("constructor"), | ||
- | ||
- // scope modifiers | ||
- "public": kw("public"), | ||
- "private": kw("private"), | ||
- "protected": kw("protected"), | ||
- "static": kw("static"), | ||
- | ||
- "super": kw("super"), | ||
- | ||
- // types | ||
- "string": type, "number": type, "bool": type, "any": type | ||
- }; | ||
- | ||
- for (var attr in tsKeywords) { | ||
- jsKeywords[attr] = tsKeywords[attr]; | ||
- } | ||
- } | ||
- | ||
- return jsKeywords; | ||
- }(); | ||
- | ||
- var isOperatorChar = /[+\-*&%=<>!?|~^]/; | ||
- | ||
- function chain(stream, state, f) { | ||
- state.tokenize = f; | ||
- return f(stream, state); | ||
- } | ||
- | ||
- function nextUntilUnescaped(stream, end) { | ||
- var escaped = false, next; | ||
- while ((next = stream.next()) != null) { | ||
- if (next == end && !escaped) | ||
- return false; | ||
- escaped = !escaped && next == "\\"; | ||
- } | ||
- return escaped; | ||
- } | ||
- | ||
- // Used as scratch variables to communicate multiple values without | ||
- // consing up tons of objects. | ||
- var type, content; | ||
- function ret(tp, style, cont) { | ||
- type = tp; content = cont; | ||
- return style; | ||
- } | ||
- | ||
- function jsTokenBase(stream, state) { | ||
- var ch = stream.next(); | ||
- if (ch == '"' || ch == "'") | ||
- return chain(stream, state, jsTokenString(ch)); | ||
- else if (/[\[\]{}\(\),;\:\.]/.test(ch)) | ||
- return ret(ch); | ||
- else if (ch == "0" && stream.eat(/x/i)) { | ||
- stream.eatWhile(/[\da-f]/i); | ||
- return ret("number", "number"); | ||
- } | ||
- else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { | ||
- stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); | ||
- return ret("number", "number"); | ||
- } | ||
- else if (ch == "/") { | ||
- if (stream.eat("*")) { | ||
- return chain(stream, state, jsTokenComment); | ||
- } | ||
- else if (stream.eat("/")) { | ||
- stream.skipToEnd(); | ||
- return ret("comment", "comment"); | ||
- } | ||
- else if (state.lastType == "operator" || state.lastType == "keyword c" || | ||
- /^[\[{}\(,;:]$/.test(state.lastType)) { | ||
- nextUntilUnescaped(stream, "/"); | ||
- stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla | ||
- return ret("regexp", "string-2"); | ||
- } | ||
- else { | ||
- stream.eatWhile(isOperatorChar); | ||
- return ret("operator", null, stream.current()); | ||
- } | ||
- } | ||
- else if (ch == "#") { | ||
- stream.skipToEnd(); | ||
- return ret("error", "error"); | ||
- } | ||
- else if (isOperatorChar.test(ch)) { | ||
- stream.eatWhile(isOperatorChar); | ||
- return ret("operator", null, stream.current()); | ||
- } | ||
- else { | ||
- stream.eatWhile(/[\w\$_]/); | ||
- var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; | ||
- return (known && state.lastType != ".") ? ret(known.type, known.style, word) : | ||
- ret("variable", "variable", word); | ||
- } | ||
- } | ||
- | ||
- function jsTokenString(quote) { | ||
- return function(stream, state) { | ||
- if (!nextUntilUnescaped(stream, quote)) | ||
- state.tokenize = jsTokenBase; | ||
- return ret("string", "string"); | ||
- }; | ||
- } | ||
- | ||
- function jsTokenComment(stream, state) { | ||
- var maybeEnd = false, ch; | ||
- while (ch = stream.next()) { | ||
- if (ch == "/" && maybeEnd) { | ||
- state.tokenize = jsTokenBase; | ||
- break; | ||
- } | ||
- maybeEnd = (ch == "*"); | ||
- } | ||
- return ret("comment", "comment"); | ||
- } | ||
- | ||
- // Parser | ||
- | ||
- var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true}; | ||
- | ||
- function JSLexical(indented, column, type, align, prev, info) { | ||
- this.indented = indented; | ||
- this.column = column; | ||
- this.type = type; | ||
- this.prev = prev; | ||
- this.info = info; | ||
- if (align != null) this.align = align; | ||
- } | ||
- | ||
- function inScope(state, varname) { | ||
- for (var v = state.localVars; v; v = v.next) | ||
- if (v.name == varname) return true; | ||
- } | ||
- | ||
- function parseJS(state, style, type, content, stream) { | ||
- var cc = state.cc; | ||
- // Communicate our context to the combinators. | ||
- // (Less wasteful than consing up a hundred closures on every call.) | ||
- cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; | ||
- | ||
- if (!state.lexical.hasOwnProperty("align")) | ||
- state.lexical.align = true; | ||
- | ||
- while(true) { | ||
- var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; | ||
- if (combinator(type, content)) { | ||
- while(cc.length && cc[cc.length - 1].lex) | ||
- cc.pop()(); | ||
- if (cx.marked) return cx.marked; | ||
- if (type == "variable" && inScope(state, content)) return "variable-2"; | ||
- return style; | ||
- } | ||
- } | ||
- } | ||
- | ||
- // Combinator utils | ||
- | ||
- var cx = {state: null, column: null, marked: null, cc: null}; | ||
- function pass() { | ||
- for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); | ||
- } | ||
- function cont() { | ||
- pass.apply(null, arguments); | ||
- return true; | ||
- } | ||
- function register(varname) { | ||
- function inList(list) { | ||
- for (var v = list; v; v = v.next) | ||
- if (v.name == varname) return true; | ||
- return false; | ||
- } | ||
- var state = cx.state; | ||
- if (state.context) { | ||
- cx.marked = "def"; | ||
- if (inList(state.localVars)) return; | ||
- state.localVars = {name: varname, next: state.localVars}; | ||
- } else { | ||
- if (inList(state.globalVars)) return; | ||
- state.globalVars = {name: varname, next: state.globalVars}; | ||
- } | ||
- } | ||
- | ||
- // Combinators | ||
- | ||
- var defaultVars = {name: "this", next: {name: "arguments"}}; | ||
- function pushcontext() { | ||
- cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; | ||
- cx.state.localVars = defaultVars; | ||
- } | ||
- function popcontext() { | ||
- cx.state.localVars = cx.state.context.vars; | ||
- cx.state.context = cx.state.context.prev; | ||
- } | ||
- function pushlex(type, info) { | ||
- var result = function() { | ||
- var state = cx.state, indent = state.indented; | ||
- if (state.lexical.type == "stat") indent = state.lexical.indented; | ||
- state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); | ||
- }; | ||
- result.lex = true; | ||
- return result; | ||
- } | ||
- function poplex() { | ||
- var state = cx.state; | ||
- if (state.lexical.prev) { | ||
- if (state.lexical.type == ")") | ||
- state.indented = state.lexical.indented; | ||
- state.lexical = state.lexical.prev; | ||
- } | ||
- } | ||
- poplex.lex = true; | ||
- | ||
- function expect(wanted) { | ||
- return function(type) { | ||
- if (type == wanted) return cont(); | ||
- else if (wanted == ";") return pass(); | ||
- else return cont(arguments.callee); | ||
- }; | ||
- } | ||
- | ||
- function statement(type) { | ||
- if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); | ||
- if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); | ||
- if (type == "keyword b") return cont(pushlex("form"), statement, poplex); | ||
- if (type == "{") return cont(pushlex("}"), block, poplex); | ||
- if (type == ";") return cont(); | ||
- if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse); | ||
- if (type == "function") return cont(functiondef); | ||
- if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), | ||
- poplex, statement, poplex); | ||
- if (type == "variable") return cont(pushlex("stat"), maybelabel); | ||
- if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), | ||
- block, poplex, poplex); | ||
- if (type == "case") return cont(expression, expect(":")); | ||
- if (type == "default") return cont(expect(":")); | ||
- if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), | ||
- statement, poplex, popcontext); | ||
- return pass(pushlex("stat"), expression, expect(";"), poplex); | ||
- } | ||
- function expression(type) { | ||
- return expressionInner(type, false); | ||
- } | ||
- function expressionNoComma(type) { | ||
- return expressionInner(type, true); | ||
- } | ||
- function expressionInner(type, noComma) { | ||
- var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; | ||
- if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); | ||
- if (type == "function") return cont(functiondef); | ||
- if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression); | ||
- if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); | ||
- if (type == "operator") return cont(noComma ? expressionNoComma : expression); | ||
- if (type == "[") return cont(pushlex("]"), commasep(expressionNoComma, "]"), poplex, maybeop); | ||
- if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeop); | ||
- return cont(); | ||
- } | ||
- function maybeexpression(type) { | ||
- if (type.match(/[;\}\)\],]/)) return pass(); | ||
- return pass(expression); | ||
- } | ||
- function maybeexpressionNoComma(type) { | ||
- if (type.match(/[;\}\)\],]/)) return pass(); | ||
- return pass(expressionNoComma); | ||
- } | ||
- | ||
- function maybeoperatorComma(type, value) { | ||
- if (type == ",") return cont(expression); | ||
- return maybeoperatorNoComma(type, value, false); | ||
- } | ||
- function maybeoperatorNoComma(type, value, noComma) { | ||
- var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; | ||
- var expr = noComma == false ? expression : expressionNoComma; | ||
- if (type == "operator") { | ||
- if (/\+\+|--/.test(value)) return cont(me); | ||
- if (value == "?") return cont(expression, expect(":"), expr); | ||
- return cont(expr); | ||
- } | ||
- if (type == ";") return; | ||
- if (type == "(") return cont(pushlex(")", "call"), commasep(expressionNoComma, ")"), poplex, me); | ||
- if (type == ".") return cont(property, me); | ||
- if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); | ||
- } | ||
- function maybelabel(type) { | ||
- if (type == ":") return cont(poplex, statement); | ||
- return pass(maybeoperatorComma, expect(";"), poplex); | ||
- } | ||
- function property(type) { | ||
- if (type == "variable") {cx.marked = "property"; return cont();} | ||
- } | ||
- function objprop(type, value) { | ||
- if (type == "variable") { | ||
- cx.marked = "property"; | ||
- if (value == "get" || value == "set") return cont(getterSetter); | ||
- } else if (type == "number" || type == "string") { | ||
- cx.marked = type + " property"; | ||
- } | ||
- if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expressionNoComma); | ||
- } | ||
- function getterSetter(type) { | ||
- if (type == ":") return cont(expression); | ||
- if (type != "variable") return cont(expect(":"), expression); | ||
- cx.marked = "property"; | ||
- return cont(functiondef); | ||
- } | ||
- function commasep(what, end) { | ||
- function proceed(type) { | ||
- if (type == ",") { | ||
- var lex = cx.state.lexical; | ||
- if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; | ||
- return cont(what, proceed); | ||
- } | ||
- if (type == end) return cont(); | ||
- return cont(expect(end)); | ||
- } | ||
- return function(type) { | ||
- if (type == end) return cont(); | ||
- else return pass(what, proceed); | ||
- }; | ||
- } | ||
- function block(type) { | ||
- if (type == "}") return cont(); | ||
- return pass(statement, block); | ||
- } | ||
- function maybetype(type) { | ||
- if (type == ":") return cont(typedef); | ||
- return pass(); | ||
- } | ||
- function typedef(type) { | ||
- if (type == "variable"){cx.marked = "variable-3"; return cont();} | ||
- return pass(); | ||
- } | ||
- function vardef1(type, value) { | ||
- if (type == "variable") { | ||
- register(value); | ||
- return isTS ? cont(maybetype, vardef2) : cont(vardef2); | ||
- } | ||
- return pass(); | ||
- } | ||
- function vardef2(type, value) { | ||
- if (value == "=") return cont(expressionNoComma, vardef2); | ||
- if (type == ",") return cont(vardef1); | ||
- } | ||
- function maybeelse(type, value) { | ||
- if (type == "keyword b" && value == "else") return cont(pushlex("form"), statement, poplex); | ||
- } | ||
- function forspec1(type) { | ||
- if (type == "var") return cont(vardef1, expect(";"), forspec2); | ||
- if (type == ";") return cont(forspec2); | ||
- if (type == "variable") return cont(formaybein); | ||
- return pass(expression, expect(";"), forspec2); | ||
- } | ||
- function formaybein(_type, value) { | ||
- if (value == "in") return cont(expression); | ||
- return cont(maybeoperatorComma, forspec2); | ||
- } | ||
- function forspec2(type, value) { | ||
- if (type == ";") return cont(forspec3); | ||
- if (value == "in") return cont(expression); | ||
- return pass(expression, expect(";"), forspec3); | ||
- } | ||
- function forspec3(type) { | ||
- if (type != ")") cont(expression); | ||
- } | ||
- function functiondef(type, value) { | ||
- if (type == "variable") {register(value); return cont(functiondef);} | ||
- if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext); | ||
- } | ||
- function funarg(type, value) { | ||
- if (type == "variable") {register(value); return isTS ? cont(maybetype) : cont();} | ||
- } | ||
- | ||
- // Interface | ||
- | ||
- return { | ||
- startState: function(basecolumn) { | ||
- return { | ||
- tokenize: jsTokenBase, | ||
- lastType: null, | ||
- cc: [], | ||
- lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), | ||
- localVars: parserConfig.localVars, | ||
- globalVars: parserConfig.globalVars, | ||
- context: parserConfig.localVars && {vars: parserConfig.localVars}, | ||
- indented: 0 | ||
- }; | ||
- }, | ||
- | ||
- token: function(stream, state) { | ||
- if (stream.sol()) { | ||
- if (!state.lexical.hasOwnProperty("align")) | ||
- state.lexical.align = false; | ||
- state.indented = stream.indentation(); | ||
- } | ||
- if (state.tokenize != jsTokenComment && stream.eatSpace()) return null; | ||
- var style = state.tokenize(stream, state); | ||
- if (type == "comment") return style; | ||
- state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; | ||
- return parseJS(state, style, type, content, stream); | ||
- }, | ||
- | ||
- indent: function(state, textAfter) { | ||
- if (state.tokenize == jsTokenComment) return CodeMirror.Pass; | ||
- if (state.tokenize != jsTokenBase) return 0; | ||
- var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; | ||
- // Kludge to prevent 'maybelse' from blocking lexical scope pops | ||
- for (var i = state.cc.length - 1; i >= 0; --i) { | ||
- var c = state.cc[i]; | ||
- if (c == poplex) lexical = lexical.prev; | ||
- else if (c != maybeelse || /^else\b/.test(textAfter)) break; | ||
- } | ||
- if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; | ||
- if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") | ||
- lexical = lexical.prev; | ||
- var type = lexical.type, closing = firstChar == type; | ||
- | ||
- if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? 4 : 0); | ||
- else if (type == "form" && firstChar == "{") return lexical.indented; | ||
- else if (type == "form") return lexical.indented + indentUnit; | ||
- else if (type == "stat") | ||
- return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? statementIndent || indentUnit : 0); | ||
- else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) | ||
- return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); | ||
- else if (lexical.align) return lexical.column + (closing ? 0 : 1); | ||
- else return lexical.indented + (closing ? 0 : indentUnit); | ||
- }, | ||
- | ||
- electricChars: ":{}", | ||
- blockCommentStart: jsonMode ? null : "/*", | ||
- blockCommentEnd: jsonMode ? null : "*/", | ||
- lineComment: jsonMode ? null : "//", | ||
- fold: "brace", | ||
- | ||
- helperType: jsonMode ? "json" : "javascript", | ||
- jsonMode: jsonMode | ||
- }; | ||
-}; | ||
- | ||
-CodeMirror.defineMode("javascript", opts ); | ||
-CodeMirrorOriginal.defineMode("javascript", opts ); | ||
-CodeMirror.defineMIME("text/javascript", "javascript"); | ||
-CodeMirror.defineMIME("text/ecmascript", "javascript"); | ||
-CodeMirror.defineMIME("application/javascript", "javascript"); | ||
-CodeMirror.defineMIME("application/ecmascript", "javascript"); | ||
-CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); | ||
-CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); | ||
-CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); | ||
-CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); |
749
public/js/lib/codemirror-accessible/stress.html
0 additions,
749 deletions
not shown because the diff is too large. Please use a local Git client to view these changes.
8
public/js/lib/codemirror/.gitattributes
@@ -1,8 +0,0 @@ | ||
-*.txt text | ||
-*.js text | ||
-*.html text | ||
-*.md text | ||
-*.json text | ||
-*.yml text | ||
-*.css text | ||
-*.svg text |
8
public/js/lib/codemirror/.gitignore
@@ -1,8 +0,0 @@ | ||
-/node_modules | ||
-/npm-debug.log | ||
-test.html | ||
-.tern-* | ||
-*~ | ||
-*.swp | ||
-.idea | ||
-*.iml |
3
public/js/lib/codemirror/.travis.yml
@@ -1,3 +0,0 @@ | ||
-language: node_js | ||
-node_js: | ||
- - 0.8 |
423
public/js/lib/codemirror/AUTHORS
@@ -1,423 +0,0 @@ | ||
-List of CodeMirror contributors. Updated before every release. | ||
- | ||
-4r2r | ||
-Aaron Brooks | ||
-Abdelouahab | ||
-Abe Fettig | ||
-Adam Ahmed | ||
-Adam King | ||
-adanlobato | ||
-Adán Lobato | ||
-Adrian Aichner | ||
-aeroson | ||
-Ahmad Amireh | ||
-Ahmad M. Zawawi | ||
-ahoward | ||
-Akeksandr Motsjonov | ||
-Alberto González Palomo | ||
-Alberto Pose | ||
-Albert Xing | ||
-Alexander Pavlov | ||
-Alexander Schepanovski | ||
-Alexander Shvets | ||
-Alexander Solovyov | ||
-Alexandre Bique | ||
-alexey-k | ||
-Alex Piggott | ||
-Amsul | ||
-amuntean | ||
-Amy | ||
-Ananya Sen | ||
-anaran | ||
-AndersMad | ||
-Anders Nawroth | ||
-Anderson Mesquita | ||
-Andrea G | ||
-Andreas Reischuck | ||
-Andre von Houck | ||
-Andrey Fedorov | ||
-Andrey Klyuchnikov | ||
-Andrey Lushnikov | ||
-Andy Joslin | ||
-Andy Kimball | ||
-Andy Li | ||
-angelozerr | ||
-angelo.zerr@gmail.com | ||
-Ankit Ahuja | ||
-Ansel Santosa | ||
-Anthony Grimes | ||
-Anton Kovalyov | ||
-areos | ||
-as3boyan | ||
-AtomicPages LLC | ||
-Atul Bhouraskar | ||
-Aurelian Oancea | ||
-Bastian Müller | ||
-Bem Jones-Bey | ||
-benbro | ||
-Beni Cherniavsky-Paskin | ||
-Benjamin DeCoste | ||
-Ben Keen | ||
-Bernhard Sirlinger | ||
-Bert Chang | ||
-Billy Moon | ||
-binny | ||
-B Krishna Chaitanya | ||
-Blaine G | ||
-blukat29 | ||
-boomyjee | ||
-borawjm | ||
-Brandon Frohs | ||
-Brandon Wamboldt | ||
-Brett Zamir | ||
-Brian Grinstead | ||
-Brian Sletten | ||
-Bruce Mitchener | ||
-Chandra Sekhar Pydi | ||
-Charles Skelton | ||
-Cheah Chu Yeow | ||
-Chris Coyier | ||
-Chris Granger | ||
-Chris Houseknecht | ||
-Chris Morgan | ||
-Christian Oyarzun | ||
-Christopher Brown | ||
-ciaranj | ||
-CodeAnimal | ||
-ComFreek | ||
-Curtis Gagliardi | ||
-dagsta | ||
-daines | ||
-Dale Jung | ||
-Dan Bentley | ||
-Dan Heberden | ||
-Daniel, Dao Quang Minh | ||
-Daniele Di Sarli | ||
-Daniel Faust | ||
-Daniel Huigens | ||
-Daniel KJ | ||
-Daniel Neel | ||
-Daniel Parnell | ||
-Danny Yoo | ||
-darealshinji | ||
-Darius Roberts | ||
-Dave Myers | ||
-David Mignot | ||
-David Pathakjee | ||
-David Vázquez | ||
-deebugger | ||
-Deep Thought | ||
-Devon Carew | ||
-dignifiedquire | ||
-Dimage Sapelkin | ||
-domagoj412 | ||
-Dominator008 | ||
-Domizio Demichelis | ||
-Doug Wikle | ||
-Drew Bratcher | ||
-Drew Hintz | ||
-Drew Khoury | ||
-Dror BG | ||
-duralog | ||
-eborden | ||
-edsharp | ||
-ekhaled | ||
-Enam Mijbah Noor | ||
-Eric Allam | ||
-eustas | ||
-Fabien O'Carroll | ||
-Fabio Zendhi Nagao | ||
-Faiza Alsaied | ||
-Fauntleroy | ||
-fbuchinger | ||
-feizhang365 | ||
-Felipe Lalanne | ||
-Felix Raab | ||
-Filip Noetzel | ||
-flack | ||
-ForbesLindesay | ||
-Forbes Lindesay | ||
-Ford_Lawnmower | ||
-Frank Wiegand | ||
-Gabriel Gheorghian | ||
-Gabriel Horner | ||
-Gabriel Nahmias | ||
-galambalazs | ||
-Gautam Mehta | ||
-gekkoe | ||
-Gerard Braad | ||
-Gergely Hegykozi | ||
-Glenn Jorde | ||
-Glenn Ruehle | ||
-Golevka | ||
-Gordon Smith | ||
-Grant Skinner | ||
-greengiant | ||
-Gregory Koberger | ||
-Guillaume Massé | ||
-Guillaume Massé | ||
-Gustavo Rodrigues | ||
-Hakan Tunc | ||
-Hans Engel | ||
-Hardest | ||
-Hasan Karahan | ||
-Herculano Campos | ||
-Hiroyuki Makino | ||
-hitsthings | ||
-Hocdoc | ||
-Ian Beck | ||
-Ian Dickinson | ||
-Ian Wehrman | ||
-Ian Wetherbee | ||
-Ice White | ||
-ICHIKAWA, Yuji | ||
-ilvalle | ||
-Ingo Richter | ||
-Irakli Gozalishvili | ||
-Ivan Kurnosov | ||
-Jacob Lee | ||
-Jakob Miland | ||
-Jakub Vrana | ||
-Jakub Vrána | ||
-James Campos | ||
-James Thorne | ||
-Jamie Hill | ||
-Jan Jongboom | ||
-jankeromnes | ||
-Jan Keromnes | ||
-Jan Odvarko | ||
-Jan T. Sott | ||
-Jared Forsyth | ||
-Jason | ||
-Jason Barnabe | ||
-Jason Grout | ||
-Jason Johnston | ||
-Jason San Jose | ||
-Jason Siefken | ||
-Jaydeep Solanki | ||
-Jean Boussier | ||
-jeffkenton | ||
-Jeff Pickhardt | ||
-jem (graphite) | ||
-Jeremy Parmenter | ||
-Jochen Berger | ||
-Johan Ask | ||
-John Connor | ||
-John Lees-Miller | ||
-John Snelson | ||
-John Van Der Loo | ||
-Jonathan Malmaud | ||
-jongalloway | ||
-Jon Malmaud | ||
-Jon Sangster | ||
-Joost-Wim Boekesteijn | ||
-Joseph Pecoraro | ||
-Joshua Newman | ||
-Josh Watzman | ||
-jots | ||
-jsoojeon | ||
-Juan Benavides Romero | ||
-Jucovschi Constantin | ||
-Juho Vuori | ||
-Justin Hileman | ||
-jwallers@gmail.com | ||
-kaniga | ||
-Ken Newman | ||
-Ken Rockot | ||
-Kevin Sawicki | ||
-Kevin Ushey | ||
-Klaus Silveira | ||
-Koh Zi Han, Cliff | ||
-komakino | ||
-Konstantin Lopuhin | ||
-koops | ||
-ks-ifware | ||
-kubelsmieci | ||
-Lanfei | ||
-Lanny | ||
-Laszlo Vidacs | ||
-leaf corcoran | ||
-Leonid Khachaturov | ||
-Leon Sorokin | ||
-Leonya Khachaturov | ||
-Liam Newman | ||
-LM | ||
-lochel | ||
-Lorenzo Stoakes | ||
-Luciano Longo | ||
-Luke Stagner | ||
-lynschinzer | ||
-Maksim Lin | ||
-Maksym Taran | ||
-Malay Majithia | ||
-Manuel Rego Casasnovas | ||
-Marat Dreizin | ||
-Marcel Gerber | ||
-Marco Aurélio | ||
-Marco Munizaga | ||
-Marcus Bointon | ||
-Marijn Haverbeke | ||
-Mário Gonçalves | ||
-Mario Pietsch | ||
-Mark Lentczner | ||
-Marko Bonaci | ||
-Martin Balek | ||
-Martín Gaitán | ||
-Martin Hasoň | ||
-Mason Malone | ||
-Mateusz Paprocki | ||
-Mathias Bynens | ||
-mats cronqvist | ||
-Matthew Beale | ||
-Matthias Bussonnier | ||
-Matthias BUSSONNIER | ||
-Matt McDonald | ||
-Matt Pass | ||
-Matt Sacks | ||
-mauricio | ||
-Maximilian Hils | ||
-Maxim Kraev | ||
-Max Kirsch | ||
-Max Xiantu | ||
-mbarkhau | ||
-Metatheos | ||
-Micah Dubinko | ||
-Michael Lehenbauer | ||
-Michael Zhou | ||
-Mighty Guava | ||
-Miguel Castillo | ||
-Mike | ||
-Mike Brevoort | ||
-Mike Diaz | ||
-Mike Ivanov | ||
-Mike Kadin | ||
-MinRK | ||
-Miraculix87 | ||
-misfo | ||
-mloginov | ||
-Moritz Schwörer | ||
-mps | ||
-mtaran-google | ||
-Narciso Jaramillo | ||
-Nathan Williams | ||
-ndr | ||
-nerbert | ||
-nextrevision | ||
-nguillaumin | ||
-Ng Zhi An | ||
-Nicholas Bollweg | ||
-Nicholas Bollweg (Nick) | ||
-Nick Small | ||
-Niels van Groningen | ||
-nightwing | ||
-Nikita Beloglazov | ||
-Nikita Vasilyev | ||
-Nikolay Kostov | ||
-nilp0inter | ||
-Nisarg Jhaveri | ||
-nlwillia | ||
-Norman Rzepka | ||
-pablo | ||
-Page | ||
-Panupong Pasupat | ||
-paris | ||
-Patil Arpith | ||
-Patrick Stoica | ||
-Patrick Strawderman | ||
-Paul Garvin | ||
-Paul Ivanov | ||
-Pavel Feldman | ||
-Pavel Strashkin | ||
-Paweł Bartkiewicz | ||
-peteguhl | ||
-Peter Flynn | ||
-peterkroon | ||
-Peter Kroon | ||
-prasanthj | ||
-Prasanth J | ||
-Radek Piórkowski | ||
-Rahul | ||
-Randall Mason | ||
-Randy Burden | ||
-Randy Edmunds | ||
-Rasmus Erik Voel Jensen | ||
-Richard van der Meer | ||
-Richard Z.H. Wang | ||
-Robert Crossfield | ||
-Roberto Abdelkader Martínez Pérez | ||
-robertop23 | ||
-Robert Plummer | ||
-Ruslan Osmanov | ||
-Ryan Prior | ||
-sabaca | ||
-Samuel Ainsworth | ||
-sandeepshetty | ||
-Sander AKA Redsandro | ||
-santec | ||
-Sascha Peilicke | ||
-satchmorun | ||
-sathyamoorthi | ||
-SCLINIC\jdecker | ||
-Scott Aikin | ||
-Scott Goodhew | ||
-Sebastian Zaha | ||
-shaund | ||
-shaun gilchrist | ||
-Shawn A | ||
-sheopory | ||
-Shiv Deepak | ||
-Shmuel Englard | ||
-Shubham Jain | ||
-silverwind | ||
-snasa | ||
-soliton4 | ||
-sonson | ||
-spastorelli | ||
-srajanpaliwal | ||
-Stanislav Oaserele | ||
-Stas Kobzar | ||
-Stefan Borsje | ||
-Steffen Beyer | ||
-Steve O'Hara | ||
-stoskov | ||
-Taha Jahangir | ||
-Takuji Shimokawa | ||
-Tarmil | ||
-tfjgeorge | ||
-Thaddee Tyl | ||
-TheHowl | ||
-think | ||
-Thomas Dvornik | ||
-Thomas Schmid | ||
-Tim Alby | ||
-Tim Baumann | ||
-Timothy Farrell | ||
-Timothy Hatcher | ||
-TobiasBg | ||
-Tomas-A | ||
-Tomas Varaneckas | ||
-Tom Erik Støwer | ||
-Tom MacWright | ||
-Tony Jian | ||
-Travis Heppe | ||
-Triangle717 | ||
-twifkak | ||
-Vestimir Markov | ||
-vf | ||
-Vincent Woo | ||
-Volker Mische | ||
-wenli | ||
-Wesley Wiser | ||
-Will Binns-Smith | ||
-William Jamieson | ||
-William Stein | ||
-Willy | ||
-Wojtek Ptak | ||
-Xavier Mendez | ||
-Yassin N. Hassan | ||
-YNH Webdev | ||
-Yunchi Luo | ||
-Yuvi Panda | ||
-Zachary Dremann | ||
-zziuni | ||
-魏鹏刚 |
76
public/js/lib/codemirror/CONTRIBUTING.md
@@ -1,76 +0,0 @@ | ||
-# How to contribute | ||
- | ||
-- [Getting help](#getting-help-) | ||
-- [Submitting bug reports](#submitting-bug-reports-) | ||
-- [Contributing code](#contributing-code-) | ||
- | ||
-## Getting help | ||
- | ||
-Community discussion, questions, and informal bug reporting is done on the | ||
-[discuss.CodeMirror forum](http://discuss.codemirror.net). | ||
- | ||
-## Submitting bug reports | ||
- | ||
-The preferred way to report bugs is to use the | ||
-[GitHub issue tracker](http://github.com/codemirror/CodeMirror/issues). Before | ||
-reporting a bug, read these pointers. | ||
- | ||
-**Note:** The issue tracker is for *bugs*, not requests for help. Questions | ||
-should be asked on the | ||
-[discuss.CodeMirror forum](http://discuss.codemirror.net) instead. | ||
- | ||
-### Reporting bugs effectively | ||
- | ||
-- CodeMirror is maintained by volunteers. They don't owe you anything, so be | ||
- polite. Reports with an indignant or belligerent tone tend to be moved to the | ||
- bottom of the pile. | ||
- | ||
-- Include information about **the browser in which the problem occurred**. Even | ||
- if you tested several browsers, and the problem occurred in all of them, | ||
- mention this fact in the bug report. Also include browser version numbers and | ||
- the operating system that you're on. | ||
- | ||
-- Mention which release of CodeMirror you're using. Preferably, try also with | ||
- the current development snapshot, to ensure the problem has not already been | ||
- fixed. | ||
- | ||
-- Mention very precisely what went wrong. "X is broken" is not a good bug | ||
- report. What did you expect to happen? What happened instead? Describe the | ||
- exact steps a maintainer has to take to make the problem occur. We can not | ||
- fix something that we can not observe. | ||
- | ||
-- If the problem can not be reproduced in any of the demos included in the | ||
- CodeMirror distribution, please provide an HTML document that demonstrates | ||
- the problem. The best way to do this is to go to | ||
- [jsbin.com](http://jsbin.com/ihunin/edit), enter it there, press save, and | ||
- include the resulting link in your bug report. | ||
- | ||
-## Contributing code | ||
- | ||
-- Make sure you have a [GitHub Account](https://github.com/signup/free) | ||
-- Fork [CodeMirror](https://github.com/codemirror/CodeMirror/) | ||
- ([how to fork a repo](https://help.github.com/articles/fork-a-repo)) | ||
-- Make your changes | ||
-- If your changes are easy to test or likely to regress, add tests. | ||
- Tests for the core go into `test/test.js`, some modes have their own | ||
- test suite under `mode/XXX/test.js`. Feel free to add new test | ||
- suites to modes that don't have one yet (be sure to link the new | ||
- tests into `test/index.html`). | ||
-- Follow the general code style of the rest of the project (see | ||
- below). Run `bin/lint` to verify that the linter is happy. | ||
-- Make sure all tests pass. Visit `test/index.html` in your browser to | ||
- run them. | ||
-- Submit a pull request | ||
-([how to create a pull request](https://help.github.com/articles/fork-a-repo)) | ||
- | ||
-### Coding standards | ||
- | ||
-- 2 spaces per indentation level, no tabs. | ||
-- Include semicolons after statements. | ||
-- Note that the linter (`bin/lint`) which is run after each commit | ||
- complains about unused variables and functions. Prefix their names | ||
- with an underscore to muffle it. | ||
- | ||
-- CodeMirror does *not* follow JSHint or JSLint prescribed style. | ||
- Patches that try to 'fix' code to pass one of these linters will be | ||
- unceremoniously discarded. |
19
public/js/lib/codemirror/LICENSE
@@ -1,19 +0,0 @@ | ||
-Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others | ||
- | ||
-Permission is hereby granted, free of charge, to any person obtaining a copy | ||
-of this software and associated documentation files (the "Software"), to deal | ||
-in the Software without restriction, including without limitation the rights | ||
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
-copies of the Software, and to permit persons to whom the Software is | ||
-furnished to do so, subject to the following conditions: | ||
- | ||
-The above copyright notice and this permission notice shall be included in | ||
-all copies or substantial portions of the Software. | ||
- | ||
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
-THE SOFTWARE. |
11
public/js/lib/codemirror/README.md
@@ -1,11 +0,0 @@ | ||
-# CodeMirror | ||
-[](https://travis-ci.org/codemirror/CodeMirror) | ||
-[](https://www.npmjs.org/package/codemirror) | ||
- | ||
-CodeMirror is a JavaScript component that provides a code editor in | ||
-the browser. When a mode is available for the language you are coding | ||
-in, it will color your code, and optionally help with indentation. | ||
- | ||
-The project page is http://codemirror.net | ||
-The manual is at http://codemirror.net/doc/manual.html | ||
-The contributing guidelines are in [CONTRIBUTING.md](https://github.com/codemirror/CodeMirror/blob/master/CONTRIBUTING.md) |
183
public/js/lib/codemirror/addon/comment/comment.js
@@ -1,183 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var noOptions = {}; | ||
- var nonWS = /[^\s\u00a0]/; | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- function firstNonWS(str) { | ||
- var found = str.search(nonWS); | ||
- return found == -1 ? 0 : found; | ||
- } | ||
- | ||
- CodeMirror.commands.toggleComment = function(cm) { | ||
- var minLine = Infinity, ranges = cm.listSelections(), mode = null; | ||
- for (var i = ranges.length - 1; i >= 0; i--) { | ||
- var from = ranges[i].from(), to = ranges[i].to(); | ||
- if (from.line >= minLine) continue; | ||
- if (to.line >= minLine) to = Pos(minLine, 0); | ||
- minLine = from.line; | ||
- if (mode == null) { | ||
- if (cm.uncomment(from, to)) mode = "un"; | ||
- else { cm.lineComment(from, to); mode = "line"; } | ||
- } else if (mode == "un") { | ||
- cm.uncomment(from, to); | ||
- } else { | ||
- cm.lineComment(from, to); | ||
- } | ||
- } | ||
- }; | ||
- | ||
- CodeMirror.defineExtension("lineComment", function(from, to, options) { | ||
- if (!options) options = noOptions; | ||
- var self = this, mode = self.getModeAt(from); | ||
- var commentString = options.lineComment || mode.lineComment; | ||
- if (!commentString) { | ||
- if (options.blockCommentStart || mode.blockCommentStart) { | ||
- options.fullLines = true; | ||
- self.blockComment(from, to, options); | ||
- } | ||
- return; | ||
- } | ||
- var firstLine = self.getLine(from.line); | ||
- if (firstLine == null) return; | ||
- var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); | ||
- var pad = options.padding == null ? " " : options.padding; | ||
- var blankLines = options.commentBlankLines || from.line == to.line; | ||
- | ||
- self.operation(function() { | ||
- if (options.indent) { | ||
- var baseString = firstLine.slice(0, firstNonWS(firstLine)); | ||
- for (var i = from.line; i < end; ++i) { | ||
- var line = self.getLine(i), cut = baseString.length; | ||
- if (!blankLines && !nonWS.test(line)) continue; | ||
- if (line.slice(0, cut) != baseString) cut = firstNonWS(line); | ||
- self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); | ||
- } | ||
- } else { | ||
- for (var i = from.line; i < end; ++i) { | ||
- if (blankLines || nonWS.test(self.getLine(i))) | ||
- self.replaceRange(commentString + pad, Pos(i, 0)); | ||
- } | ||
- } | ||
- }); | ||
- }); | ||
- | ||
- CodeMirror.defineExtension("blockComment", function(from, to, options) { | ||
- if (!options) options = noOptions; | ||
- var self = this, mode = self.getModeAt(from); | ||
- var startString = options.blockCommentStart || mode.blockCommentStart; | ||
- var endString = options.blockCommentEnd || mode.blockCommentEnd; | ||
- if (!startString || !endString) { | ||
- if ((options.lineComment || mode.lineComment) && options.fullLines != false) | ||
- self.lineComment(from, to, options); | ||
- return; | ||
- } | ||
- | ||
- var end = Math.min(to.line, self.lastLine()); | ||
- if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; | ||
- | ||
- var pad = options.padding == null ? " " : options.padding; | ||
- if (from.line > end) return; | ||
- | ||
- self.operation(function() { | ||
- if (options.fullLines != false) { | ||
- var lastLineHasText = nonWS.test(self.getLine(end)); | ||
- self.replaceRange(pad + endString, Pos(end)); | ||
- self.replaceRange(startString + pad, Pos(from.line, 0)); | ||
- var lead = options.blockCommentLead || mode.blockCommentLead; | ||
- if (lead != null) for (var i = from.line + 1; i <= end; ++i) | ||
- if (i != end || lastLineHasText) | ||
- self.replaceRange(lead + pad, Pos(i, 0)); | ||
- } else { | ||
- self.replaceRange(endString, to); | ||
- self.replaceRange(startString, from); | ||
- } | ||
- }); | ||
- }); | ||
- | ||
- CodeMirror.defineExtension("uncomment", function(from, to, options) { | ||
- if (!options) options = noOptions; | ||
- var self = this, mode = self.getModeAt(from); | ||
- var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); | ||
- | ||
- // Try finding line comments | ||
- var lineString = options.lineComment || mode.lineComment, lines = []; | ||
- var pad = options.padding == null ? " " : options.padding, didSomething; | ||
- lineComment: { | ||
- if (!lineString) break lineComment; | ||
- for (var i = start; i <= end; ++i) { | ||
- var line = self.getLine(i); | ||
- var found = line.indexOf(lineString); | ||
- if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; | ||
- if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment; | ||
- if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; | ||
- lines.push(line); | ||
- } | ||
- self.operation(function() { | ||
- for (var i = start; i <= end; ++i) { | ||
- var line = lines[i - start]; | ||
- var pos = line.indexOf(lineString), endPos = pos + lineString.length; | ||
- if (pos < 0) continue; | ||
- if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; | ||
- didSomething = true; | ||
- self.replaceRange("", Pos(i, pos), Pos(i, endPos)); | ||
- } | ||
- }); | ||
- if (didSomething) return true; | ||
- } | ||
- | ||
- // Try block comments | ||
- var startString = options.blockCommentStart || mode.blockCommentStart; | ||
- var endString = options.blockCommentEnd || mode.blockCommentEnd; | ||
- if (!startString || !endString) return false; | ||
- var lead = options.blockCommentLead || mode.blockCommentLead; | ||
- var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end); | ||
- var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString); | ||
- if (close == -1 && start != end) { | ||
- endLine = self.getLine(--end); | ||
- close = endLine.lastIndexOf(endString); | ||
- } | ||
- if (open == -1 || close == -1 || | ||
- !/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) || | ||
- !/comment/.test(self.getTokenTypeAt(Pos(end, close + 1)))) | ||
- return false; | ||
- | ||
- // Avoid killing block comments completely outside the selection. | ||
- // Positions of the last startString before the start of the selection, and the first endString after it. | ||
- var lastStart = startLine.lastIndexOf(startString, from.ch); | ||
- var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); | ||
- if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; | ||
- // Positions of the first endString after the end of the selection, and the last startString before it. | ||
- firstEnd = endLine.indexOf(endString, to.ch); | ||
- var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); | ||
- lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; | ||
- if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; | ||
- | ||
- self.operation(function() { | ||
- self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), | ||
- Pos(end, close + endString.length)); | ||
- var openEnd = open + startString.length; | ||
- if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; | ||
- self.replaceRange("", Pos(start, open), Pos(start, openEnd)); | ||
- if (lead) for (var i = start + 1; i <= end; ++i) { | ||
- var line = self.getLine(i), found = line.indexOf(lead); | ||
- if (found == -1 || nonWS.test(line.slice(0, found))) continue; | ||
- var foundEnd = found + lead.length; | ||
- if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; | ||
- self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); | ||
- } | ||
- }); | ||
- return true; | ||
- }); | ||
-}); |
85
public/js/lib/codemirror/addon/comment/continuecomment.js
@@ -1,85 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- var modes = ["clike", "css", "javascript"]; | ||
- | ||
- for (var i = 0; i < modes.length; ++i) | ||
- CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "}); | ||
- | ||
- function continueComment(cm) { | ||
- if (cm.getOption("disableInput")) return CodeMirror.Pass; | ||
- var ranges = cm.listSelections(), mode, inserts = []; | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- var pos = ranges[i].head, token = cm.getTokenAt(pos); | ||
- if (token.type != "comment") return CodeMirror.Pass; | ||
- var modeHere = CodeMirror.innerMode(cm.getMode(), token.state).mode; | ||
- if (!mode) mode = modeHere; | ||
- else if (mode != modeHere) return CodeMirror.Pass; | ||
- | ||
- var insert = null; | ||
- if (mode.blockCommentStart && mode.blockCommentContinue) { | ||
- var end = token.string.indexOf(mode.blockCommentEnd); | ||
- var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found; | ||
- if (end != -1 && end == token.string.length - mode.blockCommentEnd.length && pos.ch >= end) { | ||
- // Comment ended, don't continue it | ||
- } else if (token.string.indexOf(mode.blockCommentStart) == 0) { | ||
- insert = full.slice(0, token.start); | ||
- if (!/^\s*$/.test(insert)) { | ||
- insert = ""; | ||
- for (var j = 0; j < token.start; ++j) insert += " "; | ||
- } | ||
- } else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 && | ||
- found + mode.blockCommentContinue.length > token.start && | ||
- /^\s*$/.test(full.slice(0, found))) { | ||
- insert = full.slice(0, found); | ||
- } | ||
- if (insert != null) insert += mode.blockCommentContinue; | ||
- } | ||
- if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) { | ||
- var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment); | ||
- if (found > -1) { | ||
- insert = line.slice(0, found); | ||
- if (/\S/.test(insert)) insert = null; | ||
- else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0]; | ||
- } | ||
- } | ||
- if (insert == null) return CodeMirror.Pass; | ||
- inserts[i] = "\n" + insert; | ||
- } | ||
- | ||
- cm.operation(function() { | ||
- for (var i = ranges.length - 1; i >= 0; i--) | ||
- cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert"); | ||
- }); | ||
- } | ||
- | ||
- function continueLineCommentEnabled(cm) { | ||
- var opt = cm.getOption("continueComments"); | ||
- if (opt && typeof opt == "object") | ||
- return opt.continueLineComment !== false; | ||
- return true; | ||
- } | ||
- | ||
- CodeMirror.defineOption("continueComments", null, function(cm, val, prev) { | ||
- if (prev && prev != CodeMirror.Init) | ||
- cm.removeKeyMap("continueComment"); | ||
- if (val) { | ||
- var key = "Enter"; | ||
- if (typeof val == "string") | ||
- key = val; | ||
- else if (typeof val == "object" && val.key) | ||
- key = val.key; | ||
- var map = {name: "continueComment"}; | ||
- map[key] = continueComment; | ||
- cm.addKeyMap(map); | ||
- } | ||
- }); | ||
-}); |
32
public/js/lib/codemirror/addon/dialog/dialog.css
@@ -1,32 +0,0 @@ | ||
-.CodeMirror-dialog { | ||
- position: absolute; | ||
- left: 0; right: 0; | ||
- background: white; | ||
- z-index: 15; | ||
- padding: .1em .8em; | ||
- overflow: hidden; | ||
- color: #333; | ||
-} | ||
- | ||
-.CodeMirror-dialog-top { | ||
- border-bottom: 1px solid #eee; | ||
- top: 0; | ||
-} | ||
- | ||
-.CodeMirror-dialog-bottom { | ||
- border-top: 1px solid #eee; | ||
- bottom: 0; | ||
-} | ||
- | ||
-.CodeMirror-dialog input { | ||
- border: none; | ||
- outline: none; | ||
- background: transparent; | ||
- width: 20em; | ||
- color: inherit; | ||
- font-family: monospace; | ||
-} | ||
- | ||
-.CodeMirror-dialog button { | ||
- font-size: 70%; | ||
-} |
155
public/js/lib/codemirror/addon/dialog/dialog.js
@@ -1,155 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Open simple dialogs on top of an editor. Relies on dialog.css. | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- function dialogDiv(cm, template, bottom) { | ||
- var wrap = cm.getWrapperElement(); | ||
- var dialog; | ||
- dialog = wrap.appendChild(document.createElement("div")); | ||
- if (bottom) | ||
- dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; | ||
- else | ||
- dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; | ||
- | ||
- if (typeof template == "string") { | ||
- dialog.innerHTML = template; | ||
- } else { // Assuming it's a detached DOM element. | ||
- dialog.appendChild(template); | ||
- } | ||
- return dialog; | ||
- } | ||
- | ||
- function closeNotification(cm, newVal) { | ||
- if (cm.state.currentNotificationClose) | ||
- cm.state.currentNotificationClose(); | ||
- cm.state.currentNotificationClose = newVal; | ||
- } | ||
- | ||
- CodeMirror.defineExtension("openDialog", function(template, callback, options) { | ||
- if (!options) options = {}; | ||
- | ||
- closeNotification(this, null); | ||
- | ||
- var dialog = dialogDiv(this, template, options.bottom); | ||
- var closed = false, me = this; | ||
- function close(newVal) { | ||
- if (typeof newVal == 'string') { | ||
- inp.value = newVal; | ||
- } else { | ||
- if (closed) return; | ||
- closed = true; | ||
- dialog.parentNode.removeChild(dialog); | ||
- me.focus(); | ||
- | ||
- if (options.onClose) options.onClose(dialog); | ||
- } | ||
- } | ||
- | ||
- var inp = dialog.getElementsByTagName("input")[0], button; | ||
- if (inp) { | ||
- if (options.value) { | ||
- inp.value = options.value; | ||
- inp.select(); | ||
- } | ||
- | ||
- if (options.onInput) | ||
- CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); | ||
- if (options.onKeyUp) | ||
- CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); | ||
- | ||
- CodeMirror.on(inp, "keydown", function(e) { | ||
- if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } | ||
- if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { | ||
- inp.blur(); | ||
- CodeMirror.e_stop(e); | ||
- close(); | ||
- } | ||
- if (e.keyCode == 13) callback(inp.value, e); | ||
- }); | ||
- | ||
- if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); | ||
- | ||
- inp.focus(); | ||
- } else if (button = dialog.getElementsByTagName("button")[0]) { | ||
- CodeMirror.on(button, "click", function() { | ||
- close(); | ||
- me.focus(); | ||
- }); | ||
- | ||
- if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); | ||
- | ||
- button.focus(); | ||
- } | ||
- return close; | ||
- }); | ||
- | ||
- CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { | ||
- closeNotification(this, null); | ||
- var dialog = dialogDiv(this, template, options && options.bottom); | ||
- var buttons = dialog.getElementsByTagName("button"); | ||
- var closed = false, me = this, blurring = 1; | ||
- function close() { | ||
- if (closed) return; | ||
- closed = true; | ||
- dialog.parentNode.removeChild(dialog); | ||
- me.focus(); | ||
- } | ||
- buttons[0].focus(); | ||
- for (var i = 0; i < buttons.length; ++i) { | ||
- var b = buttons[i]; | ||
- (function(callback) { | ||
- CodeMirror.on(b, "click", function(e) { | ||
- CodeMirror.e_preventDefault(e); | ||
- close(); | ||
- if (callback) callback(me); | ||
- }); | ||
- })(callbacks[i]); | ||
- CodeMirror.on(b, "blur", function() { | ||
- --blurring; | ||
- setTimeout(function() { if (blurring <= 0) close(); }, 200); | ||
- }); | ||
- CodeMirror.on(b, "focus", function() { ++blurring; }); | ||
- } | ||
- }); | ||
- | ||
- /* | ||
- * openNotification | ||
- * Opens a notification, that can be closed with an optional timer | ||
- * (default 5000ms timer) and always closes on click. | ||
- * | ||
- * If a notification is opened while another is opened, it will close the | ||
- * currently opened one and open the new one immediately. | ||
- */ | ||
- CodeMirror.defineExtension("openNotification", function(template, options) { | ||
- closeNotification(this, close); | ||
- var dialog = dialogDiv(this, template, options && options.bottom); | ||
- var closed = false, doneTimer; | ||
- var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; | ||
- | ||
- function close() { | ||
- if (closed) return; | ||
- closed = true; | ||
- clearTimeout(doneTimer); | ||
- dialog.parentNode.removeChild(dialog); | ||
- } | ||
- | ||
- CodeMirror.on(dialog, 'click', function(e) { | ||
- CodeMirror.e_preventDefault(e); | ||
- close(); | ||
- }); | ||
- | ||
- if (duration) | ||
- doneTimer = setTimeout(close, duration); | ||
- | ||
- return close; | ||
- }); | ||
-}); |
6
public/js/lib/codemirror/addon/display/fullscreen.css
@@ -1,6 +0,0 @@ | ||
-.CodeMirror-fullscreen { | ||
- position: fixed; | ||
- top: 0; left: 0; right: 0; bottom: 0; | ||
- height: auto; | ||
- z-index: 9; | ||
-} |
41
public/js/lib/codemirror/addon/display/fullscreen.js
@@ -1,41 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { | ||
- if (old == CodeMirror.Init) old = false; | ||
- if (!old == !val) return; | ||
- if (val) setFullscreen(cm); | ||
- else setNormal(cm); | ||
- }); | ||
- | ||
- function setFullscreen(cm) { | ||
- var wrap = cm.getWrapperElement(); | ||
- cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, | ||
- width: wrap.style.width, height: wrap.style.height}; | ||
- wrap.style.width = ""; | ||
- wrap.style.height = "auto"; | ||
- wrap.className += " CodeMirror-fullscreen"; | ||
- document.documentElement.style.overflow = "hidden"; | ||
- cm.refresh(); | ||
- } | ||
- | ||
- function setNormal(cm) { | ||
- var wrap = cm.getWrapperElement(); | ||
- wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); | ||
- document.documentElement.style.overflow = ""; | ||
- var info = cm.state.fullScreenRestore; | ||
- wrap.style.width = info.width; wrap.style.height = info.height; | ||
- window.scrollTo(info.scrollLeft, info.scrollTop); | ||
- cm.refresh(); | ||
- } | ||
-}); |
94
public/js/lib/codemirror/addon/display/panel.js
@@ -1,94 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- CodeMirror.defineExtension("addPanel", function(node, options) { | ||
- if (!this.state.panels) initPanels(this); | ||
- | ||
- var info = this.state.panels; | ||
- if (options && options.position == "bottom") | ||
- info.wrapper.appendChild(node); | ||
- else | ||
- info.wrapper.insertBefore(node, info.wrapper.firstChild); | ||
- var height = (options && options.height) || node.offsetHeight; | ||
- this._setSize(null, info.heightLeft -= height); | ||
- info.panels++; | ||
- return new Panel(this, node, options, height); | ||
- }); | ||
- | ||
- function Panel(cm, node, options, height) { | ||
- this.cm = cm; | ||
- this.node = node; | ||
- this.options = options; | ||
- this.height = height; | ||
- this.cleared = false; | ||
- } | ||
- | ||
- Panel.prototype.clear = function() { | ||
- if (this.cleared) return; | ||
- this.cleared = true; | ||
- var info = this.cm.state.panels; | ||
- this.cm._setSize(null, info.heightLeft += this.height); | ||
- info.wrapper.removeChild(this.node); | ||
- if (--info.panels == 0) removePanels(this.cm); | ||
- }; | ||
- | ||
- Panel.prototype.changed = function(height) { | ||
- var newHeight = height == null ? this.node.offsetHeight : height; | ||
- var info = this.cm.state.panels; | ||
- this.cm._setSize(null, info.height += (newHeight - this.height)); | ||
- this.height = newHeight; | ||
- }; | ||
- | ||
- function initPanels(cm) { | ||
- var wrap = cm.getWrapperElement(); | ||
- var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle; | ||
- var height = parseInt(style.height); | ||
- var info = cm.state.panels = { | ||
- setHeight: wrap.style.height, | ||
- heightLeft: height, | ||
- panels: 0, | ||
- wrapper: document.createElement("div") | ||
- }; | ||
- wrap.parentNode.insertBefore(info.wrapper, wrap); | ||
- var hasFocus = cm.hasFocus(); | ||
- info.wrapper.appendChild(wrap); | ||
- if (hasFocus) cm.focus(); | ||
- | ||
- cm._setSize = cm.setSize; | ||
- if (height != null) cm.setSize = function(width, newHeight) { | ||
- if (newHeight == null) return this._setSize(width, newHeight); | ||
- info.setHeight = newHeight; | ||
- if (typeof newHeight != "number") { | ||
- var px = /^(\d+\.?\d*)px$/.exec(newHeight); | ||
- if (px) { | ||
- newHeight = Number(px[1]); | ||
- } else { | ||
- info.wrapper.style.height = newHeight; | ||
- newHeight = info.wrapper.offsetHeight; | ||
- info.wrapper.style.height = ""; | ||
- } | ||
- } | ||
- cm._setSize(width, info.heightLeft += (newHeight - height)); | ||
- height = newHeight; | ||
- }; | ||
- } | ||
- | ||
- function removePanels(cm) { | ||
- var info = cm.state.panels; | ||
- cm.state.panels = null; | ||
- | ||
- var wrap = cm.getWrapperElement(); | ||
- info.wrapper.parentNode.replaceChild(wrap, info.wrapper); | ||
- wrap.style.height = info.setHeight; | ||
- cm.setSize = cm._setSize; | ||
- cm.setSize(); | ||
- } | ||
-}); |
58
public/js/lib/codemirror/addon/display/placeholder.js
@@ -1,58 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- CodeMirror.defineOption("placeholder", "", function(cm, val, old) { | ||
- var prev = old && old != CodeMirror.Init; | ||
- if (val && !prev) { | ||
- cm.on("blur", onBlur); | ||
- cm.on("change", onChange); | ||
- onChange(cm); | ||
- } else if (!val && prev) { | ||
- cm.off("blur", onBlur); | ||
- cm.off("change", onChange); | ||
- clearPlaceholder(cm); | ||
- var wrapper = cm.getWrapperElement(); | ||
- wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); | ||
- } | ||
- | ||
- if (val && !cm.hasFocus()) onBlur(cm); | ||
- }); | ||
- | ||
- function clearPlaceholder(cm) { | ||
- if (cm.state.placeholder) { | ||
- cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); | ||
- cm.state.placeholder = null; | ||
- } | ||
- } | ||
- function setPlaceholder(cm) { | ||
- clearPlaceholder(cm); | ||
- var elt = cm.state.placeholder = document.createElement("pre"); | ||
- elt.style.cssText = "height: 0; overflow: visible"; | ||
- elt.className = "CodeMirror-placeholder"; | ||
- elt.appendChild(document.createTextNode(cm.getOption("placeholder"))); | ||
- cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); | ||
- } | ||
- | ||
- function onBlur(cm) { | ||
- if (isEmpty(cm)) setPlaceholder(cm); | ||
- } | ||
- function onChange(cm) { | ||
- var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); | ||
- wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); | ||
- | ||
- if (empty) setPlaceholder(cm); | ||
- else clearPlaceholder(cm); | ||
- } | ||
- | ||
- function isEmpty(cm) { | ||
- return (cm.lineCount() === 1) && (cm.getLine(0) === ""); | ||
- } | ||
-}); |
64
public/js/lib/codemirror/addon/display/rulers.js
@@ -1,64 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineOption("rulers", false, function(cm, val, old) { | ||
- if (old && old != CodeMirror.Init) { | ||
- clearRulers(cm); | ||
- cm.off("refresh", refreshRulers); | ||
- } | ||
- if (val && val.length) { | ||
- setRulers(cm); | ||
- cm.on("refresh", refreshRulers); | ||
- } | ||
- }); | ||
- | ||
- function clearRulers(cm) { | ||
- for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) { | ||
- var node = cm.display.lineSpace.childNodes[i]; | ||
- if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className)) | ||
- node.parentNode.removeChild(node); | ||
- } | ||
- } | ||
- | ||
- function setRulers(cm) { | ||
- var val = cm.getOption("rulers"); | ||
- var cw = cm.defaultCharWidth(); | ||
- var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left; | ||
- var minH = cm.display.scroller.offsetHeight + 30; | ||
- for (var i = 0; i < val.length; i++) { | ||
- var elt = document.createElement("div"); | ||
- elt.className = "CodeMirror-ruler"; | ||
- var col, cls = null, conf = val[i]; | ||
- if (typeof conf == "number") { | ||
- col = conf; | ||
- } else { | ||
- col = conf.column; | ||
- if (conf.className) elt.className += " " + conf.className; | ||
- if (conf.color) elt.style.borderColor = conf.color; | ||
- if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle; | ||
- if (conf.width) elt.style.borderLeftWidth = conf.width; | ||
- cls = val[i].className; | ||
- } | ||
- elt.style.left = (left + col * cw) + "px"; | ||
- elt.style.top = "-50px"; | ||
- elt.style.bottom = "-20px"; | ||
- elt.style.minHeight = minH + "px"; | ||
- cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv); | ||
- } | ||
- } | ||
- | ||
- function refreshRulers(cm) { | ||
- clearRulers(cm); | ||
- setRulers(cm); | ||
- } | ||
-}); |
159
public/js/lib/codemirror/addon/edit/closebrackets.js
@@ -1,159 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- var DEFAULT_BRACKETS = "()[]{}''\"\""; | ||
- var DEFAULT_EXPLODE_ON_ENTER = "[]{}"; | ||
- var SPACE_CHAR_REGEX = /\s/; | ||
- | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { | ||
- if (old != CodeMirror.Init && old) | ||
- cm.removeKeyMap("autoCloseBrackets"); | ||
- if (!val) return; | ||
- var pairs = DEFAULT_BRACKETS, explode = DEFAULT_EXPLODE_ON_ENTER; | ||
- if (typeof val == "string") pairs = val; | ||
- else if (typeof val == "object") { | ||
- if (val.pairs != null) pairs = val.pairs; | ||
- if (val.explode != null) explode = val.explode; | ||
- } | ||
- var map = buildKeymap(pairs); | ||
- if (explode) map.Enter = buildExplodeHandler(explode); | ||
- cm.addKeyMap(map); | ||
- }); | ||
- | ||
- function charsAround(cm, pos) { | ||
- var str = cm.getRange(Pos(pos.line, pos.ch - 1), | ||
- Pos(pos.line, pos.ch + 1)); | ||
- return str.length == 2 ? str : null; | ||
- } | ||
- | ||
- // Project the token type that will exists after the given char is | ||
- // typed, and use it to determine whether it would cause the start | ||
- // of a string token. | ||
- function enteringString(cm, pos, ch) { | ||
- var line = cm.getLine(pos.line); | ||
- var token = cm.getTokenAt(pos); | ||
- if (/\bstring2?\b/.test(token.type)) return false; | ||
- var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4); | ||
- stream.pos = stream.start = token.start; | ||
- for (;;) { | ||
- var type1 = cm.getMode().token(stream, token.state); | ||
- if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1); | ||
- stream.start = stream.pos; | ||
- } | ||
- } | ||
- | ||
- function buildKeymap(pairs) { | ||
- var map = { | ||
- name : "autoCloseBrackets", | ||
- Backspace: function(cm) { | ||
- if (cm.getOption("disableInput")) return CodeMirror.Pass; | ||
- var ranges = cm.listSelections(); | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- if (!ranges[i].empty()) return CodeMirror.Pass; | ||
- var around = charsAround(cm, ranges[i].head); | ||
- if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; | ||
- } | ||
- for (var i = ranges.length - 1; i >= 0; i--) { | ||
- var cur = ranges[i].head; | ||
- cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); | ||
- } | ||
- } | ||
- }; | ||
- var closingBrackets = ""; | ||
- for (var i = 0; i < pairs.length; i += 2) (function(left, right) { | ||
- closingBrackets += right; | ||
- map["'" + left + "'"] = function(cm) { | ||
- if (cm.getOption("disableInput")) return CodeMirror.Pass; | ||
- var ranges = cm.listSelections(), type, next; | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- var range = ranges[i], cur = range.head, curType; | ||
- var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); | ||
- if (!range.empty()) { | ||
- curType = "surround"; | ||
- } else if (left == right && next == right) { | ||
- if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left) | ||
- curType = "skipThree"; | ||
- else | ||
- curType = "skip"; | ||
- } else if (left == right && cur.ch > 1 && | ||
- cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left && | ||
- (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) { | ||
- curType = "addFour"; | ||
- } else if (left == '"' || left == "'") { | ||
- if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both"; | ||
- else return CodeMirror.Pass; | ||
- } else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) { | ||
- curType = "both"; | ||
- } else { | ||
- return CodeMirror.Pass; | ||
- } | ||
- if (!type) type = curType; | ||
- else if (type != curType) return CodeMirror.Pass; | ||
- } | ||
- | ||
- cm.operation(function() { | ||
- if (type == "skip") { | ||
- cm.execCommand("goCharRight"); | ||
- } else if (type == "skipThree") { | ||
- for (var i = 0; i < 3; i++) | ||
- cm.execCommand("goCharRight"); | ||
- } else if (type == "surround") { | ||
- var sels = cm.getSelections(); | ||
- for (var i = 0; i < sels.length; i++) | ||
- sels[i] = left + sels[i] + right; | ||
- cm.replaceSelections(sels, "around"); | ||
- } else if (type == "both") { | ||
- cm.replaceSelection(left + right, null); | ||
- cm.execCommand("goCharLeft"); | ||
- } else if (type == "addFour") { | ||
- cm.replaceSelection(left + left + left + left, "before"); | ||
- cm.execCommand("goCharRight"); | ||
- } | ||
- }); | ||
- }; | ||
- if (left != right) map["'" + right + "'"] = function(cm) { | ||
- var ranges = cm.listSelections(); | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- var range = ranges[i]; | ||
- if (!range.empty() || | ||
- cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right) | ||
- return CodeMirror.Pass; | ||
- } | ||
- cm.execCommand("goCharRight"); | ||
- }; | ||
- })(pairs.charAt(i), pairs.charAt(i + 1)); | ||
- return map; | ||
- } | ||
- | ||
- function buildExplodeHandler(pairs) { | ||
- return function(cm) { | ||
- if (cm.getOption("disableInput")) return CodeMirror.Pass; | ||
- var ranges = cm.listSelections(); | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- if (!ranges[i].empty()) return CodeMirror.Pass; | ||
- var around = charsAround(cm, ranges[i].head); | ||
- if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; | ||
- } | ||
- cm.operation(function() { | ||
- cm.replaceSelection("\n\n", null); | ||
- cm.execCommand("goCharLeft"); | ||
- ranges = cm.listSelections(); | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- var line = ranges[i].head.line; | ||
- cm.indentLine(line, null, true); | ||
- cm.indentLine(line + 1, null, true); | ||
- } | ||
- }); | ||
- }; | ||
- } | ||
-}); |
159
public/js/lib/codemirror/addon/edit/closetag.js
@@ -1,159 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-/** | ||
- * Tag-closer extension for CodeMirror. | ||
- * | ||
- * This extension adds an "autoCloseTags" option that can be set to | ||
- * either true to get the default behavior, or an object to further | ||
- * configure its behavior. | ||
- * | ||
- * These are supported options: | ||
- * | ||
- * `whenClosing` (default true) | ||
- * Whether to autoclose when the '/' of a closing tag is typed. | ||
- * `whenOpening` (default true) | ||
- * Whether to autoclose the tag when the final '>' of an opening | ||
- * tag is typed. | ||
- * `dontCloseTags` (default is empty tags for HTML, none for XML) | ||
- * An array of tag names that should not be autoclosed. | ||
- * `indentTags` (default is block tags for HTML, none for XML) | ||
- * An array of tag names that should, when opened, cause a | ||
- * blank line to be added inside the tag, and the blank line and | ||
- * closing line to be indented. | ||
- * | ||
- * See demos/closetag.html for a usage example. | ||
- */ | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("../fold/xml-fold")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "../fold/xml-fold"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { | ||
- if (old != CodeMirror.Init && old) | ||
- cm.removeKeyMap("autoCloseTags"); | ||
- if (!val) return; | ||
- var map = {name: "autoCloseTags"}; | ||
- if (typeof val != "object" || val.whenClosing) | ||
- map["'/'"] = function(cm) { return autoCloseSlash(cm); }; | ||
- if (typeof val != "object" || val.whenOpening) | ||
- map["'>'"] = function(cm) { return autoCloseGT(cm); }; | ||
- cm.addKeyMap(map); | ||
- }); | ||
- | ||
- var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", | ||
- "source", "track", "wbr"]; | ||
- var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", | ||
- "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; | ||
- | ||
- function autoCloseGT(cm) { | ||
- if (cm.getOption("disableInput")) return CodeMirror.Pass; | ||
- var ranges = cm.listSelections(), replacements = []; | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- if (!ranges[i].empty()) return CodeMirror.Pass; | ||
- var pos = ranges[i].head, tok = cm.getTokenAt(pos); | ||
- var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; | ||
- if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass; | ||
- | ||
- var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html"; | ||
- var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); | ||
- var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); | ||
- | ||
- var tagName = state.tagName; | ||
- if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); | ||
- var lowerTagName = tagName.toLowerCase(); | ||
- // Don't process the '>' at the end of an end-tag or self-closing tag | ||
- if (!tagName || | ||
- tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || | ||
- tok.type == "tag" && state.type == "closeTag" || | ||
- tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName /> | ||
- dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || | ||
- closingTagExists(cm, tagName, pos, state, true)) | ||
- return CodeMirror.Pass; | ||
- | ||
- var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; | ||
- replacements[i] = {indent: indent, | ||
- text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">", | ||
- newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)}; | ||
- } | ||
- | ||
- for (var i = ranges.length - 1; i >= 0; i--) { | ||
- var info = replacements[i]; | ||
- cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); | ||
- var sel = cm.listSelections().slice(0); | ||
- sel[i] = {head: info.newPos, anchor: info.newPos}; | ||
- cm.setSelections(sel); | ||
- if (info.indent) { | ||
- cm.indentLine(info.newPos.line, null, true); | ||
- cm.indentLine(info.newPos.line + 1, null, true); | ||
- } | ||
- } | ||
- } | ||
- | ||
- function autoCloseSlash(cm) { | ||
- if (cm.getOption("disableInput")) return CodeMirror.Pass; | ||
- var ranges = cm.listSelections(), replacements = []; | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- if (!ranges[i].empty()) return CodeMirror.Pass; | ||
- var pos = ranges[i].head, tok = cm.getTokenAt(pos); | ||
- var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; | ||
- if (tok.type == "string" || tok.string.charAt(0) != "<" || | ||
- tok.start != pos.ch - 1) | ||
- return CodeMirror.Pass; | ||
- // Kludge to get around the fact that we are not in XML mode | ||
- // when completing in JS/CSS snippet in htmlmixed mode. Does not | ||
- // work for other XML embedded languages (there is no general | ||
- // way to go from a mixed mode to its current XML state). | ||
- if (inner.mode.name != "xml") { | ||
- if (cm.getMode().name == "htmlmixed" && inner.mode.name == "javascript") | ||
- replacements[i] = "/script>"; | ||
- else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css") | ||
- replacements[i] = "/style>"; | ||
- else | ||
- return CodeMirror.Pass; | ||
- } else { | ||
- if (!state.context || !state.context.tagName || | ||
- closingTagExists(cm, state.context.tagName, pos, state)) | ||
- return CodeMirror.Pass; | ||
- replacements[i] = "/" + state.context.tagName + ">"; | ||
- } | ||
- } | ||
- cm.replaceSelections(replacements); | ||
- ranges = cm.listSelections(); | ||
- for (var i = 0; i < ranges.length; i++) | ||
- if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) | ||
- cm.indentLine(ranges[i].head.line); | ||
- } | ||
- | ||
- function indexOf(collection, elt) { | ||
- if (collection.indexOf) return collection.indexOf(elt); | ||
- for (var i = 0, e = collection.length; i < e; ++i) | ||
- if (collection[i] == elt) return i; | ||
- return -1; | ||
- } | ||
- | ||
- // If xml-fold is loaded, we use its functionality to try and verify | ||
- // whether a given tag is actually unclosed. | ||
- function closingTagExists(cm, tagName, pos, state, newTag) { | ||
- if (!CodeMirror.scanForClosingTag) return false; | ||
- var end = Math.min(cm.lastLine() + 1, pos.line + 500); | ||
- var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); | ||
- if (!nextClose || nextClose.tag != tagName) return false; | ||
- var cx = state.context; | ||
- // If the immediate wrapping context contains onCx instances of | ||
- // the same tag, a closing tag only exists if there are at least | ||
- // that many closing tags of that type following. | ||
- for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx; | ||
- pos = nextClose.to; | ||
- for (var i = 1; i < onCx; i++) { | ||
- var next = CodeMirror.scanForClosingTag(cm, pos, null, end); | ||
- if (!next || next.tag != tagName) return false; | ||
- pos = next.to; | ||
- } | ||
- return true; | ||
- } | ||
-}); |
51
public/js/lib/codemirror/addon/edit/continuelist.js
@@ -1,51 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\s*)/, | ||
- emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)\.)(\s*)$/, | ||
- unorderedListRE = /[*+-]\s/; | ||
- | ||
- CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { | ||
- if (cm.getOption("disableInput")) return CodeMirror.Pass; | ||
- var ranges = cm.listSelections(), replacements = []; | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- var pos = ranges[i].head, match; | ||
- var eolState = cm.getStateAfter(pos.line); | ||
- var inList = eolState.list !== false; | ||
- var inQuote = eolState.quote !== false; | ||
- | ||
- if (!ranges[i].empty() || (!inList && !inQuote) || !(match = cm.getLine(pos.line).match(listRE))) { | ||
- cm.execCommand("newlineAndIndent"); | ||
- return; | ||
- } | ||
- if (cm.getLine(pos.line).match(emptyListRE)) { | ||
- cm.replaceRange("", { | ||
- line: pos.line, ch: 0 | ||
- }, { | ||
- line: pos.line, ch: pos.ch + 1 | ||
- }); | ||
- replacements[i] = "\n"; | ||
- | ||
- } else { | ||
- var indent = match[1], after = match[4]; | ||
- var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0 | ||
- ? match[2] | ||
- : (parseInt(match[3], 10) + 1) + "."; | ||
- | ||
- replacements[i] = "\n" + indent + bullet + after; | ||
- } | ||
- } | ||
- | ||
- cm.replaceSelections(replacements); | ||
- }; | ||
-}); |
120
public/js/lib/codemirror/addon/edit/matchbrackets.js
@@ -1,120 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && | ||
- (document.documentMode == null || document.documentMode < 8); | ||
- | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; | ||
- | ||
- function findMatchingBracket(cm, where, strict, config) { | ||
- var line = cm.getLineHandle(where.line), pos = where.ch - 1; | ||
- var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; | ||
- if (!match) return null; | ||
- var dir = match.charAt(1) == ">" ? 1 : -1; | ||
- if (strict && (dir > 0) != (pos == where.ch)) return null; | ||
- var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); | ||
- | ||
- var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config); | ||
- if (found == null) return null; | ||
- return {from: Pos(where.line, pos), to: found && found.pos, | ||
- match: found && found.ch == match.charAt(0), forward: dir > 0}; | ||
- } | ||
- | ||
- // bracketRegex is used to specify which type of bracket to scan | ||
- // should be a regexp, e.g. /[[\]]/ | ||
- // | ||
- // Note: If "where" is on an open bracket, then this bracket is ignored. | ||
- // | ||
- // Returns false when no bracket was found, null when it reached | ||
- // maxScanLines and gave up | ||
- function scanForBracket(cm, where, dir, style, config) { | ||
- var maxScanLen = (config && config.maxScanLineLength) || 10000; | ||
- var maxScanLines = (config && config.maxScanLines) || 1000; | ||
- | ||
- var stack = []; | ||
- var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/; | ||
- var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) | ||
- : Math.max(cm.firstLine() - 1, where.line - maxScanLines); | ||
- for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { | ||
- var line = cm.getLine(lineNo); | ||
- if (!line) continue; | ||
- var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1; | ||
- if (line.length > maxScanLen) continue; | ||
- if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); | ||
- for (; pos != end; pos += dir) { | ||
- var ch = line.charAt(pos); | ||
- if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) { | ||
- var match = matching[ch]; | ||
- if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch); | ||
- else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch}; | ||
- else stack.pop(); | ||
- } | ||
- } | ||
- } | ||
- return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; | ||
- } | ||
- | ||
- function matchBrackets(cm, autoclear, config) { | ||
- // Disable brace matching in long lines, since it'll cause hugely slow updates | ||
- var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000; | ||
- var marks = [], ranges = cm.listSelections(); | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config); | ||
- if (match && cm.getLine(match.from.line).length <= maxHighlightLen) { | ||
- var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; | ||
- marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style})); | ||
- if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) | ||
- marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style})); | ||
- } | ||
- } | ||
- | ||
- if (marks.length) { | ||
- // Kludge to work around the IE bug from issue #1193, where text | ||
- // input stops going to the textare whever this fires. | ||
- if (ie_lt8 && cm.state.focused) cm.display.input.focus(); | ||
- | ||
- var clear = function() { | ||
- cm.operation(function() { | ||
- for (var i = 0; i < marks.length; i++) marks[i].clear(); | ||
- }); | ||
- }; | ||
- if (autoclear) setTimeout(clear, 800); | ||
- else return clear; | ||
- } | ||
- } | ||
- | ||
- var currentlyHighlighted = null; | ||
- function doMatchBrackets(cm) { | ||
- cm.operation(function() { | ||
- if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;} | ||
- currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); | ||
- }); | ||
- } | ||
- | ||
- CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) { | ||
- if (old && old != CodeMirror.Init) | ||
- cm.off("cursorActivity", doMatchBrackets); | ||
- if (val) { | ||
- cm.state.matchBrackets = typeof val == "object" ? val : {}; | ||
- cm.on("cursorActivity", doMatchBrackets); | ||
- } | ||
- }); | ||
- | ||
- CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);}); | ||
- CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){ | ||
- return findMatchingBracket(this, pos, strict, config); | ||
- }); | ||
- CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){ | ||
- return scanForBracket(this, pos, dir, style, config); | ||
- }); | ||
-}); |
66
public/js/lib/codemirror/addon/edit/matchtags.js
@@ -1,66 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("../fold/xml-fold")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "../fold/xml-fold"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineOption("matchTags", false, function(cm, val, old) { | ||
- if (old && old != CodeMirror.Init) { | ||
- cm.off("cursorActivity", doMatchTags); | ||
- cm.off("viewportChange", maybeUpdateMatch); | ||
- clear(cm); | ||
- } | ||
- if (val) { | ||
- cm.state.matchBothTags = typeof val == "object" && val.bothTags; | ||
- cm.on("cursorActivity", doMatchTags); | ||
- cm.on("viewportChange", maybeUpdateMatch); | ||
- doMatchTags(cm); | ||
- } | ||
- }); | ||
- | ||
- function clear(cm) { | ||
- if (cm.state.tagHit) cm.state.tagHit.clear(); | ||
- if (cm.state.tagOther) cm.state.tagOther.clear(); | ||
- cm.state.tagHit = cm.state.tagOther = null; | ||
- } | ||
- | ||
- function doMatchTags(cm) { | ||
- cm.state.failedTagMatch = false; | ||
- cm.operation(function() { | ||
- clear(cm); | ||
- if (cm.somethingSelected()) return; | ||
- var cur = cm.getCursor(), range = cm.getViewport(); | ||
- range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to); | ||
- var match = CodeMirror.findMatchingTag(cm, cur, range); | ||
- if (!match) return; | ||
- if (cm.state.matchBothTags) { | ||
- var hit = match.at == "open" ? match.open : match.close; | ||
- if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"}); | ||
- } | ||
- var other = match.at == "close" ? match.open : match.close; | ||
- if (other) | ||
- cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"}); | ||
- else | ||
- cm.state.failedTagMatch = true; | ||
- }); | ||
- } | ||
- | ||
- function maybeUpdateMatch(cm) { | ||
- if (cm.state.failedTagMatch) doMatchTags(cm); | ||
- } | ||
- | ||
- CodeMirror.commands.toMatchingTag = function(cm) { | ||
- var found = CodeMirror.findMatchingTag(cm, cm.getCursor()); | ||
- if (found) { | ||
- var other = found.at == "close" ? found.open : found.close; | ||
- if (other) cm.extendSelection(other.to, other.from); | ||
- } | ||
- }; | ||
-}); |
27
public/js/lib/codemirror/addon/edit/trailingspace.js
@@ -1,27 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) { | ||
- if (prev == CodeMirror.Init) prev = false; | ||
- if (prev && !val) | ||
- cm.removeOverlay("trailingspace"); | ||
- else if (!prev && val) | ||
- cm.addOverlay({ | ||
- token: function(stream) { | ||
- for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {} | ||
- if (i > stream.pos) { stream.pos = i; return null; } | ||
- stream.pos = l; | ||
- return "trailingspace"; | ||
- }, | ||
- name: "trailingspace" | ||
- }); | ||
- }); | ||
-}); |
43,080
public/js/lib/codemirror/addon/emmet/emmet.js
0 additions,
43,080 deletions
not shown because the diff is too large. Please use a local Git client to view these changes.
105
public/js/lib/codemirror/addon/fold/brace-fold.js
@@ -1,105 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.registerHelper("fold", "brace", function(cm, start) { | ||
- var line = start.line, lineText = cm.getLine(line); | ||
- var startCh, tokenType; | ||
- | ||
- function findOpening(openCh) { | ||
- for (var at = start.ch, pass = 0;;) { | ||
- var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1); | ||
- if (found == -1) { | ||
- if (pass == 1) break; | ||
- pass = 1; | ||
- at = lineText.length; | ||
- continue; | ||
- } | ||
- if (pass == 1 && found < start.ch) break; | ||
- tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)); | ||
- if (!/^(comment|string)/.test(tokenType)) return found + 1; | ||
- at = found - 1; | ||
- } | ||
- } | ||
- | ||
- var startToken = "{", endToken = "}", startCh = findOpening("{"); | ||
- if (startCh == null) { | ||
- startToken = "[", endToken = "]"; | ||
- startCh = findOpening("["); | ||
- } | ||
- | ||
- if (startCh == null) return; | ||
- var count = 1, lastLine = cm.lastLine(), end, endCh; | ||
- outer: for (var i = line; i <= lastLine; ++i) { | ||
- var text = cm.getLine(i), pos = i == line ? startCh : 0; | ||
- for (;;) { | ||
- var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); | ||
- if (nextOpen < 0) nextOpen = text.length; | ||
- if (nextClose < 0) nextClose = text.length; | ||
- pos = Math.min(nextOpen, nextClose); | ||
- if (pos == text.length) break; | ||
- if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) { | ||
- if (pos == nextOpen) ++count; | ||
- else if (!--count) { end = i; endCh = pos; break outer; } | ||
- } | ||
- ++pos; | ||
- } | ||
- } | ||
- if (end == null || line == end && endCh == startCh) return; | ||
- return {from: CodeMirror.Pos(line, startCh), | ||
- to: CodeMirror.Pos(end, endCh)}; | ||
-}); | ||
- | ||
-CodeMirror.registerHelper("fold", "import", function(cm, start) { | ||
- function hasImport(line) { | ||
- if (line < cm.firstLine() || line > cm.lastLine()) return null; | ||
- var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); | ||
- if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); | ||
- if (start.type != "keyword" || start.string != "import") return null; | ||
- // Now find closing semicolon, return its position | ||
- for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { | ||
- var text = cm.getLine(i), semi = text.indexOf(";"); | ||
- if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)}; | ||
- } | ||
- } | ||
- | ||
- var start = start.line, has = hasImport(start), prev; | ||
- if (!has || hasImport(start - 1) || ((prev = hasImport(start - 2)) && prev.end.line == start - 1)) | ||
- return null; | ||
- for (var end = has.end;;) { | ||
- var next = hasImport(end.line + 1); | ||
- if (next == null) break; | ||
- end = next.end; | ||
- } | ||
- return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end}; | ||
-}); | ||
- | ||
-CodeMirror.registerHelper("fold", "include", function(cm, start) { | ||
- function hasInclude(line) { | ||
- if (line < cm.firstLine() || line > cm.lastLine()) return null; | ||
- var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); | ||
- if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); | ||
- if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8; | ||
- } | ||
- | ||
- var start = start.line, has = hasInclude(start); | ||
- if (has == null || hasInclude(start - 1) != null) return null; | ||
- for (var end = start;;) { | ||
- var next = hasInclude(end + 1); | ||
- if (next == null) break; | ||
- ++end; | ||
- } | ||
- return {from: CodeMirror.Pos(start, has + 1), | ||
- to: cm.clipPos(CodeMirror.Pos(end))}; | ||
-}); | ||
- | ||
-}); |
57
public/js/lib/codemirror/addon/fold/comment-fold.js
@@ -1,57 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.registerGlobalHelper("fold", "comment", function(mode) { | ||
- return mode.blockCommentStart && mode.blockCommentEnd; | ||
-}, function(cm, start) { | ||
- var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd; | ||
- if (!startToken || !endToken) return; | ||
- var line = start.line, lineText = cm.getLine(line); | ||
- | ||
- var startCh; | ||
- for (var at = start.ch, pass = 0;;) { | ||
- var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1); | ||
- if (found == -1) { | ||
- if (pass == 1) return; | ||
- pass = 1; | ||
- at = lineText.length; | ||
- continue; | ||
- } | ||
- if (pass == 1 && found < start.ch) return; | ||
- if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)))) { | ||
- startCh = found + startToken.length; | ||
- break; | ||
- } | ||
- at = found - 1; | ||
- } | ||
- | ||
- var depth = 1, lastLine = cm.lastLine(), end, endCh; | ||
- outer: for (var i = line; i <= lastLine; ++i) { | ||
- var text = cm.getLine(i), pos = i == line ? startCh : 0; | ||
- for (;;) { | ||
- var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); | ||
- if (nextOpen < 0) nextOpen = text.length; | ||
- if (nextClose < 0) nextClose = text.length; | ||
- pos = Math.min(nextOpen, nextClose); | ||
- if (pos == text.length) break; | ||
- if (pos == nextOpen) ++depth; | ||
- else if (!--depth) { end = i; endCh = pos; break outer; } | ||
- ++pos; | ||
- } | ||
- } | ||
- if (end == null || line == end && endCh == startCh) return; | ||
- return {from: CodeMirror.Pos(line, startCh), | ||
- to: CodeMirror.Pos(end, endCh)}; | ||
-}); | ||
- | ||
-}); |
145
public/js/lib/codemirror/addon/fold/foldcode.js
@@ -1,145 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- function doFold(cm, pos, options, force) { | ||
- if (options && options.call) { | ||
- var finder = options; | ||
- options = null; | ||
- } else { | ||
- var finder = getOption(cm, options, "rangeFinder"); | ||
- } | ||
- if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); | ||
- var minSize = getOption(cm, options, "minFoldSize"); | ||
- | ||
- function getRange(allowFolded) { | ||
- var range = finder(cm, pos); | ||
- if (!range || range.to.line - range.from.line < minSize) return null; | ||
- var marks = cm.findMarksAt(range.from); | ||
- for (var i = 0; i < marks.length; ++i) { | ||
- if (marks[i].__isFold && force !== "fold") { | ||
- if (!allowFolded) return null; | ||
- range.cleared = true; | ||
- marks[i].clear(); | ||
- } | ||
- } | ||
- return range; | ||
- } | ||
- | ||
- var range = getRange(true); | ||
- if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { | ||
- pos = CodeMirror.Pos(pos.line - 1, 0); | ||
- range = getRange(false); | ||
- } | ||
- if (!range || range.cleared || force === "unfold") return; | ||
- | ||
- var myWidget = makeWidget(cm, options); | ||
- CodeMirror.on(myWidget, "mousedown", function(e) { | ||
- myRange.clear(); | ||
- CodeMirror.e_preventDefault(e); | ||
- }); | ||
- var myRange = cm.markText(range.from, range.to, { | ||
- replacedWith: myWidget, | ||
- clearOnEnter: true, | ||
- __isFold: true | ||
- }); | ||
- myRange.on("clear", function(from, to) { | ||
- CodeMirror.signal(cm, "unfold", cm, from, to); | ||
- }); | ||
- CodeMirror.signal(cm, "fold", cm, range.from, range.to); | ||
- } | ||
- | ||
- function makeWidget(cm, options) { | ||
- var widget = getOption(cm, options, "widget"); | ||
- if (typeof widget == "string") { | ||
- var text = document.createTextNode(widget); | ||
- widget = document.createElement("span"); | ||
- widget.appendChild(text); | ||
- widget.className = "CodeMirror-foldmarker"; | ||
- } | ||
- return widget; | ||
- } | ||
- | ||
- // Clumsy backwards-compatible interface | ||
- CodeMirror.newFoldFunction = function(rangeFinder, widget) { | ||
- return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); }; | ||
- }; | ||
- | ||
- // New-style interface | ||
- CodeMirror.defineExtension("foldCode", function(pos, options, force) { | ||
- doFold(this, pos, options, force); | ||
- }); | ||
- | ||
- CodeMirror.defineExtension("isFolded", function(pos) { | ||
- var marks = this.findMarksAt(pos); | ||
- for (var i = 0; i < marks.length; ++i) | ||
- if (marks[i].__isFold) return true; | ||
- }); | ||
- | ||
- CodeMirror.commands.toggleFold = function(cm) { | ||
- cm.foldCode(cm.getCursor()); | ||
- }; | ||
- CodeMirror.commands.fold = function(cm) { | ||
- cm.foldCode(cm.getCursor(), null, "fold"); | ||
- }; | ||
- CodeMirror.commands.unfold = function(cm) { | ||
- cm.foldCode(cm.getCursor(), null, "unfold"); | ||
- }; | ||
- CodeMirror.commands.foldAll = function(cm) { | ||
- cm.operation(function() { | ||
- for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) | ||
- cm.foldCode(CodeMirror.Pos(i, 0), null, "fold"); | ||
- }); | ||
- }; | ||
- CodeMirror.commands.unfoldAll = function(cm) { | ||
- cm.operation(function() { | ||
- for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) | ||
- cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold"); | ||
- }); | ||
- }; | ||
- | ||
- CodeMirror.registerHelper("fold", "combine", function() { | ||
- var funcs = Array.prototype.slice.call(arguments, 0); | ||
- return function(cm, start) { | ||
- for (var i = 0; i < funcs.length; ++i) { | ||
- var found = funcs[i](cm, start); | ||
- if (found) return found; | ||
- } | ||
- }; | ||
- }); | ||
- | ||
- CodeMirror.registerHelper("fold", "auto", function(cm, start) { | ||
- var helpers = cm.getHelpers(start, "fold"); | ||
- for (var i = 0; i < helpers.length; i++) { | ||
- var cur = helpers[i](cm, start); | ||
- if (cur) return cur; | ||
- } | ||
- }); | ||
- | ||
- var defaultOptions = { | ||
- rangeFinder: CodeMirror.fold.auto, | ||
- widget: "\u2194", | ||
- minFoldSize: 0, | ||
- scanUp: false | ||
- }; | ||
- | ||
- CodeMirror.defineOption("foldOptions", null); | ||
- | ||
- function getOption(cm, options, name) { | ||
- if (options && options[name] !== undefined) | ||
- return options[name]; | ||
- var editorOptions = cm.options.foldOptions; | ||
- if (editorOptions && editorOptions[name] !== undefined) | ||
- return editorOptions[name]; | ||
- return defaultOptions[name]; | ||
- } | ||
-}); |
20
public/js/lib/codemirror/addon/fold/foldgutter.css
@@ -1,20 +0,0 @@ | ||
-.CodeMirror-foldmarker { | ||
- color: blue; | ||
- text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; | ||
- font-family: arial; | ||
- line-height: .3; | ||
- cursor: pointer; | ||
-} | ||
-.CodeMirror-foldgutter { | ||
- width: .7em; | ||
-} | ||
-.CodeMirror-foldgutter-open, | ||
-.CodeMirror-foldgutter-folded { | ||
- cursor: pointer; | ||
-} | ||
-.CodeMirror-foldgutter-open:after { | ||
- content: "\25BE"; | ||
-} | ||
-.CodeMirror-foldgutter-folded:after { | ||
- content: "\25B8"; | ||
-} |
134
public/js/lib/codemirror/addon/fold/foldgutter.js
@@ -1,134 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("./foldcode")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "./foldcode"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineOption("foldGutter", false, function(cm, val, old) { | ||
- if (old && old != CodeMirror.Init) { | ||
- cm.clearGutter(cm.state.foldGutter.options.gutter); | ||
- cm.state.foldGutter = null; | ||
- cm.off("gutterClick", onGutterClick); | ||
- cm.off("change", onChange); | ||
- cm.off("viewportChange", onViewportChange); | ||
- cm.off("fold", onFold); | ||
- cm.off("unfold", onFold); | ||
- cm.off("swapDoc", updateInViewport); | ||
- } | ||
- if (val) { | ||
- cm.state.foldGutter = new State(parseOptions(val)); | ||
- updateInViewport(cm); | ||
- cm.on("gutterClick", onGutterClick); | ||
- cm.on("change", onChange); | ||
- cm.on("viewportChange", onViewportChange); | ||
- cm.on("fold", onFold); | ||
- cm.on("unfold", onFold); | ||
- cm.on("swapDoc", updateInViewport); | ||
- } | ||
- }); | ||
- | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- function State(options) { | ||
- this.options = options; | ||
- this.from = this.to = 0; | ||
- } | ||
- | ||
- function parseOptions(opts) { | ||
- if (opts === true) opts = {}; | ||
- if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; | ||
- if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; | ||
- if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; | ||
- return opts; | ||
- } | ||
- | ||
- function isFolded(cm, line) { | ||
- var marks = cm.findMarksAt(Pos(line)); | ||
- for (var i = 0; i < marks.length; ++i) | ||
- if (marks[i].__isFold && marks[i].find().from.line == line) return true; | ||
- } | ||
- | ||
- function marker(spec) { | ||
- if (typeof spec == "string") { | ||
- var elt = document.createElement("div"); | ||
- elt.className = spec + " CodeMirror-guttermarker-subtle"; | ||
- return elt; | ||
- } else { | ||
- return spec.cloneNode(true); | ||
- } | ||
- } | ||
- | ||
- function updateFoldInfo(cm, from, to) { | ||
- var opts = cm.state.foldGutter.options, cur = from; | ||
- cm.eachLine(from, to, function(line) { | ||
- var mark = null; | ||
- if (isFolded(cm, cur)) { | ||
- mark = marker(opts.indicatorFolded); | ||
- } else { | ||
- var pos = Pos(cur, 0), func = opts.rangeFinder || CodeMirror.fold.auto; | ||
- var range = func && func(cm, pos); | ||
- if (range && range.from.line + 1 < range.to.line) | ||
- mark = marker(opts.indicatorOpen); | ||
- } | ||
- cm.setGutterMarker(line, opts.gutter, mark); | ||
- ++cur; | ||
- }); | ||
- } | ||
- | ||
- function updateInViewport(cm) { | ||
- var vp = cm.getViewport(), state = cm.state.foldGutter; | ||
- if (!state) return; | ||
- cm.operation(function() { | ||
- updateFoldInfo(cm, vp.from, vp.to); | ||
- }); | ||
- state.from = vp.from; state.to = vp.to; | ||
- } | ||
- | ||
- function onGutterClick(cm, line, gutter) { | ||
- var opts = cm.state.foldGutter.options; | ||
- if (gutter != opts.gutter) return; | ||
- cm.foldCode(Pos(line, 0), opts.rangeFinder); | ||
- } | ||
- | ||
- function onChange(cm) { | ||
- var state = cm.state.foldGutter, opts = cm.state.foldGutter.options; | ||
- state.from = state.to = 0; | ||
- clearTimeout(state.changeUpdate); | ||
- state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600); | ||
- } | ||
- | ||
- function onViewportChange(cm) { | ||
- var state = cm.state.foldGutter, opts = cm.state.foldGutter.options; | ||
- clearTimeout(state.changeUpdate); | ||
- state.changeUpdate = setTimeout(function() { | ||
- var vp = cm.getViewport(); | ||
- if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { | ||
- updateInViewport(cm); | ||
- } else { | ||
- cm.operation(function() { | ||
- if (vp.from < state.from) { | ||
- updateFoldInfo(cm, vp.from, state.from); | ||
- state.from = vp.from; | ||
- } | ||
- if (vp.to > state.to) { | ||
- updateFoldInfo(cm, state.to, vp.to); | ||
- state.to = vp.to; | ||
- } | ||
- }); | ||
- } | ||
- }, opts.updateViewportTimeSpan || 400); | ||
- } | ||
- | ||
- function onFold(cm, from) { | ||
- var state = cm.state.foldGutter, line = from.line; | ||
- if (line >= state.from && line < state.to) | ||
- updateFoldInfo(cm, line, line + 1); | ||
- } | ||
-}); |
44
public/js/lib/codemirror/addon/fold/indent-fold.js
@@ -1,44 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.registerHelper("fold", "indent", function(cm, start) { | ||
- var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line); | ||
- if (!/\S/.test(firstLine)) return; | ||
- var getIndent = function(line) { | ||
- return CodeMirror.countColumn(line, null, tabSize); | ||
- }; | ||
- var myIndent = getIndent(firstLine); | ||
- var lastLineInFold = null; | ||
- // Go through lines until we find a line that definitely doesn't belong in | ||
- // the block we're folding, or to the end. | ||
- for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { | ||
- var curLine = cm.getLine(i); | ||
- var curIndent = getIndent(curLine); | ||
- if (curIndent > myIndent) { | ||
- // Lines with a greater indent are considered part of the block. | ||
- lastLineInFold = i; | ||
- } else if (!/\S/.test(curLine)) { | ||
- // Empty lines might be breaks within the block we're trying to fold. | ||
- } else { | ||
- // A non-empty line at an indent equal to or less than ours marks the | ||
- // start of another block. | ||
- break; | ||
- } | ||
- } | ||
- if (lastLineInFold) return { | ||
- from: CodeMirror.Pos(start.line, firstLine.length), | ||
- to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) | ||
- }; | ||
-}); | ||
- | ||
-}); |
49
public/js/lib/codemirror/addon/fold/markdown-fold.js
@@ -1,49 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.registerHelper("fold", "markdown", function(cm, start) { | ||
- var maxDepth = 100; | ||
- | ||
- function isHeader(lineNo) { | ||
- var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0)); | ||
- return tokentype && /\bheader\b/.test(tokentype); | ||
- } | ||
- | ||
- function headerLevel(lineNo, line, nextLine) { | ||
- var match = line && line.match(/^#+/); | ||
- if (match && isHeader(lineNo)) return match[0].length; | ||
- match = nextLine && nextLine.match(/^[=\-]+\s*$/); | ||
- if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2; | ||
- return maxDepth; | ||
- } | ||
- | ||
- var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1); | ||
- var level = headerLevel(start.line, firstLine, nextLine); | ||
- if (level === maxDepth) return undefined; | ||
- | ||
- var lastLineNo = cm.lastLine(); | ||
- var end = start.line, nextNextLine = cm.getLine(end + 2); | ||
- while (end < lastLineNo) { | ||
- if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break; | ||
- ++end; | ||
- nextLine = nextNextLine; | ||
- nextNextLine = cm.getLine(end + 2); | ||
- } | ||
- | ||
- return { | ||
- from: CodeMirror.Pos(start.line, firstLine.length), | ||
- to: CodeMirror.Pos(end, cm.getLine(end).length) | ||
- }; | ||
-}); | ||
- | ||
-}); |
182
public/js/lib/codemirror/addon/fold/xml-fold.js
@@ -1,182 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var Pos = CodeMirror.Pos; | ||
- function cmp(a, b) { return a.line - b.line || a.ch - b.ch; } | ||
- | ||
- var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; | ||
- var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; | ||
- var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); | ||
- | ||
- function Iter(cm, line, ch, range) { | ||
- this.line = line; this.ch = ch; | ||
- this.cm = cm; this.text = cm.getLine(line); | ||
- this.min = range ? range.from : cm.firstLine(); | ||
- this.max = range ? range.to - 1 : cm.lastLine(); | ||
- } | ||
- | ||
- function tagAt(iter, ch) { | ||
- var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch)); | ||
- return type && /\btag\b/.test(type); | ||
- } | ||
- | ||
- function nextLine(iter) { | ||
- if (iter.line >= iter.max) return; | ||
- iter.ch = 0; | ||
- iter.text = iter.cm.getLine(++iter.line); | ||
- return true; | ||
- } | ||
- function prevLine(iter) { | ||
- if (iter.line <= iter.min) return; | ||
- iter.text = iter.cm.getLine(--iter.line); | ||
- iter.ch = iter.text.length; | ||
- return true; | ||
- } | ||
- | ||
- function toTagEnd(iter) { | ||
- for (;;) { | ||
- var gt = iter.text.indexOf(">", iter.ch); | ||
- if (gt == -1) { if (nextLine(iter)) continue; else return; } | ||
- if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; } | ||
- var lastSlash = iter.text.lastIndexOf("/", gt); | ||
- var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); | ||
- iter.ch = gt + 1; | ||
- return selfClose ? "selfClose" : "regular"; | ||
- } | ||
- } | ||
- function toTagStart(iter) { | ||
- for (;;) { | ||
- var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1; | ||
- if (lt == -1) { if (prevLine(iter)) continue; else return; } | ||
- if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; } | ||
- xmlTagStart.lastIndex = lt; | ||
- iter.ch = lt; | ||
- var match = xmlTagStart.exec(iter.text); | ||
- if (match && match.index == lt) return match; | ||
- } | ||
- } | ||
- | ||
- function toNextTag(iter) { | ||
- for (;;) { | ||
- xmlTagStart.lastIndex = iter.ch; | ||
- var found = xmlTagStart.exec(iter.text); | ||
- if (!found) { if (nextLine(iter)) continue; else return; } | ||
- if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; } | ||
- iter.ch = found.index + found[0].length; | ||
- return found; | ||
- } | ||
- } | ||
- function toPrevTag(iter) { | ||
- for (;;) { | ||
- var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1; | ||
- if (gt == -1) { if (prevLine(iter)) continue; else return; } | ||
- if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; } | ||
- var lastSlash = iter.text.lastIndexOf("/", gt); | ||
- var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); | ||
- iter.ch = gt + 1; | ||
- return selfClose ? "selfClose" : "regular"; | ||
- } | ||
- } | ||
- | ||
- function findMatchingClose(iter, tag) { | ||
- var stack = []; | ||
- for (;;) { | ||
- var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0); | ||
- if (!next || !(end = toTagEnd(iter))) return; | ||
- if (end == "selfClose") continue; | ||
- if (next[1]) { // closing tag | ||
- for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) { | ||
- stack.length = i; | ||
- break; | ||
- } | ||
- if (i < 0 && (!tag || tag == next[2])) return { | ||
- tag: next[2], | ||
- from: Pos(startLine, startCh), | ||
- to: Pos(iter.line, iter.ch) | ||
- }; | ||
- } else { // opening tag | ||
- stack.push(next[2]); | ||
- } | ||
- } | ||
- } | ||
- function findMatchingOpen(iter, tag) { | ||
- var stack = []; | ||
- for (;;) { | ||
- var prev = toPrevTag(iter); | ||
- if (!prev) return; | ||
- if (prev == "selfClose") { toTagStart(iter); continue; } | ||
- var endLine = iter.line, endCh = iter.ch; | ||
- var start = toTagStart(iter); | ||
- if (!start) return; | ||
- if (start[1]) { // closing tag | ||
- stack.push(start[2]); | ||
- } else { // opening tag | ||
- for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) { | ||
- stack.length = i; | ||
- break; | ||
- } | ||
- if (i < 0 && (!tag || tag == start[2])) return { | ||
- tag: start[2], | ||
- from: Pos(iter.line, iter.ch), | ||
- to: Pos(endLine, endCh) | ||
- }; | ||
- } | ||
- } | ||
- } | ||
- | ||
- CodeMirror.registerHelper("fold", "xml", function(cm, start) { | ||
- var iter = new Iter(cm, start.line, 0); | ||
- for (;;) { | ||
- var openTag = toNextTag(iter), end; | ||
- if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return; | ||
- if (!openTag[1] && end != "selfClose") { | ||
- var start = Pos(iter.line, iter.ch); | ||
- var close = findMatchingClose(iter, openTag[2]); | ||
- return close && {from: start, to: close.from}; | ||
- } | ||
- } | ||
- }); | ||
- CodeMirror.findMatchingTag = function(cm, pos, range) { | ||
- var iter = new Iter(cm, pos.line, pos.ch, range); | ||
- if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return; | ||
- var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch); | ||
- var start = end && toTagStart(iter); | ||
- if (!end || !start || cmp(iter, pos) > 0) return; | ||
- var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]}; | ||
- if (end == "selfClose") return {open: here, close: null, at: "open"}; | ||
- | ||
- if (start[1]) { // closing tag | ||
- return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"}; | ||
- } else { // opening tag | ||
- iter = new Iter(cm, to.line, to.ch, range); | ||
- return {open: here, close: findMatchingClose(iter, start[2]), at: "open"}; | ||
- } | ||
- }; | ||
- | ||
- CodeMirror.findEnclosingTag = function(cm, pos, range) { | ||
- var iter = new Iter(cm, pos.line, pos.ch, range); | ||
- for (;;) { | ||
- var open = findMatchingOpen(iter); | ||
- if (!open) break; | ||
- var forward = new Iter(cm, pos.line, pos.ch, range); | ||
- var close = findMatchingClose(forward, open.tag); | ||
- if (close) return {open: open, close: close}; | ||
- } | ||
- }; | ||
- | ||
- // Used by addon/edit/closetag.js | ||
- CodeMirror.scanForClosingTag = function(cm, pos, name, end) { | ||
- var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null); | ||
- return findMatchingClose(iter, name); | ||
- }; | ||
-}); |
41
public/js/lib/codemirror/addon/hint/anyword-hint.js
@@ -1,41 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var WORD = /[\w$]+/, RANGE = 500; | ||
- | ||
- CodeMirror.registerHelper("hint", "anyword", function(editor, options) { | ||
- var word = options && options.word || WORD; | ||
- var range = options && options.range || RANGE; | ||
- var cur = editor.getCursor(), curLine = editor.getLine(cur.line); | ||
- var end = cur.ch, start = end; | ||
- while (start && word.test(curLine.charAt(start - 1))) --start; | ||
- var curWord = start != end && curLine.slice(start, end); | ||
- | ||
- var list = [], seen = {}; | ||
- var re = new RegExp(word.source, "g"); | ||
- for (var dir = -1; dir <= 1; dir += 2) { | ||
- var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir; | ||
- for (; line != endLine; line += dir) { | ||
- var text = editor.getLine(line), m; | ||
- while (m = re.exec(text)) { | ||
- if (line == cur.line && m[0] === curWord) continue; | ||
- if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) { | ||
- seen[m[0]] = true; | ||
- list.push(m[0]); | ||
- } | ||
- } | ||
- } | ||
- } | ||
- return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)}; | ||
- }); | ||
-}); |
56
public/js/lib/codemirror/addon/hint/css-hint.js
@@ -1,56 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("../../mode/css/css")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "../../mode/css/css"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var pseudoClasses = {link: 1, visited: 1, active: 1, hover: 1, focus: 1, | ||
- "first-letter": 1, "first-line": 1, "first-child": 1, | ||
- before: 1, after: 1, lang: 1}; | ||
- | ||
- CodeMirror.registerHelper("hint", "css", function(cm) { | ||
- var cur = cm.getCursor(), token = cm.getTokenAt(cur); | ||
- var inner = CodeMirror.innerMode(cm.getMode(), token.state); | ||
- if (inner.mode.name != "css") return; | ||
- | ||
- var start = token.start, end = cur.ch, word = token.string.slice(0, end - start); | ||
- if (/[^\w$_-]/.test(word)) { | ||
- word = ""; start = end = cur.ch; | ||
- } | ||
- | ||
- var spec = CodeMirror.resolveMode("text/css"); | ||
- | ||
- var result = []; | ||
- function add(keywords) { | ||
- for (var name in keywords) | ||
- if (!word || name.lastIndexOf(word, 0) == 0) | ||
- result.push(name); | ||
- } | ||
- | ||
- var st = inner.state.state; | ||
- if (st == "pseudo" || token.type == "variable-3") { | ||
- add(pseudoClasses); | ||
- } else if (st == "block" || st == "maybeprop") { | ||
- add(spec.propertyKeywords); | ||
- } else if (st == "prop" || st == "parens" || st == "at" || st == "params") { | ||
- add(spec.valueKeywords); | ||
- add(spec.colorKeywords); | ||
- } else if (st == "media" || st == "media_parens") { | ||
- add(spec.mediaTypes); | ||
- add(spec.mediaFeatures); | ||
- } | ||
- | ||
- if (result.length) return { | ||
- list: result, | ||
- from: CodeMirror.Pos(cur.line, start), | ||
- to: CodeMirror.Pos(cur.line, end) | ||
- }; | ||
- }); | ||
-}); |
348
public/js/lib/codemirror/addon/hint/html-hint.js
@@ -1,348 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("./xml-hint")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "./xml-hint"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "); | ||
- var targets = ["_blank", "_self", "_top", "_parent"]; | ||
- var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; | ||
- var methods = ["get", "post", "put", "delete"]; | ||
- var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; | ||
- var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech", | ||
- "3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait", | ||
- "orientation:landscape", "device-height: [X]", "device-width: [X]"]; | ||
- var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags | ||
- | ||
- var data = { | ||
- a: { | ||
- attrs: { | ||
- href: null, ping: null, type: null, | ||
- media: media, | ||
- target: targets, | ||
- hreflang: langs | ||
- } | ||
- }, | ||
- abbr: s, | ||
- acronym: s, | ||
- address: s, | ||
- applet: s, | ||
- area: { | ||
- attrs: { | ||
- alt: null, coords: null, href: null, target: null, ping: null, | ||
- media: media, hreflang: langs, type: null, | ||
- shape: ["default", "rect", "circle", "poly"] | ||
- } | ||
- }, | ||
- article: s, | ||
- aside: s, | ||
- audio: { | ||
- attrs: { | ||
- src: null, mediagroup: null, | ||
- crossorigin: ["anonymous", "use-credentials"], | ||
- preload: ["none", "metadata", "auto"], | ||
- autoplay: ["", "autoplay"], | ||
- loop: ["", "loop"], | ||
- controls: ["", "controls"] | ||
- } | ||
- }, | ||
- b: s, | ||
- base: { attrs: { href: null, target: targets } }, | ||
- basefont: s, | ||
- bdi: s, | ||
- bdo: s, | ||
- big: s, | ||
- blockquote: { attrs: { cite: null } }, | ||
- body: s, | ||
- br: s, | ||
- button: { | ||
- attrs: { | ||
- form: null, formaction: null, name: null, value: null, | ||
- autofocus: ["", "autofocus"], | ||
- disabled: ["", "autofocus"], | ||
- formenctype: encs, | ||
- formmethod: methods, | ||
- formnovalidate: ["", "novalidate"], | ||
- formtarget: targets, | ||
- type: ["submit", "reset", "button"] | ||
- } | ||
- }, | ||
- canvas: { attrs: { width: null, height: null } }, | ||
- caption: s, | ||
- center: s, | ||
- cite: s, | ||
- code: s, | ||
- col: { attrs: { span: null } }, | ||
- colgroup: { attrs: { span: null } }, | ||
- command: { | ||
- attrs: { | ||
- type: ["command", "checkbox", "radio"], | ||
- label: null, icon: null, radiogroup: null, command: null, title: null, | ||
- disabled: ["", "disabled"], | ||
- checked: ["", "checked"] | ||
- } | ||
- }, | ||
- data: { attrs: { value: null } }, | ||
- datagrid: { attrs: { disabled: ["", "disabled"], multiple: ["", "multiple"] } }, | ||
- datalist: { attrs: { data: null } }, | ||
- dd: s, | ||
- del: { attrs: { cite: null, datetime: null } }, | ||
- details: { attrs: { open: ["", "open"] } }, | ||
- dfn: s, | ||
- dir: s, | ||
- div: s, | ||
- dl: s, | ||
- dt: s, | ||
- em: s, | ||
- embed: { attrs: { src: null, type: null, width: null, height: null } }, | ||
- eventsource: { attrs: { src: null } }, | ||
- fieldset: { attrs: { disabled: ["", "disabled"], form: null, name: null } }, | ||
- figcaption: s, | ||
- figure: s, | ||
- font: s, | ||
- footer: s, | ||
- form: { | ||
- attrs: { | ||
- action: null, name: null, | ||
- "accept-charset": charsets, | ||
- autocomplete: ["on", "off"], | ||
- enctype: encs, | ||
- method: methods, | ||
- novalidate: ["", "novalidate"], | ||
- target: targets | ||
- } | ||
- }, | ||
- frame: s, | ||
- frameset: s, | ||
- h1: s, h2: s, h3: s, h4: s, h5: s, h6: s, | ||
- head: { | ||
- attrs: {}, | ||
- children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] | ||
- }, | ||
- header: s, | ||
- hgroup: s, | ||
- hr: s, | ||
- html: { | ||
- attrs: { manifest: null }, | ||
- children: ["head", "body"] | ||
- }, | ||
- i: s, | ||
- iframe: { | ||
- attrs: { | ||
- src: null, srcdoc: null, name: null, width: null, height: null, | ||
- sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], | ||
- seamless: ["", "seamless"] | ||
- } | ||
- }, | ||
- img: { | ||
- attrs: { | ||
- alt: null, src: null, ismap: null, usemap: null, width: null, height: null, | ||
- crossorigin: ["anonymous", "use-credentials"] | ||
- } | ||
- }, | ||
- input: { | ||
- attrs: { | ||
- alt: null, dirname: null, form: null, formaction: null, | ||
- height: null, list: null, max: null, maxlength: null, min: null, | ||
- name: null, pattern: null, placeholder: null, size: null, src: null, | ||
- step: null, value: null, width: null, | ||
- accept: ["audio/*", "video/*", "image/*"], | ||
- autocomplete: ["on", "off"], | ||
- autofocus: ["", "autofocus"], | ||
- checked: ["", "checked"], | ||
- disabled: ["", "disabled"], | ||
- formenctype: encs, | ||
- formmethod: methods, | ||
- formnovalidate: ["", "novalidate"], | ||
- formtarget: targets, | ||
- multiple: ["", "multiple"], | ||
- readonly: ["", "readonly"], | ||
- required: ["", "required"], | ||
- type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", | ||
- "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", | ||
- "file", "submit", "image", "reset", "button"] | ||
- } | ||
- }, | ||
- ins: { attrs: { cite: null, datetime: null } }, | ||
- kbd: s, | ||
- keygen: { | ||
- attrs: { | ||
- challenge: null, form: null, name: null, | ||
- autofocus: ["", "autofocus"], | ||
- disabled: ["", "disabled"], | ||
- keytype: ["RSA"] | ||
- } | ||
- }, | ||
- label: { attrs: { "for": null, form: null } }, | ||
- legend: s, | ||
- li: { attrs: { value: null } }, | ||
- link: { | ||
- attrs: { | ||
- href: null, type: null, | ||
- hreflang: langs, | ||
- media: media, | ||
- sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] | ||
- } | ||
- }, | ||
- map: { attrs: { name: null } }, | ||
- mark: s, | ||
- menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } }, | ||
- meta: { | ||
- attrs: { | ||
- content: null, | ||
- charset: charsets, | ||
- name: ["viewport", "application-name", "author", "description", "generator", "keywords"], | ||
- "http-equiv": ["content-language", "content-type", "default-style", "refresh"] | ||
- } | ||
- }, | ||
- meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } }, | ||
- nav: s, | ||
- noframes: s, | ||
- noscript: s, | ||
- object: { | ||
- attrs: { | ||
- data: null, type: null, name: null, usemap: null, form: null, width: null, height: null, | ||
- typemustmatch: ["", "typemustmatch"] | ||
- } | ||
- }, | ||
- ol: { attrs: { reversed: ["", "reversed"], start: null, type: ["1", "a", "A", "i", "I"] } }, | ||
- optgroup: { attrs: { disabled: ["", "disabled"], label: null } }, | ||
- option: { attrs: { disabled: ["", "disabled"], label: null, selected: ["", "selected"], value: null } }, | ||
- output: { attrs: { "for": null, form: null, name: null } }, | ||
- p: s, | ||
- param: { attrs: { name: null, value: null } }, | ||
- pre: s, | ||
- progress: { attrs: { value: null, max: null } }, | ||
- q: { attrs: { cite: null } }, | ||
- rp: s, | ||
- rt: s, | ||
- ruby: s, | ||
- s: s, | ||
- samp: s, | ||
- script: { | ||
- attrs: { | ||
- type: ["text/javascript"], | ||
- src: null, | ||
- async: ["", "async"], | ||
- defer: ["", "defer"], | ||
- charset: charsets | ||
- } | ||
- }, | ||
- section: s, | ||
- select: { | ||
- attrs: { | ||
- form: null, name: null, size: null, | ||
- autofocus: ["", "autofocus"], | ||
- disabled: ["", "disabled"], | ||
- multiple: ["", "multiple"] | ||
- } | ||
- }, | ||
- small: s, | ||
- source: { attrs: { src: null, type: null, media: null } }, | ||
- span: s, | ||
- strike: s, | ||
- strong: s, | ||
- style: { | ||
- attrs: { | ||
- type: ["text/css"], | ||
- media: media, | ||
- scoped: null | ||
- } | ||
- }, | ||
- sub: s, | ||
- summary: s, | ||
- sup: s, | ||
- table: s, | ||
- tbody: s, | ||
- td: { attrs: { colspan: null, rowspan: null, headers: null } }, | ||
- textarea: { | ||
- attrs: { | ||
- dirname: null, form: null, maxlength: null, name: null, placeholder: null, | ||
- rows: null, cols: null, | ||
- autofocus: ["", "autofocus"], | ||
- disabled: ["", "disabled"], | ||
- readonly: ["", "readonly"], | ||
- required: ["", "required"], | ||
- wrap: ["soft", "hard"] | ||
- } | ||
- }, | ||
- tfoot: s, | ||
- th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } }, | ||
- thead: s, | ||
- time: { attrs: { datetime: null } }, | ||
- title: s, | ||
- tr: s, | ||
- track: { | ||
- attrs: { | ||
- src: null, label: null, "default": null, | ||
- kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], | ||
- srclang: langs | ||
- } | ||
- }, | ||
- tt: s, | ||
- u: s, | ||
- ul: s, | ||
- "var": s, | ||
- video: { | ||
- attrs: { | ||
- src: null, poster: null, width: null, height: null, | ||
- crossorigin: ["anonymous", "use-credentials"], | ||
- preload: ["auto", "metadata", "none"], | ||
- autoplay: ["", "autoplay"], | ||
- mediagroup: ["movie"], | ||
- muted: ["", "muted"], | ||
- controls: ["", "controls"] | ||
- } | ||
- }, | ||
- wbr: s | ||
- }; | ||
- | ||
- var globalAttrs = { | ||
- accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], | ||
- "class": null, | ||
- contenteditable: ["true", "false"], | ||
- contextmenu: null, | ||
- dir: ["ltr", "rtl", "auto"], | ||
- draggable: ["true", "false", "auto"], | ||
- dropzone: ["copy", "move", "link", "string:", "file:"], | ||
- hidden: ["hidden"], | ||
- id: null, | ||
- inert: ["inert"], | ||
- itemid: null, | ||
- itemprop: null, | ||
- itemref: null, | ||
- itemscope: ["itemscope"], | ||
- itemtype: null, | ||
- lang: ["en", "es"], | ||
- spellcheck: ["true", "false"], | ||
- style: null, | ||
- tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], | ||
- title: null, | ||
- translate: ["yes", "no"], | ||
- onclick: null, | ||
- rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"] | ||
- }; | ||
- function populate(obj) { | ||
- for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr)) | ||
- obj.attrs[attr] = globalAttrs[attr]; | ||
- } | ||
- | ||
- populate(s); | ||
- for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s) | ||
- populate(data[tag]); | ||
- | ||
- CodeMirror.htmlSchema = data; | ||
- function htmlHint(cm, options) { | ||
- var local = {schemaInfo: data}; | ||
- if (options) for (var opt in options) local[opt] = options[opt]; | ||
- return CodeMirror.hint.xml(cm, local); | ||
- } | ||
- CodeMirror.registerHelper("hint", "html", htmlHint); | ||
-}); |
146
public/js/lib/codemirror/addon/hint/javascript-hint.js
@@ -1,146 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- function forEach(arr, f) { | ||
- for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); | ||
- } | ||
- | ||
- function arrayContains(arr, item) { | ||
- if (!Array.prototype.indexOf) { | ||
- var i = arr.length; | ||
- while (i--) { | ||
- if (arr[i] === item) { | ||
- return true; | ||
- } | ||
- } | ||
- return false; | ||
- } | ||
- return arr.indexOf(item) != -1; | ||
- } | ||
- | ||
- function scriptHint(editor, keywords, getToken, options) { | ||
- // Find the token at the cursor | ||
- var cur = editor.getCursor(), token = getToken(editor, cur); | ||
- if (/\b(?:string|comment)\b/.test(token.type)) return; | ||
- token.state = CodeMirror.innerMode(editor.getMode(), token.state).state; | ||
- | ||
- // If it's not a 'word-style' token, ignore the token. | ||
- if (!/^[\w$_]*$/.test(token.string)) { | ||
- token = {start: cur.ch, end: cur.ch, string: "", state: token.state, | ||
- type: token.string == "." ? "property" : null}; | ||
- } else if (token.end > cur.ch) { | ||
- token.end = cur.ch; | ||
- token.string = token.string.slice(0, cur.ch - token.start); | ||
- } | ||
- | ||
- var tprop = token; | ||
- // If it is a property, find out what it is a property of. | ||
- while (tprop.type == "property") { | ||
- tprop = getToken(editor, Pos(cur.line, tprop.start)); | ||
- if (tprop.string != ".") return; | ||
- tprop = getToken(editor, Pos(cur.line, tprop.start)); | ||
- if (!context) var context = []; | ||
- context.push(tprop); | ||
- } | ||
- return {list: getCompletions(token, context, keywords, options), | ||
- from: Pos(cur.line, token.start), | ||
- to: Pos(cur.line, token.end)}; | ||
- } | ||
- | ||
- function javascriptHint(editor, options) { | ||
- return scriptHint(editor, javascriptKeywords, | ||
- function (e, cur) {return e.getTokenAt(cur);}, | ||
- options); | ||
- }; | ||
- CodeMirror.registerHelper("hint", "javascript", javascriptHint); | ||
- | ||
- function getCoffeeScriptToken(editor, cur) { | ||
- // This getToken, it is for coffeescript, imitates the behavior of | ||
- // getTokenAt method in javascript.js, that is, returning "property" | ||
- // type and treat "." as indepenent token. | ||
- var token = editor.getTokenAt(cur); | ||
- if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { | ||
- token.end = token.start; | ||
- token.string = '.'; | ||
- token.type = "property"; | ||
- } | ||
- else if (/^\.[\w$_]*$/.test(token.string)) { | ||
- token.type = "property"; | ||
- token.start++; | ||
- token.string = token.string.replace(/\./, ''); | ||
- } | ||
- return token; | ||
- } | ||
- | ||
- function coffeescriptHint(editor, options) { | ||
- return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); | ||
- } | ||
- CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); | ||
- | ||
- var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + | ||
- "toUpperCase toLowerCase split concat match replace search").split(" "); | ||
- var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + | ||
- "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); | ||
- var funcProps = "prototype apply call bind".split(" "); | ||
- var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + | ||
- "if in instanceof new null return switch throw true try typeof var void while with").split(" "); | ||
- var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + | ||
- "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); | ||
- | ||
- function getCompletions(token, context, keywords, options) { | ||
- var found = [], start = token.string, global = options && options.globalScope || window; | ||
- function maybeAdd(str) { | ||
- if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str); | ||
- } | ||
- function gatherCompletions(obj) { | ||
- if (typeof obj == "string") forEach(stringProps, maybeAdd); | ||
- else if (obj instanceof Array) forEach(arrayProps, maybeAdd); | ||
- else if (obj instanceof Function) forEach(funcProps, maybeAdd); | ||
- for (var name in obj) maybeAdd(name); | ||
- } | ||
- | ||
- if (context && context.length) { | ||
- // If this is a property, see if it belongs to some object we can | ||
- // find in the current environment. | ||
- var obj = context.pop(), base; | ||
- if (obj.type && obj.type.indexOf("variable") === 0) { | ||
- if (options && options.additionalContext) | ||
- base = options.additionalContext[obj.string]; | ||
- if (!options || options.useGlobalScope !== false) | ||
- base = base || global[obj.string]; | ||
- } else if (obj.type == "string") { | ||
- base = ""; | ||
- } else if (obj.type == "atom") { | ||
- base = 1; | ||
- } else if (obj.type == "function") { | ||
- if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && | ||
- (typeof global.jQuery == 'function')) | ||
- base = global.jQuery(); | ||
- else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function')) | ||
- base = global._(); | ||
- } | ||
- while (base != null && context.length) | ||
- base = base[context.pop().string]; | ||
- if (base != null) gatherCompletions(base); | ||
- } else { | ||
- // If not, just look in the global object and any local scope | ||
- // (reading into JS mode internals to get at the local and global variables) | ||
- for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); | ||
- for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name); | ||
- if (!options || options.useGlobalScope !== false) | ||
- gatherCompletions(global); | ||
- forEach(keywords, maybeAdd); | ||
- } | ||
- return found; | ||
- } | ||
-}); |
38
public/js/lib/codemirror/addon/hint/show-hint.css
@@ -1,38 +0,0 @@ | ||
-.CodeMirror-hints { | ||
- position: absolute; | ||
- z-index: 10; | ||
- overflow: hidden; | ||
- list-style: none; | ||
- | ||
- margin: 0; | ||
- padding: 2px; | ||
- | ||
- -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); | ||
- -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); | ||
- box-shadow: 2px 3px 5px rgba(0,0,0,.2); | ||
- border-radius: 3px; | ||
- border: 1px solid silver; | ||
- | ||
- background: white; | ||
- font-size: 90%; | ||
- font-family: monospace; | ||
- | ||
- max-height: 20em; | ||
- overflow-y: auto; | ||
-} | ||
- | ||
-.CodeMirror-hint { | ||
- margin: 0; | ||
- padding: 0 4px; | ||
- border-radius: 2px; | ||
- max-width: 19em; | ||
- overflow: hidden; | ||
- white-space: pre; | ||
- color: black; | ||
- cursor: pointer; | ||
-} | ||
- | ||
-li.CodeMirror-hint-active { | ||
- background: #08f; | ||
- color: white; | ||
-} |
389
public/js/lib/codemirror/addon/hint/show-hint.js
@@ -1,389 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var HINT_ELEMENT_CLASS = "CodeMirror-hint"; | ||
- var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; | ||
- | ||
- // This is the old interface, kept around for now to stay | ||
- // backwards-compatible. | ||
- CodeMirror.showHint = function(cm, getHints, options) { | ||
- if (!getHints) return cm.showHint(options); | ||
- if (options && options.async) getHints.async = true; | ||
- var newOpts = {hint: getHints}; | ||
- if (options) for (var prop in options) newOpts[prop] = options[prop]; | ||
- return cm.showHint(newOpts); | ||
- }; | ||
- | ||
- CodeMirror.defineExtension("showHint", function(options) { | ||
- // We want a single cursor position. | ||
- if (this.listSelections().length > 1 || this.somethingSelected()) return; | ||
- | ||
- if (this.state.completionActive) this.state.completionActive.close(); | ||
- var completion = this.state.completionActive = new Completion(this, options); | ||
- var getHints = completion.options.hint; | ||
- if (!getHints) return; | ||
- | ||
- CodeMirror.signal(this, "startCompletion", this); | ||
- if (getHints.async) | ||
- getHints(this, function(hints) { completion.showHints(hints); }, completion.options); | ||
- else | ||
- return completion.showHints(getHints(this, completion.options)); | ||
- }); | ||
- | ||
- function Completion(cm, options) { | ||
- this.cm = cm; | ||
- this.options = this.buildOptions(options); | ||
- this.widget = this.onClose = null; | ||
- } | ||
- | ||
- Completion.prototype = { | ||
- close: function() { | ||
- if (!this.active()) return; | ||
- this.cm.state.completionActive = null; | ||
- | ||
- if (this.widget) this.widget.close(); | ||
- if (this.onClose) this.onClose(); | ||
- CodeMirror.signal(this.cm, "endCompletion", this.cm); | ||
- }, | ||
- | ||
- active: function() { | ||
- return this.cm.state.completionActive == this; | ||
- }, | ||
- | ||
- pick: function(data, i) { | ||
- var completion = data.list[i]; | ||
- if (completion.hint) completion.hint(this.cm, data, completion); | ||
- else this.cm.replaceRange(getText(completion), completion.from || data.from, | ||
- completion.to || data.to, "complete"); | ||
- CodeMirror.signal(data, "pick", completion); | ||
- this.close(); | ||
- }, | ||
- | ||
- showHints: function(data) { | ||
- if (!data || !data.list.length || !this.active()) return this.close(); | ||
- | ||
- if (this.options.completeSingle && data.list.length == 1) | ||
- this.pick(data, 0); | ||
- else | ||
- this.showWidget(data); | ||
- }, | ||
- | ||
- showWidget: function(data) { | ||
- this.widget = new Widget(this, data); | ||
- CodeMirror.signal(data, "shown"); | ||
- | ||
- var debounce = 0, completion = this, finished; | ||
- var closeOn = this.options.closeCharacters; | ||
- var startPos = this.cm.getCursor(), startLen = this.cm.getLine(startPos.line).length; | ||
- | ||
- var requestAnimationFrame = window.requestAnimationFrame || function(fn) { | ||
- return setTimeout(fn, 1000/60); | ||
- }; | ||
- var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; | ||
- | ||
- function done() { | ||
- if (finished) return; | ||
- finished = true; | ||
- completion.close(); | ||
- completion.cm.off("cursorActivity", activity); | ||
- if (data) CodeMirror.signal(data, "close"); | ||
- } | ||
- | ||
- function update() { | ||
- if (finished) return; | ||
- CodeMirror.signal(data, "update"); | ||
- var getHints = completion.options.hint; | ||
- if (getHints.async) | ||
- getHints(completion.cm, finishUpdate, completion.options); | ||
- else | ||
- finishUpdate(getHints(completion.cm, completion.options)); | ||
- } | ||
- function finishUpdate(data_) { | ||
- data = data_; | ||
- if (finished) return; | ||
- if (!data || !data.list.length) return done(); | ||
- if (completion.widget) completion.widget.close(); | ||
- completion.widget = new Widget(completion, data); | ||
- } | ||
- | ||
- function clearDebounce() { | ||
- if (debounce) { | ||
- cancelAnimationFrame(debounce); | ||
- debounce = 0; | ||
- } | ||
- } | ||
- | ||
- function activity() { | ||
- clearDebounce(); | ||
- var pos = completion.cm.getCursor(), line = completion.cm.getLine(pos.line); | ||
- if (pos.line != startPos.line || line.length - pos.ch != startLen - startPos.ch || | ||
- pos.ch < startPos.ch || completion.cm.somethingSelected() || | ||
- (pos.ch && closeOn.test(line.charAt(pos.ch - 1)))) { | ||
- completion.close(); | ||
- } else { | ||
- debounce = requestAnimationFrame(update); | ||
- if (completion.widget) completion.widget.close(); | ||
- } | ||
- } | ||
- this.cm.on("cursorActivity", activity); | ||
- this.onClose = done; | ||
- }, | ||
- | ||
- buildOptions: function(options) { | ||
- var editor = this.cm.options.hintOptions; | ||
- var out = {}; | ||
- for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; | ||
- if (editor) for (var prop in editor) | ||
- if (editor[prop] !== undefined) out[prop] = editor[prop]; | ||
- if (options) for (var prop in options) | ||
- if (options[prop] !== undefined) out[prop] = options[prop]; | ||
- return out; | ||
- } | ||
- }; | ||
- | ||
- function getText(completion) { | ||
- if (typeof completion == "string") return completion; | ||
- else return completion.text; | ||
- } | ||
- | ||
- function buildKeyMap(completion, handle) { | ||
- var baseMap = { | ||
- Up: function() {handle.moveFocus(-1);}, | ||
- Down: function() {handle.moveFocus(1);}, | ||
- PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);}, | ||
- PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);}, | ||
- Home: function() {handle.setFocus(0);}, | ||
- End: function() {handle.setFocus(handle.length - 1);}, | ||
- Enter: handle.pick, | ||
- Tab: handle.pick, | ||
- Esc: handle.close | ||
- }; | ||
- var custom = completion.options.customKeys; | ||
- var ourMap = custom ? {} : baseMap; | ||
- function addBinding(key, val) { | ||
- var bound; | ||
- if (typeof val != "string") | ||
- bound = function(cm) { return val(cm, handle); }; | ||
- // This mechanism is deprecated | ||
- else if (baseMap.hasOwnProperty(val)) | ||
- bound = baseMap[val]; | ||
- else | ||
- bound = val; | ||
- ourMap[key] = bound; | ||
- } | ||
- if (custom) | ||
- for (var key in custom) if (custom.hasOwnProperty(key)) | ||
- addBinding(key, custom[key]); | ||
- var extra = completion.options.extraKeys; | ||
- if (extra) | ||
- for (var key in extra) if (extra.hasOwnProperty(key)) | ||
- addBinding(key, extra[key]); | ||
- return ourMap; | ||
- } | ||
- | ||
- function getHintElement(hintsElement, el) { | ||
- while (el && el != hintsElement) { | ||
- if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; | ||
- el = el.parentNode; | ||
- } | ||
- } | ||
- | ||
- function Widget(completion, data) { | ||
- this.completion = completion; | ||
- this.data = data; | ||
- var widget = this, cm = completion.cm; | ||
- | ||
- var hints = this.hints = document.createElement("ul"); | ||
- hints.className = "CodeMirror-hints"; | ||
- this.selectedHint = data.selectedHint || 0; | ||
- | ||
- var completions = data.list; | ||
- for (var i = 0; i < completions.length; ++i) { | ||
- var elt = hints.appendChild(document.createElement("li")), cur = completions[i]; | ||
- var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); | ||
- if (cur.className != null) className = cur.className + " " + className; | ||
- elt.className = className; | ||
- if (cur.render) cur.render(elt, data, cur); | ||
- else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); | ||
- elt.hintId = i; | ||
- } | ||
- | ||
- var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); | ||
- var left = pos.left, top = pos.bottom, below = true; | ||
- hints.style.left = left + "px"; | ||
- hints.style.top = top + "px"; | ||
- // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. | ||
- var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); | ||
- var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); | ||
- (completion.options.container || document.body).appendChild(hints); | ||
- var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH; | ||
- if (overlapY > 0) { | ||
- var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); | ||
- if (curTop - height > 0) { // Fits above cursor | ||
- hints.style.top = (top = pos.top - height) + "px"; | ||
- below = false; | ||
- } else if (height > winH) { | ||
- hints.style.height = (winH - 5) + "px"; | ||
- hints.style.top = (top = pos.bottom - box.top) + "px"; | ||
- var cursor = cm.getCursor(); | ||
- if (data.from.ch != cursor.ch) { | ||
- pos = cm.cursorCoords(cursor); | ||
- hints.style.left = (left = pos.left) + "px"; | ||
- box = hints.getBoundingClientRect(); | ||
- } | ||
- } | ||
- } | ||
- var overlapX = box.right - winW; | ||
- if (overlapX > 0) { | ||
- if (box.right - box.left > winW) { | ||
- hints.style.width = (winW - 5) + "px"; | ||
- overlapX -= (box.right - box.left) - winW; | ||
- } | ||
- hints.style.left = (left = pos.left - overlapX) + "px"; | ||
- } | ||
- | ||
- cm.addKeyMap(this.keyMap = buildKeyMap(completion, { | ||
- moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); }, | ||
- setFocus: function(n) { widget.changeActive(n); }, | ||
- menuSize: function() { return widget.screenAmount(); }, | ||
- length: completions.length, | ||
- close: function() { completion.close(); }, | ||
- pick: function() { widget.pick(); }, | ||
- data: data | ||
- })); | ||
- | ||
- if (completion.options.closeOnUnfocus) { | ||
- var closingOnBlur; | ||
- cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); }); | ||
- cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); }); | ||
- } | ||
- | ||
- var startScroll = cm.getScrollInfo(); | ||
- cm.on("scroll", this.onScroll = function() { | ||
- var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); | ||
- var newTop = top + startScroll.top - curScroll.top; | ||
- var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); | ||
- if (!below) point += hints.offsetHeight; | ||
- if (point <= editor.top || point >= editor.bottom) return completion.close(); | ||
- hints.style.top = newTop + "px"; | ||
- hints.style.left = (left + startScroll.left - curScroll.left) + "px"; | ||
- }); | ||
- | ||
- CodeMirror.on(hints, "dblclick", function(e) { | ||
- var t = getHintElement(hints, e.target || e.srcElement); | ||
- if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();} | ||
- }); | ||
- | ||
- CodeMirror.on(hints, "click", function(e) { | ||
- var t = getHintElement(hints, e.target || e.srcElement); | ||
- if (t && t.hintId != null) { | ||
- widget.changeActive(t.hintId); | ||
- if (completion.options.completeOnSingleClick) widget.pick(); | ||
- } | ||
- }); | ||
- | ||
- CodeMirror.on(hints, "mousedown", function() { | ||
- setTimeout(function(){cm.focus();}, 20); | ||
- }); | ||
- | ||
- CodeMirror.signal(data, "select", completions[0], hints.firstChild); | ||
- return true; | ||
- } | ||
- | ||
- Widget.prototype = { | ||
- close: function() { | ||
- if (this.completion.widget != this) return; | ||
- this.completion.widget = null; | ||
- this.hints.parentNode.removeChild(this.hints); | ||
- this.completion.cm.removeKeyMap(this.keyMap); | ||
- | ||
- var cm = this.completion.cm; | ||
- if (this.completion.options.closeOnUnfocus) { | ||
- cm.off("blur", this.onBlur); | ||
- cm.off("focus", this.onFocus); | ||
- } | ||
- cm.off("scroll", this.onScroll); | ||
- }, | ||
- | ||
- pick: function() { | ||
- this.completion.pick(this.data, this.selectedHint); | ||
- }, | ||
- | ||
- changeActive: function(i, avoidWrap) { | ||
- if (i >= this.data.list.length) | ||
- i = avoidWrap ? this.data.list.length - 1 : 0; | ||
- else if (i < 0) | ||
- i = avoidWrap ? 0 : this.data.list.length - 1; | ||
- if (this.selectedHint == i) return; | ||
- var node = this.hints.childNodes[this.selectedHint]; | ||
- node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); | ||
- node = this.hints.childNodes[this.selectedHint = i]; | ||
- node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; | ||
- if (node.offsetTop < this.hints.scrollTop) | ||
- this.hints.scrollTop = node.offsetTop - 3; | ||
- else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) | ||
- this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3; | ||
- CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); | ||
- }, | ||
- | ||
- screenAmount: function() { | ||
- return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; | ||
- } | ||
- }; | ||
- | ||
- CodeMirror.registerHelper("hint", "auto", function(cm, options) { | ||
- var helpers = cm.getHelpers(cm.getCursor(), "hint"), words; | ||
- if (helpers.length) { | ||
- for (var i = 0; i < helpers.length; i++) { | ||
- var cur = helpers[i](cm, options); | ||
- if (cur && cur.list.length) return cur; | ||
- } | ||
- } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { | ||
- if (words) return CodeMirror.hint.fromList(cm, {words: words}); | ||
- } else if (CodeMirror.hint.anyword) { | ||
- return CodeMirror.hint.anyword(cm, options); | ||
- } | ||
- }); | ||
- | ||
- CodeMirror.registerHelper("hint", "fromList", function(cm, options) { | ||
- var cur = cm.getCursor(), token = cm.getTokenAt(cur); | ||
- var found = []; | ||
- for (var i = 0; i < options.words.length; i++) { | ||
- var word = options.words[i]; | ||
- if (word.slice(0, token.string.length) == token.string) | ||
- found.push(word); | ||
- } | ||
- | ||
- if (found.length) return { | ||
- list: found, | ||
- from: CodeMirror.Pos(cur.line, token.start), | ||
- to: CodeMirror.Pos(cur.line, token.end) | ||
- }; | ||
- }); | ||
- | ||
- CodeMirror.commands.autocomplete = CodeMirror.showHint; | ||
- | ||
- var defaultOptions = { | ||
- hint: CodeMirror.hint.auto, | ||
- completeSingle: true, | ||
- alignWithWord: true, | ||
- closeCharacters: /[\s()\[\]{};:>,]/, | ||
- closeOnUnfocus: true, | ||
- completeOnSingleClick: false, | ||
- container: null, | ||
- customKeys: null, | ||
- extraKeys: null | ||
- }; | ||
- | ||
- CodeMirror.defineOption("hintOptions", null); | ||
-}); |
197
public/js/lib/codemirror/addon/hint/sql-hint.js
@@ -1,197 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("../../mode/sql/sql")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "../../mode/sql/sql"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var tables; | ||
- var defaultTable; | ||
- var keywords; | ||
- var CONS = { | ||
- QUERY_DIV: ";", | ||
- ALIAS_KEYWORD: "AS" | ||
- }; | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- function getKeywords(editor) { | ||
- var mode = editor.doc.modeOption; | ||
- if (mode === "sql") mode = "text/x-sql"; | ||
- return CodeMirror.resolveMode(mode).keywords; | ||
- } | ||
- | ||
- function match(string, word) { | ||
- var len = string.length; | ||
- var sub = word.substr(0, len); | ||
- return string.toUpperCase() === sub.toUpperCase(); | ||
- } | ||
- | ||
- function addMatches(result, search, wordlist, formatter) { | ||
- for (var word in wordlist) { | ||
- if (!wordlist.hasOwnProperty(word)) continue; | ||
- if (Array.isArray(wordlist)) { | ||
- word = wordlist[word]; | ||
- } | ||
- if (match(search, word)) { | ||
- result.push(formatter(word)); | ||
- } | ||
- } | ||
- } | ||
- | ||
- function nameCompletion(cur, token, result, editor) { | ||
- var useBacktick = (token.string.charAt(0) == "`"); | ||
- var string = token.string.substr(1); | ||
- var prevToken = editor.getTokenAt(Pos(cur.line, token.start)); | ||
- if (token.string.charAt(0) == "." || prevToken.string == "."){ | ||
- //Suggest colunm names | ||
- if (prevToken.string == ".") { | ||
- var prevToken = editor.getTokenAt(Pos(cur.line, token.start - 1)); | ||
- } | ||
- var table = prevToken.string; | ||
- //Check if backtick is used in table name. If yes, use it for columns too. | ||
- var useBacktickTable = false; | ||
- if (table.match(/`/g)) { | ||
- useBacktickTable = true; | ||
- table = table.replace(/`/g, ""); | ||
- } | ||
- //Check if table is available. If not, find table by Alias | ||
- if (!tables.hasOwnProperty(table)) | ||
- table = findTableByAlias(table, editor); | ||
- var columns = tables[table]; | ||
- if (!columns) return; | ||
- | ||
- if (useBacktick) { | ||
- addMatches(result, string, columns, function(w) {return "`" + w + "`";}); | ||
- } | ||
- else if(useBacktickTable) { | ||
- addMatches(result, string, columns, function(w) {return ".`" + w + "`";}); | ||
- } | ||
- else { | ||
- addMatches(result, string, columns, function(w) {return "." + w;}); | ||
- } | ||
- } | ||
- else { | ||
- //Suggest table names or colums in defaultTable | ||
- while (token.start && string.charAt(0) == ".") { | ||
- token = editor.getTokenAt(Pos(cur.line, token.start - 1)); | ||
- string = token.string + string; | ||
- } | ||
- if (useBacktick) { | ||
- addMatches(result, string, tables, function(w) {return "`" + w + "`";}); | ||
- addMatches(result, string, defaultTable, function(w) {return "`" + w + "`";}); | ||
- } | ||
- else { | ||
- addMatches(result, string, tables, function(w) {return w;}); | ||
- addMatches(result, string, defaultTable, function(w) {return w;}); | ||
- } | ||
- } | ||
- } | ||
- | ||
- function eachWord(lineText, f) { | ||
- if (!lineText) return; | ||
- var excepted = /[,;]/g; | ||
- var words = lineText.split(" "); | ||
- for (var i = 0; i < words.length; i++) { | ||
- f(words[i]?words[i].replace(excepted, '') : ''); | ||
- } | ||
- } | ||
- | ||
- function convertCurToNumber(cur) { | ||
- // max characters of a line is 999,999. | ||
- return cur.line + cur.ch / Math.pow(10, 6); | ||
- } | ||
- | ||
- function convertNumberToCur(num) { | ||
- return Pos(Math.floor(num), +num.toString().split('.').pop()); | ||
- } | ||
- | ||
- function findTableByAlias(alias, editor) { | ||
- var doc = editor.doc; | ||
- var fullQuery = doc.getValue(); | ||
- var aliasUpperCase = alias.toUpperCase(); | ||
- var previousWord = ""; | ||
- var table = ""; | ||
- var separator = []; | ||
- var validRange = { | ||
- start: Pos(0, 0), | ||
- end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length) | ||
- }; | ||
- | ||
- //add separator | ||
- var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV); | ||
- while(indexOfSeparator != -1) { | ||
- separator.push(doc.posFromIndex(indexOfSeparator)); | ||
- indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1); | ||
- } | ||
- separator.unshift(Pos(0, 0)); | ||
- separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length)); | ||
- | ||
- //find valid range | ||
- var prevItem = 0; | ||
- var current = convertCurToNumber(editor.getCursor()); | ||
- for (var i=0; i< separator.length; i++) { | ||
- var _v = convertCurToNumber(separator[i]); | ||
- if (current > prevItem && current <= _v) { | ||
- validRange = { start: convertNumberToCur(prevItem), end: convertNumberToCur(_v) }; | ||
- break; | ||
- } | ||
- prevItem = _v; | ||
- } | ||
- | ||
- var query = doc.getRange(validRange.start, validRange.end, false); | ||
- | ||
- for (var i = 0; i < query.length; i++) { | ||
- var lineText = query[i]; | ||
- eachWord(lineText, function(word) { | ||
- var wordUpperCase = word.toUpperCase(); | ||
- if (wordUpperCase === aliasUpperCase && tables.hasOwnProperty(previousWord)) { | ||
- table = previousWord; | ||
- } | ||
- if (wordUpperCase !== CONS.ALIAS_KEYWORD) { | ||
- previousWord = word; | ||
- } | ||
- }); | ||
- if (table) break; | ||
- } | ||
- return table; | ||
- } | ||
- | ||
- CodeMirror.registerHelper("hint", "sql", function(editor, options) { | ||
- tables = (options && options.tables) || {}; | ||
- var defaultTableName = options && options.defaultTable; | ||
- defaultTable = (defaultTableName && tables[defaultTableName] || []); | ||
- keywords = keywords || getKeywords(editor); | ||
- | ||
- var cur = editor.getCursor(); | ||
- var result = []; | ||
- var token = editor.getTokenAt(cur), start, end, search; | ||
- if (token.end > cur.ch) { | ||
- token.end = cur.ch; | ||
- token.string = token.string.slice(0, cur.ch - token.start); | ||
- } | ||
- | ||
- if (token.string.match(/^[.`\w@]\w*$/)) { | ||
- search = token.string; | ||
- start = token.start; | ||
- end = token.end; | ||
- } else { | ||
- start = end = cur.ch; | ||
- search = ""; | ||
- } | ||
- if (search.charAt(0) == "." || search.charAt(0) == "`") { | ||
- nameCompletion(cur, token, result, editor); | ||
- } else { | ||
- addMatches(result, search, tables, function(w) {return w;}); | ||
- addMatches(result, search, defaultTable, function(w) {return w;}); | ||
- addMatches(result, search, keywords, function(w) {return w.toUpperCase();}); | ||
- } | ||
- | ||
- return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)}; | ||
- }); | ||
-}); |
110
public/js/lib/codemirror/addon/hint/xml-hint.js
@@ -1,110 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- function getHints(cm, options) { | ||
- var tags = options && options.schemaInfo; | ||
- var quote = (options && options.quoteChar) || '"'; | ||
- if (!tags) return; | ||
- var cur = cm.getCursor(), token = cm.getTokenAt(cur); | ||
- if (token.end > cur.ch) { | ||
- token.end = cur.ch; | ||
- token.string = token.string.slice(0, cur.ch - token.start); | ||
- } | ||
- var inner = CodeMirror.innerMode(cm.getMode(), token.state); | ||
- if (inner.mode.name != "xml") return; | ||
- var result = [], replaceToken = false, prefix; | ||
- var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string); | ||
- var tagName = tag && /^\w/.test(token.string), tagStart; | ||
- | ||
- if (tagName) { | ||
- var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start); | ||
- var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null; | ||
- if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1); | ||
- } else if (tag && token.string == "<") { | ||
- tagType = "open"; | ||
- } else if (tag && token.string == "</") { | ||
- tagType = "close"; | ||
- } | ||
- | ||
- if (!tag && !inner.state.tagName || tagType) { | ||
- if (tagName) | ||
- prefix = token.string; | ||
- replaceToken = tagType; | ||
- var cx = inner.state.context, curTag = cx && tags[cx.tagName]; | ||
- var childList = cx ? curTag && curTag.children : tags["!top"]; | ||
- if (childList && tagType != "close") { | ||
- for (var i = 0; i < childList.length; ++i) if (!prefix || childList[i].lastIndexOf(prefix, 0) == 0) | ||
- result.push("<" + childList[i]); | ||
- } else if (tagType != "close") { | ||
- for (var name in tags) | ||
- if (tags.hasOwnProperty(name) && name != "!top" && name != "!attrs" && (!prefix || name.lastIndexOf(prefix, 0) == 0)) | ||
- result.push("<" + name); | ||
- } | ||
- if (cx && (!prefix || tagType == "close" && cx.tagName.lastIndexOf(prefix, 0) == 0)) | ||
- result.push("</" + cx.tagName + ">"); | ||
- } else { | ||
- // Attribute completion | ||
- var curTag = tags[inner.state.tagName], attrs = curTag && curTag.attrs; | ||
- var globalAttrs = tags["!attrs"]; | ||
- if (!attrs && !globalAttrs) return; | ||
- if (!attrs) { | ||
- attrs = globalAttrs; | ||
- } else if (globalAttrs) { // Combine tag-local and global attributes | ||
- var set = {}; | ||
- for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm]; | ||
- for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm]; | ||
- attrs = set; | ||
- } | ||
- if (token.type == "string" || token.string == "=") { // A value | ||
- var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)), | ||
- Pos(cur.line, token.type == "string" ? token.start : token.end)); | ||
- var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues; | ||
- if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return; | ||
- if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget | ||
- if (token.type == "string") { | ||
- prefix = token.string; | ||
- var n = 0; | ||
- if (/['"]/.test(token.string.charAt(0))) { | ||
- quote = token.string.charAt(0); | ||
- prefix = token.string.slice(1); | ||
- n++; | ||
- } | ||
- var len = token.string.length; | ||
- if (/['"]/.test(token.string.charAt(len - 1))) { | ||
- quote = token.string.charAt(len - 1); | ||
- prefix = token.string.substr(n, len - 2); | ||
- } | ||
- replaceToken = true; | ||
- } | ||
- for (var i = 0; i < atValues.length; ++i) if (!prefix || atValues[i].lastIndexOf(prefix, 0) == 0) | ||
- result.push(quote + atValues[i] + quote); | ||
- } else { // An attribute name | ||
- if (token.type == "attribute") { | ||
- prefix = token.string; | ||
- replaceToken = true; | ||
- } | ||
- for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || attr.lastIndexOf(prefix, 0) == 0)) | ||
- result.push(attr); | ||
- } | ||
- } | ||
- return { | ||
- list: result, | ||
- from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur, | ||
- to: replaceToken ? Pos(cur.line, token.end) : cur | ||
- }; | ||
- } | ||
- | ||
- CodeMirror.registerHelper("hint", "xml", getHints); | ||
-}); |
41
public/js/lib/codemirror/addon/lint/coffeescript-lint.js
@@ -1,41 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js | ||
- | ||
-// declare global: coffeelint | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.registerHelper("lint", "coffeescript", function(text) { | ||
- var found = []; | ||
- var parseError = function(err) { | ||
- var loc = err.lineNumber; | ||
- found.push({from: CodeMirror.Pos(loc-1, 0), | ||
- to: CodeMirror.Pos(loc, 0), | ||
- severity: err.level, | ||
- message: err.message}); | ||
- }; | ||
- try { | ||
- var res = coffeelint.lint(text); | ||
- for(var i = 0; i < res.length; i++) { | ||
- parseError(res[i]); | ||
- } | ||
- } catch(e) { | ||
- found.push({from: CodeMirror.Pos(e.location.first_line, 0), | ||
- to: CodeMirror.Pos(e.location.last_line, e.location.last_column), | ||
- severity: 'error', | ||
- message: e.message}); | ||
- } | ||
- return found; | ||
-}); | ||
- | ||
-}); |
35
public/js/lib/codemirror/addon/lint/css-lint.js
@@ -1,35 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Depends on csslint.js from https://github.com/stubbornella/csslint | ||
- | ||
-// declare global: CSSLint | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.registerHelper("lint", "css", function(text) { | ||
- var found = []; | ||
- if (!window.CSSLint) return found; | ||
- var results = CSSLint.verify(text), messages = results.messages, message = null; | ||
- for ( var i = 0; i < messages.length; i++) { | ||
- message = messages[i]; | ||
- var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col; | ||
- found.push({ | ||
- from: CodeMirror.Pos(startLine, startCol), | ||
- to: CodeMirror.Pos(endLine, endCol), | ||
- message: message.message, | ||
- severity : message.type | ||
- }); | ||
- } | ||
- return found; | ||
-}); | ||
- | ||
-}); |
136
public/js/lib/codemirror/addon/lint/javascript-lint.js
@@ -1,136 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- // declare global: JSHINT | ||
- | ||
- var bogus = [ "Dangerous comment" ]; | ||
- | ||
- var warnings = [ [ "Expected '{'", | ||
- "Statement body should be inside '{ }' braces." ] ]; | ||
- | ||
- var errors = [ "Missing semicolon", "Extra comma", "Missing property name", | ||
- "Unmatched ", " and instead saw", " is not defined", | ||
- "Unclosed string", "Stopping, unable to continue" ]; | ||
- | ||
- function validator(text, options) { | ||
- if (!window.JSHINT) return []; | ||
- JSHINT(text, options); | ||
- var errors = JSHINT.data().errors, result = []; | ||
- if (errors) parseErrors(errors, result); | ||
- return result; | ||
- } | ||
- | ||
- CodeMirror.registerHelper("lint", "javascript", validator); | ||
- | ||
- function cleanup(error) { | ||
- // All problems are warnings by default | ||
- fixWith(error, warnings, "warning", true); | ||
- fixWith(error, errors, "error"); | ||
- | ||
- return isBogus(error) ? null : error; | ||
- } | ||
- | ||
- function fixWith(error, fixes, severity, force) { | ||
- var description, fix, find, replace, found; | ||
- | ||
- description = error.description; | ||
- | ||
- for ( var i = 0; i < fixes.length; i++) { | ||
- fix = fixes[i]; | ||
- find = (typeof fix === "string" ? fix : fix[0]); | ||
- replace = (typeof fix === "string" ? null : fix[1]); | ||
- found = description.indexOf(find) !== -1; | ||
- | ||
- if (force || found) { | ||
- error.severity = severity; | ||
- } | ||
- if (found && replace) { | ||
- error.description = replace; | ||
- } | ||
- } | ||
- } | ||
- | ||
- function isBogus(error) { | ||
- var description = error.description; | ||
- for ( var i = 0; i < bogus.length; i++) { | ||
- if (description.indexOf(bogus[i]) !== -1) { | ||
- return true; | ||
- } | ||
- } | ||
- return false; | ||
- } | ||
- | ||
- function parseErrors(errors, output) { | ||
- for ( var i = 0; i < errors.length; i++) { | ||
- var error = errors[i]; | ||
- if (error) { | ||
- var linetabpositions, index; | ||
- | ||
- linetabpositions = []; | ||
- | ||
- // This next block is to fix a problem in jshint. Jshint | ||
- // replaces | ||
- // all tabs with spaces then performs some checks. The error | ||
- // positions (character/space) are then reported incorrectly, | ||
- // not taking the replacement step into account. Here we look | ||
- // at the evidence line and try to adjust the character position | ||
- // to the correct value. | ||
- if (error.evidence) { | ||
- // Tab positions are computed once per line and cached | ||
- var tabpositions = linetabpositions[error.line]; | ||
- if (!tabpositions) { | ||
- var evidence = error.evidence; | ||
- tabpositions = []; | ||
- // ugggh phantomjs does not like this | ||
- // forEachChar(evidence, function(item, index) { | ||
- Array.prototype.forEach.call(evidence, function(item, | ||
- index) { | ||
- if (item === '\t') { | ||
- // First col is 1 (not 0) to match error | ||
- // positions | ||
- tabpositions.push(index + 1); | ||
- } | ||
- }); | ||
- linetabpositions[error.line] = tabpositions; | ||
- } | ||
- if (tabpositions.length > 0) { | ||
- var pos = error.character; | ||
- tabpositions.forEach(function(tabposition) { | ||
- if (pos > tabposition) pos -= 1; | ||
- }); | ||
- error.character = pos; | ||
- } | ||
- } | ||
- | ||
- var start = error.character - 1, end = start + 1; | ||
- if (error.evidence) { | ||
- index = error.evidence.substring(start).search(/.\b/); | ||
- if (index > -1) { | ||
- end += index; | ||
- } | ||
- } | ||
- | ||
- // Convert to format expected by validation service | ||
- error.description = error.reason;// + "(jshint)"; | ||
- error.start = error.character; | ||
- error.end = end; | ||
- error = cleanup(error); | ||
- | ||
- if (error) | ||
- output.push({message: error.description, | ||
- severity: error.severity, | ||
- from: CodeMirror.Pos(error.line - 1, start), | ||
- to: CodeMirror.Pos(error.line - 1, end)}); | ||
- } | ||
- } | ||
- } | ||
-}); |
31
public/js/lib/codemirror/addon/lint/json-lint.js
@@ -1,31 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Depends on jsonlint.js from https://github.com/zaach/jsonlint | ||
- | ||
-// declare global: jsonlint | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.registerHelper("lint", "json", function(text) { | ||
- var found = []; | ||
- jsonlint.parseError = function(str, hash) { | ||
- var loc = hash.loc; | ||
- found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column), | ||
- to: CodeMirror.Pos(loc.last_line - 1, loc.last_column), | ||
- message: str}); | ||
- }; | ||
- try { jsonlint.parse(text); } | ||
- catch(e) {} | ||
- return found; | ||
-}); | ||
- | ||
-}); |
73
public/js/lib/codemirror/addon/lint/lint.css
@@ -1,73 +0,0 @@ | ||
-/* The lint marker gutter */ | ||
-.CodeMirror-lint-markers { | ||
- width: 16px; | ||
-} | ||
- | ||
-.CodeMirror-lint-tooltip { | ||
- background-color: infobackground; | ||
- border: 1px solid black; | ||
- border-radius: 4px 4px 4px 4px; | ||
- color: infotext; | ||
- font-family: monospace; | ||
- font-size: 10pt; | ||
- overflow: hidden; | ||
- padding: 2px 5px; | ||
- position: fixed; | ||
- white-space: pre; | ||
- white-space: pre-wrap; | ||
- z-index: 100; | ||
- max-width: 600px; | ||
- opacity: 0; | ||
- transition: opacity .4s; | ||
- -moz-transition: opacity .4s; | ||
- -webkit-transition: opacity .4s; | ||
- -o-transition: opacity .4s; | ||
- -ms-transition: opacity .4s; | ||
-} | ||
- | ||
-.CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning { | ||
- background-position: left bottom; | ||
- background-repeat: repeat-x; | ||
-} | ||
- | ||
-.CodeMirror-lint-mark-error { | ||
- background-image: | ||
- url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==") | ||
- ; | ||
-} | ||
- | ||
-.CodeMirror-lint-mark-warning { | ||
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII="); | ||
-} | ||
- | ||
-.CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning { | ||
- background-position: center center; | ||
- background-repeat: no-repeat; | ||
- cursor: pointer; | ||
- display: inline-block; | ||
- height: 16px; | ||
- width: 16px; | ||
- vertical-align: middle; | ||
- position: relative; | ||
-} | ||
- | ||
-.CodeMirror-lint-message-error, .CodeMirror-lint-message-warning { | ||
- padding-left: 18px; | ||
- background-position: top left; | ||
- background-repeat: no-repeat; | ||
-} | ||
- | ||
-.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { | ||
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII="); | ||
-} | ||
- | ||
-.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning { | ||
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII="); | ||
-} | ||
- | ||
-.CodeMirror-lint-marker-multiple { | ||
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC"); | ||
- background-repeat: no-repeat; | ||
- background-position: right bottom; | ||
- width: 100%; height: 100%; | ||
-} |
204
public/js/lib/codemirror/addon/lint/lint.js
@@ -1,204 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- var GUTTER_ID = "CodeMirror-lint-markers"; | ||
- | ||
- function showTooltip(e, content) { | ||
- var tt = document.createElement("div"); | ||
- tt.className = "CodeMirror-lint-tooltip"; | ||
- tt.appendChild(content.cloneNode(true)); | ||
- document.body.appendChild(tt); | ||
- | ||
- function position(e) { | ||
- if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); | ||
- tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; | ||
- tt.style.left = (e.clientX + 5) + "px"; | ||
- } | ||
- CodeMirror.on(document, "mousemove", position); | ||
- position(e); | ||
- if (tt.style.opacity != null) tt.style.opacity = 1; | ||
- return tt; | ||
- } | ||
- function rm(elt) { | ||
- if (elt.parentNode) elt.parentNode.removeChild(elt); | ||
- } | ||
- function hideTooltip(tt) { | ||
- if (!tt.parentNode) return; | ||
- if (tt.style.opacity == null) rm(tt); | ||
- tt.style.opacity = 0; | ||
- setTimeout(function() { rm(tt); }, 600); | ||
- } | ||
- | ||
- function showTooltipFor(e, content, node) { | ||
- var tooltip = showTooltip(e, content); | ||
- function hide() { | ||
- CodeMirror.off(node, "mouseout", hide); | ||
- if (tooltip) { hideTooltip(tooltip); tooltip = null; } | ||
- } | ||
- var poll = setInterval(function() { | ||
- if (tooltip) for (var n = node;; n = n.parentNode) { | ||
- if (n == document.body) return; | ||
- if (!n) { hide(); break; } | ||
- } | ||
- if (!tooltip) return clearInterval(poll); | ||
- }, 400); | ||
- CodeMirror.on(node, "mouseout", hide); | ||
- } | ||
- | ||
- function LintState(cm, options, hasGutter) { | ||
- this.marked = []; | ||
- this.options = options; | ||
- this.timeout = null; | ||
- this.hasGutter = hasGutter; | ||
- this.onMouseOver = function(e) { onMouseOver(cm, e); }; | ||
- } | ||
- | ||
- function parseOptions(cm, options) { | ||
- if (options instanceof Function) return {getAnnotations: options}; | ||
- if (!options || options === true) options = {}; | ||
- if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint"); | ||
- if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)"); | ||
- return options; | ||
- } | ||
- | ||
- function clearMarks(cm) { | ||
- var state = cm.state.lint; | ||
- if (state.hasGutter) cm.clearGutter(GUTTER_ID); | ||
- for (var i = 0; i < state.marked.length; ++i) | ||
- state.marked[i].clear(); | ||
- state.marked.length = 0; | ||
- } | ||
- | ||
- function makeMarker(labels, severity, multiple, tooltips) { | ||
- var marker = document.createElement("div"), inner = marker; | ||
- marker.className = "CodeMirror-lint-marker-" + severity; | ||
- if (multiple) { | ||
- inner = marker.appendChild(document.createElement("div")); | ||
- inner.className = "CodeMirror-lint-marker-multiple"; | ||
- } | ||
- | ||
- if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) { | ||
- showTooltipFor(e, labels, inner); | ||
- }); | ||
- | ||
- return marker; | ||
- } | ||
- | ||
- function getMaxSeverity(a, b) { | ||
- if (a == "error") return a; | ||
- else return b; | ||
- } | ||
- | ||
- function groupByLine(annotations) { | ||
- var lines = []; | ||
- for (var i = 0; i < annotations.length; ++i) { | ||
- var ann = annotations[i], line = ann.from.line; | ||
- (lines[line] || (lines[line] = [])).push(ann); | ||
- } | ||
- return lines; | ||
- } | ||
- | ||
- function annotationTooltip(ann) { | ||
- var severity = ann.severity; | ||
- if (!severity) severity = "error"; | ||
- var tip = document.createElement("div"); | ||
- tip.className = "CodeMirror-lint-message-" + severity; | ||
- tip.appendChild(document.createTextNode(ann.message)); | ||
- return tip; | ||
- } | ||
- | ||
- function startLinting(cm) { | ||
- var state = cm.state.lint, options = state.options; | ||
- var passOptions = options.options || options; // Support deprecated passing of `options` property in options | ||
- if (options.async) | ||
- options.getAnnotations(cm.getValue(), updateLinting, passOptions, cm); | ||
- else | ||
- updateLinting(cm, options.getAnnotations(cm.getValue(), passOptions, cm)); | ||
- } | ||
- | ||
- function updateLinting(cm, annotationsNotSorted) { | ||
- clearMarks(cm); | ||
- var state = cm.state.lint, options = state.options; | ||
- | ||
- var annotations = groupByLine(annotationsNotSorted); | ||
- | ||
- for (var line = 0; line < annotations.length; ++line) { | ||
- var anns = annotations[line]; | ||
- if (!anns) continue; | ||
- | ||
- var maxSeverity = null; | ||
- var tipLabel = state.hasGutter && document.createDocumentFragment(); | ||
- | ||
- for (var i = 0; i < anns.length; ++i) { | ||
- var ann = anns[i]; | ||
- var severity = ann.severity; | ||
- if (!severity) severity = "error"; | ||
- maxSeverity = getMaxSeverity(maxSeverity, severity); | ||
- | ||
- if (options.formatAnnotation) ann = options.formatAnnotation(ann); | ||
- if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); | ||
- | ||
- if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { | ||
- className: "CodeMirror-lint-mark-" + severity, | ||
- __annotation: ann | ||
- })); | ||
- } | ||
- | ||
- if (state.hasGutter) | ||
- cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1, | ||
- state.options.tooltips)); | ||
- } | ||
- if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); | ||
- } | ||
- | ||
- function onChange(cm) { | ||
- var state = cm.state.lint; | ||
- clearTimeout(state.timeout); | ||
- state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500); | ||
- } | ||
- | ||
- function popupSpanTooltip(ann, e) { | ||
- var target = e.target || e.srcElement; | ||
- showTooltipFor(e, annotationTooltip(ann), target); | ||
- } | ||
- | ||
- function onMouseOver(cm, e) { | ||
- var target = e.target || e.srcElement; | ||
- if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; | ||
- var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2; | ||
- var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client")); | ||
- for (var i = 0; i < spans.length; ++i) { | ||
- var ann = spans[i].__annotation; | ||
- if (ann) return popupSpanTooltip(ann, e); | ||
- } | ||
- } | ||
- | ||
- CodeMirror.defineOption("lint", false, function(cm, val, old) { | ||
- if (old && old != CodeMirror.Init) { | ||
- clearMarks(cm); | ||
- cm.off("change", onChange); | ||
- CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); | ||
- delete cm.state.lint; | ||
- } | ||
- | ||
- if (val) { | ||
- var gutters = cm.getOption("gutters"), hasLintGutter = false; | ||
- for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; | ||
- var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter); | ||
- cm.on("change", onChange); | ||
- if (state.options.tooltips != false) | ||
- CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); | ||
- | ||
- startLinting(cm); | ||
- } | ||
- }); | ||
-}); |
28
public/js/lib/codemirror/addon/lint/yaml-lint.js
@@ -1,28 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-// Depends on js-yaml.js from https://github.com/nodeca/js-yaml | ||
- | ||
-// declare global: jsyaml | ||
- | ||
-CodeMirror.registerHelper("lint", "yaml", function(text) { | ||
- var found = []; | ||
- try { jsyaml.load(text); } | ||
- catch(e) { | ||
- var loc = e.mark; | ||
- found.push({ from: CodeMirror.Pos(loc.line, loc.column), to: CodeMirror.Pos(loc.line, loc.column), message: e.message }); | ||
- } | ||
- return found; | ||
-}); | ||
- | ||
-}); |
112
public/js/lib/codemirror/addon/merge/merge.css
@@ -1,112 +0,0 @@ | ||
-.CodeMirror-merge { | ||
- position: relative; | ||
- border: 1px solid #ddd; | ||
- white-space: pre; | ||
-} | ||
- | ||
-.CodeMirror-merge, .CodeMirror-merge .CodeMirror { | ||
- height: 350px; | ||
-} | ||
- | ||
-.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } | ||
-.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } | ||
-.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } | ||
-.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } | ||
- | ||
-.CodeMirror-merge-pane { | ||
- display: inline-block; | ||
- white-space: normal; | ||
- vertical-align: top; | ||
-} | ||
-.CodeMirror-merge-pane-rightmost { | ||
- position: absolute; | ||
- right: 0px; | ||
- z-index: 1; | ||
-} | ||
- | ||
-.CodeMirror-merge-gap { | ||
- z-index: 2; | ||
- display: inline-block; | ||
- height: 100%; | ||
- -moz-box-sizing: border-box; | ||
- box-sizing: border-box; | ||
- overflow: hidden; | ||
- border-left: 1px solid #ddd; | ||
- border-right: 1px solid #ddd; | ||
- position: relative; | ||
- background: #f8f8f8; | ||
-} | ||
- | ||
-.CodeMirror-merge-scrolllock-wrap { | ||
- position: absolute; | ||
- bottom: 0; left: 50%; | ||
-} | ||
-.CodeMirror-merge-scrolllock { | ||
- position: relative; | ||
- left: -50%; | ||
- cursor: pointer; | ||
- color: #555; | ||
- line-height: 1; | ||
-} | ||
- | ||
-.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { | ||
- position: absolute; | ||
- left: 0; top: 0; | ||
- right: 0; bottom: 0; | ||
- line-height: 1; | ||
-} | ||
- | ||
-.CodeMirror-merge-copy { | ||
- position: absolute; | ||
- cursor: pointer; | ||
- color: #44c; | ||
-} | ||
- | ||
-.CodeMirror-merge-copy-reverse { | ||
- position: absolute; | ||
- cursor: pointer; | ||
- color: #44c; | ||
-} | ||
- | ||
-.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } | ||
-.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } | ||
- | ||
-.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { | ||
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); | ||
- background-position: bottom left; | ||
- background-repeat: repeat-x; | ||
-} | ||
- | ||
-.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { | ||
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); | ||
- background-position: bottom left; | ||
- background-repeat: repeat-x; | ||
-} | ||
- | ||
-.CodeMirror-merge-r-chunk { background: #ffffe0; } | ||
-.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } | ||
-.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } | ||
-.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } | ||
- | ||
-.CodeMirror-merge-l-chunk { background: #eef; } | ||
-.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } | ||
-.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } | ||
-.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } | ||
- | ||
-.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } | ||
-.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } | ||
-.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } | ||
- | ||
-.CodeMirror-merge-collapsed-widget:before { | ||
- content: "(...)"; | ||
-} | ||
-.CodeMirror-merge-collapsed-widget { | ||
- cursor: pointer; | ||
- color: #88b; | ||
- background: #eef; | ||
- border: 1px solid #ddf; | ||
- font-size: 90%; | ||
- padding: 0 3px; | ||
- border-radius: 4px; | ||
-} | ||
-.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } |
643
public/js/lib/codemirror/addon/merge/merge.js
@@ -1,643 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("diff_match_patch")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "diff_match_patch"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror, diff_match_patch); | ||
-})(function(CodeMirror, diff_match_patch) { | ||
- "use strict"; | ||
- var Pos = CodeMirror.Pos; | ||
- var svgNS = "http://www.w3.org/2000/svg"; | ||
- | ||
- function DiffView(mv, type) { | ||
- this.mv = mv; | ||
- this.type = type; | ||
- this.classes = type == "left" | ||
- ? {chunk: "CodeMirror-merge-l-chunk", | ||
- start: "CodeMirror-merge-l-chunk-start", | ||
- end: "CodeMirror-merge-l-chunk-end", | ||
- insert: "CodeMirror-merge-l-inserted", | ||
- del: "CodeMirror-merge-l-deleted", | ||
- connect: "CodeMirror-merge-l-connect"} | ||
- : {chunk: "CodeMirror-merge-r-chunk", | ||
- start: "CodeMirror-merge-r-chunk-start", | ||
- end: "CodeMirror-merge-r-chunk-end", | ||
- insert: "CodeMirror-merge-r-inserted", | ||
- del: "CodeMirror-merge-r-deleted", | ||
- connect: "CodeMirror-merge-r-connect"}; | ||
- if (mv.options.connect == "align") | ||
- this.aligners = []; | ||
- } | ||
- | ||
- DiffView.prototype = { | ||
- constructor: DiffView, | ||
- init: function(pane, orig, options) { | ||
- this.edit = this.mv.edit; | ||
- this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: !this.mv.options.allowEditingOriginals}, copyObj(options))); | ||
- | ||
- this.diff = getDiff(asString(orig), asString(options.value)); | ||
- this.diffOutOfDate = false; | ||
- | ||
- this.showDifferences = options.showDifferences !== false; | ||
- this.forceUpdate = registerUpdate(this); | ||
- setScrollLock(this, true, false); | ||
- registerScroll(this); | ||
- }, | ||
- setShowDifferences: function(val) { | ||
- val = val !== false; | ||
- if (val != this.showDifferences) { | ||
- this.showDifferences = val; | ||
- this.forceUpdate("full"); | ||
- } | ||
- } | ||
- }; | ||
- | ||
- function ensureDiff(dv) { | ||
- if (dv.diffOutOfDate) { | ||
- dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue()); | ||
- dv.diffOutOfDate = false; | ||
- CodeMirror.signal(dv.edit, "updateDiff", dv.diff); | ||
- } | ||
- } | ||
- | ||
- function registerUpdate(dv) { | ||
- var edit = {from: 0, to: 0, marked: []}; | ||
- var orig = {from: 0, to: 0, marked: []}; | ||
- var debounceChange; | ||
- function update(mode) { | ||
- if (mode == "full") { | ||
- if (dv.svg) clear(dv.svg); | ||
- if (dv.copyButtons) clear(dv.copyButtons); | ||
- clearMarks(dv.edit, edit.marked, dv.classes); | ||
- clearMarks(dv.orig, orig.marked, dv.classes); | ||
- edit.from = edit.to = orig.from = orig.to = 0; | ||
- } | ||
- ensureDiff(dv); | ||
- if (dv.showDifferences) { | ||
- updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes); | ||
- updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes); | ||
- } | ||
- makeConnections(dv); | ||
- } | ||
- function set(slow) { | ||
- clearTimeout(debounceChange); | ||
- debounceChange = setTimeout(update, slow == true ? 250 : 100); | ||
- } | ||
- function change() { | ||
- if (!dv.diffOutOfDate) { | ||
- dv.diffOutOfDate = true; | ||
- edit.from = edit.to = orig.from = orig.to = 0; | ||
- } | ||
- set(true); | ||
- } | ||
- dv.edit.on("change", change); | ||
- dv.orig.on("change", change); | ||
- dv.edit.on("markerAdded", set); | ||
- dv.edit.on("markerCleared", set); | ||
- dv.orig.on("markerAdded", set); | ||
- dv.orig.on("markerCleared", set); | ||
- dv.edit.on("viewportChange", set); | ||
- dv.orig.on("viewportChange", set); | ||
- update(); | ||
- return update; | ||
- } | ||
- | ||
- function registerScroll(dv) { | ||
- dv.edit.on("scroll", function() { | ||
- syncScroll(dv, DIFF_INSERT) && makeConnections(dv); | ||
- }); | ||
- dv.orig.on("scroll", function() { | ||
- syncScroll(dv, DIFF_DELETE) && makeConnections(dv); | ||
- }); | ||
- } | ||
- | ||
- function syncScroll(dv, type) { | ||
- // Change handler will do a refresh after a timeout when diff is out of date | ||
- if (dv.diffOutOfDate) return false; | ||
- if (!dv.lockScroll) return true; | ||
- var editor, other, now = +new Date; | ||
- if (type == DIFF_INSERT) { editor = dv.edit; other = dv.orig; } | ||
- else { editor = dv.orig; other = dv.edit; } | ||
- // Don't take action if the position of this editor was recently set | ||
- // (to prevent feedback loops) | ||
- if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 50 > now) return false; | ||
- | ||
- var sInfo = editor.getScrollInfo(); | ||
- if (dv.mv.options.connect == "align") { | ||
- targetPos = sInfo.top; | ||
- } else { | ||
- var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen; | ||
- var mid = editor.lineAtHeight(midY, "local"); | ||
- var around = chunkBoundariesAround(dv.diff, mid, type == DIFF_INSERT); | ||
- var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig); | ||
- var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit); | ||
- var ratio = (midY - off.top) / (off.bot - off.top); | ||
- var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top); | ||
- | ||
- var botDist, mix; | ||
- // Some careful tweaking to make sure no space is left out of view | ||
- // when scrolling to top or bottom. | ||
- if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) { | ||
- targetPos = targetPos * mix + sInfo.top * (1 - mix); | ||
- } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) { | ||
- var otherInfo = other.getScrollInfo(); | ||
- var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos; | ||
- if (botDistOther > botDist && (mix = botDist / halfScreen) < 1) | ||
- targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix); | ||
- } | ||
- } | ||
- | ||
- other.scrollTo(sInfo.left, targetPos); | ||
- other.state.scrollSetAt = now; | ||
- other.state.scrollSetBy = dv; | ||
- return true; | ||
- } | ||
- | ||
- function getOffsets(editor, around) { | ||
- var bot = around.after; | ||
- if (bot == null) bot = editor.lastLine() + 1; | ||
- return {top: editor.heightAtLine(around.before || 0, "local"), | ||
- bot: editor.heightAtLine(bot, "local")}; | ||
- } | ||
- | ||
- function setScrollLock(dv, val, action) { | ||
- dv.lockScroll = val; | ||
- if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv); | ||
- dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db \u21da"; | ||
- } | ||
- | ||
- // Updating the marks for editor content | ||
- | ||
- function clearMarks(editor, arr, classes) { | ||
- for (var i = 0; i < arr.length; ++i) { | ||
- var mark = arr[i]; | ||
- if (mark instanceof CodeMirror.TextMarker) { | ||
- mark.clear(); | ||
- } else if (mark.parent) { | ||
- editor.removeLineClass(mark, "background", classes.chunk); | ||
- editor.removeLineClass(mark, "background", classes.start); | ||
- editor.removeLineClass(mark, "background", classes.end); | ||
- } | ||
- } | ||
- arr.length = 0; | ||
- } | ||
- | ||
- // FIXME maybe add a margin around viewport to prevent too many updates | ||
- function updateMarks(editor, diff, state, type, classes) { | ||
- var vp = editor.getViewport(); | ||
- editor.operation(function() { | ||
- if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { | ||
- clearMarks(editor, state.marked, classes); | ||
- markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes); | ||
- state.from = vp.from; state.to = vp.to; | ||
- } else { | ||
- if (vp.from < state.from) { | ||
- markChanges(editor, diff, type, state.marked, vp.from, state.from, classes); | ||
- state.from = vp.from; | ||
- } | ||
- if (vp.to > state.to) { | ||
- markChanges(editor, diff, type, state.marked, state.to, vp.to, classes); | ||
- state.to = vp.to; | ||
- } | ||
- } | ||
- }); | ||
- } | ||
- | ||
- function markChanges(editor, diff, type, marks, from, to, classes) { | ||
- var pos = Pos(0, 0); | ||
- var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1)); | ||
- var cls = type == DIFF_DELETE ? classes.del : classes.insert; | ||
- function markChunk(start, end) { | ||
- var bfrom = Math.max(from, start), bto = Math.min(to, end); | ||
- for (var i = bfrom; i < bto; ++i) { | ||
- var line = editor.addLineClass(i, "background", classes.chunk); | ||
- if (i == start) editor.addLineClass(line, "background", classes.start); | ||
- if (i == end - 1) editor.addLineClass(line, "background", classes.end); | ||
- marks.push(line); | ||
- } | ||
- // When the chunk is empty, make sure a horizontal line shows up | ||
- if (start == end && bfrom == end && bto == end) { | ||
- if (bfrom) | ||
- marks.push(editor.addLineClass(bfrom - 1, "background", classes.end)); | ||
- else | ||
- marks.push(editor.addLineClass(bfrom, "background", classes.start)); | ||
- } | ||
- } | ||
- | ||
- var chunkStart = 0; | ||
- for (var i = 0; i < diff.length; ++i) { | ||
- var part = diff[i], tp = part[0], str = part[1]; | ||
- if (tp == DIFF_EQUAL) { | ||
- var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1); | ||
- moveOver(pos, str); | ||
- var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0); | ||
- if (cleanTo > cleanFrom) { | ||
- if (i) markChunk(chunkStart, cleanFrom); | ||
- chunkStart = cleanTo; | ||
- } | ||
- } else { | ||
- if (tp == type) { | ||
- var end = moveOver(pos, str, true); | ||
- var a = posMax(top, pos), b = posMin(bot, end); | ||
- if (!posEq(a, b)) | ||
- marks.push(editor.markText(a, b, {className: cls})); | ||
- pos = end; | ||
- } | ||
- } | ||
- } | ||
- if (chunkStart <= pos.line) markChunk(chunkStart, pos.line + 1); | ||
- } | ||
- | ||
- // Updating the gap between editor and original | ||
- | ||
- function makeConnections(dv) { | ||
- if (!dv.showDifferences) return; | ||
- | ||
- var align = dv.mv.options.connect == "align"; | ||
- if (align) { | ||
- if (!dv.orig.curOp) return dv.orig.operation(function() { | ||
- makeConnections(dv); | ||
- }); | ||
- for (var i = 0; i < dv.aligners.length; i++) | ||
- dv.aligners[i].clear(); | ||
- dv.aligners.length = 0; | ||
- var extraSpaceAbove = {edit: 0, orig: 0}; | ||
- } | ||
- | ||
- if (dv.svg) { | ||
- clear(dv.svg); | ||
- var w = dv.gap.offsetWidth; | ||
- attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight); | ||
- } | ||
- if (dv.copyButtons) clear(dv.copyButtons); | ||
- | ||
- var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport(); | ||
- var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top; | ||
- iterateChunks(dv.diff, function(topOrig, botOrig, topEdit, botEdit) { | ||
- if (topEdit <= vpEdit.to && botEdit >= vpEdit.from && | ||
- topOrig <= vpOrig.to && botOrig >= vpOrig.from) | ||
- drawConnectorsForChunk(dv, topOrig, botOrig, topEdit, botEdit, sTopOrig, sTopEdit, w); | ||
- if (align && (topEdit <= vpEdit.to || topOrig <= vpOrig.to)) { | ||
- var above = (botEdit < vpEdit.from && botOrig < vpOrig.from); | ||
- alignChunks(dv, topOrig, botOrig, topEdit, botEdit, above && extraSpaceAbove); | ||
- } | ||
- }); | ||
- if (align) { | ||
- if (extraSpaceAbove.edit) | ||
- dv.aligners.push(padBelow(dv.edit, 0, extraSpaceAbove.edit)); | ||
- if (extraSpaceAbove.orig) | ||
- dv.aligners.push(padBelow(dv.orig, 0, extraSpaceAbove.orig)); | ||
- } | ||
- } | ||
- | ||
- function drawConnectorsForChunk(dv, topOrig, botOrig, topEdit, botEdit, sTopOrig, sTopEdit, w) { | ||
- var flip = dv.type == "left"; | ||
- var top = dv.orig.heightAtLine(topOrig, "local") - sTopOrig; | ||
- if (dv.svg) { | ||
- var topLpx = top; | ||
- var topRpx = dv.edit.heightAtLine(topEdit, "local") - sTopEdit; | ||
- if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; } | ||
- var botLpx = dv.orig.heightAtLine(botOrig, "local") - sTopOrig; | ||
- var botRpx = dv.edit.heightAtLine(botEdit, "local") - sTopEdit; | ||
- if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; } | ||
- var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx; | ||
- var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx; | ||
- attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")), | ||
- "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z", | ||
- "class", dv.classes.connect); | ||
- } | ||
- if (dv.copyButtons) { | ||
- var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", | ||
- "CodeMirror-merge-copy")); | ||
- var editOriginals = dv.mv.options.allowEditingOriginals; | ||
- copy.title = editOriginals ? "Push to left" : "Revert chunk"; | ||
- copy.chunk = {topEdit: topEdit, botEdit: botEdit, topOrig: topOrig, botOrig: botOrig}; | ||
- copy.style.top = top + "px"; | ||
- | ||
- if (editOriginals) { | ||
- var topReverse = dv.orig.heightAtLine(topEdit, "local") - sTopEdit; | ||
- var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc", | ||
- "CodeMirror-merge-copy-reverse")); | ||
- copyReverse.title = "Push to right"; | ||
- copyReverse.chunk = {topEdit: topOrig, botEdit: botOrig, topOrig: topEdit, botOrig: botEdit}; | ||
- copyReverse.style.top = topReverse + "px"; | ||
- dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px"; | ||
- } | ||
- } | ||
- } | ||
- | ||
- function alignChunks(dv, topOrig, botOrig, topEdit, botEdit, aboveViewport) { | ||
- var topOrigPx = dv.orig.heightAtLine(topOrig, "local"); | ||
- var botOrigPx = dv.orig.heightAtLine(botOrig, "local"); | ||
- var topEditPx = dv.edit.heightAtLine(topEdit, "local"); | ||
- var botEditPx = dv.edit.heightAtLine(botEdit, "local"); | ||
- var origH = botOrigPx -topOrigPx, editH = botEditPx - topEditPx; | ||
- var diff = editH - origH; | ||
- if (diff > 1) { | ||
- if (aboveViewport) aboveViewport.orig += diff; | ||
- else dv.aligners.push(padBelow(dv.orig, botOrig - 1, diff)); | ||
- } else if (diff < -1) { | ||
- if (aboveViewport) aboveViewport.edit -= diff; | ||
- else dv.aligners.push(padBelow(dv.edit, botEdit - 1, -diff)); | ||
- } | ||
- return 0; | ||
- } | ||
- | ||
- function padBelow(cm, line, size) { | ||
- var elt = document.createElement("div"); | ||
- elt.style.height = size + "px"; elt.style.minWidth = "1px"; | ||
- return cm.addLineWidget(line, elt, {height: size}); | ||
- } | ||
- | ||
- function copyChunk(dv, to, from, chunk) { | ||
- if (dv.diffOutOfDate) return; | ||
- to.replaceRange(from.getRange(Pos(chunk.topOrig, 0), Pos(chunk.botOrig, 0)), | ||
- Pos(chunk.topEdit, 0), Pos(chunk.botEdit, 0)); | ||
- } | ||
- | ||
- // Merge view, containing 0, 1, or 2 diff views. | ||
- | ||
- var MergeView = CodeMirror.MergeView = function(node, options) { | ||
- if (!(this instanceof MergeView)) return new MergeView(node, options); | ||
- | ||
- this.options = options; | ||
- var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight; | ||
- if (origLeft && origRight) { | ||
- if (options.connect == "align") | ||
- throw new Error("connect: \"align\" is not supported for three-way merge views"); | ||
- if (options.collapseIdentical) | ||
- throw new Error("collapseIdentical option is not supported for three-way merge views"); | ||
- } | ||
- | ||
- var hasLeft = origLeft != null, hasRight = origRight != null; | ||
- var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0); | ||
- var wrap = [], left = this.left = null, right = this.right = null; | ||
- | ||
- if (hasLeft) { | ||
- left = this.left = new DiffView(this, "left"); | ||
- var leftPane = elt("div", null, "CodeMirror-merge-pane"); | ||
- wrap.push(leftPane); | ||
- wrap.push(buildGap(left)); | ||
- } | ||
- | ||
- var editPane = elt("div", null, "CodeMirror-merge-pane"); | ||
- wrap.push(editPane); | ||
- | ||
- if (hasRight) { | ||
- right = this.right = new DiffView(this, "right"); | ||
- wrap.push(buildGap(right)); | ||
- var rightPane = elt("div", null, "CodeMirror-merge-pane"); | ||
- wrap.push(rightPane); | ||
- } | ||
- | ||
- (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost"; | ||
- | ||
- wrap.push(elt("div", null, null, "height: 0; clear: both;")); | ||
- | ||
- var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane")); | ||
- this.edit = CodeMirror(editPane, copyObj(options)); | ||
- | ||
- if (left) left.init(leftPane, origLeft, options); | ||
- if (right) right.init(rightPane, origRight, options); | ||
- | ||
- if (options.collapseIdentical) | ||
- collapseIdenticalStretches(left || right, options.collapseIdentical); | ||
- | ||
- var onResize = function() { | ||
- if (left) makeConnections(left); | ||
- if (right) makeConnections(right); | ||
- }; | ||
- CodeMirror.on(window, "resize", onResize); | ||
- var resizeInterval = setInterval(function() { | ||
- for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {} | ||
- if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); } | ||
- }, 5000); | ||
- }; | ||
- | ||
- function buildGap(dv) { | ||
- var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock"); | ||
- lock.title = "Toggle locked scrolling"; | ||
- var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap"); | ||
- CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); }); | ||
- var gapElts = [lockWrap]; | ||
- if (dv.mv.options.revertButtons !== false) { | ||
- dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type); | ||
- CodeMirror.on(dv.copyButtons, "click", function(e) { | ||
- var node = e.target || e.srcElement; | ||
- if (!node.chunk) return; | ||
- if (node.className == "CodeMirror-merge-copy-reverse") { | ||
- copyChunk(dv, dv.orig, dv.edit, node.chunk); | ||
- return; | ||
- } | ||
- copyChunk(dv, dv.edit, dv.orig, node.chunk); | ||
- }); | ||
- gapElts.unshift(dv.copyButtons); | ||
- } | ||
- if (dv.mv.options.connect != "align") { | ||
- var svg = document.createElementNS && document.createElementNS(svgNS, "svg"); | ||
- if (svg && !svg.createSVGRect) svg = null; | ||
- dv.svg = svg; | ||
- if (svg) gapElts.push(svg); | ||
- } | ||
- | ||
- return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap"); | ||
- } | ||
- | ||
- MergeView.prototype = { | ||
- constuctor: MergeView, | ||
- editor: function() { return this.edit; }, | ||
- rightOriginal: function() { return this.right && this.right.orig; }, | ||
- leftOriginal: function() { return this.left && this.left.orig; }, | ||
- setShowDifferences: function(val) { | ||
- if (this.right) this.right.setShowDifferences(val); | ||
- if (this.left) this.left.setShowDifferences(val); | ||
- }, | ||
- rightChunks: function() { | ||
- return this.right && getChunks(this.right); | ||
- }, | ||
- leftChunks: function() { | ||
- return this.left && getChunks(this.left); | ||
- } | ||
- }; | ||
- | ||
- function asString(obj) { | ||
- if (typeof obj == "string") return obj; | ||
- else return obj.getValue(); | ||
- } | ||
- | ||
- // Operations on diffs | ||
- | ||
- var dmp = new diff_match_patch(); | ||
- function getDiff(a, b) { | ||
- var diff = dmp.diff_main(a, b); | ||
- dmp.diff_cleanupSemantic(diff); | ||
- // The library sometimes leaves in empty parts, which confuse the algorithm | ||
- for (var i = 0; i < diff.length; ++i) { | ||
- var part = diff[i]; | ||
- if (!part[1]) { | ||
- diff.splice(i--, 1); | ||
- } else if (i && diff[i - 1][0] == part[0]) { | ||
- diff.splice(i--, 1); | ||
- diff[i][1] += part[1]; | ||
- } | ||
- } | ||
- return diff; | ||
- } | ||
- | ||
- function iterateChunks(diff, f) { | ||
- var startEdit = 0, startOrig = 0; | ||
- var edit = Pos(0, 0), orig = Pos(0, 0); | ||
- for (var i = 0; i < diff.length; ++i) { | ||
- var part = diff[i], tp = part[0]; | ||
- if (tp == DIFF_EQUAL) { | ||
- var startOff = startOfLineClean(diff, i) ? 0 : 1; | ||
- var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff; | ||
- moveOver(edit, part[1], null, orig); | ||
- var endOff = endOfLineClean(diff, i) ? 1 : 0; | ||
- var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff; | ||
- if (cleanToEdit > cleanFromEdit) { | ||
- if (i) f(startOrig, cleanFromOrig, startEdit, cleanFromEdit); | ||
- startEdit = cleanToEdit; startOrig = cleanToOrig; | ||
- } | ||
- } else { | ||
- moveOver(tp == DIFF_INSERT ? edit : orig, part[1]); | ||
- } | ||
- } | ||
- if (startEdit <= edit.line || startOrig <= orig.line) | ||
- f(startOrig, orig.line + 1, startEdit, edit.line + 1); | ||
- } | ||
- | ||
- function getChunks(dv) { | ||
- ensureDiff(dv); | ||
- var collect = []; | ||
- iterateChunks(dv.diff, function(topOrig, botOrig, topEdit, botEdit) { | ||
- collect.push({origFrom: topOrig, origTo: botOrig, | ||
- editFrom: topEdit, editTo: botEdit}); | ||
- }); | ||
- return collect; | ||
- } | ||
- | ||
- function endOfLineClean(diff, i) { | ||
- if (i == diff.length - 1) return true; | ||
- var next = diff[i + 1][1]; | ||
- if (next.length == 1 || next.charCodeAt(0) != 10) return false; | ||
- if (i == diff.length - 2) return true; | ||
- next = diff[i + 2][1]; | ||
- return next.length > 1 && next.charCodeAt(0) == 10; | ||
- } | ||
- | ||
- function startOfLineClean(diff, i) { | ||
- if (i == 0) return true; | ||
- var last = diff[i - 1][1]; | ||
- if (last.charCodeAt(last.length - 1) != 10) return false; | ||
- if (i == 1) return true; | ||
- last = diff[i - 2][1]; | ||
- return last.charCodeAt(last.length - 1) == 10; | ||
- } | ||
- | ||
- function chunkBoundariesAround(diff, n, nInEdit) { | ||
- var beforeE, afterE, beforeO, afterO; | ||
- iterateChunks(diff, function(fromOrig, toOrig, fromEdit, toEdit) { | ||
- var fromLocal = nInEdit ? fromEdit : fromOrig; | ||
- var toLocal = nInEdit ? toEdit : toOrig; | ||
- if (afterE == null) { | ||
- if (fromLocal > n) { afterE = fromEdit; afterO = fromOrig; } | ||
- else if (toLocal > n) { afterE = toEdit; afterO = toOrig; } | ||
- } | ||
- if (toLocal <= n) { beforeE = toEdit; beforeO = toOrig; } | ||
- else if (fromLocal <= n) { beforeE = fromEdit; beforeO = fromOrig; } | ||
- }); | ||
- return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}}; | ||
- } | ||
- | ||
- function collapseSingle(cm, from, to) { | ||
- cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); | ||
- var widget = document.createElement("span"); | ||
- widget.className = "CodeMirror-merge-collapsed-widget"; | ||
- widget.title = "Identical text collapsed. Click to expand."; | ||
- var mark = cm.markText(Pos(from, 0), Pos(to - 1), { | ||
- inclusiveLeft: true, | ||
- inclusiveRight: true, | ||
- replacedWith: widget, | ||
- clearOnEnter: true | ||
- }); | ||
- function clear() { | ||
- mark.clear(); | ||
- cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); | ||
- } | ||
- widget.addEventListener("click", clear); | ||
- return {mark: mark, clear: clear}; | ||
- } | ||
- | ||
- function collapseStretch(dv, origStart, editStart, size) { | ||
- var mOrig = collapseSingle(dv.orig, origStart, origStart + size); | ||
- var mEdit = collapseSingle(dv.edit, editStart, editStart + size); | ||
- mOrig.mark.on("clear", function() { mEdit.clear(); }); | ||
- mEdit.mark.on("clear", function() { mOrig.clear(); }); | ||
- } | ||
- | ||
- function collapseIdenticalStretches(dv, margin) { | ||
- if (typeof margin != "number") margin = 2; | ||
- var lastOrig = dv.orig.firstLine(), lastEdit = dv.edit.firstLine(); | ||
- iterateChunks(dv.diff, function(topOrig, botOrig, _topEdit, botEdit) { | ||
- var identicalSize = topOrig - margin - lastOrig; | ||
- if (identicalSize > margin) | ||
- collapseStretch(dv, lastOrig, lastEdit, identicalSize); | ||
- lastOrig = botOrig + margin; lastEdit = botEdit + margin; | ||
- }); | ||
- var bottomSize = dv.orig.lastLine() + 1 - lastOrig; | ||
- if (bottomSize > margin) | ||
- collapseStretch(dv, lastOrig, lastEdit, bottomSize); | ||
- } | ||
- | ||
- // General utilities | ||
- | ||
- function elt(tag, content, className, style) { | ||
- var e = document.createElement(tag); | ||
- if (className) e.className = className; | ||
- if (style) e.style.cssText = style; | ||
- if (typeof content == "string") e.appendChild(document.createTextNode(content)); | ||
- else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); | ||
- return e; | ||
- } | ||
- | ||
- function clear(node) { | ||
- for (var count = node.childNodes.length; count > 0; --count) | ||
- node.removeChild(node.firstChild); | ||
- } | ||
- | ||
- function attrs(elt) { | ||
- for (var i = 1; i < arguments.length; i += 2) | ||
- elt.setAttribute(arguments[i], arguments[i+1]); | ||
- } | ||
- | ||
- function copyObj(obj, target) { | ||
- if (!target) target = {}; | ||
- for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; | ||
- return target; | ||
- } | ||
- | ||
- function moveOver(pos, str, copy, other) { | ||
- var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0; | ||
- for (;;) { | ||
- var nl = str.indexOf("\n", at); | ||
- if (nl == -1) break; | ||
- ++out.line; | ||
- if (other) ++other.line; | ||
- at = nl + 1; | ||
- } | ||
- out.ch = (at ? 0 : out.ch) + (str.length - at); | ||
- if (other) other.ch = (at ? 0 : other.ch) + (str.length - at); | ||
- return out; | ||
- } | ||
- | ||
- function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; } | ||
- function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; } | ||
- function posEq(a, b) { return a.line == b.line && a.ch == b.ch; } | ||
-}); |
64
public/js/lib/codemirror/addon/mode/loadmode.js
@@ -1,64 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), "cjs"); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], function(CM) { mod(CM, "amd"); }); | ||
- else // Plain browser env | ||
- mod(CodeMirror, "plain"); | ||
-})(function(CodeMirror, env) { | ||
- if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; | ||
- | ||
- var loading = {}; | ||
- function splitCallback(cont, n) { | ||
- var countDown = n; | ||
- return function() { if (--countDown == 0) cont(); }; | ||
- } | ||
- function ensureDeps(mode, cont) { | ||
- var deps = CodeMirror.modes[mode].dependencies; | ||
- if (!deps) return cont(); | ||
- var missing = []; | ||
- for (var i = 0; i < deps.length; ++i) { | ||
- if (!CodeMirror.modes.hasOwnProperty(deps[i])) | ||
- missing.push(deps[i]); | ||
- } | ||
- if (!missing.length) return cont(); | ||
- var split = splitCallback(cont, missing.length); | ||
- for (var i = 0; i < missing.length; ++i) | ||
- CodeMirror.requireMode(missing[i], split); | ||
- } | ||
- | ||
- CodeMirror.requireMode = function(mode, cont) { | ||
- if (typeof mode != "string") mode = mode.name; | ||
- if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); | ||
- if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); | ||
- | ||
- var file = CodeMirror.modeURL.replace(/%N/g, mode); | ||
- if (env == "plain") { | ||
- var script = document.createElement("script"); | ||
- script.src = file; | ||
- var others = document.getElementsByTagName("script")[0]; | ||
- var list = loading[mode] = [cont]; | ||
- CodeMirror.on(script, "load", function() { | ||
- ensureDeps(mode, function() { | ||
- for (var i = 0; i < list.length; ++i) list[i](); | ||
- }); | ||
- }); | ||
- others.parentNode.insertBefore(script, others); | ||
- } else if (env == "cjs") { | ||
- require(file); | ||
- cont(); | ||
- } else if (env == "amd") { | ||
- requirejs([file], cont); | ||
- } | ||
- }; | ||
- | ||
- CodeMirror.autoLoadMode = function(instance, mode) { | ||
- if (!CodeMirror.modes.hasOwnProperty(mode)) | ||
- CodeMirror.requireMode(mode, function() { | ||
- instance.setOption("mode", instance.getOption("mode")); | ||
- }); | ||
- }; | ||
-}); |
118
public/js/lib/codemirror/addon/mode/multiplex.js
@@ -1,118 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.multiplexingMode = function(outer /*, others */) { | ||
- // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects | ||
- var others = Array.prototype.slice.call(arguments, 1); | ||
- var n_others = others.length; | ||
- | ||
- function indexOf(string, pattern, from) { | ||
- if (typeof pattern == "string") return string.indexOf(pattern, from); | ||
- var m = pattern.exec(from ? string.slice(from) : string); | ||
- return m ? m.index + from : -1; | ||
- } | ||
- | ||
- return { | ||
- startState: function() { | ||
- return { | ||
- outer: CodeMirror.startState(outer), | ||
- innerActive: null, | ||
- inner: null | ||
- }; | ||
- }, | ||
- | ||
- copyState: function(state) { | ||
- return { | ||
- outer: CodeMirror.copyState(outer, state.outer), | ||
- innerActive: state.innerActive, | ||
- inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) | ||
- }; | ||
- }, | ||
- | ||
- token: function(stream, state) { | ||
- if (!state.innerActive) { | ||
- var cutOff = Infinity, oldContent = stream.string; | ||
- for (var i = 0; i < n_others; ++i) { | ||
- var other = others[i]; | ||
- var found = indexOf(oldContent, other.open, stream.pos); | ||
- if (found == stream.pos) { | ||
- stream.match(other.open); | ||
- state.innerActive = other; | ||
- state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); | ||
- return other.delimStyle; | ||
- } else if (found != -1 && found < cutOff) { | ||
- cutOff = found; | ||
- } | ||
- } | ||
- if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); | ||
- var outerToken = outer.token(stream, state.outer); | ||
- if (cutOff != Infinity) stream.string = oldContent; | ||
- return outerToken; | ||
- } else { | ||
- var curInner = state.innerActive, oldContent = stream.string; | ||
- if (!curInner.close && stream.sol()) { | ||
- state.innerActive = state.inner = null; | ||
- return this.token(stream, state); | ||
- } | ||
- var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos) : -1; | ||
- if (found == stream.pos) { | ||
- stream.match(curInner.close); | ||
- state.innerActive = state.inner = null; | ||
- return curInner.delimStyle; | ||
- } | ||
- if (found > -1) stream.string = oldContent.slice(0, found); | ||
- var innerToken = curInner.mode.token(stream, state.inner); | ||
- if (found > -1) stream.string = oldContent; | ||
- | ||
- if (curInner.innerStyle) { | ||
- if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle; | ||
- else innerToken = curInner.innerStyle; | ||
- } | ||
- | ||
- return innerToken; | ||
- } | ||
- }, | ||
- | ||
- indent: function(state, textAfter) { | ||
- var mode = state.innerActive ? state.innerActive.mode : outer; | ||
- if (!mode.indent) return CodeMirror.Pass; | ||
- return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); | ||
- }, | ||
- | ||
- blankLine: function(state) { | ||
- var mode = state.innerActive ? state.innerActive.mode : outer; | ||
- if (mode.blankLine) { | ||
- mode.blankLine(state.innerActive ? state.inner : state.outer); | ||
- } | ||
- if (!state.innerActive) { | ||
- for (var i = 0; i < n_others; ++i) { | ||
- var other = others[i]; | ||
- if (other.open === "\n") { | ||
- state.innerActive = other; | ||
- state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0); | ||
- } | ||
- } | ||
- } else if (state.innerActive.close === "\n") { | ||
- state.innerActive = state.inner = null; | ||
- } | ||
- }, | ||
- | ||
- electricChars: outer.electricChars, | ||
- | ||
- innerMode: function(state) { | ||
- return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; | ||
- } | ||
- }; | ||
-}; | ||
- | ||
-}); |
33
public/js/lib/codemirror/addon/mode/multiplex_test.js
@@ -1,33 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function() { | ||
- CodeMirror.defineMode("markdown_with_stex", function(){ | ||
- var inner = CodeMirror.getMode({}, "stex"); | ||
- var outer = CodeMirror.getMode({}, "markdown"); | ||
- | ||
- var innerOptions = { | ||
- open: '$', | ||
- close: '$', | ||
- mode: inner, | ||
- delimStyle: 'delim', | ||
- innerStyle: 'inner' | ||
- }; | ||
- | ||
- return CodeMirror.multiplexingMode(outer, innerOptions); | ||
- }); | ||
- | ||
- var mode = CodeMirror.getMode({}, "markdown_with_stex"); | ||
- | ||
- function MT(name) { | ||
- test.mode( | ||
- name, | ||
- mode, | ||
- Array.prototype.slice.call(arguments, 1), | ||
- 'multiplexing'); | ||
- } | ||
- | ||
- MT( | ||
- "stexInsideMarkdown", | ||
- "[strong **Equation:**] [delim $][inner&tag \\pi][delim $]"); | ||
-})(); |
85
public/js/lib/codemirror/addon/mode/overlay.js
@@ -1,85 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Utility function that allows modes to be combined. The mode given | ||
-// as the base argument takes care of most of the normal mode | ||
-// functionality, but a second (typically simple) mode is used, which | ||
-// can override the style of text. Both modes get to parse all of the | ||
-// text, but when both assign a non-null style to a piece of code, the | ||
-// overlay wins, unless the combine argument was true and not overridden, | ||
-// or state.overlay.combineTokens was true, in which case the styles are | ||
-// combined. | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.overlayMode = function(base, overlay, combine) { | ||
- return { | ||
- startState: function() { | ||
- return { | ||
- base: CodeMirror.startState(base), | ||
- overlay: CodeMirror.startState(overlay), | ||
- basePos: 0, baseCur: null, | ||
- overlayPos: 0, overlayCur: null, | ||
- streamSeen: null | ||
- }; | ||
- }, | ||
- copyState: function(state) { | ||
- return { | ||
- base: CodeMirror.copyState(base, state.base), | ||
- overlay: CodeMirror.copyState(overlay, state.overlay), | ||
- basePos: state.basePos, baseCur: null, | ||
- overlayPos: state.overlayPos, overlayCur: null | ||
- }; | ||
- }, | ||
- | ||
- token: function(stream, state) { | ||
- if (stream != state.streamSeen || | ||
- Math.min(state.basePos, state.overlayPos) < stream.start) { | ||
- state.streamSeen = stream; | ||
- state.basePos = state.overlayPos = stream.start; | ||
- } | ||
- | ||
- if (stream.start == state.basePos) { | ||
- state.baseCur = base.token(stream, state.base); | ||
- state.basePos = stream.pos; | ||
- } | ||
- if (stream.start == state.overlayPos) { | ||
- stream.pos = stream.start; | ||
- state.overlayCur = overlay.token(stream, state.overlay); | ||
- state.overlayPos = stream.pos; | ||
- } | ||
- stream.pos = Math.min(state.basePos, state.overlayPos); | ||
- | ||
- // state.overlay.combineTokens always takes precedence over combine, | ||
- // unless set to null | ||
- if (state.overlayCur == null) return state.baseCur; | ||
- else if (state.baseCur != null && | ||
- state.overlay.combineTokens || | ||
- combine && state.overlay.combineTokens == null) | ||
- return state.baseCur + " " + state.overlayCur; | ||
- else return state.overlayCur; | ||
- }, | ||
- | ||
- indent: base.indent && function(state, textAfter) { | ||
- return base.indent(state.base, textAfter); | ||
- }, | ||
- electricChars: base.electricChars, | ||
- | ||
- innerMode: function(state) { return {state: state.base, mode: base}; }, | ||
- | ||
- blankLine: function(state) { | ||
- if (base.blankLine) base.blankLine(state.base); | ||
- if (overlay.blankLine) overlay.blankLine(state.overlay); | ||
- } | ||
- }; | ||
-}; | ||
- | ||
-}); |
213
public/js/lib/codemirror/addon/mode/simple.js
@@ -1,213 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineSimpleMode = function(name, states) { | ||
- CodeMirror.defineMode(name, function(config) { | ||
- return CodeMirror.simpleMode(config, states); | ||
- }); | ||
- }; | ||
- | ||
- CodeMirror.simpleMode = function(config, states) { | ||
- ensureState(states, "start"); | ||
- var states_ = {}, meta = states.meta || {}, hasIndentation = false; | ||
- for (var state in states) if (state != meta && states.hasOwnProperty(state)) { | ||
- var list = states_[state] = [], orig = states[state]; | ||
- for (var i = 0; i < orig.length; i++) { | ||
- var data = orig[i]; | ||
- list.push(new Rule(data, states)); | ||
- if (data.indent || data.dedent) hasIndentation = true; | ||
- } | ||
- } | ||
- var mode = { | ||
- startState: function() { | ||
- return {state: "start", pending: null, | ||
- local: null, localState: null, | ||
- indent: hasIndentation ? [] : null}; | ||
- }, | ||
- copyState: function(state) { | ||
- var s = {state: state.state, pending: state.pending, | ||
- local: state.local, localState: null, | ||
- indent: state.indent && state.indent.slice(0)}; | ||
- if (state.localState) | ||
- s.localState = CodeMirror.copyState(state.local.mode, state.localState); | ||
- if (state.stack) | ||
- s.stack = state.stack.slice(0); | ||
- for (var pers = state.persistentStates; pers; pers = pers.next) | ||
- s.persistentStates = {mode: pers.mode, | ||
- spec: pers.spec, | ||
- state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), | ||
- next: s.persistentStates}; | ||
- return s; | ||
- }, | ||
- token: tokenFunction(states_, config), | ||
- innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; }, | ||
- indent: indentFunction(states_, meta) | ||
- }; | ||
- if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop)) | ||
- mode[prop] = meta[prop]; | ||
- return mode; | ||
- }; | ||
- | ||
- function ensureState(states, name) { | ||
- if (!states.hasOwnProperty(name)) | ||
- throw new Error("Undefined state " + name + "in simple mode"); | ||
- } | ||
- | ||
- function toRegex(val, caret) { | ||
- if (!val) return /(?:)/; | ||
- var flags = ""; | ||
- if (val instanceof RegExp) { | ||
- if (val.ignoreCase) flags = "i"; | ||
- val = val.source; | ||
- } else { | ||
- val = String(val); | ||
- } | ||
- return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); | ||
- } | ||
- | ||
- function asToken(val) { | ||
- if (!val) return null; | ||
- if (typeof val == "string") return val.replace(/\./g, " "); | ||
- var result = []; | ||
- for (var i = 0; i < val.length; i++) | ||
- result.push(val[i] && val[i].replace(/\./g, " ")); | ||
- return result; | ||
- } | ||
- | ||
- function Rule(data, states) { | ||
- if (data.next || data.push) ensureState(states, data.next || data.push); | ||
- this.regex = toRegex(data.regex); | ||
- this.token = asToken(data.token); | ||
- this.data = data; | ||
- } | ||
- | ||
- function tokenFunction(states, config) { | ||
- return function(stream, state) { | ||
- if (state.pending) { | ||
- var pend = state.pending.shift(); | ||
- if (state.pending.length == 0) state.pending = null; | ||
- stream.pos += pend.text.length; | ||
- return pend.token; | ||
- } | ||
- | ||
- if (state.local) { | ||
- if (state.local.end && stream.match(state.local.end)) { | ||
- var tok = state.local.endToken || null; | ||
- state.local = state.localState = null; | ||
- return tok; | ||
- } else { | ||
- var tok = state.local.mode.token(stream, state.localState), m; | ||
- if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) | ||
- stream.pos = stream.start + m.index; | ||
- return tok; | ||
- } | ||
- } | ||
- | ||
- var curState = states[state.state]; | ||
- for (var i = 0; i < curState.length; i++) { | ||
- var rule = curState[i]; | ||
- var matches = stream.match(rule.regex); | ||
- if (matches) { | ||
- if (rule.data.next) { | ||
- state.state = rule.data.next; | ||
- } else if (rule.data.push) { | ||
- (state.stack || (state.stack = [])).push(state.state); | ||
- state.state = rule.data.push; | ||
- } else if (rule.data.pop && state.stack && state.stack.length) { | ||
- state.state = state.stack.pop(); | ||
- } | ||
- | ||
- if (rule.data.mode) | ||
- enterLocalMode(config, state, rule.data.mode, rule.token); | ||
- if (rule.data.indent) | ||
- state.indent.push(stream.indentation() + config.indentUnit); | ||
- if (rule.data.dedent) | ||
- state.indent.pop(); | ||
- if (matches.length > 2) { | ||
- state.pending = []; | ||
- for (var j = 2; j < matches.length; j++) | ||
- if (matches[j]) | ||
- state.pending.push({text: matches[j], token: rule.token[j - 1]}); | ||
- stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); | ||
- return rule.token[0]; | ||
- } else if (rule.token && rule.token.join) { | ||
- return rule.token[0]; | ||
- } else { | ||
- return rule.token; | ||
- } | ||
- } | ||
- } | ||
- stream.next(); | ||
- return null; | ||
- }; | ||
- } | ||
- | ||
- function cmp(a, b) { | ||
- if (a === b) return true; | ||
- if (!a || typeof a != "object" || !b || typeof b != "object") return false; | ||
- var props = 0; | ||
- for (var prop in a) if (a.hasOwnProperty(prop)) { | ||
- if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; | ||
- props++; | ||
- } | ||
- for (var prop in b) if (b.hasOwnProperty(prop)) props--; | ||
- return props == 0; | ||
- } | ||
- | ||
- function enterLocalMode(config, state, spec, token) { | ||
- var pers; | ||
- if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next) | ||
- if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; | ||
- var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); | ||
- var lState = pers ? pers.state : CodeMirror.startState(mode); | ||
- if (spec.persistent && !pers) | ||
- state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates}; | ||
- | ||
- state.localState = lState; | ||
- state.local = {mode: mode, | ||
- end: spec.end && toRegex(spec.end), | ||
- endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), | ||
- endToken: token && token.join ? token[token.length - 1] : token}; | ||
- } | ||
- | ||
- function indexOf(val, arr) { | ||
- for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true; | ||
- } | ||
- | ||
- function indentFunction(states, meta) { | ||
- return function(state, textAfter, line) { | ||
- if (state.local && state.local.mode.indent) | ||
- return state.local.mode.indent(state.localState, textAfter, line); | ||
- if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1) | ||
- return CodeMirror.Pass; | ||
- | ||
- var pos = state.indent.length - 1, rules = states[state.state]; | ||
- scan: for (;;) { | ||
- for (var i = 0; i < rules.length; i++) { | ||
- var rule = rules[i]; | ||
- if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { | ||
- var m = rule.regex.exec(textAfter); | ||
- if (m && m[0]) { | ||
- pos--; | ||
- if (rule.next || rule.push) rules = states[rule.next || rule.push]; | ||
- textAfter = textAfter.slice(m[0].length); | ||
- continue scan; | ||
- } | ||
- } | ||
- } | ||
- break; | ||
- } | ||
- return pos < 0 ? 0 : state.indent[pos]; | ||
- }; | ||
- } | ||
-}); |
40
public/js/lib/codemirror/addon/runmode/colorize.js
@@ -1,40 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("./runmode")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "./runmode"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/; | ||
- | ||
- function textContent(node, out) { | ||
- if (node.nodeType == 3) return out.push(node.nodeValue); | ||
- for (var ch = node.firstChild; ch; ch = ch.nextSibling) { | ||
- textContent(ch, out); | ||
- if (isBlock.test(node.nodeType)) out.push("\n"); | ||
- } | ||
- } | ||
- | ||
- CodeMirror.colorize = function(collection, defaultMode) { | ||
- if (!collection) collection = document.body.getElementsByTagName("pre"); | ||
- | ||
- for (var i = 0; i < collection.length; ++i) { | ||
- var node = collection[i]; | ||
- var mode = node.getAttribute("data-lang") || defaultMode; | ||
- if (!mode) continue; | ||
- | ||
- var text = []; | ||
- textContent(node, text); | ||
- node.innerHTML = ""; | ||
- CodeMirror.runMode(text.join(""), mode, node); | ||
- | ||
- node.className += " cm-s-default"; | ||
- } | ||
- }; | ||
-}); |
157
public/js/lib/codemirror/addon/runmode/runmode-standalone.js
@@ -1,157 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-window.CodeMirror = {}; | ||
- | ||
-(function() { | ||
-"use strict"; | ||
- | ||
-function splitLines(string){ return string.split(/\r?\n|\r/); }; | ||
- | ||
-function StringStream(string) { | ||
- this.pos = this.start = 0; | ||
- this.string = string; | ||
- this.lineStart = 0; | ||
-} | ||
-StringStream.prototype = { | ||
- eol: function() {return this.pos >= this.string.length;}, | ||
- sol: function() {return this.pos == 0;}, | ||
- peek: function() {return this.string.charAt(this.pos) || null;}, | ||
- next: function() { | ||
- if (this.pos < this.string.length) | ||
- return this.string.charAt(this.pos++); | ||
- }, | ||
- eat: function(match) { | ||
- var ch = this.string.charAt(this.pos); | ||
- if (typeof match == "string") var ok = ch == match; | ||
- else var ok = ch && (match.test ? match.test(ch) : match(ch)); | ||
- if (ok) {++this.pos; return ch;} | ||
- }, | ||
- eatWhile: function(match) { | ||
- var start = this.pos; | ||
- while (this.eat(match)){} | ||
- return this.pos > start; | ||
- }, | ||
- eatSpace: function() { | ||
- var start = this.pos; | ||
- while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; | ||
- return this.pos > start; | ||
- }, | ||
- skipToEnd: function() {this.pos = this.string.length;}, | ||
- skipTo: function(ch) { | ||
- var found = this.string.indexOf(ch, this.pos); | ||
- if (found > -1) {this.pos = found; return true;} | ||
- }, | ||
- backUp: function(n) {this.pos -= n;}, | ||
- column: function() {return this.start - this.lineStart;}, | ||
- indentation: function() {return 0;}, | ||
- match: function(pattern, consume, caseInsensitive) { | ||
- if (typeof pattern == "string") { | ||
- var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; | ||
- var substr = this.string.substr(this.pos, pattern.length); | ||
- if (cased(substr) == cased(pattern)) { | ||
- if (consume !== false) this.pos += pattern.length; | ||
- return true; | ||
- } | ||
- } else { | ||
- var match = this.string.slice(this.pos).match(pattern); | ||
- if (match && match.index > 0) return null; | ||
- if (match && consume !== false) this.pos += match[0].length; | ||
- return match; | ||
- } | ||
- }, | ||
- current: function(){return this.string.slice(this.start, this.pos);}, | ||
- hideFirstChars: function(n, inner) { | ||
- this.lineStart += n; | ||
- try { return inner(); } | ||
- finally { this.lineStart -= n; } | ||
- } | ||
-}; | ||
-CodeMirror.StringStream = StringStream; | ||
- | ||
-CodeMirror.startState = function (mode, a1, a2) { | ||
- return mode.startState ? mode.startState(a1, a2) : true; | ||
-}; | ||
- | ||
-var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; | ||
-CodeMirror.defineMode = function (name, mode) { | ||
- if (arguments.length > 2) | ||
- mode.dependencies = Array.prototype.slice.call(arguments, 2); | ||
- modes[name] = mode; | ||
-}; | ||
-CodeMirror.defineMIME = function (mime, spec) { mimeModes[mime] = spec; }; | ||
-CodeMirror.resolveMode = function(spec) { | ||
- if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { | ||
- spec = mimeModes[spec]; | ||
- } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { | ||
- spec = mimeModes[spec.name]; | ||
- } | ||
- if (typeof spec == "string") return {name: spec}; | ||
- else return spec || {name: "null"}; | ||
-}; | ||
-CodeMirror.getMode = function (options, spec) { | ||
- spec = CodeMirror.resolveMode(spec); | ||
- var mfactory = modes[spec.name]; | ||
- if (!mfactory) throw new Error("Unknown mode: " + spec); | ||
- return mfactory(options, spec); | ||
-}; | ||
-CodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min; | ||
-CodeMirror.defineMode("null", function() { | ||
- return {token: function(stream) {stream.skipToEnd();}}; | ||
-}); | ||
-CodeMirror.defineMIME("text/plain", "null"); | ||
- | ||
-CodeMirror.runMode = function (string, modespec, callback, options) { | ||
- var mode = CodeMirror.getMode({ indentUnit: 2 }, modespec); | ||
- | ||
- if (callback.nodeType == 1) { | ||
- var tabSize = (options && options.tabSize) || 4; | ||
- var node = callback, col = 0; | ||
- node.innerHTML = ""; | ||
- callback = function (text, style) { | ||
- if (text == "\n") { | ||
- node.appendChild(document.createElement("br")); | ||
- col = 0; | ||
- return; | ||
- } | ||
- var content = ""; | ||
- // replace tabs | ||
- for (var pos = 0; ;) { | ||
- var idx = text.indexOf("\t", pos); | ||
- if (idx == -1) { | ||
- content += text.slice(pos); | ||
- col += text.length - pos; | ||
- break; | ||
- } else { | ||
- col += idx - pos; | ||
- content += text.slice(pos, idx); | ||
- var size = tabSize - col % tabSize; | ||
- col += size; | ||
- for (var i = 0; i < size; ++i) content += " "; | ||
- pos = idx + 1; | ||
- } | ||
- } | ||
- | ||
- if (style) { | ||
- var sp = node.appendChild(document.createElement("span")); | ||
- sp.className = "cm-" + style.replace(/ +/g, " cm-"); | ||
- sp.appendChild(document.createTextNode(content)); | ||
- } else { | ||
- node.appendChild(document.createTextNode(content)); | ||
- } | ||
- }; | ||
- } | ||
- | ||
- var lines = splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); | ||
- for (var i = 0, e = lines.length; i < e; ++i) { | ||
- if (i) callback("\n"); | ||
- var stream = new CodeMirror.StringStream(lines[i]); | ||
- if (!stream.string && mode.blankLine) mode.blankLine(state); | ||
- while (!stream.eol()) { | ||
- var style = mode.token(stream, state); | ||
- callback(stream.current(), style, i, stream.start, state); | ||
- stream.start = stream.pos; | ||
- } | ||
- } | ||
-}; | ||
-})(); |
72
public/js/lib/codemirror/addon/runmode/runmode.js
@@ -1,72 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
-"use strict"; | ||
- | ||
-CodeMirror.runMode = function(string, modespec, callback, options) { | ||
- var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); | ||
- var ie = /MSIE \d/.test(navigator.userAgent); | ||
- var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); | ||
- | ||
- if (callback.nodeType == 1) { | ||
- var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; | ||
- var node = callback, col = 0; | ||
- node.innerHTML = ""; | ||
- callback = function(text, style) { | ||
- if (text == "\n") { | ||
- // Emitting LF or CRLF on IE8 or earlier results in an incorrect display. | ||
- // Emitting a carriage return makes everything ok. | ||
- node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text)); | ||
- col = 0; | ||
- return; | ||
- } | ||
- var content = ""; | ||
- // replace tabs | ||
- for (var pos = 0;;) { | ||
- var idx = text.indexOf("\t", pos); | ||
- if (idx == -1) { | ||
- content += text.slice(pos); | ||
- col += text.length - pos; | ||
- break; | ||
- } else { | ||
- col += idx - pos; | ||
- content += text.slice(pos, idx); | ||
- var size = tabSize - col % tabSize; | ||
- col += size; | ||
- for (var i = 0; i < size; ++i) content += " "; | ||
- pos = idx + 1; | ||
- } | ||
- } | ||
- | ||
- if (style) { | ||
- var sp = node.appendChild(document.createElement("span")); | ||
- sp.className = "cm-" + style.replace(/ +/g, " cm-"); | ||
- sp.appendChild(document.createTextNode(content)); | ||
- } else { | ||
- node.appendChild(document.createTextNode(content)); | ||
- } | ||
- }; | ||
- } | ||
- | ||
- var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); | ||
- for (var i = 0, e = lines.length; i < e; ++i) { | ||
- if (i) callback("\n"); | ||
- var stream = new CodeMirror.StringStream(lines[i]); | ||
- if (!stream.string && mode.blankLine) mode.blankLine(state); | ||
- while (!stream.eol()) { | ||
- var style = mode.token(stream, state); | ||
- callback(stream.current(), style, i, stream.start, state); | ||
- stream.start = stream.pos; | ||
- } | ||
- } | ||
-}; | ||
- | ||
-}); |
120
public/js/lib/codemirror/addon/runmode/runmode.node.js
@@ -1,120 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-/* Just enough of CodeMirror to run runMode under node.js */ | ||
- | ||
-// declare global: StringStream | ||
- | ||
-function splitLines(string){ return string.split(/\r?\n|\r/); }; | ||
- | ||
-function StringStream(string) { | ||
- this.pos = this.start = 0; | ||
- this.string = string; | ||
- this.lineStart = 0; | ||
-} | ||
-StringStream.prototype = { | ||
- eol: function() {return this.pos >= this.string.length;}, | ||
- sol: function() {return this.pos == 0;}, | ||
- peek: function() {return this.string.charAt(this.pos) || null;}, | ||
- next: function() { | ||
- if (this.pos < this.string.length) | ||
- return this.string.charAt(this.pos++); | ||
- }, | ||
- eat: function(match) { | ||
- var ch = this.string.charAt(this.pos); | ||
- if (typeof match == "string") var ok = ch == match; | ||
- else var ok = ch && (match.test ? match.test(ch) : match(ch)); | ||
- if (ok) {++this.pos; return ch;} | ||
- }, | ||
- eatWhile: function(match) { | ||
- var start = this.pos; | ||
- while (this.eat(match)){} | ||
- return this.pos > start; | ||
- }, | ||
- eatSpace: function() { | ||
- var start = this.pos; | ||
- while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; | ||
- return this.pos > start; | ||
- }, | ||
- skipToEnd: function() {this.pos = this.string.length;}, | ||
- skipTo: function(ch) { | ||
- var found = this.string.indexOf(ch, this.pos); | ||
- if (found > -1) {this.pos = found; return true;} | ||
- }, | ||
- backUp: function(n) {this.pos -= n;}, | ||
- column: function() {return this.start - this.lineStart;}, | ||
- indentation: function() {return 0;}, | ||
- match: function(pattern, consume, caseInsensitive) { | ||
- if (typeof pattern == "string") { | ||
- var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; | ||
- var substr = this.string.substr(this.pos, pattern.length); | ||
- if (cased(substr) == cased(pattern)) { | ||
- if (consume !== false) this.pos += pattern.length; | ||
- return true; | ||
- } | ||
- } else { | ||
- var match = this.string.slice(this.pos).match(pattern); | ||
- if (match && match.index > 0) return null; | ||
- if (match && consume !== false) this.pos += match[0].length; | ||
- return match; | ||
- } | ||
- }, | ||
- current: function(){return this.string.slice(this.start, this.pos);}, | ||
- hideFirstChars: function(n, inner) { | ||
- this.lineStart += n; | ||
- try { return inner(); } | ||
- finally { this.lineStart -= n; } | ||
- } | ||
-}; | ||
-exports.StringStream = StringStream; | ||
- | ||
-exports.startState = function(mode, a1, a2) { | ||
- return mode.startState ? mode.startState(a1, a2) : true; | ||
-}; | ||
- | ||
-var modes = exports.modes = {}, mimeModes = exports.mimeModes = {}; | ||
-exports.defineMode = function(name, mode) { | ||
- if (arguments.length > 2) | ||
- mode.dependencies = Array.prototype.slice.call(arguments, 2); | ||
- modes[name] = mode; | ||
-}; | ||
-exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; | ||
- | ||
-exports.defineMode("null", function() { | ||
- return {token: function(stream) {stream.skipToEnd();}}; | ||
-}); | ||
-exports.defineMIME("text/plain", "null"); | ||
- | ||
-exports.resolveMode = function(spec) { | ||
- if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { | ||
- spec = mimeModes[spec]; | ||
- } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { | ||
- spec = mimeModes[spec.name]; | ||
- } | ||
- if (typeof spec == "string") return {name: spec}; | ||
- else return spec || {name: "null"}; | ||
-}; | ||
-exports.getMode = function(options, spec) { | ||
- spec = exports.resolveMode(spec); | ||
- var mfactory = modes[spec.name]; | ||
- if (!mfactory) throw new Error("Unknown mode: " + spec); | ||
- return mfactory(options, spec); | ||
-}; | ||
-exports.registerHelper = exports.registerGlobalHelper = Math.min; | ||
- | ||
-exports.runMode = function(string, modespec, callback, options) { | ||
- var mode = exports.getMode({indentUnit: 2}, modespec); | ||
- var lines = splitLines(string), state = (options && options.state) || exports.startState(mode); | ||
- for (var i = 0, e = lines.length; i < e; ++i) { | ||
- if (i) callback("\n"); | ||
- var stream = new exports.StringStream(lines[i]); | ||
- if (!stream.string && mode.blankLine) mode.blankLine(state); | ||
- while (!stream.eol()) { | ||
- var style = mode.token(stream, state); | ||
- callback(stream.current(), style, i, stream.start, state); | ||
- stream.start = stream.pos; | ||
- } | ||
- } | ||
-}; | ||
- | ||
-require.cache[require.resolve("../../lib/codemirror")] = require.cache[require.resolve("./runmode.node")]; |
76
public/js/lib/codemirror/addon/scroll/annotatescrollbar.js
@@ -1,76 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineExtension("annotateScrollbar", function(className) { | ||
- return new Annotation(this, className); | ||
- }); | ||
- | ||
- function Annotation(cm, className) { | ||
- this.cm = cm; | ||
- this.className = className; | ||
- this.annotations = []; | ||
- this.div = cm.getWrapperElement().appendChild(document.createElement("div")); | ||
- this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none"; | ||
- this.computeScale(); | ||
- | ||
- var self = this; | ||
- cm.on("refresh", this.resizeHandler = function(){ | ||
- if (self.computeScale()) self.redraw(); | ||
- }); | ||
- } | ||
- | ||
- Annotation.prototype.computeScale = function() { | ||
- var cm = this.cm; | ||
- var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight) / | ||
- cm.heightAtLine(cm.lastLine() + 1, "local"); | ||
- if (hScale != this.hScale) { | ||
- this.hScale = hScale; | ||
- return true; | ||
- } | ||
- }; | ||
- | ||
- Annotation.prototype.update = function(annotations) { | ||
- this.annotations = annotations; | ||
- this.redraw(); | ||
- }; | ||
- | ||
- Annotation.prototype.redraw = function() { | ||
- var cm = this.cm, hScale = this.hScale; | ||
- if (!cm.display.barWidth) return; | ||
- | ||
- var frag = document.createDocumentFragment(), anns = this.annotations; | ||
- for (var i = 0, nextTop; i < anns.length; i++) { | ||
- var ann = anns[i]; | ||
- var top = nextTop || cm.charCoords(ann.from, "local").top * hScale; | ||
- var bottom = cm.charCoords(ann.to, "local").bottom * hScale; | ||
- while (i < anns.length - 1) { | ||
- nextTop = cm.charCoords(anns[i + 1].from, "local").top * hScale; | ||
- if (nextTop > bottom + .9) break; | ||
- ann = anns[++i]; | ||
- bottom = cm.charCoords(ann.to, "local").bottom * hScale; | ||
- } | ||
- var height = Math.max(bottom - top, 3); | ||
- | ||
- var elt = frag.appendChild(document.createElement("div")); | ||
- elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " + top + "px; height: " + height + "px"; | ||
- elt.className = this.className; | ||
- } | ||
- this.div.textContent = ""; | ||
- this.div.appendChild(frag); | ||
- }; | ||
- | ||
- Annotation.prototype.clear = function() { | ||
- this.cm.off("refresh", this.resizeHandler); | ||
- this.div.parentNode.removeChild(this.div); | ||
- }; | ||
-}); |
46
public/js/lib/codemirror/addon/scroll/scrollpastend.js
@@ -1,46 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) { | ||
- if (old && old != CodeMirror.Init) { | ||
- cm.off("change", onChange); | ||
- cm.off("refresh", updateBottomMargin); | ||
- cm.display.lineSpace.parentNode.style.paddingBottom = ""; | ||
- cm.state.scrollPastEndPadding = null; | ||
- } | ||
- if (val) { | ||
- cm.on("change", onChange); | ||
- cm.on("refresh", updateBottomMargin); | ||
- updateBottomMargin(cm); | ||
- } | ||
- }); | ||
- | ||
- function onChange(cm, change) { | ||
- if (CodeMirror.changeEnd(change).line == cm.lastLine()) | ||
- updateBottomMargin(cm); | ||
- } | ||
- | ||
- function updateBottomMargin(cm) { | ||
- var padding = ""; | ||
- if (cm.lineCount() > 1) { | ||
- var totalH = cm.display.scroller.clientHeight - 30, | ||
- lastLineH = cm.getLineHandle(cm.lastLine()).height; | ||
- padding = (totalH - lastLineH) + "px"; | ||
- } | ||
- if (cm.state.scrollPastEndPadding != padding) { | ||
- cm.state.scrollPastEndPadding = padding; | ||
- cm.display.lineSpace.parentNode.style.paddingBottom = padding; | ||
- cm.setSize(); | ||
- } | ||
- } | ||
-}); |
66
public/js/lib/codemirror/addon/scroll/simplescrollbars.css
@@ -1,66 +0,0 @@ | ||
-.CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div { | ||
- position: absolute; | ||
- background: #ccc; | ||
- -moz-box-sizing: border-box; | ||
- box-sizing: border-box; | ||
- border: 1px solid #bbb; | ||
- border-radius: 2px; | ||
-} | ||
- | ||
-.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical { | ||
- position: absolute; | ||
- z-index: 6; | ||
- background: #eee; | ||
-} | ||
- | ||
-.CodeMirror-simplescroll-horizontal { | ||
- bottom: 0; left: 0; | ||
- height: 8px; | ||
-} | ||
-.CodeMirror-simplescroll-horizontal div { | ||
- bottom: 0; | ||
- height: 100%; | ||
-} | ||
- | ||
-.CodeMirror-simplescroll-vertical { | ||
- right: 0; top: 0; | ||
- width: 8px; | ||
-} | ||
-.CodeMirror-simplescroll-vertical div { | ||
- right: 0; | ||
- width: 100%; | ||
-} | ||
- | ||
- | ||
-.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler { | ||
- display: none; | ||
-} | ||
- | ||
-.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { | ||
- position: absolute; | ||
- background: #bcd; | ||
- border-radius: 3px; | ||
-} | ||
- | ||
-.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical { | ||
- position: absolute; | ||
- z-index: 6; | ||
-} | ||
- | ||
-.CodeMirror-overlayscroll-horizontal { | ||
- bottom: 0; left: 0; | ||
- height: 6px; | ||
-} | ||
-.CodeMirror-overlayscroll-horizontal div { | ||
- bottom: 0; | ||
- height: 100%; | ||
-} | ||
- | ||
-.CodeMirror-overlayscroll-vertical { | ||
- right: 0; top: 0; | ||
- width: 6px; | ||
-} | ||
-.CodeMirror-overlayscroll-vertical div { | ||
- right: 0; | ||
- width: 100%; | ||
-} |
139
public/js/lib/codemirror/addon/scroll/simplescrollbars.js
@@ -1,139 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- function Bar(cls, orientation, scroll) { | ||
- this.orientation = orientation; | ||
- this.scroll = scroll; | ||
- this.screen = this.total = this.size = 1; | ||
- this.pos = 0; | ||
- | ||
- this.node = document.createElement("div"); | ||
- this.node.className = cls + "-" + orientation; | ||
- this.inner = this.node.appendChild(document.createElement("div")); | ||
- | ||
- var self = this; | ||
- CodeMirror.on(this.inner, "mousedown", function(e) { | ||
- if (e.which != 1) return; | ||
- CodeMirror.e_preventDefault(e); | ||
- var axis = self.orientation == "horizontal" ? "pageX" : "pageY"; | ||
- var start = e[axis], startpos = self.pos; | ||
- function move(e) { | ||
- if (e.which != 1) { | ||
- CodeMirror.off(document, "mousemove", move); | ||
- return; | ||
- } | ||
- self.moveTo(startpos + (e[axis] - start) * (self.total / self.size)); | ||
- } | ||
- CodeMirror.on(document, "mousemove", move); | ||
- }); | ||
- | ||
- CodeMirror.on(this.node, "click", function(e) { | ||
- CodeMirror.e_preventDefault(e); | ||
- var innerBox = self.inner.getBoundingClientRect(), where; | ||
- if (self.orientation == "horizontal") | ||
- where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0; | ||
- else | ||
- where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0; | ||
- self.moveTo(self.pos + where * self.screen); | ||
- }); | ||
- | ||
- function onWheel(e) { | ||
- var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"]; | ||
- var oldPos = self.pos; | ||
- self.moveTo(self.pos + moved); | ||
- if (self.pos != oldPos) CodeMirror.e_preventDefault(e); | ||
- } | ||
- CodeMirror.on(this.node, "mousewheel", onWheel); | ||
- CodeMirror.on(this.node, "DOMMouseScroll", onWheel); | ||
- } | ||
- | ||
- Bar.prototype.moveTo = function(pos, update) { | ||
- if (pos < 0) pos = 0; | ||
- if (pos > this.total - this.screen) pos = this.total - this.screen; | ||
- if (pos == this.pos) return; | ||
- this.pos = pos; | ||
- this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = | ||
- (pos * (this.size / this.total)) + "px"; | ||
- if (update !== false) this.scroll(pos, this.orientation); | ||
- }; | ||
- | ||
- Bar.prototype.update = function(scrollSize, clientSize, barSize) { | ||
- this.screen = clientSize; | ||
- this.total = scrollSize; | ||
- this.size = barSize; | ||
- | ||
- // FIXME clip to min size? | ||
- this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = | ||
- this.screen * (this.size / this.total) + "px"; | ||
- this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = | ||
- this.pos * (this.size / this.total) + "px"; | ||
- }; | ||
- | ||
- function SimpleScrollbars(cls, place, scroll) { | ||
- this.addClass = cls; | ||
- this.horiz = new Bar(cls, "horizontal", scroll); | ||
- place(this.horiz.node); | ||
- this.vert = new Bar(cls, "vertical", scroll); | ||
- place(this.vert.node); | ||
- this.width = null; | ||
- } | ||
- | ||
- SimpleScrollbars.prototype.update = function(measure) { | ||
- if (this.width == null) { | ||
- var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle; | ||
- if (style) this.width = parseInt(style.height); | ||
- } | ||
- var width = this.width || 0; | ||
- | ||
- var needsH = measure.scrollWidth > measure.clientWidth + 1; | ||
- var needsV = measure.scrollHeight > measure.clientHeight + 1; | ||
- this.vert.node.style.display = needsV ? "block" : "none"; | ||
- this.horiz.node.style.display = needsH ? "block" : "none"; | ||
- | ||
- if (needsV) { | ||
- this.vert.update(measure.scrollHeight, measure.clientHeight, | ||
- measure.viewHeight - (needsH ? width : 0)); | ||
- this.vert.node.style.display = "block"; | ||
- this.vert.node.style.bottom = needsH ? width + "px" : "0"; | ||
- } | ||
- if (needsH) { | ||
- this.horiz.update(measure.scrollWidth, measure.clientWidth, | ||
- measure.viewWidth - (needsV ? width : 0) - measure.barLeft); | ||
- this.horiz.node.style.right = needsV ? width + "px" : "0"; | ||
- this.horiz.node.style.left = measure.barLeft + "px"; | ||
- } | ||
- | ||
- return {right: needsV ? width : 0, bottom: needsH ? width : 0}; | ||
- }; | ||
- | ||
- SimpleScrollbars.prototype.setScrollTop = function(pos) { | ||
- this.vert.moveTo(pos, false); | ||
- }; | ||
- | ||
- SimpleScrollbars.prototype.setScrollLeft = function(pos) { | ||
- this.horiz.moveTo(pos, false); | ||
- }; | ||
- | ||
- SimpleScrollbars.prototype.clear = function() { | ||
- var parent = this.horiz.node.parentNode; | ||
- parent.removeChild(this.horiz.node); | ||
- parent.removeChild(this.vert.node); | ||
- }; | ||
- | ||
- CodeMirror.scrollbarModel.simple = function(place, scroll) { | ||
- return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll); | ||
- }; | ||
- CodeMirror.scrollbarModel.overlay = function(place, scroll) { | ||
- return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll); | ||
- }; | ||
-}); |
128
public/js/lib/codemirror/addon/search/match-highlighter.js
@@ -1,128 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Highlighting text that matches the selection | ||
-// | ||
-// Defines an option highlightSelectionMatches, which, when enabled, | ||
-// will style strings that match the selection throughout the | ||
-// document. | ||
-// | ||
-// The option can be set to true to simply enable it, or to a | ||
-// {minChars, style, wordsOnly, showToken, delay} object to explicitly | ||
-// configure it. minChars is the minimum amount of characters that should be | ||
-// selected for the behavior to occur, and style is the token style to | ||
-// apply to the matches. This will be prefixed by "cm-" to create an | ||
-// actual CSS class name. If wordsOnly is enabled, the matches will be | ||
-// highlighted only if the selected text is a word. showToken, when enabled, | ||
-// will cause the current token to be highlighted when nothing is selected. | ||
-// delay is used to specify how much time to wait, in milliseconds, before | ||
-// highlighting the matches. | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var DEFAULT_MIN_CHARS = 2; | ||
- var DEFAULT_TOKEN_STYLE = "matchhighlight"; | ||
- var DEFAULT_DELAY = 100; | ||
- var DEFAULT_WORDS_ONLY = false; | ||
- | ||
- function State(options) { | ||
- if (typeof options == "object") { | ||
- this.minChars = options.minChars; | ||
- this.style = options.style; | ||
- this.showToken = options.showToken; | ||
- this.delay = options.delay; | ||
- this.wordsOnly = options.wordsOnly; | ||
- } | ||
- if (this.style == null) this.style = DEFAULT_TOKEN_STYLE; | ||
- if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS; | ||
- if (this.delay == null) this.delay = DEFAULT_DELAY; | ||
- if (this.wordsOnly == null) this.wordsOnly = DEFAULT_WORDS_ONLY; | ||
- this.overlay = this.timeout = null; | ||
- } | ||
- | ||
- CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) { | ||
- if (old && old != CodeMirror.Init) { | ||
- var over = cm.state.matchHighlighter.overlay; | ||
- if (over) cm.removeOverlay(over); | ||
- clearTimeout(cm.state.matchHighlighter.timeout); | ||
- cm.state.matchHighlighter = null; | ||
- cm.off("cursorActivity", cursorActivity); | ||
- } | ||
- if (val) { | ||
- cm.state.matchHighlighter = new State(val); | ||
- highlightMatches(cm); | ||
- cm.on("cursorActivity", cursorActivity); | ||
- } | ||
- }); | ||
- | ||
- function cursorActivity(cm) { | ||
- var state = cm.state.matchHighlighter; | ||
- clearTimeout(state.timeout); | ||
- state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay); | ||
- } | ||
- | ||
- function highlightMatches(cm) { | ||
- cm.operation(function() { | ||
- var state = cm.state.matchHighlighter; | ||
- if (state.overlay) { | ||
- cm.removeOverlay(state.overlay); | ||
- state.overlay = null; | ||
- } | ||
- if (!cm.somethingSelected() && state.showToken) { | ||
- var re = state.showToken === true ? /[\w$]/ : state.showToken; | ||
- var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start; | ||
- while (start && re.test(line.charAt(start - 1))) --start; | ||
- while (end < line.length && re.test(line.charAt(end))) ++end; | ||
- if (start < end) | ||
- cm.addOverlay(state.overlay = makeOverlay(line.slice(start, end), re, state.style)); | ||
- return; | ||
- } | ||
- var from = cm.getCursor("from"), to = cm.getCursor("to"); | ||
- if (from.line != to.line) return; | ||
- if (state.wordsOnly && !isWord(cm, from, to)) return; | ||
- var selection = cm.getRange(from, to).replace(/^\s+|\s+$/g, ""); | ||
- if (selection.length >= state.minChars) | ||
- cm.addOverlay(state.overlay = makeOverlay(selection, false, state.style)); | ||
- }); | ||
- } | ||
- | ||
- function isWord(cm, from, to) { | ||
- var str = cm.getRange(from, to); | ||
- if (str.match(/^\w+$/) !== null) { | ||
- if (from.ch > 0) { | ||
- var pos = {line: from.line, ch: from.ch - 1}; | ||
- var chr = cm.getRange(pos, from); | ||
- if (chr.match(/\W/) === null) return false; | ||
- } | ||
- if (to.ch < cm.getLine(from.line).length) { | ||
- var pos = {line: to.line, ch: to.ch + 1}; | ||
- var chr = cm.getRange(to, pos); | ||
- if (chr.match(/\W/) === null) return false; | ||
- } | ||
- return true; | ||
- } else return false; | ||
- } | ||
- | ||
- function boundariesAround(stream, re) { | ||
- return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && | ||
- (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); | ||
- } | ||
- | ||
- function makeOverlay(query, hasBoundary, style) { | ||
- return {token: function(stream) { | ||
- if (stream.match(query) && | ||
- (!hasBoundary || boundariesAround(stream, hasBoundary))) | ||
- return style; | ||
- stream.next(); | ||
- stream.skipTo(query.charAt(0)) || stream.skipToEnd(); | ||
- }}; | ||
- } | ||
-}); |
8
public/js/lib/codemirror/addon/search/matchesonscrollbar.css
@@ -1,8 +0,0 @@ | ||
-.CodeMirror-search-match { | ||
- background: gold; | ||
- border-top: 1px solid orange; | ||
- border-bottom: 1px solid orange; | ||
- -moz-box-sizing: border-box; | ||
- box-sizing: border-box; | ||
- opacity: .5; | ||
-} |
90
public/js/lib/codemirror/addon/search/matchesonscrollbar.js
@@ -1,90 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, className) { | ||
- return new SearchAnnotation(this, query, caseFold, className); | ||
- }); | ||
- | ||
- function SearchAnnotation(cm, query, caseFold, className) { | ||
- this.cm = cm; | ||
- this.annotation = cm.annotateScrollbar(className || "CodeMirror-search-match"); | ||
- this.query = query; | ||
- this.caseFold = caseFold; | ||
- this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1}; | ||
- this.matches = []; | ||
- this.update = null; | ||
- | ||
- this.findMatches(); | ||
- this.annotation.update(this.matches); | ||
- | ||
- var self = this; | ||
- cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); }); | ||
- } | ||
- | ||
- var MAX_MATCHES = 1000; | ||
- | ||
- SearchAnnotation.prototype.findMatches = function() { | ||
- if (!this.gap) return; | ||
- for (var i = 0; i < this.matches.length; i++) { | ||
- var match = this.matches[i]; | ||
- if (match.from.line >= this.gap.to) break; | ||
- if (match.to.line >= this.gap.from) this.matches.splice(i--, 1); | ||
- } | ||
- var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), this.caseFold); | ||
- while (cursor.findNext()) { | ||
- var match = {from: cursor.from(), to: cursor.to()}; | ||
- if (match.from.line >= this.gap.to) break; | ||
- this.matches.splice(i++, 0, match); | ||
- if (this.matches.length > MAX_MATCHES) break; | ||
- } | ||
- this.gap = null; | ||
- }; | ||
- | ||
- function offsetLine(line, changeStart, sizeChange) { | ||
- if (line <= changeStart) return line; | ||
- return Math.max(changeStart, line + sizeChange); | ||
- } | ||
- | ||
- SearchAnnotation.prototype.onChange = function(change) { | ||
- var startLine = change.from.line; | ||
- var endLine = CodeMirror.changeEnd(change).line; | ||
- var sizeChange = endLine - change.to.line; | ||
- if (this.gap) { | ||
- this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line); | ||
- this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line); | ||
- } else { | ||
- this.gap = {from: change.from.line, to: endLine + 1}; | ||
- } | ||
- | ||
- if (sizeChange) for (var i = 0; i < this.matches.length; i++) { | ||
- var match = this.matches[i]; | ||
- var newFrom = offsetLine(match.from.line, startLine, sizeChange); | ||
- if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch); | ||
- var newTo = offsetLine(match.to.line, startLine, sizeChange); | ||
- if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch); | ||
- } | ||
- clearTimeout(this.update); | ||
- var self = this; | ||
- this.update = setTimeout(function() { self.updateAfterChange(); }, 250); | ||
- }; | ||
- | ||
- SearchAnnotation.prototype.updateAfterChange = function() { | ||
- this.findMatches(); | ||
- this.annotation.update(this.matches); | ||
- }; | ||
- | ||
- SearchAnnotation.prototype.clear = function() { | ||
- this.cm.off("change", this.changeHandler); | ||
- this.annotation.clear(); | ||
- }; | ||
-}); |
164
public/js/lib/codemirror/addon/search/search.js
@@ -1,164 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Define search commands. Depends on dialog.js or another | ||
-// implementation of the openDialog method. | ||
- | ||
-// Replace works a little oddly -- it will do the replace on the next | ||
-// Ctrl-G (or whatever is bound to findNext) press. You prevent a | ||
-// replace by making sure the match is no longer selected when hitting | ||
-// Ctrl-G. | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- function searchOverlay(query, caseInsensitive) { | ||
- if (typeof query == "string") | ||
- query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g"); | ||
- else if (!query.global) | ||
- query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); | ||
- | ||
- return {token: function(stream) { | ||
- query.lastIndex = stream.pos; | ||
- var match = query.exec(stream.string); | ||
- if (match && match.index == stream.pos) { | ||
- stream.pos += match[0].length; | ||
- return "searching"; | ||
- } else if (match) { | ||
- stream.pos = match.index; | ||
- } else { | ||
- stream.skipToEnd(); | ||
- } | ||
- }}; | ||
- } | ||
- | ||
- function SearchState() { | ||
- this.posFrom = this.posTo = this.query = null; | ||
- this.overlay = null; | ||
- } | ||
- function getSearchState(cm) { | ||
- return cm.state.search || (cm.state.search = new SearchState()); | ||
- } | ||
- function queryCaseInsensitive(query) { | ||
- return typeof query == "string" && query == query.toLowerCase(); | ||
- } | ||
- function getSearchCursor(cm, query, pos) { | ||
- // Heuristic: if the query string is all lowercase, do a case insensitive search. | ||
- return cm.getSearchCursor(query, pos, queryCaseInsensitive(query)); | ||
- } | ||
- function dialog(cm, text, shortText, deflt, f) { | ||
- if (cm.openDialog) cm.openDialog(text, f, {value: deflt}); | ||
- else f(prompt(shortText, deflt)); | ||
- } | ||
- function confirmDialog(cm, text, shortText, fs) { | ||
- if (cm.openConfirm) cm.openConfirm(text, fs); | ||
- else if (confirm(shortText)) fs[0](); | ||
- } | ||
- function parseQuery(query) { | ||
- var isRE = query.match(/^\/(.*)\/([a-z]*)$/); | ||
- if (isRE) { | ||
- try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); } | ||
- catch(e) {} // Not a regular expression after all, do a string search | ||
- } | ||
- if (typeof query == "string" ? query == "" : query.test("")) | ||
- query = /x^/; | ||
- return query; | ||
- } | ||
- var queryDialog = | ||
- 'Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>'; | ||
- function doSearch(cm, rev) { | ||
- var state = getSearchState(cm); | ||
- if (state.query) return findNext(cm, rev); | ||
- dialog(cm, queryDialog, "Search for:", cm.getSelection(), function(query) { | ||
- cm.operation(function() { | ||
- if (!query || state.query) return; | ||
- state.query = parseQuery(query); | ||
- cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); | ||
- state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); | ||
- cm.addOverlay(state.overlay); | ||
- if (cm.showMatchesOnScrollbar) { | ||
- if (state.annotate) { state.annotate.clear(); state.annotate = null; } | ||
- state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); | ||
- } | ||
- state.posFrom = state.posTo = cm.getCursor(); | ||
- findNext(cm, rev); | ||
- }); | ||
- }); | ||
- } | ||
- function findNext(cm, rev) {cm.operation(function() { | ||
- var state = getSearchState(cm); | ||
- var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); | ||
- if (!cursor.find(rev)) { | ||
- cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); | ||
- if (!cursor.find(rev)) return; | ||
- } | ||
- cm.setSelection(cursor.from(), cursor.to()); | ||
- cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); | ||
- state.posFrom = cursor.from(); state.posTo = cursor.to(); | ||
- });} | ||
- function clearSearch(cm) {cm.operation(function() { | ||
- var state = getSearchState(cm); | ||
- if (!state.query) return; | ||
- state.query = null; | ||
- cm.removeOverlay(state.overlay); | ||
- if (state.annotate) { state.annotate.clear(); state.annotate = null; } | ||
- });} | ||
- | ||
- var replaceQueryDialog = | ||
- 'Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>'; | ||
- var replacementQueryDialog = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>'; | ||
- var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>"; | ||
- function replace(cm, all) { | ||
- if (cm.getOption("readOnly")) return; | ||
- dialog(cm, replaceQueryDialog, "Replace:", cm.getSelection(), function(query) { | ||
- if (!query) return; | ||
- query = parseQuery(query); | ||
- dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) { | ||
- if (all) { | ||
- cm.operation(function() { | ||
- for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { | ||
- if (typeof query != "string") { | ||
- var match = cm.getRange(cursor.from(), cursor.to()).match(query); | ||
- cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); | ||
- } else cursor.replace(text); | ||
- } | ||
- }); | ||
- } else { | ||
- clearSearch(cm); | ||
- var cursor = getSearchCursor(cm, query, cm.getCursor()); | ||
- var advance = function() { | ||
- var start = cursor.from(), match; | ||
- if (!(match = cursor.findNext())) { | ||
- cursor = getSearchCursor(cm, query); | ||
- if (!(match = cursor.findNext()) || | ||
- (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; | ||
- } | ||
- cm.setSelection(cursor.from(), cursor.to()); | ||
- cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); | ||
- confirmDialog(cm, doReplaceConfirm, "Replace?", | ||
- [function() {doReplace(match);}, advance]); | ||
- }; | ||
- var doReplace = function(match) { | ||
- cursor.replace(typeof query == "string" ? text : | ||
- text.replace(/\$(\d)/g, function(_, i) {return match[i];})); | ||
- advance(); | ||
- }; | ||
- advance(); | ||
- } | ||
- }); | ||
- }); | ||
- } | ||
- | ||
- CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; | ||
- CodeMirror.commands.findNext = doSearch; | ||
- CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; | ||
- CodeMirror.commands.clearSearch = clearSearch; | ||
- CodeMirror.commands.replace = replace; | ||
- CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; | ||
-}); |
189
public/js/lib/codemirror/addon/search/searchcursor.js
@@ -1,189 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- function SearchCursor(doc, query, pos, caseFold) { | ||
- this.atOccurrence = false; this.doc = doc; | ||
- if (caseFold == null && typeof query == "string") caseFold = false; | ||
- | ||
- pos = pos ? doc.clipPos(pos) : Pos(0, 0); | ||
- this.pos = {from: pos, to: pos}; | ||
- | ||
- // The matches method is filled in based on the type of query. | ||
- // It takes a position and a direction, and returns an object | ||
- // describing the next occurrence of the query, or null if no | ||
- // more matches were found. | ||
- if (typeof query != "string") { // Regexp match | ||
- if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g"); | ||
- this.matches = function(reverse, pos) { | ||
- if (reverse) { | ||
- query.lastIndex = 0; | ||
- var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start; | ||
- for (;;) { | ||
- query.lastIndex = cutOff; | ||
- var newMatch = query.exec(line); | ||
- if (!newMatch) break; | ||
- match = newMatch; | ||
- start = match.index; | ||
- cutOff = match.index + (match[0].length || 1); | ||
- if (cutOff == line.length) break; | ||
- } | ||
- var matchLen = (match && match[0].length) || 0; | ||
- if (!matchLen) { | ||
- if (start == 0 && line.length == 0) {match = undefined;} | ||
- else if (start != doc.getLine(pos.line).length) { | ||
- matchLen++; | ||
- } | ||
- } | ||
- } else { | ||
- query.lastIndex = pos.ch; | ||
- var line = doc.getLine(pos.line), match = query.exec(line); | ||
- var matchLen = (match && match[0].length) || 0; | ||
- var start = match && match.index; | ||
- if (start + matchLen != line.length && !matchLen) matchLen = 1; | ||
- } | ||
- if (match && matchLen) | ||
- return {from: Pos(pos.line, start), | ||
- to: Pos(pos.line, start + matchLen), | ||
- match: match}; | ||
- }; | ||
- } else { // String query | ||
- var origQuery = query; | ||
- if (caseFold) query = query.toLowerCase(); | ||
- var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;}; | ||
- var target = query.split("\n"); | ||
- // Different methods for single-line and multi-line queries | ||
- if (target.length == 1) { | ||
- if (!query.length) { | ||
- // Empty string would match anything and never progress, so | ||
- // we define it to match nothing instead. | ||
- this.matches = function() {}; | ||
- } else { | ||
- this.matches = function(reverse, pos) { | ||
- if (reverse) { | ||
- var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig); | ||
- var match = line.lastIndexOf(query); | ||
- if (match > -1) { | ||
- match = adjustPos(orig, line, match); | ||
- return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; | ||
- } | ||
- } else { | ||
- var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig); | ||
- var match = line.indexOf(query); | ||
- if (match > -1) { | ||
- match = adjustPos(orig, line, match) + pos.ch; | ||
- return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; | ||
- } | ||
- } | ||
- }; | ||
- } | ||
- } else { | ||
- var origTarget = origQuery.split("\n"); | ||
- this.matches = function(reverse, pos) { | ||
- var last = target.length - 1; | ||
- if (reverse) { | ||
- if (pos.line - (target.length - 1) < doc.firstLine()) return; | ||
- if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return; | ||
- var to = Pos(pos.line, origTarget[last].length); | ||
- for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln) | ||
- if (target[i] != fold(doc.getLine(ln))) return; | ||
- var line = doc.getLine(ln), cut = line.length - origTarget[0].length; | ||
- if (fold(line.slice(cut)) != target[0]) return; | ||
- return {from: Pos(ln, cut), to: to}; | ||
- } else { | ||
- if (pos.line + (target.length - 1) > doc.lastLine()) return; | ||
- var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length; | ||
- if (fold(line.slice(cut)) != target[0]) return; | ||
- var from = Pos(pos.line, cut); | ||
- for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln) | ||
- if (target[i] != fold(doc.getLine(ln))) return; | ||
- if (fold(doc.getLine(ln).slice(0, origTarget[last].length)) != target[last]) return; | ||
- return {from: from, to: Pos(ln, origTarget[last].length)}; | ||
- } | ||
- }; | ||
- } | ||
- } | ||
- } | ||
- | ||
- SearchCursor.prototype = { | ||
- findNext: function() {return this.find(false);}, | ||
- findPrevious: function() {return this.find(true);}, | ||
- | ||
- find: function(reverse) { | ||
- var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); | ||
- function savePosAndFail(line) { | ||
- var pos = Pos(line, 0); | ||
- self.pos = {from: pos, to: pos}; | ||
- self.atOccurrence = false; | ||
- return false; | ||
- } | ||
- | ||
- for (;;) { | ||
- if (this.pos = this.matches(reverse, pos)) { | ||
- this.atOccurrence = true; | ||
- return this.pos.match || true; | ||
- } | ||
- if (reverse) { | ||
- if (!pos.line) return savePosAndFail(0); | ||
- pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length); | ||
- } | ||
- else { | ||
- var maxLine = this.doc.lineCount(); | ||
- if (pos.line == maxLine - 1) return savePosAndFail(maxLine); | ||
- pos = Pos(pos.line + 1, 0); | ||
- } | ||
- } | ||
- }, | ||
- | ||
- from: function() {if (this.atOccurrence) return this.pos.from;}, | ||
- to: function() {if (this.atOccurrence) return this.pos.to;}, | ||
- | ||
- replace: function(newText) { | ||
- if (!this.atOccurrence) return; | ||
- var lines = CodeMirror.splitLines(newText); | ||
- this.doc.replaceRange(lines, this.pos.from, this.pos.to); | ||
- this.pos.to = Pos(this.pos.from.line + lines.length - 1, | ||
- lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); | ||
- } | ||
- }; | ||
- | ||
- // Maps a position in a case-folded line back to a position in the original line | ||
- // (compensating for codepoints increasing in number during folding) | ||
- function adjustPos(orig, folded, pos) { | ||
- if (orig.length == folded.length) return pos; | ||
- for (var pos1 = Math.min(pos, orig.length);;) { | ||
- var len1 = orig.slice(0, pos1).toLowerCase().length; | ||
- if (len1 < pos) ++pos1; | ||
- else if (len1 > pos) --pos1; | ||
- else return pos1; | ||
- } | ||
- } | ||
- | ||
- CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { | ||
- return new SearchCursor(this.doc, query, pos, caseFold); | ||
- }); | ||
- CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { | ||
- return new SearchCursor(this, query, pos, caseFold); | ||
- }); | ||
- | ||
- CodeMirror.defineExtension("selectMatches", function(query, caseFold) { | ||
- var ranges = [], next; | ||
- var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); | ||
- while (next = cur.findNext()) { | ||
- if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; | ||
- ranges.push({anchor: cur.from(), head: cur.to()}); | ||
- } | ||
- if (ranges.length) | ||
- this.setSelections(ranges, 0); | ||
- }); | ||
-}); |
71
public/js/lib/codemirror/addon/selection/active-line.js
@@ -1,71 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Because sometimes you need to style the cursor's line. | ||
-// | ||
-// Adds an option 'styleActiveLine' which, when enabled, gives the | ||
-// active line's wrapping <div> the CSS class "CodeMirror-activeline", | ||
-// and gives its background <div> the class "CodeMirror-activeline-background". | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- var WRAP_CLASS = "CodeMirror-activeline"; | ||
- var BACK_CLASS = "CodeMirror-activeline-background"; | ||
- | ||
- CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { | ||
- var prev = old && old != CodeMirror.Init; | ||
- if (val && !prev) { | ||
- cm.state.activeLines = []; | ||
- updateActiveLines(cm, cm.listSelections()); | ||
- cm.on("beforeSelectionChange", selectionChange); | ||
- } else if (!val && prev) { | ||
- cm.off("beforeSelectionChange", selectionChange); | ||
- clearActiveLines(cm); | ||
- delete cm.state.activeLines; | ||
- } | ||
- }); | ||
- | ||
- function clearActiveLines(cm) { | ||
- for (var i = 0; i < cm.state.activeLines.length; i++) { | ||
- cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); | ||
- cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); | ||
- } | ||
- } | ||
- | ||
- function sameArray(a, b) { | ||
- if (a.length != b.length) return false; | ||
- for (var i = 0; i < a.length; i++) | ||
- if (a[i] != b[i]) return false; | ||
- return true; | ||
- } | ||
- | ||
- function updateActiveLines(cm, ranges) { | ||
- var active = []; | ||
- for (var i = 0; i < ranges.length; i++) { | ||
- var range = ranges[i]; | ||
- if (!range.empty()) continue; | ||
- var line = cm.getLineHandleVisualStart(range.head.line); | ||
- if (active[active.length - 1] != line) active.push(line); | ||
- } | ||
- if (sameArray(cm.state.activeLines, active)) return; | ||
- cm.operation(function() { | ||
- clearActiveLines(cm); | ||
- for (var i = 0; i < active.length; i++) { | ||
- cm.addLineClass(active[i], "wrap", WRAP_CLASS); | ||
- cm.addLineClass(active[i], "background", BACK_CLASS); | ||
- } | ||
- cm.state.activeLines = active; | ||
- }); | ||
- } | ||
- | ||
- function selectionChange(cm, sel) { | ||
- updateActiveLines(cm, sel.ranges); | ||
- } | ||
-}); |
118
public/js/lib/codemirror/addon/selection/mark-selection.js
@@ -1,118 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Because sometimes you need to mark the selected *text*. | ||
-// | ||
-// Adds an option 'styleSelectedText' which, when enabled, gives | ||
-// selected text the CSS class given as option value, or | ||
-// "CodeMirror-selectedtext" when the value is not a string. | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) { | ||
- var prev = old && old != CodeMirror.Init; | ||
- if (val && !prev) { | ||
- cm.state.markedSelection = []; | ||
- cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext"; | ||
- reset(cm); | ||
- cm.on("cursorActivity", onCursorActivity); | ||
- cm.on("change", onChange); | ||
- } else if (!val && prev) { | ||
- cm.off("cursorActivity", onCursorActivity); | ||
- cm.off("change", onChange); | ||
- clear(cm); | ||
- cm.state.markedSelection = cm.state.markedSelectionStyle = null; | ||
- } | ||
- }); | ||
- | ||
- function onCursorActivity(cm) { | ||
- cm.operation(function() { update(cm); }); | ||
- } | ||
- | ||
- function onChange(cm) { | ||
- if (cm.state.markedSelection.length) | ||
- cm.operation(function() { clear(cm); }); | ||
- } | ||
- | ||
- var CHUNK_SIZE = 8; | ||
- var Pos = CodeMirror.Pos; | ||
- var cmp = CodeMirror.cmpPos; | ||
- | ||
- function coverRange(cm, from, to, addAt) { | ||
- if (cmp(from, to) == 0) return; | ||
- var array = cm.state.markedSelection; | ||
- var cls = cm.state.markedSelectionStyle; | ||
- for (var line = from.line;;) { | ||
- var start = line == from.line ? from : Pos(line, 0); | ||
- var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line; | ||
- var end = atEnd ? to : Pos(endLine, 0); | ||
- var mark = cm.markText(start, end, {className: cls}); | ||
- if (addAt == null) array.push(mark); | ||
- else array.splice(addAt++, 0, mark); | ||
- if (atEnd) break; | ||
- line = endLine; | ||
- } | ||
- } | ||
- | ||
- function clear(cm) { | ||
- var array = cm.state.markedSelection; | ||
- for (var i = 0; i < array.length; ++i) array[i].clear(); | ||
- array.length = 0; | ||
- } | ||
- | ||
- function reset(cm) { | ||
- clear(cm); | ||
- var ranges = cm.listSelections(); | ||
- for (var i = 0; i < ranges.length; i++) | ||
- coverRange(cm, ranges[i].from(), ranges[i].to()); | ||
- } | ||
- | ||
- function update(cm) { | ||
- if (!cm.somethingSelected()) return clear(cm); | ||
- if (cm.listSelections().length > 1) return reset(cm); | ||
- | ||
- var from = cm.getCursor("start"), to = cm.getCursor("end"); | ||
- | ||
- var array = cm.state.markedSelection; | ||
- if (!array.length) return coverRange(cm, from, to); | ||
- | ||
- var coverStart = array[0].find(), coverEnd = array[array.length - 1].find(); | ||
- if (!coverStart || !coverEnd || to.line - from.line < CHUNK_SIZE || | ||
- cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0) | ||
- return reset(cm); | ||
- | ||
- while (cmp(from, coverStart.from) > 0) { | ||
- array.shift().clear(); | ||
- coverStart = array[0].find(); | ||
- } | ||
- if (cmp(from, coverStart.from) < 0) { | ||
- if (coverStart.to.line - from.line < CHUNK_SIZE) { | ||
- array.shift().clear(); | ||
- coverRange(cm, from, coverStart.to, 0); | ||
- } else { | ||
- coverRange(cm, from, coverStart.from, 0); | ||
- } | ||
- } | ||
- | ||
- while (cmp(to, coverEnd.to) < 0) { | ||
- array.pop().clear(); | ||
- coverEnd = array[array.length - 1].find(); | ||
- } | ||
- if (cmp(to, coverEnd.to) > 0) { | ||
- if (to.line - coverEnd.from.line < CHUNK_SIZE) { | ||
- array.pop().clear(); | ||
- coverRange(cm, coverEnd.from, to); | ||
- } else { | ||
- coverRange(cm, coverEnd.to, to); | ||
- } | ||
- } | ||
- } | ||
-}); |
86
public/js/lib/codemirror/addon/tern/tern.css
@@ -1,86 +0,0 @@ | ||
-.CodeMirror-Tern-completion { | ||
- padding-left: 22px; | ||
- position: relative; | ||
-} | ||
-.CodeMirror-Tern-completion:before { | ||
- position: absolute; | ||
- left: 2px; | ||
- bottom: 2px; | ||
- border-radius: 50%; | ||
- font-size: 12px; | ||
- font-weight: bold; | ||
- height: 15px; | ||
- width: 15px; | ||
- line-height: 16px; | ||
- text-align: center; | ||
- color: white; | ||
- -moz-box-sizing: border-box; | ||
- box-sizing: border-box; | ||
-} | ||
-.CodeMirror-Tern-completion-unknown:before { | ||
- content: "?"; | ||
- background: #4bb; | ||
-} | ||
-.CodeMirror-Tern-completion-object:before { | ||
- content: "O"; | ||
- background: #77c; | ||
-} | ||
-.CodeMirror-Tern-completion-fn:before { | ||
- content: "F"; | ||
- background: #7c7; | ||
-} | ||
-.CodeMirror-Tern-completion-array:before { | ||
- content: "A"; | ||
- background: #c66; | ||
-} | ||
-.CodeMirror-Tern-completion-number:before { | ||
- content: "1"; | ||
- background: #999; | ||
-} | ||
-.CodeMirror-Tern-completion-string:before { | ||
- content: "S"; | ||
- background: #999; | ||
-} | ||
-.CodeMirror-Tern-completion-bool:before { | ||
- content: "B"; | ||
- background: #999; | ||
-} | ||
- | ||
-.CodeMirror-Tern-completion-guess { | ||
- color: #999; | ||
-} | ||
- | ||
-.CodeMirror-Tern-tooltip { | ||
- border: 1px solid silver; | ||
- border-radius: 3px; | ||
- color: #444; | ||
- padding: 2px 5px; | ||
- font-size: 90%; | ||
- font-family: monospace; | ||
- background-color: white; | ||
- white-space: pre-wrap; | ||
- | ||
- max-width: 40em; | ||
- position: absolute; | ||
- z-index: 10; | ||
- -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); | ||
- -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); | ||
- box-shadow: 2px 3px 5px rgba(0,0,0,.2); | ||
- | ||
- transition: opacity 1s; | ||
- -moz-transition: opacity 1s; | ||
- -webkit-transition: opacity 1s; | ||
- -o-transition: opacity 1s; | ||
- -ms-transition: opacity 1s; | ||
-} | ||
- | ||
-.CodeMirror-Tern-hint-doc { | ||
- max-width: 25em; | ||
- margin-top: -3px; | ||
-} | ||
- | ||
-.CodeMirror-Tern-fname { color: black; } | ||
-.CodeMirror-Tern-farg { color: #70a; } | ||
-.CodeMirror-Tern-farg-current { text-decoration: underline; } | ||
-.CodeMirror-Tern-type { color: #07c; } | ||
-.CodeMirror-Tern-fhint-guess { opacity: .7; } |
670
public/js/lib/codemirror/addon/tern/tern.js
@@ -1,670 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// Glue code between CodeMirror and Tern. | ||
-// | ||
-// Create a CodeMirror.TernServer to wrap an actual Tern server, | ||
-// register open documents (CodeMirror.Doc instances) with it, and | ||
-// call its methods to activate the assisting functions that Tern | ||
-// provides. | ||
-// | ||
-// Options supported (all optional): | ||
-// * defs: An array of JSON definition data structures. | ||
-// * plugins: An object mapping plugin names to configuration | ||
-// options. | ||
-// * getFile: A function(name, c) that can be used to access files in | ||
-// the project that haven't been loaded yet. Simply do c(null) to | ||
-// indicate that a file is not available. | ||
-// * fileFilter: A function(value, docName, doc) that will be applied | ||
-// to documents before passing them on to Tern. | ||
-// * switchToDoc: A function(name, doc) that should, when providing a | ||
-// multi-file view, switch the view or focus to the named file. | ||
-// * showError: A function(editor, message) that can be used to | ||
-// override the way errors are displayed. | ||
-// * completionTip: Customize the content in tooltips for completions. | ||
-// Is passed a single argument—the completion's data as returned by | ||
-// Tern—and may return a string, DOM node, or null to indicate that | ||
-// no tip should be shown. By default the docstring is shown. | ||
-// * typeTip: Like completionTip, but for the tooltips shown for type | ||
-// queries. | ||
-// * responseFilter: A function(doc, query, request, error, data) that | ||
-// will be applied to the Tern responses before treating them | ||
-// | ||
-// | ||
-// It is possible to run the Tern server in a web worker by specifying | ||
-// these additional options: | ||
-// * useWorker: Set to true to enable web worker mode. You'll probably | ||
-// want to feature detect the actual value you use here, for example | ||
-// !!window.Worker. | ||
-// * workerScript: The main script of the worker. Point this to | ||
-// wherever you are hosting worker.js from this directory. | ||
-// * workerDeps: An array of paths pointing (relative to workerScript) | ||
-// to the Acorn and Tern libraries and any Tern plugins you want to | ||
-// load. Or, if you minified those into a single script and included | ||
-// them in the workerScript, simply leave this undefined. | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- // declare global: tern | ||
- | ||
- CodeMirror.TernServer = function(options) { | ||
- var self = this; | ||
- this.options = options || {}; | ||
- var plugins = this.options.plugins || (this.options.plugins = {}); | ||
- if (!plugins.doc_comment) plugins.doc_comment = true; | ||
- if (this.options.useWorker) { | ||
- this.server = new WorkerServer(this); | ||
- } else { | ||
- this.server = new tern.Server({ | ||
- getFile: function(name, c) { return getFile(self, name, c); }, | ||
- async: true, | ||
- defs: this.options.defs || [], | ||
- plugins: plugins | ||
- }); | ||
- } | ||
- this.docs = Object.create(null); | ||
- this.trackChange = function(doc, change) { trackChange(self, doc, change); }; | ||
- | ||
- this.cachedArgHints = null; | ||
- this.activeArgHints = null; | ||
- this.jumpStack = []; | ||
- | ||
- this.getHint = function(cm, c) { return hint(self, cm, c); }; | ||
- this.getHint.async = true; | ||
- }; | ||
- | ||
- CodeMirror.TernServer.prototype = { | ||
- addDoc: function(name, doc) { | ||
- var data = {doc: doc, name: name, changed: null}; | ||
- this.server.addFile(name, docValue(this, data)); | ||
- CodeMirror.on(doc, "change", this.trackChange); | ||
- return this.docs[name] = data; | ||
- }, | ||
- | ||
- delDoc: function(id) { | ||
- var found = resolveDoc(this, id); | ||
- if (!found) return; | ||
- CodeMirror.off(found.doc, "change", this.trackChange); | ||
- delete this.docs[found.name]; | ||
- this.server.delFile(found.name); | ||
- }, | ||
- | ||
- hideDoc: function(id) { | ||
- closeArgHints(this); | ||
- var found = resolveDoc(this, id); | ||
- if (found && found.changed) sendDoc(this, found); | ||
- }, | ||
- | ||
- complete: function(cm) { | ||
- cm.showHint({hint: this.getHint}); | ||
- }, | ||
- | ||
- showType: function(cm, pos, c) { showContextInfo(this, cm, pos, "type", c); }, | ||
- | ||
- showDocs: function(cm, pos, c) { showContextInfo(this, cm, pos, "documentation", c); }, | ||
- | ||
- updateArgHints: function(cm) { updateArgHints(this, cm); }, | ||
- | ||
- jumpToDef: function(cm) { jumpToDef(this, cm); }, | ||
- | ||
- jumpBack: function(cm) { jumpBack(this, cm); }, | ||
- | ||
- rename: function(cm) { rename(this, cm); }, | ||
- | ||
- selectName: function(cm) { selectName(this, cm); }, | ||
- | ||
- request: function (cm, query, c, pos) { | ||
- var self = this; | ||
- var doc = findDoc(this, cm.getDoc()); | ||
- var request = buildRequest(this, doc, query, pos); | ||
- | ||
- this.server.request(request, function (error, data) { | ||
- if (!error && self.options.responseFilter) | ||
- data = self.options.responseFilter(doc, query, request, error, data); | ||
- c(error, data); | ||
- }); | ||
- } | ||
- }; | ||
- | ||
- var Pos = CodeMirror.Pos; | ||
- var cls = "CodeMirror-Tern-"; | ||
- var bigDoc = 250; | ||
- | ||
- function getFile(ts, name, c) { | ||
- var buf = ts.docs[name]; | ||
- if (buf) | ||
- c(docValue(ts, buf)); | ||
- else if (ts.options.getFile) | ||
- ts.options.getFile(name, c); | ||
- else | ||
- c(null); | ||
- } | ||
- | ||
- function findDoc(ts, doc, name) { | ||
- for (var n in ts.docs) { | ||
- var cur = ts.docs[n]; | ||
- if (cur.doc == doc) return cur; | ||
- } | ||
- if (!name) for (var i = 0;; ++i) { | ||
- n = "[doc" + (i || "") + "]"; | ||
- if (!ts.docs[n]) { name = n; break; } | ||
- } | ||
- return ts.addDoc(name, doc); | ||
- } | ||
- | ||
- function resolveDoc(ts, id) { | ||
- if (typeof id == "string") return ts.docs[id]; | ||
- if (id instanceof CodeMirror) id = id.getDoc(); | ||
- if (id instanceof CodeMirror.Doc) return findDoc(ts, id); | ||
- } | ||
- | ||
- function trackChange(ts, doc, change) { | ||
- var data = findDoc(ts, doc); | ||
- | ||
- var argHints = ts.cachedArgHints; | ||
- if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) <= 0) | ||
- ts.cachedArgHints = null; | ||
- | ||
- var changed = data.changed; | ||
- if (changed == null) | ||
- data.changed = changed = {from: change.from.line, to: change.from.line}; | ||
- var end = change.from.line + (change.text.length - 1); | ||
- if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end); | ||
- if (end >= changed.to) changed.to = end + 1; | ||
- if (changed.from > change.from.line) changed.from = change.from.line; | ||
- | ||
- if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() { | ||
- if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data); | ||
- }, 200); | ||
- } | ||
- | ||
- function sendDoc(ts, doc) { | ||
- ts.server.request({files: [{type: "full", name: doc.name, text: docValue(ts, doc)}]}, function(error) { | ||
- if (error) window.console.error(error); | ||
- else doc.changed = null; | ||
- }); | ||
- } | ||
- | ||
- // Completion | ||
- | ||
- function hint(ts, cm, c) { | ||
- ts.request(cm, {type: "completions", types: true, docs: true, urls: true}, function(error, data) { | ||
- if (error) return showError(ts, cm, error); | ||
- var completions = [], after = ""; | ||
- var from = data.start, to = data.end; | ||
- if (cm.getRange(Pos(from.line, from.ch - 2), from) == "[\"" && | ||
- cm.getRange(to, Pos(to.line, to.ch + 2)) != "\"]") | ||
- after = "\"]"; | ||
- | ||
- for (var i = 0; i < data.completions.length; ++i) { | ||
- var completion = data.completions[i], className = typeToIcon(completion.type); | ||
- if (data.guess) className += " " + cls + "guess"; | ||
- completions.push({text: completion.name + after, | ||
- displayText: completion.name, | ||
- className: className, | ||
- data: completion}); | ||
- } | ||
- | ||
- var obj = {from: from, to: to, list: completions}; | ||
- var tooltip = null; | ||
- CodeMirror.on(obj, "close", function() { remove(tooltip); }); | ||
- CodeMirror.on(obj, "update", function() { remove(tooltip); }); | ||
- CodeMirror.on(obj, "select", function(cur, node) { | ||
- remove(tooltip); | ||
- var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc; | ||
- if (content) { | ||
- tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, | ||
- node.getBoundingClientRect().top + window.pageYOffset, content); | ||
- tooltip.className += " " + cls + "hint-doc"; | ||
- } | ||
- }); | ||
- c(obj); | ||
- }); | ||
- } | ||
- | ||
- function typeToIcon(type) { | ||
- var suffix; | ||
- if (type == "?") suffix = "unknown"; | ||
- else if (type == "number" || type == "string" || type == "bool") suffix = type; | ||
- else if (/^fn\(/.test(type)) suffix = "fn"; | ||
- else if (/^\[/.test(type)) suffix = "array"; | ||
- else suffix = "object"; | ||
- return cls + "completion " + cls + "completion-" + suffix; | ||
- } | ||
- | ||
- // Type queries | ||
- | ||
- function showContextInfo(ts, cm, pos, queryName, c) { | ||
- ts.request(cm, queryName, function(error, data) { | ||
- if (error) return showError(ts, cm, error); | ||
- if (ts.options.typeTip) { | ||
- var tip = ts.options.typeTip(data); | ||
- } else { | ||
- var tip = elt("span", null, elt("strong", null, data.type || "not found")); | ||
- if (data.doc) | ||
- tip.appendChild(document.createTextNode(" — " + data.doc)); | ||
- if (data.url) { | ||
- tip.appendChild(document.createTextNode(" ")); | ||
- tip.appendChild(elt("a", null, "[docs]")).href = data.url; | ||
- } | ||
- } | ||
- tempTooltip(cm, tip); | ||
- if (c) c(); | ||
- }, pos); | ||
- } | ||
- | ||
- // Maintaining argument hints | ||
- | ||
- function updateArgHints(ts, cm) { | ||
- closeArgHints(ts); | ||
- | ||
- if (cm.somethingSelected()) return; | ||
- var state = cm.getTokenAt(cm.getCursor()).state; | ||
- var inner = CodeMirror.innerMode(cm.getMode(), state); | ||
- if (inner.mode.name != "javascript") return; | ||
- var lex = inner.state.lexical; | ||
- if (lex.info != "call") return; | ||
- | ||
- var ch, argPos = lex.pos || 0, tabSize = cm.getOption("tabSize"); | ||
- for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) { | ||
- var str = cm.getLine(line), extra = 0; | ||
- for (var pos = 0;;) { | ||
- var tab = str.indexOf("\t", pos); | ||
- if (tab == -1) break; | ||
- extra += tabSize - (tab + extra) % tabSize - 1; | ||
- pos = tab + 1; | ||
- } | ||
- ch = lex.column - extra; | ||
- if (str.charAt(ch) == "(") {found = true; break;} | ||
- } | ||
- if (!found) return; | ||
- | ||
- var start = Pos(line, ch); | ||
- var cache = ts.cachedArgHints; | ||
- if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0) | ||
- return showArgHints(ts, cm, argPos); | ||
- | ||
- ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) { | ||
- if (error || !data.type || !(/^fn\(/).test(data.type)) return; | ||
- ts.cachedArgHints = { | ||
- start: pos, | ||
- type: parseFnType(data.type), | ||
- name: data.exprName || data.name || "fn", | ||
- guess: data.guess, | ||
- doc: cm.getDoc() | ||
- }; | ||
- showArgHints(ts, cm, argPos); | ||
- }); | ||
- } | ||
- | ||
- function showArgHints(ts, cm, pos) { | ||
- closeArgHints(ts); | ||
- | ||
- var cache = ts.cachedArgHints, tp = cache.type; | ||
- var tip = elt("span", cache.guess ? cls + "fhint-guess" : null, | ||
- elt("span", cls + "fname", cache.name), "("); | ||
- for (var i = 0; i < tp.args.length; ++i) { | ||
- if (i) tip.appendChild(document.createTextNode(", ")); | ||
- var arg = tp.args[i]; | ||
- tip.appendChild(elt("span", cls + "farg" + (i == pos ? " " + cls + "farg-current" : ""), arg.name || "?")); | ||
- if (arg.type != "?") { | ||
- tip.appendChild(document.createTextNode(":\u00a0")); | ||
- tip.appendChild(elt("span", cls + "type", arg.type)); | ||
- } | ||
- } | ||
- tip.appendChild(document.createTextNode(tp.rettype ? ") ->\u00a0" : ")")); | ||
- if (tp.rettype) tip.appendChild(elt("span", cls + "type", tp.rettype)); | ||
- var place = cm.cursorCoords(null, "page"); | ||
- ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip); | ||
- } | ||
- | ||
- function parseFnType(text) { | ||
- var args = [], pos = 3; | ||
- | ||
- function skipMatching(upto) { | ||
- var depth = 0, start = pos; | ||
- for (;;) { | ||
- var next = text.charAt(pos); | ||
- if (upto.test(next) && !depth) return text.slice(start, pos); | ||
- if (/[{\[\(]/.test(next)) ++depth; | ||
- else if (/[}\]\)]/.test(next)) --depth; | ||
- ++pos; | ||
- } | ||
- } | ||
- | ||
- // Parse arguments | ||
- if (text.charAt(pos) != ")") for (;;) { | ||
- var name = text.slice(pos).match(/^([^, \(\[\{]+): /); | ||
- if (name) { | ||
- pos += name[0].length; | ||
- name = name[1]; | ||
- } | ||
- args.push({name: name, type: skipMatching(/[\),]/)}); | ||
- if (text.charAt(pos) == ")") break; | ||
- pos += 2; | ||
- } | ||
- | ||
- var rettype = text.slice(pos).match(/^\) -> (.*)$/); | ||
- | ||
- return {args: args, rettype: rettype && rettype[1]}; | ||
- } | ||
- | ||
- // Moving to the definition of something | ||
- | ||
- function jumpToDef(ts, cm) { | ||
- function inner(varName) { | ||
- var req = {type: "definition", variable: varName || null}; | ||
- var doc = findDoc(ts, cm.getDoc()); | ||
- ts.server.request(buildRequest(ts, doc, req), function(error, data) { | ||
- if (error) return showError(ts, cm, error); | ||
- if (!data.file && data.url) { window.open(data.url); return; } | ||
- | ||
- if (data.file) { | ||
- var localDoc = ts.docs[data.file], found; | ||
- if (localDoc && (found = findContext(localDoc.doc, data))) { | ||
- ts.jumpStack.push({file: doc.name, | ||
- start: cm.getCursor("from"), | ||
- end: cm.getCursor("to")}); | ||
- moveTo(ts, doc, localDoc, found.start, found.end); | ||
- return; | ||
- } | ||
- } | ||
- showError(ts, cm, "Could not find a definition."); | ||
- }); | ||
- } | ||
- | ||
- if (!atInterestingExpression(cm)) | ||
- dialog(cm, "Jump to variable", function(name) { if (name) inner(name); }); | ||
- else | ||
- inner(); | ||
- } | ||
- | ||
- function jumpBack(ts, cm) { | ||
- var pos = ts.jumpStack.pop(), doc = pos && ts.docs[pos.file]; | ||
- if (!doc) return; | ||
- moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end); | ||
- } | ||
- | ||
- function moveTo(ts, curDoc, doc, start, end) { | ||
- doc.doc.setSelection(start, end); | ||
- if (curDoc != doc && ts.options.switchToDoc) { | ||
- closeArgHints(ts); | ||
- ts.options.switchToDoc(doc.name, doc.doc); | ||
- } | ||
- } | ||
- | ||
- // The {line,ch} representation of positions makes this rather awkward. | ||
- function findContext(doc, data) { | ||
- var before = data.context.slice(0, data.contextOffset).split("\n"); | ||
- var startLine = data.start.line - (before.length - 1); | ||
- var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length); | ||
- | ||
- var text = doc.getLine(startLine).slice(start.ch); | ||
- for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur) | ||
- text += "\n" + doc.getLine(cur); | ||
- if (text.slice(0, data.context.length) == data.context) return data; | ||
- | ||
- var cursor = doc.getSearchCursor(data.context, 0, false); | ||
- var nearest, nearestDist = Infinity; | ||
- while (cursor.findNext()) { | ||
- var from = cursor.from(), dist = Math.abs(from.line - start.line) * 10000; | ||
- if (!dist) dist = Math.abs(from.ch - start.ch); | ||
- if (dist < nearestDist) { nearest = from; nearestDist = dist; } | ||
- } | ||
- if (!nearest) return null; | ||
- | ||
- if (before.length == 1) | ||
- nearest.ch += before[0].length; | ||
- else | ||
- nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length); | ||
- if (data.start.line == data.end.line) | ||
- var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch)); | ||
- else | ||
- var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch); | ||
- return {start: nearest, end: end}; | ||
- } | ||
- | ||
- function atInterestingExpression(cm) { | ||
- var pos = cm.getCursor("end"), tok = cm.getTokenAt(pos); | ||
- if (tok.start < pos.ch && (tok.type == "comment" || tok.type == "string")) return false; | ||
- return /\w/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1)); | ||
- } | ||
- | ||
- // Variable renaming | ||
- | ||
- function rename(ts, cm) { | ||
- var token = cm.getTokenAt(cm.getCursor()); | ||
- if (!/\w/.test(token.string)) return showError(ts, cm, "Not at a variable"); | ||
- dialog(cm, "New name for " + token.string, function(newName) { | ||
- ts.request(cm, {type: "rename", newName: newName, fullDocs: true}, function(error, data) { | ||
- if (error) return showError(ts, cm, error); | ||
- applyChanges(ts, data.changes); | ||
- }); | ||
- }); | ||
- } | ||
- | ||
- function selectName(ts, cm) { | ||
- var name = findDoc(ts, cm.doc).name; | ||
- ts.request(cm, {type: "refs"}, function(error, data) { | ||
- if (error) return showError(ts, cm, error); | ||
- var ranges = [], cur = 0; | ||
- for (var i = 0; i < data.refs.length; i++) { | ||
- var ref = data.refs[i]; | ||
- if (ref.file == name) { | ||
- ranges.push({anchor: ref.start, head: ref.end}); | ||
- if (cmpPos(cur, ref.start) >= 0 && cmpPos(cur, ref.end) <= 0) | ||
- cur = ranges.length - 1; | ||
- } | ||
- } | ||
- cm.setSelections(ranges, cur); | ||
- }); | ||
- } | ||
- | ||
- var nextChangeOrig = 0; | ||
- function applyChanges(ts, changes) { | ||
- var perFile = Object.create(null); | ||
- for (var i = 0; i < changes.length; ++i) { | ||
- var ch = changes[i]; | ||
- (perFile[ch.file] || (perFile[ch.file] = [])).push(ch); | ||
- } | ||
- for (var file in perFile) { | ||
- var known = ts.docs[file], chs = perFile[file];; | ||
- if (!known) continue; | ||
- chs.sort(function(a, b) { return cmpPos(b.start, a.start); }); | ||
- var origin = "*rename" + (++nextChangeOrig); | ||
- for (var i = 0; i < chs.length; ++i) { | ||
- var ch = chs[i]; | ||
- known.doc.replaceRange(ch.text, ch.start, ch.end, origin); | ||
- } | ||
- } | ||
- } | ||
- | ||
- // Generic request-building helper | ||
- | ||
- function buildRequest(ts, doc, query, pos) { | ||
- var files = [], offsetLines = 0, allowFragments = !query.fullDocs; | ||
- if (!allowFragments) delete query.fullDocs; | ||
- if (typeof query == "string") query = {type: query}; | ||
- query.lineCharPositions = true; | ||
- if (query.end == null) { | ||
- query.end = pos || doc.doc.getCursor("end"); | ||
- if (doc.doc.somethingSelected()) | ||
- query.start = doc.doc.getCursor("start"); | ||
- } | ||
- var startPos = query.start || query.end; | ||
- | ||
- if (doc.changed) { | ||
- if (doc.doc.lineCount() > bigDoc && allowFragments !== false && | ||
- doc.changed.to - doc.changed.from < 100 && | ||
- doc.changed.from <= startPos.line && doc.changed.to > query.end.line) { | ||
- files.push(getFragmentAround(doc, startPos, query.end)); | ||
- query.file = "#0"; | ||
- var offsetLines = files[0].offsetLines; | ||
- if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch); | ||
- query.end = Pos(query.end.line - offsetLines, query.end.ch); | ||
- } else { | ||
- files.push({type: "full", | ||
- name: doc.name, | ||
- text: docValue(ts, doc)}); | ||
- query.file = doc.name; | ||
- doc.changed = null; | ||
- } | ||
- } else { | ||
- query.file = doc.name; | ||
- } | ||
- for (var name in ts.docs) { | ||
- var cur = ts.docs[name]; | ||
- if (cur.changed && cur != doc) { | ||
- files.push({type: "full", name: cur.name, text: docValue(ts, cur)}); | ||
- cur.changed = null; | ||
- } | ||
- } | ||
- | ||
- return {query: query, files: files}; | ||
- } | ||
- | ||
- function getFragmentAround(data, start, end) { | ||
- var doc = data.doc; | ||
- var minIndent = null, minLine = null, endLine, tabSize = 4; | ||
- for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) { | ||
- var line = doc.getLine(p), fn = line.search(/\bfunction\b/); | ||
- if (fn < 0) continue; | ||
- var indent = CodeMirror.countColumn(line, null, tabSize); | ||
- if (minIndent != null && minIndent <= indent) continue; | ||
- minIndent = indent; | ||
- minLine = p; | ||
- } | ||
- if (minLine == null) minLine = min; | ||
- var max = Math.min(doc.lastLine(), end.line + 20); | ||
- if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize)) | ||
- endLine = max; | ||
- else for (endLine = end.line + 1; endLine < max; ++endLine) { | ||
- var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize); | ||
- if (indent <= minIndent) break; | ||
- } | ||
- var from = Pos(minLine, 0); | ||
- | ||
- return {type: "part", | ||
- name: data.name, | ||
- offsetLines: from.line, | ||
- text: doc.getRange(from, Pos(endLine, 0))}; | ||
- } | ||
- | ||
- // Generic utilities | ||
- | ||
- var cmpPos = CodeMirror.cmpPos; | ||
- | ||
- function elt(tagname, cls /*, ... elts*/) { | ||
- var e = document.createElement(tagname); | ||
- if (cls) e.className = cls; | ||
- for (var i = 2; i < arguments.length; ++i) { | ||
- var elt = arguments[i]; | ||
- if (typeof elt == "string") elt = document.createTextNode(elt); | ||
- e.appendChild(elt); | ||
- } | ||
- return e; | ||
- } | ||
- | ||
- function dialog(cm, text, f) { | ||
- if (cm.openDialog) | ||
- cm.openDialog(text + ": <input type=text>", f); | ||
- else | ||
- f(prompt(text, "")); | ||
- } | ||
- | ||
- // Tooltips | ||
- | ||
- function tempTooltip(cm, content) { | ||
- var where = cm.cursorCoords(); | ||
- var tip = makeTooltip(where.right + 1, where.bottom, content); | ||
- function clear() { | ||
- if (!tip.parentNode) return; | ||
- cm.off("cursorActivity", clear); | ||
- fadeOut(tip); | ||
- } | ||
- setTimeout(clear, 1700); | ||
- cm.on("cursorActivity", clear); | ||
- } | ||
- | ||
- function makeTooltip(x, y, content) { | ||
- var node = elt("div", cls + "tooltip", content); | ||
- node.style.left = x + "px"; | ||
- node.style.top = y + "px"; | ||
- document.body.appendChild(node); | ||
- return node; | ||
- } | ||
- | ||
- function remove(node) { | ||
- var p = node && node.parentNode; | ||
- if (p) p.removeChild(node); | ||
- } | ||
- | ||
- function fadeOut(tooltip) { | ||
- tooltip.style.opacity = "0"; | ||
- setTimeout(function() { remove(tooltip); }, 1100); | ||
- } | ||
- | ||
- function showError(ts, cm, msg) { | ||
- if (ts.options.showError) | ||
- ts.options.showError(cm, msg); | ||
- else | ||
- tempTooltip(cm, String(msg)); | ||
- } | ||
- | ||
- function closeArgHints(ts) { | ||
- if (ts.activeArgHints) { remove(ts.activeArgHints); ts.activeArgHints = null; } | ||
- } | ||
- | ||
- function docValue(ts, doc) { | ||
- var val = doc.doc.getValue(); | ||
- if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc); | ||
- return val; | ||
- } | ||
- | ||
- // Worker wrapper | ||
- | ||
- function WorkerServer(ts) { | ||
- var worker = new Worker(ts.options.workerScript); | ||
- worker.postMessage({type: "init", | ||
- defs: ts.options.defs, | ||
- plugins: ts.options.plugins, | ||
- scripts: ts.options.workerDeps}); | ||
- var msgId = 0, pending = {}; | ||
- | ||
- function send(data, c) { | ||
- if (c) { | ||
- data.id = ++msgId; | ||
- pending[msgId] = c; | ||
- } | ||
- worker.postMessage(data); | ||
- } | ||
- worker.onmessage = function(e) { | ||
- var data = e.data; | ||
- if (data.type == "getFile") { | ||
- getFile(ts, data.name, function(err, text) { | ||
- send({type: "getFile", err: String(err), text: text, id: data.id}); | ||
- }); | ||
- } else if (data.type == "debug") { | ||
- window.console.log(data.message); | ||
- } else if (data.id && pending[data.id]) { | ||
- pending[data.id](data.err, data.body); | ||
- delete pending[data.id]; | ||
- } | ||
- }; | ||
- worker.onerror = function(e) { | ||
- for (var id in pending) pending[id](e); | ||
- pending = {}; | ||
- }; | ||
- | ||
- this.addFile = function(name, text) { send({type: "add", name: name, text: text}); }; | ||
- this.delFile = function(name) { send({type: "del", name: name}); }; | ||
- this.request = function(body, c) { send({type: "req", body: body}, c); }; | ||
- } | ||
-}); |
44
public/js/lib/codemirror/addon/tern/worker.js
@@ -1,44 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-// declare global: tern, server | ||
- | ||
-var server; | ||
- | ||
-this.onmessage = function(e) { | ||
- var data = e.data; | ||
- switch (data.type) { | ||
- case "init": return startServer(data.defs, data.plugins, data.scripts); | ||
- case "add": return server.addFile(data.name, data.text); | ||
- case "del": return server.delFile(data.name); | ||
- case "req": return server.request(data.body, function(err, reqData) { | ||
- postMessage({id: data.id, body: reqData, err: err && String(err)}); | ||
- }); | ||
- case "getFile": | ||
- var c = pending[data.id]; | ||
- delete pending[data.id]; | ||
- return c(data.err, data.text); | ||
- default: throw new Error("Unknown message type: " + data.type); | ||
- } | ||
-}; | ||
- | ||
-var nextId = 0, pending = {}; | ||
-function getFile(file, c) { | ||
- postMessage({type: "getFile", name: file, id: ++nextId}); | ||
- pending[nextId] = c; | ||
-} | ||
- | ||
-function startServer(defs, plugins, scripts) { | ||
- if (scripts) importScripts.apply(null, scripts); | ||
- | ||
- server = new tern.Server({ | ||
- getFile: getFile, | ||
- async: true, | ||
- defs: defs, | ||
- plugins: plugins | ||
- }); | ||
-} | ||
- | ||
-var console = { | ||
- log: function(v) { postMessage({type: "debug", message: v}); } | ||
-}; |
139
public/js/lib/codemirror/addon/wrap/hardwrap.js
@@ -1,139 +0,0 @@ | ||
-// CodeMirror, copyright (c) by Marijn Haverbeke and others | ||
-// Distributed under an MIT license: http://codemirror.net/LICENSE | ||
- | ||
-(function(mod) { | ||
- if (typeof exports == "object" && typeof module == "object") // CommonJS | ||
- mod(require("../../lib/codemirror")); | ||
- else if (typeof define == "function" && define.amd) // AMD | ||
- define(["../../lib/codemirror"], mod); | ||
- else // Plain browser env | ||
- mod(CodeMirror); | ||
-})(function(CodeMirror) { | ||
- "use strict"; | ||
- | ||
- var Pos = CodeMirror.Pos; | ||
- | ||
- function findParagraph(cm, pos, options) { | ||
- var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart"); | ||
- for (var start = pos.line, first = cm.firstLine(); start > first; --start) { | ||
- var line = cm.getLine(start); | ||
- if (startRE && startRE.test(line)) break; | ||
- if (!/\S/.test(line)) { ++start; break; } | ||
- } | ||
- var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd"); | ||
- for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) { | ||
- var line = cm.getLine(end); | ||
- if (endRE && endRE.test(line)) { ++end; break; } | ||
- if (!/\S/.test(line)) break; | ||
- } | ||
- return {from: start, to: end}; | ||
- } | ||
- | ||
- function findBreakPoint(text, column, wrapOn, killTrailingSpace) { | ||
- for (var at = column; at > 0; --at) | ||
- if (wrapOn.test(text.slice(at - 1, at + 1))) break; | ||
- if (at == 0) at = column; | ||
- var endOfText = at; | ||
- if (killTrailingSpace) | ||
- while (text.charAt(endOfText - 1) == " ") --endOfText; | ||
- return {from: endOfText, to: at}; | ||
- } | ||
- | ||
- function wrapRange(cm, from, to, options) { | ||
- from = cm.clipPos(from); to = cm.clipPos(to); | ||
- var column = options.column || 80; | ||
- var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/; | ||
- var killTrailing = options.killTrailingSpace !== false; | ||
- var changes = [], curLine = "", curNo = from.line; | ||
- var lines = cm.getRange(from, to, false); | ||
- if (!lines.length) return null; | ||
- var leadingSpace = lines[0].match(/^[ \t]*/)[0]; | ||
- | ||
- for (var i = 0; i < lines.length; ++i) { | ||
- var text = lines[i], oldLen = curLine.length, spaceInserted = 0; | ||
- if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) { | ||
- curLine += " "; | ||
- spaceInserted = 1; | ||
- } | ||
- var spaceTrimmed = ""; | ||
- if (i) { | ||
- spaceTrimmed = text.match(/^\s*/)[0]; | ||
- text = text.slice(spaceTrimmed.length); | ||
- } | ||
- curLine += text; | ||
- if (i) { | ||
- var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed && | ||
- findBreakPoint(curLine, column, wrapOn, killTrailing); | ||
- // If this isn't broken, or is broken at a different point, remove old break | ||
- if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) { | ||
- changes.push({text: [spaceInserted ? " " : ""], | ||
- from: Pos(curNo, oldLen), | ||
- to: Pos(curNo + 1, spaceTrimmed.length)}); | ||
- } else { | ||
- curLine = leadingSpace + text; | ||
- ++curNo; | ||
- } | ||
- } | ||
- while (curLine.length > column) { | ||
- var bp = findBreakPoint(curLine, column, wrapOn, killTrailing); | ||
- changes.push({text: ["", leadingSpace], | ||
- from: Pos(curNo, bp.from), | ||
- to: Pos(curNo, bp.to)}); | ||
- curLine = leadingSpace + curLine.slice(bp.to); | ||
- ++curNo; | ||
- } | ||
- } | ||
- if (changes.length) cm.operation(function() { | ||
- for (var i = 0; i < changes.length; ++i) { | ||
- var change = changes[i]; | ||
- cm.replaceRange(change.text, change.from, change.to); | ||
- } | ||
- }); | ||
- return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null; | ||
- } | ||
- | ||
- CodeMirror.defineExtension("wrapParagraph", function(pos, options) { | ||
- options = options || {}; | ||
- if (!pos) pos = this.getCursor(); | ||
- var para = findParagraph(this, pos, options); | ||
- return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options); | ||
- }); | ||
- | ||
- CodeMirror.commands.wrapLines = function(cm) { | ||
- cm.operation(function() { | ||
- var ranges = cm.listSelections(), at = cm.lastLine() + 1; | ||
- for (var i = ranges.length - 1; i >= 0; i--) { | ||
- var range = ranges[i], span; | ||
- if (range.empty()) { | ||
- var para = findParagraph(cm, range.head, {}); | ||
- span = {from: Pos(para.from, 0), to: Pos(para.to - 1)}; | ||
- } else { | ||
- span = {from: range.from(), to: range.to()}; | ||
- } | ||
- if (span.to.line >= at) continue; | ||
- at = span.from.line; | ||
- wrapRange(cm, span.from, span.to, {}); | ||
- } | ||
- }); | ||
- }; | ||
- | ||
- CodeMirror.defineExtension("wrapRange", function(from, to, options) { | ||
- return wrapRange(this, from, to, options || {}); | ||
- }); | ||
- | ||
- CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) { | ||
- options = options || {}; | ||
- var cm = this, paras = []; | ||
- for (var line = from.line; line <= to.line;) { | ||
- var para = findParagraph(cm, Pos(line, 0), options); | ||
- paras.push(para); | ||
- line = para.to; | ||
- } | ||
- var madeChange = false; | ||
- if (paras.length) cm.operation(function() { | ||
- for (var i = paras.length - 1; i >= 0; --i) | ||
- madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options); | ||
- }); | ||
- return madeChange; | ||
- }); | ||
-}); |
6
public/js/lib/codemirror/bin/authors.sh
@@ -1,6 +0,0 @@ | ||
-# Combine existing list of authors with everyone known in git, sort, add header. | ||
-tail --lines=+3 AUTHORS > AUTHORS.tmp | ||
-git log --format='%aN' >> AUTHORS.tmp | ||
-echo -e "List of CodeMirror contributors. Updated before every release.\n" > AUTHORS | ||
-sort -u AUTHORS.tmp >> AUTHORS | ||
-rm -f AUTHORS.tmp |
92
public/js/lib/codemirror/bin/compress
@@ -1,92 +0,0 @@ | ||
-#!/usr/bin/env node | ||
- | ||
-// Compression helper for CodeMirror | ||
-// | ||
-// Example: | ||
-// | ||
-// bin/compress codemirror runmode javascript xml | ||
-// | ||
-// Will take lib/codemirror.js, addon/runmode/runmode.js, | ||
-// mode/javascript/javascript.js, and mode/xml/xml.js, run them though | ||
-// the online minifier at http://marijnhaverbeke.nl/uglifyjs, and spit | ||
-// out the result. | ||
-// | ||
-// bin/compress codemirror --local /path/to/bin/UglifyJS | ||
-// | ||
-// Will use a local minifier instead of the online default one. | ||
-// | ||
-// Script files are specified without .js ending. Prefixing them with | ||
-// their full (local) path is optional. So you may say lib/codemirror | ||
-// or mode/xml/xml to be more precise. In fact, even the .js suffix | ||
-// may be speficied, if wanted. | ||
- | ||
-"use strict"; | ||
- | ||
-var fs = require("fs"); | ||
- | ||
-function help(ok) { | ||
- console.log("usage: " + process.argv[1] + " [--local /path/to/uglifyjs] files..."); | ||
- process.exit(ok ? 0 : 1); | ||
-} | ||
- | ||
-var local = null, args = [], extraArgs = null, files = [], blob = ""; | ||
- | ||
-for (var i = 2; i < process.argv.length; ++i) { | ||
- var arg = process.argv[i]; | ||
- if (arg == "--local" && i + 1 < process.argv.length) { | ||
- var parts = process.argv[++i].split(/\s+/); | ||
- local = parts[0]; | ||
- extraArgs = parts.slice(1); | ||
- if (!extraArgs.length) extraArgs = ["-c", "-m"]; | ||
- } else if (arg == "--help") { | ||
- help(true); | ||
- } else if (arg[0] != "-") { | ||
- files.push({name: arg, re: new RegExp("(?:\\/|^)" + arg + (/\.js$/.test(arg) ? "$" : "\\.js$"))}); | ||
- } else help(false); | ||
-} | ||
- | ||
-function walk(dir) { | ||
- fs.readdirSync(dir).forEach(function(fname) { | ||
- if (/^[_\.]/.test(fname)) return; | ||
- var file = dir + fname; | ||
- if (fs.statSync(file).isDirectory()) return walk(file + "/"); | ||
- if (files.some(function(spec, i) { | ||
- var match = spec.re.test(file); | ||
- if (match) files.splice(i, 1); | ||
- return match; | ||
- })) { | ||
- if (local) args.push(file); | ||
- else blob += fs.readFileSync(file, "utf8"); | ||
- } | ||
- }); | ||
-} | ||
- | ||
-walk("lib/"); | ||
-walk("addon/"); | ||
-walk("mode/"); | ||
- | ||
-if (!local && !blob) help(false); | ||
- | ||
-if (files.length) { | ||
- console.log("Some speficied files were not found: " + | ||
- files.map(function(a){return a.name;}).join(", ")); | ||
- process.exit(1); | ||
-} | ||
- | ||
-if (local) { | ||
- require("child_process").spawn(local, args.concat(extraArgs), {stdio: ["ignore", process.stdout, process.stderr]}); | ||
-} else { | ||
- var data = new Buffer("js_code=" + require("querystring").escape(blob), "utf8"); | ||
- var req = require("http").request({ | ||
- host: "marijnhaverbeke.nl", | ||
- port: 80, | ||
- method: "POST", | ||
- path: "/uglifyjs", | ||
- headers: {"content-type": "application/x-www-form-urlencoded", | ||
- "content-length": data.length} | ||
- }); | ||
- req.on("response", function(resp) { | ||
- resp.on("data", function (chunk) { process.stdout.write(chunk); }); | ||
- }); | ||
- req.end(data); | ||
-} |
16
public/js/lib/codemirror/bin/lint
@@ -1,16 +0,0 @@ | ||
-#!/usr/bin/env node | ||
- | ||
-var lint = require("../test/lint/lint"), | ||
- path = require("path"); | ||
- | ||
-if (process.argv.length > 2) { | ||
- lint.checkDir(process.argv[2]); | ||
-} else { | ||
- process.chdir(path.resolve(__dirname, "..")); | ||
- lint.checkDir("lib"); | ||
- lint.checkDir("mode"); | ||
- lint.checkDir("addon"); | ||
- lint.checkDir("keymap"); | ||
-} | ||
- | ||
-process.exit(lint.success() ? 0 : 1); |
46
public/js/lib/codemirror/bin/release
@@ -1,46 +0,0 @@ | ||
-#!/usr/bin/env node | ||
- | ||
-var fs = require("fs"), child = require("child_process"); | ||
- | ||
-var number, bumpOnly; | ||
- | ||
-for (var i = 2; i < process.argv.length; i++) { | ||
- if (process.argv[i] == "-bump") bumpOnly = true; | ||
- else if (/^\d+\.\d+\.\d+$/.test(process.argv[i])) number = process.argv[i]; | ||
- else { console.log("Bogus command line arg: " + process.argv[i]); process.exit(1); } | ||
-} | ||
- | ||
-if (!number) { console.log("Must give a version"); process.exit(1); } | ||
- | ||
-function rewrite(file, f) { | ||
- fs.writeFileSync(file, f(fs.readFileSync(file, "utf8")), "utf8"); | ||
-} | ||
- | ||
-rewrite("lib/codemirror.js", function(lib) { | ||
- return lib.replace(/CodeMirror\.version = "\d+\.\d+\.\d+"/, | ||
- "CodeMirror.version = \"" + number + "\""); | ||
-}); | ||
-function rewriteJSON(pack) { | ||
- return pack.replace(/"version":"\d+\.\d+\.\d+"/, "\"version\":\"" + number + "\""); | ||
-} | ||
-rewrite("package.json", rewriteJSON); | ||
-rewrite("bower.json", rewriteJSON); | ||
-rewrite("doc/manual.html", function(manual) { | ||
- return manual.replace(/>version \d+\.\d+\.\d+<\/span>/, ">version " + number + "</span>"); | ||
-}); | ||
- | ||
-if (bumpOnly) process.exit(0); | ||
- | ||
-child.exec("bash bin/authors.sh", function(){}); | ||
- | ||
-var simple = number.slice(0, number.lastIndexOf(".")); | ||
- | ||
-rewrite("doc/compress.html", function(cmp) { | ||
- return cmp.replace(/<option value="http:\/\/codemirror.net\/">HEAD<\/option>/, | ||
- "<option value=\"http://codemirror.net/\">HEAD</option>\n <option value=\"http://marijnhaverbeke.nl/git/codemirror?a=blob_plain;hb=" + number + ";f=\">" + simple + "</option>"); | ||
-}); | ||
- | ||
-rewrite("index.html", function(index) { | ||
- return index.replace(/<strong>version \d+\.\d+<\/strong>/, | ||
- "<strong>version " + simple + "</strong>"); | ||
-}); |
51
public/js/lib/codemirror/bin/source-highlight
@@ -1,51 +0,0 @@ | ||
-#!/usr/bin/env node | ||
- | ||
-// Simple command-line code highlighting tool. Reads code from stdin, | ||
-// spits html to stdout. For example: | ||
-// | ||
-// echo 'function foo(a) { return a; }' | bin/source-highlight -s javascript | ||
-// bin/source-highlight -s | ||
- | ||
-var fs = require("fs"); | ||
- | ||
-var CodeMirror = require("../addon/runmode/runmode.node.js"); | ||
-require("../mode/meta.js"); | ||
- | ||
-var sPos = process.argv.indexOf("-s"); | ||
-if (sPos == -1 || sPos == process.argv.length - 1) { | ||
- console.error("Usage: source-highlight -s language"); | ||
- process.exit(1); | ||
-} | ||
-var lang = process.argv[sPos + 1].toLowerCase(), modeName = lang; | ||
-CodeMirror.modeInfo.forEach(function(info) { | ||
- if (info.mime == lang) { | ||
- modeName = info.mode; | ||
- } else if (info.name.toLowerCase() == lang) { | ||
- modeName = info.mode; | ||
- lang = info.mime; | ||
- } | ||
-}); | ||
- | ||
-if (!CodeMirror.modes[modeName]) | ||
- require("../mode/" + modeName + "/" + modeName + ".js"); | ||
- | ||
-function esc(str) { | ||
- return str.replace(/[<&]/g, function(ch) { return ch == "&" ? "&" : "<"; }); | ||
-} | ||
- | ||
-var code = fs.readFileSync("/dev/stdin", "utf8"); | ||
-var curStyle = null, accum = ""; | ||
-function flush() { | ||
- if (curStyle) process.stdout.write("<span class=\"" + curStyle.replace(/(^|\s+)/g, "$1cm-") + "\">" + esc(accum) + "</span>"); | ||
- else process.stdout.write(esc(accum)); | ||
-} | ||
- | ||
-CodeMirror.runMode(code, lang, function(text, style) { | ||
- if (style != curStyle) { | ||
- flush(); | ||
- curStyle = style; accum = text; | ||
- } else { | ||
- accum += text; | ||
- } | ||
-}); | ||
-flush(); |
16
public/js/lib/codemirror/bower.json
@@ -1,16 +0,0 @@ | ||
-{ | ||
- "name": "codemirror", | ||
- "version":"4.10.0", | ||
- "main": ["lib/codemirror.js", "lib/codemirror.css"], | ||
- "ignore": [ | ||
- "**/.*", | ||
- "node_modules", | ||
- "components", | ||
- "bin", | ||
- "demo", | ||
- "doc", | ||
- "test", | ||
- "index.html", | ||
- "package.json" | ||
- ] | ||
-} |
200
public/js/lib/codemirror/index.html
@@ -1,200 +0,0 @@ | ||
-<!doctype html> | ||
- | ||
-<title>CodeMirror</title> | ||
-<meta charset="utf-8"/> | ||
- | ||
-<link rel=stylesheet href="lib/codemirror.css"> | ||
-<link rel=stylesheet href="doc/docs.css"> | ||
-<script src="lib/codemirror.js"></script> | ||
-<script src="mode/xml/xml.js"></script> | ||
-<script src="mode/javascript/javascript.js"></script> | ||
-<script src="mode/css/css.js"></script> | ||
-<script src="mode/htmlmixed/htmlmixed.js"></script> | ||
-<script src="addon/edit/matchbrackets.js"></script> | ||
- | ||
-<script src="doc/activebookmark.js"></script> | ||
- | ||
-<style> | ||
- .CodeMirror { height: auto; border: 1px solid #ddd; } | ||
- .CodeMirror-scroll { max-height: 200px; } | ||
- .CodeMirror pre { padding-left: 7px; line-height: 1.25; } | ||
-</style> | ||
- | ||
-<div id=nav> | ||
- <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="doc/logo.png"></a> | ||
- | ||
- <ul> | ||
- <li><a class=active data-default="true" href="#description">Home</a> | ||
- <li><a href="doc/manual.html">Manual</a> | ||
- <li><a href="https://github.com/codemirror/codemirror">Code</a> | ||
- </ul> | ||
- <ul> | ||
- <li><a href="#features">Features</a> | ||
- <li><a href="#community">Community</a> | ||
- <li><a href="#browsersupport">Browser support</a> | ||
- </ul> | ||
-</div> | ||
- | ||
-<article> | ||
- | ||
-<section id=description class=first> | ||
- <p><strong>CodeMirror</strong> is a versatile text editor | ||
- implemented in JavaScript for the browser. It is specialized for | ||
- editing code, and comes with a number of <a href="mode/index.html">language modes</a> and <a href="doc/manual.html#addons">addons</a> | ||
- that implement more advanced editing functionality.</p> | ||
- | ||
- <p>A rich <a href="doc/manual.html#api">programming API</a> and a | ||
- CSS <a href="doc/manual.html#styling">theming</a> system are | ||
- available for customizing CodeMirror to fit your application, and | ||
- extending it with new functionality.</p> | ||
-</section> | ||
- | ||
-<section id=demo> | ||
- <h2>This is CodeMirror</h2> | ||
- <form style="position: relative; margin-top: .5em;"><textarea id=demotext> | ||
-<!-- Create a simple CodeMirror instance --> | ||
-<link rel="stylesheet" href="lib/codemirror.css"> | ||
-<script src="lib/codemirror.js"></script> | ||
-<script> | ||
- var editor = CodeMirror.fromTextArea(myTextarea, { | ||
- lineNumbers: true | ||
- }); | ||
-</script></textarea> | ||
- <select id="demolist" onchange="document.location = this.options[this.selectedIndex].value;"> | ||
- <option value="#">Other demos...</option> | ||
- <option value="demo/complete.html">Autocompletion</option> | ||
- <option value="demo/folding.html">Code folding</option> | ||
- <option value="demo/theme.html">Themes</option> | ||
- <option value="mode/htmlmixed/index.html">Mixed language modes</option> | ||
- <option value="demo/bidi.html">Bi-directional text</option> | ||
- <option value="demo/variableheight.html">Variable font sizes</option> | ||
- <option value="demo/search.html">Search interface</option> | ||
- <option value="demo/vim.html">Vim bindings</option> | ||
- <option value="demo/emacs.html">Emacs bindings</option> | ||
- <option value="demo/sublime.html">Sublime Text bindings</option> | ||
- <option value="demo/tern.html">Tern integration</option> | ||
- <option value="demo/merge.html">Merge/diff interface</option> | ||
- <option value="demo/fullscreen.html">Full-screen editor</option> | ||
- <option value="demo/simplescrollbars.html">Custom scrollbars</option> | ||
- </select></form> | ||
- <script> | ||
- var editor = CodeMirror.fromTextArea(document.getElementById("demotext"), { | ||
- lineNumbers: true, | ||
- mode: "text/html", | ||
- matchBrackets: true | ||
- }); | ||
- </script> | ||
- <div style="position: relative; margin: 1em 0;"> | ||
- <a class="bigbutton left" href="http://codemirror.net/codemirror.zip">DOWNLOAD LATEST RELEASE</a> | ||
- <div><strong>version 4.10</strong> (<a href="doc/releases.html">Release notes</a>)</div> | ||
- <div>or use the <a href="doc/compress.html">minification helper</a></div> | ||
- <div style="position: absolute; top: 0; right: 0; text-align: right"> | ||
- <span class="bigbutton right" onclick="document.getElementById('paypal').submit();">DONATE WITH PAYPAL</span> | ||
- <div style="position: relative"> | ||
- or <span onclick="document.getElementById('bankinfo').style.display = 'block';" class=quasilink>Bank</span>, | ||
- <span onclick="document.getElementById('bcinfo').style.display = 'block';" class=quasilink>Bitcoin</span>, | ||
- <a href="http://www.patreon.com/marijn">Patreon</a><br> | ||
- <a href="https://gratipay.com/marijnh/">Gratipay</a><br> | ||
- <div id=bankinfo class=bankinfo> | ||
- <span class=bankinfo_close onclick="document.getElementById('bankinfo').style.display = '';">×</span> | ||
- Bank: <i>Rabobank</i><br/> | ||
- Country: <i>Netherlands</i><br/> | ||
- SWIFT: <i>RABONL2U</i><br/> | ||
- Account: <i>147850770</i><br/> | ||
- Name: <i>Marijn Haverbeke</i><br/> | ||
- IBAN: <i>NL26 RABO 0147 8507 70</i> | ||
- </div> | ||
- <div id=bcinfo class=bankinfo> | ||
- <span class=bankinfo_close onclick="document.getElementById('bcinfo').style.display = '';">×</span> | ||
- Bitcoin address: 1HVnnU8E9yLPeFyNgNtUPB5deXBvUmZ6Nx | ||
- </div> | ||
- <form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="paypal"> | ||
- <input type="hidden" name="cmd" value="_s-xclick"/> | ||
- <input type="hidden" name="hosted_button_id" value="3FVHS5FGUY7CC"/> | ||
- </form> | ||
- </div> | ||
- <div> | ||
- Purchase <a href="http://codemirror.com">commercial support</a> | ||
- </div> | ||
- </div> | ||
- </div> | ||
-</section> | ||
- | ||
-<section id=features> | ||
- <h2>Features</h2> | ||
- <ul> | ||
- <li>Support for <a href="mode/index.html">over 60 languages</a> out of the box | ||
- <li>A powerful, <a href="mode/htmlmixed/index.html">composable</a> language mode <a href="doc/manual.html#modeapi">system</a> | ||
- <li><a href="doc/manual.html#addon_show-hint">Autocompletion</a> (<a href="demo/xmlcomplete.html">XML</a>) | ||
- <li><a href="doc/manual.html#addon_foldcode">Code folding</a> | ||
- <li><a href="doc/manual.html#option_extraKeys">Configurable</a> keybindings | ||
- <li><a href="demo/vim.html">Vim</a>, <a href="demo/emacs.html">Emacs</a>, and <a href="demo/sublime.html">Sublime Text</a> bindings | ||
- <li><a href="doc/manual.html#addon_search">Search and replace</a> interface | ||
- <li><a href="doc/manual.html#addon_matchbrackets">Bracket</a> and <a href="doc/manual.html#addon_matchtags">tag</a> matching | ||
- <li>Support for <a href="demo/buffers.html">split views</a> | ||
- <li><a href="doc/manual.html#addon_lint">Linter integration</a> | ||
- <li><a href="demo/variableheight.html">Mixing font sizes and styles</a> | ||
- <li><a href="demo/theme.html">Various themes</a> | ||
- <li>Able to <a href="demo/resize.html">resize to fit content</a> | ||
- <li><a href="doc/manual.html#mark_replacedWith">Inline</a> and <a href="doc/manual.html#addLineWidget">block</a> widgets | ||
- <li>Programmable <a href="demo/marker.html">gutters</a> | ||
- <li>Making ranges of text <a href="doc/manual.html#markText">styled, read-only, or atomic</a> | ||
- <li><a href="demo/bidi.html">Bi-directional text</a> support | ||
- <li>Many other <a href="doc/manual.html#api">methods</a> and <a href="doc/manual.html#addons">addons</a>... | ||
- </ul> | ||
-</section> | ||
- | ||
-<section id=community> | ||
- <h2>Community</h2> | ||
- | ||
- <p>CodeMirror is an open-source project shared under | ||
- an <a href="LICENSE">MIT license</a>. It is the editor used in the | ||
- dev tools for | ||
- both <a href="https://hacks.mozilla.org/2013/11/firefox-developer-tools-episode-27-edit-as-html-codemirror-more/">Firefox</a> | ||
- and <a href="https://developers.google.com/chrome-developer-tools/">Chrome</a>, <a href="http://www.lighttable.com/">Light | ||
- Table</a>, <a href="http://brackets.io/">Adobe | ||
- Brackets</a>, <a href="http://blog.bitbucket.org/2013/05/14/edit-your-code-in-the-cloud-with-bitbucket/">Bitbucket</a>, | ||
- and <a href="doc/realworld.html">many other projects</a>.</p> | ||
- | ||
- <p>Development and bug tracking happens | ||
- on <a href="https://github.com/codemirror/CodeMirror/">github</a> | ||
- (<a href="http://marijnhaverbeke.nl/git/codemirror">alternate git | ||
- repository</a>). | ||
- Please <a href="http://codemirror.net/doc/reporting.html">read these | ||
- pointers</a> before submitting a bug. Use pull requests to submit | ||
- patches. All contributions must be released under the same MIT | ||
- license that CodeMirror uses.</p> | ||
- | ||
- <p>Discussion around the project is done on | ||
- a <a href="http://discuss.codemirror.net">discussion forum</a>. | ||
- There is also | ||
- the <a href="http://groups.google.com/group/codemirror-announce">codemirror-announce</a> | ||
- list, which is only used for major announcements (such as new | ||
- versions). If needed, you can | ||
- contact <a href="mailto:marijnh@gmail.com">the maintainer</a> | ||
- directly.</p> | ||
- | ||
- <p>A list of CodeMirror-related software that is not part of the | ||
- main distribution is maintained | ||
- on <a href="https://github.com/codemirror/CodeMirror/wiki/CodeMirror-addons">our | ||
- wiki</a>. Feel free to add your project.</p> | ||
-</section> | ||
- | ||
-<section id=browsersupport> | ||
- <h2>Browser support</h2> | ||
- <p>The <em>desktop</em> versions of the following browsers, | ||
- in <em>standards mode</em> (HTML5 <code><!doctype html></code> | ||
- recommended) are supported:</p> | ||
- <table style="margin-bottom: 1em"> | ||
- <tr><th>Firefox</th><td>version 4 and up</td></tr> | ||
- <tr><th>Chrome</th><td>any version</td></tr> | ||
- <tr><th>Safari</th><td>version 5.2 and up</td></tr> | ||
- <tr><th style="padding-right: 1em;">Internet Explorer</th><td>version 8 and up</td></tr> | ||
- <tr><th>Opera</th><td>version 9 and up</td></tr> | ||
- </table> | ||
- <p>Modern mobile browsers tend to partly work. Bug reports and | ||
- patches for mobile support are welcome, but the maintainer does not | ||
- have the time or budget to actually work on it himself.</p> | ||
-</section> | ||
- | ||
-</article> |
0
public/js/lib/codemirror/keymap/emacs.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/keymap/sublime.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/keymap/vim.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/lib/codemirror.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/lib/codemirror.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/css/css.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/css/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/css/less.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/css/less_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/css/scss.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/css/scss_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/css/test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/htmlembedded/htmlembedded.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/htmlembedded/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/htmlmixed/htmlmixed.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/htmlmixed/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/jade/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/jade/jade.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/javascript/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/javascript/javascript.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/javascript/json-ld.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/javascript/test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/javascript/typescript.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/markdown/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/markdown/markdown.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/markdown/test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/meta.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/xml/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/xml/test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/xml/xml.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/yaml/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/mode/yaml/yaml.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/package.json
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/comment_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/doc_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/driver.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/emacs_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/index.html
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/lint/acorn.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/lint/lint.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/lint/walk.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/mode_test.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/mode_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/multi_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/phantom_driver.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/run.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/scroll_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/search_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/sublime_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/test/vim_test.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/3024-day.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/3024-night.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/ambiance-mobile.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/ambiance.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/base16-dark.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/base16-light.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/blackboard.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/cobalt.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/eclipse.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/elegant.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/erlang-dark.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/lesser-dark.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/mbo.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/mdn-like.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/midnight.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/monokai.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/neat.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/neo.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/night.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/paraiso-dark.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/paraiso-light.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/pastel-on-dark.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/rubyblue.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/solarized.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/the-matrix.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/tomorrow-night-bright.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/tomorrow-night-eighties.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/twilight.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/vibrant-ink.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/xq-dark.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/xq-light.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/codemirror/theme/zenburn.css
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/jquery-2.1.1.min.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/ramda/ramda.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
public/js/lib/ramda/ramda.min.js
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
server/views/coursewares/showBonfire.jade
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
server/views/coursewares/showHTML.jade
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
server/views/coursewares/showJS.jade
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
server/views/coursewares/showStep.jade
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
server/views/coursewares/showZiplineOrBasejump.jade
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
server/views/partials/challenge-footer.jade
Sorry, we could not display the changes to this file because there were too many other changes to display.
0
server/views/partials/scripts.jade
Sorry, we could not display the changes to this file because there were too many other changes to display.
0 comments on commit
87fa381