Пример #1
0
        /// <summary>
        /// Get a What If article by ID
        /// </summary>
        /// <param name="id">Article ID</param>
        /// <returns>What If article if found, null otherwise</returns>
        public static WhatIfArticle GetArticle(int id)
        {
            WhatIfArticle article = XkcdDatabase.GetWhatIfArticle(id);

            if (article != null)
            {
                return(article);
            }
            if (WhatIfDictionary.Keys.Contains(id))
            {
                return(GetArticle(WhatIfDictionary[id]));
            }
            return(null);
        }
Пример #2
0
        /// <summary>
        /// Gets a comic by ID
        /// </summary>
        /// <param name="id">Comic ID</param>
        /// <returns>Requested comic</returns>
        public static Comic GetComic(int id)
        {
            Comic comic = XkcdDatabase.GetComic(id);

            if (comic != null)
            {
                return(comic);
            }
            if (ComicDictionary.Keys.Contains(id))
            {
                return(GetComic(ComicDictionary[id]));
            }
            return(null);
        }
Пример #3
0
        /// <summary>
        /// Gets a comic from a comic archive entry
        /// </summary>
        /// <param name="comicArchiveEntry">Comic archive entry</param>
        /// <returns>Comic object</returns>
        public static Comic GetComic(ComicArchiveEntry comicArchiveEntry)
        {
            Comic comic = XkcdDatabase.GetComic(comicArchiveEntry.Id);

            if (comic != null)
            {
                return(comic);
            }
            var          permaLink = $"https://xkcd.com/{comicArchiveEntry.Id}/";
            var          web       = new HtmlWeb();
            HtmlDocument doc       = web.Load(permaLink);

            return(GetComic(comicArchiveEntry, permaLink, doc));
        }
Пример #4
0
        /// <summary>
        /// Gets a What If Article from an archive entry
        /// </summary>
        /// <param name="archiveEntry">Archive entry</param>
        /// <returns>Whar If Article</returns>
        public static WhatIfArticle GetArticle(WhatIfArchiveEntry archiveEntry)
        {
            WhatIfArticle article = XkcdDatabase.GetWhatIfArticle(archiveEntry.Id);

            if (article != null)
            {
                return(article);
            }
            var          web = new HtmlWeb();
            HtmlDocument doc = web.Load(archiveEntry.PermaLink);
            HtmlNode     articleContentNode = doc.DocumentNode.Descendants().FirstOrDefault(x => x.Name == "article" && x.HasClass("entry"));

            article = new WhatIfArticle
            {
                Id        = archiveEntry.Id,
                PermaLink = archiveEntry.PermaLink,
                Title     = archiveEntry.Title,
                Date      = archiveEntry.Date,
                Html      = articleContentNode.OuterHtml
            };
            XkcdDatabase.InsertOrUpdateWhatIfArticle(article);
            return(article);
        }
Пример #5
0
        /// <summary>
        /// Gets a comic from a comic archive entry, comic url, and html document
        /// </summary>
        /// <param name="comicArchiveEntry">Comic archive entry</param>
        /// <param name="url">Comic permalink</param>
        /// <param name="doc">Comic webpage html document</param>
        /// <returns>Comic object</returns>
        private static Comic GetComic(ComicArchiveEntry comicArchiveEntry, string url, HtmlDocument doc)
        {
            string imageUrl = string.Empty;
            string altText  = string.Empty;

            switch (comicArchiveEntry.Id)
            {
            case 1350:
                imageUrl = "https://imgs.xkcd.com/comics/shouldnt_be_hard.png";
                altText  = "Every choice, no matter how small, begins a new story.";
                break;

            case 1416:
                imageUrl = "https://imgs.xkcd.com/comics/pixels.png";
                altText  = "It's turtles all the way down.";
                break;

            case 1506:
                imageUrl = "https://imgs.xkcd.com/comics/xkcloud.png";
                altText  = string.Empty;                        // No alt text for this comic
                break;

            case 1525:
                imageUrl = "https://imgs.xkcd.com/comics/emojic_8_ball.png";
                altText  = string.Empty;                        // No alt text for this comic
                break;

            case 1608:
                // This comic is interactive, and difficult.
                // TODO: I should find a better way to display this one
                imageUrl = string.Empty;
                altText  = string.Empty;
                break;

            case 1663:
                imageUrl = string.Empty;                         // Interactive with no static image
                altText  = "Relax";
                break;

            case 2067:
                imageUrl = "https://imgs.xkcd.com/comics/challengers.png";
                altText  = "Use your mouse or fingers to pan + zoom. To edit the map, submit your ballot on November 6th.";
                break;

            case 2198:
                imageUrl = "https://imgs.xkcd.com/comics/throw.png";
                altText  = "The keys to successfully throwing a party are location, planning, and one of those aircraft carrier steam catapults.";
                break;

            default:
                HtmlNode comicNode      = doc.DocumentNode.Descendants().Where(y => y.Id == "comic").FirstOrDefault();
                HtmlNode comicImageNode = comicNode.Descendants().Where(x => x.Name == "img").FirstOrDefault();

                if (comicImageNode != null)
                {
                    if (comicImageNode.Attributes["src"] != null)
                    {
                        imageUrl = $"https:{comicImageNode.Attributes["src"].DeEntitizeValue}";
                    }
                    if (comicImageNode.Attributes["title"] != null)
                    {
                        altText = comicImageNode.Attributes["title"].DeEntitizeValue;
                    }
                }
                break;
            }

            var comic = new Comic
            {
                Id        = comicArchiveEntry.Id,
                ImageUrl  = imageUrl,
                AltText   = altText,
                Title     = comicArchiveEntry.Title,
                PermaLink = url,
                Date      = comicArchiveEntry.Date
            };

            XkcdDatabase.InsertOrUpdateComic(comic);
            return(comic);
        }