package com.kingschan.blog.common.freemarker.directive;
import java.io.IOException;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.kingschan.blog.services.ArticleService;
import com.kingschan.blog.util.DateUtil;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
/**
*
* <pre>
* 类名称:CalendarDirective
* 类描述: 日期控件
* 创建人:陈国祥 (kingschan)
* 创建时间:2016-3-1 下午1:51:46
* 修改人:Administrator
* 修改时间:2016-3-1 下午1:51:46
* 修改备注:
* @version V1.0
* </pre>
*/
@Component("Calendar")
public class CalendarDirective implements TemplateDirectiveModel{
@Autowired
private ArticleService article_serv;
@Override
public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, TemplateModel[] tm, TemplateDirectiveBody body)
throws TemplateException, IOException {
String date =params.containsKey("date")&¶ms.get("date").toString().matches("\\d+")?params.get("date").toString():null;
String websiteid =params.containsKey("websiteid")&¶ms.get("websiteid").toString().matches("\\w+")?params.get("websiteid").toString():"";
String url =params.containsKey("url")&&!params.get("url").toString().isEmpty()?params.get("url").toString():"";
int year =0;
int month =0;
if (null!=date) {
year=Integer.valueOf(date.substring(0, 4));
month=Integer.valueOf(date.substring(4,6));
}
String html=builderHtml(year, month, url,websiteid);
env.getOut().write(html);
}
public Map<String, Object> getData(int year,int month,String websiteid){
Map<String, Object> data=null;
try {
//使用缓存
data = article_serv.getEveryDayArticleInfoForCache(String.format("%s,%s,%s", websiteid,year,month));
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/**
* 格式化
* @param year
* @param month
* @param day
* @return
*/
public String formartDate(int year,int month,int day){
String t_day=day<10?"0"+day:String.valueOf(day);
String t_month=month<10?"0"+month:String.valueOf(month);
return String.format("%s-%s-%s", year,t_month,t_day);
}
public String builderHtml(int year,int month,String url,String websiteid){
//根据日历类对象的方法,实例化一个当前的日历类对象
Calendar calendar=Calendar.getInstance();
if (year==0||month==0) {
year= calendar.get(Calendar.YEAR);
month= calendar.get(Calendar.MONTH)+1;
}
//设置日历对象的年月日
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);//月份是0-11
calendar.set(Calendar.DATE, 1);
Map<String, Object> data =getData(year, month, websiteid);
//得到当前月份的最大值
int day=calendar.getActualMaximum(Calendar.DATE);
//得到本月中的第一天是星期几
int week=calendar.get(Calendar.DAY_OF_WEEK);
int count=0;//一个计数的变量
//打印日历的星期
StringBuffer sb = new StringBuffer();
sb.append(String.format("<p class='text-center'>%s %s年%s月 %s</p>",dateLink(url, year, month, false), year,month,dateLink(url, year, month, true)));
sb.append("<table style='text-align: center;'>");
String strDate[]={"星期日\t","星期一\t","星期二\t","星期三\t","星期四\t","星期五\t","星期六\t"};
sb.append("<tr>");
for (int i = 0; i < strDate.length; i++) {
sb.append("<td><b>").append(strDate[i]).append("</b></td>");
}
sb.append("</tr>");
StringBuffer temp = new StringBuffer();
//判断第一天对应的是星期几
while (count<week-1) {
temp.append("<td></td>");
count++;//计数变量自增
}
//循环打印日历
for (int i = 1; i <= day; i++,count++) {
if (count%7==0&&count!=0) {
sb.append("<tr>").append(temp.toString()).append("</tr>");
temp = new StringBuffer();
}
temp.append("<td>");
//2016-01-04
String key =formartDate(year, month, i);
String t=null;
//显示当天发布的日志
if (null!=data&&data.containsKey(key)) {
BigInteger value=(BigInteger) data.get(key);
t=String.format("<a href=\"%s/date/%s\" title=\"%s篇\">%d</a>", url,key.replace("-", ""),value,i);
}else{
t=String.valueOf(i);
}
//如果日期是今天
if (key.equals(DateUtil.getCurrentDate())) {
t=String.format("%s%s%s", "<span class=\"badge\">",t,"</span>");
}
temp.append(t);
temp.append("</td>");
if (i==day) {
sb.append("<tr>").append(temp.toString()).append("</tr>");
}
}
sb.append("</table>");
return sb.toString();
}
/**
* 生成日期连接
* @param year
* @param month
* @param add 加一个月或者减一个月
* @return
*/
public String dateLink(String url,int year,int month,boolean add){
String html="<a href=\"%s/date/%s%s\">%s</a>";
if (!add) {
//减一个月
if (month==1) {
year--;
month=12;
}else{
month--;
}
}else{
//加一个月
if (month==12) {
year++;
month=1;
}else{
month++;
}
}
String t_month=(month<10)?"0"+month:String.valueOf(month);
return String.format(html, url,year,t_month,add?">>":"<<");
}
}