コード例 #1
0
        private async Task SetDescriptionAsync(string descriptionText, TwitterEntities entities, CancellationToken cancellationToken)
        {
            if (descriptionText != null)
            {
                foreach (var entity in entities.Urls)
                {
                    entity.ExpandedUrl = await ShortUrl.Instance.ExpandUrlAsync(entity.ExpandedUrl);
                }

                // user.entities には urls 以外のエンティティが含まれていないため、テキストをもとに生成する
                var mergedEntities = entities.Urls.AsEnumerable <TwitterEntity>()
                                     .Concat(TweetExtractor.ExtractHashtagEntities(descriptionText))
                                     .Concat(TweetExtractor.ExtractMentionEntities(descriptionText))
                                     .Concat(TweetExtractor.ExtractEmojiEntities(descriptionText));

                var html = TweetFormatter.AutoLinkHtml(descriptionText, mergedEntities);
                html = this.mainForm.createDetailHtml(html);

                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                this.DescriptionBrowser.DocumentText = html;
            }
            else
            {
                this.DescriptionBrowser.DocumentText = "";
            }
        }
コード例 #2
0
        private async Task SetRecentStatusAsync(TwitterStatus status, CancellationToken cancellationToken)
        {
            if (status != null)
            {
                var entities = status.MergedEntities;

                foreach (var entity in entities.Urls)
                {
                    entity.ExpandedUrl = await ShortUrl.Instance.ExpandUrlAsync(entity.ExpandedUrl);
                }

                var mergedEntities = entities.Concat(TweetExtractor.ExtractEmojiEntities(status.FullText));

                var html = TweetFormatter.AutoLinkHtml(status.FullText, mergedEntities);
                html = this.mainForm.createDetailHtml(html +
                                                      " Posted at " + MyCommon.DateTimeParse(status.CreatedAt).ToLocalTimeString() +
                                                      " via " + status.Source);

                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                this.RecentPostBrowser.DocumentText = html;
            }
            else
            {
                this.RecentPostBrowser.DocumentText = Properties.Resources.ShowUserInfo2;
            }
        }
コード例 #3
0
        public void ExtractEmojiEntities_VariationSelector_TextStyleTest()
        {
            // 異字体セレクタを使用して明示的にテキストスタイルで表示させている文字
            var origText = "©\uFE0E"; // U+00A9 + U+FE0E (text style)
            var entities = TweetExtractor.ExtractEmojiEntities(origText);

            Assert.Empty(entities);
        }
