var PLUGIN_INFO =
{NAME}
Manage Vimperator Plugin
Vimpeatorプラグインの管理
teramako
0.1
2.0pre
2.0pre
;
liberator.plugins.pluginManager = (function(){
var lang = window.navigator.language;
var tags = {
	name: function(info) info.name ? fromUTF8Octets(info.name.toString()) : null,
	author: function(info) {
		if (!info.author) return null;
		var xml = <>{info.author.toString()}>;
		if (info.author.@homepage.toString() != '')
			xml += <> {makeLink(info.author.@homepage.toString())}>;
		if (info.author.@mail.toString() != '')
			xml += <> ({makeLink("mailto:"+info.author.@mail)})>;
		return xml;
	},
	description: function(info){
		if (!info.description) return null;
		var desc = info.description[0].toString();
		for (let i=info.description.length(), lang=lang.split('-', 2).shift(); i-->1;){
			if (info.description[i].@lang == lang){
				desc = info.description[i].toString();
				break;
			}
		}
		for (let i=info.description.length(); i-->1;){
			if (info.description[i].@lang == lang){
				desc = info.description[i].toString();
				break;
			}
		}
		return makeLink(fromUTF8Octets(desc));
	},
	version: function(info) info.version || null,
	maxVersion: function(info) info.maxVersion || null,
	minVersion: function(info) info.minVersion || null,
	detail: function(info){
		if (!info.detail)
			return null;
		if (info.detail.* && info.detail.*[0].nodeKind() == 'element')
			return info.detail.*;
		var text = fromUTF8Octets(info.detail.*.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 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;
})();