netgis-client/docs/Util.js.html
2025-04-29 13:49:50 +02:00

557 lines
14 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: Util.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: Util.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>var netgis = netgis || {};
/**
* General Purpose Pure Static Utility Functions.
*/
netgis.util =
(
function ()
{
"use strict";
var isDefined = function( v )
{
return ( typeof v !== "undefined" );
};
var isObject = function( v )
{
if ( typeof v === "object" &amp;&amp; ! Array.isArray( v ) &amp;&amp; v !== null ) return true;
return false;
};
var isString = function( v )
{
return ( typeof v === "string" || v instanceof String );
};
var isMobile = function( container )
{
if ( ! container )
return ( document.body.getBoundingClientRect().width &lt; 600 );
else
return ( container.getBoundingClientRect().width &lt; 600 );
};
var clone = function( obj )
{
return JSON.parse( JSON.stringify( obj ) );
};
var stringToID = function( str, seperator )
{
if ( ! seperator ) seperator = "-";
// TODO: constant blacklist array of forbidden characters ?
var id = str.trim();
id = id.toLowerCase();
id = this.replace( id, " ", seperator );
id = this.replace( id, "\n", seperator );
id = this.replace( id, "\t", seperator );
id = this.replace( id, "\\.", seperator );
id = this.replace( id, "\\,", seperator );
id = this.replace( id, "\\!", seperator );
id = this.replace( id, "\\?", seperator );
id = this.replace( id, ":", seperator );
id = this.replace( id, ";", seperator );
id = this.replace( id, "\"", seperator );
id = this.replace( id, "\'", seperator );
id = this.replace( id, "\\§", seperator );
id = this.replace( id, "\\$", seperator );
id = this.replace( id, "\\%", seperator );
id = this.replace( id, "\\&amp;", seperator );
id = this.replace( id, "\\/", seperator );
id = this.replace( id, "\\\\", seperator );
id = this.replace( id, "\\(", seperator );
id = this.replace( id, "\\)", seperator );
id = this.replace( id, "\\{", seperator );
id = this.replace( id, "\\}", seperator );
id = this.replace( id, "\\[", seperator );
id = this.replace( id, "\\]", seperator );
id = this.replace( id, "=", seperator );
id = this.replace( id, "\\+", seperator );
id = this.replace( id, "\\*", seperator );
id = this.replace( id, "\\~", seperator );
id = this.replace( id, "\\^", seperator );
id = this.replace( id, "\\°", seperator );
id = this.replace( id, "²", seperator );
id = this.replace( id, "³", seperator );
id = this.replace( id, "\\#", seperator );
id = this.replace( id, "\\&lt;", seperator );
id = this.replace( id, "\\>", seperator );
id = this.replace( id, "\\|", seperator );
id = this.replace( id, "\\@", seperator );
id = this.replace( id, "€", seperator );
id = this.replace( id, "µ", seperator );
id = this.trim( id, seperator );
id = this.replace( id, "ä", "ae" );
id = this.replace( id, "ö", "oe" );
id = this.replace( id, "ü", "ue" );
id = this.replace( id, "ß", "ss" );
id = this.replace( id, "á", "a" );
id = this.replace( id, "à", "a" );
id = this.replace( id, "â", "a" );
id = this.replace( id, "é", "e" );
id = this.replace( id, "è", "e" );
id = this.replace( id, "ê", "e" );
id = this.replace( id, "í", "i" );
id = this.replace( id, "ì", "i" );
id = this.replace( id, "î", "i" );
id = this.replace( id, "ó", "o" );
id = this.replace( id, "ò", "o" );
id = this.replace( id, "ô", "o" );
id = this.replace( id, "ú", "u" );
id = this.replace( id, "ù", "u" );
id = this.replace( id, "û", "u" );
return id;
};
/**
* Replace all string occurences.
* @param {String} str
* @param {String} find
* @param {String} newstr
* @returns {String}
*/
var replace = function( str, find, newstr )
{
return str.replace( new RegExp( find, "g" ), newstr );
};
var trim = function( str, char )
{
// NOTE: https://masteringjs.io/tutorials/fundamentals/trim
str = str.replace( new RegExp( "^" + char + "+" ), "" );
str = str.replace( new RegExp( char + "+$" ), "" );
return str;
};
var foreach = function( obj, fn )
{
for ( var k in obj )
{
if ( obj.hasOwnProperty( k ) )
{
fn( k, obj[ k ] );
}
}
};
/**
* Replace template strings in html string.
* @param {type} html String with "{key}" placeholders.
* @param {type} data Object of key value pairs to insert.
* @returns {String} The modified html string.
*/
var template = function( html, data )
{
// Get Template: $( "#template-" + name ).text();
foreach
(
data,
function( key, value )
{
html = html.replace( new RegExp( "{" + key + "}", "g" ), value );
}
);
return html;
};
/**
* Create HTML element from string.
* @param {String} html
* @returns {Element}
*/
var create = function( html )
{
var temp = document.createElement( "tbody" );
temp.innerHTML = html;
return temp.children[ 0 ];
};
var insideElement = function( container, x, y )
{
var bounds = container.getBoundingClientRect();
if ( x &lt; bounds.left ) return false;
if ( y &lt; bounds.top ) return false;
if ( x > bounds.right ) return false;
if ( y > bounds.bottom ) return false;
return true;
};
/**
* Replace new line characters with HTML line breaks.
* @param {String} str
* @returns {String}
*/
var newlines = function( str )
{
return str.replace( new RegExp( "\n", "g" ), "&lt;br />" );
};
/**
* Calculate the byte size of an object.
* @param {Object} json
* @returns {Object} Object with size info ( bytes, kilobytes, megabytes )
*/
var size = function( json )
{
var bytes = new TextEncoder().encode( JSON.stringify( json ) ).length;
var kilobytes = bytes / 1024;
var megabytes = kilobytes / 1024;
return { bytes: bytes, kilobytes: kilobytes, megabytes: megabytes };
};
/**
* Send async GET request.
* @param {String} url
* @param {function} callback
*/
var request = function( url, callback, requestData, request )
{
// NOTE: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials
var request = new XMLHttpRequest();
if ( requestData ) request._requestData = requestData;
request.onload = function() { callback( this.responseText, this._requestData, this ); };
request.withCredentials = false;
request.open( "GET", url, true );
request.send();
return request;
};
var downloadJSON = function( exportObj, exportName )
{
var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent( JSON.stringify( exportObj ) );
var downloadAnchorNode = document.createElement( 'a' );
downloadAnchorNode.setAttribute( "href", dataStr );
downloadAnchorNode.setAttribute( "download", exportName );
document.body.appendChild( downloadAnchorNode );
downloadAnchorNode.click();
downloadAnchorNode.remove();
};
/**
* Pad string with leading zeros.
* @param {String} s The string to pad.
* @param {Integer} n Minimum number of digits.
* @returns {String} The padded string.
*/
var padstr = function( s, n )
{
var o = s.toString();
while ( o.length &lt; n ) o = "0" + o;
return o;
};
/**
* Merge object properties.
* @param {Object} target Merged object properties will be written to this.
* @param {Object} other The object to append to the target object.
* @returns {Object} The modified target object.
*/
var merge = function( target, other )
{
return Object.assign( target, other );
};
/**
* @param {Boolean} ymd If true format to YYYYMMDD_HHMMSS, pretty locale otherwise
* @returns {String} Formatted Date Time String (German Locale)
*/
var getTimeStamp = function( ymd )
{
var timestamp;
var date = new Date();
if ( ymd === true )
{
var yyyy = date.getFullYear();
var mm = date.getMonth() + 1;
var dd = date.getDate();
var hh = date.getHours();
var mi = date.getMinutes();
var ss = date.getSeconds();
if ( mm &lt; 10 ) mm = "0" + mm;
if ( dd &lt; 10 ) dd = "0" + dd;
if ( hh &lt; 10 ) hh = "0" + hh;
if ( mi &lt; 10 ) mi = "0" + mi;
if ( ss &lt; 10 ) ss = "0" + ss;
timestamp = [ yyyy, mm, dd, "_", hh, mi, ss ].join( "" );
}
else
{
timestamp = date.getDate() + "." + ( date.getMonth() + 1 ) + "." + date.getFullYear();
timestamp += " " + date.getHours() + ":" + date.getMinutes();
}
return timestamp;
};
/**
* @returns {String} The users language locale string (defaults to German)
*/
var getUserLanguage = function()
{
var lang = navigator.language || "de-DE";
return lang;
};
/**
* @param {String} path
* @returns {String} file extension or empty string if none found
*/
var getFileExtension = function( path )
{
var parts = path.split( "." );
return ( parts.length &lt;= 1 ) ? "" : parts[ parts.length - 1 ];
};
var formatDistance = function( distance )
{
var output;
if ( distance > 100 )
output = ( Math.round( distance / 1000 * 100 ) / 100 ) + " km";
else
output = ( Math.round( distance * 100 ) / 100 ) + " m";
return output;
};
var formatLength = function( len, decimals )
{
var output;
// Normal / Large Value
var threshold = 1000;
var large = ( len > threshold );
// Round Value
var i = 0;
if ( large )
{
var METERS_PER_KILOMETER = 1000;
if ( decimals )
i = Math.round( len / METERS_PER_KILOMETER * 1000 ) / 1000;
else
i = Math.round( len / METERS_PER_KILOMETER );
}
else
{
if ( decimals )
i = Math.round( len * 100 ) / 100;
else
i = Math.round( len );
}
if ( i === 0 ) large = false;
// Thousands Seperators
/*seperate = seperate || false;
if ( seperate ) i = i.toLocaleString( getUserLanguage() );*/
// Build String
output = i + ( large ? " km" : " m" );
// NOTE: HTML Superscript / Unicode (&amp;sup2; etc.) not supported in OL Labels
return output;
};
/*
* @param {Number} area Raw Area in Square Meters
* @param {Boolean} decimals Output Rounded Decimals
* @param {Number} threshold Threshold for normal (square meters) vs. large (square kilometers) values
* @param {Boolean} seperate Use thousands seperators
* @returns {String} Formatted Area String (Square Meters/Square Kilometers)
*/
var formatArea = function( area, decimals, threshold, seperate )
{
var output;
// Normal / Large Value
threshold = threshold || 100000;
var large = ( area > threshold );
// Round Value
var i = 0;
if ( large )
{
var METERS_PER_KILOMETER = 1000000;
if ( decimals )
i = Math.round( area / METERS_PER_KILOMETER * 1000 ) / 1000;
else
i = Math.round( area / METERS_PER_KILOMETER );
}
else
{
if ( decimals )
i = Math.round( area * 100 ) / 100;
else
i = Math.round( area );
}
if ( i === 0 ) large = false;
// Thousands Seperators
seperate = seperate || true;
if ( seperate ) i = i.toLocaleString( getUserLanguage() );
// Build String
output = i + ( large ? " km²" : " m²" );
// NOTE: HTML Superscript / Unicode (&amp;sup2; etc.) not supported in OL Labels
return output;
};
var hexToRGB = function( hex )
{
if ( hex.charAt( 0 ) === "#" ) hex = hex.substr( 1 );
var i = Number.parseInt( hex, 16 );
var rgb =
[
( i >> 16 ) &amp; 255,
( i >> 8 ) &amp; 255,
i &amp; 255
];
return rgb;
};
var invoke = function( src, type, params )
{
src.dispatchEvent( new CustomEvent( type, { bubbles: true, detail: params } ) );
};
/**
* Returns a default unbound event handler / callback function.
* @param {netgis.Events} type
* @param {Object} params
* @returns {Function}
*/
var handler = function( type, params )
{
return function( e )
{
if ( ! params ) params = e;
netgis.util.invoke( this, type, params );
};
};
// Public Interface
var iface =
{
isDefined: isDefined,
isObject: isObject,
isString: isString,
isMobile: isMobile,
clone: clone,
stringToID: stringToID,
replace: replace,
trim: trim,
foreach: foreach,
template: template,
newlines: newlines,
create: create,
insideElement: insideElement,
size: size,
request: request,
downloadJSON: downloadJSON,
padstr: padstr,
merge: merge,
getTimeStamp: getTimeStamp,
getUserLanguage: getUserLanguage,
getFileExtension: getFileExtension,
formatDistance: formatDistance,
formatLength: formatLength,
formatArea: formatArea,
hexToRGB: hexToRGB,
invoke: invoke,
handler: handler
};
return iface;
}
)();</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Namespaces</h3><ul><li><a href="netgis.html">netgis</a></li></ul><h3>Classes</h3><ul><li><a href="netgis.Client.html">Client</a></li><li><a href="netgis.Import.html">Import</a></li></ul><h3>Global</h3><ul><li><a href="global.html#OSM">OSM</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.4</a> on Fri Apr 25 2025 14:07:12 GMT+0200 (Mitteleuropäische Sommerzeit)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>