transcode/js/script.js

216 lines
4.9 KiB
JavaScript
Raw Permalink Normal View History

2011-07-13 00:19:05 +02:00
var mapping;
var timeout;
2011-07-08 23:25:58 +02:00
2011-07-09 22:19:17 +02:00
$(document).ready(function(){
2011-07-12 20:06:38 +02:00
// load default code
loadCode($('#examples option:selected').val());
// bind events
$('.popup h3').click(function() {
2011-07-08 23:25:58 +02:00
$(this).next().toggle('slow');
});
2011-07-09 22:19:17 +02:00
$('form').change(function() {
compile();
2011-07-08 23:25:58 +02:00
});
2011-07-09 22:19:17 +02:00
$('#examples select').change(function() {
loadCode($(this).val());
2011-07-08 23:25:58 +02:00
});
2011-07-09 22:19:17 +02:00
$('.editor textarea')
.scroll(function() {
$(this).prev().scrollTop($(this).scrollTop());
})
.keypress(function() {
updateEditor($(this));
})
.keyup(function () {
if (timeout) {
window.clearTimeout(timeout);
}
2011-07-08 23:25:58 +02:00
2011-07-09 22:19:17 +02:00
timeout = window.setTimeout(compile, 500);
})
.keydown(function(e) {
if (e.keyCode == 9) {
insertAtCaret(this, "\t")
return false; // prevent default action
}
2011-07-08 23:25:58 +02:00
});
2011-07-09 22:19:17 +02:00
2011-07-13 00:19:05 +02:00
$('#ansic textarea')
.mousemove(function(e) {
var hover = getHoverLine($(this), e);
if (hover) {
var line = hover.index()+1;
2011-07-12 20:06:38 +02:00
2011-07-13 00:19:05 +02:00
if (mapping.ansic[line]) {
var start = mapping.ansic[line][0];
var end = mapping.ansic[line][1];
2011-07-13 00:19:05 +02:00
selectLines($(this), false, line);
selectLines($('#assembler textarea'), true, start, end);
selectLines($('#byte textarea'), true, mapping.assembler[start], mapping.assembler[end]);
}
}
2011-07-13 00:19:05 +02:00
});
$('#assembler textarea').mousemove(function(e) {
2011-07-12 20:06:38 +02:00
var hover = getHoverLine($(this), e);
if (hover) {
var line = hover.index()+1;
if (mapping.assembler[line]) {
var mappedLine = mapping.assembler[line];
selectLines($(this), false, line);
selectLines($('#byte textarea'), true, mappedLine);
}
}
});
2011-07-08 23:25:58 +02:00
2011-07-12 20:06:38 +02:00
$('#byte textarea').mousemove(function(e) {
var hover = getHoverLine($(this), e);
if (hover) {
var line = hover.index()+1;
if (mapping.byte[line]) {
var mappedLine = mapping.byte[line];
selectLines($(this), false, line);
selectLines($('#assembler textarea'), true, mappedLine);
}
}
});
2011-07-09 22:19:17 +02:00
});
2011-07-09 15:00:50 +02:00
function compile() {
2011-07-09 22:19:17 +02:00
var code = $('#ansic textarea').val();
$.post('compile.php?' + $('form').serialize(), code, function(json) {
2011-07-13 00:19:05 +02:00
mapping = json.mapping;
timeout = null; // free timeout
2011-07-09 22:19:17 +02:00
updateEditor($('#assembler .editor textarea'), json.code.assembler);
updateEditor($('#byte .editor textarea'), json.code.byte);
2011-07-12 20:06:38 +02:00
renderStats(json.stats);
2011-07-13 00:19:05 +02:00
2011-07-09 22:19:17 +02:00
if (json.messages) {
2011-07-08 23:25:58 +02:00
$('#messages pre').text(json.messages);
$('#messages').show('slow');
}
else {
$('#messages').hide('slow');
}
}, 'json');
}
function range(start, end) {
var arr = new Array;
for (var i = start; i <= end; i++) {
arr.push(i);
}
return arr;
}
2011-07-09 22:19:17 +02:00
function insertAtCaret(element, text) {
if (document.selection) {
element.focus();
var sel = document.selection.createRange();
sel.text = text;
element.focus();
} else if (element.selectionStart || element.selectionStart === 0) {
var startPos = element.selectionStart;
var endPos = element.selectionEnd;
var scrollTop = element.scrollTop;
element.value = element.value.substring(0, startPos) + text + element.value.substring(endPos, element.value.length);
element.focus();
element.selectionStart = startPos + text.length;
element.selectionEnd = startPos + text.length;
element.scrollTop = scrollTop;
} else {
element.value += text;
element.focus();
}
}
function selectLines(editor, scroll, start, end) {
2011-07-09 22:19:17 +02:00
var pres = editor.prev().children();
pres.removeClass('activeline'); // deselect all
if (end == undefined) {
end = start;
}
for (var i = start; i <= end; i++) {
pres.eq(i-1).addClass('activeline');
}
var offset = pres.get(start-1).offsetTop;
if (scroll) {
editor.scrollTop(offset-50); // scroll to top of selection
}
2011-07-09 22:19:17 +02:00
}
function updateEditor(editor, value) {
if (value) {
editor.val(value);
}
var overlay = editor.prev();
var lines = editor.val().split("\n").length;
overlay.empty();
2011-07-13 00:19:05 +02:00
for (var i = 0; i < lines+2; i++) {
2011-07-09 22:19:17 +02:00
overlay.append($('<pre>').text(i+1));
}
}
function loadCode(file) {
2011-07-12 20:06:38 +02:00
$.get('examples/' + file, function(data) {
2011-07-09 22:19:17 +02:00
updateEditor($('#ansic textarea'), data);
compile();
});
}
2011-07-12 20:06:38 +02:00
function getHoverLine(editor, e) {
var pres = editor.prev().children();
var hover = undefined;
pres.each(function(index, elm) {
if (e.layerY > elm.offsetTop && e.layerY < elm.offsetTop+15) {
hover = $(elm);
return false;
}
});
return hover;
}
function renderStats(stats) {
2011-07-13 00:19:05 +02:00
var cLines = $('#ansic textarea').val().split("\n").length;
var asInstr = $('#byte textarea').val().split("\n").length;
2011-07-12 20:06:38 +02:00
var max;
2011-07-13 00:19:05 +02:00
var par = $('<p>')
.html('Dein Code besteht aus ' + cLines + ' Zeilen Code, die in '
+ asInstr + ' Assembler Instruktionen &uuml;bersetzt werden. Das sind '
+ Math.round(asInstr/cLines) + ' mal mehr Instruktionen als C-Zeilen!');
var table = $('<table>');
2011-07-12 20:06:38 +02:00
for (var mnemonic in stats) {
var count = stats[mnemonic];
if (!max) max = count;
table.append(
$('<tr>').append($('<td>').text(mnemonic))
.append(
$('<td>').append(
$('<div>').text(count).width(800*count/max).addClass('bar')
)
)
);
}
2011-07-13 00:19:05 +02:00
$('#stats div').empty().append(par).append(table);
2011-07-12 20:06:38 +02:00
}