From 9749663996c61f8b75f3546e48282895ae904f0b Mon Sep 17 00:00:00 2001 From: MCHost Date: Tue, 24 Jun 2025 00:32:24 -0400 Subject: [PATCH] bring remote assets to local --- web/assets/main.css | 436 +- web/file.html | 32 +- web/fonts/Comfortaa-Bold.ttf | Bin 0 -> 111168 bytes web/fonts/Comfortaa-Regular.ttf | Bin 0 -> 111272 bytes web/fonts/cascadia-code.css | 13 + web/fonts/comfortaa.css | 31 + .../material-symbols-filled-rounded-300.woff2 | Bin 0 -> 321876 bytes ...aterial-symbols-outlined-rounded-300.woff2 | Bin 0 -> 267532 bytes web/fonts/material-symbols-outlined.css | 55 + web/fonts/poppins.css | 55 + web/index.html | 16 +- web/lib/axios.min.js | 2 + web/lib/codemirror5-activeLine.js | 72 + web/lib/codemirror5-closeBrackets.js | 201 + web/lib/codemirror5-loadMode.js | 66 + web/lib/codemirror5-overlay.js | 90 + web/lib/codemirror5-scrollPastEnd.js | 48 + web/lib/codemirror5.css | 344 + web/lib/codemirror5.js | 9874 +++++++++++++++++ web/lib/dayjs.min.js | 1 + web/lib/focus-trap.min.js | 4 + web/lib/marked.min.js | 6 + web/lib/tabbable.min.js | 4 + web/utils.js | 323 + web/v2/base.css | 1178 ++ web/v2/base.js | 810 ++ web/v2/themes.css | 338 + web/worker.js | 43 +- 28 files changed, 13769 insertions(+), 273 deletions(-) create mode 100644 web/fonts/Comfortaa-Bold.ttf create mode 100644 web/fonts/Comfortaa-Regular.ttf create mode 100644 web/fonts/cascadia-code.css create mode 100644 web/fonts/comfortaa.css create mode 100644 web/fonts/material-symbols-filled-rounded-300.woff2 create mode 100644 web/fonts/material-symbols-outlined-rounded-300.woff2 create mode 100644 web/fonts/material-symbols-outlined.css create mode 100644 web/fonts/poppins.css create mode 100644 web/lib/axios.min.js create mode 100644 web/lib/codemirror5-activeLine.js create mode 100644 web/lib/codemirror5-closeBrackets.js create mode 100644 web/lib/codemirror5-loadMode.js create mode 100644 web/lib/codemirror5-overlay.js create mode 100644 web/lib/codemirror5-scrollPastEnd.js create mode 100644 web/lib/codemirror5.css create mode 100644 web/lib/codemirror5.js create mode 100644 web/lib/dayjs.min.js create mode 100644 web/lib/focus-trap.min.js create mode 100644 web/lib/marked.min.js create mode 100644 web/lib/tabbable.min.js create mode 100644 web/utils.js create mode 100644 web/v2/base.css create mode 100644 web/v2/base.js create mode 100644 web/v2/themes.css diff --git a/web/assets/main.css b/web/assets/main.css index 3276fdc..314c6ef 100644 --- a/web/assets/main.css +++ b/web/assets/main.css @@ -1,406 +1,406 @@ * { - min-width: 0px; - min-height: 0px; + min-width: 0px; + min-height: 0px; } .darkmuted { - /* Background and foreground */ - --b0: hsl(215, 25%, 8%); - --b1: hsl(215, 25%, 12%); - --b2: hsl(215, 25%, 16%); - --b3: hsl(215, 25%, 20%); - --b4: hsl(215, 25%, 30%); - --b5: hsl(215, 25%, 40%); - --f4: hsl(215, 25%, 55%); - --f3: hsl(215, 25%, 70%); - --f2: hsl(215, 25%, 85%); - --f1: white; + /* Background and foreground */ + --b0: hsl(215, 25%, 8%); + --b1: hsl(215, 25%, 12%); + --b2: hsl(215, 25%, 16%); + --b3: hsl(215, 25%, 20%); + --b4: hsl(215, 25%, 30%); + --b5: hsl(215, 25%, 40%); + --f4: hsl(215, 25%, 55%); + --f3: hsl(215, 25%, 70%); + --f2: hsl(215, 25%, 85%); + --f1: white; } .btn, .textbox { - border-radius: 8px; + border-radius: 8px; } .btn.iconOnly .icon { - margin: 0px; + margin: 0px; } .btn:focus-visible { - outline: 2px solid var(--f2); + outline: 2px solid var(--f2); } .textbox, .textbox.textarea > textarea { - padding: 0px 12px; - padding-top: 2px; + padding: 0px 12px; + padding-top: 2px; } .textbox.textarea { - padding: 8px 0px; + padding: 8px 0px; } .popup { - border-radius: 16px; + border-radius: 16px; } .context { - border-radius: 12px; - padding: 4px; - gap: 4px; + border-radius: 12px; + padding: 4px; + gap: 4px; } .context > .item { - border-radius: 8px; + border-radius: 8px; } label.selectOption input[type="radio"], label.selectOption input[type="checkbox"] { - margin-top: -0.05em; + margin-top: -0.05em; } .tooltip { - /* padding: 6px 12px; */ - padding: 8px 12px 5px 12px; - border-radius: 8px; + /* padding: 6px 12px; */ + padding: 8px 12px 5px 12px; + border-radius: 8px; } .toastOverlay > .toast > .body { - /* padding: 15px 5px; */ - padding-top: 18px; + /* padding: 15px 5px; */ + padding-top: 18px; } .popup > .body { - padding-top: 5px; + padding-top: 5px; } body { - --fontDefault: 'Comfortaa'; + --fontDefault: 'Comfortaa'; } #main { - position: absolute; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - overflow: hidden; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + overflow: hidden; } #navbar { - padding: 8px 16px; - border-bottom: 1px solid var(--b3); + padding: 8px 16px; + border-bottom: 1px solid var(--b3); } #fileHeader .icon { - font-family: 'Material Symbols Filled Rounded'; - font-size: 28px; - color: var(--f3); - user-select: none; + font-family: 'Material Symbols Filled Rounded'; + font-size: 28px; + color: var(--f3); + user-select: none; } #fileHeader .path { - font-size: 14px; - color: var(--f4); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + font-size: 14px; + color: var(--f4); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } #fileHeader .name { - font-size: 18px; - color: var(--f1); - font-weight: bold; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + font-size: 18px; + color: var(--f1); + font-weight: bold; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } #controls { - padding: 8px 16px; - border: 1px solid var(--b3); - border-width: 0px 0px 1px 0px; - overflow-x: auto; - overflow-y: hidden; + padding: 8px 16px; + border: 1px solid var(--b3); + border-width: 0px 0px 1px 0px; + overflow-x: auto; + overflow-y: hidden; } #controls::-webkit-scrollbar { - height: 3px; - background: transparent; + height: 3px; + background: transparent; } #controls::-webkit-scrollbar-thumb { - background: var(--b4); + background: var(--b4); } #controls::-webkit-scrollbar-thumb:hover { - background: var(--b5); + background: var(--b5); } #controls .sep { - width: 1px; - height: 20px; - margin: 0px 5px; - background-color: var(--b3); + width: 1px; + height: 20px; + margin: 0px 5px; + background-color: var(--b3); } #controls .selectOption { - font-size: 14px; - color: var(--f2); - margin-top: 5px; + font-size: 14px; + color: var(--f2); + margin-top: 5px; } #controls .selectOption input { - font-size: 28px; + font-size: 28px; } #fileColHeadings { - padding: 10px 24px 6px 24px; - font-weight: bold; - color: var(--b5); - font-size: 14px; - user-select: none; - overflow-y: scroll; - scrollbar-gutter: stable; + padding: 10px 24px 6px 24px; + font-weight: bold; + color: var(--b5); + font-size: 14px; + user-select: none; + overflow-y: scroll; + scrollbar-gutter: stable; } #fileColHeadings.tiles { - display: none; + display: none; } #files { - overflow-x: hidden; - overflow-y: auto; - height: 0px; - padding: 4px; - padding-top: 2px; - scrollbar-gutter: stable; + overflow-x: hidden; + overflow-y: auto; + height: 0px; + padding: 4px; + padding-top: 2px; + scrollbar-gutter: stable; } #files:not(.tiles) > .heading { - display: none; + display: none; } #files.tiles > .heading { - display: block; - padding: 12px 20px 4px 20px; - font-weight: bold; - color: var(--b5); - font-size: 14px; - user-select: none; - flex-shrink: 0; + display: block; + padding: 12px 20px 4px 20px; + font-weight: bold; + color: var(--b5); + font-size: 14px; + user-select: none; + flex-shrink: 0; } #files > .section { - display: flex; - flex-direction: column; - flex-shrink: 0; - gap: 2px; + display: flex; + flex-direction: column; + flex-shrink: 0; + gap: 2px; } #files.tiles > .section { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + display: grid; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .fileEntry { - height: auto; - padding: 6px 20px 5px 20px; - justify-content: flex-start; - --bg: transparent; - --fg: var(--f2); - --bgHover: var(--b2); - --bgActive: var(--b3); - font-weight: normal; - text-align: left; - gap: 10px; + height: auto; + padding: 6px 20px 5px 20px; + justify-content: flex-start; + --bg: transparent; + --fg: var(--f2); + --bgHover: var(--b2); + --bgActive: var(--b3); + font-weight: normal; + text-align: left; + gap: 10px; } .fileEntry.search { - padding-top: 9px; - padding-bottom: 7px; + padding-top: 9px; + padding-bottom: 7px; } .fileEntry.search .nameCont .path { - margin-bottom: -2px; + margin-bottom: -2px; } #files.tiles .fileEntry { - height: auto; - padding-top: 11px; - padding-bottom: 9px; - gap: 12px; + height: auto; + padding-top: 11px; + padding-bottom: 9px; + gap: 12px; } #files:not(.showHidden) .fileEntry.hidden { - display: none; + display: none; } .fileEntry > .icon { - color: var(--f3); - font-family: 'Material Symbols Filled Rounded'; + color: var(--f3); + font-family: 'Material Symbols Filled Rounded'; } #files.tiles .fileEntry > .icon { - font-size: 32px; + font-size: 32px; } .fileEntry > .nameCont { - gap: 4px; + gap: 4px; } .fileEntry > .nameCont .name { - color: var(--f1); + color: var(--f1); } .fileEntry > .nameCont .lower { - display: none; - font-size: 14px; - color: var(--f3); + display: none; + font-size: 14px; + color: var(--f3); } #files.tiles .fileEntry > .nameCont .lower { - display: block; + display: block; } .fileEntry * { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } #files.tiles .fileEntry > :not(.icon):not(.nameCont) { - display: none; + display: none; } .fileEntry > .date, #fileColHeadings > .date { - width: 150px; + width: 150px; } .fileEntry > .size, #fileColHeadings > .size { - width: 100px; + width: 100px; } .fileEntry > .perms, #fileColHeadings > .perms { - width: 100px; + width: 100px; } .fileEntry.selected { - --bg: var(--blue0); - --fg: var(--f1); - --bgHover: var(--blue1); - --bgActive: var(--blue2); + --bg: var(--blue0); + --fg: var(--f1); + --bgHover: var(--blue1); + --bgActive: var(--blue2); } .fileEntry.selected > .icon, .fileEntry.selected > .nameCont .lower { - color: var(--f1); + color: var(--f1); } .fileEntry.hidden:not(.selected) > * { - opacity: 0.5; + opacity: 0.5; } .fileEntry.cut:not(.selected) { - opacity: 0.5; + opacity: 0.5; } .permsMatrix .header, .permsMatrix .cell { - width: 70px; - height: 40px; + width: 70px; + height: 40px; } .permsMatrix .cell { - display: flex; - align-items: center; - justify-content: center; - font-size: 18px; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; } .permsMatrix .header { - font-size: 14px; - color: var(--f3); - display: flex; + font-size: 14px; + color: var(--f3); + display: flex; } .permsMatrix .header.top { - height: 20px; - text-align: center; - justify-content: center; - padding-bottom: 3px; + height: 20px; + text-align: center; + justify-content: center; + padding-bottom: 3px; } .permsMatrix .header.left { - width: 50px; - text-align: right; - justify-content: flex-end; - align-items: center; + width: 50px; + text-align: right; + justify-content: flex-end; + align-items: center; } #preview { - overflow: auto; + overflow: auto; } #preview.image, #preview.video { - background: black; + background: black; } #preview.audio { - padding: 10px; + padding: 10px; } #preview.image { - justify-content: initial; - align-items: initial; - cursor: grab; + justify-content: initial; + align-items: initial; + cursor: grab; } #preview img { - flex-shrink: 0; - margin: auto; + flex-shrink: 0; + margin: auto; } #preview video { - max-width: 100%; - max-height: 100%; - object-fit: contain; + max-width: 100%; + max-height: 100%; + object-fit: contain; } #preview audio { - width: 500px; + width: 500px; } #preview .CodeMirror { - width: 1200px; - height: 100%; - border: none; - border-left: 1px solid var(--b2); - border-right: 1px solid var(--b2); + width: 1200px; + height: 100%; + border: none; + border-left: 1px solid var(--b2); + border-right: 1px solid var(--b2); } #preview.markdown .rendered { - width: 1200px; - padding: 20px; - margin: auto; + width: 1200px; + padding: 20px; + margin: auto; } #progressBar { - border-radius: 0px; - margin: 0px; - height: 3px; - display: none; + border-radius: 0px; + margin: 0px; + height: 3px; + display: none; } #progressBar.visible { - display: block; + display: block; } #statusBar { - padding: 8px 10px 6px 10px; - font-size: 15px; - color: var(--f4); - border-top: 1px solid var(--b3); - line-height: 1.2; + padding: 8px 10px 6px 10px; + font-size: 15px; + color: var(--f4); + border-top: 1px solid var(--b3); + line-height: 1.2; } #statusBar.error { - color: var(--red2); + color: var(--red2); } #connectionManager .entry > .icon { - font-family: 'Material Symbols Outlined Rounded'; - font-size: 32px; - color: var(--f3); - user-select: none; + font-family: 'Material Symbols Outlined Rounded'; + font-size: 32px; + color: var(--f3); + user-select: none; } #connectionManager .entry > .row { - gap: 8px 20px; + gap: 8px 20px; } .moveFilesPicker .folders { - border-radius: 12px; - padding: 4px; - gap: 2px; - border: 1px solid var(--b3); - height: 300px; - overflow-y: auto; + border-radius: 12px; + padding: 4px; + gap: 2px; + border: 1px solid var(--b3); + height: 300px; + overflow-y: auto; } /* 540px */ @media (max-width: 640px) { - .atLeast640px { - display: none; - } + .atLeast640px { + display: none; + } } @media (min-width: 641px) { - .atMost640px { - display: none; - } + .atMost640px { + display: none; + } } /* 800px */ @media (max-width: 800px) { - .atLeast800px { - display: none; - } + .atLeast800px { + display: none; + } } @media (min-width: 801px) { - .atMost800px { - display: none; - } + .atMost800px { + display: none; + } } /* 1000px */ @media (max-width: 1000px) { - .atLeast1000px { - display: none; - } + .atLeast1000px { + display: none; + } } @media (min-width: 1001px) { - .atMost1000px { - display: none; - } + .atMost1000px { + display: none; + } } \ No newline at end of file diff --git a/web/file.html b/web/file.html index da2ea32..b334d71 100644 --- a/web/file.html +++ b/web/file.html @@ -10,23 +10,23 @@ - - - + + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/web/fonts/Comfortaa-Bold.ttf b/web/fonts/Comfortaa-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..28ca423f5266aa12fa8a3aee30d42b3d8b20e5ec GIT binary patch literal 111168 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 literal 0 HcmV?d00001 diff --git a/web/fonts/Comfortaa-Regular.ttf b/web/fonts/Comfortaa-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6023bde166b5b43bc667e2e3469c4271ad534c69 GIT binary patch literal 111272 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

;Y;U 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

