242 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			242 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | var MUB = { | ||
|  |     _uid : 0 | ||
|  |     ,_minRoot : '/min/?' | ||
|  |     ,checkRewrite : function () { | ||
|  |         var testUri = location.pathname.replace(/\/[^\/]*$/, '/rewriteTest.js').substr(1); | ||
|  |         function fail() { | ||
|  |             $('#minRewriteFailed')[0].className = 'topNote'; | ||
|  |         }; | ||
|  |         $.ajax({ | ||
|  |             url : '../f=' + testUri + '&' + (new Date()).getTime() | ||
|  |             ,success : function (data) { | ||
|  |                 if (data === '1') { | ||
|  |                     MUB._minRoot = '/min/'; | ||
|  |                     $('span.minRoot').html('/min/'); | ||
|  |                 } else | ||
|  |                     fail();                 | ||
|  |             } | ||
|  |             ,error : fail | ||
|  |         }); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Get markup for new source LI element | ||
|  |      */ | ||
|  |     ,newLi : function () { | ||
|  |         return '<li id="li' + MUB._uid + '">http://' + location.host + '/<input type=text size=20>'  | ||
|  |         + ' <button title="Remove">x</button> <button title="Include Earlier">↑</button>' | ||
|  |         + ' <button title="Include Later">↓</button> <span></span></li>'; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Add new empty source LI and attach handlers to buttons | ||
|  |      */ | ||
|  |     ,addLi : function () { | ||
|  |         $('#sources').append(MUB.newLi()); | ||
|  |         var li = $('#li' + MUB._uid)[0]; | ||
|  |         $('button[title=Remove]', li).click(function () { | ||
|  |             $('#results').hide(); | ||
|  |             var hadValue = !!$('input', li)[0].value; | ||
|  |             $(li).remove(); | ||
|  |         }); | ||
|  |         $('button[title$=Earlier]', li).click(function () { | ||
|  |             $(li).prev('li').find('input').each(function () { | ||
|  |                 $('#results').hide(); | ||
|  |                 // this = previous li input
 | ||
|  |                 var tmp = this.value; | ||
|  |                 this.value = $('input', li).val(); | ||
|  |                 $('input', li).val(tmp); | ||
|  |                 MUB.updateAllTestLinks(); | ||
|  |             }); | ||
|  |         }); | ||
|  |         $('button[title$=Later]', li).click(function () { | ||
|  |             $(li).next('li').find('input').each(function () { | ||
|  |                 $('#results').hide(); | ||
|  |                 // this = next li input
 | ||
|  |                 var tmp = this.value; | ||
|  |                 this.value = $('input', li).val(); | ||
|  |                 $('input', li).val(tmp); | ||
|  |                 MUB.updateAllTestLinks(); | ||
|  |             }); | ||
|  |         }); | ||
|  |         ++MUB._uid; | ||
|  |     } | ||
|  |     /** | ||
|  |      * In the context of a source LI element, this will analyze the URI in | ||
|  |      * the INPUT and check the URL on the site. | ||
|  |      */ | ||
|  |     ,liUpdateTestLink : function () { // call in context of li element
 | ||
|  |         if (! $('input', this)[0].value)  | ||
|  |             return; | ||
|  |         var li = this; | ||
|  |         $('span', this).html(''); | ||
|  |         var url = 'http://' + location.host + '/'  | ||
|  |                 + $('input', this)[0].value.replace(/^\//, ''); | ||
|  |         $.ajax({ | ||
|  |             url : url | ||
|  |             ,complete : function (xhr, stat) { | ||
|  |                 if ('success' == stat) | ||
|  |                     $('span', li).html('✓'); | ||
|  |                 else { | ||
|  |                     $('span', li).html('<button><b>404! </b> recheck</button>') | ||
|  |                         .find('button').click(function () { | ||
|  |                             MUB.liUpdateTestLink.call(li); | ||
|  |                         }); | ||
|  |                 } | ||
|  |             } | ||
|  |             ,dataType : 'text' | ||
|  |         }); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Check all source URLs | ||
|  |      */ | ||
|  |     ,updateAllTestLinks : function () { | ||
|  |         $('#sources li').each(MUB.liUpdateTestLink); | ||
|  |     } | ||
|  |     /** | ||
|  |      * In a given array of strings, find the character they all have at | ||
|  |      * a particular index | ||
|  |      * @param Array arr array of strings | ||
|  |      * @param Number pos index to check | ||
|  |      * @return mixed a common char or '' if any do not match | ||
|  |      */ | ||
|  |     ,getCommonCharAtPos : function (arr, pos) { | ||
|  |         var i | ||
|  |            ,l = arr.length | ||
|  |            ,c = arr[0].charAt(pos); | ||
|  |         if (c === '' || l === 1) | ||
|  |             return c; | ||
|  |         for (i = 1; i < l; ++i) | ||
|  |             if (arr[i].charAt(pos) !== c) | ||
|  |                 return ''; | ||
|  |         return c; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Get the shortest URI to minify the set of source files | ||
|  |      * @param Array sources URIs | ||
|  |      */ | ||
|  |     ,getBestUri : function (sources) { | ||
|  |         var pos = 0 | ||
|  |            ,base = '' | ||
|  |            ,c; | ||
|  |         while (true) { | ||
|  |             c = MUB.getCommonCharAtPos(sources, pos); | ||
|  |             if (c === '') | ||
|  |                 break; | ||
|  |             else | ||
|  |                 base += c; | ||
|  |             ++pos; | ||
|  |         } | ||
|  |         base = base.replace(/[^\/]+$/, ''); | ||
|  |         var uri = MUB._minRoot + 'f=' + sources.join(','); | ||
|  |         if (base.charAt(base.length - 1) === '/') { | ||
|  |             // we have a base dir!
 | ||
|  |             var basedSources = sources | ||
|  |                ,i | ||
|  |                ,l = sources.length; | ||
|  |             for (i = 0; i < l; ++i) { | ||
|  |                 basedSources[i] = sources[i].substr(base.length); | ||
|  |             } | ||
|  |             base = base.substr(0, base.length - 1); | ||
|  |             var bUri = MUB._minRoot + 'b=' + base + '&f=' + basedSources.join(','); | ||
|  |             //window.console && console.log([uri, bUri]);
 | ||
|  |             uri = uri.length < bUri.length | ||
|  |                 ? uri | ||
|  |                 : bUri; | ||
|  |         } | ||
|  |         return uri; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Create the Minify URI for the sources | ||
|  |      */ | ||
|  |     ,update : function () { | ||
|  |         MUB.updateAllTestLinks(); | ||
|  |         var sources = [] | ||
|  |            ,ext = false | ||
|  |            ,fail = false; | ||
|  |         $('#sources input').each(function () { | ||
|  |             var m, val; | ||
|  |             if (! fail && this.value && (m = this.value.match(/\.(css|js)$/))) { | ||
|  |                 var thisExt = m[1]; | ||
|  |                 if (ext === false) | ||
|  |                     ext = thisExt;  | ||
|  |                 else if (thisExt !== ext) { | ||
|  |                     fail = true; | ||
|  |                     return alert('extensions must match!'); | ||
|  |                 } | ||
|  |                 this.value = this.value.replace(/^\//, ''); | ||
|  |                 if (-1 != $.inArray(this.value, sources)) { | ||
|  |                     fail = true; | ||
|  |                     return alert('duplicate file!'); | ||
|  |                 } | ||
|  |                 sources.push(this.value); | ||
|  |             }  | ||
|  |         }); | ||
|  |         if (fail || ! sources.length) | ||
|  |             return; | ||
|  |         $('#groupConfig').val("    'keyName' => array('//" + sources.join("', '//") + "'),"); | ||
|  |         var uri = MUB.getBestUri(sources) | ||
|  |            ,uriH = uri.replace(/</, '<').replace(/>/, '>').replace(/&/, '&'); | ||
|  |         $('#uriA').html(uriH)[0].href = uri; | ||
|  |         $('#uriHtml').val( | ||
|  |             ext === 'js'  | ||
|  |             ? '<script type="text/javascript" src="' + uriH + '"></script>' | ||
|  |             : '<link type="text/css" rel="stylesheet" href="' + uriH + '" />' | ||
|  |         ); | ||
|  |         $('#results').show(); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Handler for the "Add file +" button | ||
|  |      */ | ||
|  |     ,addButtonClick : function () { | ||
|  |         $('#results').hide(); | ||
|  |         MUB.addLi(); | ||
|  |         MUB.updateAllTestLinks(); | ||
|  |         $('#update').show().click(MUB.update); | ||
|  |         $('#sources li:last input')[0].focus(); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Runs on DOMready | ||
|  |      */ | ||
|  |     ,init : function () { | ||
|  |         $('#app').show(); | ||
|  |         $('#sources').html(''); | ||
|  |         $('#add button').click(MUB.addButtonClick); | ||
|  |         // make easier to copy text out of
 | ||
|  |         $('#uriHtml, #groupConfig').click(function () { | ||
|  |             this.select(); | ||
|  |         }).focus(function () { | ||
|  |             this.select(); | ||
|  |         }); | ||
|  |         $('a.ext').attr({target:'_blank'}); | ||
|  |         if (location.hash) { | ||
|  |             // make links out of URIs from bookmarklet
 | ||
|  |             $('#getBm').hide(); | ||
|  |             $('#bmUris').html('<p><strong>Found by bookmarklet:</strong> /<a href=#>' | ||
|  |                 + location.hash.substr(1).split(',').join('</a> | /<a href=#>') | ||
|  |                 + '</a></p>' | ||
|  |             ); | ||
|  |             $('#bmUris a').click(function () { | ||
|  |                 MUB.addButtonClick(); | ||
|  |                 $('#sources li:last input').val(this.innerHTML) | ||
|  |                 MUB.liUpdateTestLink.call($('#sources li:last')[0]); | ||
|  |                 $('#results').hide(); | ||
|  |                 return false; | ||
|  |             }).attr({title:'Add file +'}); | ||
|  |         } else { | ||
|  |             // copy bookmarklet code into href
 | ||
|  |             var bmUri = location.pathname.replace(/\/[^\/]*$/, '/bm.js').substr(1); | ||
|  |             $.ajax({ | ||
|  |                 url : '../?f=' + bmUri | ||
|  |                 ,success : function (code) { | ||
|  |                     $('#bm')[0].href = code | ||
|  |                         .replace('%BUILDER_URL%', location.href) | ||
|  |                         .replace(/\n/g, ' '); | ||
|  |                 } | ||
|  |                 ,dataType : 'text' | ||
|  |             }); | ||
|  |             $.browser.msie && $('#getBm p:last').append(' Sorry, not supported in MSIE!'); | ||
|  |             MUB.addButtonClick(); | ||
|  |         } | ||
|  |         MUB.checkRewrite(); | ||
|  |     } | ||
|  | }; | ||
|  | window.onload = MUB.init; |