Browse Source

use shared editor

Gregg Tavares 6 years ago
parent
commit
a8eb6bf4a2
66 changed files with 4 additions and 1466 deletions
  1. 4 1
      Gruntfile.js
  2. 0 6
      monaco-editor/min/vs/base/worker/workerMain.js
  3. 0 7
      monaco-editor/min/vs/basic-languages/src/bat.js
  4. 0 6
      monaco-editor/min/vs/basic-languages/src/coffee.js
  5. 0 6
      monaco-editor/min/vs/basic-languages/src/cpp.js
  6. 0 6
      monaco-editor/min/vs/basic-languages/src/csharp.js
  7. 0 6
      monaco-editor/min/vs/basic-languages/src/css.js
  8. 0 7
      monaco-editor/min/vs/basic-languages/src/dockerfile.js
  9. 0 6
      monaco-editor/min/vs/basic-languages/src/fsharp.js
  10. 0 6
      monaco-editor/min/vs/basic-languages/src/go.js
  11. 0 6
      monaco-editor/min/vs/basic-languages/src/handlebars.js
  12. 0 6
      monaco-editor/min/vs/basic-languages/src/html.js
  13. 0 7
      monaco-editor/min/vs/basic-languages/src/ini.js
  14. 0 6
      monaco-editor/min/vs/basic-languages/src/java.js
  15. 0 6
      monaco-editor/min/vs/basic-languages/src/less.js
  16. 0 6
      monaco-editor/min/vs/basic-languages/src/lua.js
  17. 0 6
      monaco-editor/min/vs/basic-languages/src/markdown.js
  18. 0 6
      monaco-editor/min/vs/basic-languages/src/msdax.js
  19. 0 6
      monaco-editor/min/vs/basic-languages/src/objective-c.js
  20. 0 6
      monaco-editor/min/vs/basic-languages/src/php.js
  21. 0 6
      monaco-editor/min/vs/basic-languages/src/postiats.js
  22. 0 6
      monaco-editor/min/vs/basic-languages/src/powershell.js
  23. 0 6
      monaco-editor/min/vs/basic-languages/src/pug.js
  24. 0 6
      monaco-editor/min/vs/basic-languages/src/python.js
  25. 0 6
      monaco-editor/min/vs/basic-languages/src/r.js
  26. 0 6
      monaco-editor/min/vs/basic-languages/src/razor.js
  27. 0 6
      monaco-editor/min/vs/basic-languages/src/ruby.js
  28. 0 6
      monaco-editor/min/vs/basic-languages/src/scss.js
  29. 0 6
      monaco-editor/min/vs/basic-languages/src/solidity.js
  30. 0 6
      monaco-editor/min/vs/basic-languages/src/sql.js
  31. 0 9
      monaco-editor/min/vs/basic-languages/src/swift.js
  32. 0 6
      monaco-editor/min/vs/basic-languages/src/vb.js
  33. 0 7
      monaco-editor/min/vs/basic-languages/src/xml.js
  34. 0 6
      monaco-editor/min/vs/basic-languages/src/yaml.js
  35. 0 0
      monaco-editor/min/vs/editor/contrib/suggest/browser/media/String_16x.svg
  36. 0 0
      monaco-editor/min/vs/editor/contrib/suggest/browser/media/String_inverse_16x.svg
  37. 0 5
      monaco-editor/min/vs/editor/editor.main.css
  38. 0 6
      monaco-editor/min/vs/editor/editor.main.js
  39. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.de.js
  40. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.es.js
  41. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.fr.js
  42. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.hu.js
  43. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.it.js
  44. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.ja.js
  45. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.js
  46. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.ko.js
  47. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.pt-br.js
  48. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.ru.js
  49. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.tr.js
  50. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.zh-cn.js
  51. 0 6
      monaco-editor/min/vs/editor/editor.main.nls.zh-tw.js
  52. 0 0
      monaco-editor/min/vs/editor/standalone/browser/quickOpen/symbol-sprite.svg
  53. 0 6
      monaco-editor/min/vs/language/css/cssMode.js
  54. 0 6
      monaco-editor/min/vs/language/css/cssWorker.js
  55. 0 6
      monaco-editor/min/vs/language/html/htmlMode.js
  56. 0 6
      monaco-editor/min/vs/language/html/htmlWorker.js
  57. 0 6
      monaco-editor/min/vs/language/json/jsonMode.js
  58. 0 6
      monaco-editor/min/vs/language/json/jsonWorker.js
  59. 0 20
      monaco-editor/min/vs/language/typescript/lib/typescriptServices.js
  60. 0 6
      monaco-editor/min/vs/language/typescript/src/mode.js
  61. 0 6
      monaco-editor/min/vs/language/typescript/src/worker.js
  62. 0 6
      monaco-editor/min/vs/loader.js
  63. 0 11
      threejs/resources/editor-fullscreen-icon.svg
  64. 0 11
      threejs/resources/editor-unfullscreen-icon.svg
  65. 0 214
      threejs/resources/editor.html
  66. 0 861
      threejs/resources/editor.js

+ 4 - 1
Gruntfile.js

@@ -5,6 +5,8 @@
 const fs = require('fs');
 const path = require('path');
 const semver = require('semver');
+const liveEditor = require('@gfxfundamentals/live-editor');
+const liveEditorPath = path.dirname(require.resolve('@gfxfundamentals/live-editor'));
 
 module.exports = function(grunt) {
 
@@ -54,8 +56,9 @@ module.exports = function(grunt) {
       main: {
         files: [
           { expand: false, src: '*', dest: 'out/', filter: noMdsNoFolders, },
+          { expand: true, cwd: `${liveEditor.monacoEditor}/`, src: 'min/**', dest: 'out/monaco-editor/', nonull: true, },
+          { expand: true, cwd: `${liveEditorPath}/src/`, src: '**', dest: 'out/threejs/resources/', nonull: true, },
           { expand: true, src: 'threejs/**', dest: 'out/', filter: noMds, },
-          { expand: true, src: 'monaco-editor/**', dest: 'out/', },
           { expand: true, src: '3rdparty/**', dest: 'out/', },
         ],
       },

File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/base/worker/workerMain.js


+ 0 - 7
monaco-editor/min/vs/basic-languages/src/bat.js

@@ -1,7 +0,0 @@
-/*!-----------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * monaco-languages version: 0.8.0(fbdcb70601ea4f81278d62ad15d456807ccaa7fa)
- * Released under the MIT license
- * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
- *-----------------------------------------------------------------------------*/
-define("vs/basic-languages/src/bat",["require","exports"],function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.conf={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},s.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=><!~?&|+\-*\/\^;\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)(rem(?:\s.*|))$/,["","comment"]],[/(\@?)(@keywords)(?!\w)/,[{token:"keyword"},{token:"keyword.$2"}]],[/[ \t\r\n]+/,""],[/setlocal(?!\w)/,"keyword.tag-setlocal"],[/endlocal(?!\w)/,"keyword.tag-setlocal"],[/[a-zA-Z_]\w*/,""],[/:\w*/,"metatag"],[/%[^%]+%/,"variable"],[/%%[\w]+(?!\w)/,"variable"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],string:[[/[^\\"'%]+/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/%[\w ]+%/,"variable"],[/%%[\w]+(?!\w)/,"variable"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/$/,"string","@popall"]]}}});

File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/coffee.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/cpp.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/csharp.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/css.js


+ 0 - 7
monaco-editor/min/vs/basic-languages/src/dockerfile.js

@@ -1,7 +0,0 @@
-/*!-----------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * monaco-languages version: 0.8.0(fbdcb70601ea4f81278d62ad15d456807ccaa7fa)
- * Released under the MIT license
- * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
- *-----------------------------------------------------------------------------*/
-define("vs/basic-languages/src/dockerfile",["require","exports"],function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},s.language={defaultToken:"",tokenPostfix:".dockerfile",instructions:/FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|ENTRYPOINT/,instructionAfter:/ONBUILD/,variableAfter:/ENV/,variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(@instructionAfter)(\s+)/,["keyword",{token:"",next:"@instructions"}]],["","keyword","@instructions"]],instructions:[[/(@variableAfter)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(@instructions)/,"keyword","@arguments"]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}}});

File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/fsharp.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/go.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/handlebars.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/html.js


+ 0 - 7
monaco-editor/min/vs/basic-languages/src/ini.js

@@ -1,7 +0,0 @@
-/*!-----------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * monaco-languages version: 0.8.0(fbdcb70601ea4f81278d62ad15d456807ccaa7fa)
- * Released under the MIT license
- * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
- *-----------------------------------------------------------------------------*/
-define("vs/basic-languages/src/ini",["require","exports"],function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}});

File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/java.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/less.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/lua.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/markdown.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/msdax.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/objective-c.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/php.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/postiats.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/powershell.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/pug.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/python.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/r.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/razor.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/ruby.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/scss.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/solidity.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/sql.js


File diff suppressed because it is too large
+ 0 - 9
monaco-editor/min/vs/basic-languages/src/swift.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/vb.js


+ 0 - 7
monaco-editor/min/vs/basic-languages/src/xml.js

@@ -1,7 +0,0 @@
-/*!-----------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * monaco-languages version: 0.8.0(fbdcb70601ea4f81278d62ad15d456807ccaa7fa)
- * Released under the MIT license
- * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
- *-----------------------------------------------------------------------------*/
-define("vs/basic-languages/src/xml",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={comments:{blockComment:["\x3c!--","--\x3e"]},brackets:[["<",">"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}]},t.language={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/<!--/,{token:"comment",next:"@comment"}]],comment:[[/[^<\-]+/,"comment.content"],[/-->/,{token:"comment",next:"@pop"}],[/<!--/,"comment.content.invalid"],[/[<\-]/,"comment.content"]]}}});

File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/basic-languages/src/yaml.js


File diff suppressed because it is too large
+ 0 - 0
monaco-editor/min/vs/editor/contrib/suggest/browser/media/String_16x.svg


File diff suppressed because it is too large
+ 0 - 0
monaco-editor/min/vs/editor/contrib/suggest/browser/media/String_inverse_16x.svg


File diff suppressed because it is too large
+ 0 - 5
monaco-editor/min/vs/editor/editor.main.css


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.de.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.es.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.fr.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.hu.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.it.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.ja.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.ko.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.pt-br.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.ru.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.tr.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.zh-cn.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/editor/editor.main.nls.zh-tw.js


File diff suppressed because it is too large
+ 0 - 0
monaco-editor/min/vs/editor/standalone/browser/quickOpen/symbol-sprite.svg


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/css/cssMode.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/css/cssWorker.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/html/htmlMode.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/html/htmlWorker.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/json/jsonMode.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/json/jsonWorker.js


File diff suppressed because it is too large
+ 0 - 20
monaco-editor/min/vs/language/typescript/lib/typescriptServices.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/typescript/src/mode.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/language/typescript/src/worker.js


File diff suppressed because it is too large
+ 0 - 6
monaco-editor/min/vs/loader.js


+ 0 - 11
threejs/resources/editor-fullscreen-icon.svg

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg preserveAspectRatio="none" width="100%" height="100%" viewBox="0 0 640 480" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
-    <path d="M640,0L640,480L0,480L0,0L640,0ZM576,64L64,64L64,416L576,416L576,64Z" style="fill:rgb(0,0,0);"/>
-    <g transform="matrix(1,0,0,1,11,10)">
-        <path d="M85,86L214,86L171.127,128.873L259.882,217.627L214.627,262.882L125.873,174.127L85,215L85,86Z" style="fill:rgb(0,0,0);"/>
-    </g>
-    <g transform="matrix(-1,5.66554e-16,-5.66554e-16,-1,629,470)">
-        <path d="M85,86L214,86L171.127,128.873L259.882,217.627L214.627,262.882L125.873,174.127L85,215L85,86Z" style="fill:rgb(0,0,0);"/>
-    </g>
-</svg>

+ 0 - 11
threejs/resources/editor-unfullscreen-icon.svg

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg preserveAspectRatio="none" width="100%" height="100%" viewBox="0 0 640 480" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
-    <path d="M640,0L640,480L0,480L0,0L640,0ZM576,64L64,64L64,416L576,416L576,64Z" style="fill:rgb(0,0,0);"/>
-    <g transform="matrix(1,0,0,1,284.118,121.118)">
-        <path d="M85,86L214,86L171.127,128.873L259.882,217.627L214.627,262.882L125.873,174.127L85,215L85,86Z" style="fill:rgb(0,0,0);"/>
-    </g>
-    <g transform="matrix(-1,5.66554e-16,-5.66554e-16,-1,355.882,358.882)">
-        <path d="M85,86L214,86L171.127,128.873L259.882,217.627L214.627,262.882L125.873,174.127L85,215L85,86Z" style="fill:rgb(0,0,0);"/>
-    </g>
-</svg>

+ 0 - 214
threejs/resources/editor.html

@@ -1,214 +0,0 @@
-<!DOCTYPE html>
-<style>
-html {
-  box-sizing: border-box;
-}
-*, *:before, *:after {
-  box-sizing: inherit;
-}
-body {
-    margin: 0;
-    font-family: sans-serif;
-    overflow: hidden;
-    height: 100vh;
-}
-a {
-    text-decoration: none;
-    color: inherit;
-}
-iframe {
-    display: block;
-    border: none;
-}
-.frame {
-    min-width: 100vw;
-    min-height: 100vh;
-    max-width: 100vw;
-    max-height: 100vh;
-    display: flex;
-    flex-direction: column;
-    background: #444;
-    color: #AAA;
-}
-.tabs {
-    flex: 0 0 auto;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    background: #666;
-}
-.panes {
-    display: flex;
-    flex: 1 1 auto;
-}
-.panes>div {
-    display: none;
-    flex: 1 1 50%;
-    flex-direction: column;
-    min-width: 0;
-    /*
-    this calc is to get things to work in safari.
-    but firefox and chrome will let children of
-    the panes go 100% size but not safari
-    */
-    height: calc(100vh - 2.5em - 5px - 1px);
-}
-.panes .code {
-    flex: 1 1 auto;
-    position: relative;
-    height: 100%;
-}
-.panes .code > div {
-    height: 100%;
-}
-.panes .files {
-    position: relative;
-}
-.panes .fileSelected {
-    color: white;
-    background: #666;
-}
-.panes .files > div {
-    border: 1px solid black;
-    font-family: monospace;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    width: 100%;
-    white-space: nowrap;
-    cursor: pointer;
-}
-.panes>div.other {
-    display: block
-}
-.editor {
-    g-overflow: auto;
-}
-.result {
-    overflow: auto;
-}
-.result>iframe {
-    width: 100%;
-    height: 100%;
-    background: white;
-}
-.other>div,
-.other>div>div {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    align-content: center;
-    font-size: xx-large;
-}
-.other>div {
-    height: 100%;
-    flex-direction: column;
-}
-
-.other .loading {
-    height: 2em;
-    width: 2em;
-    animation: rotate 0.8s infinite linear;
-    border: 0.4em solid #fff;
-    border-right-color: transparent;
-    border-radius: 50%;
-}
-@keyframes rotate {
-    0%    { transform: rotate(0deg); }
-    100%  { transform: rotate(360deg); }
-}
-
-.tabs>div {
-    padding: 0.125em;
-}
-.panebuttons>button {
-    padding: 0.5em;
-    border: none;
-    background: #AAA;
-    border-bottom: 5px solid black;
-    margin: 0.25em;
-    width: 5em;
-    cursor: pointer;
-}
-.panebuttons>button:focus {
-    outline: none;
-}
-.panelogo {
-    font-size: medium;
-}
-.panelogo>*>* {
-    vertical-align: middle;
-    display: inline-block;
-    color: #CCC;
-}
-.show {
-    background: #FFF !important;
-    border-bottom: none !important;
-    border-top: 5px solid #666 !important;
-}
-.button-result {
-    margin-left: 2em !important;
-}
-.panebuttons>.button-fullscreen {
-    background-image: url(editor-fullscreen-icon.svg);
-    background-size: 80% 80%;
-    background-position: center center;
-    background-repeat: no-repeat no-repeat;
-}
-.fullscreen .panebuttons>.button-fullscreen {
-    background-image: url(editor-unfullscreen-icon.svg) !important;
-}
-
-@media ( max-width: 740px ) {
-    .panelogo>div>a:nth-child(1) {
-        display: none;
-    }
-}
-
-@media ( max-width: 590px ) {
-    .tabs {
-        display: none;
-    }
-    .panes>div {
-        display: none !important;
-        height: auto;
-    }
-    .panes>.result {
-        display: block !important;
-    }
-}
-</style>
-<body>
-<div class="frame">
-    <div class="tabs">
-        <div class="panebuttons">
-            <button class="button-js">JS</button>
-            <button class="button-html">HTML</button>
-            <button class="button-css">CSS</button>
-            <button class="button-codepen">Codepen</button>
-            <button class="button-jsfiddle">JSFiddle</button>
-            <button class="button-result">Result</button>
-            <button class="button-run">Run</button>
-            <button class="button-fullscreen">&nbsp;</button>
-        </div>
-        <div class="panelogo">
-          <div><a href="/"><span data-subst="textContent|name"></span>&nbsp;</a><a href="/"><img data-subst="src|icon" width="32" height="32"/></a></div>
-        </div>
-    </div>
-    <div class="panes">
-        <div class="js"><div class="files"></div><div class="code"></div></div>
-        <div class="html"><div class="files"></div><div class="code"></div></div>
-        <div class="css"><div class="files"></div><div class="code"></div></div>
-        <div class="result"><iframe></iframe></div>
-        <div class="other">
-          <div>
-            <div><a href="/"><span data-subst="textContent|name"></span>&nbsp;</a><a href="/"><img data-subst="src|icon" width="64" height="64"/></a></div>
-            <div class="loading"></div>
-          </div>
-        </div>
-    </div>
-</div>
-</body>
-<script src="/monaco-editor/min/vs/loader.js"></script>
-<script src="editor-settings.js"></script>
-<script src="editor.js"></script>
-

