コード例 #1
0
        public static ScheduleItem Parse(CQ element)
        {
            var speaker = element.Find(".before_hour_text").Text();
            string speakerUrl = !string.IsNullOrWhiteSpace(speaker) ? element.Find(".event_header").Attr("href") : null;
            string title = element.Find(".event_header").Text();

            string startTimeText = element.Find(".top_hour span").First().Text();
            string endTimeText = element.Find(".bottom_hour span").First().Text();

            var startTime = TimeSpan.ParseExact(startTimeText, "g", CultureInfo.InvariantCulture);
            var endTime = TimeSpan.ParseExact(endTimeText, "g", CultureInfo.InvariantCulture);

            return new ScheduleItem(title, speaker, speakerUrl, startTime, endTime);
        }
コード例 #2
0
        private static IEnumerable<ScheduleItem> FromTable(CQ tableElement)
        {
            var itemElements = tableElement.Find("tbody tr .event .event_container");

            for (int i = 0; i < itemElements.Length; i++)
            {
                var item = itemElements.Eq(i);

                yield return ScheduleItem.Parse(item);
            }
        }
コード例 #3
0
    public static IHtmlString CustomXhtmlString(this HtmlHelper helper, XhtmlString value)
    {
      var htmlString = helper.XhtmlString(value).ToHtmlString();
      
      var headline = LocalizationService.Current
        .GetString("/views/common/linklist/headline");
      
      var cq = new CQ(htmlString, HtmlParsingMode.Document);
      cq.Find("ul.link-list").Each(list =>
        {
          var box = CQ.CreateFragment(
            "<div class=\"link-list\">" 
            + "<h4><span class=\"glyphicon glyphicon-link\"></span> " 
            + headline
            + "</h4></div>");
          list.RemoveClass("link-list");
          box.Append(list.OuterHTML);
          list.Cq().ReplaceWith(box);
        });

      return new MvcHtmlString(cq.Find("body").Html());
    }
コード例 #4
0
        public static Dictionary<string, string> GetInputFields(CQ dom)
        {
            Dictionary<string, string> result = new Dictionary<string, string>();
            foreach (var v in dom.Find("input"))
            {
                var value = v.Cq().Attr("value");
                var key = v.Cq().Attr("name");
                if (!string.IsNullOrWhiteSpace(value) && !string.IsNullOrWhiteSpace(key))
                {
                    if (!result.ContainsKey(key))
                    {
                        result.Add(key, value);
                    }
                    else
                    {
                        result[key] = value;
                    }
                }
            }

            // Get all selects
            foreach (var s in dom.Select("select"))
            {
                var select = s.Cq();
                var key = select.Attr("name");
                foreach (var option in select.Children("option"))
                {
                    var opt = option.Cq();
                    if (!string.IsNullOrWhiteSpace(opt.Attr("selected")))
                    {
                        if (!result.ContainsKey(key))
                        {
                            result.Add(key, opt.Val());
                        }
                        else
                        {
                            result[key] = opt.Val();
                        }
                    }
                }
            }

            return result;
        }
コード例 #5
0
ファイル: Volume.cs プロジェクト: EusthEnoptEron/BakaPrince
        /// <summary>
        /// Parses volume information based on its title element.
        /// </summary>
        /// <param name="hEl"></param>
        public Volume(CQ ul)
        {
            ul.Find("li").Each((el) =>
            {
                var link = new CQ(el).Find("a").First();
                if (link.Count() == 0) return;

                var name = Regex.Replace(link.Attr("href"), "^.+title=", "");

                if (name.Contains("Illustrations") && _illustrationsPage == null)
                {
                    _illustrationsPage = new IllustrationsPage(name);
                }
                else
                {
                    _chapters.Add(new Chapter(name, link.Text()));
                }
            });
        }
コード例 #6
0
 private static ParsedRSSFeedLink ParseLink(IDomObject linkNode)
 {
     ParsedRSSFeedLink parsedRSSFeedLink;
     CQ linkCq = new CQ(linkNode.Clone());
     CQ aCq = linkCq.Find("a");
     if (aCq.Any())
     {
         ParsedRSSFeedLink parsedRSSFeedLink1 = new ParsedRSSFeedLink
         {
             LinkURL = aCq.Attr<string>("href"),
             LinkTitle = aCq.First().Text()
         };
         ParsedRSSFeedLink link = parsedRSSFeedLink1;
         aCq.FirstElement().Remove();
         link.Description = linkCq.Text().Trim();
         parsedRSSFeedLink = link;
     }
     else
     {
         parsedRSSFeedLink = null;
     }
     return parsedRSSFeedLink;
 }
