aboutsummaryrefslogtreecommitdiffstats
path: root/notifier/subject_weather_yahoo.js
blob: 72bcaa0f9b9e61b9c0118c2ce3912d6e3f863770 (plain)
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
/*** BEGIN LICENSE BLOCK {{{
  Copyright (c) 2008 suVene<suvene@zeromemory.info>

  distributable under the terms of an MIT-style license.
  http://www.opensource.jp/licenses/mit-license.html
}}}  END LICENSE BLOCK ***/
// PLUGIN_INFO//{{
var PLUGIN_INFO =
<VimperatorPlugin>
  <name>{NAME}</name>
  <description>Yahoo! Weather forecast notice.</description>
  <description lang="ja">Yahoo!天気予報通知</description>
  <author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
  <version>0.1.3</version>
  <license>MIT</license>
  <minVersion>2.0pre</minVersion>
  <maxVersion>2.0pre</maxVersion>
  <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/notifier/subject_weather_yahoo.js</updateURL>
  <detail><![CDATA[
== Options ==
>||
liberator.globalVariables.subject_weather_yahoo_urls = [url1, url2,]
||<
- @see http://weather.yahoo.co.jp/weather/
  ]]></detail>
</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");

var URLs = liberator.globalVariables.subject_weather_yahoo_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 yjw_pinpoint_today 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%";
      table.style.color = "#222";
      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 df = window.content.document.createDocumentFragment();
      df.appendChild(parsed[0]);
      df.appendChild(cloneTable);

      var next = new Date();
      next.setHours(now.getHours() + 1)
      next.setMinutes(0);
      next.setSeconds(30);
      this.interval = (next.getTime() - now.getTime()) / 1000;

      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)
      new notifier.Message("Weather forecast by Yahoo!", $U.xmlSerialize(diff), url)
  });
});

})();
// vim: set fdm=marker sw=2 ts=2 sts=0 et: