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:

nts.interfaces.nsIURI){ uri = css; } if (!uri) return false; if (sss.sheetRegistered(uri, sss.USER_SHEET)) sss.unregisterSheet(uri, sss.USER_SHEET); if (options.verbose > 8) log('Unresisted colorschema '+css); return true; }, list: function(isAltanative){ var str = []; if (isAltanative){ str.push('<span class="hl-Title">Alternative StyleSheet List</span>'); getStylesheetList().forEach(function(elm, i){ var buf = ' ' + (i+1) + ' '; if (elm[1]){ buf += '<span style="color:blue">*</span>'; } else { buf += ' '; } str.push(buf + ' ' + elm[0]); });; if (str.length == 1) str = ['Alternative StyleSheet is none.']; } else { str.push('<span class="hl-Title">User StyleSheet List</span>'); var files = getCSSFiles().map(function(file) file.leafName.replace(/\.css$/i, '')); files.forEach(function(file, i){ var buf = ' ' + (i+1) + ' '; if (sss.sheetRegistered(getURIFromName(file), sss.USER_SHEET)){ buf += '<span style="color:blue">*</span>'; } else { buf += ' '; } str.push(buf +' ' + file); }); } echo(str.join('\n'), true); }, get highlightList(){ return CSSData; } }; commands.addUserCommand(['altcolo[rschema]'], 'set alternativeStyleSheet', function(arg){ if (!arg){ manager.list(true); return; } else if (getStylesheetList().some(function(elm) elm[0] == arg)){ stylesheetSwitchAll(window.content, arg); setStyleDisabled(false); } }, { completer: function(aFilter){ var styles = getStylesheetList().map(function(elm) [elm[0], elm[1] ? '* ' : ' ' + 'alternative style']); if (!aFilter) return [0, styles]; var candidates = styles.filter(function(elm) elm[0].indexOf(aFilter) == 0); return [0, candidates]; } } ); commands.addUserCommand(['colo[rschema]'], 'set user stylesheet', function(arg, special){ if (!arg){ manager.list(false); return; } if (special){ manager.unload(arg) && echo('Unredisted '+arg); } else { manager.load(arg) && echo('Redisted '+arg); } }, { completer: function(filter, special){ var list = getCSSFiles().map(function(file){ var name = file.leafName.replace(/\.css$/i, ''); return [name, sss.sheetRegistered(getURIFromName(name), sss.USER_SHEET) ? '*' : '']; }); if (!filter) return [0, list]; var candidates = []; list.forEach(function(item){ if (item[0].toLowerCase().indexOf(filter) == 0){ candidates.push(item); } }); return [0, candidates]; }, bang: true } ); var CSSData = {}; commands.addUserCommand(['hi[ghlight]'], 'temporary style changer', function(args){ if (args.arguments.length == 0){ var str = ['show highlight list']; for (let name in CSSData){ str.push('<span class="hl-Title">' + name + '</span>'); str.push(CSSData[name]); } echo(str.join('\n'), true); } else if (args.arguments.length == 1){ var arg = args.arguments[0]; if (arg == 'clear'){ for (let name in CSSData){ manager.unload(getURIFromCSS(CSSData[name])); delete CSSData[name]; } } else if (arg in CSSData){ echo('<span class="hl-Title">' + rel.args[0] + '</span>\n' + CSSData[rel.args[0]], true); } } else if (args.arguments.length > 1){ var groupName = args.arguments.shift(); if (groupName == 'clear'){ args.arguments.forEach(function(name){ if (name in CSSData){ manager.unload(getURIFromCSS(CSSData[name])); delete CSSData[name]; } }); } else { if (groupName in CSSData) manager.unload(getURIFromCSS(CSSData[groupName])); CSSData[groupName] = args.arguments.join(' '); manager.load(getURIFromCSS(CSSData[groupName])); } } }, { completer: function(aFilter){ var rel = commands.parseArgs(aFilter, null, '*'); var list1 = [['clear', 'clear all or specified group']]; var list2 = []; if (!rel){ for (let name in CSSData){ list2.push([name, CSSData[name]]); } return [0, list1.concat(list2)]; } if (rel.arguments.length == 2 && rel.arguments[0] == 'clear'){ for (let name in CSSData){ if (name.indexOf(rel.arguments[1]) == 0) list2.push([name, CSSData[name]]); } return [6, list2]; } else if (rel.args.length == 1){ for (let name in CSSData){ if (name.indexOf(rel.arguments[0]) == 0) list2.push([name, CSSData[name]]); } if ('clear'.indexOf(rel.arguments[0]) == 0) return [0, list1.concat(list2)]; else return [0, list2]; } }, argCount: '*' } ); init(); return manager; })(); })(); // vim: sw=4 ts=4 sts=0 fdm=marker: