diff options
| -rw-r--r-- | pluginManager.js | 80 | 
1 files changed, 68 insertions, 12 deletions
diff --git a/pluginManager.js b/pluginManager.js index 0d1bbfd..a4b1259 100644 --- a/pluginManager.js +++ b/pluginManager.js @@ -86,7 +86,7 @@ detail:      - mailtoとhttp、httpsスキームのURLはリンクになります  == ToDo == -- 更新通知とアップデート機能 +- 更新通知  - スタイルの追加(これはすべき?)  ]]></detail> @@ -116,7 +116,7 @@ var tags = {      version: id,      maxVersion: id,      minVersion: id, -    updateURL: function(info) makeLink(info.toString()), +    updateURL: function(info) makeLink(info.toString(), true),      detail: function(info){          if (info.* && info.*[0] && info.*[0].nodeKind() == 'element')              return info.*; @@ -148,8 +148,9 @@ for (let it in Iterator(tags)){          return value.call(tags, chooseByLang(info[name]));      };  } -function makeLink(str){ -    return XMLList(str.replace(/(?:https?:\/\/|mailto:)\S+/g, '<a href="#" highlight="URL">$&</a>')); +function makeLink(str, withLink){ +    var href = withLink ? '$&' : '#'; +    return XMLList(str.replace(/(?:https?:\/\/|mailto:)\S+/g, '<a href="' + href + '" highlight="URL">$&</a>'));  }  function fromUTF8Octets(octets){      return decodeURIComponent(octets.replace(/[%\x80-\xFF]/g, function(c){ @@ -192,17 +193,67 @@ function itemFormater(plugin, showDetails){  function checkVersion(plugin){      var data = {          "Current Version": plugin.info.version || 'unknown', -        "Latest Version": getLatestVersion(plugin.info.updateURL) || 'unknown', +        "Latest Version": getLatestVersion(plugin.info.updateURL)['version'] || 'unknown',          "Update URL": plugin.info.updateURL || '-'      };      return template.table(plugin.name, data);  }  function getLatestVersion(url){ -    if (!url) return ''; -    var val = util.httpGet(url).responseText || ''; -    val.match(/PLUGIN_INFO[\s\S]*<VimperatorPlugin>[\s\S]*<version>(.*)<\/version>[\s\S]*<\/VimperatorPlugin>/); -    val = RegExp.$1; -    return val; +    if (!url) return {}; +    var source = util.httpGet(url).responseText || ''; +    var version = ''; +    source.match(/PLUGIN_INFO[\s\S]*<VimperatorPlugin>[\s\S]*<version>(.*)<\/version>[\s\S]*<\/VimperatorPlugin>/); +    version = RegExp.$1; +    return {source: source, version: version}; +} +function updatePlugin(plugin){ +    var currentVersion = plugin.info.version || ''; +    var latestResource = getLatestVersion(plugin.info.updateURL) || ''; +    var data = { +        information: '', +        "Current Version": plugin.info.version || 'unknown', +        "Local Path": plugin[0][1] || 'unknown', +        "Latest Version": latestResource.version || 'unknown', +        "Update URL": plugin.info.updateURL || '-' +    }; + +    if (!currentVersion || !latestResource.version){ +        data.information = 'unknown version.'; +    } else if (currentVersion == latestResource.version){ +        data.information = 'already latest.'; +    } else if (currentVersion > latestResource.version){ +        data.information = '<span highlight="WarningMsg">local version is newest.</span>'; +    } else { +        data.information = overwritePlugin(plugin, latestResource); +    } +    return template.table(plugin.name, data); +} +function overwritePlugin(plugin, latestResource){ +    if (!plugin[0] || plugin[0][0] != 'path') +        return '<span highlight="WarningMsg">plugin localpath notfound.</span>'; + +    var source = latestResource.source; +    var localpath = plugin[0][1]; +    var file = io.getFile(localpath); + +    if (!source) +        return '<span highlight="WarningMsg">source is null.</span>'; + +    try { +        io.writeFile(file, source); +    } catch (e){ +        liberaotr.log("Could not write to " + file.path + ": " + e.message); +        return "E190: Cannot open " + filename.quote() + " for writing"; +    } + +    try { +        io.source(localpath); +    } catch (e){ +        return e.message; +    } + +    return '<span style="font-weight: bold; color: blue;">update complete.</span>'; +  }  function WikiParser(text){      this.mode = ''; @@ -419,6 +470,7 @@ commands.addUserCommand(['plugin[help]'], 'list Vimperator plugins',          options: [              [['-verbose', '-v'], commands.OPTION_NOARG],              [['-check', '-c'], commands.OPTION_NOARG], +            [['-update', '-u'], commands.OPTION_NOARG],          ],          completer: function(context){              var all = getPlugins().map(function(plugin){ @@ -433,8 +485,9 @@ commands.addUserCommand(['plugin[help]'], 'list Vimperator plugins',  var public = {      list: function(args){          var names = args; -        var check = args['-check'];          var showDetails = args['-verbose']; +        var check = args['-check']; +        var update = args['-update'];          var xml = <></>;          var plugins = getPlugins(); @@ -442,8 +495,11 @@ var public = {          var action = itemFormater;          var params = [showDetails]; -        if (check) +        if (check){              action = checkVersion; +        } else if (update){ +            action = updatePlugin; +        }          if (names.length){              names.forEach(function(name){  | 
