LSL Style

By BlindWanderer Last update Dec 10, 2010 — Installed 172 times.

There are 28 previous versions of this script.

// ==UserScript==
// @name           LSL Style
// @namespace      http://home.comcast.net/~mailerdaemon/
// @include        https://wiki.secondlife.com/*
// @include        http://wiki.secondlife.com/*
// @include        http://lslwiki.net/lslwiki/wakka.php?wakka=*
// @include        http://www.lslwiki.net/lslwiki/wakka.php?wakka=*
// @version        1.3
// ==/UserScript==

if(!GM_addStyle) 
    GM_addStyle = function(css){
        style = document.createElement("style");
        style.type = "text/css";
        style.innerHTML = css;
        document.getElementsByTagName('head')[0].appendChild(style);
        return style;
    };

var functions = ["LinkParticleSystem", "Request(?:DisplayName|Username)","CastRay"];
var get_funcs = ["Link(?:PrimitiveParams|NumberOfSides)", "Username", "DisplayName","Env"];
var set_funcs = [];
var constants = ["PRIM_(?:TEXT|NAME|DESC|ROT_LOCAL|MEDIA_(?:ALT_IMAGE_ENABLE|CONTROLS(?:_(?:MINI|STANDARD)|)|(?:CURRENT|HOME)_URL|AUTO_(?:LOOP|PLAY|SCALE|ZOOM)|"+
				"FIRST_CLICK_INTERACT|(?:WIDTH|HEIGHT)_PIXELS|WHITELIST(?:_ENABLE|)|PERMS_(?:INTERACT|CONTROL)|PERM_(?:NONE|OWNER|GROUP|ANYONE)))", 
				"CHANGED_MEDIA", "STATUS_BLOCK_GRAB_OBJECT", "AGENT_BY_(?:LEGACY_|USER)NAME","OBJECT_(?:(?:RUNNING|TOTAL)_SCRIPT_COUNT|SCRIPT_MEMORY)", 
				"RC(?:_(?:REJECT_(?:AGENTS|TYPES|LAND|PHYSICAL|NONPHYSICAL)|DATA_FLAGS|MAX_HITS|DETECT_PHANTOM)|ERR_(?:SIM_PERF_LOW|CAST_TIME_EXCEEDED))"];
var events = [];
var control = [];
var search = "";
var constfind, constreplace;
var prefixed = false;

