You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					230 lines
				
				8.5 KiB
			
		
		
			
		
	
	
					230 lines
				
				8.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								var __importDefault = (this && this.__importDefault) || function (mod) {
							 | 
						||
| 
								 | 
							
								    return (mod && mod.__esModule) ? mod : { "default": mod };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", { value: true });
							 | 
						||
| 
								 | 
							
								var getEol_1 = __importDefault(require("./getEol"));
							 | 
						||
| 
								 | 
							
								var util_1 = require("./util");
							 | 
						||
| 
								 | 
							
								var defaulDelimiters = [",", "|", "\t", ";", ":"];
							 | 
						||
| 
								 | 
							
								var RowSplit = /** @class */ (function () {
							 | 
						||
| 
								 | 
							
								    function RowSplit(conv) {
							 | 
						||
| 
								 | 
							
								        this.conv = conv;
							 | 
						||
| 
								 | 
							
								        this.cachedRegExp = {};
							 | 
						||
| 
								 | 
							
								        this.delimiterEmitted = false;
							 | 
						||
| 
								 | 
							
								        this._needEmitDelimiter = undefined;
							 | 
						||
| 
								 | 
							
								        this.quote = conv.parseParam.quote;
							 | 
						||
| 
								 | 
							
								        this.trim = conv.parseParam.trim;
							 | 
						||
| 
								 | 
							
								        this.escape = conv.parseParam.escape;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    Object.defineProperty(RowSplit.prototype, "needEmitDelimiter", {
							 | 
						||
| 
								 | 
							
								        get: function () {
							 | 
						||
| 
								 | 
							
								            if (this._needEmitDelimiter === undefined) {
							 | 
						||
| 
								 | 
							
								                this._needEmitDelimiter = this.conv.listeners("delimiter").length > 0;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return this._needEmitDelimiter;
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        enumerable: true,
							 | 
						||
| 
								 | 
							
								        configurable: true
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    RowSplit.prototype.parse = function (fileline) {
							 | 
						||
| 
								 | 
							
								        if (fileline.length === 0 || (this.conv.parseParam.ignoreEmpty && fileline.trim().length === 0)) {
							 | 
						||
| 
								 | 
							
								            return { cells: [], closed: true };
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        var quote = this.quote;
							 | 
						||
| 
								 | 
							
								        var trim = this.trim;
							 | 
						||
| 
								 | 
							
								        var escape = this.escape;
							 | 
						||
| 
								 | 
							
								        if (this.conv.parseRuntime.delimiter instanceof Array || this.conv.parseRuntime.delimiter.toLowerCase() === "auto") {
							 | 
						||
| 
								 | 
							
								            this.conv.parseRuntime.delimiter = this.getDelimiter(fileline);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (this.needEmitDelimiter && !this.delimiterEmitted) {
							 | 
						||
| 
								 | 
							
								            this.conv.emit("delimiter", this.conv.parseRuntime.delimiter);
							 | 
						||
| 
								 | 
							
								            this.delimiterEmitted = true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        var delimiter = this.conv.parseRuntime.delimiter;
							 | 
						||
| 
								 | 
							
								        var rowArr = fileline.split(delimiter);
							 | 
						||
| 
								 | 
							
								        if (quote === "off") {
							 | 
						||
| 
								 | 
							
								            if (trim) {
							 | 
						||
| 
								 | 
							
								                for (var i = 0; i < rowArr.length; i++) {
							 | 
						||
| 
								 | 
							
								                    rowArr[i] = rowArr[i].trim();
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return { cells: rowArr, closed: true };
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            return this.toCSVRow(rowArr, trim, quote, delimiter);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    RowSplit.prototype.toCSVRow = function (rowArr, trim, quote, delimiter) {
							 | 
						||
| 
								 | 
							
								        var row = [];
							 | 
						||
| 
								 | 
							
								        var inquote = false;
							 | 
						||
| 
								 | 
							
								        var quoteBuff = '';
							 | 
						||
| 
								 | 
							
								        for (var i = 0, rowLen = rowArr.length; i < rowLen; i++) {
							 | 
						||
| 
								 | 
							
								            var e = rowArr[i];
							 | 
						||
| 
								 | 
							
								            if (!inquote && trim) {
							 | 
						||
| 
								 | 
							
								                e = util_1.trimLeft(e);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            var len = e.length;
							 | 
						||
| 
								 | 
							
								            if (!inquote) {
							 | 
						||
| 
								 | 
							
								                if (len === 2 && e === this.quote + this.quote) {
							 | 
						||
| 
								 | 
							
								                    row.push("");
							 | 
						||
| 
								 | 
							
								                    continue;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else if (this.isQuoteOpen(e)) { //quote open
							 | 
						||
| 
								 | 
							
								                    e = e.substr(1);
							 | 
						||
| 
								 | 
							
								                    if (this.isQuoteClose(e)) { //quote close
							 | 
						||
| 
								 | 
							
								                        e = e.substring(0, e.lastIndexOf(quote));
							 | 
						||
| 
								 | 
							
								                        e = this.escapeQuote(e);
							 | 
						||
| 
								 | 
							
								                        row.push(e);
							 | 
						||
| 
								 | 
							
								                        continue;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    else if (e.indexOf(quote) !== -1) {
							 | 
						||
| 
								 | 
							
								                        var count = 0;
							 | 
						||
| 
								 | 
							
								                        var prev = "";
							 | 
						||
| 
								 | 
							
								                        for (var _i = 0, e_1 = e; _i < e_1.length; _i++) {
							 | 
						||
| 
								 | 
							
								                            var c = e_1[_i];
							 | 
						||
| 
								 | 
							
								                            // count quotes only if previous character is not escape char
							 | 
						||
| 
								 | 
							
								                            if (c === quote && prev !== this.escape) {
							 | 
						||
| 
								 | 
							
								                                count++;
							 | 
						||
| 
								 | 
							
								                                prev = "";
							 | 
						||
| 
								 | 
							
								                            }
							 | 
						||
| 
								 | 
							
								                            else {
							 | 
						||
| 
								 | 
							
								                                // save previous char to temp variable
							 | 
						||
| 
								 | 
							
								                                prev = c;
							 | 
						||
| 
								 | 
							
								                            }
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                        if (count % 2 === 1) {
							 | 
						||
| 
								 | 
							
								                            if (trim) {
							 | 
						||
| 
								 | 
							
								                                e = util_1.trimRight(e);
							 | 
						||
| 
								 | 
							
								                            }
							 | 
						||
| 
								 | 
							
								                            row.push(quote + e);
							 | 
						||
| 
								 | 
							
								                            continue;
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                        else {
							 | 
						||
| 
								 | 
							
								                            inquote = true;
							 | 
						||
| 
								 | 
							
								                            quoteBuff += e;
							 | 
						||
| 
								 | 
							
								                            continue;
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    else {
							 | 
						||
| 
								 | 
							
								                        inquote = true;
							 | 
						||
| 
								 | 
							
								                        quoteBuff += e;
							 | 
						||
| 
								 | 
							
								                        continue;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    if (trim) {
							 | 
						||
| 
								 | 
							
								                        e = util_1.trimRight(e);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    row.push(e);
							 | 
						||
| 
								 | 
							
								                    continue;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else { //previous quote not closed
							 | 
						||
| 
								 | 
							
								                if (this.isQuoteClose(e)) { //close double quote
							 | 
						||
| 
								 | 
							
								                    inquote = false;
							 | 
						||
| 
								 | 
							
								                    e = e.substr(0, len - 1);
							 | 
						||
| 
								 | 
							
								                    quoteBuff += delimiter + e;
							 | 
						||
| 
								 | 
							
								                    quoteBuff = this.escapeQuote(quoteBuff);
							 | 
						||
| 
								 | 
							
								                    if (trim) {
							 | 
						||
| 
								 | 
							
								                        quoteBuff = util_1.trimRight(quoteBuff);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    row.push(quoteBuff);
							 | 
						||
| 
								 | 
							
								                    quoteBuff = "";
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    quoteBuff += delimiter + e;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // if (!inquote && param._needFilterRow) {
							 | 
						||
| 
								 | 
							
								        //   row = filterRow(row, param);
							 | 
						||
| 
								 | 
							
								        // }
							 | 
						||
| 
								 | 
							
								        return { cells: row, closed: !inquote };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    RowSplit.prototype.getDelimiter = function (fileline) {
							 | 
						||
| 
								 | 
							
								        var checker;
							 | 
						||
| 
								 | 
							
								        if (this.conv.parseParam.delimiter === "auto") {
							 | 
						||
| 
								 | 
							
								            checker = defaulDelimiters;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if (this.conv.parseParam.delimiter instanceof Array) {
							 | 
						||
| 
								 | 
							
								            checker = this.conv.parseParam.delimiter;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            return this.conv.parseParam.delimiter;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        var count = 0;
							 | 
						||
| 
								 | 
							
								        var rtn = ",";
							 | 
						||
| 
								 | 
							
								        checker.forEach(function (delim) {
							 | 
						||
| 
								 | 
							
								            var delimCount = fileline.split(delim).length;
							 | 
						||
| 
								 | 
							
								            if (delimCount > count) {
							 | 
						||
| 
								 | 
							
								                rtn = delim;
							 | 
						||
| 
								 | 
							
								                count = delimCount;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        return rtn;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    RowSplit.prototype.isQuoteOpen = function (str) {
							 | 
						||
| 
								 | 
							
								        var quote = this.quote;
							 | 
						||
| 
								 | 
							
								        var escape = this.escape;
							 | 
						||
| 
								 | 
							
								        return str[0] === quote && (str[1] !== quote ||
							 | 
						||
| 
								 | 
							
								            str[1] === escape && (str[2] === quote || str.length === 2));
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    RowSplit.prototype.isQuoteClose = function (str) {
							 | 
						||
| 
								 | 
							
								        var quote = this.quote;
							 | 
						||
| 
								 | 
							
								        var escape = this.escape;
							 | 
						||
| 
								 | 
							
								        if (this.conv.parseParam.trim) {
							 | 
						||
| 
								 | 
							
								            str = util_1.trimRight(str);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        var count = 0;
							 | 
						||
| 
								 | 
							
								        var idx = str.length - 1;
							 | 
						||
| 
								 | 
							
								        while (str[idx] === quote || str[idx] === escape) {
							 | 
						||
| 
								 | 
							
								            idx--;
							 | 
						||
| 
								 | 
							
								            count++;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return count % 2 !== 0;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    // private twoDoubleQuote(str: string): string {
							 | 
						||
| 
								 | 
							
								    //   var twoQuote = this.quote + this.quote;
							 | 
						||
| 
								 | 
							
								    //   var curIndex = -1;
							 | 
						||
| 
								 | 
							
								    //   while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) {
							 | 
						||
| 
								 | 
							
								    //     str = str.substring(0, curIndex) + str.substring(++curIndex);
							 | 
						||
| 
								 | 
							
								    //   }
							 | 
						||
| 
								 | 
							
								    //   return str;
							 | 
						||
| 
								 | 
							
								    // }
							 | 
						||
| 
								 | 
							
								    RowSplit.prototype.escapeQuote = function (segment) {
							 | 
						||
| 
								 | 
							
								        var key = "es|" + this.quote + "|" + this.escape;
							 | 
						||
| 
								 | 
							
								        if (this.cachedRegExp[key] === undefined) {
							 | 
						||
| 
								 | 
							
								            this.cachedRegExp[key] = new RegExp('\\' + this.escape + '\\' + this.quote, 'g');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        var regExp = this.cachedRegExp[key];
							 | 
						||
| 
								 | 
							
								        // console.log(regExp,segment);
							 | 
						||
| 
								 | 
							
								        return segment.replace(regExp, this.quote);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    RowSplit.prototype.parseMultiLines = function (lines) {
							 | 
						||
| 
								 | 
							
								        var csvLines = [];
							 | 
						||
| 
								 | 
							
								        var left = "";
							 | 
						||
| 
								 | 
							
								        while (lines.length) {
							 | 
						||
| 
								 | 
							
								            var line = left + lines.shift();
							 | 
						||
| 
								 | 
							
								            var row = this.parse(line);
							 | 
						||
| 
								 | 
							
								            if (row.cells.length === 0 && this.conv.parseParam.ignoreEmpty) {
							 | 
						||
| 
								 | 
							
								                continue;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (row.closed || this.conv.parseParam.alwaysSplitAtEOL) {
							 | 
						||
| 
								 | 
							
								                if (this.conv.parseRuntime.selectedColumns) {
							 | 
						||
| 
								 | 
							
								                    csvLines.push(util_1.filterArray(row.cells, this.conv.parseRuntime.selectedColumns));
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    csvLines.push(row.cells);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                left = "";
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                left = line + (getEol_1.default(line, this.conv.parseRuntime) || "\n");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return { rowsCells: csvLines, partial: left };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    return RowSplit;
							 | 
						||
| 
								 | 
							
								}());
							 | 
						||
| 
								 | 
							
								exports.RowSplit = RowSplit;
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=rowSplit.js.map
							 |