understand src of d3.dsv

node v4.9.1
version: master
endpointsharetweet
Helper Functions
// to return a function for parse(text, f) function objectConverter(columns) { return new Function("d", "return {" + columns.map(function(name, i) { return JSON.stringify(name) + ": d[" + i + "]"; }).join(",") + "}"); } // to return a function for parse(text, f) function customConverter(columns, f) { var object = objectConverter(columns); return function(row, i) { return f(object(row), i, columns); }; } // Compute unique columns in order of discovery. function inferColumns(rows) { var columnSet = Object.create(null), columns = []; rows.forEach(function(row) { for (var column in row) { if (!(column in columnSet)) { columns.push(columnSet[column] = column); } } }); return columns; }
Main Function of dsv with Example of d3.tsvParse("a\tb\tc\n1\t2\t3\n")
var dsv = function(delimiter) { // variable reFormat, delimiterCode var reFormat = new RegExp("[\"" + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); // no delimiter is needed here function parse(text, f) { var convert, columns, rows = parseRows(text, function(row, i) { if (convert) return convert(row, i - 1); columns = row, convert = f ? customConverter(row, f) : objectConverter(row); console.log("1. objectConverter(row): " + objectConverter(row)); console.log("2. convert function: " + convert); }); console.log("3. parseRows(text, func): ", rows); // access to columns of data --------> rows.columns = columns; // test of variables inside parse(text, f) ------> console.log("4. convert: ", convert); console.log("5. columns: ", columns); console.log("6. rows: ", rows); return rows; } // -------------------------------------------------------------> // d3.tsvParse(text) is parse(text) above, text is "a\tb\tc\n1\t2\t3\n" // -------------------------------------------------------------> console.log("1-6. parse('a\tb\tc\n1\t2\t3\n'): ", parse("a\tb\tc\n1\t2\t3\n")); function parseRows(text, f) { var EOL = {}, // sentinel value for end-of-line EOF = {}, // sentinel value for end-of-file rows = [], // output rows N = text.length, I = 0, // current character index n = 0, // the current line number t, // the current token eol; // is the current token followed by EOL? function token() { if (I >= N) return EOF; // special case: end of file if (eol) return eol = false, EOL; // special case: end of line // special case: quotes var j = I, c; if (text.charCodeAt(j) === 34) { var i = j; while (i++ < N) { if (text.charCodeAt(i) === 34) { if (text.charCodeAt(i + 1) !== 34) break; ++i; } } I = i + 2; c = text.charCodeAt(i + 1); if (c === 13) { eol = true; if (text.charCodeAt(i + 2) === 10) ++I; } else if (c === 10) { eol = true; } return text.slice(j + 1, i).replace(/""/g, "\""); } // common case: find next delimiter or newline while (I < N) { var k = 1; c = text.charCodeAt(I++); if (c === 10) eol = true; // \n else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n else if (c !== delimiterCode) continue; return text.slice(j, I - k); } // special case: last token before EOF return text.slice(j); } while ((t = token()) !== EOF) { var a = []; while (t !== EOL && t !== EOF) { a.push(t); t = token(); } if (f && (a = f(a, n++)) == null) continue; rows.push(a); } return rows; } function format(rows, columns) { if (columns == null) columns = inferColumns(rows); return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) { return columns.map(function(column) { return formatValue(row[column]); }).join(delimiter); })).join("\n"); } function formatRows(rows) { return rows.map(formatRow).join("\n"); } function formatRow(row) { return row.map(formatValue).join(delimiter); } function formatValue(text) { return text == null ? "" : reFormat.test(text += "") ? "\"" + text.replace(/\"/g, "\"\"") + "\"" : text; } return { parse: parse, parseRows: parseRows, format: format, formatRows: formatRows }; } // without this line, the above console.log() won't run dsv("\t"); //var tsv = dsv("\t"); //var tsvParse = tsv.parse; //var tsvParseRows = tsv.parseRows; //var tsvFormat = tsv.format; //var tsvFormatRows = tsv.formatRows;
Loading…

no comments

    sign in to comment