public void OnFeedItemClick(RssSchema item)
 {
     Session.SelectedEntry     = item;
     Session.SelectedFeed      = Feed;
     Session.SelectedFeedItems = FeedItems;
     UriHelper.NavigateTo($"/entry/{HttpUtility.UrlEncode(item.InternalID)}");
 }
Beispiel #2
0
        public Feed(RssSchema schema)
        {
            Title   = schema.Title ?? "";
            Summary = schema.Summary ?? "";
            Content = schema.Content ?? "";
            string theme = AppTools.GetLocalSetting(Enums.AppSettings.Theme, "Light").ToLower();

            ImageUrl = schema.ImageUrl;
            if (string.IsNullOrEmpty(ImageUrl))
            {
                ImgVisibility = Visibility.Collapsed;
            }
            else if (ImageUrl.StartsWith("//"))
            {
                ImageUrl = "http:" + ImageUrl;
            }
            ExtraImageUrl = schema.ExtraImageUrl ?? "";
            MediaUrl      = schema.MediaUrl ?? "";
            InternalID    = schema.InternalID;
            FeedUrl       = schema.FeedUrl;
            Author        = schema.Author ?? AppTools.GetReswLanguage("App_NoAuthor");
            Date          = schema.PublishDate.ToString(AppTools.GetReswLanguage("App_DateFormat"));
            Categories    = schema.Categories;
            if (Categories == null || Categories.Count() == 0)
            {
                TagVisibility = Visibility.Collapsed;
            }
        }
        private static RssSchema GetRssSchema(XElement item)
        {
            RssSchema rssItem = new RssSchema
            {
                Author = GetItemAuthor(item),
                Title = Utility.DecodeHtml(item.GetSafeElementString("title").Trim()),
                Summary = RssHelper.SanitizeString(Utility.DecodeHtml(GetItemSummary(item)).Trim().Truncate(500, true)),
                Content = GetItemSummary(item),
                ImageUrl = GetItemImage(item),
                PublishDate = item.GetSafeElementDate("published"),
                FeedUrl = item.GetLink("alternate"),
            };

            string id = item.GetSafeElementString("guid").Trim();
            if (string.IsNullOrEmpty(id))
            {
                id = item.GetSafeElementString("id").Trim();
                if (string.IsNullOrEmpty(id))
                {
                    id = rssItem.FeedUrl;
                }
            }
            rssItem._id = id;
            return rssItem;
        }
Beispiel #4
0
        private async Task FeedReInit(RssSchema data)
        {
            bool isUnread = Convert.ToBoolean(AppTools.GetLocalSetting(AppSettings.IsJustUnread, "False"));

            if (!isUnread)
            {
                ShowFeeds.Insert(0, _sourceFeed);
            }
            ShowFeeds.Remove(data);
            _sourceFeed          = data;
            LoadingRing.IsActive = true;
            if (MainPage.Current.ChannelListView.SelectedItem != null)
            {
                var selectChannel = MainPage.Current.ChannelListView.SelectedItem as Channel;
                if (MainPage.Current.ReadableList.Any(c => c.Id == selectChannel.Id))
                {
                    DetailWebView.NavigateToString("");
                    SmartReader.Article article = await SmartReader.Reader.ParseArticleAsync(_sourceFeed.FeedUrl);

                    if (article.IsReadable || !string.IsNullOrEmpty(article.TextContent))
                    {
                        _sourceFeed.Content = article.Content;
                    }
                    else
                    {
                        new PopupToast(AppTools.GetReswLanguage("Tip_ReadError"), AppTools.GetThemeSolidColorBrush(ColorType.ErrorColor)).ShowPopup();
                    }
                }
            }
            await UpdateFeed();

            LoadingRing.IsActive = false;
        }
