aboutsummaryrefslogtreecommitdiffstats
path: root/notifier
diff options
context:
space:
mode:
authorsuVene2008-12-18 13:34:41 +0000
committersuVene2008-12-18 13:34:41 +0000
commitd6f0e829fb8f2bd1783f2cc4b64ece322b2e2620 (patch)
treec085d15a2a1d22e673287d28541cfe43a99097eb /notifier
parent9191445073dc2b66b6f37399ecfc43c03d6d5e09 (diff)
downloadvimperator-plugins-d6f0e829fb8f2bd1783f2cc4b64ece322b2e2620.tar.bz2
* add subject_weather_yahoo.js.
* observer_growl.js のオプション設定. * css微調整. * etc. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27023 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'notifier')
-rw-r--r--notifier/growl.css4
-rw-r--r--notifier/observer_growl.js65
-rw-r--r--notifier/subject_hatelabo_bottle.js4
-rwxr-xr-xnotifier/subject_weather_yahoo.js101
4 files changed, 155 insertions, 19 deletions
diff --git a/notifier/growl.css b/notifier/growl.css
index 0912af4..d67b681 100644
--- a/notifier/growl.css
+++ b/notifier/growl.css
@@ -65,11 +65,11 @@ div.observer_growl div.observer_growl_notification div.header {
font-size: 10px;
}
-div.observer_growl div.observer_growl_notification div.header a:link {
+div.observer_growl div.observer_growl_notification a:link {
color: #EF6D29;
}
-div.observer_growl div.observer_growl_notification div.header a:hover {
+div.observer_growl div.observer_growl_notification a:visited {
color: #A50000;
}
diff --git a/notifier/observer_growl.js b/notifier/observer_growl.js
index 9fb8f88..f26c850 100644
--- a/notifier/observer_growl.js
+++ b/notifier/observer_growl.js
@@ -8,6 +8,37 @@ var PLUGIN_INFO =
<version>0.1.1</version>
<minVersion>2.0pre</minVersion>
<maxVersion>2.0pre</maxVersion>
+ <detail><![CDATA[
+== Settings ==
+>||
+liberator.globalVariables.observer_growl_settings = {
+ 'message title': {
+ life: number, // sec (10 sec by default)
+ sticky: bool, // true or false (false by default)
+ sticky_keyword: [ // keyword ary
+ 'keyword1',
+ 'keyword2'
+ ],
+ hide: bool // true or false (false by default)
+ // however it's displayed when there is a keyword in the message.
+ }
+};
+||<
+e.g.)
+>||
+javascript <<EOM
+liberator.globalVariables.observer_growl_settings = {
+ 'Hatelabo bottle': { life: 20, keyword: 'はてな' },
+ 'Weather forecast by Yahoo!': { sticky: true }
+};
+EOM
+||<
+
+== Todo ==
+- sticky_keyword
+- hide
+- close all
+ ]]></detail>
</VimperatorPlugin>;
//}}}
(function() {
@@ -24,19 +55,21 @@ var Growl = function() {//{{{
};
Growl.prototype = {
defaults: {
- life: 10000
+ life: 10,
+ sticky: false,
+ suticky_keyword: [],
+ hide: false,
},
- initialize: function(dom, container, options) {
- this.dom = dom;
+ initialize: function(node, container, options) {
+ this.node = node;
this.container = container;
this.created = new Date();
this.options = $U.extend(this.defaults, (options || {}));
- this.life = this.options.life;
- dom.childNodes[0].addEventListener("click", $U.bind(this, this.remove), false);
+ node.childNodes[0].addEventListener("click", $U.bind(this, this.remove), false);
},
remove: function() {
// TODO: animation!!!!
- this.container.removeChild(this.dom);
+ this.container.removeChild(this.node);
},
};//}}}
@@ -44,6 +77,7 @@ Growl.prototype = {
notifier.observer.register(notifier.Observer, {
initialize: function () {
this.count = 1;
+ this.settings;
io.getRuntimeDirectories('').forEach(function(dir) {
var path = io.expandPath(dir.path + '/plugin/notifier');
@@ -56,6 +90,8 @@ notifier.observer.register(notifier.Observer, {
}
});
});
+
+ this.settings = liberator.globalVariables.observer_growl_settings || {};
},
update: function(message) {
@@ -68,7 +104,7 @@ notifier.observer.register(notifier.Observer, {
var notification = this.createPopup(message, doc, container);
// TODO: animation!!!
- var node = doc.importNode(notification, true);
+ //container.appendChild(doc.importNode(notification, true));
container.appendChild(notification);
if (container.childNodes.length == 1) {
@@ -78,8 +114,8 @@ notifier.observer.register(notifier.Observer, {
this.count++;
},
- createPopup: function(message, doc, nodes) {
- var dom;
+ createPopup: function(message, doc, container) {
+ var node;
var html =
<div class="observer_growl_notification" style="display: block;">
<div class="close">&#215;</div>
@@ -90,11 +126,9 @@ notifier.observer.register(notifier.Observer, {
)}</div>
<div class="message">{new XMLList(message.message || '')}</div>
</div>;
- dom = $U.xmlToDom(html, doc, nodes);
- // TODO: get settings
- var options = {};
- dom.__data__ = new Growl(dom, nodes, {});
- return dom;
+ node = $U.xmlToDom(html, doc);
+ node.__data__ = new Growl(node, container, this.settings[message.title]);
+ return node;
},
checkStatus: function() {
@@ -107,7 +141,8 @@ notifier.observer.register(notifier.Observer, {
let item = container.childNodes[i];
let growl = item.__data__;
if (growl && growl.created &&
- growl.created.getTime() + growl.life < (new Date()).getTime()) {
+ !growl.options.sticky &&
+ growl.created.getTime() + (growl.options.life * 1000) < (new Date()).getTime()) {
removeNodes.push(item);
}
}
diff --git a/notifier/subject_hatelabo_bottle.js b/notifier/subject_hatelabo_bottle.js
index 71a5a27..a21f22f 100644
--- a/notifier/subject_hatelabo_bottle.js
+++ b/notifier/subject_hatelabo_bottle.js
@@ -2,7 +2,7 @@
var PLUGIN_INFO =
<VimperatorPlugin>
<name>{NAME}</name>
- <description>notifies if hatena bottle was changed.</description>
+ <description>hatena bottle change notice.</description>
<description lang="ja">はてなボトルの変更通知。</description>
<author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
<version>0.1.1</version>
@@ -44,7 +44,7 @@ notifier.subject.register(notifier.SubjectHttp, {
var permalink = $U.getNodesFromXPath('descendant::a[@class="hatena-star-uri"]', d);
if (permalink.length > 0)
permalink = URL + permalink[0];
- return new notifier.Message('Hatelab bottle', $U.xmlSerialize(d), permalink)
+ return new notifier.Message('Hatelabo bottle', $U.xmlSerialize(d), permalink)
}));
}
});
diff --git a/notifier/subject_weather_yahoo.js b/notifier/subject_weather_yahoo.js
new file mode 100755
index 0000000..96f23d0
--- /dev/null
+++ b/notifier/subject_weather_yahoo.js
@@ -0,0 +1,101 @@
+// PLUGIN_INFO//{{
+var PLUGIN_INFO =
+<VimperatorPlugin>
+ <name>{NAME}</name>
+ <description>yahoo weather forecast notice.</description>
+ <description lang="ja">ヤフー天気予報通知。</description>
+ <author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
+ <version>0.1.0</version>
+ <minVersion>2.0pre</minVersion>
+ <maxVersion>2.0pre</maxVersion>
+</VimperatorPlugin>;
+//}}}
+(function() {
+
+var notifier = liberator.plugins.notifier;
+if (!notifier) return;
+
+var libly = notifier.libly;
+var $U = libly.$U;
+var logger = $U.getLogger('subject_weather_yahoo');
+
+// @see http://weather.yahoo.co.jp/weather/
+var URLs = [
+ 'http://weather.yahoo.co.jp/weather/jp/27/6200/27127/5300001.html',
+ 'http://weather.yahoo.co.jp/weather/jp/13/4410/13113/1500001.html'
+];
+
+URLs.forEach(function(url) {
+ notifier.subject.register(notifier.SubjectHttp, {
+ interval: 10,
+ options: {
+ url: url,
+ headers: null,
+ extra: { encoding: 'euc-jp' }
+ },
+ parse: function(res) {
+ var parsed = res.getHTMLDocument(
+ 'id("cat-pass") | id("yjw_pinpoint_today") | id("yjw_pinpoint_tomorrow")'
+ );
+ if (!parsed.length) return;
+
+ var now = new Date();
+ var hours = now.getHours();
+ var start = Math.floor(hours / 3) + 1;
+ var yahooToday = $U.getFirstNodeFromXPath('descendant::h3/span/text()', parsed[1]);
+ yahooToday = yahooToday.textContent.replace(/.*\u6708(\d+)\u65E5.*/, '$1'); // 月($1)日
+ var source, cloneTable;
+
+
+ if (yahooToday == now.getDate()) {
+ source = parsed[1];
+ } else {
+ source = parsed[2];
+ }
+
+ var table = $U.getFirstNodeFromXPath('descendant::table', source);
+ table.style.width = '95%';
+ var cloneTable = table.cloneNode(false);
+ this.cloneTable(cloneTable, table, start, start + 3, true);
+
+ // concat tommorow
+ if (start > 6)
+ this.cloneTable(cloneTable,
+ $U.getFirstNodeFromXPath('descendant::table', parsed[2]),
+ 1, (3 - (8 - start)), false);
+
+ var next = new Date();
+ next.setHours(now.getHours() + 1)
+ next.setMinutes(0);
+ next.setSeconds(0);
+ this.interval = (next.getTime() - now.getTime()) / 1000;
+
+ var df = window.content.document.createDocumentFragment();
+ df.appendChild(parsed[0]);
+ df.appendChild(cloneTable);
+ return df;
+ },
+ cloneTable: function(source, table, start, end, withHead) {
+ var rows = table.getElementsByTagName('tr');
+ for (let r = 0, len = rows.length; r < len; r++) {
+ let row = withHead ? rows[r].cloneNode(false) : source.getElementsByTagName('tr')[r];
+ let cols = rows[r].getElementsByTagName('td');
+ if (withHead)
+ source.appendChild(row);
+ for (let c = 0, len2 = cols.length; c < len2; c++) {
+ if ((withHead && c == 0) || (start <= c && c < end)) {
+ row.appendChild(cols[c].cloneNode(true));
+ }
+ }
+ }
+ return source;
+ },
+ buildMessages: function(diff) {
+ return new notifier.Message('Weather forecast by Yahoo!', $U.xmlSerialize(diff), url);
+ }
+ });
+});
+
+})();
+// vim: set fdm=marker sw=4 ts=4 sts=0 et:
+