aboutsummaryrefslogtreecommitdiffstats
path: root/clock.js
blob: 8ffcba81dafe0cbb412a324a182859999a70c14e (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
var PLUGIN_INFO =
<VimperatorPlugin>
  <name>AppLauncher</name>
  <name lang='ja'>アプリケーションランチャー</name>
  <description>Launch defined application</description>
  <description lang='ja'>アプリケーションを起動します</description>
  <version>0.12</version>
  <author>pekepeke</author>
  <minVersion>2.0pre</minVersion>
  <maxVersion>2.0pre</maxVersion>
  <updateURL>https://github.com/vimpr/vimperator-plugins/raw/master/applauncher.js</updateURL>
  <detail lang='ja'><![CDATA[
  == Commands ==
    :applaunch [name]:
    :runapp [name]:
      [name] で指定されたアプリケーションを起動します
  == .vimperatorrc example ==
    >||
    js <<EOM
    liberator.globalVariables.applauncher_list = [
      [ 'name', 'application path', ['arguments', '%URL%', '%SEL%']],
      [ 'Internet Explorer', 'C:\\Program Files\\Internet Explorer\\iexplore.exe', '%URL%'],
      [ 'Internet Explorer(Search)', 'C:\\Program Files\\Internet Explorer\\iexplore.exe', '%SEL%'],
    ];
    liberator.globalVariables.applauncher_charset = 'Shift_JIS';
    EOM
    ||<
    %URL% は実行時に選択中のリンクURLもしくは開いているページのURLに置き換えられます
    %SEL% は選択中の文字列に置き換えられます
    %TITLE% はページのタイトルに置き換えられます
    引数を複数指定する場合は配列形式で指定してください
    applauncher_charset を指定すると渡される文字列が指定の文字セットに変換されます
  ]]></detail>
</VimperatorPlugin>

liberator.plugins.AppLauncher = (function(){
  const UConv = Cc['@mozilla.org/intl/scriptableunicodeconverter'].getService(Ci.nsIScriptableUnicodeConverter);
  const AppName = 'AppLauncher';

  var global = liberator.globalVariables;
  var settings = global.applauncher_list || [];
  var defaultCharset = global.applauncher_charset;
  if (!settings || settingslet PLUGIN_INFO =
<VimperatorPlugin>
<name>{NAME}</name>
<description>clock</description>
<description lang="ja">とけい</description>
<author mail="janus_wel@fb3.so-net.ne.jp" homepage="http://d.hatena.ne.jp/janus_wel">janus_wel</author>
<license document="http://www.opensource.org/licenses/bsd-license.php">New BSD License</license>
<version>0.15.2</version>
<minVersion>2.0pre</minVersion>
<maxVersion>2.2pre</maxVersion>
<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/clock.js</updateURL>
<detail><![CDATA[
== USAGE ==
you can customize below variable.

clock_format: clock format. default is '[%t]'. available below special tokens.
%t:
    time hh:mm
%d:
    day  MM/DD
%y:
    year YYYY
%a:
    A abbreviation for the day of the week.

refer:
    http://d.hatena.ne.jp/janus_wel/20081128/1227849365

== EX-COMMANDS ==
:clockhide:
    hide clock
:clockappear:
    appear clock
:clockstop:
    stop clock
:clockstart:
    start clock
:clockjustify:
    justify clock position

== EXAMPLE ==
in .vimperatorrc

>||
let clock_format='(%t %d)'
||<

this exapmple show clock like below

>||
(20:34 12/12)
||<

]]></detail>
<detail lang="ja"><![CDATA[
== USAGE ==
以下の設定を変更することができます

clock_format: 時計の書式設定なしの場合 '[%t]' として扱われます以下の特殊な識別子が使えます
%t:
    時間 hh:mm 形式
%d:
    月日 MM/DD 形式
%y:
    西暦年 YYYY 形式
%a:
    曜日

参考:
    http://d.hatena.ne.jp/janus_wel/20081128/1227849365

== EX-COMMANDS ==
:clockhide:
    時計を隠します
:clockappear:
    時計を出します
:clockstop:
    時計を止めます
:clockstart:
    時計を動かします
:clockjustify:
    時計の位置を調節します

== EXAMPLE ==
.vimperatorrc 

>||
let clock_format='(%t %d)'
||<

と書くと以下のように表示されます

>||
(20:34 12/12)
||<

]]></detail>
</VimperatorPlugin>;

( function () {

// definitions ---
// default settings
const format = liberator.globalVariables.clock_format || '[%t]';

// class definitions
function Clock() {
    this._initialize.apply(this, arguments);
}
Clock.prototype = {
    _initialize: function (format) {
        this._format = format;
        this._master = window.document.createElement('label');
        this._master.setAttribute('style', this._constants.style);

        this._intervalInfo = {};
    },

    _constants: {
        // default style
        style: [
            'margin: 0;',
            'padding: 1px;',
            'border: 0 none;',
            'color: black;',
            'background-color: white;',
            'font-family: monospace;',
            'font-weight: bold;',
        ].join(''),

        // prefix of id and class name
        prefix: 'liberator-plugin-clock-',

        driver: {
            t: function (label) {
                return setInterval(function () label.setAttribute('value', time()), 100);
            },
            a: function (label) {
                return setInterval(function () label.setAttribute('value', weekDay()), 60 * 1000);
            },
            d: function (label) {
                return setInterval(function () label.setAttribute('value', day()), 60 * 1000);
            },
            y: function (label) {
                return setInterval(function () label.setAttribute('value', year()), 60 * 1000);
            },
        },

        generator: {
            t: function (self) {
                let l = self._master.cloneNode(false);
                l.setAttribute('id', self._constants.prefix + 'clock');
                l.setAttribute('value', time());
                let id = self._constants.driver.t(l);
                return {
                    node: l,
                    intervalId: id,
                };
            },
            a: function (self) {
                let l = self._master.cloneNode(false);
                l.setAttribute('id', self._constants.prefix + 'wday');
                l.setAttribute('value', weekDay());
                let id = self._constants.driver.a(l);
                return {
                    node: l,
                    intervalId: id,
                };
            },
            d: function (self) {
                let l = self._master.cloneNode(false);
                l.setAttribute('id', self._constants.prefix + 'day');
                l.setAttribute('value', day());
                let id = self._constants.driver.d(l);
                return {
                    node: l,
                    intervalId: id,
                };
            },
            y: function (self) {
                let l = self._master.cloneNode(false);
                l.setAttribute('id', self._constants.prefix + 'year');
                l.setAttribute('value', year());
                let id = self._constants.driver.y(l);
                return {
                    node: l,
                    intervalId: id,
                };
            },
            raw: function (self, str) {
                let l = self._master.cloneNode(false);
                l.setAttribute('class', self._constants.prefix + 'raw');
                l.setAttribute('value', str);
                return {
                    node: l,
                };
            },
        },
    },

    // generate
    generate: function () {
        let box = window.document.createElement('hbox');
        box.setAttribute('id', this._constants.prefix + 'box');
        box.setAttribute('style', 'display: block;');
        box.setAttribute('class', 'liberator-container');
        let format = this._format;
        let generator = this._constants.generator;

        let raw = '';
        let formatFlag = false;
        for (let i=0, l=format.length ; i<l ; ++i) {
            let c = format[i];
            switch(c) {
                case '%':
                    formatFlag = true;
                    if (raw) {
                        box.appendChild(generator['raw'](this, raw).node);
                        raw = '';
                    }
                    break;
                default:
                    if (formatFlag) {
                        if (c in generator) {
                            let g = generator[c](this);
                            box.appendChild(g.node);
                            if (g.intervalId) this._intervalInfo[c] = g;
                        }
                        formatFlag = false;
                    }
                    else {
                        raw += c;
                    }
                    break;
            }
        }
        if (raw.length > 0) box.appendChild(generator['raw'](this, raw).node);

        this._box = box;
    },

    get instance() this._box,
    get width() this._box.boxObject.width,

    hide:   function () this._box.setAttribute('style', 'display: none;'),
    appear: function () this._box.setAttribute('style', 'display: block;'),

    justify: function (parentWidth) this._box.setAttribute('left', parentWidth - this.width),

    start: function () {
        let info = this._intervalInfo;
        for (let [k, i] in Iterator(info)) {
            if (!i.intervalId) {
                i.intervalId = this._constants.driver[k](i.node);
            }
        }
    },
    stop: function () {
        let info = this._intervalInfo;
        for (let [k, i] in Iterator(info)) {
            if (i.intervalId) {
                clearInterval(i.intervalId);
                i.intervalId = undefined;
            }
        }
    },
};


// main ---
let commandlineStack = getCommandlineStack();
if (!commandlineStack) {
    let errmsg = 'clock.js: not found the commandline.';
    liberator.log(errmsg, 0);
    liberator.echoerr(errmsg);
    return;
}

// build clock
let clock = new Clock(format);
clock.generate();

// insert
commandlineStack.appendChild(clock.instance);

// register command
[
    [['clockhide'],    'hide clock',   function () clock.hide()   ],
    [['clockappear'],  'clock appear', function () clock.appear() ],
    [['clockstart'],   'start clock',  function () clock.start()  ],
    [['clockstop'],    'stop clock',   function () clock.stop()   ],
    [['clockjustify'], 'justify',      function () clock.justify(window.innerWidth) ],
].forEach( function ([n, d, f]) commands.addUserCommand(n, d, f, {}) );

window.addEventListener(
    'resize',
    function () {
        clock.justify(window.innerWidth);
    },
    false
);

autocommands.add(
    'VimperatorEnter',
    /.*/,
    function () {
        clock.justify(window.innerWidth);
    }
);

// stuff functions ---
function time() {
    let now = new Date();
    let hour = now.getHours().toString(10);
    let min  = now.getMinutes().toString(10);
    if (hour.length < 2) hour = '0' + hour;
    if (min.length < 2)  min  = '0' + min;
    return hour + (now.getMilliseconds() < 400 ? ' ' : ':') + min;
}
function weekDay() {
    const wdays = 'sun mon tue wed thu fri sat'.split(/%s/);
    let now = new Date();
    return now.toLocaleFormat ? now.toLocaleFormat('%a')
                              : wdays[now.getDay()];
}
function day() {
    let now = new Date();
    let date  = now.getDate().toString(10);
    let month = (now.getMonth() + 1).toString(10);
    if (date.length < 2)  date  = '0' + date;
    if (month.length < 2) month = '0' + month;
    return month + '/' + date;
}
function year() {
    return new Date().getFullYear().toString(10);
}

// node control
function getCommandlineStack() {
    let messageTextarea = window.document.getElementById('liberator-message');
    let commandlineStack = messageTextarea.parentNode;
    return commandlineStack.localName === 'stack' ? commandlineStack : null;
}

} )();

// vim: set sw=4 ts=4 et;