Handle multiple files.

pull/1/head
chriseth 9 years ago
parent 91bb93d8e3
commit 929cbdbfd5
  1. 73
      index.html
  2. 14
      worker.js

@ -475,6 +475,7 @@
// ----------------- compiler ---------------------- // ----------------- compiler ----------------------
var compileJSON; var compileJSON;
var compilerAcceptsMultipleFiles;
var previousInput = ''; var previousInput = '';
var sourceAnnotations = []; var sourceAnnotations = [];
@ -487,11 +488,13 @@
var input = editor.getValue(); var input = editor.getValue();
window.localStorage.setItem(SOL_CACHE_FILE, input); window.localStorage.setItem(SOL_CACHE_FILE, input);
var inputIncludingImports = includeLocalAndRemoteImports(input, compile); var files = {};
if (!inputIncludingImports) return; files[fileNameFromKey(SOL_CACHE_FILE)] = input;
var input = gatherImports(files, compile);
if (!input) return;
var optimize = document.querySelector('#optimize').checked; var optimize = document.querySelector('#optimize').checked;
compileJSON(inputIncludingImports, optimize ? 1 : 0); compileJSON(input, optimize ? 1 : 0);
}; };
var compilationFinished = function(result) { var compilationFinished = function(result) {
var data = $.parseJSON(result); var data = $.parseJSON(result);
@ -527,7 +530,14 @@
var onCompilerLoaded = function() { var onCompilerLoaded = function() {
if (worker === null) { if (worker === null) {
var compile = Module.cwrap("compileJSON", "string", ["string", "number"]); var compile;
if ('_compileJSONMulti' in Module) {
compilerAcceptsMultipleFiles = true;
compile = Module.cwrap("compileJSONMulti", "string", ["string", "number"]);
} else {
compilerAcceptsMultipleFiles = false;
compile = Module.cwrap("compileJSON", "string", ["string", "number"]);
}
compileJSON = function(source, optimize, cb) { compileJSON = function(source, optimize, cb) {
try { try {
var result = compile(source, optimize); var result = compile(source, optimize);
@ -543,24 +553,46 @@
}; };
var cachedRemoteFiles = {}; var cachedRemoteFiles = {};
function includeLocalAndRemoteImports(input, asyncCallback, needAsync) { function gatherImports(files, asyncCallback, needAsync) {
if (!compilerAcceptsMultipleFiles)
return files[fileNameFromKey(SOL_CACHE_FILE)];
var importRegex = /import\s[\'\"]([^\'\"]+)[\'\"];/g; var importRegex = /import\s[\'\"]([^\'\"]+)[\'\"];/g;
var match; var reloop = false;
for (var runs = 0; (match = importRegex.exec(input)) !== null && runs < 100; runs++) { do {
var githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^\/]*\/[^\/]*)\/(.*)/.exec(match[1]); reloop = false;
if (getFiles().indexOf(fileKey(match[1])) !== -1) for (var fileName in files) {
input = input.replace(match[0], window.localStorage.getItem( fileKey(match[1]) )); var match;
else if (match[1] in cachedRemoteFiles) while (match = importRegex.exec(files[fileName])) {
input = input.replace(match[0], cachedRemoteFiles[match[1]]); var m = match[1];
else if (githubMatch) { if (m in files) continue;
$.getJSON('https://api.github.com/repos/' + githubMatch[3] + '/contents/' + githubMatch[4], function(result) { if (getFiles().indexOf(fileKey(m)) !== -1) {
var content = Base64.decode(result.content); files[m] = window.localStorage[fileKey(match[1])];
cachedRemoteFiles[match[1]] = content; reloop = true;
includeLocalAndRemoteImports(input.replace(match[0], content), asyncCallback, true); } else if (m in cachedRemoteFiles) {
}); files[m] = cachedRemoteFiles[m];
return null; reloop = true;
} else if (githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^\/]*\/[^\/]*)\/(.*)/.exec(m)) {
$.getJSON('https://api.github.com/repos/' + githubMatch[3] + '/contents/' + githubMatch[4], function(result) {
var content;
if ('content' in result)
content = Base64.decode(result.content);
else
content = "\"" + m + "\" NOT FOUND"; //@TODO handle this better
cachedRemoteFiles[m] = content;
files[m] = content;
gatherImports(files, asyncCallback, true);
}).fail(function(){
var content = "\"" + m + "\" NOT FOUND"; //@TODO handle this better
cachedRemoteFiles[m] = content;
files[m] = content;
gatherImports(files, asyncCallback, true);
});
return null;
}
}
} }
} } while (reloop);
var input = JSON.stringify({'sources':files});
if (needAsync) if (needAsync)
asyncCallback(input); asyncCallback(input);
return input; return input;
@ -575,6 +607,7 @@
switch (data.cmd) { switch (data.cmd) {
case 'versionLoaded': case 'versionLoaded':
$('#version').text(data.data); $('#version').text(data.data);
compilerAcceptsMultipleFiles = !!data.acceptsMultipleFiles;
onCompilerLoaded(); onCompilerLoaded();
break; break;
case 'compiled': case 'compiled':

@ -10,11 +10,15 @@ addEventListener('message', function(e) {
importScripts(data.data); importScripts(data.data);
version = Module.cwrap("version", "string", []); version = Module.cwrap("version", "string", []);
compileJSON = Module.cwrap("compileJSON", "string", ["string", "number"]); if ('_compileJSONMulti' in Module)
postMessage({cmd: 'versionLoaded', data: version()}); compileJSON = Module.cwrap("compileJSONMulti", "string", ["string", "number"]);
break; else
case 'version': compileJSON = Module.cwrap("compileJSON", "string", ["string", "number"]);
postMessage({cmd: 'versionLoaded', data: version()}); postMessage({
cmd: 'versionLoaded',
data: version(),
acceptsMultipleFiles: ('_compileJSONMulti' in Module)
});
break; break;
case 'compile': case 'compile':
postMessage({cmd: 'compiled', data: compileJSON(data.source, data.optimize)}); postMessage({cmd: 'compiled', data: compileJSON(data.source, data.optimize)});

Loading…
Cancel
Save