public void OnFeedItemClick(RssSchema item) { Session.SelectedEntry = item; Session.SelectedFeed = Feed; Session.SelectedFeedItems = FeedItems; UriHelper.NavigateTo($"/entry/{HttpUtility.UrlEncode(item.InternalID)}"); }
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; }
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; }
/// <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); }
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); } }
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)); }
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; }
/// <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); }
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); }
/// <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; } }
/// <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); }
private Task SendMessage(RssSchema schema) => _sender.Send($"{schema.Title}{Environment.NewLine}{schema.FeedUrl}");
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; } }