if($X("//head/meta[@name='generator' and starts-with(@content,'MediaWiki ')]"))
{
    GM_addStyle("table.diff td div {overflow:visible;} pre.code a{ text-decoration:none; }");
    GM_addStyle(".pBody { padding:0pt 0.8em 0.3em 0.5em; border:1px solid #AAAAAA; } .portlet h5 {background: transparent;}");
    //GM_addStyle("#p-logo a { background-image:url(http://mailerdaemon.home.comcast.net/SL_logo_small.png)!important; }")
    prefixs = ["/wiki/","/wiki/Special:Search?search="];
    search = "//pre[@class='code' or @class='lsl']";
    
    if((breadcrumbs = $X("//div[@id='contentSub']")))
    {
        if(!(title = unsafeWindow.realTitleText))
            if(title = $X("//div[@id='ReatTitleBanner']/span[@id='RealTitle']"))
                title = title.textContent;
        if(title)
            $Z(".//text()[contains(.,'"+unsafeWindow.wgTitle+"')]",function(r,i,p){
                r.data = r.data.replace(unsafeWindow.wgTitle, title);
            }, breadcrumbs);
    }
    //constfind = "&go=Go&search=LSL_";
    //constreplace = "?search=";
    constants = constants.concat(["PERMISSION_TAKE_CONTROLS", "PSYS_SRC_(?:ACCEL|TEXTURE|MAX_AGE|OMEGA|TARGET_KEY)", "FALSE"])
    //functions = functions.concat([])
    //get_funcs = get_funcs.concat([])
    set_funcs = set_funcs.concat(["Link(?:PrimitiveParamsFast|TextureAnim)", "PrimMediaParams"])
    GM_addStyle([//{
                    ".lsl a {font-weight: bold; text-decoration: none;}",
                    ".lsl .imp {font-weight: bold; color: red;}",
                    ".lsl .kw1 {color: rgb(0, 0, 255);}",
                    ".lsl .kw2 {color: rgb(0, 119, 0);}",
                    ".lsl .kw3 {color: rgb(0, 160, 160);}",
                    ".lsl .kw4 {color: rgb(0, 0, 160);}",
                    ".lsl .kw5 {color: rgb(160, 0, 0);}",
                    ".lsl .co1 {color: #FF7700;}",
                    ".lsl .es0 {color: #FF7700;}",
                    ".lsl .br0 {color: #66cc66;}",
                    ".lsl .st0 {color: #00A000;}",
                    ".lsl .nu0 {color: rgb(0, 0, 0);}",
                    ".lsl .me1 {color: #006600;}",
                    ".lsl .me2 {color: #006600;}",
                    ""].join("\n"));//}
}
else if($X("//div[@class='copyright']/a[starts-with(text(),'WakkaWiki ')]"))
{//I don't beleive I'm supporting this crappy wiki and it's very out of date syntax highlighter.
    GM_addStyle([//{
//					".code .imp {font-weight: bold; color: red;}",
                    ".code .kw1 {color: rgb(0, 0, 255);}",
                    ".code .kw2 {color: rgb(0, 119, 0);}",
                    ".code .kw3 {color: rgb(0, 160, 160);}",
                    ".code .kw4 {color: rgb(0, 0, 160);}",
                    ".code .kw5 {color: rgb(160, 0, 0);}",
//					".code .co1 {color: #FF7700;}",
//					".code .es0 {color: #FF7700;}",
//					".code .br0 {color: #66cc66;}",
//					".code .st0 {color: #00A000;}",
//					".code .nu0 {color: rgb(0, 0, 0);}",
//					".code .me1 {color: #006600;}",
//					".code .me2 {color: #006600;}",
                    ""].join("\n"));//}
    prefixs = ["/lslwiki/wakka.php?wakka=","/lslwiki/wakka.php?wakka=TextSearch&phrase="];
    functions = functions.concat(["ModPow","MapDestination","AddToLandBanList","ClearCameraParams","ListStatistics","XorBase64StringsCorrect","HTTP(?:Request|Response)",
                        "(?:Load|RefreshPrim|Escape|Unescape)URL","RemoveFromLand(?:Pass|Ban)List","ParcelMedia(?:CommandList|Query)", "StringTrim","TextBox",
                        "RegionSay","DetectedTouch(?:UV|ST|Face|Pos|Normal|Binormal)","SHA1String","ResetLand(?:Ban|Pass)List","Re(?:lease|quest(?:Secure|))URL"]);
    get_funcs = get_funcs.concat(["InventoryType","Camera(?:Pos|Rot)","UnixTime","AgentLanguage","Region(?:Flags|AgentCount)","Parcel(?:Flags|PrimCount)","FreeURLs",
                        "HTTPHeader","Object(?:Details|PrimCount)",]);
    set_funcs = set_funcs.concat(["PayPrice","Prim(?:URL|MediaParams)","CameraParams","ClickAction","Link(?:PrimitiveParams(?:Fast|)|Texture(?:Anim|))"]);
    constants = constants.concat(["PARCEL_FLAG_(?:"+["USE_(?:ACCESS_GROUP|(?:ACCESS|BAN|LAND_PASS)_LIST)", "LOCAL_SOUND_ONLY", "RESTRICT_PUSHOBJECT",
                        "ALLOW_(?:FLY|(?:GROUP_|)SCRIPTS|LANDMARK|TERRAFORM|DAMAGE|(?:CREATE_|GROUP_|)OBJECTS|(?:ALL|GROUP)_OBJECT_ENTRY)"].join("|")+")",
                        "REGION_FLAG_(?:"+["ALLOW_(?:DAMAGE|DIRECT_TELEPORT)", "DISABLE_(?:COLLISIONS|PHYSICS)", "FIXED_SUN", "BLOCK_TERRAFORM","SANDBOX",
                        "BLOCK_FLY","RESTRICT_PUSHOBJECT"].join("|")+")", "CAMERA_(?:"+["POSITION(?:|_(?:L(?:AG|OCKED)|THRESHOLD))","PITCH",
                        "FOCUS(?:|_(?:L(?:AG|OCKED)|OFFSET|THRESHOLD))","BEHINDNESS_(?:ANGLE|LAG)", "DISTANCE", "ACTIVE"].join("|")+")", "PAY_(?:HIDE|DEFAULT)",
                        "LIST_STAT_(?:RANGE|M(?:IN|AX)|(?:|GEOMETRIC_)ME(?:AN|DIAN)|S(?:TD_DEV|UM(?:|_SQUARES))|NUM_COUNT)", "INVENTORY_NONE",
                        "HTTP_(?:METHOD|MIMETYPE|BODY_(?:MAXLENGTH|TRUNCATED)|VERIFY_CERT)", "PERMISSION_(?:TRACK|CONTROL)_CAMERA",
                        "PARCEL_MEDIA_COMMAND_(?:STOP|PAUSE|PLAY|LOOP(?:_SET|)|T(?:EXTURE|IME|YPE)|AGENT|U(?:RL|NLOAD)|AUTO_ALIGN|SIZE|DESC)",
                        "OBJECT_(?:NAME|DESC|POS|ROT|VELOCITY|OWNER|CREATOR|GROUP)", "TEXTURE_(?:DEFAULT|TRANSPARENT|PLYWOOD|BLANK|MEDIA)",
                        "PRIM_(?:TYPE_SCULPT|FULLBRIGHT|TEXGEN|GLOW|SCULPT_TYPE_(?:SPHERE|TORUS|CYLINDER|PLANE))", "STRING_TRIM(?:_(?:HEAD|TAIL)|)",
                        "TOUCH_INVALID_(?:FACE|TEXCOORD|VECTOR)", "URL_REQUEST_(?:GRANTED|DENIED)","CHANGED_REGION_START"]);
    events = events.concat(["http_request", "http_response"]);
    search = "//div[@class='code']/pre";
    constfind = "?wakka=TextSearch?phrase=";
    constreplace = "?wakka=TextSearch&phrase=";
}

