public static string AutoLinkHtml(string text, TwitterEntities entities) { if (entities == null) return AutoLinkHtml(text, Enumerable.Empty<TwitterEntity>()); var urls = entities.Urls ?? new TwitterEntityUrl[0]; var hashtags = entities.Hashtags ?? new TwitterEntityHashtag[0]; var mentions = entities.UserMentions ?? new TwitterEntityMention[0]; var media = entities.Media ?? new TwitterEntityMedia[0]; var entitiesQuery = urls.Cast<TwitterEntity>() .Concat(hashtags) .Concat(mentions) .Concat(media) .Where(x => x != null) .Where(x => x.Indices != null && x.Indices.Length == 2); return string.Concat(AutoLinkHtmlInternal(text, entitiesQuery)); }
public string CreateHtmlAnchor(string text, List<string> AtList, TwitterEntities entities, List<MediaInfo> media) { return this.CreateHtmlAnchorAsync(text, AtList, entities, media).Result; }
public async Task<string> CreateHtmlAnchorAsync(string text, List<string> AtList, TwitterEntities entities, List<MediaInfo> media) { if (entities != null) { if (entities.Urls != null) { foreach (var ent in entities.Urls) { ent.ExpandedUrl = await ShortUrl.Instance.ExpandUrlAsync(ent.ExpandedUrl) .ConfigureAwait(false); if (media != null && !media.Any(info => info.Url == ent.ExpandedUrl)) media.Add(new MediaInfo(ent.ExpandedUrl)); } } if (entities.Hashtags != null) { lock (this.LockObj) { this._hashList.AddRange(entities.Hashtags.Select(x => "#" + x.Text)); } } if (entities.UserMentions != null) { foreach (var ent in entities.UserMentions) { var screenName = ent.ScreenName.ToLower(); if (!AtList.Contains(screenName)) AtList.Add(screenName); } } if (entities.Media != null) { if (media != null) { foreach (var ent in entities.Media) { if (!media.Any(x => x.Url == ent.MediaUrl)) { if (ent.VideoInfo != null && ent.Type == "animated_gif" || ent.Type == "video") { //var videoUrl = ent.VideoInfo.Variants // .Where(v => v.ContentType == "video/mp4") // .OrderByDescending(v => v.Bitrate) // .Select(v => v.Url).FirstOrDefault(); media.Add(new MediaInfo(ent.MediaUrl, ent.ExpandedUrl)); } else media.Add(new MediaInfo(ent.MediaUrl)); } } } } } text = TweetFormatter.AutoLinkHtml(text, entities); text = Regex.Replace(text, "(^|[^a-zA-Z0-9_/&##@@>=.~])(sm|nm)([0-9]{1,10})", "$1<a href=\"http://www.nicovideo.jp/watch/$2$3\">$2$3</a>"); text = PreProcessUrl(text); //IDN置換 return text; }
private string ReplaceTextFromApi(string text, TwitterEntities entities) { if (entities != null) { if (entities.Urls != null) { foreach (var m in entities.Urls) { if (!string.IsNullOrEmpty(m.DisplayUrl)) text = text.Replace(m.Url, m.DisplayUrl); } } if (entities.Media != null) { foreach (var m in entities.Media) { if (!string.IsNullOrEmpty(m.DisplayUrl)) text = text.Replace(m.Url, m.DisplayUrl); } } } return text; }
public string CreateHtmlAnchor(string text, List<string> AtList, TwitterEntities entities, List<MediaInfo> media) { if (entities != null) { if (entities.Hashtags != null) { lock (this.LockObj) { this._hashList.AddRange(entities.Hashtags.Select(x => "#" + x.Text)); } } if (entities.UserMentions != null) { foreach (var ent in entities.UserMentions) { var screenName = ent.ScreenName.ToLowerInvariant(); if (!AtList.Contains(screenName)) AtList.Add(screenName); } } if (entities.Media != null) { if (media != null) { foreach (var ent in entities.Media) { if (!media.Any(x => x.Url == ent.MediaUrl)) { if (ent.VideoInfo != null && ent.Type == "animated_gif" || ent.Type == "video") { //var videoUrl = ent.VideoInfo.Variants // .Where(v => v.ContentType == "video/mp4") // .OrderByDescending(v => v.Bitrate) // .Select(v => v.Url).FirstOrDefault(); media.Add(new MediaInfo(ent.MediaUrl, ent.AltText, ent.ExpandedUrl)); } else media.Add(new MediaInfo(ent.MediaUrl, ent.AltText, videoUrl: null)); } } } } } // PostClass.ExpandedUrlInfo を使用して非同期に URL 展開を行うためここでは expanded_url を使用しない text = TweetFormatter.AutoLinkHtml(text, entities, keepTco: true); text = Regex.Replace(text, "(^|[^a-zA-Z0-9_/&##@@>=.~])(sm|nm)([0-9]{1,10})", "$1<a href=\"http://www.nicovideo.jp/watch/$2$3\">$2$3</a>"); text = PreProcessUrl(text); //IDN置換 return text; }
private string CreateAccessibleText(string text, TwitterEntities entities, TwitterStatus quoteStatus) { if (entities == null) return text; if (entities.Urls != null) { foreach (var entity in entities.Urls) { if (quoteStatus != null) { var matchStatusUrl = Twitter.StatusUrlRegex.Match(entity.ExpandedUrl); if (matchStatusUrl.Success && matchStatusUrl.Groups["StatusId"].Value == quoteStatus.IdStr) { var quoteText = this.CreateAccessibleText(quoteStatus.FullText, quoteStatus.MergedEntities, quoteStatus: null); text = text.Replace(entity.Url, string.Format(Properties.Resources.QuoteStatus_AccessibleText, quoteStatus.User.ScreenName, quoteText)); } } else if (!string.IsNullOrEmpty(entity.DisplayUrl)) { text = text.Replace(entity.Url, entity.DisplayUrl); } } } if (entities.Media != null) { foreach (var entity in entities.Media) { if (!string.IsNullOrEmpty(entity.AltText)) { text = text.Replace(entity.Url, string.Format(Properties.Resources.ImageAltText, entity.AltText)); } else if (!string.IsNullOrEmpty(entity.DisplayUrl)) { text = text.Replace(entity.Url, entity.DisplayUrl); } } } return text; }
public async Task<string> CreateHtmlAnchorAsync(string text, List<string> AtList, TwitterEntities entities, List<string> media) { if (entities != null) { if (entities.Urls != null) { foreach (var ent in entities.Urls) { ent.ExpandedUrl = await ShortUrl.Instance.ExpandUrlAsync(ent.ExpandedUrl) .ConfigureAwait(false); if (media != null && !media.Contains(ent.ExpandedUrl)) media.Add(ent.ExpandedUrl); } } if (entities.Hashtags != null) { lock (this.LockObj) { this._hashList.AddRange(entities.Hashtags.Select(x => "#" + x.Text)); } } if (entities.UserMentions != null) { foreach (var ent in entities.UserMentions) { var screenName = ent.ScreenName.ToLower(); if (!AtList.Contains(screenName)) AtList.Add(screenName); } } if (entities.Media != null) { if (media != null) { foreach (var ent in entities.Media) { if (!media.Contains(ent.MediaUrl)) media.Add(ent.MediaUrl); } } } } text = TweetFormatter.AutoLinkHtml(text, entities); text = Regex.Replace(text, "(^|[^a-zA-Z0-9_/&##@@>=.~])(sm|nm)([0-9]{1,10})", "$1<a href=\"http://www.nicovideo.jp/watch/$2$3\">$2$3</a>"); text = PreProcessUrl(text); //IDN置換 return text; }
public void AutoLinkHtml_EntityNullTest2() { var text = "てすとてすとー"; TwitterEntities entities = new TwitterEntities { Urls = null, Hashtags = null, UserMentions = null, Media = null, }; var expected = "てすとてすとー"; Assert.Equal(expected, TweetFormatter.AutoLinkHtml(text, entities)); }
public static string AutoLinkHtml(string text, TwitterEntities entities) { return AutoLinkHtml(text, entities.AsEnumerable()); }