コード例 #4
0
        public void ExtractEmojiEntities_Test()
        {
            var entity = TweetExtractor.ExtractEmojiEntities("star ✨").Single();

            Assert.Equal(new[] { 5, 6 }, entity.Indices);
            Assert.Equal("✨", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/2728.png", entity.Url);
        }
コード例 #5
0
        public void ExtractEmojiEntities_CombiningCharacterTest()
        {
            var origText = "#⃣"; // U+0023 U+20E3 (合字)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 2 }, entity.Indices);
            Assert.Equal("#⃣", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/23-20e3.png", entity.Url);
        }
コード例 #6
0
        public void ExtractEmojiEntities_SurrogatePairTest()
        {
            var entity = TweetExtractor.ExtractEmojiEntities("𠮷野家 🍚").Single();

            // 「𠮷」「🍚」は UTF-16 でそれぞれ 2byte になるがインデックスはコードポイント単位で数えなければならない
            Assert.Equal(new[] { 4, 5 }, entity.Indices);
            Assert.Equal("🍚", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f35a.png", entity.Url);
        }
コード例 #7
0
        public void ExtractEmojiEntities_EmojiZWJSequenceTest()
        {
            // 複数の絵文字を U+200D (ZERO WIDTH JOINER) で繋げて表現する絵文字
            var origText = "👨\u200D🎨"; // U+1F468 (MAN) + U+200D + U+1F3A8 (ARTIST PALETTE)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 3 }, entity.Indices);
            Assert.Equal("👨\u200D🎨", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f468-200d-1f3a8.png", entity.Url);
        }
コード例 #8
0
        public void ExtractEmojiEntities_EmojiModifiers_SingleTest()
        {
            // Emoji modifiers は単体でも絵文字として表示される
            var origText = "\U0001F3FF"; // U+1F3FB (EMOJI MODIFIER FITZPATRICK TYPE-6)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 1 }, entity.Indices);
            Assert.Equal("\U0001F3FF", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f3ff.png", entity.Url);
        }
コード例 #9
0
        public void ExtractEmojiEntities_EmojiModifiers_CombiningTest()
        {
            // Emoji modifiers を使用した合字 (リガチャー)
            var origText = "👦\U0001F3FF"; // U+1F466 (BOY) + U+1F3FF (EMOJI MODIFIER FITZPATRICK TYPE-6)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 2 }, entity.Indices);
            Assert.Equal("👦\U0001F3FF", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f466-1f3ff.png", entity.Url);
        }
コード例 #10
0
        public void ExtractEmojiEntities_Unicode11Test()
        {
            // Unicode 11.0 で追加された絵文字
            var origText = "🦸"; // U+1F9B8 (SUPERHERO)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 1 }, entity.Indices);
            Assert.Equal("🦸", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f9b8.png", entity.Url);
        }
コード例 #11
0
        public void ExtractEmojiEntities_Unicode10Test()
        {
            // Unicode 10.0/Emoji 5.0 で追加された絵文字
            var origText = "🦒"; // U+1F992 (GIRAFFE)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 1 }, entity.Indices);
            Assert.Equal("🦒", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f992.png", entity.Url);
        }
コード例 #12
0
        public void ExtractEmojiEntities_VariationSelector_EmojiStyleTest()
        {
            // 異字体セレクタを使用して明示的に絵文字スタイルで表示させている文字
            var origText = "©\uFE0F"; // U+00A9 + U+FE0F (emoji style)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 2 }, entity.Indices);
            Assert.Equal("©", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/a9.png", entity.Url);
        }
コード例 #13
0
        public void ExtractEmojiEntities_Unicode12Test()
        {
            // Unicode 12.0 で追加された絵文字
            var origText = "🧅"; // U+1F9C5 (ONION)
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 1 }, entity.Indices);
            Assert.Equal("🧅", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f9c5.png", entity.Url);
        }
コード例 #14
0
        public void ExtractEmojiEntities_EmojiZWJSequenceWithVariationSelectorTest()
        {
            // 複数の絵文字を U+200D (ZERO WIDTH JOINER) で繋げて表現 + 異字体セレクタ U+FE0F を含む絵文字
            // この場合は URL 生成時に異字体セレクタ U+FE0F を除去しない
            var origText = "🏃\u200D♀\uFE0F"; // U+1F3C3 (RUNNER) + U+200D + U+2640 (FEMARE SIGN) + U+FE0F
            var entity   = TweetExtractor.ExtractEmojiEntities(origText).Single();

            Assert.Equal(new[] { 0, 4 }, entity.Indices);
            Assert.Equal("🏃\u200D♀\uFE0F", entity.Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f3c3-200d-2640-fe0f.png", entity.Url);
        }
コード例 #15
0
        public void ExtractEmojiEntities_VariationSelector_UnnecessaryEmojiStyleTest()
        {
            // 余分な U+FE0F が付いている場合
            var origText = "🍣\uFE0F"; // U+1F363 + U+FE0F (emoji style)
            var entities = TweetExtractor.ExtractEmojiEntities(origText).ToArray();

            Assert.Equal(2, entities.Length);

            Assert.Equal(new[] { 0, 1 }, entities[0].Indices);
            Assert.Equal("🍣", entities[0].Text);
            Assert.Equal("https://twemoji.maxcdn.com/2/72x72/1f363.png", entities[0].Url);

            Assert.Equal(new[] { 1, 2 }, entities[1].Indices);
            Assert.Equal("", entities[1].Text);
            Assert.Equal("", entities[1].Url);
        }