"+(u?e:D(e,!0))+"
\n"},t.blockquote=function(e){return"
\n"+e+"
\n"},t.html=function(e){return e},t.heading=function(e,t,u,n){return this.options.headerIds?"'+e+"\n":""+e+"\n"},t.hr=function(){return this.options.xhtml?"
\n":"
\n"},t.list=function(e,t,u){var n=t?"ol":"ul";return"<"+n+(t&&1!==u?' start="'+u+'"':"")+">\n"+e+"\n"},t.listitem=function(e){return"
  • "+e+"
  • \n"},t.checkbox=function(e){return" "},t.paragraph=function(e){return"

    "+e+"

    \n"},t.table=function(e,t){return"\n\n"+e+"\n"+(t=t&&""+t+"")+"
    \n"},t.tablerow=function(e){return"\n"+e+"\n"},t.tablecell=function(e,t){var u=t.header?"th":"td";return(t.align?"<"+u+' align="'+t.align+'">':"<"+u+">")+e+"\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+""},t.br=function(){return this.options.xhtml?"
    ":"
    "},t.del=function(e){return""+e+""},t.link=function(e,t,u){if(null===(e=g(this.options.sanitize,this.options.baseUrl,e)))return u;e='
    "},t.image=function(e,t,u){if(null===(e=g(this.options.sanitize,this.options.baseUrl,e)))return u;e=''+u+'":">"},t.text=function(e){return e},e}(),S=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,u){return""+u},t.image=function(e,t,u){return""+u},t.br=function(){return""},e}(),T=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var u=e,n=0;if(this.seen.hasOwnProperty(u))for(n=this.seen[e];u=e+"-"+ ++n,this.seen.hasOwnProperty(u););return t||(this.seen[e]=n,this.seen[u]=0),u},t.slug=function(e,t){void 0===t&&(t={});e=this.serialize(e);return this.getNextSafeSlug(e,t.dryrun)},e}(),R=function(){function u(e){this.options=e||r.defaults,this.options.renderer=this.options.renderer||new $,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new S,this.slugger=new T}u.parse=function(e,t){return new u(t).parse(e)},u.parseInline=function(e,t){return new u(t).parseInline(e)};var e=u.prototype;return e.parse=function(e,t){void 0===t&&(t=!0);for(var u,n,r,i,s,l,a,o,D,c,h,p,f,g,F,A,d="",C=e.length,k=0;kAn error occurred:

    "+D(e.message+"",!0)+"
    ";throw e}}I.options=I.setOptions=function(e){return d(I.defaults,e),e=I.defaults,r.defaults=e,I},I.getDefaults=e,I.defaults=r.defaults,I.use=function(){for(var e=arguments.length,t=new Array(e),u=0;uAn error occurred:

    "+D(e.message+"",!0)+"
    ";throw e}},I.Parser=R,I.parser=R.parse,I.Renderer=$,I.TextRenderer=S,I.Lexer=z,I.lexer=z.lex,I.Tokenizer=w,I.Slugger=T;var A=(I.parse=I).options,P=I.setOptions,Q=I.use,U=I.walkTokens,M=I.parseInline,N=I,X=R.parse,G=z.lex;r.Lexer=z,r.Parser=R,r.Renderer=$,r.Slugger=T,r.TextRenderer=S,r.Tokenizer=w,r.getDefaults=e,r.lexer=G,r.marked=I,r.options=A,r.parse=N,r.parseInline=M,r.parser=X,r.setOptions=P,r.use=Q,r.walkTokens=U,Object.defineProperty(r,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/web/lib/tabbable.min.js b/web/lib/tabbable.min.js new file mode 100644 index 0000000..d7f1123 --- /dev/null +++ b/web/lib/tabbable.min.js @@ -0,0 +1,4 @@ +/*! +* tabbable 5.3.2 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/ !function(e,t){var n,o;"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):(n=(e="undefined"!=typeof globalThis?globalThis:e||self).tabbable,t(o=e.tabbable={}),o.noConflict=function(){return e.tabbable=n,o})}(this,function(e){"use strict";var t=["input","select","textarea","a[href]","button","[tabindex]:not(slot)","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"details>summary:first-of-type","details"],n=t.join(","),o="undefined"==typeof Element,r=o?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,a=!o&&Element.prototype.getRootNode?function(e){return e.getRootNode()}:function(e){return e.ownerDocument},i=function e(t,o,a){var i=Array.prototype.slice.apply(t.querySelectorAll(n));return o&&r.call(t,n)&&i.unshift(t),i=i.filter(a)},u=function e(t,o,a){for(var i=[],u=Array.from(t);u.length;){var l=u.shift();if("SLOT"===l.tagName){var c=l.assignedElements(),d=c.length?c:l.children,f=e(d,!0,a);a.flatten?i.push.apply(i,f):i.push({scope:l,candidates:f})}else{r.call(l,n)&&a.filter(l)&&(o||!t.includes(l))&&i.push(l);var s=l.shadowRoot||"function"==typeof a.getShadowRoot&&a.getShadowRoot(l);if(s){var p=e(!0===s?l.children:s.children,!0,a);a.flatten?i.push.apply(i,p):i.push({scope:l,candidates:p})}else u.unshift.apply(u,l.children)}}return i},l=function e(t,n){return t.tabIndex<0&&(n||/^(AUDIO|VIDEO|DETAILS)$/.test(t.tagName)||t.isContentEditable)&&isNaN(parseInt(t.getAttribute("tabindex"),10))?0:t.tabIndex},c=function e(t,n){return t.tabIndex===n.tabIndex?t.documentOrder-n.documentOrder:t.tabIndex-n.tabIndex},d=function e(t){return"INPUT"===t.tagName},f=function e(t,n){for(var o=0;osummary:first-of-type")?t.parentElement:t;if(r.call(u,"details:not([open]) *"))return!0;var l=a(t).host,c=(null==l?void 0:l.ownerDocument.contains(l))||t.ownerDocument.contains(t);if(o&&"full"!==o){if("non-zero-area"===o)return h(t)}else{if("function"==typeof i){for(var d=t;t;){var f=t.parentElement,s=a(t);if(f&&!f.shadowRoot&&!0===i(f))return h(t);t=t.assignedSlot?t.assignedSlot:f||s===t.ownerDocument?f:s.host}t=d}if(c)return!t.getClientRects().length}return!1},m=function e(t){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(t.tagName))for(var n=t.parentElement;n;){if("FIELDSET"===n.tagName&&n.disabled){for(var o=0;ol(n))&&!!y(t,n)},g=function e(t){var n=[],o=[];return t.forEach(function(t,r){var a=!!t.scope,i=a?t.scope:t,u=l(i,a),c=a?e(t.candidates):i;0===u?a?n.push.apply(n,c):n.push(i):o.push({documentOrder:r,tabIndex:u,item:t,isScope:a,content:c})}),o.sort(c).reduce(function(e,t){return t.isScope?e.push.apply(e,t.content):e.push(t.content),e},[]).concat(n)},S=function e(t,n){var o;return o=(n=n||{}).getShadowRoot?u([t],n.includeContainer,{filter:v.bind(null,n),flatten:!1,getShadowRoot:n.getShadowRoot}):i(t,n.includeContainer,v.bind(null,n)),g(o)},$=function e(t,n){var o;return(n=n||{}).getShadowRoot?u([t],n.includeContainer,{filter:y.bind(null,n),flatten:!0,getShadowRoot:n.getShadowRoot}):i(t,n.includeContainer,y.bind(null,n))},w=function e(t,o){if(o=o||{},!t)throw Error("No node provided");return!1!==r.call(t,n)&&v(o,t)},E=t.concat("iframe").join(","),R=function e(t,n){if(n=n||{},!t)throw Error("No node provided");return!1!==r.call(t,E)&&y(n,t)};e.focusable=$,e.isFocusable=R,e.isTabbable=w,e.tabbable=S,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/web/utils.js b/web/utils.js new file mode 100644 index 0000000..b5a9258 --- /dev/null +++ b/web/utils.js @@ -0,0 +1,323 @@ + +/** + * Generates a random string of a desired length, containing any of the desired characters. + * @param {number} length The resulting string's length + * @param {string|string[]} chars A list of possible characters to use + * @returns {string} The resulting random string + */ +function randomString(length, chars = '0123456789abcdefghijklmnopqrstuvwxyz') { + let str = ''; + for (let i = 0; i < length; i++) { + str += chars[randomInt(0, chars.length-1)]; + } + return str; +} + +/** + * Generates a lowercase hexadecimal string of a desired length. + * @param {number} length The length of the random + * @returns {String} The resulting string + */ +function randomHex(length = 8) { + return randomString(length, '0123456789abcdef'); +} + +/** + * Generates a pseudorandom integer between a minimum and maximum. + * @param {number} min The minimum + * @param {number} max The maximum + * @returns {number} The resulting integer + */ +function randomInt(min, max) { + return Math.round(min+(Math.random()*(max-min))); +} + +/** + * Generates a pseudorandom float between a minimum and maximum. + * @param {number} min The minimum + * @param {number} max The maximum + * @returns {number} The resulting float + */ +function randomFloat(min, max) { + return min+(Math.random()*(max-min)); +} + +/** + * Selects a random element from an array. + * @param {array} arr The input array + * @returns {*} A randomly selected array element + */ +const getRandomElement = (arr) => arr[(Math.ceil(Math.random()*arr.length)-1)]; + +/** + * @typedef itemWithWeight + * @property {*} value The return value for this item + * @property {number} weight The weight of this item + */ +/** + * Selects a random item from a provided list, where each item has a specific weight. + * @param {itemWithWeight[]} args An array of items and their weights + * @returns A randomly selected value + */ +const getRandomWeighted = (args) => { + // Get the total weight + let total = 0; + args.forEach((arg) => { + total += arg.weight; + }); + // Sort options from lightest to heaviest + args.sort((a, b) => { + return a.weight-b.weight; + }); + // Get our random number + const rand = randomFloat(0, total); + // Iterate through options until the current weight (num) + // is greater than our number (rand) + let num = 0; + for (const arg of args) { + num += arg.weight; + if (rand < num) return arg.value; + } +} + +/** + * Keeps a number within a range by preventing it from going above/below its maximum/minimum. + * @param {number} num The input number + * @param {number} min The minimum number + * @param {number} max The maximum number + * @returns {number} The resulting number + */ +function clamp(num, min, max) { + if (num < min) return min; + if (num > max) return max; + return num; +} + +/** + * Keeps a number within a range by underflowing/overflowing. + * @param {number} num The input number + * @param {number} min The minimum number + * @param {number} max The maximum number + * @returns {number} The resulting number + */ +function overflow(num, min, max) { + if (num < min) return max; + if (num > max) return min; + return num; +} + +/** + * Rounds a float to the desired amount of decimal places, clipping any trailing zeros. + * @param {number} number The input number + * @param {number} decimalPlaces The maximum number of decimal places + * @returns {number} The resulting number + */ +function roundSmart(number, decimalPlaces = 0) { + const factorOfTen = Math.pow(10, decimalPlaces); + return Math.round(number * factorOfTen) / factorOfTen; +} + +/** + * Separates a string into its words and returns an array of those words. + * @param {string} s The input string + * @returns {String[]} An array of words + */ +function getWords(s){ + s = s.replace(/(^\s*)|(\s*$)/gi, ''); + s = s.replace(/[ ]{2,}/gi, ' '); + s = s.replace(/\n/g, ' '); + return s.split(' ').filter(String); +} +/** + * Returns the number of words in a string. + * @param {string} s The input string + * @returns {number} The number of words + */ +function countWords(s){ + return getWords(s).length; +} + +/** + * Pause execution for a desired amount of time. Use this in `async` functions with `await sleep(ms)`. + * @param {Number} ms The number of milliseconds to sleep for + * @returns {Promise} + */ +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +/** + * Shuffles an array using `Math.random()` to swap elements and returns the result. + * @param {array} arr The input array + * @returns {array} The shuffled array + */ +function shuffle(arr) { + let i = 0; + while (i < arr.length) { + let tmp = arr[i]; + let num = Math.round(Math.random()*(arr.length-1)); + arr[i] = arr[num]; + arr[num] = tmp; + i++; + } + return arr; +} + +/** + * Converts a number of seconds into `[hh]:[m]m:ss` format. + * @param {number} s The number of seconds to format + * @returns {String} + */ +function formatSeconds(s) { + s = Math.floor(s || 0); + let hours = 0; + let minutes = 0; + let seconds = s; + if (s >= 3600) { + hours = Math.floor(s / 3600); + s = s % 3600; + } + if (s >= 60) { + minutes = Math.floor(s / 60); + s = s % 60; + } + seconds = s; + let timeString = ''; + timeString += (hours > 0) ? hours.toString() + ':' : ''; + timeString += minutes.toString().padStart((hours > 0) ? 2 : 1, '0') + ':'; + timeString += seconds.toString().padStart(2, '0'); + return timeString; +} + +/** + * Get age as an integer from a Date object. + * @param {Date} date The target date + * @returns {number} + */ +function getAgeFromDate(date) { + const now = new Date(); + let age = now.getFullYear()-date.getFullYear(); + if (now.getMonth() < date.getMonth() || (now.getMonth() == date.getMonth() && now.getDate() < date.getDate())) { + age--; + } + return age; +} + +/** + * Returns a string describing the relative time between two dates, like "3 days ago" or "2 months from now". + * @param {number} target A millisecond-timestamp of the target date. + * @param {number} [anchor] A millisecond-timestamp of the date to look from. Defaults to `Date.now()`. + * @returns {string} The resulting relative description. + */ +function getRelativeDate(target, anchor = Date.now()) { + const isFuture = (anchor-target < 0) ? true : false; + let diff = Math.abs(anchor-target); + diff = Math.round(diff/1000); + if (diff < 120) // Less than 120 seconds + return (isFuture) ? `In a moment` : `Moments ago`; + diff = Math.round(diff/60); + if (diff < 120) // Less than 120 minutes + return (isFuture) ? `${diff} mins from now` : `${diff} mins ago`; + diff = Math.round(diff/60); + if (diff < 72) // Less than 72 hours + return (isFuture) ? `${diff} hours from now` : `${diff} hours ago`; + diff = Math.round(diff/24); + const days = diff; + if (diff < 90) // Less than 90 days + return (isFuture) ? `${diff} days from now` : `${diff} days ago`; + diff = Math.round(diff/30.43685); + if (diff < 36) // Less than 36 months + return (isFuture) ? `${diff} months from now` : `${diff} months ago`; + diff = Math.round(days/365.2422); + return (isFuture) ? `${diff} years from now` : `${diff} years ago`; +} + +/** + * Converts a number of bytes to a human-readable size, like "230.2 MB" or "7.27 GB". + * @param {number} bytes A number of bytes to convert + * @returns {string} The human-readable size string + */ +function formatSize(bytes) { + if (bytes < 1000) return `${bytes} B`; + bytes /= 1024; + if (bytes < (1000)) return `${roundSmart(bytes, 0)} KB`; + bytes /= 1024; + if (bytes < (1000)) return `${roundSmart(bytes, 1)} MB`; + bytes /= 1024; + if (bytes < (1000)) return `${roundSmart(bytes, 2)} GB`; + bytes /= 1024; + if (bytes < (1000)) return `${roundSmart(bytes, 2)} TB`; + return "-"; +} + +/** + * Determines of an input string is a valid URL. + * @param {string} string The input string + * @returns {Boolean} + */ +function isValidUrl(string) { + let url; + try { + url = new URL(string); + } catch (error) { + return false; + } + return url.protocol === "http:" || url.protocol === "https:"; +} + +/** + * Determines if a string is a valid hostname. + * @param {string} string The input string + * @returns {Boolean} + */ +function isValidHostname(string) { + return string.match(/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/) && !string.match(/^localhost$/); +} + +/** + * Determines if a string is a valid IPv4 or IPv6 address. + * @param {string} string The input string + * @returns {Boolean} + */ +function isValidIp(string) { + return string.match(/((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/) && !string.match(/(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)/) && !string.match(/^::1$/); +} + +/** + * Escapes HTML entities present in the input string and returns the result. + * @param {string} text The input string + * @returns {string} The escaped string + */ + function escapeHTML(text) { + return text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +try { + module.exports = { + randomHex: randomHex, + randomInt: randomInt, + randomFloat: randomFloat, + getRandomElement: getRandomElement, + getRandomWeighted: getRandomWeighted, + clamp: clamp, + overflow: overflow, + roundSmart: roundSmart, + getWords: getWords, + countWords: countWords, + sleep: sleep, + shuffle: shuffle, + formatSeconds: formatSeconds, + getAgeFromDate: getAgeFromDate, + getRelativeDate: getRelativeDate, + formatSize: formatSize, + isValidUrl: isValidUrl, + isValidHostname: isValidHostname, + isValidIp: isValidIp, + escapeHTML: escapeHTML + }; +} catch (error) {} \ No newline at end of file diff --git a/web/v2/base.css b/web/v2/base.css new file mode 100644 index 0000000..603344c --- /dev/null +++ b/web/v2/base.css @@ -0,0 +1,1178 @@ + +@import '/fonts/poppins.css'; +@import '/fonts/comfortaa.css'; +@import '/fonts/cascadia-code.css'; +@import '/fonts/material-symbols-outlined.css'; + +body { + /* Fonts */ + --fontDefault: 'Poppins'; + --fontCode: 'Cascadia Code'; + --fontHeading: 'Comfortaa'; + --fontButton: 'Comfortaa'; + --fontContext: 'Comfortaa'; + --fontIcons: 'Material Symbols Outlined Rounded'; + /* Timing functions */ + --bezier: cubic-bezier(0.1, 0.3, 0.3, 1); + /* Body styles */ + margin: 0px; + background: var(--b1); + color: var(--f1); + font-family: var(--fontDefault); + font-size: 16px; + line-height: 1; +} + +* { + box-sizing: border-box; + -webkit-tap-highlight-color: transparent; +} + +a { + color: var(--f3); + text-decoration: underline; +} +a:hover { + color: var(--f2); + text-decoration: underline; +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--fontHeading); + font-weight: bold; + color: var(--f1); + line-height: 1.2; + margin-top: 1em; + margin-bottom: 0.4em; + word-break: break-word; +} +h1 { font-size: 2.2rem } +h2 { font-size: 1.8rem } +h3 { font-size: 1.5rem; color: var(--f2) } +h4 { font-size: 1.3rem; color: var(--f3) } +h5 { font-size: 1.1rem; color: var(--f3) } +h6 { font-size: 1rem; color: var(--f3) } + +h1:not(.no-border), +h2:not(.no-border) { + padding-bottom: 0.1em; + border-bottom: 1px solid var(--b3); +} + +p, li { + line-height: 1.6; + word-break: break-word; +} +p, ul, ol { + margin: 0px; + margin-bottom: 0.8em; +} + +small { + font-size: 14px; + line-height: 1.2; + color: var(--f4); +} +small.pad-top { + display: block; + margin-top: 0.5em; +} + +label { + font-size: 14px; + color: var(--f3); + display: block; + margin-bottom: 0.5em; +} + +blockquote { + margin: 0px; + margin-bottom: 10px; + margin-left: 5px; + padding: 10px 15px; + border-left: 2px solid var(--b4); +} + +table { + border: 1px solid var(--b4); + border-collapse: collapse; + margin-bottom: 10px; + line-height: 1.5; +} +table > thead { + background: var(--b3); + text-align: left; +} +table th, table td { + padding: 8px 12px; + border: 1px solid var(--b4); +} +table th { + font-family: var(--fontHeading); + font-weight: bold; + color: var(--f2); +} + +code { + font-family: var(--fontCode); +} +code:not(pre code) { + padding: 2px 4px; + background: var(--b0); + border: 1px solid var(--b2); + border-radius: 8px; + word-break: break-word; +} +pre { + padding: 10px; + border-radius: 20px; + background: var(--b0); + border: 1px solid var(--b2); + color: var(--f1); +} +pre code { + display: block; + padding: 10px; + max-height: 500px; + max-width: 100%; + overflow: auto; + line-height: 1.4; + font-size: 16px; +} +.cm-comment, +.cm-meta, +.cm-hr, +code .token.comment, +code .token.deleted, +code .token.prolog, +code .token.doctype, +code .token.cdata { + color: var(--syntax-comment) !important +} +.cm-header, +.cm-def, +.cm-variable, +.cm-variable-3, +.cm-number, +.cm-builtin, +.cm-atom, +.cm-qualifier, +.cm-attribute, +code .token.builtin, +code .token.property, +code .token.attr-name, +code .token.boolean, +code .token.number, +code .token.constant { + color: var(--syntax-constant) !important +} +.cm-variable-2, +.cm-type, +code .token.color, +code .token.variable { + color: var(--syntax-variable) !important +} +.cm-calle, +code .token.function, +code .token.symbol, +code .token.entity { + color: var(--syntax-entity) !important +} +.cm-tag, +code .token.class-name, +code .token.selector, +code .token.tag { + color: var(--syntax-entity-tag) !important +} +.cm-keyword, +.cm-operator, +code .token.important, +code .token.keyword, +code .token.operator, +code .token.atrule, +code .token.unit { + color: var(--syntax-keyword) !important +} +.cm-quote, +.cm-string, .cm-string-2, +.cm-link, +code .token.string, +code .token.char, +code .token.regex, +code .token.url, +code .token.attr-value { + color: var(--syntax-string) !important +} +.cm-property, +.cm-positive, +.cm-negative, +.cm-bracket, +.cm-error, +.cm-invalidchar, +code .token.punctuation, +code .token.inserted, +code .token.interpolation-punctuation { + color: var(--f1) !important +} +code .token.bold { + font-weight: bold; +} +code .token.italic { + font-style: italic +} +code .token.namespace { + color: var(--f3) +} + +.CodeMirror { + background: var(--b0); + border: 1px solid var(--b2); + color: var(--f1); + font-family: 'Cascadia Code'; + font-size: 18px; + line-height: 1.3; +} +.CodeMirror-gutters { + border: none; + background: none; +} +.CodeMirror-linenumbers { + background: var(--b0); + padding: 0px 10px; +} +.CodeMirror-linenumber { + color: var(--f3); +} +.CodeMirror-selected, +.CodeMirror-selectedtext, +.CodeMirror *::selection { + background: var(--b3) !important; +} +.CodeMirror-activeline-background { + background: var(--b2); +} +.CodeMirror-cursor { + border-color: var(--f1); +} + +h1:first-child, h2:first-child, h3:first-child, h4:first-child, +h5:first-child, h6:first-child, p:first-child, a:first-child, +li:first-child { + margin-top: 0px; +} +h1:last-child, h2:last-child, h3:last-child, h4:last-child, +h5:last-child, h6:last-child, p:last-child, a:last-child, +li:last-child { + margin-bottom: 0px; +} + +.btn { + --height: 40px; + --padding-top: 2px; + --padding-lr: 20px; + --gap: 12px; + --icon-size: 26px; + height: var(--height); + padding: 0px var(--padding-lr); + padding-top: var(--padding-top); + border: none; + border-radius: 100px; + font-family: var(--fontButton); + font-size: var(--font-size); + font-weight: bold; + color: var(--fg); + background: var(--bg); + text-decoration: none; + display: flex; + align-items: center; + justify-content: center; + gap: var(--gap); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + user-select: none; + cursor: pointer; + flex-shrink: 0; + transition: 0.3s var(--bezier); +} +.btnGroup { + display: flex; + flex-direction: row; + gap: 2px; + overflow-x: auto; + scrollbar-width: none; +} +.btnGroup::-webkit-scrollbar { + display: none; +} +.btnGroup > .btn { + border-radius: 6px 6px 6px 6px; +} +.btnGroup > .btn:first-child { + border-top-left-radius: 25px; + border-bottom-left-radius: 25px; +} +.btnGroup > .btn:last-child { + border-top-right-radius: 25px; + border-bottom-right-radius: 25px; +} +.btn { + --fg: var(--b1); + --bg: var(--f3); + --bgHover: var(--f4); + --bgActive: var(--b5); +} +.btn.secondary { + --fg: var(--f2); + --bg: var(--b3); + --bgHover: var(--b4); + --bgActive: var(--b5); +} +.btn.tertiary { + --fg: var(--f3); + --bg: transparent; + --bgHover: var(--b3); + --bgActive: var(--b4); +} +.btn.overlay { + --fg: var(--l8); + --bg: transparent; + --bgHover: rgba(255, 255, 255, 0.2); + --bgActive: rgba(255, 255, 255, 0.4); +} +.btn.info { + --fg: var(--f1); + --bg: var(--blue1); + --bgHover: var(--blue2); + --bgActive: var(--blue3); +} +.btn.success { + --fg: var(--f1); + --bg: var(--green1); + --bgHover: var(--green2); + --bgActive: var(--green3); +} +.btn.warning { + --fg: var(--f1); + --bg: var(--yellow1); + --bgHover: var(--yellow2); + --bgActive: var(--yellow3); +} +.btn.danger { + --fg: var(--f1); + --bg: var(--red1); + --bgHover: var(--red2); + --bgActive: var(--red3); +} +.btn:hover:not(:disabled), +.btn:focus-visible:not(:disabled) { + background: var(--bgHover); + color: var(--fg); + text-decoration: none; + transition: none; +} +@media ( hover: none ) { + .btn:hover:not(:disabled) { + background: var(--bg); + transition: 0.2s var(--bezier); + } +} +.btn:active:not(:disabled) { + background: var(--bgActive); + color: var(--fg); + text-decoration: none; +} +.btn > .icon { + font-family: var(--fontIcons); + font-size: var(--icon-size); + line-height: 1; + color: inherit; + font-weight: normal; +} +.btn.iconOnly > *:not(.icon) { + display: none; +} +.btn:not(.iconOnly) > .icon { + margin: -2px -5px 0px -5px; +} +.btn.iconOnly > .icon { + margin-left: 1px; +} +.btn.small { + --height: 34px; + --font-size: 14px; + --padding-top: 1px; + --padding-lr: 16px; + --icon-size: 24px; +} +.btn.large { + --height: 46px; + --font-size: 16px; + --padding-top: 2px; + --padding-lr: 24px; + --icon-size: 28px; +} +.btn.iconOnly { + padding: 0px; + width: var(--height); + height: var(--height); +} +.btn:disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.textbox { + width: 100%; + height: 40px; + padding: 0px 20px; + border: 2px solid var(--b3); + border-radius: 20px; + font-family: var(--fontDefault); + font-size: 16px; + line-height: 1.3; + background: var(--b3); + color: var(--f1); + display: flex; + align-items: center; + transition: 0.1s var(--bezier); +} +.textbox:focus, +.textbox:focus-within { + border-color: var(--f4); + background: var(--b2); + outline: none; +} +.textbox.textarea { + height: auto; + padding: 12px 0px; +} +.textbox.textarea > textarea { + width: 100%; + height: 100%; + padding: 0px 20px; + border: none; + background: transparent; + color: inherit; + font-family: inherit; + font-size: inherit; + font-weight: inherit; + line-height: 1.3; + resize: none; + outline: none; +} +input[type="date"], input[type="time"], input[type="datetime-local"], select { + appearance: none; +} +.dropdown { + position: relative; +} +.dropdown > select { + padding-right: 40px; +} +.dropdown::after { + position: absolute; + top: 0px; + right: 10px; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + content: 'expand_more'; + font-family: var(--fontIcons); + font-size: 32px; + color: var(--f3); + pointer-events: none; +} + +.popupCont { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + padding: 10px; + z-index: 10; + display: flex; + background: rgba(0, 0, 0, 0.3); + overflow-x: hidden; + overflow-y: auto; + opacity: 0; + transition: 0.2s var(--bezier); +} +.popupCont.visible { + opacity: 1; +} +.popup { + margin: auto; + max-width: 600px; + max-height: 100%; + background: var(--b1); + border-radius: 20px; + display: flex; + flex-direction: column; + overflow: hidden; + scale: 1.1; + transition: 0.2s var(--bezier); + box-shadow: 0px 0px 50px 0px rgba(0, 0, 0, 0.2); +} +.popupCont.visible > .popup { + scale: 1; +} +.popup > .title { + font-family: var(--fontHeading); + font-size: 22px; + font-weight: bold; + color: var(--f1); + padding: 20px 20px 10px 20px; +} +.popup > .body { + padding: 0px 20px 10px 20px; + max-height: 99999px; + min-height: 23px; + overflow-y: auto; + z-index: 1; +} +.popup > .actions { + padding: 10px 20px 15px 20px; + display: flex; + flex-direction: row-reverse; + flex-wrap: wrap; + gap: 12px; + user-select: none; +} + +.contextCont { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + z-index: 20; + overflow: hidden; + user-select: none; +} +.context { + position: fixed; + top: 0px; + left: 0px; + max-width: 400px; + max-height: 100%; + overflow-x: hidden; + overflow-y: auto; + text-overflow: ellipsis; + white-space: nowrap; + border-radius: 20px; + background: var(--b1); + border: 1px solid var(--b3); + padding: 6px; + display: flex; + flex-direction: column; + gap: 6px; + scale: 0.9; + opacity: 0; + box-shadow: 0px 0px 50px 0px rgba(0, 0, 0, 0.1); + scrollbar-width: none; +} +.context::-webkit-scrollbar { + display: none; +} +.contextCont.ani .context { + transition: 0.1s var(--bezier); +} +.contextCont.visible .context { + opacity: 1; + scale: 1; +} +.context > .item { + height: 34px; + padding: 0px 12px; + display: flex; + align-items: center; + gap: 12px; + background: transparent; + outline: none; + border: none; + border-radius: 14px; + transition: 0.2s var(--bezier); + cursor: pointer; + flex-shrink: 0; +} +.context > .item:hover:not(:disabled), +.context > .item:focus:not(:disabled) { + background: var(--b3); + transition: none; +} +@media ( hover: none ) { + .context > .item:hover:not(:disabled) { + background: transparent; + transition: 0.2s var(--bezier); + } +} +.context > .item:active:not(:disabled) { + background: var(--b4); +} +.context > .item > .label { + max-width: 100%; + margin-top: 3px; + color: var(--f1); + font-family: var(--fontContext); + font-weight: bold; + font-size: 16px; + text-align: left; + display: flex; + flex-direction: column; + justify-content: center; +} +.context > .item > .label, +.context > .item > .label * { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.context > .item > .icon { + font-family: var(--fontIcons); + width: 24px; + font-size: 24px; + line-height: 1; + color: var(--f3); + display: flex; + align-items: center; +} +.context > .item > .icon.hidden { + opacity: 0; +} +.context.hideIcons > .item > .icon { + display: none; +} +.context > .item:disabled { + cursor: not-allowed; + opacity: 0.5; +} +.context > .separator { + height: 1px; + background: var(--b3); + flex-shrink: 0; +} + +@media (pointer: coarse) { + .context { + gap: 3px; + } + .context > .item { + height: 37px; + } +} + +.tooltip { + position: fixed; + top: 0px; + left: 0px; + max-width: 400px; + padding: 6px 12px; + border-radius: 20px; + background: var(--b2); + border: 1px solid var(--b3); + font-size: 15px; + line-height: 1.2; + word-break: break-word; + pointer-events: none; + box-shadow: 0px 0px 50px 0px rgba(0, 0, 0, 0.2); + opacity: 0; + transition: 0.2s var(--bezier); + z-index: 99; +} + +@media (hover: hover) { + .tooltip.visible { + opacity: 1; + } +} + +.toastOverlay { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + z-index: 20; + padding: 20px; + pointer-events: none; + overflow: hidden; + filter: drop-shadow(0px 0px 50px rgba(0, 0, 0, 0.2)); +} +.toastOverlay > .toast { + position: relative; + max-width: 500px; + padding: 0px 10px; + border-radius: 20px; + background: var(--b3); + border: 1px solid var(--b4); + scale: 0.8; + opacity: 0; + transition: 0.2s var(--bezier); + pointer-events: all; +} +.toastOverlay > .toast.visible { + scale: 1; + opacity: 1; +} +.toastOverlay > .toast > .icon { + font-family: var(--fontIcons); + font-size: 28px; + line-height: 1; + color: var(--f2); + display: flex; + align-items: center; + padding: 10px 0px; + margin-left: 5px; + user-select: none; +} +.toastOverlay > .toast > .icon.hidden { + display: none; +} +.toastOverlay > .toast > .body { + padding: 15px 5px; +} +.toastOverlay > .toast > .close { + padding: 15px 0px; +} + +.notice { + border-radius: 20px; + background: var(--b3); + border: 1px solid var(--b4); + display: flex; + margin-bottom: 10px; +} +.notice.info { + border-color: var(--blue1); + background: var(--blue2); +} +.notice.success { + border-color: var(--green1); + background: var(--green2); +} +.notice.warning { + border-color: var(--yellow1); + background: var(--yellow2); +} +.notice.danger { + border-color: var(--red1); + background: var(--red2); +} +.notice > .icon { + font-family: var(--fontIcons); + font-size: 28px; + line-height: 1; + color: var(--f3); + display: flex; + align-items: center; + padding: 10px 20px; + padding-right: 0px; + user-select: none; +} +.notice > .body { + padding: 15px 20px; +} + +progress { + --bg: var(--b4); + --fill: var(--f3); + appearance: none; + position: relative; + margin: 8px 0px; + background: var(--bg); + width: 100%; + height: 5px; + border-radius: 4px; + overflow: hidden; + outline: none; + border: none; +} +progress.info { + --fill: var(--blue1); +} +progress.success { + --fill: var(--green1); +} +progress.warning { + --fill: var(--yellow1); +} +progress.danger { + --fill: var(--red1); +} +progress:not([value]):before, +progress:not([value]):after { + content: ""; + background-color: var(--fill); + border-radius: 100px; + height: 5px; + position: absolute; + left: 0; + top: 0; + width: 30%; + animation: move 1.5s linear infinite; + transform: translateX(-100%); +} +progress:not([value]):after { + animation-delay: 0.75s; +} + +@keyframes move { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(350%); + } +} +progress::-webkit-progress-bar { + background: var(--bg); + border-radius: 4px; +} +progress::-webkit-progress-value { + background: var(--fill); + border-radius: 4px; + transition: 0.1s ease-in-out; +} +progress::-moz-progress-bar { + background: var(--fill); + border-radius: 4px; + transition: 0.1s ease-in-out; +} +.slider { + --thumbFill: var(--b0); + --thumbFillHover: var(--b3); + --barBg: var(--b4); + --barFill: var(--f3); + position: relative; + width: 100%; + height: 27px; +} +.slider.overlay { + --thumbFill: white; + --thumbFillHover: var(--l7); + --barBg: rgba(255, 255, 255, 0.2); + --barFill: var(--l8); +} +.slider progress { + --bg: var(--barBg); + --fill: var(--barFill); + position: absolute; + margin-top: 11px; +} +.slider progress::-webkit-progress-value { + transition: none; +} +.slider progress::-moz-progress-bar { + transition: none; +} +.slider input[type="range"] { + position: absolute; + appearance: none; + background: transparent; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + margin-left: -12px; + width: calc(100% + 24px); + height: 24px; + z-index: 2; +} +.slider input[type="range"]::-webkit-slider-thumb { + appearance: none; + width: 21px; + height: 21px; + background: var(--thumbFill); + border-radius: 100px; + transition: 0.2s var(--bezier); + box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.2); +} +.slider input[type="range"]::-webkit-slider-thumb:hover, +.slider input[type="range"]::-webkit-slider-thumb:active { + background: var(--thumbFillHover); + transition: none; +} +.slider input[type="range"]::-moz-range-thumb { + appearance: none; + width: 24px; + height: 24px; + background: var(--thumbFill); + border: 3px solid var(--b100); + border-radius: 100px; + transition: 0.1s var(--bezier); +} +.slider input[type="range"]::-moz-range-thumb:hover, +.slider input[type="range"]::-moz-range-thumb:active { + background: var(--thumbFillHover); +} + +input[type="radio"], +input[type="checkbox"] { + appearance: none; + font-family: var(--fontIcons); + font-size: 1.8em; + color: var(--f1); + line-height: 1; + flex-shrink: 0; + cursor: pointer; +} +input[type="radio"]:checked, +input[type="checkbox"]:checked { + color: var(--f4); +} +input[type="radio"]::before { content: "radio_button_unchecked"; } +input[type="radio"]:checked::before { content: "radio_button_checked"; } +input[type="checkbox"]::before { content: "check_box_outline_blank"; } +input[type="checkbox"]:checked::before { content: "check_box"; } +label.selectOption { + margin: 0px; + padding-right: 8px; + display: flex; + align-items: center; + font-family: var(--fontDefault); + font-size: 16px; + line-height: 1.2; + color: var(--f1); + cursor: pointer; + user-select: none; +} +label.selectOption input[type="radio"], +label.selectOption input[type="checkbox"] { + margin-top: 0; + margin-right: 0.3em; +} +label.selectOption:hover > input[type="radio"], +label.selectOption:hover > input[type="checkbox"] { + color: var(--f2); +} +label.selectOption:hover > input[type="radio"]:checked, +label.selectOption:hover > input[type="checkbox"]:checked { + color: var(--b5); +} + +@keyframes spinner { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} +.spinner { + --bg: var(--b4); + --fill: var(--f3); + --size: 48px; + --thickness: 5px; + height: var(--size); + width: var(--size); + border: var(--thickness) solid var(--bg); + border-top-color: var(--fill); + border-radius: 50%; + animation: spinner 1s linear infinite; +} +.spinner.info { + --fill: var(--blue1); +} +.spinner.success { + --fill: var(--green1); +} +.spinner.warning { + --fill: var(--yellow1); +} +.spinner.danger { + --fill: var(--red1); +} +.spinner.overlay { + --bg: rgba(255, 255, 255, 0.2); + --fill: var(--l8); +} + +.container { + max-width: 1000px; + padding: 30px 20px; + margin: 0px auto; +} +.container img { + max-width: 100%; +} + +.text-muted { + color: var(--f4) !important; +} +.text-info { + color: var(--blue0) !important; +} +.text-success { + color: var(--green0) !important; +} +.text-warning { + color: var(--yellow0) !important; +} +.text-danger { + color: var(--red0) !important; +} +.text-left { + text-align: left; +} +.text-center { + text-align: center; +} +.text-right { + text-align: right; +} +.text-overflow-ellipses { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.no-margin { + margin: 0px; +} +.no-padding { + padding: 0px; +} +.no-select { + user-select: none; +} + +.row { + display: flex; + flex-direction: row; +} +@media screen and (max-width: 480px) { + .row.xs { + flex-direction: column; + } + .row.xs > * { + width: 100% !important; + } +} +@media screen and (max-width: 540px) { + .row.sm { + flex-direction: column; + } + .row.sm > * { + width: 100% !important; + } +} +@media screen and (max-width: 720px) { + .row.md { + flex-direction: column; + } + .row.md > * { + width: 100% !important; + } +} +@media screen and (max-width: 960px) { + .row.lg { + flex-direction: column; + } + .row.lg > * { + width: 100% !important; + } +} +@media screen and (max-width: 1200px) { + .row.xl { + flex-direction: column; + } + .row.xl > * { + width: 100% !important; + } +} +.col { + display: flex; + flex-direction: column; +} +.align-start { + align-items: flex-start; +} +.align-center { + align-items: center; +} +.align-end { + align-items: flex-end; +} +.justify-start { + justify-content: flex-start; +} +.justify-center { + justify-content: center; +} +.justify-end { + justify-content: flex-end; +} +.flex-grow { + flex-grow: 1; +} +.flex-wrap { + flex-wrap: wrap; +} +.flex-no-shrink { + flex-shrink: 0; +} +.flex-1 { + flex: 1; +} +.gap-2 { gap: 2px } +.gap-5 { gap: 5px } +.gap-8 { gap: 8px } +.gap-10 { gap: 10px } +.gap-12 { gap: 12px } +.gap-15 { gap: 15px } +.gap-18 { gap: 18px } +.gap-20 { gap: 20px } +.gap-22 { gap: 22px } +.gap-25 { gap: 25px } +.gap-28 { gap: 28px } +.gap-30 { gap: 30px } + +::selection { + background-color: var(--b4); + color: var(--f1); +} + +[placeholder]:empty::before, +[placeholder]:empty::after { + color: var(--f4); + pointer-events: none; +} +[placeholder]:empty:not(:focus)::before { + content: attr(placeholder); +} +[placeholder]:empty:focus::after { + content: attr(placeholder); +} +::placeholder { + color: var(--f4); +} + +::-webkit-scrollbar { + width: 10px; + height: 10px; + background: transparent; +} +::-webkit-resizer { + background: transparent; +} +::-webkit-scrollbar-corner { + background: transparent; +} +::-webkit-scrollbar-thumb { + background: var(--b5); + border-radius: 100px; + background-clip: padding-box; + border: 4px solid transparent; +} +::-webkit-scrollbar-thumb:hover { + background-color: var(--f4); + background-clip: padding-box; + border: 2px solid transparent; +} +* { + scrollbar-color: var(--b5) transparent; + scrollbar-width: thin; +} \ No newline at end of file diff --git a/web/v2/base.js b/web/v2/base.js new file mode 100644 index 0000000..e592ab4 --- /dev/null +++ b/web/v2/base.js @@ -0,0 +1,810 @@ + +/** + * A shortcut for `*.querySelector()`. + * @param {string} id The target query selector + * @param {HTMLElement} ancestor The ancestor element to start from + * @returns {HTMLElement|undefined} The selected element + */ +function $(selector, ancestor = document) { + return ancestor.querySelector(selector); +} +/** + * A shortcut for `*.querySelectorAll()`. + * @param {string} id The target query selector + * @param {HTMLElement} ancestor The ancestor element to start from + * @returns {NodeListOf} The selected elements + */ +function $$(selector, ancestor = document) { + return ancestor.querySelectorAll(selector); +} + +/** + * Positions an element at the given coordinates, ensuring it stays within the window. + * @param {HTMLElement} element The element + * @param {number} x Left + * @param {number} y Top + */ +function positionElement(element, x, y) { + const elementWidth = element.offsetWidth; + const elementHeight = element.offsetHeight; + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + if (x + elementWidth > windowWidth) { + x = x - elementWidth; + if (x < 0) x = 0; + } + if (y + elementHeight > windowHeight) { + y = y - elementHeight; + if (y < 0) y = 0; + } + element.style.left = x + 'px'; + element.style.top = y + 'px'; +} + +function isElementVisible(el) { + if (!el || typeof el.getBoundingClientRect !== 'function') { + return false; + } + const rect = el.getBoundingClientRect(); + return !!(rect.width || rect.height); +} + +/** + * Builds a popup + */ +class PopupBuilder { + #shouldEscapeClose = true; + #elCont; #elTitle; #elBody; #elActions; + #onShow = () => {}; + #onHide = () => {}; + constructor() { + // Create container + this.#elCont = document.createElement('div'); + this.#elCont.classList.add('popupCont'); + // Create popup element + this.el = document.createElement('div'); + this.el.classList.add('popup'); + this.#elCont.appendChild(this.el); + // Add title + this.#elTitle = document.createElement('div'); + this.#elTitle.classList.add('title', 'flex-no-shrink'); + this.#elTitle.innerText = 'Popup'; + this.el.appendChild(this.#elTitle); + // Add body + this.#elBody = document.createElement('div'); + this.#elBody.classList.add('body'); + this.el.appendChild(this.#elBody); + // Add actions container + this.#elActions = document.createElement('div'); + this.#elActions.classList.add('actions', 'flex-no-shrink'); + this.el.appendChild(this.#elActions); + // Set up listeners + this.#elCont.addEventListener('click', () => { + if (this.#shouldEscapeClose) this.hide(); + }); + this.el.addEventListener('click', e => e.stopPropagation()); + // Set up focus trap + this.trap = null; + try { + this.trap = focusTrap.createFocusTrap(this.#elCont, { + initialFocus: false, + escapeDeactivates: false + }); + } catch(error) {} + } + /** + * Sets the title of the popup. + * @param {string} title The title of the popup + * @returns {PopupBuilder} + */ + setTitle(title) { + this.#elTitle.innerText = title; + return this; + } + /** + * Adds an HTML element to the body of the popup. + * @param {HTMLElement} element The element + * @returns {PopupBuilder} + */ + addBody(element) { + this.#elBody.appendChild(element); + return this; + } + /** + * Appends raw HTML to the body of the popup. + * @param {string} html An HTML string + * @returns {PopupBuilder} + */ + addBodyHTML(html) { + this.#elBody.insertAdjacentHTML('beforeend', html); + return this; + } + /** + * Sets if clicking outside the popup or pressing escape will close the popup. Defaults to `true`. + * @param {boolean} shouldClose + * @returns {PopupBuilder} + */ + setClickOutside(shouldClose) { + this.#shouldEscapeClose = shouldClose; + return this; + } + /** + * Sets a callback function to run when the popup is shown. + * @param {callback} onShow The callback to run + * @returns {PopupBuilder} + */ + setOnShow(onShow) { + this.#onShow = onShow; + return this; + } + /** + * Sets a callback function to run when the popup is hidden. + * @param {callback} onHide The callback to run + * @returns {PopupBuilder} + */ + setOnHide(onHide) { + this.#onHide = onHide; + return this; + } + /** + * Shows the popup. + */ + show() { + document.body.appendChild(this.#elCont); + setTimeout(() => { + this.#elCont.classList.add('visible'); + try { + this.trap.activate(); + } catch (error) { + console.warn(`Unable to trap focus inside popup. Make sure focus-trap and tabbable are available.`); + } + this.#onShow(); + }, 1); + return this; + } + /** + * Hides the popup and removes it from the DOM. + */ + hide() { + this.#elCont.classList.remove('visible'); + try { + this.trap.deactivate(); + } catch (error) {} + setTimeout(() => { + this.#elCont.parentNode.removeChild(this.#elCont); + }, 200); + this.#onHide(); + return this; + } + /** + * @callback PopupBuilderAddActionCallback + * @param {PopupActionBuilder} actionBuilder An action builder to be modified and returned. + */ + /** + * Adds an action button to the bottom of the popup. These buttons are displayed from right to left. + * @param {PopupBuilderAddActionCallback} callback A callback function that returns a `PopupActionBuilder` object. This callback is passed a new `PopupActionBuilder` object that can be modified and returned. + */ + addAction(callback) { + const builder = new PopupActionBuilder(this); + const action = callback(builder); + this.#elActions.appendChild(action.el); + return this; + } +} +/** + * Builds a popup action button + */ +class PopupActionBuilder { + #shouldClose = true; + #onClick = () => {}; + /** + * @param {PopupBuilder} parent The parent popup builder. + */ + constructor(parent) { + this.parent = parent; + this.el = document.createElement('button'); + this.el.classList.add('btn', 'secondary'); + this.el.innerText = `Button`; + this.el.addEventListener('click', () => { + if (this.el.disabled) return; + this.#onClick(); + if (this.#shouldClose) parent.hide(); + }); + } + /** + * Sets whether this action button should use the primary button style. Defaults to `false`. + * @param {boolean} isPrimary + * @returns {PopupActionBuilder} + */ + setIsPrimary(isPrimary) { + if (isPrimary) this.el.classList.remove('secondary'); + else this.el.classList.add('secondary'); + return this; + } + /** + * Sets whether this action button should use the danger button style. Defaults to `false`. + * @param {boolean} isDanger + * @returns {PopupActionBuilder} + */ + setIsDanger(isDanger) { + if (isDanger) this.el.classList.add('danger'); + else this.el.classList.remove('danger'); + return this; + } + /** + * Sets whether clicking this action should close the popup. Defaults to `true`. + * @param {boolean} shouldClose + * @returns {PopupActionBuilder} + */ + setShouldClose(shouldClose) { + this.#shouldClose = shouldClose; + return this; + } + /** + * Sets the label of this action button. + * @param {string} label The button's label + * @returns {PopupActionBuilder} + */ + setLabel(label) { + this.el.innerText = label; + return this; + } + /** + * Disables the action button. + * @returns {PopupActionBuilder} + */ + disable() { + this.el.disabled = true; + return this; + } + /** + * Enables the action button. + * @returns {PopupActionBuilder} + */ + enable() { + this.el.disabled = false; + return this; + } + /** + * Sets a callback to be run when this action is clicked. + * @param {callback} onClick The callback + * @returns {PopupActionBuilder} + */ + setClickHandler(onClick) { + this.#onClick = onClick; + return this; + } +} + +/** + * Builds a context menu + */ +class ContextMenuBuilder { + #elCont; + constructor() { + // Create container + this.#elCont = document.createElement('div'); + this.#elCont.classList.add('contextCont'); + // Create popup element + this.el = document.createElement('div'); + this.el.classList.add('context'); + this.#elCont.appendChild(this.el); + // Hide when clicking outside + this.#elCont.addEventListener('click', () => { + this.hide(); + }); + this.el.addEventListener('click', (e) => { + e.stopPropagation(); + }); + // Create focus trap + try { + this.trap = focusTrap.createFocusTrap(this.#elCont, { + initialFocus: false, + escapeDeactivates: false + }); + } catch(error) {} + } + /** + * @callback ContextMenuBuilderAddItemCallback + * @param {ContextMenuItemBuilder} itemBuilder An item builder to be modified and returned. + */ + /** + * Adds a clickable item to the context menu. + * @param {ContextMenuBuilderAddItemCallback} callback A callback function that returns a `ContextMenuItemBuilder` object. This callback is passed a new `ContextMenuItemBuilder` object that can be modified and returned. + * @returns {ContextMenuBuilder} + */ + addItem(callback) { + const builder = new ContextMenuItemBuilder(this); + const item = callback(builder); + this.el.appendChild(item.el); + return this; + } + /** + * Adds a separator to the context menu. + * @returns {ContextMenuBuilder} + */ + addSeparator() { + const el = document.createElement('div'); + el.classList.add('separator'); + this.el.appendChild(el); + return this; + } + /** + * Sets if menu item icons should be shown. If `true`, the space an icon takes up is still visible even on items without set icons. If `false`, all item icons are hidden, regardless of whether they're set or not. Defaults to `true`. + * @param {boolean} areVisible The new state + * @returns {ContextMenuBuilder} + */ + setIconVisibility(areVisible) { + this.el.classList.toggle('hideIcons', !areVisible); + return this; + } + /** + * Shows the context menu at the specified fixed coordinates. This method is used by the other show methods. + * @param {number} x Left + * @param {number} y Top + */ + showAtCoords(x, y) { + document.body.appendChild(this.#elCont); + this.#elCont.classList.remove('ani'); + this.#elCont.classList.remove('visible'); + setTimeout(() => { + this.el.style.scale = '1'; + positionElement(this.el, x, y); + setTimeout(() => { + this.#elCont.classList.add('ani'); + setTimeout(() => { + this.#elCont.classList.add('visible'); + try { + this.trap.activate(); + } catch (error) { + console.warn(`Unable to trap focus inside context menu. Make sure focus-trap and tabbable are available.`); + } + }, 1); + }, 10); + }, 1); + return this; + } + /** + * Shows the context menu originating from the center of an HTML element. + * @param {HTMLElement} el The target element + * @returns {ContextMenuBuilder} + */ + showAtElement(el) { + const rect = el.getBoundingClientRect(); + return this.showAtCoords((rect.left+(rect.width/2)), (rect.top+(rect.height/2))); + } + /** + * Shows the context menu at the current mouse position, or fixed in the top left if there hasn't been any mouse movement. + * @returns {ContextMenuBuilder} + */ + showAtCursor() { + return this.showAtCoords(mouse.x+5, mouse.y); + } + /** + * Hides the context menu and removes it from the DOM. + */ + hide() { + this.#elCont.classList.remove('visible'); + try { + this.trap.deactivate(); + } catch (error) {} + setTimeout(() => { + this.#elCont.parentNode.removeChild(this.#elCont); + }, 200); + return this; + } +} +/** + * Builds a clickable context menu item + */ +class ContextMenuItemBuilder { + #onClick = () => {}; + constructor(parent) { + this.parent = parent; + // Create item container + this.el = document.createElement('button'); + this.el.classList.add('item'); + // Create icon + this.elIcon = document.createElement('div'); + this.elIcon.classList.add('icon', 'hidden'); + this.el.appendChild(this.elIcon); + // Create label + this.elLabel = document.createElement('div'); + this.elLabel.classList.add('label'); + this.elLabel.innerText = `Item`; + this.el.appendChild(this.elLabel); + // Set up click handler + this.el.addEventListener('click', () => { + if (this.el.disabled) return; + this.#onClick(); + parent.hide(); + }); + } + /** + * Sets the label for this menu item. + * @param {string} label The item's label + * @returns {ContextMenuItemBuilder} + */ + setLabel(label) { + this.elLabel.innerText = label; + return this; + } + /** + * Sets the icon for this item. If unset, no icon will be shown. + * @param {string} icon A valid [Material Symbol](https://fonts.google.com/icons) string + * + * To make sure you're getting the right symbol, click on the icon, go to the **Android** tab, and copy the string in the code block. + * @returns {ContextMenuItemBuilder} + */ + setIcon(icon) { + this.elIcon.classList.remove('hidden'); + this.elIcon.innerText = icon; + return this; + } + /** + * Sets hover tooltip text for this item. + * @param {string} text The tooltip text + * @returns {ContextMenuItemBuilder} + */ + setTooltip(text) { + this.el.title = text; + return this; + } + /** + * Sets whether or not the icon and text of this item should be red. + * @param {boolean} isDanger + * @returns {ContextMenuItemBuilder} + */ + setIsDanger(isDanger) { + this.elIcon.classList.toggle('text-danger', isDanger); + this.elLabel.classList.toggle('text-danger', isDanger); + return this; + } + /** + * Disables this menu item. + * @returns {ContextMenuItemBuilder} + */ + disable() { + this.el.disabled = true; + return this; + } + /** + * Enables this menu item. + * @returns {ContextMenuItemBuilder} + */ + enable() { + this.el.disabled = false; + return this; + } + /** + * Sets a callback to be run when this item is clicked. + * @param {callback} onClick The callback + * @returns {ContextMenuItemBuilder} + */ + setClickHandler(onClick) { + this.#onClick = onClick; + return this; + } +} + +/** + * Initializes a toast notification overlay container. + */ +class ToastOverlay { + /** + * @param {('left'|'center'|'right')} hAlign Horizontal alignment + * @param {('top'|'bottom')} vAlign Vertical alignment + */ + constructor(hAlign = 'left', vAlign = 'bottom') { + this.el = document.createElement('div'); + this.el.classList.add('toastOverlay', 'col', 'gap-10'); + if (hAlign == 'left') this.el.classList.add('align-start'); + if (hAlign == 'center') this.el.classList.add('align-center'); + if (hAlign == 'right') this.el.classList.add('align-end'); + if (vAlign == 'top') this.el.classList.add('justify-start'); + if (vAlign == 'bottom') { + this.el.classList.add('justify-start'); + this.el.style.flexDirection = 'column-reverse'; + } + document.body.appendChild(this.el); + } + /** + * @callback ToastOverlayShowCallback + * @param {ToastBuilder} itemBuilder An item builder to be modified and returned. + */ + /** + * Shows a new toast notification. + * @param {ToastOverlayShowCallback} callback A callback function that returns a `ToastBuilder` object. This callback is passed a new `ToastBuilder` object that can be modified and returned. + * @returns {ToastOverlay} + */ + showToast(callback) { + const builder = new ToastBuilder(this); + const toast = callback(builder); + this.el.insertAdjacentElement('afterbegin', toast.el); + setTimeout(() => { + const delay = toast.el.dataset.delay; + if (delay) setTimeout(() => { + toast.close(); + }, delay); + toast.el.classList.add('visible'); + if (delay) setTimeout(close, delay); + }, 100); + return this; + } +} +/** + * Builds a toast notification. This class is to be used alongside the `ToastOverlay` class. + */ +class ToastBuilder { + constructor() { + this.el = document.createElement('div'); + this.el.classList.add('toast', 'row', 'gap-10', 'align-center'); + this.elIcon = document.createElement('div'); + this.elIcon.classList.add('icon', 'hidden'); + this.el.appendChild(this.elIcon); + this.elBody = document.createElement('div'); + this.elBody.classList.add('body'); + this.elBody.innerText = 'Toast notification'; + this.el.appendChild(this.elBody); + this.elClose = document.createElement('button'); + this.elClose.classList.add('btn', 'secondary', 'iconOnly', 'small', 'close'); + this.elClose.innerHTML = '
    close
    '; + this.elClose.title = 'Dismiss'; + this.elClose.addEventListener('click', () => this.close()); + this.el.appendChild(this.elClose); + this.el.dataset.delay = 5000; + } + /** + * Sets the icon to show on the left of the toast. + * @param {string} icon A valid [Material Symbol](https://fonts.google.com/icons) string + * @returns {ToastBuilder} + */ + setIcon(icon) { + this.elIcon.classList.remove('hidden'); + this.elIcon.innerText = icon; + return this; + } + /** + * Sets the body of the toast. + * @param {string} html The body HTML + * @returns {ToastBuilder} + */ + setBodyHTML(html) { + this.elBody.innerHTML = html; + return this; + } + /** + * Sets the delay before the toast will automatically close after being shown. Set this to `0` to show the toast indefinitely (until the user closes it). + * + * Default is `5000` (5 seconds). + * @param {number} delayMs The delay in milliseconds. + * @returns {ToastBuilder} + */ + setCloseDelay(delayMs) { + this.el.dataset.delay = delayMs; + return this; + } + /** + * Sets whether or not the toast can be closed by the user. Rather, this determines if the close button is visible or not. + * @param {boolean} isCloseable + * @returns {ToastBuilder} + */ + setIsCloseable(isCloseable) { + if (isCloseable) { + this.elClose.style.display = ''; + } else { + this.elClose.style.display = 'none'; + } + return this; + } + /** + * Closes the toast, assuming that it's visible. + * @returns {ToastBuilder} + */ + close() { + this.el.classList.remove('visible'); + setTimeout(() => { + if (!this.el.parentNode) return; + this.el.parentNode.removeChild(this.el); + }, 200); + return this; + } +} + +function promptUrlDownload(url, name) { + const a = document.createElement('a'); + a.href = url + a.download = name || url.split('/').pop(); + a.click(); +} + +// Create and append the tooltip element +const tooltip = document.createElement('div'); +tooltip.classList.add('tooltip'); +tooltip.role = 'tooltip'; +tooltip.id = Date.now(); +document.body.appendChild(tooltip); +let activeTooltipElement = null; + +// Functions for the tooltip +let tooltipTimeout; +const showTooltip = el => { + hideTooltip(); + tooltipTimeout = setTimeout(() => { + // After 200ms, remove transitions and reset scale + tooltip.style.transition = 'none'; + // Set the tooltip's content + tooltip.innerHTML = el.dataset.tooltip; + setTimeout(() => { + // Position the tooltip and add transitions + positionElement(tooltip, mouse.x+5, mouse.y); + tooltip.style.transition = ''; + tooltipTimeout = setTimeout(() => { + // Show the tooltip if the mouse is still over the element + const isMouseOver = el.dataset.isMouseOver === 'true'; + if (!isMouseOver || !isElementVisible(el)) return; + tooltip.classList.add('visible'); + }, 200); + }, 50); + }, 200); +} + +const hideTooltip = () => { + clearTimeout(tooltipTimeout); + tooltip.classList.remove('visible'); +}; + +// Continuously save mouse position +const mouse = { x: 0, y: 0 }; +window.addEventListener('mousemove', (e) => { + mouse.x = e.clientX; + mouse.y = e.clientY; + // Show or hide the tooltip accordingly + if (tooltip.classList.contains('visible')) { + hideTooltip(); + } + if (activeTooltipElement) { + showTooltip(activeTooltipElement); + } +}); + +// Handle dynamic changes +document.addEventListener('domChange', () => { + + // Get elements with a title attribute + const titleEls = $$('[title]:not([data-no-tooltip])'); + for (const el of titleEls) { + // Remove the title attribute and add it to the tooltip data attribute + const title = el.title; + el.removeAttribute('title'); + el.dataset.tooltip = title; + // Add aria label + el.setAttribute('aria-describedby', tooltip.id); + } + // Get elements with a tooltip data attribute + const tooltipEls = $$('[data-tooltip]:not([data-has-tooltip])'); + // Loop through 'em + for (const el of tooltipEls) { + el.dataset.isMouseOver = false; + const show = () => { + el.dataset.isMouseOver = true; + activeTooltipElement = el; + }; + const hide = () => { + el.dataset.isMouseOver = false; + activeTooltipElement = null; + }; + el.addEventListener('mousemove', show); + el.addEventListener('mouseleave', hide); + el.addEventListener('mousedown', hide); + el.addEventListener('mouseup', hide); + // Mark the tooltip as added + el.dataset.hasTooltip = true; + } + + // Get slider elements + const sliders = $$('div.slider:not([data-modified])'); + // Loop through 'em + for (const slider of sliders) { + // Create elements + const prog = document.createElement('progress'); + const input = document.createElement('input'); + // Set attributes + let textbox; + const onSliderChange = () => { + // Collect data values + const min = slider.dataset.min || 0; + const max = slider.dataset.max || 100; + const step = slider.dataset.step || 1; + const value = slider.dataset.value || 0; + const rangeId = slider.dataset.rangeId; + const progId = slider.dataset.progId; + textbox = $(slider.dataset.textbox); + // Set attributes + input.type = 'range'; + input.min = min; + input.max = max; + input.value = value; + input.step = step; + prog.min = min; + prog.max = max; + prog.value = value; + prog.step = step; + if (progId) prog.id = progId || ''; + if (rangeId) input.id = rangeId || ''; + // Handle the textbox + if (textbox) { + textbox.type = 'number'; + textbox.min = min; + textbox.max = max; + textbox.step = step; + textbox.value = value; + textbox.oninput = () => { + input.value = textbox.value; + input.dispatchEvent(new Event('input')); + }; + textbox.onchange = textbox.oninput; + } + // Dispatch events + input.dispatchEvent(new Event('change')); + prog.dispatchEvent(new Event('change')); + } + onSliderChange(); + // Append elements + slider.appendChild(prog); + slider.appendChild(input); + // Add event listeners + input.addEventListener('input', () => { + slider.dataset.value = input.value; + prog.value = slider.dataset.value; + if (textbox) textbox.value = slider.dataset.value; + slider.dispatchEvent(new Event('input')); + }); + input.addEventListener('change', () => { + slider.dataset.value = input.value; + prog.value = slider.dataset.value; + if (textbox) textbox.value = slider.dataset.value; + }); + prog.addEventListener('change', () => { + input.value = slider.dataset.value; + if (textbox) textbox.value = slider.dataset.value; + }); + slider.addEventListener('change', onSliderChange); + // Mark the slider as added + slider.dataset.modified = true; + } + + // Get expandable textareas + const textareas = $$('textarea[data-make-expandable]:not([data-modified])'); + // Loop through 'em + for (const textarea of textareas) { + textarea.addEventListener('resize', () => { + if (!isElementVisible(textarea) || !textarea.scrollHeight) return; + textarea.style.height = 'auto'; + textarea.style.height = textarea.scrollHeight + 'px'; + }); + textarea.dispatchEvent(new Event('resize')); + textarea.addEventListener('input', () => { + textarea.dispatchEvent(new Event('resize')); + }); + window.addEventListener('resize', () => { + textarea.dispatchEvent(new Event('resize')); + }); + textarea.dataset.modified = true; + } + +}); + +// Handle DOM mutations and dispatching the domChange event +const mutationObs = new MutationObserver(() => { + document.dispatchEvent(new Event('domChange')); +}); +mutationObs.observe(document.documentElement, { + attributes: true, + characterData: true, + childList: true, + subtree: true +}); +window.addEventListener('domcontentloaded', () => { + document.dispatchEvent(new Event('domChange')); +}); \ No newline at end of file diff --git a/web/v2/themes.css b/web/v2/themes.css new file mode 100644 index 0000000..80f3f42 --- /dev/null +++ b/web/v2/themes.css @@ -0,0 +1,338 @@ + +/* + +See `themes.json` for some metadata about each theme. + - The `themeColor` property is the suggested value for the `theme-color` meta tag. + - Equal to the theme's `--b3` color. + - The `name` property is the theme's canonical name. + - The `hue` property is the suggested hue to use for colouring custom elements + +*/ + +.lightblue, +.lightyellow, +.lightgreen, +.lightmuted, +.lightpurple { + /* Background and foreground */ + --b0: hsl(180, 60%, 95%); + --b1: hsl(180, 60%, 90%); + --b2: hsl(180, 50%, 85%); + --b3: hsl(180, 40%, 80%); + --b4: hsl(180, 40%, 70%); + --b5: hsl(180, 40%, 60%); + --f4: hsl(180, 30%, 50%); + --f3: hsl(180, 30%, 35%); + --f2: hsl(180, 30%, 15%); + --f1: black; + /* Green accent */ + --green0: hsl(120, 60%, 40%); + --green1: hsl(120, 60%, 65%); + --green2: hsl(120, 60%, 80%); + --green3: hsl(120, 60%, 85%); + --green4: hsl(120, 60%, 90%); + --green5: hsl(120, 60%, 95%); + /* Yellow accent */ + --yellow0: hsl(40, 100%, 40%); + --yellow1: hsl(40, 100%, 70%); + --yellow2: hsl(40, 100%, 80%); + --yellow3: hsl(40, 100%, 85%); + --yellow4: hsl(40, 100%, 90%); + --yellow5: hsl(40, 100%, 95%); + /* Blue accent */ + --blue0: hsl(210, 80%, 45%); + --blue1: hsl(210, 80%, 70%); + --blue2: hsl(210, 80%, 80%); + --blue3: hsl(210, 80%, 85%); + --blue4: hsl(210, 80%, 90%); + --blue5: hsl(210, 80%, 95%); + /* Danger */ + --red0: hsl(355, 80%, 55%); + --red1: hsl(355, 80%, 75%); + --red2: hsl(355, 80%, 80%); + --red3: hsl(355, 80%, 85%); + --red4: hsl(355, 80%, 90%); + --red5: hsl(355, 80%, 95%); + /* Code */ + --syntax-comment: #6e7781; + --syntax-constant: #0550ae; + --syntax-entity: #8250df; + --syntax-storage-modifier-import: #24292f; + --syntax-entity-tag: #116329; + --syntax-keyword: #cf222e; + --syntax-string: #0a3069; + --syntax-variable: #953800; +} + +.lightpurple { + /* Background and foreground */ + --b0: hsl(280, 60%, 95%); + --b1: hsl(280, 60%, 90%); + --b2: hsl(280, 60%, 85%); + --b3: hsl(280, 50%, 80%); + --b4: hsl(290, 50%, 70%); + --b5: hsl(300, 40%, 60%); + --f4: hsl(310, 30%, 50%); + --f3: hsl(320, 30%, 35%); + --f2: hsl(320, 30%, 15%); + --f1: black; +} + +.lightyellow { + /* Background and foreground */ + --b0: hsl(50, 60%, 95%); + --b1: hsl(50, 60%, 90%); + --b2: hsl(40, 60%, 85%); + --b3: hsl(30, 50%, 80%); + --b4: hsl(30, 50%, 70%); + --b5: hsl(20, 40%, 60%); + --f4: hsl(10, 30%, 50%); + --f3: hsl(10, 30%, 35%); + --f2: hsl(0, 30%, 15%); + --f1: black; +} + +.lightgreen { + /* Background and foreground */ + --b0: hsl(100, 60%, 95%); + --b1: hsl(100, 60%, 90%); + --b2: hsl(110, 60%, 85%); + --b3: hsl(120, 50%, 80%); + --b4: hsl(120, 50%, 70%); + --b5: hsl(130, 40%, 60%); + --f4: hsl(140, 30%, 50%); + --f3: hsl(140, 30%, 35%); + --f2: hsl(150, 30%, 15%); + --f1: black; + --green0: hsl(180, 60%, 50%); + --green1: hsl(180, 60%, 70%); + --green2: hsl(180, 60%, 80%); + --green3: hsl(180, 60%, 85%); + --green4: hsl(180, 60%, 90%); +} + +.lightmuted { + /* Background and foreground */ + --b0: hsl(160, 10%, 95%); + --b1: hsl(170, 10%, 90%); + --b2: hsl(180, 10%, 85%); + --b3: hsl(190, 10%, 80%); + --b4: hsl(200, 10%, 70%); + --b5: hsl(210, 10%, 60%); + --f4: hsl(220, 10%, 50%); + --f3: hsl(230, 10%, 35%); + --f2: hsl(240, 10%, 15%); + --f1: black; +} + +.darkpurple, +.darkyellow, +.darkgreen, +.darkmuted, +.darkblue { + /* Background and foreground */ + --b0: hsl(270, 30%, 15%); + --b1: hsl(270, 30%, 20%); + --b2: hsl(270, 30%, 25%); + --b3: hsl(270, 30%, 30%); + --b4: hsl(280, 30%, 40%); + --b5: hsl(290, 30%, 50%); + --f4: hsl(300, 30%, 65%); + --f3: hsl(310, 40%, 80%); + --f2: hsl(310, 50%, 90%); + --f1: white; + /* Green accent */ + --green0: hsl(150, 50%, 30%); + --green1: hsl(150, 50%, 40%); + --green2: hsl(150, 50%, 50%); + --green3: hsl(150, 50%, 60%); + --green4: hsl(150, 50%, 70%); + --green5: hsl(150, 50%, 80%); + /* Yellow accent */ + --yellow0: hsl(40, 70%, 40%); + --yellow1: hsl(40, 70%, 50%); + --yellow2: hsl(40, 70%, 60%); + --yellow3: hsl(40, 70%, 70%); + --yellow4: hsl(40, 70%, 80%); + --yellow5: hsl(40, 70%, 90%); + /* Blue accent */ + --blue0: hsl(240, 60%, 45%); + --blue1: hsl(240, 60%, 55%); + --blue2: hsl(240, 60%, 65%); + --blue3: hsl(240, 60%, 75%); + --blue4: hsl(240, 60%, 85%); + --blue5: hsl(240, 60%, 95%); + /* Danger */ + --red0: hsl(340, 55%, 40%); + --red1: hsl(340, 55%, 50%); + --red2: hsl(340, 55%, 60%); + --red3: hsl(340, 55%, 70%); + --red4: hsl(340, 55%, 80%); + --red5: hsl(340, 55%, 90%); + /* Code */ + --syntax-comment: #8b949e; + --syntax-constant: #79c0ff; + --syntax-entity: #d2a8ff; + --syntax-storage-modifier-import: #c9d1d9; + --syntax-entity-tag: #7ee787; + --syntax-keyword: #ff7b72; + --syntax-string: #a5d6ff; + --syntax-variable: #ffa657; +} + +.darkpurple .textbox, +.darkyellow .textbox, +.darkgreen .textbox, +.darkmuted .textbox, +.darkblue .textbox { + background-color: var(--b0); + border-color: var(--b0); +} +.darkpurple .textbox:focus, +.darkyellow .textbox:focus, +.darkgreen .textbox:focus, +.darkmuted .textbox:focus, +.darkblue .textbox:focus, +.darkpurple .textbox:focus-within, +.darkyellow .textbox:focus-within, +.darkgreen .textbox:focus-within, +.darkmuted .textbox:focus-within, +.darkblue .textbox:focus-within { + background-color: var(--b2); + border-color: var(--f4); +} + +.darkpurple .slider input[type="range"], +.darkyellow .slider input[type="range"], +.darkgreen .slider input[type="range"], +.darkmuted .slider input[type="range"], +.darkblue .slider input[type="range"] { + --thumbFill: var(--f2); + --thumbFillHover: var(--f4); +} + +.darkpurple .text-info, +.darkyellow .text-info, +.darkgreen .text-info, +.darkmuted .text-info, +.darkblue .text-info { + color: var(--blue2) !important; +} +.darkpurple .text-success, +.darkyellow .text-success, +.darkgreen .text-success, +.darkmuted .text-success, +.darkblue .text-success { + color: var(--green2) !important; +} +.darkpurple .text-warning, +.darkyellow .text-warning, +.darkgreen .text-warning, +.darkmuted .text-warning, +.darkblue .text-warning { + color: var(--yellow2) !important; +} +.darkpurple .text-danger, +.darkyellow .text-danger, +.darkgreen .text-danger, +.darkmuted .text-danger, +.darkblue .text-danger { + color: var(--red2) !important; +} + +.darkblue { + /* Background and foreground */ + --b0: hsl(230, 30%, 8%); + --b1: hsl(230, 30%, 12%); + --b2: hsl(230, 30%, 18%); + --b3: hsl(230, 30%, 20%); + --b4: hsl(220, 30%, 30%); + --b5: hsl(210, 30%, 45%); + --f4: hsl(200, 30%, 60%); + --f3: hsl(190, 40%, 75%); + --f2: hsl(190, 50%, 85%); + --f1: white; +} + +.darkyellow { + /* Background and foreground */ + --b0: hsl(40, 20%, 8%); + --b1: hsl(40, 20%, 12%); + --b2: hsl(40, 20%, 18%); + --b3: hsl(40, 30%, 20%); + --b4: hsl(30, 30%, 30%); + --b5: hsl(20, 30%, 45%); + --f4: hsl(10, 30%, 60%); + --f3: hsl(0, 40%, 75%); + --f2: hsl(0, 50%, 85%); + --f1: white; +} + +.darkgreen { + /* Background and foreground */ + --b0: hsl(170, 20%, 8%); + --b1: hsl(170, 20%, 12%); + --b2: hsl(170, 20%, 18%); + --b3: hsl(170, 30%, 20%); + --b4: hsl(160, 30%, 30%); + --b5: hsl(150, 30%, 45%); + --f4: hsl(140, 30%, 60%); + --f3: hsl(130, 40%, 75%); + --f2: hsl(130, 50%, 85%); + --f1: white; + --green0: hsl(180, 50%, 30%); + --green1: hsl(180, 50%, 40%); + --green2: hsl(180, 50%, 50%); + --green3: hsl(180, 50%, 60%); + --green4: hsl(180, 50%, 70%); +} + +.darkmuted { + /* Background and foreground */ + --b0: hsl(180, 10%, 5%); + --b1: hsl(190, 10%, 8%); + --b2: hsl(200, 10%, 12%); + --b3: hsl(210, 10%, 15%); + --b4: hsl(220, 10%, 25%); + --b5: hsl(230, 10%, 40%); + --f4: hsl(240, 10%, 55%); + --f3: hsl(250, 10%, 70%); + --f2: hsl(260, 10%, 85%); + --f1: white; +} + +.lightblue, +.lightyellow, +.lightgreen, +.lightmuted, +.lightpurple { + /* Luminance palette */ + --l0: var(--f1); + --l1: var(--f2); + --l2: var(--f3); + --l3: var(--f4); + --l4: var(--b5); + --l5: var(--b4); + --l6: var(--b3); + --l7: var(--b2); + --l8: var(--b1); + --l9: var(--b0); +} + +.darkpurple, +.darkyellow, +.darkgreen, +.darkmuted, +.darkblue { + /* Luminance palette */ + --l0: var(--b0); + --l1: var(--b1); + --l2: var(--b2); + --l3: var(--b3); + --l4: var(--b4); + --l5: var(--b5); + --l6: var(--f4); + --l7: var(--f3); + --l8: var(--f2); + --l9: var(--f1); +} \ No newline at end of file diff --git a/web/worker.js b/web/worker.js index 3ba4a98..cbfcc4f 100644 --- a/web/worker.js +++ b/web/worker.js @@ -1,3 +1,4 @@ + self.addEventListener('activate', (e) => { self.clients.claim(); }); @@ -5,44 +6,24 @@ self.addEventListener('activate', (e) => { self.addEventListener('fetch', (e) => { const reqUrl = e.request.url; e.respondWith((async() => { - // Open asset cache + // Open asset cache and see if this request is in it const cache = await caches.open('main'); const match = await caches.match(e.request); - - // Request from network + // Request the resource from the network const netRes = fetch(e.request).then((res) => { - // Create a new response with updated headers - const newHeaders = new Headers(res.headers); - newHeaders.set('Permissions-Policy', 'clipboard-write=(self), clipboard-read=(self)'); - - const newRes = new Response(res.body, { - status: res.status, - statusText: res.statusText, - headers: newHeaders - }); - - // Cache non-API responses + // If the request was successful and this isn't an API call, + // update the cached resource if (res.ok && !reqUrl.match(/\/api\/sftp\/.*$/)) { - cache.put(e.request, newRes.clone()); + cache.put(e.request, res.clone()); } - - return newRes; + // Return the response + return res; }).catch(e => { - console.error('Fetch error:', e); - if (match) { - // Add header to cached response - const newHeaders = new Headers(match.headers); - newHeaders.set('Permissions-Policy', 'clipboard-write=(self), clipboard-read=(self)'); - return new Response(match.body, { - status: match.status, - statusText: match.statusText, - headers: newHeaders - }); - } - throw e; + console.error(e); + return match; }); - - // Return cached or network response + // Return the cached resource if it exists + // Otherwise, return the network request return match || netRes; })()); }); \ No newline at end of file

    t^hu+lO{taAfo-o^@=*4turT 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 literal 0 HcmV?d00001 diff --git a/web/fonts/material-symbols-outlined-rounded-300.woff2 b/web/fonts/material-symbols-outlined-rounded-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a8513778585499f415c10d8eb7477aa0db5e775d GIT binary patch literal 267532 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'xVR675ulD5B?T5h1>8tNZ@q+NElrt5Kw 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�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 literal 0 HcmV?d00001 diff --git a/web/fonts/material-symbols-outlined.css b/web/fonts/material-symbols-outlined.css new file mode 100644 index 0000000..f43490c --- /dev/null +++ b/web/fonts/material-symbols-outlined.css @@ -0,0 +1,55 @@ + +@font-face { + font-family: 'Material Symbols Outlined'; + font-style: normal; + font-weight: 300; + src: url(/fonts/material-symbols-outlined-300.woff2) format('woff2'); +} +@font-face { + font-family: 'Material Symbols Outlined Rounded'; + font-style: normal; + font-weight: 300; + src: url(/fonts/material-symbols-outlined-rounded-300.woff2) format('woff2'); +} +@font-face { + font-family: 'Material Symbols Filled'; + font-style: normal; + font-weight: 300; + src: url(/fonts/material-symbols-filled-300.woff2) format('woff2'); +} +@font-face { + font-family: 'Material Symbols Filled Rounded'; + font-style: normal; + font-weight: 300; + src: url(/fonts/material-symbols-filled-rounded-300.woff2) format('woff2'); +} + +.material-symbol { + font-family: 'Material Symbols Outlined'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; + user-select: none; +} + +.material-symbol.outlined { + font-family: 'Material Symbols Outlined'; +} +.material-symbol.outlined.rounded { + font-family: 'Material Symbols Outlined Rounded'; +} +.material-symbol.filled { + font-family: 'Material Symbols Filled'; +} +.material-symbol.filled.rounded { + font-family: 'Material Symbols Filled Rounded'; +} \ No newline at end of file diff --git a/web/fonts/poppins.css b/web/fonts/poppins.css new file mode 100644 index 0000000..6918da8 --- /dev/null +++ b/web/fonts/poppins.css @@ -0,0 +1,55 @@ + +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 100; + src: url(/fonts/Poppins-Thin.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 200; + src: url(/fonts/Poppins-ExtraLight.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 300; + src: url(/fonts/Poppins-Light.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 400; + src: url(/fonts/Poppins-Regular.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 500; + src: url(/fonts/Poppins-Medium.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 600; + src: url(/fonts/Poppins-SemiBold.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 700; + src: url(/fonts/Poppins-Bold.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 800; + src: url(/fonts/Poppins-ExtraBold.ttf) format('truetype'); +} +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 900; + src: url(/fonts/Poppins-Black.ttf) format('truetype'); +} \ No newline at end of file diff --git a/web/index.html b/web/index.html index cf38abd..014cac4 100644 --- a/web/index.html +++ b/web/index.html @@ -11,15 +11,15 @@ - - + + - - - - - - + + + + + + diff --git a/web/lib/axios.min.js b/web/lib/axios.min.js new file mode 100644 index 0000000..79aa153 --- /dev/null +++ b/web/lib/axios.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:{},s=i.allOwnKeys,a=void 0!==s&&s;if(null!=t)if("object"!==e(t)&&(t=[t]),l(t))for(r=0,o=t.length;r3&&void 0!==arguments[3]?arguments[3]:{},i=r.allOwnKeys;return S(t,(function(t,r){n&&m(t)?e[r]=o(t,n):e[r]=t}),{allOwnKeys:i}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,r){var o,i,s,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)s=o[i],r&&!r(s,e,t)||u[s]||(t[s]=e[s],u[s]=!0);e=!1!==n&&a(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:u,kindOfTest:c,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;if(l(e))return e;var t=e.length;if(!v(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,r=(e&&e[Symbol.iterator]).call(e);(n=r.next())&&!n.done;){var o=n.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var n,r=[];null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:T,hasOwnProperty:x,hasOwnProp:x,reduceDescriptors:N,freezeMethods:function(e){N(e,(function(t,n){var r=e[n];m(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not read-only method '"+n+"'")}))}))},toObjectSet:function(e,t){var n={},r=function(e){e.forEach((function(e){n[e]=!0}))};return l(e)?r(e):r(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))},noop:function(){},toFiniteNumber:function(e,t){return e=+e,Number.isFinite(e)?e:t}};function _(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}P.inherits(_,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var B=_.prototype,D={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){D[e]={value:e}})),Object.defineProperties(_,D),Object.defineProperty(B,"isAxiosError",{value:!0}),_.from=function(e,t,n,r,o,i){var s=Object.create(B);return P.toFlatObject(e,s,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e})),_.call(s,e.message,t,n,r,o),s.cause=e,s.name=e.name,i&&Object.assign(s,i),s};var F="object"==("undefined"==typeof self?"undefined":e(self))?self.FormData:window.FormData;function U(e){return P.isPlainObject(e)||P.isArray(e)}function k(e){return P.endsWith(e,"[]")?e.slice(0,-2):e}function L(e,t,n){return e?e.concat(t).map((function(e,t){return e=k(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}var q=P.toFlatObject(P,{},null,(function(e){return/^is[A-Z]/.test(e)}));function z(t,n,r){if(!P.isObject(t))throw new TypeError("target must be an object");n=n||new(F||FormData);var o,i=(r=P.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!P.isUndefined(t[e])}))).metaTokens,s=r.visitor||l,a=r.dots,u=r.indexes,c=(r.Blob||"undefined"!=typeof Blob&&Blob)&&((o=n)&&P.isFunction(o.append)&&"FormData"===o[Symbol.toStringTag]&&o[Symbol.iterator]);if(!P.isFunction(s))throw new TypeError("visitor must be a function");function f(e){if(null===e)return"";if(P.isDate(e))return e.toISOString();if(!c&&P.isBlob(e))throw new _("Blob is not supported. Use a Buffer instead.");return P.isArrayBuffer(e)||P.isTypedArray(e)?c&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function l(t,r,o){var s=t;if(t&&!o&&"object"===e(t))if(P.endsWith(r,"{}"))r=i?r:r.slice(0,-2),t=JSON.stringify(t);else if(P.isArray(t)&&function(e){return P.isArray(e)&&!e.some(U)}(t)||P.isFileList(t)||P.endsWith(r,"[]")&&(s=P.toArray(t)))return r=k(r),s.forEach((function(e,t){!P.isUndefined(e)&&n.append(!0===u?L([r],t,a):null===u?r:r+"[]",f(e))})),!1;return!!U(t)||(n.append(L(o,r,a),f(t)),!1)}var d=[],h=Object.assign(q,{defaultVisitor:l,convertValue:f,isVisitable:U});if(!P.isObject(t))throw new TypeError("data must be an object");return function e(t,r){if(!P.isUndefined(t)){if(-1!==d.indexOf(t))throw Error("Circular reference detected in "+r.join("."));d.push(t),P.forEach(t,(function(t,o){!0===(!P.isUndefined(t)&&s.call(n,t,P.isString(o)?o.trim():o,r,h))&&e(t,r?r.concat(o):[o])})),d.pop()}}(t),n}function I(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function M(e,t){this._pairs=[],e&&z(e,this,t)}var J=M.prototype;function H(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function V(e,t,n){if(!t)return e;var r=e.indexOf("#");-1!==r&&(e=e.slice(0,r));var o=n&&n.encode||H,i=P.isURLSearchParams(t)?t.toString():new M(t,n).toString(o);return i&&(e+=(-1===e.indexOf("?")?"?":"&")+i),e}J.append=function(e,t){this._pairs.push([e,t])},J.toString=function(e){var t=e?function(t){return e.call(this,t,I)}:I;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var W,K=function(){function e(){t(this,e),this.handlers=[]}return r(e,[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){P.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),X={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},$="undefined"!=typeof URLSearchParams?URLSearchParams:M,Q=FormData,G=("undefined"==typeof navigator||"ReactNative"!==(W=navigator.product)&&"NativeScript"!==W&&"NS"!==W)&&"undefined"!=typeof window&&"undefined"!=typeof document,Y={isBrowser:!0,classes:{URLSearchParams:$,FormData:Q,Blob:Blob},isStandardBrowserEnv:G,protocols:["http","https","file","blob","url","data"]};function Z(e){function t(e,n,r,o){var i=e[o++],s=Number.isFinite(+i),a=o>=e.length;return i=!i&&P.isArray(r)?r.length:i,a?(P.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!s):(r[i]&&P.isObject(r[i])||(r[i]=[]),t(e,n,r[i],o)&&P.isArray(r[i])&&(r[i]=function(e){var t,n,r={},o=Object.keys(e),i=o.length;for(t=0;t0;)if(t===(n=r[o]).toLowerCase())return n;return null}function le(e,t){e&&this.set(e),this[se]=t||null}function de(e,t){var n=0,r=function(e,t){e=e||10;var n,r=new Array(e),o=new Array(e),i=0,s=0;return t=void 0!==t?t:1e3,function(a){var u=Date.now(),c=o[s];n||(n=u),r[i]=a,o[i]=u;for(var f=s,l=0;f!==i;)l+=r[f++],f%=e;if((i=(i+1)%e)===s&&(s=(s+1)%e),!(u-n-1,i=P.isObject(e);if(i&&P.isHTMLForm(e)&&(e=new FormData(e)),P.isFormData(e))return o&&o?JSON.stringify(Z(e)):e;if(P.isArrayBuffer(e)||P.isBuffer(e)||P.isStream(e)||P.isFile(e)||P.isBlob(e))return e;if(P.isArrayBufferView(e))return e.buffer;if(P.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return z(e,new Y.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return Y.isNode&&P.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((n=P.isFileList(e))||r.indexOf("multipart/form-data")>-1){var s=this.env&&this.env.FormData;return z(n?{"files[]":e}:e,s&&new s,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,n){if(P.isString(e))try{return(t||JSON.parse)(e),P.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||be.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&P.isString(e)&&(n&&!this.responseType||r)){var o=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(o){if("SyntaxError"===e.name)throw _.from(e,_.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Y.classes.FormData,Blob:Y.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};function ge(e,t){var n=this||be,r=t||n,o=le.from(r.headers),i=r.data;return P.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function Ee(e){return!(!e||!e.__CANCEL__)}function we(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new re}function Oe(e){return we(e),e.headers=le.from(e.headers),e.data=ge.call(e,e.transformRequest),(e.adapter||be.adapter)(e).then((function(t){return we(e),t.data=ge.call(e,e.transformResponse,t),t.headers=le.from(t.headers),t}),(function(t){return Ee(t)||(we(e),t&&t.response&&(t.response.data=ge.call(e,e.transformResponse,t.response),t.response.headers=le.from(t.response.headers))),Promise.reject(t)}))}function Re(e,t){t=t||{};var n={};function r(e,t){return P.isPlainObject(e)&&P.isPlainObject(t)?P.merge(e,t):P.isPlainObject(t)?P.merge({},t):P.isArray(t)?t.slice():t}function o(n){return P.isUndefined(t[n])?P.isUndefined(e[n])?void 0:r(void 0,e[n]):r(e[n],t[n])}function i(e){if(!P.isUndefined(t[e]))return r(void 0,t[e])}function s(n){return P.isUndefined(t[n])?P.isUndefined(e[n])?void 0:r(void 0,e[n]):r(void 0,t[n])}function a(n){return n in t?r(e[n],t[n]):n in e?r(void 0,e[n]):void 0}var u={url:i,method:i,data:i,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a};return P.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=u[e]||o,r=t(e);P.isUndefined(r)&&t!==a||(n[e]=r)})),n}P.forEach(["delete","get","head"],(function(e){be.headers[e]={}})),P.forEach(["post","put","patch"],(function(e){be.headers[e]=P.merge(ve)}));var Se="1.1.2",Ae={};["object","boolean","number","function","string","symbol"].forEach((function(t,n){Ae[t]=function(r){return e(r)===t||"a"+(n<1?"n ":" ")+t}}));var je={};Ae.transitional=function(e,t,n){function r(e,t){return"[Axios v1.1.2] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,o,i){if(!1===e)throw new _(r(o," has been removed"+(t?" in "+t:"")),_.ERR_DEPRECATED);return t&&!je[o]&&(je[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}};var Te={assertOptions:function(t,n,r){if("object"!==e(t))throw new _("options must be an object",_.ERR_BAD_OPTION_VALUE);for(var o=Object.keys(t),i=o.length;i-- >0;){var s=o[i],a=n[s];if(a){var u=t[s],c=void 0===u||a(u,s,t);if(!0!==c)throw new _("option "+s+" must be "+c,_.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new _("Unknown option "+s,_.ERR_BAD_OPTION)}},validators:Ae},xe=Te.validators,Ce=function(){function e(n){t(this,e),this.defaults=n,this.interceptors={request:new K,response:new K}}return r(e,[{key:"request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=(t=Re(this.defaults,t)).transitional;void 0!==n&&Te.assertOptions(n,{silentJSONParsing:xe.transitional(xe.boolean),forcedJSONParsing:xe.transitional(xe.boolean),clarifyTimeoutError:xe.transitional(xe.boolean)},!1),t.method=(t.method||this.defaults.method||"get").toLowerCase();var r=t.headers&&P.merge(t.headers.common,t.headers[t.method]);r&&P.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),t.headers=new le(t.headers,r);var o=[],i=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(i=i&&e.synchronous,o.unshift(e.fulfilled,e.rejected))}));var s,a=[];this.interceptors.response.forEach((function(e){a.push(e.fulfilled,e.rejected)}));var u,c=0;if(!i){var f=[Oe.bind(this),void 0];for(f.unshift.apply(f,o),f.push.apply(f,a),u=f.length,s=Promise.resolve(t);c0;)o._listeners[t](e);o._listeners=null}})),this.promise.then=function(e){var t,n=new Promise((function(e){o.subscribe(e),t=e})).then(e);return n.cancel=function(){o.unsubscribe(t)},n},n((function(e,t,n){o.reason||(o.reason=new re(e,t,n),r(o.reason))}))}return r(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}();var Pe=function e(t){var n=new Ce(t),r=o(Ce.prototype.request,n);return P.extend(r,Ce.prototype,n,{allOwnKeys:!0}),P.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(Re(t,n))},r}(be);return Pe.Axios=Ce,Pe.CanceledError=re,Pe.CancelToken=Ne,Pe.isCancel=Ee,Pe.VERSION=Se,Pe.toFormData=z,Pe.AxiosError=_,Pe.Cancel=Pe.CanceledError,Pe.all=function(e){return Promise.all(e)},Pe.spread=function(e){return function(t){return e.apply(null,t)}},Pe.isAxiosError=function(e){return P.isObject(e)&&!0===e.isAxiosError},Pe.formToJSON=function(e){return Z(P.isHTMLForm(e)?new FormData(e):e)},Pe})); +//# sourceMappingURL=axios.min.js.map diff --git a/web/lib/codemirror5-activeLine.js b/web/lib/codemirror5-activeLine.js new file mode 100644 index 0000000..0ebbfe5 --- /dev/null +++ b/web/lib/codemirror5-activeLine.js @@ -0,0 +1,72 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/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 WRAP_CLASS = "CodeMirror-activeline"; + var BACK_CLASS = "CodeMirror-activeline-background"; + var GUTT_CLASS = "CodeMirror-activeline-gutter"; + + CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { + var prev = old == CodeMirror.Init ? false : old; + if (val == prev) return + if (prev) { + cm.off("beforeSelectionChange", selectionChange); + clearActiveLines(cm); + delete cm.state.activeLines; + } + if (val) { + cm.state.activeLines = []; + updateActiveLines(cm, cm.listSelections()); + cm.on("beforeSelectionChange", selectionChange); + } + }); + + 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); + cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_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]; + var option = cm.getOption("styleActiveLine"); + if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !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.addLineClass(active[i], "gutter", GUTT_CLASS); + } + cm.state.activeLines = active; + }); + } + + function selectionChange(cm, sel) { + updateActiveLines(cm, sel.ranges); + } + }); \ No newline at end of file diff --git a/web/lib/codemirror5-closeBrackets.js b/web/lib/codemirror5-closeBrackets.js new file mode 100644 index 0000000..d087ba4 --- /dev/null +++ b/web/lib/codemirror5-closeBrackets.js @@ -0,0 +1,201 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/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 defaults = { + pairs: "()[]{}''\"\"", + closeBefore: ")]}'\":;>", + triples: "", + explode: "[]{}" + }; + + var Pos = CodeMirror.Pos; + + CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.removeKeyMap(keyMap); + cm.state.closeBrackets = null; + } + if (val) { + ensureBound(getOption(val, "pairs")) + cm.state.closeBrackets = val; + cm.addKeyMap(keyMap); + } + }); + + function getOption(conf, name) { + if (name == "pairs" && typeof conf == "string") return conf; + if (typeof conf == "object" && conf[name] != null) return conf[name]; + return defaults[name]; + } + + var keyMap = {Backspace: handleBackspace, Enter: handleEnter}; + function ensureBound(chars) { + for (var i = 0; i < chars.length; i++) { + var ch = chars.charAt(i), key = "'" + ch + "'" + if (!keyMap[key]) keyMap[key] = handler(ch) + } + } + ensureBound(defaults.pairs + "`") + + function handler(ch) { + return function(cm) { return handleChar(cm, ch); }; + } + + function getConfig(cm) { + var deflt = cm.state.closeBrackets; + if (!deflt || deflt.override) return deflt; + var mode = cm.getModeAt(cm.getCursor()); + return mode.closeBrackets || deflt; + } + + function handleBackspace(cm) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + + var pairs = getOption(conf, "pairs"); + 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), "+delete"); + } + } + + function handleEnter(cm) { + var conf = getConfig(cm); + var explode = conf && getOption(conf, "explode"); + if (!explode || 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 || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + cm.operation(function() { + var linesep = cm.lineSeparator() || "\n"; + cm.replaceSelection(linesep + linesep, null); + moveSel(cm, -1) + 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); + } + }); + } + + function moveSel(cm, dir) { + var newRanges = [], ranges = cm.listSelections(), primary = 0 + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i] + if (range.head == cm.getCursor()) primary = i + var pos = range.head.ch || dir > 0 ? {line: range.head.line, ch: range.head.ch + dir} : {line: range.head.line - 1} + newRanges.push({anchor: pos, head: pos}) + } + cm.setSelections(newRanges, primary) + } + + function contractSelection(sel) { + var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0; + return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)), + head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))}; + } + + function handleChar(cm, ch) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + + var pairs = getOption(conf, "pairs"); + var pos = pairs.indexOf(ch); + if (pos == -1) return CodeMirror.Pass; + + var closeBefore = getOption(conf,"closeBefore"); + + var triples = getOption(conf, "triples"); + + var identical = pairs.charAt(pos + 1) == ch; + var ranges = cm.listSelections(); + var opening = pos % 2 == 0; + + var type; + 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 (opening && !range.empty()) { + curType = "surround"; + } else if ((identical || !opening) && next == ch) { + if (identical && stringStartsAfter(cm, cur)) + curType = "both"; + else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) + curType = "skipThree"; + else + curType = "skip"; + } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && + cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) { + if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass; + curType = "addFour"; + } else if (identical) { + var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur) + if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both"; + else return CodeMirror.Pass; + } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) { + curType = "both"; + } else { + return CodeMirror.Pass; + } + if (!type) type = curType; + else if (type != curType) return CodeMirror.Pass; + } + + var left = pos % 2 ? pairs.charAt(pos - 1) : ch; + var right = pos % 2 ? ch : pairs.charAt(pos + 1); + cm.operation(function() { + if (type == "skip") { + moveSel(cm, 1) + } else if (type == "skipThree") { + moveSel(cm, 3) + } 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"); + sels = cm.listSelections().slice(); + for (var i = 0; i < sels.length; i++) + sels[i] = contractSelection(sels[i]); + cm.setSelections(sels); + } else if (type == "both") { + cm.replaceSelection(left + right, null); + cm.triggerElectric(left + right); + moveSel(cm, -1) + } else if (type == "addFour") { + cm.replaceSelection(left + left + left + left, "before"); + moveSel(cm, 1) + } + }); + } + + 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; + } + + function stringStartsAfter(cm, pos) { + var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)) + return /\bstring/.test(token.type) && token.start == pos.ch && + (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos))) + } + }); \ No newline at end of file diff --git a/web/lib/codemirror5-loadMode.js b/web/lib/codemirror5-loadMode.js new file mode 100644 index 0000000..9ceb393 --- /dev/null +++ b/web/lib/codemirror5-loadMode.js @@ -0,0 +1,66 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/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, options) { + var modeObj = CodeMirror.modes[mode], deps = modeObj && modeObj.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, options); + } + + CodeMirror.requireMode = function(mode, cont, options) { + if (typeof mode != "string") mode = mode.name; + if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont, options); + if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); + + var file = options && options.path ? options.path(mode) : CodeMirror.modeURL.replace(/%N/g, mode); + if (options && options.loadMode) { + options.loadMode(file, function() { ensureDeps(mode, cont, options) }) + } else 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](); + }, options); + }); + others.parentNode.insertBefore(script, others); + } else if (env == "cjs") { + require(file); + cont(); + } else if (env == "amd") { + requirejs([file], cont); + } + }; + + CodeMirror.autoLoadMode = function(instance, mode, options) { + if (!CodeMirror.modes.hasOwnProperty(mode)) + CodeMirror.requireMode(mode, function() { + instance.setOption("mode", instance.getOption("mode")); + }, options); + }; + }); \ No newline at end of file diff --git a/web/lib/codemirror5-overlay.js b/web/lib/codemirror5-overlay.js new file mode 100644 index 0000000..9ff7d5b --- /dev/null +++ b/web/lib/codemirror5-overlay.js @@ -0,0 +1,90 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/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, line) { + return base.indent(state.base, textAfter, line); + }, + electricChars: base.electricChars, + + innerMode: function(state) { return {state: state.base, mode: base}; }, + + blankLine: function(state) { + var baseToken, overlayToken; + if (base.blankLine) baseToken = base.blankLine(state.base); + if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay); + + return overlayToken == null ? + baseToken : + (combine && baseToken != null ? baseToken + " " + overlayToken : overlayToken); + } + }; + }; + + }); \ No newline at end of file diff --git a/web/lib/codemirror5-scrollPastEnd.js b/web/lib/codemirror5-scrollPastEnd.js new file mode 100644 index 0000000..310fb62 --- /dev/null +++ b/web/lib/codemirror5-scrollPastEnd.js @@ -0,0 +1,48 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/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.off("refresh", updateBottomMargin); + cm.setSize(); + cm.on("refresh", updateBottomMargin); + } + } +}); diff --git a/web/lib/codemirror5.css b/web/lib/codemirror5.css new file mode 100644 index 0000000..f4d5718 --- /dev/null +++ b/web/lib/codemirror5.css @@ -0,0 +1,344 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + 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; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} +.cm-fat-cursor .CodeMirror-line::selection, +.cm-fat-cursor .CodeMirror-line > span::selection, +.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; } +.cm-fat-cursor .CodeMirror-line::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; } +.cm-fat-cursor { caret-color: transparent; } +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: 0; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.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-strikethrough {text-decoration: line-through;} + +.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, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} +.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-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-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 50px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -50px; margin-right: -50px; + padding-bottom: 50px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; + z-index: 0; +} +.CodeMirror-sizer { + position: relative; + border-right: 50px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual 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; + outline: 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; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -50px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + /* 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; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre.CodeMirror-line, +.CodeMirror-wrap pre.CodeMirror-line-like { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/web/lib/codemirror5.js b/web/lib/codemirror5.js new file mode 100644 index 0000000..156fc30 --- /dev/null +++ b/web/lib/codemirror5.js @@ -0,0 +1,9874 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/5/LICENSE + +// This is CodeMirror (https://codemirror.net/5), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.CodeMirror = factory()); +}(this, (function () { 'use strict'; + + // Kludges for bugs and behavior differences that can't be feature + // detected are enabled based on userAgent etc sniffing. + var userAgent = navigator.userAgent; + var platform = navigator.platform; + + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\/(\d+)/.exec(userAgent); + var chrome_version = chrome && +chrome[1]; + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + + var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); + var android = /Android/.test(userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { presto_version = Number(presto_version[1]); } + if (presto_version && presto_version >= 15) { presto = false; webkit = true; } + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || (ie && ie_version >= 9); + + function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + + var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) + } + + 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 + } + // wrapper for elt, which removes the elt from the accessibility tree + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e + } + + var range; + if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r + }; } + else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r + }; } + + function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) + } + + function activeElt(doc) { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = doc.activeElement; + } catch(e) { + activeElement = doc.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement + } + + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b + } + + var selectInput = function(node) { node.select(); }; + if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } + else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + + function doc(cm) { return cm.display.wrapper.ownerDocument } + + function win(cm) { return doc(cm).defaultView } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} + } + + function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } + } + + var Delayed = function() { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function (self) { + self.id = 0; + if (self.time <= +new Date) { + self.f(); + } else { + setTimeout(self.handler, self.time - +new Date); + } + }; + Delayed.prototype.set = function (ms, f) { + this.f = f; + var time = +new Date + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + + function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 + } + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerGap = 50; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = {toString: function(){return "CodeMirror.Pass"}}; + + // Reused option objects for setSelection & friends + var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; + + // The inverse of countColumn -- find the offset that corresponds to + // a particular column. + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } + } + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] + } + + function lst(arr) { return arr[arr.length-1] } + + function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out + } + + function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); + } + + function nothing() {} + + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst + } + + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + } + function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) + } + + function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true + } + + // Extending unicode characters. A series of a non-extending char + + // any number of extending chars is treated as a single unit as far + // as editing and measuring is concerned. This is not fully correct, + // since some scripts/fonts/browsers also treat other configurations + // of code points as a group. + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + + // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos + } + + // Returns the value from the range [`from`; `to`] that satisfies + // `pred` and is closest to `from`. Assumes that at least `to` + // satisfies `pred`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { return from } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { return pred(mid) ? from : to } + if (pred(mid)) { to = mid; } + else { from = mid + dir; } + } + } + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr", 0) } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } + } + + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + + return direction == "rtl" ? order.reverse() : order + } + })(); + + // Get the bidi ordering for the given line (and cache it). Returns + // false for lines that are fully left-to-right, and an array of + // BidiSpan objects otherwise. + function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order + } + + // EVENT HANDLING + + // Lightweight event framework. on/off also work on DOM nodes, + // registering native DOM handlers. + + var noHandlers = []; + + var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map = emitter._handlers || (emitter._handlers = {}); + map[type] = (map[type] || noHandlers).concat(f); + } + }; + + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map = emitter._handlers, arr = map && map[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } + } + + function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } + } + + // The DOM events that CodeMirror handles can be overridden by + // registering a (non-DOM) handler on the editor for the event name, + // and preventDefault-ing the event in that handler. + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore + } + + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } + } + + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 + } + + // Add on and off methods to a constructor's prototype, to make + // registering events on such objects more convenient. + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; + } + + // Due to the fact that we still support jurassic IE versions, some + // compatibility wrappers are needed. + + function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + + function e_target(e) {return e.target || e.srcElement} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b + } + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div + }(); + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node + } + + // Feature-detect IE's crummy client rect reporting for bidi text + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result + } : function (string) { return string.split(/\r\n?|\n/); }; + + var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } + } : function (te) { + var range; + try {range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) { return false } + return range.compareEndPoints("StartToEnd", range) != 0 + }; + + var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" + })(); + + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 + } + + // Known modes, by name and by MIME + var modes = {}, mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; + } + + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + } + + function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} + } + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true + } + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + + StringStream.prototype.eol = function () {return this.pos >= this.string.length}; + StringStream.prototype.sol = function () {return this.pos == this.lineStart}; + StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } + return this.pos > start + }; + StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} + }; + StringStream.prototype.backUp = function (n) {this.pos -= n;}; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.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 + } + }; + StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + // Find the line object corresponding to the given line number. + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] + } + + // Get the part of a document between two positions, as an array of + // strings. + function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out + } + // Get the lines between from and to, as array of strings. + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out + } + + // Update the height of a line, propagating the height change + // upwards to parent nodes. + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } + } + + // Given a line object, find its line number by walking up through + // its parent links. + function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first + } + + // Find the line at the given vertical position, using the height + // information in the document tree. + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); + } + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i + } + + function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) + } + + // A Pos instance represents a position within the text. + function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + + // Compare two positions, return 0 if they are the same, a negative + // number when a is less, and a positive number otherwise. + function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + + function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + + function copyPos(x) {return Pos(x.line, x.ch)} + function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } + function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + + // Most of the external API clips given positions to make sure they + // actually exist within the document. + function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} + function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } + } + function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out + } + + var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + + var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line + }; + + Context.prototype.baseToken = function (n) { + if (!this.baseTokens) { return null } + while (this.baseTokens[this.baseTokenPos] <= n) + { this.baseTokenPos += 2; } + var type = this.baseTokens[this.baseTokenPos + 1]; + return {type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n} + }; + + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } + }; + + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } + }; + + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state + }; + + + // Compute a style array (an array starting with a mode generation + // -- for invalidation -- followed by pairs of end positions and + // style strings), which is used to highlight the tokens on the + // line. + function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + context.baseTokens = st; + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} + } + + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles + } + + function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. Used for lines that + // aren't currently visible. + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + + function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } + } + + function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") + } + + var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + + // Utility for getTokenAt and getLineTokens + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) + } + + function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type + } + + // Run the given mode's parser over a line, calling f for each token. + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline + } + + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + + // Optimize some code when these features are not used. + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + + // TEXTMARKER SPANS + + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; + } + + // Search an array of spans for a span matching the given marker. + function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } + } + + // Remove a span from an array, returning undefined if no spans are + // left (we don't store arrays for lines without spans). + function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r + } + + // Add a span to a line. + function addMarkedSpan(line, span, op) { + var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet)); + if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { + line.markedSpans.push(span); + } else { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + if (inThisOp) { inThisOp.add(line.markedSpans); } + } + span.marker.attachLine(line); + } + + // Used for the algorithm that adjusts markers for a change in the + // document. These functions cut an array of spans at a given + // character position, returning an array of remaining chunks (or + // undefined if nothing remains). + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw + } + + // Given a change object, compute the new set of marker spans that + // cover the line in which the change took place. Removes spans + // entirely within the change, reconnects spans belonging to the + // same marker that appear on both sides of the change, and cuts off + // spans partially within the change. Returns an array of span + // arrays with one element for each line in (after) the change. + function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers + } + + // Remove spans that are empty and don't have a clearWhenEmpty + // option of false. + function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans + } + + // Used to 'clip' out readOnly ranges when making a change. + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts + } + + // Connect or disconnect spans from a line. + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; + } + + // Helpers used when computing which overlapping collapsed span + // counts as the larger one. + function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } + function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + + // Returns a number indicating which of two overlapping collapsed + // spans is larger (and thus includes the other). Falls back to + // comparing ids when the spans cover exactly the same range. + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id + } + + // Find out whether a line ends or starts in a collapsed span. If + // so, return the marker for that span. + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } + } } + return found + } + function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } + function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } + } } + return found + } + + // Test whether there exists a collapsed span that partially + // overlaps (covers the start or end, but not both) of a new span. + // Such overlap is not allowed. + function conflictingCollapsedRange(doc, lineNo, from, to, marker) { + var line = getLine(doc, lineNo); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } + } + + // A visual line is a line as drawn on the screen. Folding, for + // example, can cause multiple logical lines to appear on the same + // visual line. This finds the start of the visual line that the + // given line is part of (usually that is the line itself). + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line + } + + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line + } + + // Returns an array of logical lines that continue the visual line + // started by the argument, or undefined if there are no such lines. + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines + } + + // Get the line number of the start of the visual line that the + // given line number is part of. + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) + } + + // Get the line number of the start of the next visual line after + // the given line. + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 + } + + // Compute whether a line is hidden. Lines count as hidden when they + // are part of a visual line that starts with another line, or when + // they are entirely covered by collapsed, non-widget span. + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } + } + + // Find the height above the given line. + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h + } + + // Compute the character length of a line, taking into account + // collapsed ranges (see markText) that might hide parts, and join + // other lines onto it. + function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len + } + + // Find the longest line in the document. + function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + + Line.prototype.lineNo = function () { return lineNo(this) }; + eventMixin(Line); + + // Change the content (text, markers) of a line. Automatically + // invalidates cached information and tries to re-estimate the + // line's height. + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + } + + // Detach a line from the document tree and its markers. + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Convert a style as returned by a mode (either null, or a string + // containing one or more styles) to a CSS style. This is cached, + // and also looks for line-wide styles. + var styleToClassCache = {}, styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) + } + + // Render the DOM representation of the text of a line. Also builds + // up a 'line map', which points at the DOM nodes that represent + // specific stretches of text, and is used by the measuring code. + // The returned object contains the DOM node, this map, and + // information about line-wide styles that were set by the mode. + function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder + } + + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token + } + + // Build up the DOM representation for a single token, and add it to + // the line map. Takes care to render special characters separately. + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css || attributes) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") + { token.setAttribute(attr, attributes[attr]); } } + } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result + } + + // Work around nonsense dimensions being reported for stretches of + // right-to-left text. + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } + } + + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { (attributes || (attributes = {})).title = m.title; } + if (m.attributes) { + for (var attr in m.attributes) + { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } + } + + + // These objects are used to represent the visible (currently drawn) + // part of the document. A LineView may correspond to multiple + // logical lines, if those are connected by collapsed ranges. + function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + + // Create a range of LineView objects for the given lines. + function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array + } + + var operationGroup = null; + + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + + function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) + } + + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } + } + + var orphanDelayedCallbacks = null; + + // Often, we want to signal events at a point where we are in the + // middle of some work, but don't want the handler to start calling + // other methods on the editor, which might be in an inconsistent + // state or simply not expect any other events to happen. + // signalLater looks whether there are any handlers, and schedules + // them to be executed when the last operation ends, or, if no + // operation is active, when a timeout fires. + function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); + } + + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } + } + + // When an aspect of a line changes, a string is added to + // lineView.changes. This updates the relevant part of the line's + // DOM structure. + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; + } + + // Lines with gutter elements, widgets or a background class need to + // be wrapped, and have the extra elements added to the wrapper div + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node + } + + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + + // Wrapper around buildLineContent which will reuse the structure + // in display.externalMeasured when possible. + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) + } + + // Redraw the line's text. Interacts with the background and text + // classes because the mode may output tokens that influence these + // classes. + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + gutterWrap.setAttribute("aria-hidden", "true"); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } + } + + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); + } + + // Build a line's DOM representation from scratch + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node + } + + // A lineView may contain multiple logical lines (when merged by + // collapsed spans). The widgets for all of them need to be drawn. + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } + } + + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } + } + + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } + } + + function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight + } + + // Return true when the given mouse event happened in a widget + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop} + function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} + function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data + } + + function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight + } + + // Ensure the lineView.wrapping.heights array is populated. This is + // an array of bottom offsets for the lines that make up a drawn + // line. When lineWrapping is on, there might be more than one + // height. + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } + } + + // Find a line map (mapping character offsets to text nodes) and a + // measurement cache for the given line number. (A line view might + // contain multiple lines when collapsed ranges are present.) + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + if (lineView.rest) { + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } + } + } + + // Render a line into the hidden node display.externalMeasured. Used + // when measurement is needed for a line that's not in the viewport. + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view + } + + // Get a {top, bottom, left, right} box (in line-local coordinates) + // for a given character. + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) + } + + // Find a line view that corresponds to the given line number. + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } + } + + // Measurement can be split in two steps, the set-up work that + // applies to the whole line, and the measurement of the actual + // character. Functions like coordsChar, that need to do a lot of + // measurements in a row, can thus ensure that the set-up work is + // only done once. + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } + } + + // Given a prepared measurement object, measures the position of an + // actual character (or fetches it from the cache). + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} + } + + var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + + function nodeAndOffsetInLineMap(map, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map.length; i += 3) { + mStart = map[i]; + mEnd = map[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { + node = map[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { + node = map[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} + } + + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect + } + + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result + } + + // Work around problem with bounding client rects on ranges being + // returned incorrectly when zoomed on IE10 and below. + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} + } + + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } + } + + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } + } + + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; + } + + function pageScrollX(doc) { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(doc.body.getBoundingClientRect().left - parseInt(getComputedStyle(doc.body).marginLeft)) } + return doc.defaultView.pageXOffset || (doc.documentElement || doc.body).scrollLeft + } + function pageScrollY(doc) { + if (chrome && android) { return -(doc.body.getBoundingClientRect().top - parseInt(getComputedStyle(doc.body).marginTop)) } + return doc.defaultView.pageYOffset || (doc.documentElement || doc.body).scrollTop + } + + function widgetTopHeight(lineObj) { + var ref = visualLine(lineObj); + var widgets = ref.widgets; + var height = 0; + if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above) + { height += widgetHeight(widgets[i]); } } } + return height + } + + // Converts a {top, bottom, left, right} box from line-local + // coordinates into another coordinate system. Context may be one of + // "line", "div" (display.lineDiv), "local"./null (editor), "window", + // or "page". + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; rect.bottom += height; + } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY(doc(cm))); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX(doc(cm))); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect + } + + // Coverts a box from "div" coords to another coordinate system. + // Context may be "window", "page", "div", or "local"./null. + function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(doc(cm)); + top -= pageScrollY(doc(cm)); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} + } + + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) + } + + // Returns a box for a given cursor position, which may have an + // 'other' property containing the position of the secondary cursor + // on a bidi boundary. + // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` + // and after `char - 1` in writing order of `char - 1` + // A cursor Pos(line, char, "after") is on the same visual line as `char` + // and before `char` in writing order of `char` + // Examples (upper-case letters are RTL, lower-case are LTR): + // Pos(0, 1, ...) + // before after + // ab a|b a|b + // aB a|B aB| + // Ab |Ab A|b + // AB B|A B|A + // Every position after the last character on a line is considered to stick + // to the last character on the line. + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = part.level == 1; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val + } + + // Used to cheaply estimate the coordinates for a position. Used for + // intermediate scroll updates. + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} + } + + // Positions returned by coordsChar contain some extra information. + // xRel is the relative x position of the input coordinates compared + // to the found position (so xRel > 0 means the coordinates are to + // the right of the character position, for example). When outside + // is true, that means the coordinates lie outside the line's + // vertical range. + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = outside; } + return pos + } + + // Compute the character position closest to the given coordinates. + // Input must be lineSpace-local ("div" coordinate system). + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { return found } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { return rangeEnd } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); + return {begin: begin, end: end} + } + + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) + (cm, lineObj, lineNo, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight; box.bottom += widgetHeight; + if (!boxIsAfter(box, x, y, false)) { return false } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true + }, begin, end); + + var baseX, sticky, outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { ch++; } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : + (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ? + "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo, ch, sticky, outside, x - baseX) + } + + function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"), + "line", lineObj, preparedMeasure), x, y, true) + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) + { part = order[index - 1]; } + } + return part + } + + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } + var part = null, closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { continue } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { part = order[order.length - 1]; } + // Clip the part to the wrapped line. + if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } + if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } + return part + } + + var measureText; + // Compute the default text height. + function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 + } + + // Compute the default character width. + function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 + } + + // Do a bulk-read of the DOM positions and sizes needed to draw the + // view, so that we don't interleave reading and writing to the DOM. + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + var id = cm.display.gutterSpecs[i].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} + } + + // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, + // but using getBoundingClientRect to get a sub-pixel-accurate + // result. + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left + } + + // Returns a function that estimates the height of a line, to use as + // first approximation until the line becomes visible (and is thus + // properly measurable). + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } + } + + function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); + } + + // Given a mouse event, find the corresponding position. If liberal + // is false, it checks whether a gutter or scrollbar was clicked, + // and returns null if it was. forRect is used by rectangular + // selections, and tries to estimate a character position even for + // coordinates beyond the right of the text. + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e$1) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords + } + + // Find the view element corresponding to a given line. Return null + // when the line isn't visible. + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } + } + + // Updates the display.view data structure for a given change to the + // document. From and to are in pre-change coordinates. Lendiff is + // the amount of lines added or subtracted by the change. This is + // used for changes that span multiple lines, or change the way + // lines are divided into visual lines. regLineChange (below) + // registers single-line changes. + function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } + } + + // Register a change to a single line. Type must be one of "text", + // "gutter", "class", "widget" + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } + } + + // Clear the view. + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} + } + + // Force the view to cover a given range, adding empty view element + // or clipping off existing ones as needed. + function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; + } + + // Count the number of lines in the view whose DOM representation is + // out of date (or nonexistent). + function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty + } + + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + + function prepareSelection(cm, primary) { + if ( primary === void 0 ) primary = true; + + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + var customCursor = cm.options.$customCursor; + if (customCursor) { primary = true; } + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (!primary && i == doc.sel.primIndex) { continue } + var range = doc.sel.ranges[i]; + if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue } + var collapsed = range.empty(); + if (customCursor) { + var head = customCursor(cm, range); + if (head) { drawSelectionCursor(cm, head, curFragment); } + } else if (collapsed || cm.options.showCursorWhenSelecting) { + drawSelectionCursor(cm, range.head, curFragment); + } + if (!collapsed) + { drawSelectionRange(cm, range, selFragment); } + } + return result + } + + // Draws a cursor for the given range + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { + var charPos = charCoords(cm, head, "div", null, null); + var width = charPos.right - charPos.left; + cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; + } + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } + } + + function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } + + // Draws the given range as a highlighted selection + function drawSelectionRange(cm, range, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop] + } + + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i == 0, last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + + if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } + if (cmpCoords(toPos, start) < 0) { start = toPos; } + if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } + if (cmpCoords(toPos, end) < 0) { end = toPos; } + }); + return {start: start, end: end} + } + + var sFrom = range.from(), sTo = range.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); + } + + // Cursor-blinking + function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { + if (!cm.hasFocus()) { onBlur(cm); } + display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } + } + + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { onFocus(cm); } + } + } + + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { onBlur(cm); } + } }, 100); + } + + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); + } + + // Read the actual heights of the rendered lines, and update their + // stored heights to match. + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); + var oldHeight = display.lineDiv.getBoundingClientRect().top; + var mustScroll = 0; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], wrapping = cm.options.lineWrapping; + var height = (void 0), width = 0; + if (cur.hidden) { continue } + oldHeight += cur.line.height; + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) + { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } + } + var diff = cur.line.height - height; + if (diff > .005 || diff < -.005) { + if (oldHeight < viewTop) { mustScroll -= diff; } + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; } + } + + // Read and store the height of line widgets associated with the + // given line. + function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i], parent = w.node.parentNode; + if (parent) { w.height = parent.offsetHeight; } + } } + } + + // Compute the lines that are visible in a given viewport (defaults + // the the current scroll position). viewport may contain top, + // height, and ensure (see op.scrollToPos) properties. + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} + } + + // SCROLLING THINGS INTO VIEW + + // If an editor sits on the top or bottom of the window, partially + // scrolled out of view, this ensures that the cursor is visible. + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + var doc = display.wrapper.ownerDocument; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (doc.defaultView.innerHeight || doc.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + + // Scroll a given position into view (immediately), verifying that + // it actually became visible (as line heights are accurately + // measured, the position of something may 'drift' during drawing). + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect + } + + // Scroll a given set of coordinates into view (immediately). + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } + } + + // Calculate a new scroll position needed to scroll the given + // rectangle into view. Returns an object with scrollTop and + // scrollLeft properties. When these are undefined, the + // vertical/horizontal position does not need to be adjusted. + function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result + } + + // Store a relative adjustment to the scroll position in the current + // operation (to be applied when the operation finishes). + function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + + // Make sure that at the end of the operation the current cursor is + // shown. + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; + } + + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } + } + + function scrollToRange(cm, range) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range; + } + + // When an operation has its scrollToPos property set, and another + // scroll action is applied before the end of the operation, this + // 'simulates' scrolling that position into view in a cheap way, so + // that the effect of intermediate scroll commands is not ignored. + function resolveScrollToPos(cm) { + var range = cm.curOp.scrollToPos; + if (range) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); + scrollToCoordsRange(cm, from, to, range.margin); + } + } + + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + + // Sync the scrollable area and scrollbars, ensure the viewport + // covers the visible area. + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); + } + + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } + } + + // Sync scroller and scrollbar, ensure the gutter elements are + // aligned. + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); + } + + // SCROLLBARS + + // Prepare DOM reads needed to update the scrollbars. Done in one + // shot to minimize update/measure roundtrips. + function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } + } + + var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } + }; + + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.scrollTop = 0; + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} + }; + + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } + }; + + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } + }; + + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.visibility = this.vert.style.visibility = "hidden"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; + }; + + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.visibility = ""; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt != bar) { bar.style.visibility = "hidden"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); + }; + + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + + var NullScrollbars = function () {}; + + NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + + function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } + } + + // Re-synchronize the fake scrollbars with the actual size of the + // content. + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } + } + + var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + // Operations are used to wrap a series of changes to the editor + // state in such a way that each change won't have to update the + // cursor and display (which would be awkward, slow, and + // error-prone). Instead, display updates are batched and then all + // combined and executed at once. + + var nextOpId = 0; + // Start a new operation. + function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: 0, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId, // Unique ID + markArrays: null // Used by addMarkedSpan + }; + pushOperation(cm.curOp); + } + + // Finish an operation, updating the display and signalling delayed events + function endOperation(cm) { + var op = cm.curOp; + if (op) { finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); } + } + + // The DOM updates done when an operation finishes are batched so + // that the minimum number of relayouts are required. + function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } + } + + function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); + } + + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + + function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(); } + } + + function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt(doc(cm)); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } + } + + function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } + } + + // Run the given function in an operation + function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } + } + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } + } + // Used to add methods to editor and doc instances, wrapping them in + // operations. + function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } + } + function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } + } + + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } + } + + // DISPLAY DRAWING + + var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } + }; + DisplayUpdate.prototype.finish = function () { + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this.events[i]); } + }; + + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + + function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(doc(cm)); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = win(cm).getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result + } + + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt(snapshot.activeElt.ownerDocument)) { return } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && + snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var doc = snapshot.activeElt.ownerDocument; + var sel = doc.defaultView.getSelection(), range = doc.createRange(); + range.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range.collapse(false); + sel.removeAllRanges(); + sel.addRange(range); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + + // Does the actual updating of the line display. Bails out + // (returning false) when there is nothing to be done and forced is + // false. + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true + } + + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } + } + + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + + // Sync the actual display DOM structure with display.view, removing + // nodes for lines that are no longer in view, and creating the ones + // that are not there yet, and updating the ones that are out of + // date. + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } + } + + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + // Send an event to consumers responding to changes in gutter width. + signalLater(display, "gutterChanged", display); + } + + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; + } + + // Re-align line numbers and gutter marks to compensate for + // horizontal scrolling. + function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } + } + + // Used to ensure that the line number gutter is still the right + // size for the current document size. Returns true when an update + // is needed. + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true + } + return false + } + + function getGutters(gutters, lineNumbers) { + var result = [], sawLineNumbers = false; + for (var i = 0; i < gutters.length; i++) { + var name = gutters[i], style = null; + if (typeof name != "string") { style = name.style; name = name.className; } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { continue } + else { sawLineNumbers = true; } + } + result.push({className: name, style: style}); + } + if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } + return result + } + + // Rebuild the gutter elements, ensure the margin to the left of the + // code matches their width. + function renderGutters(display) { + var gutters = display.gutters, specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i = 0; i < specs.length; ++i) { + var ref = specs[i]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { gElt.style.cssText = style; } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + + // The display handles the DOM integration, both for input reading + // and content drawing. It holds references to DOM nodes and + // display-related state. + + function Display(place, doc, input, options) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + // See #6982. FIXME remove when this has been fixed for a while in Chrome + if (chrome && chrome_version >= 105) { d.wrapper.style.clipPath = "inset(0px)"; } + + // This attribute is respected by automatic translation systems such as Google Translate, + // and may also be respected by tools used by human translators. + d.wrapper.setAttribute('translate', 'no'); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + + input.init(d); + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) { wheelPixelsPerUnit = -.53; } + else if (gecko) { wheelPixelsPerUnit = 15; } + else if (chrome) { wheelPixelsPerUnit = -.7; } + else if (safari) { wheelPixelsPerUnit = -1/3; } + + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta + } + + function onScrollWheel(cm, e) { + // On Chrome 102, viewport updates somehow stop wheel-based + // scrolling. Turning off pointer events during the scroll seems + // to avoid the issue. + if (chrome && chrome_version == 102) { + if (cm.display.chromeScrollHack == null) { cm.display.sizer.style.pointerEvents = "none"; } + else { clearTimeout(cm.display.chromeScrollHack); } + cm.display.chromeScrollHack = setTimeout(function () { + cm.display.chromeScrollHack = null; + cm.display.sizer.style.pointerEvents = ""; + }, 100); + } + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + var pixelsPerUnit = wheelPixelsPerUnit; + if (e.deltaMode === 0) { + dx = e.deltaX; + dy = e.deltaY; + pixelsPerUnit = 1; + } + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && pixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && pixelsPerUnit != null) { + var pixels = dy * pixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20 && e.deltaMode !== 0) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + // Selection objects are immutable. A new one is created every time + // the selection changes. A selection is one or more non-overlapping + // (and non-touching) ranges, sorted, and an integer that indicates + // which one is the primary selection (the one that's scrolled into + // view, that getCursor returns, etc). + var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + + Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + + Selection.prototype.equals = function (other) { + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true + }; + + Selection.prototype.deepCopy = function () { + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); } + return new Selection(out, this.primIndex) + }; + + Selection.prototype.somethingSelected = function () { + for (var i = 0; i < this.ranges.length; i++) + { if (!this.ranges[i].empty()) { return true } } + return false + }; + + Selection.prototype.contains = function (pos, end) { + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 + }; + + var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; + }; + + Range.prototype.from = function () { return minPos(this.anchor, this.head) }; + Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; + Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + + // Take an unsorted, potentially overlapping set of ranges, and + // build a selection out of it. 'Consumes' ranges array (modifying + // it). + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) + } + + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) + } + + // Compute the position of the end of a change (its 'to' property + // refers to the pre-change end). + function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) + } + + // Adjust a position to refer to the post-change position of the + // same text, or the end of the change if the change covers it. + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) + } + + function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex) + } + + function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } + } + + // Used by replaceSelections to allow moving the selection to the + // start or around the replaced test. Hint may be "start" or "around". + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) + } + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } + } + + // DOCUMENT DATA STRUCTURE + + // By default, updates that start and end at the beginning of a line + // are treated specially, in order to make the association of line + // widgets and marker elements with the text behave more intuitive. + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) + } + + // Perform a change on the document data structure. + function updateDoc(doc, change, markedSpans, estimateHeight) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); + } + + // Call f for all linked documents. + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); + } + + // Attach a document to an editor. + function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + cm.options.direction = doc.direction; + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); + } + + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + + function History(prev) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = prev ? prev.undoDepth : Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; + } + + // Create a history change event from an updateDoc-style change + // object. + function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange + } + + // Pop all selection events off the end of a history array. Stop at + // a change event. + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } + } + + // Find the top change event in the history. Pop off selection + // events that are in the way. + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } + } + + // Register a change in the history. Merges changes that are within + // a single operation, or are close together with an origin that + // allows merging (starting with "+") into a single event. + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } + } + + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) + } + + // Called whenever the selection changes, sets the new selection as + // the pending selection in the history, and pushes the old pending + // selection into the 'done' array when it was significantly + // different (in number of selected ranges, emptiness, or time). + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } + } + + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } + } + + // Used to store marked span information in the history. + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); + } + + // When un/re-doing restores text containing marked spans, those + // that have been explicitly cleared should not be restored. + function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null + } + + // Retrieve and filter the old marked spans stored in a change event. + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw + } + + // Used for un/re-doing changes from the history. Combines the + // result of computing the existing spans with the set of spans that + // existed in the history (so that deleting around a span and then + // undoing brings back the span). + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy + } + + // The 'scroll' parameter given to many of these indicated whether + // the new cursor position should be scrolled into view after + // modifying the selection. + + // If shift is held or the extend flag is set, extends a range to + // include a given position (and optionally a second position). + // Otherwise, simply returns the range between the given positions. + // Used for cursor motion and such. + function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } + } + + // Extend the primary selection range, discard the rest. + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + + // Extend all selections (pos is an array of selections with length + // equal the number of selections) + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + + // Updates a single range in the selection. + function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + + // Reset the selection to a single range. + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + + // Give beforeSelectionChange handlers a change to influence a + // selection update. + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } + else { return sel } + } + + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + + // Set a new selection. + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor") + { ensureCursorVisible(doc.cm); } + } + + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + + // Verify that the selection does not partially select any atomic + // marked ranges. + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + + // Return a selection that does not partially select any atomic + // ranges. + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = range.head == range.anchor ? newAnchor : skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel + } + + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + + // Determine if we should prevent the cursor being placed to the left/right of an atomic marker + // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it + // is with selectLeft/Right + var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; + + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? preventCursorRight : preventCursorLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos + } + + // Ensure a given position is not inside an atomic range. + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found + } + + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } + } + + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + + // UPDATING + + // Allow "beforeChange" event handlers to influence a change + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { + if (doc.cm) { doc.cm.curOp.updateInput = 2; } + return null + } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} + } + + // Apply a change to a document, and add it to the document's + // history, and propagating it to all linked documents. + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } + } else { + makeChangeInner(doc, change); + } + } + + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + // Revert a change stored in a document's history. + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } else if (suppress) { + source.push(event); + return + } else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } + } + + // Sub-views need their line numbers shifted when text is added + // above or below them in the parent document. + function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } + } + + // More lower-level change function, handling only a single document + // (not linked ones). + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) + { doc.cantEdit = false; } + } + + // Handle the interaction of a change to a document with the editor + // that this document is part of. + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; + } + + function replaceRange(doc, code, from, to, origin) { + var assign; + + if (!to) { to = from; } + if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } + } + + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // Utility for applying a change to a line by handle or number, + // returning the number and optionally registering the line as + // changed. + function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line + } + + // The document is represented as a BTree consisting of leaves, with + // chunk of lines in them, and branches, with up to ten leaves or + // other branch nodes below them. The top node is always a branch + // node, and is the document object itself (meaning it has + // additional methods and properties). + // + // All nodes have parent links. The tree is used both to go from + // line numbers to line objects, and to go from objects to numbers. + // It also indexes by height, and is used to convert between height + // and line object, and to find the total height of the document. + // + // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function(at, n) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; } + }, + + // Used to iterate over a part of the tree. + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + { if (op(this.lines[at])) { return true } } + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size }, + + removeInner: function(at, n) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function(lines) { + for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); } + }, + + insertInner: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function(at, n, op) { + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } + }; + + // Line widgets are block elements displayed above or below a line. + + var LineWidget = function(doc, node, options) { + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; + }; + + LineWidget.prototype.clear = function () { + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + + LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } + } + + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } + return widget + } + + // TEXTMARKERS + + // Created with markText and setBookmark methods. A TextMarker is a + // handle that can be used to clear or find a marked position in the + // document. Line objects hold arrays (markedSpans) containing + // {from, to, marker} object pointing to such marker objects, and + // indicating that such a marker is present on that line. Multiple + // lines may point to the same marker when it spans across lines. + // The spans will have null for their from/to properties when the + // marker continues beyond the start/end of the line. Markers have + // links back to the lines they currently touch. + + // Collapsed markers have unique ids, in order to be able to order + // them, which is needed for uniquely determining an outer marker + // when they overlap (they may nest, but not partially overlap). + var nextMarkerId = 0; + + var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + + // Clear the marker. + TextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } + }; + + // Find the position of the marker in the document. Returns a {from, + // to} object by default. Side can be passed to get a specific side + // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the + // Pos objects returned contain a line object, rather than a line + // number (used to prevent looking up the same line twice). + TextMarker.prototype.find = function (side, lineObj) { + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} + }; + + // Signals that the marker's widget changed, and surrounding layout + // should be recomputed. + TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); + }; + + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); + }; + + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp + ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + + // Create a marker, wire it up to the right lines, and + function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.startStyle || marker.endStyle || marker.css || + marker.attributes || marker.title) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker + } + + // SHARED TEXTMARKERS + + // A shared marker spans multiple linked documents. It is + // implemented as a meta-marker-object controlling multiple normal + // markers. + var SharedTextMarker = function(markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this; } + }; + + SharedTextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this.markers[i].clear(); } + signalLater(this, "clear"); + }; + + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) + }; + eventMixin(SharedTextMarker); + + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) + } + + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) + } + + function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + + function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); + } + + var nextDocId = 0; + var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + if (lineSep === '') { return lines.join('') } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range.head; } + else if (start == "anchor") { pos = range.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range.to(); } + else { pos = range.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this, ranges[i].anchor), + clipPos(this, ranges[i].head || ranges[i].anchor)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() { + var this$1 = this; + + this.history = new History(this.history); + linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true); + }, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo == from.line && from.ch >= span.to || + span.from == null && lineNo != from.line || + span.from != null && lineNo == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo; + }); + return clipPos(this, Pos(lineNo, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + if (other instanceof CodeMirror) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this.linked[i]; + if (link.doc != other) { continue } + this.linked.splice(i, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) + }); + + // Public alias. + Doc.prototype.eachLine = Doc.prototype.iter; + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function () { + if (++read == n) { + operation(cm, function () { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines( + text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + var reader = new FileReader; + reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); }; + reader.onload = function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + text[i] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e$1){} + } + } + + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } + } + + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + + // These must be handled carefully, because naively registering a + // handler for each editor will cause the editors to never be + // garbage collected. + + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"), editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { editors.push(cm); } + } + if (editors.length) { editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { f(editors[i]); } + }); } + } + + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); + } + // Called when the window resizes + function onResize(cm) { + var d = cm.display; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + + var keyNames = { + 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" + }; + + // Number keys + for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } + // Alphabetic keys + for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } + // Function keys + for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + + var keyMap = {}; + + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + // Note that the save and find-related commands aren't defined by + // default. User code or addons can define them. Unknown commands + // are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + // Very basic readline/emacs-style bindings, which are standard on Mac. + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", + "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", + "Ctrl-T": "transposeChars", "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + + // KEYMAP DISPATCH + + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name + } + + // This is a kludge to keep keymaps mostly working as raw objects + // (backwards compatibility) while at the same time support features + // like normalization and multi-stroke key bindings. It compiles a + // new normalized keymap, and then updates the old object to reflect + // this. + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap + } + + function lookupKey(key, map, handle, context) { + map = getKeyMap(map); + var found = map.call ? map.call(key, context) : map[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map.fallthrough) { + if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") + { return lookupKey(key, map.fallthrough, handle, context) } + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle, context); + if (result) { return result } + } + } + } + + // Modifier key presses don't count as 'real' key presses for the + // purpose of keymap fallthrough. + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" + } + + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name + } + + // Look up the name of a key as indicated by an event object. + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { name = event.code; } + return addModifierNames(name, event, noShift) + } + + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val + } + + // Helper for deleting text near the selection(s), used to implement + // backspace, delete, and similar functionality. + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); + } + + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target + } + + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") + } + + function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { dir = -dir; } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") + } + + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null + } + + // Commands are parameter-less actions that can be performed on an + // editor, mostly used for keybindings. + var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } + }; + + + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start + } + + // Run a handler that was bound to a key. + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done + } + + function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) + } + + // Note that, despite the name, this function is also used to check + // for bound mouse clicks. + + var stopSeq = new Delayed; + + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + if (/\'$/.test(name)) + { cm.state.keySeq = null; } + else + { stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } + } + return dispatchKeyInner(cm, name, e, handle) + } + + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + return !!result + } + + // Handle a key from the keydown event. + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } + } + + // Handle a key from the keypress event + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + cm.curOp.focus = activeElt(doc(cm)); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) + { document.execCommand("cut"); } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } + } + + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + + function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); + } + + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); + } + + var DOUBLECLICK_DELAY = 400; + + var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button + }; + + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } + } + + // A mouse down can be a single click, double click, triple click, + // start of selection drag, start of text drag, new cursor + // (ctrl-click), rectangle drag (alt-drag), or xwin + // middle-click-paste. Or it might be a click on something we should + // not interfere with, such as a scrollbar or widget. + function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + win(cm).focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { cm.display.input.onContextMenu(e); } + else { delayBlurEvent(cm); } + } + } + + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) + } + + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value + } + + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(doc(cm)); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } + } + + // Start a text drag. When it ends, see if any dragging actually + // happen, and treat as a click if it didn't. + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; } + else { delayBlurEvent(cm); } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if ((webkit && !safari) || ie && ie_version == 9) + { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + cm.state.delayingBlurEvent = true; + setTimeout(function () { return display.input.focus(); }, 20); + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + } + + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) + } + + // Normal selection, as opposed to text dragging. + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { delayBlurEvent(cm); } + var display = cm.display, doc$1 = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc$1.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc$1.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc$1.sel.primary(); + ourIndex = doc$1.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); } + else + { ourRange = range; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc$1, new Selection([ourRange], 0), sel_mouse); + startSel = doc$1.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc$1, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc$1, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc$1.sel; + } else { + replaceOneSelection(doc$1, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc$1, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc$1, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc$1, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } + } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc$1, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range.anchor, anchor) > 0) { + head = range.head; + anchor = minPos(oldRange.from(), range.anchor); + } else { + head = range.anchor; + anchor = maxPos(oldRange.to(), range.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc$1, anchor), head)); + setSelection(doc$1, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(doc(cm)); + extendTo(cur); + var visible = visibleLines(display, doc$1); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } + } + } + + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + // If e is null or undefined we interpret this as someone trying + // to explicitly cancel the selection rather than the user + // letting go of the mouse button. + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc$1.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range) { + var anchor = range.anchor; + var head = range.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range } + var order = getOrder(anchorLine); + if (!order) { return range } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { return range } + var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { return range } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) + { leftSide = dir < 0; } + else + { leftSide = dir > 0; } + } + + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head) + } + + + // Determines whether an event happened in the gutter, and fires the + // handlers for the corresponding event. + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { mX = e.clientX; mY = e.clientY; } + catch(e$1) { return false } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } + + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e) + } + } + } + + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) + } + + // CONTEXT MENU HANDLING + + // To make the context menu work, we need to briefly unhide the + // textarea (making it as unobtrusive as possible) to let the + // right-click take effect on it. + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + if (!captureRightClick) { cm.display.input.onContextMenu(e); } + } + + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + var Init = {toString: function(){return "CodeMirror.Init"}}; + + var defaults = {}; + var optionHandlers = {}; + + function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); + option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + + option("screenReaderLabel", null, function (cm, val) { + val = (val === '') ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); + option("phrases", null); + } + + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); + } + + // A CodeMirror instance represents an editor. This is the object + // that user code is usually dealing with. + + function CodeMirror(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + else if (options.mode) { doc.modeOption = options.mode; } + this.doc = doc; + + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(function () { + if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); } + }, 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } + } + + // The default configuration options. + CodeMirror.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.optionHandlers = optionHandlers; + + // Attach the necessary event handlers when initializing the editor + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); + on(d.input.getField(), "contextmenu", function (e) { + if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); } + }); + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); + } + + var initHooks = []; + CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; + + // Indent the given line. The how parameter can be "smart", + // "add"/null, "subtract", or "prev". When aggressive is false + // (typically set to true for forced single-line indents), empty + // lines are not indented, and places where the mode returns Pass + // are left alone. + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } + } + } + + // This will be set to a {lineWise: bool, text: [string]} object, so + // that, when pasting, we know what kind of selections the copied + // text was made out of. + var lastCopied = null; + + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var recent = +new Date - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasting N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); + } + } + + var updateInput = cm.curOp.updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range = sel.ranges[i$1]; + var from = range.from(), to = range.to(); + if (range.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) + { from = to = Pos(from.line, 0); } + } + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput && cm.hasFocus()) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } + } + + function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range = sel.ranges[i]; + if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue } + var mode = cm.getModeAt(range.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) + { indented = indentLine(cm, range.head.line, "smart"); } + } + if (indented) { signalLater(cm, "electricInput", cm, range.head.line); } + } + } + + function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} + } + + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "on" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "on" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + return div + } + + // The publicly visible API. Note that methodOp(f) means + // 'wrap f in an operation, performed on its `this` parameter'. + + // This is not the complete set of editor methods. Most of the + // methods defined on the Doc type are also injected into + // CodeMirror.prototype, for backwards compatibility and + // convenience. + + function addEditorMethods(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){win(this).focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); + }, + removeKeyMap: function(map) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map || maps[i].name == map) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this.state.modeGen++; + regChange(this); + return + } + } + }), + + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (!range.empty()) { + var from = range.from(), to = range.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this, j, how); } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range.head.line > end) { + indentLine(this, range.head.line, how, true); + end = range.head.line; + if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range = this.doc.sel.primary(); + if (start == null) { pos = range.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range.from() : range.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range) { + if (this$1.display.shift || this$1.doc.extend || range.empty()) + { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range.from() : range.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range) { + var other = findPosH(doc, range.head, dir, unit, false); + return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range) { + if (collapse) + { return dir < 0 ? range.from() : range.to() } + var headPos = cursorCoords(this$1, range.head, "div"); + if (range.goalColumn != null) { headPos.left = range.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, + + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt(doc(this)) }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range, margin) { + if (range == null) { + range = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range == "number") { + range = {from: Pos(range, 0), to: null}; + } else if (range.from == null) { + range = {from: range, to: null}; + } + if (!range.to) { range.to = range.from; } + range.margin = margin || 0; + + if (range.from.line != null) { + scrollToRange(this, range); + } else { + scrollToCoordsRange(this, range.from, range.to, range.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo = this.display.viewFrom; + this.doc.iter(lineNo, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } } + ++lineNo; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + startOperation: function(){return startOperation(this)}, + endOperation: function(){return endOperation(this)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + // Cancel the current text selection if any (#5821) + if (this.state.selectingText) { this.state.selectingText(); } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText + }, + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; + } + + // Used for horizontal relative motion. Dir is -1 or 1 (left or + // right), unit can be "codepoint", "char", "column" (like char, but + // doesn't cross line boundaries), "word" (across next word), or + // "group" (to the start of next group of word or + // non-word-non-whitespace chars). The visually param controls + // whether, in right-to-left text, direction 1 means to move towards + // the next index in the string, or towards the character to the right + // of the current position. The resulting position will have a + // hitSide=true property if it reached the end of the document. + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + var lineDir = visually && doc.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); + if (isNaN(ch)) { + next = null; + } else { + var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF; + next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); + } + } else if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); } + else + { return false } + } else { + pos = next; + } + return true + } + + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } + + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result + } + + // For relative vertical movement. Dir may be -1 or 1. Unit can be + // "page" or "line". The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, win(cm).innerHeight || doc(cm).documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target + } + + // CONTENTEDITABLE INPUT STYLE + + var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + + ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + div.contentEditable = true; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { return true } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break } + } + return false + } + + on(div, "paste", function (e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); + + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); + + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); + + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + disableBrowserMagic(te); + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = activeElt(div.ownerDocument); + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + + ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.div.setAttribute('aria-label', label); + } else { + this.div.removeAttribute('aria-label'); + } + }; + + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = activeElt(this.div.ownerDocument) == this.div; + return result + }; + + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); + }; + + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection() + }; + + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } + + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } + + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; + } + + if (!start || !end) { + sel.removeAllRanges(); + return + } + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); + }; + + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); + }; + + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; + }; + + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) + }; + + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || activeElt(this.div.ownerDocument) != this.div) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function () { this.div.blur(); }; + ContentEditableInput.prototype.getField = function () { return this.div }; + + ContentEditableInput.prototype.supportsTouch = function () { return true }; + + ContentEditableInput.prototype.receivedFocus = function () { + var this$1 = this; + + var input = this; + if (this.selectionInEditor()) + { setTimeout(function () { return this$1.pollSelection(); }, 20); } + else + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset + }; + + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = this.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } + }; + + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } + }; + + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } + } + this$1.updateFromDOM(); + }, 80); + }; + + ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } + }; + + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; + + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } + }; + + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; + + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; + + ContentEditableInput.prototype.needsContentAttribute = true; + + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result + } + + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false + } + + function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } + + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { text += lineSep; } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return + } + var markerID = node.getAttribute("cm-marker"), range; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range = found[0].find(0))) + { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } + + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + + if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + extraLinebreak = false; + } + return text + } + + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } + } + + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) + } + } + + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map.length; j += 3) { + var curNode = map[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } + } + + // TEXTAREA INPUT STYLE + + var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; + this.resetting = false; + }; + + TextareaInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = this.cm; + this.createField(display); + var te = this.textarea; + + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } + + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); + + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + + cm.state.pasteIncoming = +new Date; + input.fastPoll(); + }); + + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = +new Date; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +new Date; + input.focus(); + return + } + + // Pass the `paste` event to the textarea so it's handled by its event listener. + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + + TextareaInput.prototype.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + var opts = this.cm.options; + disableBrowserMagic(this.textarea, opts.spellcheck, opts.autocorrect, opts.autocapitalize); + }; + + TextareaInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.textarea.setAttribute('aria-label', label); + } else { + this.textarea.removeAttribute('aria-label'); + } + }; + + TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } + + return result + }; + + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + + // Reset the input to correspond to the selection (or to be empty, + // when not typing and nothing is selected) + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing && typing) { return } + var cm = this.cm; + this.resetting = true; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + this.resetting = false; + }; + + TextareaInput.prototype.getField = function () { return this.textarea }; + + TextareaInput.prototype.supportsTouch = function () { return false }; + + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt(this.textarea.ownerDocument) != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } + }; + + TextareaInput.prototype.blur = function () { this.textarea.blur(); }; + + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + + TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; + + // Poll for input changes, using the normal rate of polling. This + // runs as long as the editor is focused. + TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); + }; + + // When an event has just come in that is likely to add or change + // something in the input textarea, we poll faster, to ensure that + // the change appears on the screen quickly. + TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); + }; + + // Read input from the textarea, and update the document to match. + // When something is selected, it is present in the textarea, and + // selected (unless it is huge, in which case a placeholder is + // used). When nothing is selected, the cursor sits after previously + // seen text (can be empty), which is stored in prevInput (we must + // not reset the textarea when typing, because that breaks IME). + TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || this.resetting || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true + }; + + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } + }; + + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); + }; + + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + if (input.contextMenuPending) { input.contextMenuPending(); } + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = te.ownerDocument.defaultView.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { te.ownerDocument.defaultView.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { return } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; + + TextareaInput.prototype.setUneditable = function () {}; + + TextareaInput.prototype.needsContentAttribute = false; + + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(textarea.ownerDocument); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm + } + + function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; + } + + // EDITOR CONSTRUCTOR + + defineOptions(CodeMirror); + + addEditorMethods(CodeMirror); + + // Set up methods on CodeMirror's prototype to redirect to the editor's document. + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + + eventMixin(Doc); + CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + CodeMirror.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } + defineMode.apply(this, arguments); + }; + + CodeMirror.defineMIME = defineMIME; + + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); + + // EXTENSIONS + + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + + CodeMirror.fromTextArea = fromTextArea; + + addLegacyProps(CodeMirror); + + CodeMirror.version = "5.65.15"; + + return CodeMirror; + +}))); diff --git a/web/lib/dayjs.min.js b/web/lib/dayjs.min.js new file mode 100644 index 0000000..ac8df8c --- /dev/null +++ b/web/lib/dayjs.min.js @@ -0,0 +1 @@ +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):t.dayjs=n()}(this,function(){"use strict";var t="millisecond",n="second",e="minute",r="hour",i="day",s="week",u="month",o="quarter",a="year",h=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,f=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,c=function(t,n,e){var r=String(t);return!r||r.length>=n?t:""+Array(n+1-r.length).join(e)+t},d={s:c,z:function(t){var n=-t.utcOffset(),e=Math.abs(n),r=Math.floor(e/60),i=e%60;return(n<=0?"+":"-")+c(r,2,"0")+":"+c(i,2,"0")},m:function(t,n){var e=12*(n.year()-t.year())+(n.month()-t.month()),r=t.clone().add(e,u),i=n-r<0,s=t.clone().add(e+(i?-1:1),u);return Number(-(e+(n-r)/(i?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return{M:u,y:a,w:s,d:i,D:"date",h:r,m:e,s:n,ms:t,Q:o}[h]||String(h||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},$={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},l="en",m={};m[l]=$;var y=function(t){return t instanceof v},M=function(t,n,e){var r;if(!t)return l;if("string"==typeof t)m[t]&&(r=t),n&&(m[t]=n,r=t);else{var i=t.name;m[i]=t,r=i}return e||(l=r),r},g=function(t,n,e){if(y(t))return t.clone();var r=n?"string"==typeof n?{format:n,pl:e}:n:{};return r.date=t,new v(r)},D=d;D.l=M,D.i=y,D.w=function(t,n){return g(t,{locale:n.$L,utc:n.$u,$offset:n.$offset})};var v=function(){function c(t){this.$L=this.$L||M(t.locale,null,!0),this.parse(t)}var d=c.prototype;return d.parse=function(t){this.$d=function(t){var n=t.date,e=t.utc;if(null===n)return new Date(NaN);if(D.u(n))return new Date;if(n instanceof Date)return new Date(n);if("string"==typeof n&&!/Z$/i.test(n)){var r=n.match(h);if(r)return e?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(n)}(t),this.init()},d.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},d.$utils=function(){return D},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(t,n){var e=g(t);return this.startOf(n)<=e&&e<=this.endOf(n)},d.isAfter=function(t,n){return g(t)0){var n=r[r.length-1];n!==t&&n.pause()}var a=r.indexOf(t);-1===a||r.splice(a,1),r.push(t)},deactivateTrap:function e(t){var n=r.indexOf(t);-1!==n&&r.splice(n,1),r.length>0&&r[r.length-1].unpause()}}),u=function e(t){return t.tagName&&"input"===t.tagName.toLowerCase()&&"function"==typeof t.select},c=function e(t){return"Escape"===t.key||"Esc"===t.key||27===t.keyCode},s=function e(t){return"Tab"===t.key||9===t.keyCode},l=function e(t){return setTimeout(t,0)},b=function e(t,n){var a=-1;return t.every(function(e,t){return!n(e)||(a=t,!1)}),a},f=function e(t){for(var n=arguments.length,a=Array(n>1?n-1:0),o=1;o1?a-1:0),r=1;r=0)t=d.activeElement;else{var n=$.tabbableGroups[0];t=n&&n.firstTabbableNode||_("fallbackFocus")}}if(!t)throw Error("Your focus-trap needs to have at least one focusable element");return t},g=function e(){if($.containerGroups=$.containers.map(function(e){var n=t.tabbable(e,p.tabbableOptions),a=t.focusable(e,p.tabbableOptions);return{container:e,tabbableNodes:n,focusableNodes:a,firstTabbableNode:n.length>0?n[0]:null,lastTabbableNode:n.length>0?n[n.length-1]:null,nextTabbableNode:function e(n){var o=!(arguments.length>1)||void 0===arguments[1]||arguments[1],r=a.findIndex(function(e){return e===n});return r<0?void 0:o?a.slice(r+1).find(function(e){return t.isTabbable(e,p.tabbableOptions)}):a.slice(0,r).reverse().find(function(e){return t.isTabbable(e,p.tabbableOptions)})}}}),$.tabbableGroups=$.containerGroups.filter(function(e){return e.tabbableNodes.length>0}),$.tabbableGroups.length<=0&&!_("fallbackFocus"))throw Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times")},F=function e(t){if(!1!==t&&t!==d.activeElement){if(!t||!t.focus){e(m());return}t.focus({preventScroll:!!p.preventScroll}),$.mostRecentlyFocusedNode=t,u(t)&&t.select()}},T=function e(t){var n=_("setReturnFocus",t);return n||!1!==n&&t},O=function e(n){var a=v(n);if(!(y(a)>=0)){if(f(p.clickOutsideDeactivates,n)){r.deactivate({returnFocus:p.returnFocusOnDeactivate&&!t.isFocusable(a,p.tabbableOptions)});return}!f(p.allowOutsideClick,n)&&n.preventDefault()}},w=function e(t){var n=v(t),a=y(n)>=0;a||n instanceof Document?a&&($.mostRecentlyFocusedNode=n):(t.stopImmediatePropagation(),F($.mostRecentlyFocusedNode||m()))},k=function e(n){var a=v(n);g();var o=null;if($.tabbableGroups.length>0){var r=y(a),i=r>=0?$.containerGroups[r]:void 0;if(r<0)o=n.shiftKey?$.tabbableGroups[$.tabbableGroups.length-1].lastTabbableNode:$.tabbableGroups[0].firstTabbableNode;else if(n.shiftKey){var u=b($.tabbableGroups,function(e){return a===e.firstTabbableNode});if(u<0&&(i.container===a||t.isFocusable(a,p.tabbableOptions)&&!t.isTabbable(a,p.tabbableOptions)&&!i.nextTabbableNode(a,!1))&&(u=r),u>=0){var c=0===u?$.tabbableGroups.length-1:u-1;o=$.tabbableGroups[c].lastTabbableNode}}else{var s=b($.tabbableGroups,function(e){return a===e.lastTabbableNode});if(s<0&&(i.container===a||t.isFocusable(a,p.tabbableOptions)&&!t.isTabbable(a,p.tabbableOptions)&&!i.nextTabbableNode(a))&&(s=r),s>=0){var l=s===$.tabbableGroups.length-1?0:s+1;o=$.tabbableGroups[l].firstTabbableNode}}}else o=_("fallbackFocus");o&&(n.preventDefault(),F(o))},N=function e(t){if(c(t)&&!1!==f(p.escapeDeactivates,t)){t.preventDefault(),r.deactivate();return}if(s(t)){k(t);return}},D=function e(t){var n=v(t);!(y(n)>=0||f(p.clickOutsideDeactivates,t)||f(p.allowOutsideClick,t))&&(t.preventDefault(),t.stopImmediatePropagation())},E=function e(){if($.active)return i.activateTrap(r),$.delayInitialFocusTimer=p.delayInitialFocus?l(function(){F(m())}):F(m()),d.addEventListener("focusin",w,!0),d.addEventListener("mousedown",O,{capture:!0,passive:!1}),d.addEventListener("touchstart",O,{capture:!0,passive:!1}),d.addEventListener("click",D,{capture:!0,passive:!1}),d.addEventListener("keydown",N,{capture:!0,passive:!1}),r},G=function e(){if($.active)return d.removeEventListener("focusin",w,!0),d.removeEventListener("mousedown",O,!0),d.removeEventListener("touchstart",O,!0),d.removeEventListener("click",D,!0),d.removeEventListener("keydown",N,!0),r};return(r={get active(){return $.active},get paused(){return $.paused},activate:function e(t){if($.active)return this;var n=h(t,"onActivate"),a=h(t,"onPostActivate"),o=h(t,"checkCanFocusTrap");o||g(),$.active=!0,$.paused=!1,$.nodeFocusedBeforeActivation=d.activeElement,n&&n();var r=function e(){o&&g(),E(),a&&a()};return o?(o($.containers.concat()).then(r,r),this):(r(),this)},deactivate:function e(t){if(!$.active)return this;var n=a({onDeactivate:p.onDeactivate,onPostDeactivate:p.onPostDeactivate,checkCanReturnFocus:p.checkCanReturnFocus},t);clearTimeout($.delayInitialFocusTimer),$.delayInitialFocusTimer=void 0,G(),$.active=!1,$.paused=!1,i.deactivateTrap(r);var o=h(n,"onDeactivate"),u=h(n,"onPostDeactivate"),c=h(n,"checkCanReturnFocus"),s=h(n,"returnFocus","returnFocusOnDeactivate");o&&o();var b=function e(){l(function(){s&&F(T($.nodeFocusedBeforeActivation)),u&&u()})};return s&&c?(c(T($.nodeFocusedBeforeActivation)).then(b,b),this):(b(),this)},pause:function e(){return $.paused||!$.active||($.paused=!0,G()),this},unpause:function e(){return $.paused&&$.active&&($.paused=!1,g(),E()),this},updateContainerElements:function e(t){var n=[].concat(t).filter(Boolean);return $.containers=n.map(function(e){return"string"==typeof e?d.querySelector(e):e}),$.active&&g(),this}}).updateContainerElements(n),r};e.createFocusTrap=d,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/web/lib/marked.min.js b/web/lib/marked.min.js new file mode 100644 index 0000000..f2aebbc --- /dev/null +++ b/web/lib/marked.min.js @@ -0,0 +1,6 @@ +/** + * marked - a markdown parser + * Copyright (c) 2011-2022, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).marked={})}(this,function(r){"use strict";function i(e,t){for(var u=0;ue.length)&&(t=e.length);for(var u=0,n=new Array(t);u=e.length?{done:!0}:{done:!1,value:e[u++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function e(){return{baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}r.defaults=e();function u(e){return t[e]}var n=/[&<>"']/,l=/[&<>"']/g,a=/[<>"']|&(?!#?\w+;)/,o=/[<>"']|&(?!#?\w+;)/g,t={"&":"&","<":"<",">":">",'"':""","'":"'"};function D(e,t){if(t){if(n.test(e))return e.replace(l,u)}else if(a.test(e))return e.replace(o,u);return e}var c=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function x(e){return e.replace(c,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var h=/(^|[^\[])\^/g;function p(u,e){u="string"==typeof u?u:u.source,e=e||"";var n={replace:function(e,t){return t=(t=t.source||t).replace(h,"$1"),u=u.replace(e,t),n},getRegex:function(){return new RegExp(u,e)}};return n}var f=/[^\w:]/g,Z=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function g(e,t,u){if(e){try{n=decodeURIComponent(x(u)).replace(f,"").toLowerCase()}catch(e){return null}if(0===n.indexOf("javascript:")||0===n.indexOf("vbscript:")||0===n.indexOf("data:"))return null}var n;t&&!Z.test(u)&&(e=u,F[" "+(n=t)]||(O.test(n)?F[" "+n]=n+"/":F[" "+n]=k(n,"/",!0)),t=-1===(n=F[" "+n]).indexOf(":"),u="//"===e.substring(0,2)?t?e:n.replace(q,"$1")+e:"/"===e.charAt(0)?t?e:n.replace(L,"$1")+e:n+e);try{u=encodeURI(u).replace(/%25/g,"%")}catch(e){return null}return u}var F={},O=/^[^:]+:\/*[^/]*$/,q=/^([^:]+:)[\s\S]*$/,L=/^([^:]+:\/*[^/]*)[\s\S]*$/;var A={exec:function(){}};function d(e){for(var t,u,n=1;nt)u.splice(t);else for(;u.length>=1,e+=e;return u+e}function B(e,t,u,n){var r=t.href,t=t.title?D(t.title):null,i=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?(n.state.inLink=!0,e={type:"link",raw:u,href:r,title:t,text:i,tokens:n.inlineTokens(i,[])},n.state.inLink=!1,e):{type:"image",raw:u,href:r,title:t,text:D(i)}}var w=function(){function e(e){this.options=e||r.defaults}var t=e.prototype;return t.space=function(e){e=this.rules.block.newline.exec(e);if(e&&0=u.length?e.slice(u.length):e}).join("\n")}(t=e[0],e[3]||""),{type:"code",raw:t,lang:e[2]&&e[2].trim(),text:u}},t.heading=function(e){var t,u,e=this.rules.block.heading.exec(e);if(e)return t=e[2].trim(),/#$/.test(t)&&(u=k(t,"#"),!this.options.pedantic&&u&&!/ $/.test(u)||(t=u.trim())),u={type:"heading",raw:e[0],depth:e[1].length,text:t,tokens:[]},this.lexer.inline(u.text,u.tokens),u},t.hr=function(e){e=this.rules.block.hr.exec(e);if(e)return{type:"hr",raw:e[0]}},t.blockquote=function(e){var t,e=this.rules.block.blockquote.exec(e);if(e)return t=e[0].replace(/^ *>[ \t]?/gm,""),{type:"blockquote",raw:e[0],tokens:this.lexer.blockTokens(t,[]),text:t}},t.list=function(e){var t=this.rules.block.list.exec(e);if(t){var u,n,r,i,s,l,a,o,D,c,h,p=1<(g=t[1].trim()).length,f={type:"list",raw:"",ordered:p,start:p?+g.slice(0,-1):"",loose:!1,items:[]},g=p?"\\d{1,9}\\"+g.slice(-1):"\\"+g;this.options.pedantic&&(g=p?g:"[*+-]");for(var F=new RegExp("^( {0,3}"+g+")((?:[\t ][^\\n]*)?(?:\\n|$))");e&&(h=!1,t=F.exec(e))&&!this.rules.block.hr.test(e);){if(u=t[0],e=e.substring(u.length),a=t[2].split("\n",1)[0],o=e.split("\n",1)[0],this.options.pedantic?(i=2,c=a.trimLeft()):(i=t[2].search(/[^ ]/),c=a.slice(i=4=i||!a.trim())c+="\n"+a.slice(i);else{if(s)break;c+="\n"+a}s||a.trim()||(s=!0),u+=D+"\n",e=e.substring(D.length+1)}f.loose||(l?f.loose=!0:/\n *\n *$/.test(u)&&(l=!0)),this.options.gfm&&(n=/^\[[ xX]\] /.exec(c))&&(r="[ ] "!==n[0],c=c.replace(/^\[[ xX]\] +/,"")),f.items.push({type:"list_item",raw:u,task:!!n,checked:r,loose:!1,text:c}),f.raw+=u}f.items[f.items.length-1].raw=u.trimRight(),f.items[f.items.length-1].text=c.trimRight(),f.raw=f.raw.trimRight();for(var C=f.items.length,k=0;k/i.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):D(e[0]):e[0]}},t.link=function(e){e=this.rules.inline.link.exec(e);if(e){var t=e[2].trim();if(!this.options.pedantic&&/^$/.test(t))return;var u=k(t.slice(0,-1),"\\");if((t.length-u.length)%2==0)return}else{u=function(e,t){if(-1===e.indexOf(t[1]))return-1;for(var u=e.length,n=0,r=0;r$/.test(t)?u.slice(1):u.slice(1,-1):u)&&u.replace(this.rules.inline._escapes,"$1"),title:r&&r.replace(this.rules.inline._escapes,"$1")},e[0],this.lexer)}},t.reflink=function(e,t){var u;if((u=this.rules.inline.reflink.exec(e))||(u=this.rules.inline.nolink.exec(e)))return(e=t[(e=(u[2]||u[1]).replace(/\s+/g," ")).toLowerCase()])&&e.href?B(u,e,u[0],this.lexer):{type:"text",raw:t=u[0].charAt(0),text:t}},t.emStrong=function(e,t,u){void 0===u&&(u="");var n=this.rules.inline.emStrong.lDelim.exec(e);if(n&&(!n[3]||!u.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var r=n[1]||n[2]||"";if(!r||""===u||this.rules.inline.punctuation.exec(u)){var i=n[0].length-1,s=i,l=0,a="*"===n[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(a.lastIndex=0,t=t.slice(-1*e.length+i);null!=(n=a.exec(t));)if(o=n[1]||n[2]||n[3]||n[4]||n[5]||n[6])if(o=o.length,n[3]||n[4])s+=o;else if((n[5]||n[6])&&i%3&&!((i+o)%3))l+=o;else if(!(0<(s-=o))){var o=Math.min(o,o+s+l);if(Math.min(i,o)%2)return D=e.slice(1,i+n.index+o),{type:"em",raw:e.slice(0,i+n.index+o+1),text:D,tokens:this.lexer.inlineTokens(D,[])};var D=e.slice(2,i+n.index+o-1);return{type:"strong",raw:e.slice(0,i+n.index+o+1),text:D,tokens:this.lexer.inlineTokens(D,[])}}}}},t.codespan=function(e){var t,u,n,e=this.rules.inline.code.exec(e);if(e)return n=e[2].replace(/\n/g," "),t=/[^ ]/.test(n),u=/^ /.test(n)&&/ $/.test(n),n=D(n=t&&u?n.substring(1,n.length-1):n,!0),{type:"codespan",raw:e[0],text:n}},t.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},t.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2],[])}},t.autolink=function(e,t){var u,e=this.rules.inline.autolink.exec(e);if(e)return t="@"===e[2]?"mailto:"+(u=D(this.options.mangle?t(e[1]):e[1])):u=D(e[1]),{type:"link",raw:e[0],text:u,href:t,tokens:[{type:"text",raw:u,text:u}]}},t.url=function(e,t){var u,n,r,i;if(u=this.rules.inline.url.exec(e)){if("@"===u[2])r="mailto:"+(n=D(this.options.mangle?t(u[0]):u[0]));else{for(;i=u[0],u[0]=this.rules.inline._backpedal.exec(u[0])[0],i!==u[0];);n=D(u[0]),r="www."===u[1]?"http://"+n:n}return{type:"link",raw:u[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}},t.inlineText=function(e,t){e=this.rules.inline.text.exec(e);if(e)return t=this.lexer.state.inRawBlock?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):D(e[0]):e[0]:D(this.options.smartypants?t(e[0]):e[0]),{type:"text",raw:e[0],text:t}},e}(),y={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:A,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\.|[^\[\]\\])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/},v=(y.def=p(y.def).replace("label",y._label).replace("title",y._title).getRegex(),y.bullet=/(?:[*+-]|\d{1,9}[.)])/,y.listItemStart=p(/^( *)(bull) */).replace("bull",y.bullet).getRegex(),y.list=p(y.list).replace(/bull/g,y.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+y.def.source+")").getRegex(),y._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",y._comment=/|$)/,y.html=p(y.html,"i").replace("comment",y._comment).replace("tag",y._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),y.paragraph=p(y._paragraph).replace("hr",y.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",y._tag).getRegex(),y.blockquote=p(y.blockquote).replace("paragraph",y.paragraph).getRegex(),y.normal=d({},y),y.gfm=d({},y.normal,{table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),y.gfm.table=p(y.gfm.table).replace("hr",y.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",y._tag).getRegex(),y.gfm.paragraph=p(y._paragraph).replace("hr",y.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",y.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",y._tag).getRegex(),y.pedantic=d({},y.normal,{html:p("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",y._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:A,paragraph:p(y.normal._paragraph).replace("hr",y.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",y.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()}),{escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:A,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[^*]+(?=[^*])|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:A,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~",v.punctuation=p(v.punctuation).replace(/punctuation/g,v._punctuation).getRegex(),v.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,v.escapedEmSt=/\\\*|\\_/g,v._comment=p(y._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),v.emStrong.lDelim=p(v.emStrong.lDelim).replace(/punct/g,v._punctuation).getRegex(),v.emStrong.rDelimAst=p(v.emStrong.rDelimAst,"g").replace(/punct/g,v._punctuation).getRegex(),v.emStrong.rDelimUnd=p(v.emStrong.rDelimUnd,"g").replace(/punct/g,v._punctuation).getRegex(),v._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,v._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,v._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,v.autolink=p(v.autolink).replace("scheme",v._scheme).replace("email",v._email).getRegex(),v._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,v.tag=p(v.tag).replace("comment",v._comment).replace("attribute",v._attribute).getRegex(),v._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,v._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,v._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,v.link=p(v.link).replace("label",v._label).replace("href",v._href).replace("title",v._title).getRegex(),v.reflink=p(v.reflink).replace("label",v._label).replace("ref",y._label).getRegex(),v.nolink=p(v.nolink).replace("ref",y._label).getRegex(),v.reflinkSearch=p(v.reflinkSearch,"g").replace("reflink",v.reflink).replace("nolink",v.nolink).getRegex(),v.normal=d({},v),v.pedantic=d({},v.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:p(/^!?\[(label)\]\((.*?)\)/).replace("label",v._label).getRegex(),reflink:p(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",v._label).getRegex()}),v.gfm=d({},v.normal,{escape:p(v.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\'+(u?e:D(e,!0))+"\n":"