aboutsummaryrefslogtreecommitdiffstats
path: root/stella.js
diff options
context:
space:
mode:
Diffstat (limited to 'stella.js')
-rw-r--r--stella.js129
1 files changed, 70 insertions, 59 deletions
diff --git a/stella.js b/stella.js
index cd227f4..7eb6c20 100644
--- a/stella.js
+++ b/stella.js
@@ -73,9 +73,20 @@ var PLUGIN_INFO =
</VimperatorPlugin>;
// TODO
-// Icons
-// Other video hosting websites
-// auto fullscreen
+// ・Icons
+// ・Other video hosting websites
+// ・auto fullscreen
+// ・動的な command の追加削除 (nice rabbit!)
+// ・ツールチップみたいな物で、マウスオー馬したときに動画情報を得られるようにしておく。
+// ・外から呼ぶべきでない関数(プライベート)をわかりやすくしたい
+// ・argCount の指定が適当なのを修正 (動的な userCommand と平行でうまくできそう?)
+// ・実際のプレイヤーが表示されるまで待機できようにしたい(未表示に時にフルスクリーン化すると…)
+// ・関連動画まわりがイマイチな仕様
+//
+// MEMO
+// ・prototype での定義順: 単純な値 initialize finalize (get|set)ter メソッド
+// ・関数やプロパティは基本的にアルファベット順にならべる。
+//
//
// Link:
// http://d.hatena.ne.jp/nokturnalmortum/
@@ -142,11 +153,44 @@ var PLUGIN_INFO =
return true;
}
+ function fixDoubleClick (obj, click, dblClick) {
+ let clicked = 0;
+ let original = {click: obj[click], dblClick: obj[dblClick]};
+ obj[click] = function () {
+ let self = this, args = arguments;
+ let _clicked = ++clicked;
+ setTimeout(function () {
+ if (_clicked == clicked--)
+ original.click.apply(self, args);
+ else
+ clicked = 0;
+ }, DOUBLE_CLICK_INTERVAL);
+ };
+ obj[dblClick] = function () {
+ clicked = 0;
+ original.dblClick.apply(this, arguments);
+ };
+ }
+
function fixFilename (filename) {
const badChars = /[\\\/:;*?"<>|]/g;
return filename.replace(badChars, '_');
}
+ // 上手い具合に秒数に直すよ
+ function fromTimeCode (code) {
+ var m;
+ if (m = /^(([-+]?)\d+):(\d+)$/(code))
+ return parseInt(m[1], 10) * 60 + (m[2] == '-' ? -1 : 1) * parseInt(m[3], 10);
+ if (m = /^([-+]?\d+\.\d+)$/(code))
+ return Math.round(parseFloat(m[1], 10) * 60);
+ return parseInt(code, 10);
+ }
+
+ function getElementByIdEx (id)
+ let (p = content.document.getElementById(id))
+ (p && (p.wrappedJSObject || p));
+
function httpRequest (uri, onComplete) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
@@ -183,24 +227,6 @@ var PLUGIN_INFO =
return url;
}
- let raise = InVimperator ? function (error) {throw new Error(error)}
- : function (error) liberator.echoerr(error);
-
- function toTimeCode(v)
- (isNum(v) ? (parseInt((v / 60)) + ':' + lz(v % 60, 2))
- : '??:??');
-
- function storeStyle (target, values, overwrite) {
- let [style, cstyle] = [target.style, content.getComputedStyle(target, '')];
- let backup = {};
- for (let [name, value] in Iterator(values)) {
- backup[name] = cstyle[name];
- style[name] = value;
- }
- if (overwrite || !style.__stella_backup)
- style.__stella_backup = backup;
- }
-
function restoreStyle (target, doDelete) {
let style = target.style;
if (!style.__stella_backup)
@@ -212,38 +238,23 @@ var PLUGIN_INFO =
delete style.__stella_backup;
}
- function getElementByIdEx (id)
- let (p = content.document.getElementById(id))
- (p && (p.wrappedJSObject || p));
-
- function fixDoubleClick (obj, click, dblClick) {
- let clicked = 0;
- let original = {click: obj[click], dblClick: obj[dblClick]};
- obj[click] = function () {
- let self = this, args = arguments;
- let _clicked = ++clicked;
- setTimeout(function () {
- if (_clicked == clicked--)
- original.click.apply(self, args);
- else
- clicked = 0;
- }, DOUBLE_CLICK_INTERVAL);
- };
- obj[dblClick] = function () {
- clicked = 0;
- original.dblClick.apply(this, arguments);
- };
+ function storeStyle (target, values, overwrite) {
+ let [style, cstyle] = [target.style, content.getComputedStyle(target, '')];
+ let backup = {};
+ for (let [name, value] in Iterator(values)) {
+ backup[name] = cstyle[name];
+ style[name] = value;
+ }
+ if (overwrite || !style.__stella_backup)
+ style.__stella_backup = backup;
}
- // 上手い具合に病数に直すよ
- function fromTimeCode (code) {
- var m;
- if (m = /^(([-+]?)\d+):(\d+)$/(code))
- return parseInt(m[1], 10) * 60 + (m[2] == '-' ? -1 : 1) * parseInt(m[3], 10);
- if (m = /^([-+]?\d+\.\d+)$/(code))
- return Math.round(parseFloat(m[1], 10) * 60);
- return parseInt(code, 10);
- }
+ function toTimeCode(v)
+ (isNum(v) ? (parseInt((v / 60)) + ':' + lz(v % 60, 2))
+ : '??:??');
+
+ let raise = InVimperator ? function (error) {throw new Error(error)}
+ : function (error) liberator.echoerr(error);
// }}}
@@ -272,14 +283,14 @@ var PLUGIN_INFO =
this.functions.large = this.functions.fullscreen;
}
- Player.ST_PLAYING = 'playing';
- Player.ST_PAUSED = 'paused';
Player.ST_ENDED = 'ended';
Player.ST_OTHER = 'other';
+ Player.ST_PAUSED = 'paused';
+ Player.ST_PLAYING = 'playing';
- Player.REL_TAG = 'tag';
Player.REL_ID = 'id';
Player.REL_SEARCH = 'search';
+ Player.REL_TAG = 'tag';
Player.REL_URL = 'url';
Player.RELATIONS = {
@@ -298,6 +309,7 @@ var PLUGIN_INFO =
fileExtension: 'r',
fileURL: '',
fullscreen: '',
+ large: '',
makeURL: '',
muted: '',
pause: '',
@@ -306,7 +318,6 @@ var PLUGIN_INFO =
relatedIDs: '',
relatedTags: '',
repeating: '',
- large: '',
tags: '',
title: '',
totalTime: '',
@@ -548,7 +559,8 @@ var PLUGIN_INFO =
Player.apply(this, arguments);
}
- // Normal / Fullscreen
+ // name, Normal, Fullscreen
+ // 任意の順で設定できるように配列で持つ
NicoPlayer.Variables = [
['videowindow._xscale', 100, null],
['videowindow._yscale', 100, null],
@@ -564,8 +576,8 @@ var PLUGIN_INFO =
['videowindow.video_mc.video.deblocking', null, 5]
];
- NicoPlayer.SIZE_NORMAL = 'normal';
NicoPlayer.SIZE_LARGE = 'fit';
+ NicoPlayer.SIZE_NORMAL = 'normal';
NicoPlayer.prototype = {
__proto__: Player.prototype,
@@ -577,9 +589,9 @@ var PLUGIN_INFO =
fileURL: '',
fullscreen: 'rwt',
id: 'r',
+ large: 'rwt',
makeURL: 'x',
muted: 'rwt',
- large: 'rwt',
pause: 'x',
play: 'x',
playEx: 'x',
@@ -1034,7 +1046,6 @@ var PLUGIN_INFO =
createStatusPanel: function () {
let self = this;
- // FIXME
function setEvents (name, elem) {
['click', 'popupshowing'].forEach(function (eventName) {
let onEvent = self['on' + capitalize(name) + capitalize(eventName)];