Newer
Older
2020-yuuki-t / csv.min.js
@結城拓海 結城拓海 on 23 Jan 2023 8 KB 作成した
! function(t, e) {
    "function" == typeof define && define.amd ? define([], e) : 
    "object" == typeof module && module.exports ? module.exports = e() : t.CSV = e()
  }(this, function() {"use strict";
  
    function t(t) {
      var e = typeof t;
      return "function" === e || "object" === e && !!t
    }
  
    function e(t) {
      return "string" == typeof t
    }
  
    function n(t) {
      return !isNaN(+t)
    }
  
    function i(t) {
      return 0 == t || 1 == t
    }
  
    function r(t) {
      return null == t
    }
  
    function o(t) {
      return null != t
    }
  
    function c(t, e) {
      return o(t) ? t : e
    }
  
    function u(t, e) {
      for (var n = 0, i = t.length; i > n && e(t[n], n) !== !1; n += 1);
    }
  
    function s(t) {
      return t.replace(/"/g, '\\"')
    }
  
    function a(t) {
      return "attrs[" + t + "]"
    }
  
    function l(t, e) {
      return n(t) ? "Number(" + a(e) + ")" : i(t) ? "Boolean(" + a(e) + " == true)" : "String(" + a(e) + ")"
    }
  
    function f(t, n, i, r) {
      var o = [];
      return 3 == arguments.length ? (n ? g(n) ? u(i, function(i, r) {
        e(n[r]) ? n[r] = n[r].toLowerCase() : t[n[r]] = n[r], o.push("deserialize[cast[" + r + "]](" + a(r) + ")")
      }) : u(i, function(t, e) {
        o.push(l(t, e))
      }) : u(i, function(t, e) {
        o.push(a(e))
      }), o = "return [" + o.join(",") + "]") : (n ? g(n) ? u(i, function(i, c) {
        e(n[c]) ? n[c] = n[c].toLowerCase() : t[n[c]] = n[c], o.push('"' + s(r[c]) + '": deserialize[cast[' + c + "]](" + a(c) + ")")
      }) : u(i, function(t, e) {
        o.push('"' + s(r[e]) + '": ' + l(t, e))
      }) : u(i, function(t, e) {
        o.push('"' + s(r[e]) + '": ' + a(e))
      }), o = "return {" + o.join(",") + "}"), Function("attrs", "deserialize", "cast", o)
    }
  
    function h(t, e) {
      var n, i = 0;
      return u(e, function(e) {
        var r, o = e; - 1 != p.indexOf(e) && (o = "\\" + o), r = t.match(RegExp(o, "g")), r && r.length > i && (i = r.length, n = e)
      }), n || e[0]
    }
    var p = ["|", "^"],
      d = [",", ";", "  ", "|", "^"],
      m = ["\r\n", "\r", "\n"],
      g = Array.isArray || function(t) {
        return "[object Array]" === toString.call(t)
      },
      y = function() {
        function n(t, n) {
          if (n || (n = {}), g(t)) this.mode = "encode";
          else {
            if (!e(t)) throw Error("Incompatible format!");
            this.mode = "parse"
          }
          this.data = t, this.options = {
            header: c(n.header, !1),
            cast: c(n.cast, !0)
          };
          var i = n.lineDelimiter || n.line,
            r = n.cellDelimiter || n.delimiter;
          this.isParser() ? (this.options.lineDelimiter = i || h(this.data, m), this.options.cellDelimiter = r || h(this.data, d), this.data = o(this.data, this.options.lineDelimiter)) : this.isEncoder() && (this.options.lineDelimiter = i || "\r\n", this.options.cellDelimiter = r || ",")
        }

        function i(t, e, n, i, r) {
          t(new e(n, i, r))
        }

        function o(t, e) {
          return t.slice(-e.length) != e && (t += e), t
        }
        
        function s(n) {
          return g(n) ? "array" : t(n) ? "object" : e(n) ? "string" : r(n) ? "null" : "primitive"
        }
        return n.prototype.set = function(t, e) {
          return this.options[t] = e
        }, n.prototype.isParser = function() {
          return "parse" == this.mode
        }, n.prototype.isEncoder = function() {
          return "encode" == this.mode
        }, n.prototype.parse = function(t) {
          function e() {
            s = {
              escaped: !1,
              quote: !1,
              cell: !0
            }
          }
  
          function n() {
            m.cell = ""
          }
  
          function r() {
            m.line = []
          }
  
          function o(t) {
            m.line.push(s.escaped ? t.slice(1, -1).replace(/""/g, '"') : t), n(), e()
          }
  
          function c(t) {
            o(t.slice(0, 1 - p.lineDelimiter.length))
          }
  
          function u() {
            d ? g(d) ? (a = f(y, p.cast, m.line, d), (u = function() {
              i(t, a, m.line, y, p.cast)
            })()) : d = m.line : (a || (a = f(y, p.cast, m.line)), (u = function() {
              i(t, a, m.line, y, p.cast)
            })())
          }
          if ("parse" == this.mode) {
            if (0 === this.data.trim().length) return [];
            var s, a, l, h = this.data,
              p = this.options,
              d = p.header,
              m = {
                cell: "",
                line: []
              },
              y = this.deserialize;
            t || (l = [], t = function(t) {
              l.push(t)
            }), 1 == p.lineDelimiter.length && (c = o);
            var v, A, D, b = h.length,
              j = p.cellDelimiter.charCodeAt(0),
              w = p.lineDelimiter.charCodeAt(p.lineDelimiter.length - 1);
            for (e(), v = 0, A = 0; b > v; v++) D = h.charCodeAt(v), s.cell && (s.cell = !1, 34 == D) ? s.escaped = !0 : s.escaped && 34 == D ? s.quote = !s.quote : (s.escaped && s.quote || !s.escaped) && (D == j ? (o(m.cell + h.slice(A, v)), A = v + 1) : D == w && (c(m.cell + h.slice(A, v)), A = v + 1, (m.line.length > 1 || "" !== m.line[0]) && u(), r()));
            return l ? l : this
          }
        }, n.prototype.deserialize = {
          string: function(t) {
            return t + ""
          },
          number: function(t) {
            return +t
          },
          "boolean": function(t) {
            return !!t
          }
        }, n.prototype.serialize = {
          object: function(t) {
            var e = this,
              n = Object.keys(t),
              i = Array(n.length);
            return u(n, function(n, r) {
              i[r] = e[s(t[n])](t[n])
            }), i
          },
          array: function(t) {
            var e = this,
              n = Array(t.length);
            return u(t, function(t, i) {
              n[i] = e[s(t)](t)
            }), n
          },
          string: function(t) {
            return '"' + (t + "").replace(/"/g, '""') + '"'
          },
          "null": function() {
            return ""
          },
          primitive: function(t) {
            return t
          }
        }, n.prototype.encode = function(t) {
          function n(t) {
            return t.join(c.cellDelimiter)
          }
          if ("encode" == this.mode) {
            if (0 == this.data.length) return "";
            var i, r, o = this.data,
              c = this.options,
              a = c.header,
              l = o[0],
              f = this.serialize,
              h = 0;
            t || (r = Array(o.length), t = function(t, e) {
              r[e + h] = t
            }), a && (g(a) || (i = Object.keys(l), a = i), t(n(f.array(a)), 0), h = 1);
            var p, d = s(l);
            return "array" == d ? (g(c.cast) ? (p = Array(c.cast.length), u(c.cast, function(t, n) {
              e(t) ? p[n] = t.toLowerCase() : (p[n] = t, f[t] = t)
            })) : (p = Array(l.length), u(l, function(t, e) {
              p[e] = s(t)
            })), u(o, function(e, i) {
              var r = Array(p.length);
              u(e, function(t, e) {
                r[e] = f[p[e]](t)
              }), t(n(r), i)
            })) : "object" == d && (i = Object.keys(l), g(c.cast) ? (p = Array(c.cast.length), u(c.cast, function(t, n) {
              e(t) ? p[n] = t.toLowerCase() : (p[n] = t, f[t] = t)
            })) : (p = Array(i.length), u(i, function(t, e) {
              p[e] = s(l[t])
            })), u(o, function(e, r) {
              var o = Array(i.length);
              u(i, function(t, n) {
                o[n] = f[p[n]](e[t])
              }), t(n(o), r)
            })), r ? r.join(c.lineDelimiter) : this
          }
        }, n.prototype.forEach = function(t) {
          return this[this.mode](t)
        }, n
      }();
    return y.parse = function(t, e) {
      return new y(t, e).parse()
    }, y.encode = function(t, e) {
      return new y(t, e).encode()
    }, y.forEach = function(t, e, n) {
      return 2 == arguments.length && (n = e), new y(t, e).forEach(n)
    }, y
  });