/// <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); }
/// <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; }
public MainWindow() { InitializeComponent(); m_Instance = this; dc = new DCInside(); }
/// <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; }