Beispiel #5
0
        /// <summary>
        /// RSS all versions
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        private static RssSchema ParseItem(XElement item)
        {
            var rssItem = new RssSchema();
            rssItem.Title = Utility.DecodeHtml(item.GetSafeElementString("title").Trim());
            rssItem.FeedUrl = item.GetSafeElementString("link");

            rssItem.Author = GetItemAuthor(item);

            string description = item.GetSafeElementString("description");
            if (string.IsNullOrEmpty(description))
            {
                description = item.GetSafeElementString("content");
            }

            rssItem.Summary = RssHelper.SanitizeString(Utility.DecodeHtml(description).Trim().Truncate(500, true));
            rssItem.Content = RssHelper.SanitizeString(description);

            string id = item.GetSafeElementString("guid").Trim();
            if (string.IsNullOrEmpty(id))
            {
                id = item.GetSafeElementString("id").Trim();
                if (string.IsNullOrEmpty(id))
                {
                    id = rssItem.FeedUrl;
                }
            }
            rssItem.Id = id;

            return rssItem;
        }
        private static RssSchema GetRssSchema(XElement item)
        {
            RssSchema rssItem = new RssSchema
            {
                Author      = GetItemAuthor(item),
                Title       = Utility.DecodeHtml(item.GetSafeElementString("title").Trim()),
                Summary     = RssHelper.SanitizeString(Utility.DecodeHtml(GetItemSummary(item)).Trim().Truncate(500, true)),
                Content     = GetItemSummary(item),
                ImageUrl    = GetItemImage(item),
                PublishDate = item.GetSafeElementDate("published"),
                FeedUrl     = item.GetLink("alternate"),
            };

            string id = item.GetSafeElementString("guid").Trim();

            if (string.IsNullOrEmpty(id))
            {
                id = item.GetSafeElementString("id").Trim();
                if (string.IsNullOrEmpty(id))
                {
                    id = rssItem.FeedUrl;
                }
            }
            rssItem._id = id;
            return(rssItem);
        }
Beispiel #7
0
 private void SendNotification(string title, RssSchema content)
 {
     if (!string.IsNullOrEmpty(title))
     {
         var toast = GenerateToastContent(title, content);
         ToastNotification notification = new ToastNotification(toast.GetXml());
         ToastNotificationManager.CreateToastNotifier().Show(notification);
     }
 }
Beispiel #8
0
 static string GetMessageFromTemplate(string Template, RssSchema post)
 {
     return(Template.Replace("{{Author}}", post.Author, StringComparison.OrdinalIgnoreCase)
            .Replace("{{Title}}", post.Title, StringComparison.OrdinalIgnoreCase)
            .Replace("{{Summary}}", post.Summary, StringComparison.OrdinalIgnoreCase)
            .Replace("{{FeedUrl}}", post.FeedUrl, StringComparison.OrdinalIgnoreCase)
            .Replace("{{ImageUrl}}", post.ImageUrl, StringComparison.OrdinalIgnoreCase)
            .Replace("{{MediaUrl}}", post.MediaUrl, StringComparison.OrdinalIgnoreCase)
            .Replace("{{ExtraImageUrl}}", post.ExtraImageUrl, StringComparison.OrdinalIgnoreCase)
            .Replace("{{PubDate}}", post.PublishDate.ToString("f"), StringComparison.OrdinalIgnoreCase));
 }
Beispiel #9
0
 public NewsViewModel(RssSchema model)
 {
     Title         = model.Title;
     Summary       = model.Summary;
     Content       = model.Content;
     ImageUrl      = model.ImageUrl;
     ExtraImageUrl = model.ExtraImageUrl;
     MediaUrl      = model.MediaUrl;
     FeedUrl       = model.FeedUrl;
     Author        = model.Author;
     PublishDate   = model.PublishDate;
 }
Beispiel #10
0
        /// <summary>
        /// 创建动态卡片所需的布局
        /// </summary>
        /// <param name="name">笔记名</param>
        /// <param name="markdown">笔记内容</param>
        /// <returns></returns>
        public async static Task <string> CreateAdaptiveJson(RssSchema feed)
        {
            var jsonFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Card.json"));

            string json = await FileIO.ReadTextAsync(jsonFile);

            string imageLink = feed.ImageUrl;

            json = json.Replace("$IMAGE$", imageLink);
            json = json.Replace("$TITLE$", feed.Title);
            json = json.Replace("$CONTENT$", feed.Summary);
            return(json);
        }
Beispiel #11
0
        private ToastContent GenerateToastContent(string title, RssSchema schema)
        {
            var content = new ToastContent()
            {
                Launch   = $"{schema.FeedUrl}",
                Scenario = ToastScenario.Default,
                Visual   = new ToastVisual()
                {
                    BindingGeneric = new ToastBindingGeneric()
                    {
                        Children =
                        {
                            new AdaptiveText()
                            {
                                Text = title, HintMaxLines = 1
                            },
                            new AdaptiveText()
                            {
                                Text = schema.Title
                            }
                        },
                        Attribution = new ToastGenericAttributionText()
                        {
                            Text = GetLanguage("RSS 追踪", "RSS Stalker")
                        }
                    }
                },
                ActivationType = ToastActivationType.Foreground
            };

            if (!string.IsNullOrEmpty(schema.ImageUrl))
            {
                content.Visual.BindingGeneric.HeroImage = new ToastGenericHeroImage()
                {
                    Source = schema.ImageUrl
                };
            }
            return(content);
        }
