using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 전체 페이지 카운트 구하기 - GetTotalPageCount(itemCount, pageItemCount)
/// <summary>
/// 전체 페이지 카운트 구하기
/// </summary>
/// <param name="itemCount">항목 카운트</param>
/// <param name="pageItemCount">페이지당 항목 카운트</param>
/// <returns>전체 페이지 카운트</returns>
private static int GetTotalPageCount(int itemCount, int pageItemCount)
{
return (int)Math.Ceiling((double)itemCount / (double)pageItemCount);
}
#endregion
#region 항목 시작 인덱스 구하기 - GetItemStartIndex(totalPageCount, pageItemCount, pageIndex)
/// <summary>
/// 항목 시작 인덱스 구하기
/// </summary>
/// <param name="totalPageCount">전체 페이지 카운트</param>
/// <param name="pageItemCount">페이지당 항목 카운트</param>
/// <param name="pageIndex">페이지 인덱스</param>
/// <returns>항목 시작 인덱스</returns>
private static int GetItemStartIndex(int totalPageCount, int pageItemCount, int pageIndex)
{
if(pageIndex < 0 || pageIndex >= totalPageCount)
{
return -1;
}
int itemStartIndex = pageIndex * pageItemCount;
return itemStartIndex;
}
#endregion
#region 항목 종료 인덱스 구하기 - GetItemEndIndex(itemCount, pageItemCount, itemStartIndex)
/// <summary>
/// 항목 종료 인덱스 구하기
/// </summary>
/// <param name="itemCount">항목 카운트</param>
/// <param name="pageItemCount">페이지당 항목 카운트</param>
/// <param name="itemStartIndex">항목 시작 인덱스</param>
/// <returns>항목 종료 인덱스</returns>
private static int GetItemEndIndex(int itemCount, int pageItemCount, int itemStartIndex)
{
int itemEndIndex = Math.Min(itemCount - 1, itemStartIndex + pageItemCount - 1);
return itemEndIndex;
}
#endregion
#region HTML 페이지 파일명 구하기 - GetHTMLPageFileName(pageNumber)
/// <summary>
/// HTML 페이지 파일명 구하기
/// </summary>
/// <param name="pageNumber">페이지 번호</param>
/// <returns>HTML 페이지 파일명</returns>
/// <remarks>페이지 번호 : 1부터 시작한다.</remarks>
private static string GetHTMLPageFileName(int pageNumber)
{
return string.Format("page{0}.html", pageNumber);
}
#endregion
#region 페이지 링크 HTML 구하기 - GetPageLinkHTML(totalPageCount, pageRange, currentPage)
/// <summary>
/// 페이지 링크 HTML 구하기
/// </summary>
/// <param name="totalPageCount">전체 페이지 카운트</param>
/// <param name="pageRange">페이지 범위</param>
/// <param name="currentPage">현재 페이지</param>
/// <returns>페이지 링크 HTML</returns>
/// <remarks>현재 페이지 : 1부터 시작한다.</remarks>
private static string GetPageLinkHTML(int totalPageCount, int pageRange, int currentPage)
{
StringBuilder stringBuilder = new StringBuilder();
if(totalPageCount == 0)
{
return string.Empty;
}
stringBuilder.AppendLine("<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">");
stringBuilder.AppendLine("<tr>");
stringBuilder.AppendLine("<td>");
int rangeCount = currentPage / pageRange;
if(currentPage % pageRange == 0)
{
rangeCount = currentPage / pageRange - 1;
}
#region 첫번째 페이지 링크를 추가한다.
int firstPage = currentPage - pageRange;
if(firstPage > 0)
{
stringBuilder.AppendFormat("<a href=\"{0}\">첫번째 페이지</a>", GetHTMLPageFileName(1));
stringBuilder.AppendLine();
}
else
{
//stringBuilder.AppendLine("첫번째 페이지");
}
#endregion
#region 이전 페이지 링크를 추가한다.
if(currentPage > pageRange)
{
int pageNumber;
if(currentPage % pageRange == 0)
{
pageNumber = currentPage - pageRange;
}
else
{
pageNumber = currentPage - currentPage % pageRange;
}
stringBuilder.AppendFormat("<a href=\"{0}\">이전 페이지</a>", GetHTMLPageFileName(pageNumber));
stringBuilder.AppendLine();
}
else
{
//stringBuilder.AppendLine("이전 페이지");
}
#endregion
#region 페이지 링크를 추가한다.
for(int pageNumber = rangeCount * pageRange + 1; pageNumber < (rangeCount + 1) * pageRange + 1; pageNumber++)
{
string fontStartHTML = "<font size=\"2\">";
string fontEndHTML = "</font>";
if(pageNumber == currentPage)
{
fontStartHTML = "<font size=\"2\"><b>";
fontEndHTML = "</b></font>";
}
stringBuilder.AppendFormat("{0}<a href=\"{1}\">{2}</a>{3}",
fontStartHTML, GetHTMLPageFileName(pageNumber), pageNumber, fontEndHTML);
stringBuilder.AppendLine();
if(pageNumber == totalPageCount)
{
break;
}
}
#endregion
#region 다음 페이지 링크를 추가한다.
if(totalPageCount > (rangeCount + 1) * pageRange)
{
stringBuilder.AppendFormat("<a href=\"{0}\">다음 페이지</a>",
GetHTMLPageFileName((rangeCount + 1) * pageRange + 1));
stringBuilder.AppendLine();
}
else
{
//stringBuilder.AppendLine("다음 페이지");
}
#endregion
#region 마지막 페이지 링크를 추가한다.
int endPage = currentPage + pageRange;
if(endPage < totalPageCount)
{
stringBuilder.AppendFormat("<a href=\"{0}\">마지막 페이지</a>", totalPageCount);
stringBuilder.AppendLine();
}
else
{
//stringBuilder.AppendLine("마지막 페이지");
}
#endregion
stringBuilder.AppendLine("</td>");
stringBuilder.AppendLine("</tr>");
stringBuilder.AppendLine("</table>");
return stringBuilder.ToString();
}
#endregion
#region HTML 페이지 구하기 - GetHTMLPage(itemHorizontalCount, itemWidth, itemHeight, totalPageCount,
pageIndex, itemStartIndex, itemEndIndex)
/// <summary>
/// HTML 페이지 구하기
/// </summary>
/// <param name="itemHorizontalCount">항목 수평 카운트</param>
/// <param name="itemWidth">항목 너비</param>
/// <param name="itemHeight">항목 높이</param>
/// <param name="totalPageCount">전체 페이지 카운트</param>
/// <param name="pageIndex">페이지 인덱스</param>
/// <param name="itemStartIndex">항목 시작 인덱스</param>
/// <param name="itemEndIndex">항목 종료 인덱스</param>
/// <returns>HTML 페이지</returns>
private static string GetHTMLPage(int itemHorizontalCount, int itemWidth, int itemHeight, int totalPageCount,
int pageIndex, int itemStartIndex, int itemEndIndex)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("<html>");
stringBuilder.AppendLine("<head>");
stringBuilder.AppendLine("<meta charset=\"utf-8\">");
stringBuilder.AppendLine("<head>");
stringBuilder.AppendLine("<body>");
stringBuilder.AppendFormat("<h1>Page : {0}</h1>", pageIndex +1);
stringBuilder.AppendLine();
stringBuilder.AppendLine("<table>");
stringBuilder.AppendLine("<tr>");
int count = itemEndIndex - itemStartIndex + 1;
for(int i = 0; i < count; i++)
{
stringBuilder.AppendFormat("<td>Item {0}</td>", itemStartIndex + i + 1);
stringBuilder.AppendLine();
if(i > 0 && (i + 1) % itemHorizontalCount == 0)
{
stringBuilder.AppendLine("</tr>");
stringBuilder.AppendLine("<tr>");
}
}
stringBuilder.AppendLine("</tr>");
stringBuilder.AppendLine("</table>");
stringBuilder.AppendLine("<p></p>");
string pageLinkHTML = GetPageLinkHTML(totalPageCount, 10, pageIndex + 1);
stringBuilder.AppendLine(pageLinkHTML);
stringBuilder.AppendLine("</body>");
stringBuilder.AppendLine("</html>");
string htmlPage = stringBuilder.ToString();
return htmlPage;
}
#endregion
#region HTML 페이지 리스트 구하기 - GetHTMLPageList(itemCount, itemHorizontalCount, pageItemCount,
itemWidth, itemHeight)
/// <summary>
/// HTML 페이지 리스트 구하기
/// </summary>
/// <param name="itemCount">항목 카운트</param>
/// <param name="itemHorizontalCount">항목 수평 카운트</param>
/// <param name="pageItemCount">페이지당 항목 카운트</param>
/// <param name="itemWidth">항목 너비</param>
/// <param name="itemHeight">항목 높이</param>
/// <returns>HTML 페이지 리스트</returns>
private static List<string> GetHTMLPageList(int itemCount, int itemHorizontalCount, int pageItemCount,
int itemWidth, int itemHeight)
{
int totalPageCount = GetTotalPageCount(itemCount, pageItemCount);
List<string> list = new List<string>();
for(int pageIndex = 0; pageIndex < totalPageCount; pageIndex++)
{
int itemStartIndex = GetItemStartIndex(totalPageCount, pageItemCount, pageIndex);
int itemEndIndex = GetItemEndIndex(itemCount, pageItemCount, itemStartIndex);
string htmlPage = GetHTMLPage(itemHorizontalCount, itemWidth, itemHeight, totalPageCount,
pageIndex, itemStartIndex, itemEndIndex);
list.Add(htmlPage);
}
return list;
}
#endregion
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
#region 저장 디렉토리가 없는 경우 생성한다.
string saveDirectory = "c:\\temp";
if(!Directory.Exists(saveDirectory))
{
Directory.CreateDirectory(saveDirectory);
}
#endregion
// 536건의 항목들을 페이지당 100건씩 나눠서 HTML 페이지 파일을 생성한다.
// HTML 페이지에서 항목들을 한 줄에 4건씩 표시한다.
// 생성된 페이지는 [첫번째 페이지][이전 페이지][페이지 번호...][다음 페이지][마지막 페이지] 링크를 갖는다.
// 항목 너비와 높이는 HTML 문서 생성시 참조될 수 있으나 예제에서는 참조하지 않았다.
int itemCount = 536;
int pageItemCount = 100;
int itemHorizontalCount = 4;
int itemWidth = 200;
int itemHeight = 200;
List<string> htmlPageList = GetHTMLPageList(itemCount, itemHorizontalCount, pageItemCount, itemWidth, itemHeight);
for(int i = 0; i < htmlPageList.Count; i++)
{
string htmlPageFileName = GetHTMLPageFileName(i + 1);
File.WriteAllText(Path.Combine(saveDirectory, htmlPageFileName), htmlPageList[i]);
}
}
#endregion
}
}