private static List <GistLink> GetGistLinks(string gistId, string name) { var gistsIndex = GitHubUtils.Gateway.GetGistFiles(gistId) .FirstOrDefault(x => x.Key == name); if (gistsIndex.Key == null) { throw new NotSupportedException($"Could not find '{name}' file in gist '{GistLinksId}'"); } return(GistLinksCache.GetOrAdd(gistId + ":" + name, key => { var links = GistLink.Parse(gistsIndex.Value); return links; })); }
public static bool ApplyGists(string tool, string[] gistAliases) { var links = GetGistApplyLinks(); var hasNums = gistAliases.Any(x => int.TryParse(x, out _)); if (hasNums) { var resolvedAliases = new List <string>(); foreach (var gistAlias in gistAliases) { if (!int.TryParse(gistAlias, out var index)) { resolvedAliases.Add(gistAlias); continue; } if (index <= 0 || index > links.Count) { throw new ArgumentOutOfRangeException($"Invalid Index '{index}'. Valid Range: 1...{links.Count - 1}"); } resolvedAliases.Add(links[index - 1].Name); } gistAliases = resolvedAliases.ToArray(); } foreach (var gistAlias in gistAliases) { var gistLink = GistLink.Get(links, gistAlias); if (gistLink == null) { $"No match found for '{gistAlias}', available gists:".Print(); PrintGistLinks(tool, links); return(false); } var currentDirName = new DirectoryInfo(Environment.CurrentDirectory).Name; WriteGistFile(gistLink.Url, gistAlias, to: gistLink.To, projectName: currentDirName, getUserApproval: UserInputYesNo); ForceApproval = true; //If written once user didn't cancel, assume approval for remaining gists } return(true); }
public static List <GistLink> Parse(string md) { var to = new List <GistLink>(); if (!string.IsNullOrEmpty(md)) { foreach (var strLine in md.ReadLines()) { var line = strLine.AsSpan(); if (!line.TrimStart().StartsWith("- [")) { continue; } line.SplitOnFirst('[', out _, out var startName); startName.SplitOnFirst(']', out var name, out var endName); endName.SplitOnFirst('(', out _, out var startUrl); startUrl.SplitOnFirst(')', out var url, out var endUrl); var afterModifiers = endUrl.ParseJsToken(out var token); var modifiers = new Dictionary <string, object>(); if (token is JsObjectExpression obj) { foreach (var jsProperty in obj.Properties) { if (jsProperty.Key is JsIdentifier id) { modifiers[id.Name] = (jsProperty.Value as JsLiteral)?.Value; } } } var toPath = modifiers.TryGetValue("to", out var oValue) ? oValue.ToString() : null; string tags = null; afterModifiers = afterModifiers.TrimStart(); if (afterModifiers.StartsWith("`")) { afterModifiers = afterModifiers.Advance(1); var pos = afterModifiers.IndexOf('`'); if (pos >= 0) { tags = afterModifiers.Substring(0, pos); afterModifiers = afterModifiers.Advance(pos + 1); } } if (name == null || url == null) { continue; } var link = new GistLink { Name = name.ToString(), Url = url.ToString(), Modifiers = modifiers, To = toPath, Description = afterModifiers.Trim().ToString(), User = url.Substring("https://".Length).RightPart('/').LeftPart('/'), Tags = tags?.Split(',').Map(x => x.Trim()).ToArray(), }; if (TryParseGitHubUrl(link.Url, out var gistId, out var user, out var repo)) { link.GistId = gistId; if (user != null) { link.User = user; link.Repo = repo; } } if (link.User == "gistlyn" || link.User == "mythz") { link.User = "******"; } to.Add(link); } } return(to); }
public static List <GistLink> Parse(string md) { var to = new List <GistLink>(); if (!string.IsNullOrEmpty(md)) { foreach (var strLine in md.ReadLines()) { var line = strLine.AsSpan(); if (!line.TrimStart().StartsWith("- [")) { continue; } line.SplitOnFirst('[', out _, out var startName); startName.SplitOnFirst(']', out var name, out var endName); endName.SplitOnFirst('(', out _, out var startUrl); startUrl.SplitOnFirst(')', out var url, out var endUrl); var afterModifiers = endUrl.ParseJsToken(out var token); var toPath = (token is JsObjectExpression obj ? obj.Properties.FirstOrDefault(x => x.Key is JsIdentifier key && key.Name == "to") ?.Value as JsLiteral : null)?.Value?.ToString(); string tags = null; afterModifiers = afterModifiers.TrimStart(); if (afterModifiers.StartsWith("`")) { afterModifiers = afterModifiers.Advance(1); var pos = afterModifiers.IndexOf('`'); tags = afterModifiers.Substring(0, pos); afterModifiers = afterModifiers.Advance(pos + 1); } if (name == null || toPath == null || url == null) { continue; } var link = new GistLink { Name = name.ToString(), Url = url.ToString(), To = toPath, Description = afterModifiers.Trim().ToString(), User = url.LastLeftPart('/').LastRightPart('/').ToString(), Tags = tags?.Split(',').Map(x => x.Trim()).ToArray(), }; if (link.User == "gistlyn" || link.User == "mythz") { link.User = "******"; } to.Add(link); } } return(to); }