2017年12月12日 (火)

CSV の解析

var csv_parse = function(str, tsv) {
  var src, dest, ch, pos, lno, error, sep;

  var getnext = function() {
    if (pos >= src.length) {
      error++;
      return false;
    }
    ch = src.charAt(pos++);
    return true;
  };

  var normal = function() {
    var text = ch;
    while (getnext()) {
      if (ch == sep) {
        break;
      } else if (ch == "\n") {
        dest[lno].push(text);
        dest[++lno] = [];
        return;
      } else if (ch == "\"" || (tsv && ch == ",")) {
        error++;
        break;
      } else {
        text += ch;
      }
    }
    dest[lno].push(text);
  };

  var string = function() {
    var text = '';
    while (getnext()) {
      if (ch == "\"") {
        getnext();
        if (ch == "\"") {
          text += ch;
        } else if (ch == sep) {
          break;
        } else if (ch == "\n") {
          dest[lno].push(text);
          dest[++lno] = [];
          return;
        } else {
          error++;
          break;
        }
      } else {
        text += ch;
      }
    }
    dest[lno].push(text);
  };

  var getsym = function() {
    if (!getnext()) return;
    if (ch == sep) {
      dest[lno].push("");
    } else if (ch == "\n") {
      dest[lno].push("");
      dest[++lno] = [];
    } else if (ch == "\"") {
      string();
    } else {
      normal();
    }
  };

  sep = (tsv ? "\t" : ",");
  src = str.replace(/\r?\n|\r/g, "\n");
  dest = [[]];
  lno = pos = error = 0;
  while (!error) getsym();
  return dest;
};

| | コメント (0)

2017年12月 6日 (水)

表示・非表示の期間を指定

/*
 *  term.js を使用
 *
 *  http://aok.blue.coocan.jp/html5/common/js/term.js
 *
 */

/* 表示・非表示の期間を指定 */
jQuery.fn.extend({
  term_check: function(d, h, m, s, ms) {
    return this.each(function() {
      var a = $(this).attr('data-term');
      var aa = a.split('-');
      var t = new Term(aa[0], aa[1]);
      t.extend(0, 0, d, h, m, s, ms);
      if (!t.within()) $(this).hide();
    });
  }
});
jQuery(function($) {   /* 終了日時を含めるために、1ミリ秒進める */   $('[data-term]').term_check(0,0,0,0,1); }); /* <li data-term="2017/12/6">表示開始日のみ(00:00)指定</li> <li data-term="-2017.12.6 12:00">表示終了の日時のみ指定</li> <li data-term="2017.6.28 09:00-2017.12.6 17:00">表示期間日時を指定</li> */

| | コメント (0)

2017年11月27日 (月)

Perl の tr/// もどき

/* Perl の tr/// もどき */
String.prototype.tr = function(s1, s2) {
  var _parse = function(s) {
    var a = [], f = false;
    for (var i = 0, len = s.length; i < len; i++) {
      var c = s.charAt(i);
      if (!f && c == '-') {
        f = true;
        continue;
      } else if (f) {
        var b = a.pop();
        if (b) {
          var bc = b.charCodeAt(0);
          var cc = c.charCodeAt(0);
          for (var j = bc; j < cc; j++) {
            a.push(String.fromCharCode(j));
          }
        } else {
          a.push('-');
        }
        f = false;
      }
      a.push(c);
    }
    if (f) a.push('-');
    return a;
  };
  var a1 = _parse(s1);
  var a2 = _parse(s2);
  var t = {}, s = '';
  for (var i in a1) {
    if (a2[i]) t[a1[i]] = a2[i];
  }
  for (var i = 0, len = this.length; i < len; i++) {
    var c = this.charAt(i);
    s += (t[c] ? t[c] : c);
  }
  return s;
};

| | コメント (0)

2017年11月25日 (土)

ReadOnly なプロパティ

var H = function(n) {
  this._hoge = n | 0;
};

Object.defineProperties(H.prototype, {
  'hoge': { get: function() {
    return this._hoge;
  } }
});

var x = new H('5abc');
var y = new H('30.589');
console.log(x.hoge);
console.log(y.hoge);

| | コメント (0)

2017年6月30日 (金)

ひらがなソート

/* ひらがなの濁音・半濁音を清音にする */
var voiceless_sound = function(s) {
  var a = [
    'がぎぐげござじずぜぞだぢづでどばびぶべぼ',
    'ぱぴぷぺぽ',
    'ぁぃぅぇぉっゃゅょゎ'
  ];
  var len = s.length, r = '';
  for (var i = 0; i < len; i++) {
    var c = s.charAt(i);
    if (a[0].indexOf(c) != -1)
      r += String.fromCharCode(s.charCodeAt(i)-1);
    else if (a[1].indexOf(c) != -1)
      r += String.fromCharCode(s.charCodeAt(i)-2);
    else if (a[2].indexOf(c) != -1)
      r += String.fromCharCode(s.charCodeAt(i)+1);
    else r += c;
  }
  return r;
};

/* 日本語文字列照合順番によるソート */
var hiragana_sort = function(arr) {
  return arr.sort(function(a, b) {
    var a1 = voiceless_sound(a);
    var b1 = voiceless_sound(b);
    if (a1 > b1) return 1;
    if (a1 < b1) return -1;
    if (a > b) return 1;
    if (a < b) return -1;
    return 0;
  });
};

| | コメント (0)

«階乗計算