236 lines
7.8 KiB
JavaScript
236 lines
7.8 KiB
JavaScript
(function(window, document) {
|
|
// http://stackoverflow.com/a/1414175/2132223
|
|
var stringToBoolean1 = function (str) {
|
|
switch(str.toLowerCase()) {
|
|
case "true": case "yes": case "1": return true;
|
|
case "false": case "no": case "0": case null: return false;
|
|
default: return null;
|
|
}
|
|
};
|
|
|
|
var stringToBoolean = function (str) {
|
|
var b = stringToBoolean1(str);
|
|
if(b === null) {
|
|
b = Boolean(str);
|
|
}
|
|
return b;
|
|
};
|
|
|
|
// http://stackoverflow.com/a/4981700/2132223
|
|
var getNestedObjectByName = function (strObjName) {
|
|
var parts = strObjName.split(".");
|
|
for (var i = 0, len = parts.length, obj = window; i < len; ++i) {
|
|
obj = obj[parts[i]];
|
|
}
|
|
return obj;
|
|
};
|
|
|
|
// Copyright 2012-2013 Daniel Tillin
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
// csvToArray v2.1 (Unminifiled for development)
|
|
//
|
|
// For documentation visit:
|
|
// http://code.google.com/p/csv-to-array/
|
|
//
|
|
var csvToArray = function (csvStr, o) {
|
|
var od = {
|
|
'fSep': ',',
|
|
'rSep': '\r\n',
|
|
'quot': '"',
|
|
'head': false,
|
|
'trim': false
|
|
}
|
|
if (o) {
|
|
for (var i in od) {
|
|
if (!o[i]) o[i] = od[i];
|
|
}
|
|
} else {
|
|
o = od;
|
|
}
|
|
var a = [
|
|
['']
|
|
];
|
|
for (var r = f = p = q = 0; p < csvStr.length; p++) {
|
|
switch (c = csvStr.charAt(p)) {
|
|
case o.quot:
|
|
if (q && csvStr.charAt(p + 1) == o.quot) {
|
|
a[r][f] += o.quot;
|
|
++p;
|
|
} else {
|
|
q ^= 1;
|
|
}
|
|
break;
|
|
case o.fSep:
|
|
if (!q) {
|
|
if (o.trim) {
|
|
a[r][f] = a[r][f].replace(/^\s\s*/, '').replace(/\s\s*$/, '');
|
|
}
|
|
a[r][++f] = '';
|
|
} else {
|
|
a[r][f] += c;
|
|
}
|
|
break;
|
|
case o.rSep.charAt(0):
|
|
if (!q && (!o.rSep.charAt(1) || (o.rSep.charAt(1) && o.rSep.charAt(1) == csvStr.charAt(p + 1)))) {
|
|
if (o.trim) {
|
|
a[r][f] = a[r][f].replace(/^\s\s*/, '').replace(/\s\s*$/, '');
|
|
}
|
|
a[++r] = [''];
|
|
a[r][f = 0] = '';
|
|
if (o.rSep.charAt(1)) {
|
|
++p;
|
|
}
|
|
} else {
|
|
a[r][f] += c;
|
|
}
|
|
break;
|
|
default:
|
|
a[r][f] += c;
|
|
}
|
|
}
|
|
if (o.head) {
|
|
a.shift()
|
|
}
|
|
if (a[a.length - 1].length < a[0].length) {
|
|
a.pop()
|
|
}
|
|
return a;
|
|
};
|
|
// end of http://code.google.com/p/csv-to-array/
|
|
|
|
var estimateColumnType = function (csvAsArray, columnIndex) {
|
|
var isColumnBoolean = function (csvAsArray, columnIndex) {
|
|
for(var row = 0, nRow = csvAsArray.length; row < nRow; ++row) {
|
|
if(stringToBoolean1(csvAsArray[row][columnIndex]) === null) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
|
|
var isColumnNumber = function (csvAsArray, columnIndex) {
|
|
// http://stackoverflow.com/a/1830844/2132223
|
|
var isNumber = function(n) {
|
|
return !isNaN(parseFloat(n)) && isFinite(n);
|
|
}
|
|
for(var row = 0, nRow = csvAsArray.length; row < nRow; ++row) {
|
|
if(! isNumber(csvAsArray[row][columnIndex])) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
|
|
if(isColumnBoolean(csvAsArray, columnIndex)) {
|
|
return "boolean";
|
|
}
|
|
|
|
if(isColumnNumber(csvAsArray, columnIndex)) {
|
|
return "number";
|
|
}
|
|
|
|
return "string";
|
|
};
|
|
|
|
var drawTable = function (gvCtor, gvOptions, csvUrl, csvEl) {
|
|
var r = new XMLHttpRequest();
|
|
r.open("GET", csvUrl, true);
|
|
r.onreadystatechange = function() {
|
|
if (this.readyState === 4 && this.status == 200) {
|
|
var csvAsArray = csvToArray(this.responseText);
|
|
|
|
var gvdt = new google.visualization.DataTable()
|
|
var csvHeaderLine = csvAsArray.shift();
|
|
for(var i = 0; i < csvHeaderLine.length; i++) {
|
|
/*
|
|
var csvHeaderElement = csvHeaderLine[i].split(":");
|
|
var csvHeaderName = "?";
|
|
var csvHeaderType = "string";
|
|
if(csvHeaderElement.length > 0) {
|
|
csvHeaderName = csvHeaderElement[0];
|
|
if(csvHeaderElement.length > 1) {
|
|
csvHeaderType = csvHeaderElement[1].trim();
|
|
}
|
|
}
|
|
gvdt.addColumn(csvHeaderType, csvHeaderName);
|
|
for(var j = 0; j < csvAsArray.length; j++) {
|
|
switch(csvHeaderType) {
|
|
default:
|
|
case "string": csvAsArray[j][i] = String(csvAsArray[j][i]); break;
|
|
case "number": csvAsArray[j][i] = Number(csvAsArray[j][i]); break;
|
|
case "boolean": csvAsArray[j][i] = stringToBoolean(csvAsArray[j][i]); break;
|
|
}
|
|
}
|
|
*/
|
|
var csvHeaderType = estimateColumnType(csvAsArray, i);
|
|
// alert("column" + i + " = " + csvHeaderType);
|
|
gvdt.addColumn(csvHeaderType, csvHeaderLine[i]);
|
|
for(var j = 0; j < csvAsArray.length; j++) {
|
|
switch(csvHeaderType) {
|
|
default:
|
|
case "string": csvAsArray[j][i] = String(csvAsArray[j][i]); break;
|
|
case "number": csvAsArray[j][i] = Number(csvAsArray[j][i]); break;
|
|
case "boolean": csvAsArray[j][i] = stringToBoolean(csvAsArray[j][i]); break;
|
|
}
|
|
}
|
|
}
|
|
gvdt.addRows(csvAsArray);
|
|
var ctor = getNestedObjectByName(gvCtor);
|
|
var table = new ctor (csvEl);
|
|
table.draw(gvdt, gvOptions);
|
|
}
|
|
}
|
|
r.send();
|
|
};
|
|
|
|
var foreachCsvElement = function(cb) {
|
|
var divEls = document.getElementsByTagName("div");
|
|
for (var i = 0, n = divEls.length; i < n; i++) {
|
|
var divEl = divEls[i];
|
|
var propsAttr = divEl.getAttribute("data-csv-props");
|
|
if(propsAttr !== null) {
|
|
cb(divEl, JSON.parse(propsAttr));
|
|
}
|
|
}
|
|
};
|
|
|
|
var packages = function() {
|
|
var gvPackageSet = [];
|
|
foreachCsvElement(function(csvEl, props) {
|
|
var gvPackageName = props["csvGvPackage"];
|
|
if(! gvPackageSet.hasOwnProperty(gvPackageName)) {
|
|
gvPackageSet.push(gvPackageName);
|
|
}
|
|
});
|
|
return gvPackageSet;
|
|
}();
|
|
|
|
google.load("visualization", "1", {"packages": packages});
|
|
google.setOnLoadCallback(function() {
|
|
foreachCsvElement(function(csvEl, props) {
|
|
var srcAttr = props["csvSrc"];
|
|
var gvCtorName = props["csvGvType"];
|
|
drawTable(gvCtorName, props, srcAttr, csvEl);
|
|
});
|
|
});
|
|
})(window, document);
|