Changeset 1486

Show
Ignore:
Timestamp:
11/14/07 16:53:55 (6 years ago)
Author:
cho45
Message:

websites/coderepos.org/trac/share/js/TracUtils.js:

Make code area clickable to execute the JS.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • websites/coderepos.org/trac/share/js/TracUtils.js

    r192 r1486  
    11 
    22 
    3 /* 
    4  * Browse Source のときに該当する svn web にすぐ翔べるように 
    5  */ 
    63var SVN_REPOS_BASE = 'http://svn.coderepos.org/share'; 
    74 
     
    96(function () { 
    107 
    11 var addEvent = window.attachEvent ? function (eventName, func, b) { window.attachEvent('on'+eventName, func); } 
    12                                                                   : window.addEventListener; 
     8var addEvent = function (target, e, func, b) { 
     9        if (target.attachEvent) { 
     10                target.attachEvent('on'+e, func); 
     11        } else { 
     12                target.addEventListener(e, func, b); 
     13        } 
     14}; 
    1315 
    14 addEvent('load', addJumpToReposLink, false); 
     16/* 
     17 * Browse Source のときに該当する svn web にすぐ翔べるように 
     18 */ 
    1519function addJumpToReposLink() { 
    1620        var content = document.getElementById('content'); 
     
    4044} 
    4145 
     46function clickableCodeArea () { 
     47        var start = "//Executable"; 
     48        var codes = $X("//pre[starts-with(normalize-space(.), '"+start+"')]"); 
     49        for (var i = 0; i < codes.length; i++) { 
     50                var e = codes[i]; 
     51                var js = $X("string(.)", e); 
     52                var a = document.createElement('a'); 
     53                a.innerHTML = "Click to execute." 
     54                addEvent(a, 'click', function() { 
     55                                eval(js); 
     56                }, false); 
     57                var s = a.style; 
     58                s.fontWeight = 'bold'; 
     59                s.border     = "1px solid #ccc"; 
     60                s.display    = "block"; 
     61                s.width      = "10em"; 
     62                s.padding    = "0.2em"; 
     63                s.margin     = "0 auto 0.2em 0"; 
     64                s.textAlign  = "center"; 
     65                a.href       = 'javascript:void(0)'; 
     66                e.parentNode.insertBefore(a, e); 
     67        } 
     68} 
     69 
     70addEvent(window, 'load', function () { 
     71        addJumpToReposLink(); 
     72        clickableCodeArea(); 
     73}, false); 
     74 
    4275})(); 
     76 
     77// extend version of $X 
     78// $X(exp); 
     79// $X(exp, context); 
     80// $X(exp, type); 
     81// $X(exp, context, type); 
     82function $X (exp, context, type /* want type */) { 
     83        if (typeof context == "function") { 
     84                type    = context; 
     85                context = null; 
     86        } 
     87        if (!context) context = document; 
     88        var exp = document.createExpression(exp, function (prefix) { 
     89                var o = document.createNSResolver(context)(prefix); 
     90                return o ? o : (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : ""; 
     91        }); 
     92 
     93        if (type) { 
     94                switch (type) { 
     95                        case String: 
     96                                return exp.evaluate( 
     97                                        context, 
     98                                        XPathResult.STRING_TYPE, 
     99                                        null 
     100                                ).stringValue; 
     101                        case Number: 
     102                                return exp.evaluate( 
     103                                        context, 
     104                                        XPathResult.NUMBER_TYPE, 
     105                                        null 
     106                                ).numberValue; 
     107                        case Boolean: 
     108                                return exp.evaluate( 
     109                                        context, 
     110                                        XPathResult.BOOLEAN_TYPE, 
     111                                        null 
     112                                ).booleanValue; 
     113                        case Array: 
     114                                var result = exp.evaluate( 
     115                                        context, 
     116                                        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
     117                                        null 
     118                                ); 
     119                                var ret = []; 
     120                                for (var i = 0, len = result.snapshotLength; i < len; i++) { 
     121                                        ret.push(result.snapshotItem(i)); 
     122                                } 
     123                                return ret; 
     124                } 
     125        } else { 
     126                var result = exp.evaluate(context, XPathResult.ANY_TYPE, null); 
     127                switch (result.resultType) { 
     128                        case XPathResult.STRING_TYPE : return result.stringValue; 
     129                        case XPathResult.NUMBER_TYPE : return result.numberValue; 
     130                        case XPathResult.BOOLEAN_TYPE: return result.booleanValue; 
     131                        case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: { 
     132                                // not ensure the order. 
     133                                var ret = []; 
     134                                var i = null; 
     135                                while (i = result.iterateNext()) { 
     136                                        ret.push(i); 
     137                                } 
     138                                return ret; 
     139                        } 
     140                } 
     141                return null; 
     142        } 
     143}