var PLUGIN_INFO = {NAME} Manage Vimperator Plugin Vimpeatorプラグインの管理 teramako 0.2 2.0pre 2.0pre ; liberator.plugins.pluginManager = (function(){ function id (value) value; var lang = window.navigator.language; var tags = { name: function(info) fromUTF8Octets(info.toString()), author: function(info) { var xml = <>{info.toString()}; if (info.@homepage.toString() != '') xml += <> {makeLink(info.@homepage.toString())}; if (info.@mail.toString() != '') xml += <> ({makeLink("mailto:"+info.@mail)}); return xml; }, description: function(info) makeLink(fromUTF8Octets(info.toString())), license: function(info) { var xml = <>{info.toString()}; if (info.@document.toString() != '') xml += <> {makeLink(info.@document.toString())}; return xml; }, version: id, maxVersion: id, minVersion: id, detail: function(info){ if (info.* && info.*[0] && info.*[0].nodeKind() == 'element') return info.*; var text = fromUTF8Octets(info.*.toString()); var lines = text.split(/\r\n|[\r\n]/); var xml = <>; var ite = Iterator(lines); var num, line; try { while ([num, line] = ite.next()){ if (!line) continue; if (/^\s*==(.*)==\s*$/.test(line)){ xml +=

{makeLink(RegExp.$1)}

; continue; } let reg = /^\s*(.*)\s*:\s*$/; if (reg.test(line)){ let dl =
{makeLink(RegExp.$1)}
; try { while ([num, line] = ite.next()){ if (!line) break; if (reg.test(line)){ dl.* +=
{makeLink(RegExp.$1)}
; } else { dl.* +=
{makeLink(line.replace(/^\s+|\s+$/g, ""))}
; } } } catch (e){} xml += dl; continue; } xml += <>{makeLink(line)}
; } } catch (e){} return xml; } }; function chooseByLang (elems) { if (!elems) return null; function get (lang) { for (let i=elems.length(); i-->1;){ if (elems[i].@lang == lang) return elems[i]; } } return get(lang) || get(lang.split('-', 2).shift()) || elems[0] || elems; } for (let it in Iterator(tags)) { let [name, value] = it; tags[name] = function (info) { if (!info[name]) return null; return value.call(tags, chooseByLang(info[name])); }; } function makeLink(str){ return XMLList(str.replace(/(?:https?:\/\/|mailto:)\S+/g, '$&')); } function fromUTF8Octets(octets){ return decodeURIComponent(octets.replace(/[%\x80-\xFF]/g, function(c){ return "%" + c.charCodeAt(0).toString(16); })); } function getPlugins(){ var list = []; var contexts = liberator.plugins.contexts; for (let path in contexts){ let context = contexts[path]; let info = context.PLUGIN_INFO || null; let plugin = [ ["path", path] ]; plugin["name"] = context.NAME; if (info){ for (let tag in tags){ let value = tags[tag](info); if (value.toString().length > 0) plugin.push([tag, value]); } } list.push(plugin); } return list; } function itemFormater(plugin, showDetail){ if (showDetail) return template.table(plugin.name, plugin); var data = plugin.filter(function($_) $_[0] != 'detail'); return template.table(plugin.name, data); } commands.addUserCommand(['plugin[help]'], 'list Vimperator plugins', function(args){ liberator.plugins.pluginManager.list(args[0], args['-verbose']); }, { argCount: "*", options: [ [['-verbose', '-v'], commands.OPTION_NOARG], ], completer: function(context){ var all = getPlugins().map(function(plugin){ let desc = '-'; for (let i=plugin.length; i-->0;){ if (plugin[i][0] == 'description'){ desc = plugin[i][1]; break; } } return [plugin.name, desc]; }); context.title = ['PluginName', 'Description']; context.completions = all.filter(function(row) row[0].toLowerCase().indexOf(context.filter.toLowerCase()) >= 0); } }, true); var public = { list: function(name, showDetail){ var xml = <>; var plugins = getPlugins(); if (name){ let plugin = plugins.filter(function(plugin) plugin.name == name)[0]; if (plugin){ xml = itemFormater(plugin, showDetail); } } else { plugins.forEach(function(plugin) xml += itemFormater(plugin, showDetail)); } liberator.echo(xml, true); } }; return public; })();