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
|
/*
* tail -fするとカラフルなTLが流れてくるファイルを書き出すTwittperatorプラグイン
*
* let g:twittperator_plugin_colorful_log_writer = 1
* let g:twittperator_screen_name = "<YOUR_SCREEN_NAME>"
* let g:twittperator_plugin_colorful_log_writer_colored_words = "COLORED,WORDS"
* let g:twittperator_plugin_colorful_log_writer_ng_words = "NG|WORDS"
*
* twittperatorのChirpUserStreamからのデータをログに書き出す — Gist - https://gist.github.com/510138/
* twittperator.js のオレオレプラグイン — Gist - https://gist.github.com/509555
*/
let usFile = io.File("~/.userstream");
let tsFile = io.File("~/.trackingstream");
//http://archive.linux.or.jp/JM/html/LDP_man-pages/man3/strftime.3.html
let timeFormat = "%H:%M";
/*
0;30 Black
0;31 Red
0;32 Green
0;33 Yellow
0;34 Blue
0;35 Magenta
0;36 Cyan
0;37 White
*/
let color = { "reset":"\033\[0m", "me":"\033\[0;31m", "reply":"\033\[0;36m", "rt":"\033\[0;32m", "hashtag":"\033\[0;34m", "track":"\033\[0;35m" };
let screenName = liberator.globalVariables.twittperator_screen_name;
let ngWords = liberator.globalVariables.twittperator_plugin_colorful_log_writer_ng_words || '(?!)';
let JP = new RegExp("[\\u4e00-\\u9fa0\\u30A1-\\u30F6\\u30FC\\u3042-\\u3093\\u3001\\u3002\\uFF01\\uFF1F]");
//let trackWord = liberator.globalVariables.twittperator_track_words.split(",");
let trackWord = let (v = liberator.globalVariables.twittperator_plugin_colorful_log_writer_colored_words)(v ? v.split(",") : []);
for(let i = 0; i < trackWord.length; i++){
trackWord[i] = trackWord[i].replace(/\|/g, "|#?");
}
plugins.twittperator.ChirpUserStream.addListener(
function onMsg (msg, raw) {
if (msg.text && msg.user) {
if (RegExp(ngWords, 'i').test(msg.text)){ return; }
//msg内を書き換えたらえらいことになったので
let espresso = eval(uneval(msg));
//ID長を揃えるために15文字になるまでスペースで埋める
let spacer = new Array(15 - msg.user.screen_name.length).join(" ");
espresso.user.screen_name += spacer;
//改行をスペースに置換
espresso.text = espresso.text.replace(/\x0D\x0A|\x0D|\x0A/g, " ");
//自分の発言を色付け
if(msg.user.screen_name === screenName){ espresso.user.screen_name = espresso.user.screen_name.replace(screenName, color.me + screenName + color.reset); }
//自分への発言を色付けしたのち、そうじゃないツイートから誰かへの発言だと判別できるものに色付け
if(msg.in_reply_to_screen_name === screenName){ espresso.text = espresso.text.replace(/^(@\w{1,15})/, color.me + "$1" + color.reset); }
else if(msg.in_reply_to_screen_name){ espresso.text = espresso.text.replace(/^(@\w{1,15})/, color.reply + "$1" + color.reset); }
//公式RTを見つけたら色付けしたのち、そうじゃないツイートから非公式のそれらしきものも色付け
if(msg.retweeted_status){ espresso.text = espresso.text.replace(/^(RT)/, color.rt + "↻ $1" + color.reset); }
else espresso.text = espresso.text.replace(/(RT\s)/g, color.rt + "$1" + color.reset);
//ハッシュタグらしきものがあったら色付け
espresso.text = espresso.text.replace(/(#\w+)/g, color.hashtag + "$1" + color.reset);
//TrackWordに当たるものがあったら色付け ハッシュタグな場合色付け二重になっちゃってる
for(let i = 0; i < trackWord.length; i++){
let track = new RegExp("(#?" + trackWord[i] + ")", "gi");
espresso.text = espresso.text.replace(track, color.track + "$1" + color.reset);
}
usFile.write([
espresso.user.screen_name,
(new Date(msg.created_at)).toLocaleFormat(timeFormat),
espresso.text
].join("\t") + "\n", ">>");
}
}
);
plugins.twittperator.TrackingStream.addListener(
function onMsg (msg, raw) {
if (msg.text && msg.user) {
if (!JP.test(msg.text)){ return; }
if (RegExp(ngWords, 'i').test(msg.text)){ return; }
//msg内を書き換えたらえらいことになったので
let espresso = eval(uneval(msg));
//ID長を揃えるために15文字になるまでスペースで埋める
let spacer = new Array(15 - msg.user.screen_name.length).join(" ");
espresso.user.screen_name += spacer;
//改行をスペースに置換
espresso.text = espresso.text.replace(/\x0D\x0A|\x0D|\x0A/g, " ");
//自分の発言を色付け
if(msg.user.screen_name === screenName){ espresso.user.screen_name = espresso.user.screen_name.replace(screenName, color.me + screenName + color.reset); }
//自分への発言を色付けしたのち、そうじゃないツイートから誰かへの発言だと判別できるものに色付け
if(msg.in_reply_to_screen_name === screenName){ espresso.text = espresso.text.replace(/^(@\w{1,15})/, color.me + "$1" + color.reset); }
else if(msg.in_reply_to_screen_name){ espresso.text = espresso.text.replace(/^(@\w{1,15})/, color.reply + "$1" + color.reset); }
//公式RTを見つけたら色付けしたのち、そうじゃないツイートから非公式のそれらしきものも色付け
if(msg.retweeted_status){ espresso.text = espresso.text.replace(/^(RT)/, color.rt + "↻ $1" + color.reset); }
else espresso.text = espresso.text.replace(/(RT\s)/g, color.rt + "$1" + color.reset);
//ハッシュタグらしきものがあったら色付け
espresso.text = espresso.text.replace(/(#\w+)/g, color.hashtag + "$1" + color.reset);
//TrackWordに当たるものがあったら色付け ハッシュタグな場合色付け二重になっちゃってる
for(let i = 0; i < trackWord.length; i++){
let track = new RegExp("(#?" + trackWord[i] + ")", "gi");
espresso.text = espresso.text.replace(track, color.track + "$1" + color.reset);
}
tsFile.write([
espresso.user.screen_name,
(new Date(msg.created_at)).toLocaleFormat(timeFormat),
espresso.text
].join("\t") + "\n", ">>");
}
}
);
// vim: sw=2 ts=2 et fdm=marker ft=javascript:
|