Beispiel #12
0
        /// <summary>
        /// 生成时间线卡片
        /// </summary>
        /// <param name="feed"></param>
        /// <returns></returns>
        private async Task GenerateActivityAsync(RssSchema feed)
        {
            try
            {
                UserActivityChannel channel      = UserActivityChannel.GetDefault();
                UserActivity        userActivity = await channel.GetOrCreateUserActivityAsync(feed.InternalID);

                userActivity.VisualElements.DisplayText = feed.Title;
                userActivity.VisualElements.Content     = AdaptiveCardBuilder.CreateAdaptiveCardFromJson(await AppTools.CreateAdaptiveJson(feed));
                //Populate required properties
                string url = $"richasy-rss://feed?id={WebUtility.UrlEncode(feed.InternalID)}&summary={WebUtility.UrlEncode(feed.Summary)}&date={WebUtility.UrlEncode(feed.PublishDate.ToString())}&img={WebUtility.UrlEncode(feed.ImageUrl)}&url={WebUtility.UrlDecode(feed.FeedUrl)}&title={WebUtility.UrlEncode(feed.Title)}&content={WebUtility.UrlEncode(feed.Content)}";
                userActivity.ActivationUri = new Uri(url);
                await userActivity.SaveAsync(); //save the new metadata

                //Dispose of any current UserActivitySession, and create a new one.
                _currentActivity?.Dispose();
                _currentActivity = userActivity.CreateSession();
            }
            catch (Exception)
            {
                return;
            }
        }
Beispiel #13
0
        /// <summary>
        /// RSS all versions
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        private static RssSchema ParseItem(XElement item)
        {
            var rssItem = new RssSchema();

            rssItem.Title   = Utility.DecodeHtml(item.GetSafeElementString("title").Trim());
            rssItem.FeedUrl = item.GetSafeElementString("link");

            rssItem.Author = GetItemAuthor(item);

            string description = item.GetSafeElementString("encoded", NsRdfContentNamespaceUri);

            if (string.IsNullOrEmpty(description))
            {
                description = item.GetSafeElementString("description");
                if (string.IsNullOrEmpty(description))
                {
                    description = item.GetSafeElementString("content");
                }
            }

            rssItem.Summary = RssHelper.SanitizeString(Utility.DecodeHtml(description).Trim().Truncate(500, true));
            rssItem.Content = RssHelper.SanitizeString(description);

            string id = item.GetSafeElementString("guid").Trim();

            if (string.IsNullOrEmpty(id))
            {
                id = item.GetSafeElementString("id").Trim();
                if (string.IsNullOrEmpty(id))
                {
                    id = rssItem.FeedUrl;
                }
            }
            rssItem._id = id;

            return(rssItem);
        }
Beispiel #14
0
 private Task SendMessage(RssSchema schema) =>
 _sender.Send($"{schema.Title}{Environment.NewLine}{schema.FeedUrl}");
