File: draft.js

package info (click to toggle)
tdiary 5.0.11-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,852 kB
  • sloc: ruby: 22,925; xml: 325; makefile: 16; sh: 10
file content (149 lines) | stat: -rw-r--r-- 4,310 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
 * draft.js: save draft data to Web Storage automatically
 * 
 * Copyright (c) MATSUOKA Kohei <http://www.machu.jp/>
 * Distributed under the GPL2 or any later version.
 */
$(function() {

if (!localStorage) { return; }

var Draft = function(storage, text) {
  // 保存先のストレージ
  this.storage = storage;
  // 下書きの保存件数
  this.maxCount = 10;
  // 下書き一覧
  this.items = [];

  this.initialize(text);
};

Draft.prototype = {
  // ローカルストレージから下書きを読み込む
  initialize: function(text) {
    this.items = this.storage.drafts ? JSON.parse(this.storage.drafts) : new Array();
    // 下書きに空の日記・テキストエリアと同じ日記が存在すれば削除する
    this.items = $.grep(this.items, function(item, index) {
      // 改行と空白文字を無視して比較(プレビュー時に末尾へ改行が付加されるため)
      if (item.value == "" || DraftUtils.trim(item.value) == DraftUtils.trim(text)) {
        return false;
      }
      return true;
    });
    this.save(text, true);
    // console.log("Draft.initialized");
  },

  // ローカルストレージに下書きを保存する
  // append が true の場合は、下書き一覧の末尾に追加する
  // append が false の場合は、最後の下書きに上書きする
  save: function(text, append) {
    if (!append) {
      this.items.pop();
    }
    this.items.push({
      date: new Date().getTime(),
      value: text
    });
    // 最大でmaxCount件数の履歴を保持
    if (this.items.length > this.maxCount) {
      this.items.shift();
    }
    this.storage.drafts = JSON.stringify(this.items);
  },

  // 下書き一覧から index 番目の下書きを取得する
  // 取得した下書きは一覧の末尾に移動する
  load: function(index) {
    var item = this.items.splice(index, 1)[0];
    this.items.push(item);
    return item.value;
  },

  // 下書きのタイトル一覧の配列を返す(表示用)
  // タイトルは textarea の先頭1行目 + 更新日時
  titles: function() {
    return $.map(this.items, function(item) {
      var date = new Date(item.date);
      date = DraftUtils.dateToString(date);
      var title = "No-Name";
      if (item.value && typeof item.value == "string") {
        title = item.value.match(/.*/)[0];
      }
      return title + " (" + date + ")";
    });
  }

};

// ユーティリティ関数
var DraftUtils = {
  // 日付を YYYY-mm-dd HH:MM:SS 形式に変換する
  dateToString: function(date) {
      var d = date || new Date();
      var year = d.getFullYear();
      var month = zp(d.getMonth() + 1);
      date = zp(d.getDate());
      var hour = zp(d.getHours());
      var min = zp(d.getMinutes());
      var sec = zp(d.getSeconds());
      return year + "-" + month + "-" + date + " " + hour + ":" + min + ":" + sec;

      function zp(s, l) {
        s = String(s); l = l || 2;
        while (s.length < l) { s = "0" + s; }
        return s;
      }
  },
  // 文字列から改行と空白文字を取り除く
  trim: function(str) {
    return str.replace(/\s+/g, "");
  }
};

// ---------------------------------------
// ここからDOMの初期化処理
// ---------------------------------------

// 保存対象のテキストエリア
var textarea = $("[name=body]");
// 下書き一覧を表示するセレクトボックス
var select = $("[name=drafts]");
// 自動保存の間隔(ミリ秒)
var autoSaveInterval = 5 * 1000;

var draft = new Draft(localStorage, textarea.val());

// 下書き保存
saveDraft = function() {
  draft.save(textarea.val());
  showSelectForm(true);
};
// 下書き読み込み
loadDraft = function() {
  textarea.val(draft.load(select.val()));
  showSelectForm(false);
};
// 下書き選択用のセレクトボックスを描画
showSelectForm = function(keepIndex) {
  var index = select.val();
  select.empty();
  $.each(draft.titles(), function(i, title) {
    select.append($("<option/>").attr("value", i).text(title));
    select.val(i);
  });
  if (keepIndex) {
    select.val(index);
  }
};

// DOMイベント設定
$("#draft_load").click(loadDraft);
setInterval(saveDraft, autoSaveInterval);
textarea.change(saveDraft);

showSelectForm(false);
// console.log("ready");

});