if(get_funcs.length) functions = functions.concat("Get(?:"+get_funcs.join("|")+")");
if(set_funcs.length) functions = functions.concat("Set(?:"+set_funcs.join("|")+")");

const types  = [	"integer", "float", "string", "key", "vector", "rotation", "quaternion", "list" ];
//*
function generate(c,v,r){return {r:r, c:c, v:v, toString: function(){return this.r;}};}

var groups = [generate("nu0", -1, "(0[xX][0-9a-fA-F]+|\\.[0-9]*[Ee][0-9]*|[0-9]+[Ee][0-9]*)")];
if(control.length)		groups.push(generate("kw1", 0, "("+control.join("|")+")"));
if(types.length)		groups.push(generate("kw2", 0, "("+types.join("|")+")"));
if(events.length)		groups.push(generate("kw3", 0, "("+events.join("|")+")"));
if(constants.length)	groups.push(generate("kw4", 1, "("+constants.join("|")+")"));
if(functions.length)	groups.push(generate("kw5", 0, "(ll(?:"+functions.join("|")+"))"));
const gl = groups.length;
var missed = new RegExp("^(|[\\W\\w]*?\\W)(?:"+groups/*.map(function(f){return f.r;})*/.join("|")+")([\\W][\\W\\w]*|)$");

