root/lang/javascript/userscripts/flickraddsfocallengthona35mm.user.js

Revision 29957, 2.8 kB (checked in by yoko, 19 months ago)

インデント直し

Line 
1// ==UserScript==
2// @name        Flickr Adds Focal Length on a 35mm
3// @namespace   http://codefairy.org/ns/userscripts
4// @include     http://www.flickr.com/*/meta/*
5// @include     http://flickr.com/*/meta/*
6// @version     0.2.5
7// @license     MIT License
8// ==/UserScript==
9
10new function() {
11        var cacheable = (typeof GM_setValue == 'function' && typeof GM_getValue == 'function');
12
13        var camera      = $X('id("Inbox")//tr/td[preceding-sibling::td/b[text()="Camera:"]]/b');
14        var focalLength = $X('id("Inbox")//tr/td[preceding-sibling::td/b[text()="Focal Length:"]]/b');
15        if (!camera || !focalLength) return;
16        camera = camera[0];
17        focalLength = focalLength[0];
18
19        var w = typeof unsafeWindow != 'undefined' ? unsafeWindow : window;
20        var now = new Date().getTime();
21        var uri = 'http://wedata.net/databases/AngleOfView/items';
22
23        var callback = function(data) {
24                var text = 'unknown on a 35mm camera. <a href="'+uri+'">add angle of view data?</a>';
25                for (var i = 0, length = data.length; i < length; i++) {
26                        var item = data[i];
27                        if (item.name == camera.textContent) {
28                                if (item.data.ratio == 1)
29                                        text = 'with a full-frame';
30                                else {
31                                        var angleOfView = Math.round(parseFloat(focalLength.textContent) * parseFloat(item.data.ratio));
32                                        text = angleOfView+' mm on a 35 mm camera';
33                                }
34                                break;
35                        }
36                }
37                focalLength.innerHTML += ' ('+text+')';
38        };
39
40        var load = function() {
41                return eval(GM_getValue('stash'));
42        };
43
44        var save = function(data) {
45                var stash = data ?
46                        uneval({
47                                data   : data,
48                                expires: now + 1000 * 60 * 60 * 24
49                        }) :
50                        '';
51                GM_setValue('stash', stash);
52                return data;
53        };
54
55
56        if (cacheable && typeof GM_registerMenuCommand == 'function')
57                GM_registerMenuCommand('Clear Angle of View Data Cache', save);
58
59        var api = uri+'.json';
60        if (cacheable) {
61                var complete = false;
62                var stash = load();
63
64                if (stash && stash.expires >= now)
65                        callback(stash.data);
66                else {
67                        GM_xmlhttpRequest({
68                                method: 'GET',
69                                url   : api,
70                                onload: function(r) {
71                                        var data = eval(r.responseText);
72                                        save(data);
73                                        if (!complete) callback(data);
74                                }
75                        });
76                        if (stash)
77                                setTimeout(function() {
78                                        complete = true;
79                                        callback(save(stash.data));
80                                }, 1000 * 30);
81                }
82        }
83        else {
84                w['jsonp'+now] = callback;
85
86                var s = document.createElement('script');
87                s.type    = 'text/javascript';
88                s.src     = api+'?callback=jsonp'+now;
89                s.charset = 'utf-8';
90                document.body.appendChild(s);
91        }
92
93
94        // @source http://gist.github.com/29681.txt
95        function $X (exp, context, resolver, result_type) {
96                context || (context = document);
97                var Doc = context.ownerDocument || context;
98                var result = Doc.evaluate(exp, context, resolver, result_type || XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
99                if (result_type) return result;
100                for (var i = 0, len = result.snapshotLength, res = []; i < len; i++) {
101                        res.push(result.snapshotItem(i));
102                }
103                return res;
104        }
105};
Note: See TracBrowser for help on using the browser.