public override INode Parse(Parser parser, ParseData data, State state, string scope) { var index = state.Index; if (state.Next() != '[') { state.Seek(index, true); return(null); } var str = state.ScanTo("]"); if (state.Next() != ']') { state.Seek(index, true); return(null); } var credit = new WikiRevisionCredit { Type = WikiRevisionCredit.TypeCredit }; var sections = str.Split('|'); foreach (var section in sections) { var spl = section.Split(new[] { ':' }, 2); var key = spl[0]; var val = spl.Length > 1 ? spl[1] : ""; switch (key) { case "credit": credit.Description = val; break; case "user": if (int.TryParse(val, out var uid)) { credit.UserID = uid; } break; case "name": credit.Name = val; break; case "url": credit.Url = val; break; } } state.SkipWhitespace(); return(new MetadataNode("WikiCredit", credit)); }
public override INode Parse(Parser parser, ParseData data, State state, string scope) { var index = state.Index; if (state.Next() != '[') { state.Seek(index, true); return(null); } var str = state.ScanTo("]"); if (state.Next() != ']') { state.Seek(index, true); return(null); } var credit = new WikiRevisionCredit { Type = WikiRevisionCredit.TypeArchive }; var sections = str.Split('|'); foreach (var section in sections) { var spl = section.Split(new[] { ':' }, 2); var key = spl[0]; var val = spl.Length > 1 ? spl[1] : ""; switch (key) { case "archive": credit.Name = val; break; case "description": credit.Description = val; break; case "url": credit.Url = val; break; case "wayback": credit.WaybackUrl = val; break; case "full": credit.Type = WikiRevisionCredit.TypeFull; break; } } if (credit.WaybackUrl != null && credit.Url != null && !credit.WaybackUrl.StartsWith("http://") && !credit.WaybackUrl.StartsWith("https://") && int.TryParse(credit.WaybackUrl, out _)) { credit.WaybackUrl = $"https://web.archive.org/web/{credit.WaybackUrl}/{credit.Url}"; } state.SkipWhitespace(); return(new MetadataNode("WikiCredit", credit)); }