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; |