コード例 #7
0
ファイル: Page.cs プロジェクト: EusthEnoptEron/BakaPrince
        private string PrepareHtml(string html)
        {
            // Make title
            if (!Notitle)
            {
                html = "<h2>" + Title + "</h2>" + html;
            }
             html = "<span class=\"invisible chapterstart\">" + (Noheader ? "" : Title) + "</span>" + html;

            // Make sure page break is set
            if (Pagebreak)
            {
                html = "<span class=\"invisible pagebreak\"></span>" + html;
            }

            CQ dom = CQ.CreateFragment("<div class=\"content\">" + html + "</div>");

            // Remove next/prev table
            dom.Find("table:contains('Forward'):contains('Back')").Last().Remove();

            // Find images
            foreach(IDomElement aNode in dom.Find("a.image")) {
                var a = new CQ(aNode);
                var img = new CQ(a.Find("img"));

                var src = img.Attr("src").Replace("/thumb", "");
                src = Regex.Replace(src, @"[.](jpg|png|gif)\/.+$", @".$1", RegexOptions.IgnoreCase);

                var image = new Image(src, new Uri(Wiki)) {Sashie = true};

                CQ node = a.Closest(".thumb").Add(a).First();

                if (_images.Count == 0 && EntryPicture)
                {
                    // We can view it as a full-fledged image since we don't need to worry about text-flow
                    image.Sashie = false;
                    dom.Before(image.Html);
                }
                else
                {
                    node.Before(image.Html);
                    //node.After("<span class=\"image-stopper\"></span>");
                }

                node.Remove();

                _images.Add(image);
            }

            // Catch references
            foreach (IDomElement supNode in dom.Find("sup.reference"))
            {
                var sup = new CQ(supNode);
                CQ footnote = "<span class=\"fn\"></span>";
                CQ oldFootnote = dom.Find("#" + sup.Attr("id").Replace("_ref-", "_note-"));

                footnote.Html(oldFootnote.Find(".reference-text").Html());

                oldFootnote.Remove();
                sup.Before(footnote).Remove();
            }
            // Remove possible reference title
            dom.Find(".references").Prev(":header").Remove();

            // Remove edit links
            dom.Find(".editsection, #toc").Remove();

            // Make smart quotes
            dom.Find("p:contains('\"'), p:contains(\"'\"), li:contains('\"'), li:contains(\"'\")").Each((el) =>
            {
                CQ p = new CQ(el);
                string pHtml = p.Html();

                // Replace quotes
                if (Regex.Matches(pHtml, "&quot;").Count % 2 == 0)
                {

                    pHtml = Regex.Replace(pHtml, "&quot;(.+?)&quot;", "“$1”");
                }
                else
                {
                    Console.WriteLine("NOTICE: possible quotes problem ({0})", pHtml.Trim());
                }

                // Replace single quotes (\b doesn't work)
                pHtml = Regex.Replace(pHtml, "(?<!\\w)'(.+?)'(?!\\w)", "‘$1’");
                // Replace apostrophes
                pHtml = Regex.Replace(pHtml, "'", "’");

                p.Html(pHtml);
            });

            // Parse Ruby
            dom.Find("span > span > span").Each(el =>
            {
                var rubySpan = new CQ(el);
                if(rubySpan.Css("position") == "relative" && rubySpan.Css("left") == "-50%") {
                    var textSpan = rubySpan.Parent().Siblings("span");
                    var containerSpan = textSpan.Parent();
                    if (textSpan.Length == 1 && containerSpan.Css("white-space") == "nowrap")
                    {
                        // Okay, this is ruby.
                        var ruby = new CQ("<ruby>");
                        ruby.Html(textSpan.Html());
                        ruby.Append(new CQ("<rp>(</rp>"));
                        ruby.Append(new CQ("<rt>").Html(rubySpan.Html()));
                        ruby.Append(new CQ("<rp>)</rp>"));

                        containerSpan.ReplaceWith(
                            ruby
                        );

                    }
                }
            });

            // Hakomari specific
            foreach (IDomElement star in dom.Find("p:contains(✵)"))
            {
                star.InnerHTML = "<img src=\"" + (new Uri( Helper.GetAssetsPath() + "blackstar.jpg" )) + "\">";
            }

            return dom.Render();
        }
コード例 #8
0
        private bool DetermineIfMessageIsCloseVoteRequest(CQ messageContentsNode)
        {
            //message contains "cv-pls", "cv-plz", or "close", and has a link

            var triggerPhrases = new[]
            {
                "cv-pls",
                "cv-plz",
                "close"
            };

            var text = messageContentsNode.Text();

            var hasTriggerPhrase = triggerPhrases
                .Select(x => text.Contains(x))
                .Any(x => x);

            var hasLink = messageContentsNode.Find("a").Any();

            return hasTriggerPhrase && hasLink;
        }
コード例 #9
0
        private static IEnumerable<ScheduleTableDay> GetScheduleTableDays(CQ pageQuery)
        {
            var titleElement = pageQuery.Find("h1");

            var tableElement = pageQuery.Find("#all-events table.tt_timetable");

            yield return new ScheduleTableDay { TitleElement = titleElement, TableElement = tableElement };
        }
コード例 #10
0
        private static IEnumerable<string> GetHeaders(CQ tableElement)
        {
            var headers = tableElement.Find("thead tr th").Skip(1).ToList();

            var headerTexts = headers.Select(x => (x.InnerText ?? string.Empty).Trim());
            return headerTexts;
        }
コード例 #11
0
 static string ParseBlockTitle(CQ head)
 {
     return head.Find("div.block-events-head").Children().Remove().End().Text().Trim();
 }