private static IEnumerable <Inline> GenerateDigestSink(this string text) { foreach (var tok in Tokenizer.Tokenize(text)) { switch (tok.Kind) { case TokenKind.AtLink: yield return(TextElementGenerator.GenerateHyperlink(tok.Text, () => InternalLinkClicked(InternalLinkKind.User, tok.Text))); break; case TokenKind.Hashtag: yield return(TextElementGenerator.GenerateHyperlink(tok.Text, () => InternalLinkClicked(InternalLinkKind.Hash, tok.Text))); break; case TokenKind.Url: yield return(TextElementGenerator.GenerateHyperlink(tok.Text, Regex.IsMatch(tok.Text, TweetUrlRegex) ? new Action(() => InternalLinkClicked(InternalLinkKind.Tweet, tok.Text)) : new Action(() => ExternalLinkClicked(tok.Text)))); break; case TokenKind.Text: default: yield return(TextElementGenerator.GenerateRun(tok.Text)); break; } } }
public override IEnumerable <Inline> ToTarget(TweetViewModel input, object parameter) { if (!Application.Current.Dispatcher.CheckAccess()) { return(Application.Current.Dispatcher.Invoke(new Action(() => ToTarget(input, parameter)), null) as IEnumerable <Inline>); } bool referenceOriginal = parameter as string != null?bool.Parse(parameter as string) : false; var status = input.Status as TwitterStatus; if (referenceOriginal && status != null && status.RetweetedOriginal != null) { status = status.RetweetedOriginal; } if (status != null) { var src = status.Source; Match m = null; if (!String.IsNullOrEmpty(src) && (m = SourceRegex.Match(src.Replace("\\", ""))).Success) { return(new[] { TextElementGenerator.GenerateHyperlink( m.Groups[2].Value, () => Browser.Start(m.Groups[1].Value)) }); } else { return(new[] { TextElementGenerator.GenerateRun(status.Source) }); } } // ELSE return(new Run[0]); }
private static IEnumerable <Inline> GenerateSink(string text) { foreach (var tok in Tokenizer.Tokenize(text)) { var ctt = tok.Text; switch (tok.Kind) { case TokenKind.AtLink: yield return(TextElementGenerator.GenerateHyperlink(ctt, () => InternalLinkClicked(InternalLinkKind.User, ctt))); break; case TokenKind.Hashtag: var hashlink = TextElementGenerator.GenerateHyperlink(ctt, () => InternalLinkClicked(InternalLinkKind.Hash, ctt)); hashlink.ToolTip = new TextBlock(new Run("Ctrlキーを押しながらクリックすると、ブラウザを開いて検索します...")); yield return(hashlink); break; case TokenKind.Url: String resolved = null; try { resolved = new Uri(ctt).PunyDecode().OriginalString; } catch (UriFormatException) { } var urllink = Regex.IsMatch(ctt, TweetUrlRegex) ? TextElementGenerator.GenerateHyperlink( String.IsNullOrEmpty(resolved) ? ctt : resolved, () => InternalLinkClicked(InternalLinkKind.Tweet, ctt)) : TextElementGenerator.GenerateHyperlink( String.IsNullOrEmpty(resolved) ? ctt : resolved, () => ExternalLinkClicked(ctt)); switch (Setting.Instance.TweetExperienceProperty.UrlResolveMode) { case UrlResolve.OnPointed: case UrlResolve.Never: urllink.ToolTip = new UrlTooltip(ctt); break; case UrlResolve.OnReceived: string nurl = null; if ((nurl = UrlResolveCacheStorage.Lookup(ctt)) == null) { nurl = ShortenManager.Extract(ctt); if (nurl != ctt) { // resolved UrlResolveCacheStorage.AddResolved(ctt, nurl); } else { // unresolved UrlResolveCacheStorage.AddResolved(ctt, ctt); } } if (String.IsNullOrEmpty(nurl)) { urllink.ToolTip = new UrlTooltip(ctt); } else { urllink.ToolTip = new UrlTooltip(nurl); } break; } ToolTipService.SetShowDuration(urllink, Setting.Instance.TweetExperienceProperty.UrlTooltipShowLength); yield return(urllink); break; case TokenKind.Text: default: yield return(TextElementGenerator.GenerateRun(ctt)); break; } } }