コード例 #1
0
ファイル: DataBuilder.cs プロジェクト: Neutronizer/DCViewer
        /// <summary>
        /// 현재 갤러리 페이지의 정보를 갱신합니다.
        /// </summary>
        /// <param name="parent">부모 DCInside 객체</param>
        /// <param name="htmlSrc">현재 갤러리 페이지의 HTML 소스</param>
        /// <param name="page">페이지 번호</param>
        /// <returns></returns>
        public static PageInfo BuildPageInfo(DCInside parent, string htmlSrc, int page)
        {
            HtmlDocument doc = new HtmlDocument();
            int idx = htmlSrc.IndexOf("table");
            doc.LoadHtml(htmlSrc);
            GalleryInfo gallInfo = BuildGalleryInfo(doc);

            // 페이지 내부의 글 목록을 가져옵니다.
            List<Article> articles = BuildArticleList(parent, doc, gallInfo);

            // 새로운 PageInfo 객체를 생성한 뒤 반환합니다.
            return new PageInfo(gallInfo, articles, page, 1);
        }
コード例 #2
0
ファイル: DataBuilder.cs プロジェクト: Neutronizer/DCViewer
        /// <summary>
        /// 현재 페이지의 글 목록을 반환합니다.
        /// </summary>
        /// <param name="parent">부모 DCInside 객체</param>
        /// <param name="doc">파싱된 HTML 소스를 가진 HtmlDocument 객체</param>
        /// <param name="gallInfo">현재 갤러리의 정보를 가진 GalleryInfo 객체</param>
        /// <returns></returns>
        private static List<Article> BuildArticleList(DCInside parent, HtmlDocument doc, GalleryInfo gallInfo)
        {
            List<Article> articles = new List<Article>();

            // 페이지 내부에 Table 요소는 하나뿐 이므로 하위의 TR만 가져온다. (tr중 class를 포함하지 않으면 테이블 헤더)
            foreach(HtmlNode trow in doc.DocumentNode.SelectNodes("//table//tr").Where(x => x.GetAttributeValue("class", "") == "tb"))
            {
                bool isNotice = false;  // 공지 여부
                int articleId = -1;     // 글 ID
                bool hasPic = false;    // 이미지 있는 글인지 여부
                bool isRec = false;     // 개념글 여부
                UserInfo userInfo = null;   // 사용자 정보 객체
                string title = "";      // 글 제목
                string date = "";       // 글 작성일
                int viewCnt = -1;       // 조회 수
                int commentCnt = 0;     // 댓글 수
                int recommendCnt = -1;  // 추천 수
                
                foreach(HtmlNode td in trow.Descendants("td"))
                {
                    if (isNotice)
                        continue;

                    switch(td.GetAttributeValue("class", "")){
                        case "t_notice":
                            if (td.InnerText != "공지")
                                articleId = int.Parse(td.InnerText);
                            else
                                isNotice = true;
                            break;
                        case "t_subject":
                            foreach(HtmlNode subjectNode in td.Descendants("a").Where(x=>x.GetAttributeValue("class", "") != ""))
                            {
                                title = HttpUtility.HtmlDecode(subjectNode.InnerText);

                                if(subjectNode.GetAttributeValue("class", "") == "icon_pic_n")
                                {
                                    hasPic = true;
                                    isRec = false;
                                }
                                else if(subjectNode.GetAttributeValue("class", "") == "icon_pic_b")
                                {
                                    hasPic = true;
                                    isRec = true;
                                }
                                else if (subjectNode.GetAttributeValue("class", "") == "icon_txt_n")
                                {
                                    hasPic = false;
                                    isRec = false;
                                }
                                else
                                {
                                    hasPic = true;
                                    isRec = true;
                                }
                            }
                            break;
                        case "t_date":
                            date = td.GetAttributeValue("title", "");
                            break;
                        case "t_hits":
                            if (viewCnt < 0)
                            {
                                viewCnt = int.Parse(td.InnerText);
                            }
                            else
                            {
                                recommendCnt = int.Parse(td.InnerText);
                            }
                            break; // 2016-02-12
                        case "t_writer user_layer":
                            string userid = td.GetAttributeValue("user_id", "");
                            if(userid == "") //유동
                            {
                                string user_name = td.GetAttributeValue("user_name", "");
                                userInfo = new UserInfo(user_name);
                            }
                            else // 고닉
                            {
                                HtmlNode imgNode = td.SelectNodes(".//img")[0];
                                string src = imgNode.GetAttributeValue("src", "");
                                string user_name = td.GetAttributeValue("user_name", "").Replace("\u8203", "");
                                string gallogLink = ExtractGallogURL(imgNode.GetAttributeValue("onClick", ""));
                                if (src.Contains("g_default")) // 유동고닉
                                {
                                    userInfo = new UserInfo(user_name, userid, false, gallogLink);
                                }
                                else // 고정닉
                                {
                                    userInfo = new UserInfo(user_name, userid, true, gallogLink);
                                }
                            }
                            break;
                    }
                }

                // 댓글 수를 가져오는 함수
                foreach(HtmlNode em in trow.Descendants("em"))
                {
                    var commentTxt = em.InnerText.Replace("[", "").Replace("]", "");
                    commentTxt = commentTxt.Substring(0, commentTxt.IndexOf("/") == -1 ? commentTxt.Length : commentTxt.IndexOf("/"));
                    commentCnt = int.Parse(commentTxt);
                }

                if (articleId == -1)
                    continue;

                // 새 글 객체를 생성한 후 배열에 넣는다
                Article art = new Article(parent, gallInfo, articleId, hasPic, isRec, title, commentCnt, userInfo, date, viewCnt, recommendCnt);

                articles.Add(art);
            }

            return articles;
        }
コード例 #3
0
 public MainWindow()
 {
     InitializeComponent();
     m_Instance = this;
     dc = new DCInside();
 }
コード例 #4
0
ファイル: Article.cs プロジェクト: Neutronizer/DCViewer
 /// <summary>
 /// 글을 초기화합니다.
 /// </summary>
 /// <param name="gall">글이 속한 갤러리의 정보입니다.</param>
 /// <param name="articleId">글의 ID입니다.</param>
 /// <param name="hasPicture">글에 사진이 있는가에 대한 여부입니다.</param>
 /// <param name="isRecommend">글이 개념글인지에 대한 여부입니다.</param>
 /// <param name="title">글의 제목입니다.</param>
 /// <param name="commentCnt">글의 댓글 수입니다.</param>
 /// <param name="writer">글을 작성한 글쓴이에 대한 정보입니다.</param>
 /// <param name="date">글을 작성한 시간입니다.</param>
 /// <param name="viewCnt">글의 조회수입니다.</param>
 /// <param name="recommendCnt">글의 추천수입니다.</param>
 public Article(DCInside parent, GalleryInfo gall, int articleId, bool hasPicture, bool isRecommend, string title, int commentCnt, UserInfo writer, string date, int viewCnt, int recommendCnt)
 {
     this.parent = parent;
     this.gallery = gall;
     this.articleId = articleId;
     this.hasPicture = hasPicture;
     this.isRecommend = isRecommend;
     this.title = title;
     this.commentCnt = commentCnt;
     this.writer = writer;
     this.date = DateTime.Parse(date);
     this.viewCnt = viewCnt;
     this.recommendCnt = recommendCnt;
 }