UNPKG

documon

Version:

A documentation system for mortals. Use with any language.

190 lines (143 loc) 4.1 kB
/* Part of Documon. Copyright (c) Michael Gieson. www.documon.net */ this.documon = this.documon || {}; this.documon.Docutils = (function(){ function absoluteURL(url) { var a = document.createElement('a'); a.href = url; return a.href; } function parseUrl(url, notAbsolute){ if( !notAbsolute ){ url = absoluteURL(url); } var baseurl = url.replace(/[\#\?].+?$/, "") var file = baseurl.split("/").pop(); var Afile = file.split("."); var ext = Afile.pop(); var basename = Afile.join("."); var query = url.match(/\?.+?$/, ""); if(query){ query = query[0]; } var hash = url.match(/#.+?$/, ""); if(hash){ hash = hash[0]; } var domain = url.match(/\:\/\/+?([^\/]+)/, ""); if(domain){ domain = domain[1]; } else { domain = null; } return { url : url , baseurl : baseurl , domain : domain , query : query , hash : hash , file : file , ext : ext , basename : basename } } function truncate( str, max, sep ) { // Default to 10 characters max = max || 10; var len = str.length; if(len > max){ // Default to elipsis sep = sep || "..."; var seplen = sep.length; // If seperator is larger than character limit, // well then we don't want to just show the seperator, // so just show right hand side of the string. if(seplen > max) { return str.substring(len - max); } // Difference between max and string length. // Multiply negative because small minus big. var n = -0.5 * (max - len - seplen); // This gives us the centerline. var center = len/2; var front = str.slice(0, center - n); var back = str.slice(len - center + n); return front + sep + back; } return str; } function emptyNode(elem, andMe){ while(elem.firstChild){ elem.removeChild(elem.firstChild); } if(andMe){ elem.parentNode.removeChild(elem); } } function sortOn(arr, prop, reverse, numeric) { // Ensure there's a property if (!prop || !arr) { return arr } if (arr.length < 1) { return arr; } if (typeof numeric == 'undefined') { var first = arr[0][prop]; if (typeof first == 'number') { numeric = true; } } // Set up sort function /** * Description * @private * @private * @method sort_by * @param {} field * @param {} rev * @param {} num * @return FunctionExpression */ var sort_by = function(field, rev, num) { var primer = num ? function(val) { return parseFloat(String(val).replace(/[^0-9.\-]+/g, '')); } : function(val) { return String(val).toLowerCase(); } var r = rev ? -1 : 1; // Return the required a,b function return function(a, b) { // Reset a, b to the field a = primer(a[field]), b = primer(b[field]); // Do actual sorting, reverse as needed //return ((a < b) ? -1 : ((a > b) ? 1 : 0)) * (rev ? -1 : 1); //var result = ((a > b) - (b > a)) * (); if (num) { return (a - b) * r; } else { //return a.localeCompare(b) * r; return ((a < b) ? -1 : ((a > b) ? 1 : 0)) * r; } }; } // Distinguish between numeric and string to prevent 100's from coming before smaller // e.g. // 1 // 20 // 3 // 4000 // 50 arr.sort(sort_by(prop, reverse, numeric)); } return { truncate : truncate, parseUrl : parseUrl, absoluteURL : absoluteURL, emptyNode : emptyNode, sortOn : sortOn } }());