Beispiel #15
0
        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            if (e.NavigationMode == NavigationMode.Back)
            {
                ReadabilityButton.IsEnabled = true;
                return;
            }
            if (e.Parameter != null)
            {
                ShowFeeds.Clear();
                // 这种情况表明入口点为频道
                if (e.Parameter is Tuple <RssSchema, List <RssSchema> > )
                {
                    var anim = ConnectedAnimationService.GetForCurrentView().GetAnimation("ForwardConnectedAnimation");
                    if (anim != null)
                    {
                        anim.TryStart(TitleTextBlock);
                    }
                    LoadingRing.IsActive = true;
                    var  data         = e.Parameter as Tuple <RssSchema, List <RssSchema> >;
                    bool isUnread     = Convert.ToBoolean(AppTools.GetLocalSetting(AppSettings.IsJustUnread, "False"));
                    bool isCollection = Convert.ToBoolean(MainPage.Current.TodoButton.IsChecked) || Convert.ToBoolean(MainPage.Current.StarButton.IsChecked);

                    _sourceFeed         = data.Item1;
                    AllFeeds            = data.Item2;
                    TitleTextBlock.Text = _sourceFeed.Title;
                    MainPage.Current.AddReadId(_sourceFeed.InternalID);
                    foreach (var item in AllFeeds)
                    {
                        if (item.InternalID != _sourceFeed.InternalID)
                        {
                            if (isUnread && !isCollection && !MainPage.Current.ReadIds.Contains(item.InternalID))
                            {
                                ShowFeeds.Add(item);
                            }
                            else if (!isUnread || isCollection)
                            {
                                ShowFeeds.Add(item);
                            }
                        }
                    }
                    if (MainPage.Current.ChannelListView.SelectedItem != null)
                    {
                        var selectChannel = MainPage.Current.ChannelListView.SelectedItem as Channel;
                        if (MainPage.Current.ReadableList.Any(c => c.Id == selectChannel.Id))
                        {
                            SmartReader.Article article = await SmartReader.Reader.ParseArticleAsync(_sourceFeed.FeedUrl);

                            if (article.IsReadable || !string.IsNullOrEmpty(article.TextContent))
                            {
                                _sourceFeed.Content = article.Content;
                            }
                            else
                            {
                                new PopupToast(AppTools.GetReswLanguage("Tip_ReadError"), AppTools.GetThemeSolidColorBrush(ColorType.ErrorColor)).ShowPopup();
                            }
                        }
                    }
                    _sourceContent = _sourceFeed.Content;
                    await GenerateActivityAsync(_sourceFeed);
                }
                // 这种情况表明入口点是动态卡片
                else if (e.Parameter is string[])
                {
                    var data = e.Parameter as string[];
                    _sourceFeed = new RssSchema()
                    {
                        InternalID  = data[0],
                        Title       = data[1],
                        Content     = data[2],
                        FeedUrl     = data[3],
                        ImageUrl    = data[4],
                        PublishDate = Convert.ToDateTime(data[5]),
                        Summary     = data[6],
                    };
                    _sourceContent            = data[2];
                    LoadingRing.IsActive      = true;
                    GridViewButton.Visibility = Visibility.Collapsed;
                    SideListButton.Visibility = Visibility.Collapsed;
                    FeedListView.Visibility   = Visibility.Collapsed;
                    Grid.SetColumn(SideControlContainer, 1);
                    MainPage.Current.SideHide();
                    SideControlContainer.HorizontalAlignment = HorizontalAlignment.Right;
                    SideControlContainer.Margin = new Thickness(0, 0, 10, 0);
                    DetailSplitView.IsPaneOpen  = false;
                }
                // 入口点是通知
                else if (e.Parameter is string)
                {
                    string url = e.Parameter as string;
                    _sourceFeed = new RssSchema
                    {
                        InternalID = url,
                        FeedUrl    = url
                    };
                    var content = await ReadabilityFromUrl(url);

                    _sourceFeed.Content       = content.Content ?? content.TextContent;
                    _sourceFeed.Title         = content.Title;
                    _sourceFeed.PublishDate   = Convert.ToDateTime(content.PublicationDate).ToLocalTime();
                    _sourceFeed.ImageUrl      = content.FeaturedImage;
                    _sourceContent            = content.Content ?? content.TextContent;
                    LoadingRing.IsActive      = true;
                    GridViewButton.Visibility = Visibility.Collapsed;
                    SideListButton.Visibility = Visibility.Collapsed;
                    FeedListView.Visibility   = Visibility.Collapsed;
                    Grid.SetColumn(SideControlContainer, 1);
                    MainPage.Current.SideHide();
                    SideControlContainer.HorizontalAlignment = HorizontalAlignment.Right;
                    SideControlContainer.Margin = new Thickness(0, 0, 10, 0);
                    DetailSplitView.IsPaneOpen  = false;
                }
                ButtonStatusCheck();
                TitleTextBlock.Text = _sourceFeed.Title;
                string html = await PackageHTML(_sourceFeed.Content ?? _sourceFeed.Summary);

                DetailWebView.NavigateToString(html);
                string fontFamily       = AppTools.GetLocalSetting(AppSettings.ReadFontFamily, "Tw Cen MT");
                string fontSize         = AppTools.GetLocalSetting(AppSettings.ReadFontSize, "16");
                var    selectFontFamily = MainPage.Current.SystemFonts.Where(p => p.Name == fontFamily).FirstOrDefault();
                FontFamilyComboBox.SelectedItem = selectFontFamily;
                FontSizeTextBox.Text            = fontSize;
                _isInit = true;
            }
        }