var lang = $X("//div[@id='PageLanguage']");
lang = (lang && lang.innerHTML) || "";

$Z(search, function(r,i,p){
        for(var a = 0; b = r.childNodes[a]; ++a)
            if(b.nodeName == "#text" && (c = missed.exec(b.nodeValue)))
            {
                var s, v;
                if((v = c[gl+2]) && (v != ""))//whitespace after
                    insertAfter(document.createTextNode(v), b);
                for(p=0; p < gl; p++)
                {
                    if((v = c[p+2]) && (v != ""))//one of the groups
                    {
                        var n = groups[p];
                        if(n.v >= 0)
                        {
                            s = document.createElement("a");
                            s.href = prefixs[n.v] + v + lang;
                        }
                        else
                            s = document.createElement("span");
                        s.className=n.c;
                        s.innerHTML=v;
                        insertAfter(s, b);
                        break;
                    }
                }
                if(!(v = c[1]) || (v == ""))//whitespace before
                    b.parentNode.removeChild(b);
                else
                    b.nodeValue = c[1];
                //++a;
            }
        if((b = r.childNodes[0]) && b.nodeName == "#text" && b.nodeValue.substring(0,7) == "&nbsp;\n")
            b.nodeValue = b.nodeValue.substring(7);
        if((b = r.childNodes[r.childNodes.length - 1]) && b.nodeName == "#text" && b.nodeValue.substr(-2) == "\n ")
            b.nodeValue = b.nodeValue.substring(0, b.nodeValue.length - 2);
        if(constfind) $Z("./a[contains(@href, '"+constfind+"')]", function(ir,ii,ip){var t = ir.attributes.getNamedItem("href"); t.value = t.value.replace(constfind, constreplace)+lang;}, r);
        if(lang)      $Z("./a[span[starts-with(@class,'kw')]]", function(ir,ii,ip){ir.attributes.getNamedItem("href").value += lang;}, r);
    });

$Z("//a[starts-with(@title, 'Ll') and starts-with(@title, text())]", function(r,i,p){
    var m = "l" + r.title.substring(1);
    if(r.title == r.innerHTML)
        r.innerHTML = m;
    r.title = m;
});

//*
if(m = $X("//li[@id='n-editingdiscussion']")){
    n = document.createElement("li");
    n.id = "n-randompage";
    n.innerHTML = "<a accesskey='x' title='Load a random article [alt-shift-x]' href='/wiki/Special:Random'>Random Page</a>";
    insertAfter(n, m);
}
/**/

function $X(_xpath, node){//to search in a frame, you must traverse it's .contentDocument attribute.
    var doc = (node)?(node.ownerDocument || node):(node = document);
    return doc.evaluate(_xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
}
function $Y(_xpath, node){
    var doc = (node)?(node.ownerDocument || node):(node = document);
    return doc.evaluate(_xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
}
function $Z(_xpath, func, node){
    var doc = (node)?(node.ownerDocument || node):(node = document);
    var res = doc.evaluate(_xpath, node, null,	XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    var args = Array.prototype.slice.call(arguments, 3);
    var i = 0;
    for (; i < res.snapshotLength; ++i)
        func.apply(func, [res.snapshotItem(i), i].concat(args));
    return i;
}
function insertAfter(insert, after){return after.parentNode.insertBefore(insert, after.nextSibling);}
function insertBefore(insert, before){return before.parentNode.insertBefore(insert, before);}
function log()
{
    var arg;
    switch(arguments.length)
    {
        case 1:
            arg = arguments[0];
            break;
        case 0:
            arg = null;
            break;
        default:
            arg = arguments;
            break;
    }
    
    var f = JSON.stringify(arg);
    if(typeof(unsafeWindow.console) != "undefined" && typeof(unsafeWindow.console.log) != "undefined")
        unsafeWindow.console.log(f);
    else
        GM_log(f);
    return arg;
}