using System; using System.Windows.Forms; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using NaGet.Packages; namespace AppliStation.PackageInfo { /// /// パッケージ情報アクセスのための便利メソッド群 /// public sealed class PackageDescripter { /// /// インストーラタイプに対応する文字列を生成して返す /// /// インストーラタイプ /// ラベル文字列 public static string GetInstallerTypeLabel(InstallerType instType) { switch (instType) { case InstallerType.ARCHIVE: return "自己解凍書庫または書庫"; case InstallerType.EXEC_INSTALLER: return "インストーラー形式"; case InstallerType.MSI_PACKAGE: return "MSIファイル形式"; case InstallerType.ITSELF: return "単体の実行ファイル"; default: return "不明なインストール形式(インストール不能)"; } } /// /// OSのラベル文字列を生成する /// /// プラットフォーム /// platformの示すOSバージョン文字列 public static string GetOSValueLabel(Platform platform) { if (platform == null || string.IsNullOrEmpty(platform.Os)) { return "任意のWindows"; } else { return platform.Os.Replace("WIN", string.Empty); } } /// /// アーキテクチャのラベル文字列を生成する /// /// プラットフォーム /// platformの示すアーキテクチャ文字列 public static string GetArchValueLabel(Platform platform) { switch ((platform != null)? platform.Arch : System.Reflection.ProcessorArchitecture.X86) { case System.Reflection.ProcessorArchitecture.Amd64: return "x64 (64ビット環境)"; case System.Reflection.ProcessorArchitecture.IA64: return "Itanium"; case System.Reflection.ProcessorArchitecture.None: case System.Reflection.ProcessorArchitecture.MSIL: return "アーキテクチャ依存なし"; case System.Reflection.ProcessorArchitecture.X86: default: return "x86 (32ビット環境)"; } } /// /// ライセンスのラベル文字列とリンク情報を生成する /// /// パッケージ /// ラベル文字列 /// リンク文字列 public static void GetLicenseValueLabel(Package pkg, out string text, out LinkLabel.Link[] links) { string license = pkg.License; string publicSiteUrl = (pkg.Url != null)? pkg.Url.Href : null; List linkArray = new List(); switch (license ?? string.Empty) { case "": if (string.IsNullOrEmpty(publicSiteUrl)) { text = "フリーソフトウェア"; } else { text = "フリーソフトウェア (詳細は公式サイトなどで確認してください)"; linkArray.Add(createLinkToLinkLabel(text, "公式サイト", publicSiteUrl)); } break; #region オープンソースかつコピーレフト case "GPL": case "GPLv2": case "GPLv2+": case "GPLv3": case "GPLv3+": text = string.Format("{0} (オープンソース)", license); if (license.StartsWith("GPLv3")) { linkArray.Add(new LinkLabel.Link(0, license.Length, @"http://www.gnu.org/licenses/gpl-3.0.html")); } else { linkArray.Add(new LinkLabel.Link(0, license.Length, @"http://www.gnu.org/licenses/gpl-2.0.html")); linkArray.Add(createLinkToLinkLabel(text, "オープンソース", @"http://creativecommons.org/licenses/GPL/2.0/deed.ja")); } break; case "LGPL": case "LGPLv2": case "LGPLv2+": case "LGPLv3": case "LGPLv3+": text = string.Format("{0} (オープンソース)", license); if (license.StartsWith("GPLv3")) { linkArray.Add(new LinkLabel.Link(0, license.Length, @"http://www.gnu.org/licenses/lgpl-3.0.html")); } else { linkArray.Add(new LinkLabel.Link(0, license.Length, @"http://www.gnu.org/licenses/lgpl-2.1.html")); linkArray.Add(createLinkToLinkLabel(text, "オープンソース", @"http://creativecommons.org/licenses/LGPL/2.1/deed.ja")); } break; case "AGPLv3": case "AGPLv3+": text = string.Format("{0} (オープンソース)", license); linkArray.Add(new LinkLabel.Link(0, license.Length, @"http://www.gnu.org/licenses/agpl-3.0.txt")); break; case "MPL": case "MPLv1": case "MPLv1+": text = "MPL (オープンソース)"; linkArray.Add(new LinkLabel.Link(0, "MPL".Length, @"http://www.mozilla.org/MPL/MPL-1.1.html")); break; case "CPL": text = "CPL (オープンソース)"; linkArray.Add(new LinkLabel.Link(0, "CPL".Length, @"http://opensource.org/licenses/cpl1.0.php")); break; case "Artistic": text = "Artisticライセンス (オープンソース)"; linkArray.Add(new LinkLabel.Link(0, "Artisticライセンス".Length, @"http://www.perlfoundation.org/artistic_license_2_0")); break; #endregion #region オープンソースだが、コピーレフトでない著名なライセンス case "MIT": text = "MITライセンス (オープンソース)"; linkArray.Add(new LinkLabel.Link(0, "MITライセンス".Length, @"http://www.opensource.org/licenses/mit-license.php")); break; case "BSD": text = "修正済BSDライセンス (オープンソース)"; linkArray.Add(new LinkLabel.Link(0, "修正済BSDライセンス".Length, @"http://www.opensource.org/licenses/bsd-license.php")); break; case "Apache": case "ASLv2": case "ASLv2+": text = "Apacheライセンス (オープンソース)"; linkArray.Add(new LinkLabel.Link(0, "Apacheライセンス".Length, @"http://www.apache.org/licenses/LICENSE-2.0.txt")); break; case "zlib": text = "zlibライセンス (オープンソース)"; linkArray.Add(new LinkLabel.Link(0, "zlibライセンス".Length, @"http://sourceforge.jp/projects/opensource/wiki/licenses%2Fzlib_libpng_license")); break; #endregion #region 実質Public Domainなライセンス case "WTFPL": case "WTFPLv2": text = "WTFPL"; linkArray.Add(new LinkLabel.Link(0, text.Length, @"http://sam.zoy.org/wtfpl/")); break; case "NYSL": text = "煮るなり焼くなり好きにしろライセンス"; linkArray.Add(new LinkLabel.Link(0, text.Length, @"http://www.kmonos.net/nysl/NYSL_withfaq.TXT")); break; case "Public Domain": text = "パブリックドメイン (著作権帰属なし)"; break; #endregion default: if (license.StartsWith("http://")) { text = license; linkArray.Add(new LinkLabel.Link(0, license.Length, license)); } else { Regex regex = new Regex(@"^(?.*)<(?https?://.*)>$", RegexOptions.IgnoreCase); Match match = regex.Match(license); if (match.Success) { text = match.Groups["msg"].Value; linkArray.Add(new LinkLabel.Link(0, text.Length, match.Groups["url"].Value)); } else { text = license; } } break; } links = linkArray.ToArray(); } /// /// ライセンスのラベル文字列を生成する /// /// パッケージ /// ラベル文字列 public static string GetLicenseValueLabel(Package pkg) { string label; LinkLabel.Link[] links; GetLicenseValueLabel(pkg, out label, out links); return label; } /// /// リンクラベルのリンク生成便利メソッド /// /// ラベルテキスト /// リンク対象文字列 /// リンクオブジェクト private static LinkLabel.Link createLinkToLinkLabel(string text, string word, string link) { int pos = text.IndexOf(word, 0); if (pos >= 0) { return new LinkLabel.Link(pos, word.Length, link); } else throw new ArgumentException(string.Format("label text \"{0}\" does not contain \"{1}\"!", text, word)); } } }