MediaWiki:Monobook.js

From Final Fantasy Hacktics Wiki
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();