+ 0 - 861
threejs/resources/editor.js

@@ -1,861 +0,0 @@
-(function() {  // eslint-disable-line strict
-'use strict';  // eslint-disable-line strict
-
-/* global monaco, require, lessonEditorSettings */
-
-const {
-  fixSourceLinks,
-  fixJSForCodeSite,
-  extraHTMLParsing,
-  runOnResize,
-  lessonSettings,
-} = lessonEditorSettings;
-
-const lessonHelperScriptRE = /<script src="[^"]+lessons-helper\.js"><\/script>/;
-const webglDebugHelperScriptRE = /<script src="[^"]+webgl-debug-helper\.js"><\/script>/;
-
-function getQuery(s) {
-  s = s === undefined ? window.location.search : s;
-  if (s[0] === '?' ) {
-    s = s.substring(1);
-  }
-  const query = {};
-  s.split('&').forEach(function(pair) {
-      const parts = pair.split('=').map(decodeURIComponent);
-      query[parts[0]] = parts[1];
-  });
-  return query;
-}
-
-function getSearch(url) {
-  // yea I know this is not perfect but whatever
-  const s = url.indexOf('?');
-  return s < 0 ? {} : getQuery(url.substring(s));
-}
-
-function getFQUrl(path, baseUrl) {
-  const url = new URL(path, baseUrl || window.location.href);
-  return url.href;
-}
-
-async function getHTML(url) {
-  const req = await fetch(url);
-  return await req.text();
-}
-
-function getPrefix(url) {
-  const u = new URL(url, window.location.href);
-  const prefix = u.origin + dirname(u.pathname);
-  return prefix;
-}
-
-function fixCSSLinks(url, source) {
-  const cssUrlRE1 = /(url\(')(.*?)('\))/g;
-  const cssUrlRE2 = /(url\()(.*?)(\))/g;
-  const prefix = getPrefix(url);
-
-  function addPrefix(url) {
-    return url.indexOf('://') < 0 ? `${prefix}/${url}` : url;
-  }
-  function makeFQ(match, prefix, url, suffix) {
-    return `${prefix}${addPrefix(url)}${suffix}`;
-  }
-
-  source = source.replace(cssUrlRE1, makeFQ);
-  source = source.replace(cssUrlRE2, makeFQ);
-  return source;
-}
-
-/**
- * @typedef {Object} Globals
- * @property {SourceInfo} rootScriptInfo
- * @property {Object<string, SourceInfo} scriptInfos
- */
-
-/** @type {Globals} */
-const g = {
-  html: '',
-};
-
-/**
- * This is what's in the sources array
- * @typedef {Object} SourceInfo
- * @property {string} source The source text (html, css, js)
- * @property {string} name The filename or "main page"
- * @property {ScriptInfo} scriptInfo The associated ScriptInfo
- * @property {string} fqURL ??
- * @property {Editor} editor in instance of Monaco editor
- *
- */
-
-/**
- * @typedef {Object} EditorInfo
- * @property {HTMLElement} div The div holding the monaco editor
- * @property {Editor} editor an instance of a monaco editor
- */
-
-/**
- * What's under each language
- * @typedef {Object} HTMLPart
- * @property {string} language Name of language
- * @property {SourceInfo} sources array of SourceInfos. Usually 1 for HTML, 1 for CSS, N for JS
- * @property {HTMLElement} pane the pane for these editors
- * @property {HTMLElement} code the div holding the files
- * @property {HTMLElement} files the div holding the divs holding the monaco editors
- * @property {HTMLElement} button the element to click to show this pane
- * @property {EditorInfo} editors
- */
-
-/** @type {Object<string, HTMLPart>} */
-const htmlParts = {
-  js: {
-    language: 'javascript',
-    sources: [],
-  },
-  css: {
-    language: 'css',
-    sources: [],
-  },
-  html: {
-    language: 'html',
-    sources: [],
-  },
-};
-
-function forEachHTMLPart(fn) {
-  Object.keys(htmlParts).forEach(function(name, ndx) {
-    const info = htmlParts[name];
-    fn(info, ndx, name);
-  });
-}
-
-function getHTMLPart(re, obj, tag) {
-  let part = '';
-  obj.html = obj.html.replace(re, function(p0, p1) {
-    part = p1;
-    return tag;
-  });
-  return part.replace(/\s*/, '');
-}
-
-// doesn't handle multi-line comments or comments with { or } in them
-function formatCSS(css) {
-  let indent = '';
-  return css.split('\n').map((line) => {
-    let currIndent = indent;
-    if (line.includes('{')) {
-      indent = indent + '  ';
-    } else if (line.includes('}')) {
-      indent = indent.substring(0, indent.length - 2);
-      currIndent = indent;
-    }
-    return `${currIndent}${line.trim()}`;
-  }).join('\n');
-}
-
-async function getScript(url, scriptInfos) {
-  // check it's an example script, not some other lib
-  if (!scriptInfos[url].source) {
-    const source = await getHTML(url);
-    const fixedSource = fixSourceLinks(url, source);
-    const {text} = await getWorkerScripts(fixedSource, url, scriptInfos);
-    scriptInfos[url].source = text;
-  }
-}
-
-/**
- * @typedef {Object} ScriptInfo
- * @property {string} fqURL The original fully qualified URL
- * @property {ScriptInfo[]} deps Array of other ScriptInfos this is script dependant on
- * @property {boolean} isWorker True if this script came from `new Worker('someurl')` vs `import` or `importScripts`
- * @property {string} blobUrl The blobUrl for this script if one has been made
- * @property {number} blobGenerationId Used to not visit things twice while recursing.
- * @property {string} source The source as extracted. Updated from editor by getSourcesFromEditor
- * @property {string} munged The source after urls have been replaced with blob urls etc... (the text send to new Blob)
- */
-
-async function getWorkerScripts(text, baseUrl, scriptInfos = {}) {
-  const parentScriptInfo = scriptInfos[baseUrl];
-  const workerRE = /(new\s+Worker\s*\(\s*)('|")(.*?)('|")/g;
-  const importScriptsRE = /(importScripts\s*\(\s*)('|")(.*?)('|")/g;
-
-  const newScripts = [];
-  const slashRE = /\/threejs\/[^/]+$/;
-
-  function replaceWithUUID(match, prefix, quote, url) {
-    const fqURL = getFQUrl(url, baseUrl);
-    if (!slashRE.test(fqURL)) {
-      return match.toString();
-    }
-
-    if (!scriptInfos[url]) {
-      scriptInfos[fqURL] = {
-        fqURL,
-        deps: [],
-        isWorker: prefix.indexOf('Worker') >= 0,
-      };
-      newScripts.push(fqURL);
-    }
-    parentScriptInfo.deps.push(scriptInfos[fqURL]);
-
-    return `${prefix}${quote}${fqURL}${quote}`;
-  }
-
-  text = text.replace(workerRE, replaceWithUUID);
-  text = text.replace(importScriptsRE, replaceWithUUID);
-
-  await Promise.all(newScripts.map((url) => {
-    return getScript(url, scriptInfos);
-  }));
-
-  return {text, scriptInfos};
-}
-
-// hack: scriptInfo is undefined for html and css
-// should try to include html and css in scriptInfos
-function addSource(type, name, source, scriptInfo) {
-  htmlParts[type].sources.push({source, name, scriptInfo});
-}
-
-async function parseHTML(url, html) {
-  html = fixSourceLinks(url, html);
-
-  html = html.replace(/<div class="description">[^]*?<\/div>/, '');
-
-  const styleRE = /<style>([^]*?)<\/style>/i;
-  const titleRE = /<title>([^]*?)<\/title>/i;
-  const bodyRE = /<body>([^]*?)<\/body>/i;
-  const inlineScriptRE = /<script>([^]*?)<\/script>/i;
-  const externalScriptRE = /(<!--(?:(?!-->)[\s\S])*?-->\n){0,1}<script\s*src\s*=\s*"(.*?)"\s*>\s*<\/script>/ig;
-  const dataScriptRE = /(<!--(?:(?!-->)[\s\S])*?-->\n){0,1}<script (.*?)>([^]*?)<\/script>/ig;
-  const cssLinkRE = /<link ([^>]+?)>/g;
-  const isCSSLinkRE = /type="text\/css"|rel="stylesheet"/;
-  const hrefRE = /href="([^"]+)"/;
-
-  const obj = { html: html };
-  addSource('css', 'css', formatCSS(fixCSSLinks(url, getHTMLPart(styleRE, obj, '<style>\n${css}</style>'))));
-  addSource('html', 'html', getHTMLPart(bodyRE, obj, '<body>${html}</body>'));
-  const rootScript = getHTMLPart(inlineScriptRE, obj, '<script>${js}</script>');
-  html = obj.html;
-
-  const fqURL = getFQUrl(url);
-  /** @type Object<string, SourceInfo> */
-  const scriptInfos = {};
-  g.rootScriptInfo = {
-    fqURL,
-    deps: [],
-    source: rootScript,
-  };
-  scriptInfos[fqURL] = g.rootScriptInfo;
-
-  const {text} = await getWorkerScripts(rootScript, fqURL, scriptInfos);
-  g.rootScriptInfo.source = text;
-  g.scriptInfos = scriptInfos;
-  for (const [fqURL, scriptInfo] of Object.entries(scriptInfos)) {
-    addSource('js', basename(fqURL), scriptInfo.source, scriptInfo);
-  }
-
-  const tm = titleRE.exec(html);
-  if (tm) {
-    g.title = tm[1];
-  }
-
-  const scripts = [];
-  html = html.replace(externalScriptRE, function(p0, p1, p2) {
-    p1 = p1 || '';
-    scripts.push(`${p1}<script src="${p2}"></script>`);
-    return '';
-  });
-
-  const dataScripts = [];
-  html = html.replace(dataScriptRE, function(p0, p1, p2, p3) {
-    p1 = p1 || '';
-    dataScripts.push(`${p1}<script ${p2}>${p3}</script>`);
-    return '';
-  });
-
-  htmlParts.html.sources[0].source += dataScripts.join('\n');
-  htmlParts.html.sources[0].source += scripts.join('\n');
-
-  // add style section if there is non
-  if (html.indexOf('${css}') < 0) {
-    html = html.replace('</head>', '<style>\n${css}</style>\n</head>');
-  }
-
-  // add hackedparams section.
-  // We need a way to pass parameters to a blob. Normally they'd be passed as
-  // query params but that only works in Firefox >:(
-  html = html.replace('</head>', '<script id="hackedparams">window.hackedParams = ${hackedParams}\n</script>\n</head>');
-
-  html = extraHTMLParsing(html, htmlParts);
-
-  let links = '';
-  html = html.replace(cssLinkRE, function(p0, p1) {
-    if (isCSSLinkRE.test(p1)) {
-      const m = hrefRE.exec(p1);
-      if (m) {
-        links += `@import url("${m[1]}");\n`;
-      }
-      return '';
-    } else {
-      return p0;
-    }
-  });
-
-  htmlParts.css.sources[0].source = links + htmlParts.css.sources[0].source;
-
-  g.html = html;
-}
-
-function cantGetHTML(e) {  // eslint-disable-line
-  console.log(e);  // eslint-disable-line
-  console.log("TODO: don't run editor if can't get HTML");  // eslint-disable-line
-}
-
-async function main() {
-  const query = getQuery();
-  g.url = getFQUrl(query.url);
-  g.query = getSearch(g.url);
-  let html;
-  try {
-    html = await getHTML(query.url);
-  } catch (err) {
-    console.log(err);  // eslint-disable-line
-    return;
-  }
-  await parseHTML(query.url, html);
-  setupEditor(query.url);
-  if (query.startPane) {
-    const button = document.querySelector('.button-' + query.startPane);
-    toggleSourcePane(button);
-  }
-}
-
-function getJavaScriptBlob(source) {
-  const blob = new Blob([source], {type: 'application/javascript'});
-  return URL.createObjectURL(blob);
-}
-
-let blobGeneration = 0;
-function makeBlobURLsForSources(scriptInfo) {
-  ++blobGeneration;
-
-  function makeBlobURLForSourcesImpl(scriptInfo) {
-    if (scriptInfo.blobGenerationId !== blobGeneration) {
-      scriptInfo.blobGenerationId = blobGeneration;
-      if (scriptInfo.blobUrl) {
-        URL.revokeObjectURL(scriptInfo.blobUrl);
-      }
-      scriptInfo.deps.forEach(makeBlobURLForSourcesImpl);
-      let text = scriptInfo.source;
-      scriptInfo.deps.forEach((depScriptInfo) => {
-        text = text.split(depScriptInfo.fqURL).join(depScriptInfo.blobUrl);
-      });
-      scriptInfo.numLinesBeforeScript = 0;
-      if (scriptInfo.isWorker) {
-        const extra = `self.lessonSettings = ${JSON.stringify(lessonSettings)};
-importScripts('${dirname(scriptInfo.fqURL)}/resources/webgl-debug-helper.js');
-importScripts('${dirname(scriptInfo.fqURL)}/resources/lessons-worker-helper.js')`;
-        scriptInfo.numLinesBeforeScript = extra.split('\n').length;
-        text = `${extra}\n${text}`;
-      }
-      scriptInfo.blobUrl = getJavaScriptBlob(text);
-      scriptInfo.munged = text;
-    }
-  }
-  makeBlobURLForSourcesImpl(scriptInfo);
-}
-
-function getSourceBlob(htmlParts) {
-  g.rootScriptInfo.source = htmlParts.js;
-  makeBlobURLsForSources(g.rootScriptInfo);
-
-  const dname = dirname(g.url);
-  // HACK! for webgl-2d-vs... those examples are not in /webgl they're in /webgl/resources
-  // We basically assume url is https://foo/base/example.html so there will be 4 slashes
-  // If the path is longer than then we need '../' to back up so prefix works below
-  const prefix = `${dname}${dname.split('/').slice(4).map(() => '/..').join('')}`;
-  let source = g.html;
-  source = source.replace('${hackedParams}', JSON.stringify(g.query));
-  source = source.replace('${html}', htmlParts.html);
-  source = source.replace('${css}', htmlParts.css);
-  source = source.replace('${js}', g.rootScriptInfo.munged); //htmlParts.js);
-  source = source.replace('<head>', `<head>
-  <link rel="stylesheet" href="${prefix}/resources/lesson-helper.css" type="text/css">
-  <script match="false">self.lessonSettings = ${JSON.stringify(lessonSettings)}</script>`);
-
-  source = source.replace('</head>', `<script src="${prefix}/resources/webgl-debug-helper.js"></script>
-<script src="${prefix}/resources/lessons-helper.js"></script>
-  </head>`);
-  const scriptNdx = source.indexOf('<script>');
-  g.rootScriptInfo.numLinesBeforeScript = (source.substring(0, scriptNdx).match(/\n/g) || []).length;
-
-  const blob = new Blob([source], {type: 'text/html'});
-  // This seems hacky. We are combining html/css/js into one html blob but we already made
-  // a blob for the JS so let's replace that blob. That means it will get auto-released when script blobs
-  // are regenerated. It also means error reporting will work
-  const blobUrl = URL.createObjectURL(blob);
-  URL.revokeObjectURL(g.rootScriptInfo.blobUrl);
-  g.rootScriptInfo.blobUrl = blobUrl;
-  return blobUrl;
-}
-
-function getSourcesFromEditor() {
-  for (const partTypeInfo of Object.values(htmlParts)) {
-    for (const source of partTypeInfo.sources) {
-      source.source = source.editor.getValue();
-      // hack: shouldn't store this twice. Also see other comment,
-      // should consolidate so scriptInfo is used for css and html
-      if (source.scriptInfo) {
-        source.scriptInfo.source = source.source;
-      }
-    }
-  }
-}
-function getSourceBlobFromEditor() {
-  getSourcesFromEditor();
-
-  return getSourceBlob({
-    html: htmlParts.html.sources[0].source,
-    css: htmlParts.css.sources[0].source,
-    js: htmlParts.js.sources[0].source,
-  });
-}
-
-function getSourceBlobFromOrig() {
-  return getSourceBlob({
-    html: htmlParts.html.sources[0].source,
-    css: htmlParts.css.sources[0].source,
-    js: htmlParts.js.sources[0].source,
-  });
-}
-
-function dirname(path) {
-  const ndx = path.lastIndexOf('/');
-  return path.substring(0, ndx);
-}
-
-function basename(path) {
-  const ndx = path.lastIndexOf('/');
-  return path.substring(ndx + 1);
-}
-
-function resize() {
-  forEachHTMLPart(function(info) {
-    info.editors.forEach((editorInfo) => {
-      editorInfo.editor.layout();
-    });
-  });
-}
-
-function makeScriptsForWorkers(scriptInfo) {
-  ++blobGeneration;
-
-  function makeScriptsForWorkersImpl(scriptInfo) {
-    const scripts = [];
-    if (scriptInfo.blobGenerationId !== blobGeneration) {
-      scriptInfo.blobGenerationId = blobGeneration;
-      scripts.push(...scriptInfo.deps.map(makeScriptsForWorkersImpl).flat());
-      let text = scriptInfo.source;
-      scriptInfo.deps.forEach((depScriptInfo) => {
-        text = text.split(depScriptInfo.fqURL).join(`worker-${basename(depScriptInfo.fqURL)}`);
-      });
-
-      scripts.push({
-        name: `worker-${basename(scriptInfo.fqURL)}`,
-        text,
-      });
-    }
-    return scripts;
-  }
-
-  const scripts = makeScriptsForWorkersImpl(scriptInfo);
-  const mainScript = scripts.pop().text;
-  if (!scripts.length) {
-    return {
-      js: mainScript,
-      html: '',
-    };
-  }
-
-  const workerName = scripts[scripts.length - 1].name;
-  const html = scripts.map((nameText) => {
-    const {name, text} = nameText;
-    return `<script id="${name}" type="x-worker">\n${text}\n</script>`;
-  }).join('\n');
-  const init = `
-
-
-
-// ------
-// Creates Blobs for the Worker Scripts so things can be self contained for snippets/JSFiddle/Codepen
-//
-function getWorkerBlob() {
-  const idsToUrls = [];
-  const scriptElements = [...document.querySelectorAll('script[type=x-worker]')];
-  for (const scriptElement of scriptElements) {
-    let text = scriptElement.text;
-    for (const {id, url} of idsToUrls) {
-      text = text.split(id).join(url);
-    }
-    const blob = new Blob([text], {type: 'application/javascript'});
-    const url = URL.createObjectURL(blob);
-    const id = scriptElement.id;
-    idsToUrls.push({id, url});
-  }
-  return idsToUrls.pop().url;
-}
-`;
-  return {
-    js: mainScript.split(`'${workerName}'`).join('getWorkerBlob()') + init,
-    html,
-  };
-}
-
-function fixHTMLForCodeSite(html) {
-  html = html.replace(lessonHelperScriptRE, '');
-  html = html.replace(webglDebugHelperScriptRE, '');
-  return html;
-}
-
-function openInCodepen() {
-  const comment = `// ${g.title}
-// from ${g.url}
-
-
-  `;
-  getSourcesFromEditor();
-  const scripts = makeScriptsForWorkers(g.rootScriptInfo);
-  const pen = {
-    title                 : g.title,
-    description           : 'from: ' + g.url,
-    tags                  : lessonEditorSettings.tags,
-    editors               : '101',
-    html                  : scripts.html + fixHTMLForCodeSite(htmlParts.html.sources[0].source),
-    css                   : htmlParts.css.sources[0].source,
-    js                    : comment + fixJSForCodeSite(scripts.js),
-  };
-
-  const elem = document.createElement('div');
-  elem.innerHTML = `
-    <form method="POST" target="_blank" action="https://codepen.io/pen/define" class="hidden">'
-      <input type="hidden" name="data">
-      <input type="submit" />
-    "</form>"
-  `;
-  elem.querySelector('input[name=data]').value = JSON.stringify(pen);
-  window.frameElement.ownerDocument.body.appendChild(elem);
-  elem.querySelector('form').submit();
-  window.frameElement.ownerDocument.body.removeChild(elem);
-}
-
-function openInJSFiddle() {
-  const comment = `// ${g.title}
-// from ${g.url}
-
-  `;
-
-  getSourcesFromEditor();
-  const scripts = makeScriptsForWorkers(g.rootScriptInfo);
-
-  const elem = document.createElement('div');
-  elem.innerHTML = `
-    <form method="POST" target="_black" action="https://jsfiddle.net/api/mdn/" class="hidden">
-      <input type="hidden" name="html" />
-      <input type="hidden" name="css" />
-      <input type="hidden" name="js" />
-      <input type="hidden" name="title" />
-      <input type="hidden" name="wrap" value="b" />
-      <input type="submit" />
-    </form>
-  `;
-  elem.querySelector('input[name=html]').value = scripts.html + fixHTMLForCodeSite(htmlParts.html.sources[0].source);
-  elem.querySelector('input[name=css]').value = htmlParts.css.sources[0].source;
-  elem.querySelector('input[name=js]').value = comment + fixJSForCodeSite(scripts.js);
-  elem.querySelector('input[name=title]').value = g.title;
-  window.frameElement.ownerDocument.body.appendChild(elem);
-  elem.querySelector('form').submit();
-  window.frameElement.ownerDocument.body.removeChild(elem);
-}
-
-function selectFile(info, ndx, fileDivs) {
-  if (info.editors.length <= 1) {
-    return;
-  }
-  info.editors.forEach((editorInfo, i) => {
-    const selected = i === ndx;
-    editorInfo.div.style.display = selected ? '' : 'none';
-    editorInfo.editor.layout();
-    addRemoveClass(fileDivs.children[i], 'fileSelected', selected);
-  });
-}
-
-function showEditorSubPane(type, ndx) {
-  const info = htmlParts[type];
-  selectFile(info, ndx, info.files);
-}
-
-function setupEditor() {
-
-  forEachHTMLPart(function(info, ndx, name) {
-    info.pane = document.querySelector('.panes>.' + name);
-    info.code = info.pane.querySelector('.code');
-    info.files = info.pane.querySelector('.files');
-    info.editors = info.sources.map((sourceInfo, ndx) => {
-      if (info.sources.length > 1) {
-        const div = document.createElement('div');
-        div.textContent = basename(sourceInfo.name);
-        info.files.appendChild(div);
-        div.addEventListener('click', () => {
-          selectFile(info, ndx, info.files);
-        });
-      }
-      const div = document.createElement('div');
-      info.code.appendChild(div);
-      const editor = runEditor(div, sourceInfo.source, info.language);
-      sourceInfo.editor = editor;
-      return {
-        div,
-        editor,
-      };
-    });
-    info.button = document.querySelector('.button-' + name);
-    info.button.addEventListener('click', function() {
-      toggleSourcePane(info.button);
-      runIfNeeded();
-    });
-  });
-
-  g.fullscreen = document.querySelector('.button-fullscreen');
-  g.fullscreen.addEventListener('click', toggleFullscreen);
-
-  g.run = document.querySelector('.button-run');
-  g.run.addEventListener('click', run);
-
-  g.iframe = document.querySelector('.result>iframe');
-  g.other = document.querySelector('.panes .other');
-
-  document.querySelector('.button-codepen').addEventListener('click', openInCodepen);
-  document.querySelector('.button-jsfiddle').addEventListener('click', openInJSFiddle);
-
-  g.result = document.querySelector('.panes .result');
-  g.resultButton = document.querySelector('.button-result');
-  g.resultButton.addEventListener('click', function() {
-     toggleResultPane();
-     runIfNeeded();
-  });
-  g.result.style.display = 'none';
-  toggleResultPane();
-
-  if (window.innerWidth > 1200) {
-    toggleSourcePane(htmlParts.js.button);
-  }
-
-  window.addEventListener('resize', resize);
-
-  showEditorSubPane('js', 0);
-  showOtherIfAllPanesOff();
-  document.querySelector('.other .loading').style.display = 'none';
-
-  resize();
-  run();
-}
-
-function toggleFullscreen() {
-  try {
-    toggleIFrameFullscreen(window);
-    resize();
-    runIfNeeded();
-  } catch (e) {
-    console.error(e);  // eslint-disable-line
-  }
-}
-
-function runIfNeeded() {
-  if (runOnResize) {
-    run();
-  }
-}
-
-function run(options) {
-  g.setPosition = false;
-  const url = getSourceBlobFromEditor(options);
-  g.iframe.src = url;
-}
-
-function addClass(elem, className) {
-  const parts = elem.className.split(' ');
-  if (parts.indexOf(className) < 0) {
-    elem.className = elem.className + ' ' + className;
-  }
-}
-
-function removeClass(elem, className) {
-  const parts = elem.className.split(' ');
-  const numParts = parts.length;
-  for (;;) {
-    const ndx = parts.indexOf(className);
-    if (ndx < 0) {
-      break;
-    }
-    parts.splice(ndx, 1);
-  }
-  if (parts.length !== numParts) {
-    elem.className = parts.join(' ');
-    return true;
-  }
-  return false;
-}
-
-function toggleClass(elem, className) {
-  if (removeClass(elem, className)) {
-    return false;
-  } else {
-    addClass(elem, className);
-    return true;
-  }
-}
-
-function toggleIFrameFullscreen(childWindow) {
-  const frame = childWindow.frameElement;
-  if (frame) {
-    const isFullScreen = toggleClass(frame, 'fullscreen');
-    frame.ownerDocument.body.style.overflow = isFullScreen ? 'hidden' : '';
-  }
-}
-
-
-function addRemoveClass(elem, className, add) {
-  if (add) {
-    addClass(elem, className);
-  } else {
-    removeClass(elem, className);
-  }
-}
-
-function toggleSourcePane(pressedButton) {
-  forEachHTMLPart(function(info) {
-    const pressed = pressedButton === info.button;
-    if (pressed && !info.showing) {
-      addClass(info.button, 'show');
-      info.pane.style.display = 'flex';
-      info.showing = true;
-    } else {
-      removeClass(info.button, 'show');
-      info.pane.style.display = 'none';
-      info.showing = false;
-    }
-  });
-  showOtherIfAllPanesOff();
-  resize();
-}
-
-function showingResultPane() {
-  return g.result.style.display !== 'none';
-}
-function toggleResultPane() {
-  const showing = showingResultPane();
-  g.result.style.display = showing ? 'none' : 'block';
-  addRemoveClass(g.resultButton, 'show', !showing);
-  showOtherIfAllPanesOff();
-  resize();
-}
-
-function showOtherIfAllPanesOff() {
-  let paneOn = showingResultPane();
-  forEachHTMLPart(function(info) {
-    paneOn = paneOn || info.showing;
-  });
-  g.other.style.display = paneOn ? 'none' : 'block';
-}
-
-// seems like we should probably store a map
-function getEditorNdxByBlobUrl(type, url) {
-  return htmlParts[type].sources.findIndex(source => source.scriptInfo.blobUrl === url);
-}
-
-function getActualLineNumberAndMoveTo(url, lineNo, colNo) {
-  let origUrl = url;
-  let actualLineNo = lineNo;
-  const scriptInfo = Object.values(g.scriptInfos).find(scriptInfo => scriptInfo.blobUrl === url);
-  if (scriptInfo) {
-    actualLineNo = lineNo - scriptInfo.numLinesBeforeScript;
-    origUrl = basename(scriptInfo.fqURL);
-    if (!g.setPosition) {
-      // Only set the first position
-      g.setPosition = true;
-      const editorNdx = getEditorNdxByBlobUrl('js', url);
-      if (editorNdx >= 0) {
-        showEditorSubPane('js', editorNdx);
-        const editor = htmlParts.js.editors[editorNdx].editor;
-        editor.setPosition({
-          lineNumber: actualLineNo,
-          column: colNo,
-        });
-        editor.revealLineInCenterIfOutsideViewport(actualLineNo);
-        editor.focus();
-      }
-    }
-  }
-  return {origUrl, actualLineNo};
-}
-
-window.getActualLineNumberAndMoveTo = getActualLineNumberAndMoveTo;
-
-function runEditor(parent, source, language) {
-  return monaco.editor.create(parent, {
-    value: source,
-    language: language,
-    //lineNumbers: false,
-    theme: 'vs-dark',
-    disableTranslate3d: true,
- //   model: null,
-    scrollBeyondLastLine: false,
-    minimap: { enabled: false },
-  });
-}
-
-async function runAsBlob() {
-  const query = getQuery();
-  g.url = getFQUrl(query.url);
-  g.query = getSearch(g.url);
-  let html;
-  try {
-    html = await getHTML(query.url);
-  } catch (err) {
-    console.log(err);  // eslint-disable-line
-    return;
-  }
-  await parseHTML(query.url, html);
-  window.location.href = getSourceBlobFromOrig();
-}
-
-function applySubstitutions() {
-  [...document.querySelectorAll('[data-subst]')].forEach((elem) => {
-    elem.dataset.subst.split('&').forEach((pair) => {
-      const [attr, key] = pair.split('|');
-      elem[attr] = lessonEditorSettings[key];
-    });
-  });
-}
-
-function start() {
-  const parentQuery = getQuery(window.parent.location.search);
-  const isSmallish = window.navigator.userAgent.match(/Android|iPhone|iPod|Windows Phone/i);
-  const isEdge = window.navigator.userAgent.match(/Edge/i);
-  if (isEdge || isSmallish || parentQuery.editor === 'false') {
-    runAsBlob();
-    // var url = query.url;
-    // window.location.href = url;
-  } else {
-    applySubstitutions();
-    require.config({ paths: { 'vs': '/monaco-editor/min/vs' }});
-    require(['vs/editor/editor.main'], main);
-  }
-}
-
-start();
-}());
-
-
-

Some files were not shown because too many files changed in this diff