MediaWiki:Monobook.js

From Final Fantasy Hacktics Wiki
Revision as of 03:57, 8 February 2016 by Raijinili (talk | contribs) (transformers)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/* Any JavaScript here will be loaded for users using the MonoBook skin */

// Comments are important.

function main() {
    // Do the thing.
    $('div#mw-content-text pre').map(transform);
}


function transform(i, node) {
    // Do the things to each thing.
	var txt = node.innerHTML;
	node.innerHTML = $.map(txt.split(/\r?\n/),
            transform_line).join('\n');
}


var assembly_line = /^([0-9A-Fa-f]{8}: [0-9A-Fa-f]{8} )(\w+)(\s.*)?$/;
function transform_line(s) {
    
    var match = assembly_line.exec(s);
    if (match == null) { //no asm detected
        return s;
    }
    
    var prefix = match[1];
    var opname = match[2];
    var suffix = match[3]? match[3]: '';
    
    var link =  $("<a></a>", {
                    href: "/wiki/R3000_instruction_set#" + opname,
                    title: desc[opname],
                }).text(opname);


    if (opname == 'jal') {
        suffix = transform_call(suffix)
    }
    
    console.log(prefix, opname, suffix, link);
    
    return prefix + link[0].outerHTML + suffix;
}

var transform_call_re = /^( (?:0x ?)?)(\w{8})(.*)$/;
function transform_call(s) {

    var match = transform_call_re.exec(s);
    if (match == null) {
        return s;
    }
    
    var prefix = match[1];
    var addr = match[2];
    var suffix = match[3];
    
    var fname = known_functions[addr] || addr;
    var link =  $("<a></a>", {
                    href: "/wiki/" + fname.replace(' ', '_'),
                    title: fname,
                }).text(addr);
    
    
    return prefix + link[0].outerHTML + suffix;
}

var desc = {
    'add': "Add	add $d,$s,$t",
    'addu': "Add unsigned	addu $d,$s,$t",
    'sub': "Subtract	sub $d,$s,$t",
    'subu': "Subtract unsigned	subu $d,$s,$t",
    'addi': "Add immediate	addi $t,$s,C",
    'addiu': "Add immediate unsigned	addiu $t,$s,C",
    'mult': "Multiply	mult $s,$t",
    'multu': "Multiply unsigned	multu $s,$t",
    'div': "Divide	div $s, $t",
    'divu': "Divide unsigned	divu $s, $t",
    'lw': "Load word	lw $t,C($s)",
    'lh': "Load halfword	lh $t,C($s)",
    'lhu': "Load halfword unsigned	lhu $t,C($s)",
    'lb': "Load byte	lb $t,C($s)",
    'lbu': "Load byte unsigned	lbu $t,C($s)",
    'sw': "Store word	sw $t,C($s)",
    'sh': "Store half	sh $t,C($s)",
    'sb': "Store byte	sb $t,C($s)",
    'lui': "Load upper immediate	lui $t,C",
    'mfhi': "Move from high	mfhi $d",
    'mflo': "Move from low	mflo $d",
    'mfcZ': "Move from Control Register	mfcZ $t, $d",
    'mtcZ': "Move to Control Register	mtcZ $t, $d",
    'and': "And	and $d,$s,$t",
    'andi': "And immediate	andi $t,$s,C",
    'or': "Or	or $d,$s,$t",
    'ori': "Or immediate	ori $t,$s,C",
    'xor': "Exclusive or	xor $d,$s,$t",
    'nor': "Nor	nor $d,$s,$t",
    'slt': "Set on less than	slt $d,$s,$t",
    'slti': "Set on less than immediate	slti $t,$s,C",
    'sll': "Shift left logical immediate	sll $d,$t,shamt",
    'srl': "Shift right logical immediate	srl $d,$t,shamt",
    'sra': "Shift right arithmetic immediate	sra $d,$t,shamt",
    'sllv': "Shift left logical	sllv $d,$t,$s",
    'srlv': "Shift right logical	srlv $d,$t,$s",
    'srav': "Shift right arithmetic	srav $d,$t,$s",
    'beq': "Branch on equal	beq $s,$t,C",
    'bne': "Branch on not equal	bne $s,$t,C",
    'j': "Jump	j C",
    'jr': "Jump register	jr $s",
    'jal': "Jump and link	jal C",
    'nop': "No operation (do nothing)",
};


var known_functions = {}
main();