|
|
|
@ -50,6 +50,9 @@ THE SOFTWARE. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div id="editor"> |
|
|
|
|
<div id="files"> |
|
|
|
|
<span class="newFile" title="New File">+</span> |
|
|
|
|
</div> |
|
|
|
|
<div id="input"></div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
@ -79,20 +82,121 @@ THE SOFTWARE. |
|
|
|
|
|
|
|
|
|
// ----------------- editor ---------------------- |
|
|
|
|
|
|
|
|
|
var SOL_CACHE_KEY = "sol-cache"; |
|
|
|
|
var SOL_CACHE_FILE = "Untitled" |
|
|
|
|
var SOL_CACHE_FILES_KEY = "sol-cache-files"; |
|
|
|
|
|
|
|
|
|
var editor = ace.edit("input"); |
|
|
|
|
var session = editor.getSession(); |
|
|
|
|
var Range = ace.require('ace/range').Range; |
|
|
|
|
var errMarkerId = null; |
|
|
|
|
|
|
|
|
|
var solCache = window.localStorage.getItem( SOL_CACHE_KEY ); |
|
|
|
|
editor.setValue( solCache || BALLOT_EXAMPLE, 1 ); |
|
|
|
|
var solFiles = JSON.parse( window.localStorage.getItem( SOL_CACHE_FILES_KEY ) ) || [SOL_CACHE_FILE]; |
|
|
|
|
if (solFiles.length === 0) solFiles = [SOL_CACHE_FILE]; |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILES_KEY, JSON.stringify( solFiles ) ); |
|
|
|
|
|
|
|
|
|
var solCache = window.localStorage.getItem( SOL_CACHE_FILE ) || BALLOT_EXAMPLE; |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILE, solCache ) |
|
|
|
|
editor.setValue( solCache, 1 ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
session.setMode("ace/mode/javascript"); |
|
|
|
|
session.setTabSize(4); |
|
|
|
|
session.setUseSoftTabs(true); |
|
|
|
|
|
|
|
|
|
// ----------------- file selector------------- |
|
|
|
|
|
|
|
|
|
var count = 0; |
|
|
|
|
var $filesEl = $('#files'); |
|
|
|
|
|
|
|
|
|
$filesEl.on( 'click','.newFile', function(){ |
|
|
|
|
count++; |
|
|
|
|
var name = 'Unititled'+count; |
|
|
|
|
solFiles.push( name ) |
|
|
|
|
SOL_CACHE_FILE = name; |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILES_KEY, JSON.stringify( solFiles ) ); |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILE, '' ); |
|
|
|
|
updateFiles(); |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
$filesEl.on( 'click','.file:not(.active)', showFileHandler ) |
|
|
|
|
|
|
|
|
|
$filesEl.on( 'click','.file.active', function(ev){ |
|
|
|
|
var $fileTabEl = $(this) |
|
|
|
|
var originalName = $fileTabEl.find('.name').text() |
|
|
|
|
ev.preventDefault() |
|
|
|
|
if ($(this).find('input').length > 0 ) return false; |
|
|
|
|
var $fileNameInputEl = $('<input value="'+originalName+'"/>'); |
|
|
|
|
$fileTabEl.html( $fileNameInputEl ) |
|
|
|
|
$fileNameInputEl.focus() |
|
|
|
|
$fileNameInputEl.select() |
|
|
|
|
$fileNameInputEl.on( 'blur', handleRename ) |
|
|
|
|
$fileNameInputEl.keyup( handleRename ); |
|
|
|
|
|
|
|
|
|
function handleRename (ev) { |
|
|
|
|
ev.preventDefault() |
|
|
|
|
if (ev.which && ev.which !== 13) return false; |
|
|
|
|
var newName = ev.target.value; |
|
|
|
|
var $new = null |
|
|
|
|
if ( newName !== originalName && confirm( "Are you sure you want to rename: " + originalName + " to " + newName + '?' )) { |
|
|
|
|
|
|
|
|
|
solFiles.splice( solFiles.indexOf(originalName), 1, newName ); |
|
|
|
|
window.localStorage.setItem( newName, window.localStorage.getItem(originalName) ); |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILES_KEY, JSON.stringify( solFiles ) ); |
|
|
|
|
window.localStorage.removeItem( originalName ) |
|
|
|
|
SOL_CACHE_FILE = newName; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
updateFiles() |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
$filesEl.on( 'click','.file .remove', function(ev){ |
|
|
|
|
ev.preventDefault(); |
|
|
|
|
var name = $(this).parent().find('.name').text() |
|
|
|
|
|
|
|
|
|
if (confirm( "Are you sure you want to remove: " + name + " from local storage?" )) { |
|
|
|
|
var index = solFiles.indexOf(name); |
|
|
|
|
solFiles.splice(index, 1 ); |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILES_KEY, JSON.stringify( solFiles ) ); |
|
|
|
|
SOL_CACHE_FILE = solFiles[ Math.max(0, index - 1)] |
|
|
|
|
window.localStorage.removeItem( name ) |
|
|
|
|
updateFiles() |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
function showFileHandler (ev) { |
|
|
|
|
ev.preventDefault() |
|
|
|
|
SOL_CACHE_FILE = $(this).find('.name').text(); |
|
|
|
|
updateFiles() |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function fileTabFromName(name) { |
|
|
|
|
return $('#files .file').filter(function(){ return $(this).find('.name').text() == name; }) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function updateFiles () { |
|
|
|
|
$filesEl.find('.file').remove() |
|
|
|
|
for (var f in solFiles) { |
|
|
|
|
if (solFiles[f]) $filesEl.append( fileTabTemplate(solFiles[f]) ); |
|
|
|
|
} |
|
|
|
|
var active = fileTabFromName(SOL_CACHE_FILE); |
|
|
|
|
active.addClass('active') |
|
|
|
|
editor.setValue( window.localStorage.getItem( SOL_CACHE_FILE ) || '', 1 ); |
|
|
|
|
$('#input').toggle( typeof SOL_CACHE_FILE === 'string' ) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function fileTabTemplate(name){ |
|
|
|
|
return $('<span class="file"><span class="name">'+name+'</span><span class="remove">x</span></span>'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SOL_CACHE_FILE = solFiles[0] |
|
|
|
|
updateFiles(); |
|
|
|
|
|
|
|
|
|
// ----------------- version selector------------- |
|
|
|
|
|
|
|
|
|
// var soljsonSources is provided by bin/list.js |
|
|
|
@ -183,14 +287,19 @@ THE SOFTWARE. |
|
|
|
|
var previousInput = ''; |
|
|
|
|
var sourceAnnotations = []; |
|
|
|
|
var compile = function() { |
|
|
|
|
|
|
|
|
|
editor.getSession().clearAnnotations(); |
|
|
|
|
sourceAnnotations = []; |
|
|
|
|
editor.getSession().removeMarker(errMarkerId); |
|
|
|
|
$('#output').empty(); |
|
|
|
|
var input = editor.getValue(); |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILE, input ); |
|
|
|
|
|
|
|
|
|
var inputIncludingImports = includeLocalImports( input ); |
|
|
|
|
var optimize = document.querySelector('#optimize').checked; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
var data = $.parseJSON(compileJSON(input, optimize ? 1 : 0)); |
|
|
|
|
var data = $.parseJSON(compileJSON(inputIncludingImports, optimize ? 1 : 0)); |
|
|
|
|
} catch (exception) { |
|
|
|
|
renderError("Uncaught JavaScript Exception:\n" + exception); |
|
|
|
|
return; |
|
|
|
@ -205,11 +314,12 @@ THE SOFTWARE. |
|
|
|
|
renderContracts(data, input); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var compileTimeout = null; |
|
|
|
|
var onChange = function() { |
|
|
|
|
var input = editor.getValue(); |
|
|
|
|
if (input === "") { |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_KEY, '' ) |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_FILE, '' ) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (input === previousInput) |
|
|
|
@ -225,6 +335,25 @@ THE SOFTWARE. |
|
|
|
|
previousInput = ''; |
|
|
|
|
onChange(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
function includeLocalImports( input ) { |
|
|
|
|
var importRegex = /import\s[\'\"]([^\'\"]+)[\'\"];/g |
|
|
|
|
var imports = []; |
|
|
|
|
var matches = []; |
|
|
|
|
var match; |
|
|
|
|
while ((match = importRegex.exec(input)) !== null) { |
|
|
|
|
if (match[1] && solFiles.indexOf(match[1]) !== -1) { |
|
|
|
|
imports.push( match[1] ) |
|
|
|
|
matches.push( match[0] ) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (var i in imports) { |
|
|
|
|
imported = includeLocalImports( window.localStorage.getItem( imports[i] ) ) |
|
|
|
|
input = input.replace( matches[i], imported ); |
|
|
|
|
} |
|
|
|
|
return input; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (Module) |
|
|
|
|
onCompilerLoaded(); |
|
|
|
|
|
|
|
|
@ -288,8 +417,6 @@ THE SOFTWARE. |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var renderContracts = function(data, source) { |
|
|
|
|
window.localStorage.setItem( SOL_CACHE_KEY, source ); |
|
|
|
|
|
|
|
|
|
$('#output').empty(); |
|
|
|
|
for (var contractName in data.contracts) { |
|
|
|
|
var contract = data.contracts[contractName]; |
|
|
|
|