Commit 76e018b7 authored by wmainlove@gmail.com's avatar wmainlove@gmail.com

Merge branch '0.5.6' of https://github.com/b3log/b3log-solo.git into 0.5.6

parents a7edadae a72a6a7e
...@@ -4,4 +4,5 @@ ...@@ -4,4 +4,5 @@
/war/bae/target/ /war/bae/target/
/war/target/ /war/target/
/war/mysql/target/ /war/mysql/target/
/war/h2/target/ /war/h2/target/
\ No newline at end of file /war/src/main/webapp/WEB-INF/lib/
\ No newline at end of file
...@@ -16,12 +16,9 @@ ...@@ -16,12 +16,9 @@
package org.b3log.solo.api.metaweblog; package org.b3log.solo.api.metaweblog;
import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.TimeZone;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.ServletInputStream; import javax.servlet.ServletInputStream;
...@@ -30,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -30,6 +27,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.time.DateFormatUtils; import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.model.User; import org.b3log.latke.model.User;
import org.b3log.latke.repository.Transaction; import org.b3log.latke.repository.Transaction;
...@@ -74,7 +72,7 @@ import org.jsoup.Jsoup; ...@@ -74,7 +72,7 @@ import org.jsoup.Jsoup;
* </p> * </p>
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.7, Aug 29, 2012 * @version 1.0.0.8, Jan 18, 2013
* @since 0.4.0 * @since 0.4.0
*/ */
@RequestProcessor @RequestProcessor
...@@ -372,12 +370,7 @@ public final class MetaWeblogAPI { ...@@ -372,12 +370,7 @@ public final class MetaWeblogAPI {
} catch (final ParseException e) { } catch (final ParseException e) {
LOGGER.log(Level.WARNING, LOGGER.log(Level.WARNING,
"Parses article create date failed with ISO8601, retry to parse with pattern[yyyy-MM-dd'T'HH:mm:ss]"); "Parses article create date failed with ISO8601, retry to parse with pattern[yyyy-MM-dd'T'HH:mm:ss]");
final String timeZoneId = preference.getString(Preference.TIME_ZONE_ID); date = DateUtils.parseDate(dateString, new String[] {"yyyyMMdd'T'HH:mm:ss"});
final TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
final DateFormat format = new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss");
format.setTimeZone(timeZone);
date = format.parse(dateString);
} }
ret.put(Article.ARTICLE_CREATE_DATE, date); ret.put(Article.ARTICLE_CREATE_DATE, date);
} else if ("title".equals(name)) { } else if ("title".equals(name)) {
......
...@@ -24,6 +24,7 @@ import java.util.logging.Level; ...@@ -24,6 +24,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.event.Event; import org.b3log.latke.event.Event;
...@@ -65,7 +66,7 @@ import org.json.JSONObject; ...@@ -65,7 +66,7 @@ import org.json.JSONObject;
* Comment receiver (from B3log Symphony). * Comment receiver (from B3log Symphony).
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.4, Jan 4, 2013 * @version 1.0.0.5, Jan 18, 2013
* @since 0.5.5 * @since 0.5.5
*/ */
@RequestProcessor @RequestProcessor
...@@ -206,7 +207,7 @@ public final class CommentReceiver { ...@@ -206,7 +207,7 @@ public final class CommentReceiver {
final Date date = TimeZones.getTime(timeZoneId); final Date date = TimeZones.getTime(timeZoneId);
comment.put(Comment.COMMENT_DATE, date); comment.put(Comment.COMMENT_DATE, date);
ret.put(Comment.COMMENT_DATE, Comment.DATE_FORMAT.format(date)); ret.put(Comment.COMMENT_DATE, DateFormatUtils.format(date, "yyyy-MM-dd hh:mm:ss"));
if (!Strings.isEmptyOrNull(originalCommentId)) { if (!Strings.isEmptyOrNull(originalCommentId)) {
originalComment = commentRepository.get(originalCommentId); originalComment = commentRepository.get(originalCommentId);
if (null != originalComment) { if (null != originalComment) {
......
...@@ -16,15 +16,11 @@ ...@@ -16,15 +16,11 @@
package org.b3log.solo.model; package org.b3log.solo.model;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
/** /**
* This class defines all archive date model relevant keys. * This class defines all archive date model relevant keys.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.3, Jul 2, 2011 * @version 1.0.0.4, Jan 18, 2013
*/ */
public final class ArchiveDate { public final class ArchiveDate {
...@@ -63,11 +59,6 @@ public final class ArchiveDate { ...@@ -63,11 +59,6 @@ public final class ArchiveDate {
*/ */
public static final String ARCHIVE_DATE_MONTH = "archiveDateMonth"; public static final String ARCHIVE_DATE_MONTH = "archiveDateMonth";
/**
* Date format(yyyy/MM).
*/
public static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM");
/** /**
* Private default constructor. * Private default constructor.
*/ */
......
...@@ -16,15 +16,11 @@ ...@@ -16,15 +16,11 @@
package org.b3log.solo.model; package org.b3log.solo.model;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
/** /**
* This class defines all comment model relevant keys. * This class defines all comment model relevant keys.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.6, Oct 28, 2011 * @version 1.0.0.7, Jan 18, 2013
* @since 0.3.1 * @since 0.3.1
*/ */
public final class Comment { public final class Comment {
...@@ -99,11 +95,6 @@ public final class Comment { ...@@ -99,11 +95,6 @@ public final class Comment {
*/ */
public static final String COMMENT_ON_ID = "commentOnId"; public static final String COMMENT_ON_ID = "commentOnId";
/**
* Date format(yyyy/MM/dd hh:mm:ss).
*/
public static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
/** /**
* Private default constructor. * Private default constructor.
*/ */
......
...@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.cache.PageCaches; import org.b3log.latke.cache.PageCaches;
...@@ -66,7 +67,7 @@ import org.jsoup.Jsoup; ...@@ -66,7 +67,7 @@ import org.jsoup.Jsoup;
* Article processor. * Article processor.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.1.2.6, Jan 7, 2013 * @version 1.1.2.7, Jan 18, 2013
* @since 0.3.1 * @since 0.3.1
*/ */
@RequestProcessor @RequestProcessor
...@@ -1134,7 +1135,7 @@ public final class ArticleProcessor { ...@@ -1134,7 +1135,7 @@ public final class ArticleProcessor {
filler.fillBlogFooter(dataModel, preference); filler.fillBlogFooter(dataModel, preference);
final long time = archiveDate.getLong(ArchiveDate.ARCHIVE_TIME); final long time = archiveDate.getLong(ArchiveDate.ARCHIVE_TIME);
final String dateString = ArchiveDate.DATE_FORMAT.format(time); final String dateString = DateFormatUtils.format(time, "yyyy/MM");
final String[] dateStrings = dateString.split("/"); final String[] dateStrings = dateString.split("/");
final String year = dateStrings[0]; final String year = dateStrings[0];
final String month = dateStrings[1]; final String month = dateStrings[1];
......
...@@ -55,7 +55,7 @@ import org.json.JSONObject; ...@@ -55,7 +55,7 @@ import org.json.JSONObject;
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a> * @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.1.1.2, Jan 4, 2013 * @version 1.1.1.3, Jan 18, 2013
* @since 0.3.1 * @since 0.3.1
*/ */
@RequestProcessor @RequestProcessor
...@@ -250,7 +250,7 @@ public final class LoginProcessor { ...@@ -250,7 +250,7 @@ public final class LoginProcessor {
final String userPassword = user.optString(User.USER_PASSWORD); final String userPassword = user.optString(User.USER_PASSWORD);
final String hashPassword = cookieJSONObject.optString(User.USER_PASSWORD); final String hashPassword = cookieJSONObject.optString(User.USER_PASSWORD);
if (userPassword.equals(hashPassword)) { if (MD5.hash(userPassword).equals(hashPassword)) {
Sessions.login(request, response, user); Sessions.login(request, response, user);
LOGGER.log(Level.INFO, "Logged in with cookie[email={0}]", userEmail); LOGGER.log(Level.INFO, "Logged in with cookie[email={0}]", userEmail);
} }
......
...@@ -56,7 +56,7 @@ import org.json.JSONObject; ...@@ -56,7 +56,7 @@ import org.json.JSONObject;
* Site map (sitemap) processor. * Site map (sitemap) processor.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.4, Jun 11, 2012 * @version 1.0.0.5, Jan 18, 2013
* @since 0.3.1 * @since 0.3.1
*/ */
@RequestProcessor @RequestProcessor
...@@ -248,7 +248,7 @@ public final class SitemapProcessor { ...@@ -248,7 +248,7 @@ public final class SitemapProcessor {
for (int i = 0; i < archiveDates.length(); i++) { for (int i = 0; i < archiveDates.length(); i++) {
final JSONObject archiveDate = archiveDates.getJSONObject(i); final JSONObject archiveDate = archiveDates.getJSONObject(i);
final long time = archiveDate.getLong(ArchiveDate.ARCHIVE_TIME); final long time = archiveDate.getLong(ArchiveDate.ARCHIVE_TIME);
final String dateString = ArchiveDate.DATE_FORMAT.format(time); final String dateString = DateFormatUtils.format(time, "yyyy/MM");
final URL url = new URL(); final URL url = new URL();
......
...@@ -25,11 +25,7 @@ import java.util.logging.Level; ...@@ -25,11 +25,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringEscapeUtils;
import org.b3log.latke.repository.RepositoryException; import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.solo.util.Articles;
import org.b3log.solo.model.Article;
import org.b3log.solo.repository.ArticleRepository;
import org.b3log.solo.repository.TagRepository;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.event.Event; import org.b3log.latke.event.Event;
...@@ -43,15 +39,14 @@ import org.b3log.latke.repository.*; ...@@ -43,15 +39,14 @@ import org.b3log.latke.repository.*;
import org.b3log.latke.service.ServiceException; import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.*; import org.b3log.latke.util.*;
import org.b3log.latke.util.freemarker.Templates; import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.model.ArchiveDate;
import org.b3log.solo.model.Link;
import org.b3log.solo.model.Preference;
import org.b3log.solo.repository.CommentRepository;
import org.b3log.solo.repository.LinkRepository;
import org.b3log.solo.SoloServletListener; import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.*; import org.b3log.solo.model.*;
import org.b3log.solo.repository.ArchiveDateRepository; import org.b3log.solo.repository.ArchiveDateRepository;
import org.b3log.solo.repository.ArticleRepository;
import org.b3log.solo.repository.CommentRepository;
import org.b3log.solo.repository.LinkRepository;
import org.b3log.solo.repository.PageRepository; import org.b3log.solo.repository.PageRepository;
import org.b3log.solo.repository.TagRepository;
import org.b3log.solo.repository.UserRepository; import org.b3log.solo.repository.UserRepository;
import org.b3log.solo.repository.impl.ArchiveDateRepositoryImpl; import org.b3log.solo.repository.impl.ArchiveDateRepositoryImpl;
import org.b3log.solo.repository.impl.ArticleRepositoryImpl; import org.b3log.solo.repository.impl.ArticleRepositoryImpl;
...@@ -62,6 +57,7 @@ import org.b3log.solo.repository.impl.TagRepositoryImpl; ...@@ -62,6 +57,7 @@ import org.b3log.solo.repository.impl.TagRepositoryImpl;
import org.b3log.solo.repository.impl.UserRepositoryImpl; import org.b3log.solo.repository.impl.UserRepositoryImpl;
import org.b3log.solo.service.ArticleQueryService; import org.b3log.solo.service.ArticleQueryService;
import org.b3log.solo.service.StatisticQueryService; import org.b3log.solo.service.StatisticQueryService;
import org.b3log.solo.util.Articles;
import org.b3log.solo.util.Tags; import org.b3log.solo.util.Tags;
import org.b3log.solo.util.Users; import org.b3log.solo.util.Users;
import org.json.JSONArray; import org.json.JSONArray;
...@@ -73,7 +69,7 @@ import org.json.JSONObject; ...@@ -73,7 +69,7 @@ import org.json.JSONObject;
* Filler utilities. * Filler utilities.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.6.1, Aug 9, 2012 * @version 1.0.6.2, Jan 18, 2013
* @since 0.3.1 * @since 0.3.1
*/ */
public final class Filler { public final class Filler {
...@@ -287,7 +283,7 @@ public final class Filler { ...@@ -287,7 +283,7 @@ public final class Filler {
for (final JSONObject archiveDate : archiveDates) { for (final JSONObject archiveDate : archiveDates) {
final long time = archiveDate.getLong(ArchiveDate.ARCHIVE_TIME); final long time = archiveDate.getLong(ArchiveDate.ARCHIVE_TIME);
final String dateString = ArchiveDate.DATE_FORMAT.format(time); final String dateString = DateFormatUtils.format(time, "yyyy/MM");
final String[] dateStrings = dateString.split("/"); final String[] dateStrings = dateString.split("/");
final String year = dateStrings[0]; final String year = dateStrings[0];
final String month = dateStrings[1]; final String month = dateStrings[1];
......
...@@ -21,6 +21,7 @@ import java.util.Iterator; ...@@ -21,6 +21,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.repository.*; import org.b3log.latke.repository.*;
import org.b3log.latke.util.CollectionUtils; import org.b3log.latke.util.CollectionUtils;
...@@ -34,7 +35,7 @@ import org.json.JSONObject; ...@@ -34,7 +35,7 @@ import org.json.JSONObject;
* Archive date repository. * Archive date repository.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.6, Dec 31, 2011 * @version 1.0.0.7, Jan 18, 2013
* @since 0.3.1 * @since 0.3.1
*/ */
public final class ArchiveDateRepositoryImpl extends AbstractRepository implements ArchiveDateRepository { public final class ArchiveDateRepositoryImpl extends AbstractRepository implements ArchiveDateRepository {
...@@ -54,7 +55,7 @@ public final class ArchiveDateRepositoryImpl extends AbstractRepository implemen ...@@ -54,7 +55,7 @@ public final class ArchiveDateRepositoryImpl extends AbstractRepository implemen
long time = 0L; long time = 0L;
try { try {
time = ArchiveDate.DATE_FORMAT.parse(archiveDate).getTime(); time = DateUtils.parseDate(archiveDate, new String[] {"yyyy/MM"}).getTime();
} catch (final ParseException e) { } catch (final ParseException e) {
LOGGER.log(Level.SEVERE, "Can not parse archive date [" + archiveDate + "]", e); LOGGER.log(Level.SEVERE, "Can not parse archive date [" + archiveDate + "]", e);
throw new RepositoryException("Can not parse archive date [" + archiveDate + "]"); throw new RepositoryException("Can not parse archive date [" + archiveDate + "]");
......
...@@ -16,15 +16,15 @@ ...@@ -16,15 +16,15 @@
package org.b3log.solo.service; package org.b3log.solo.service;
import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.event.Event; import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException; import org.b3log.latke.event.EventException;
...@@ -68,7 +68,7 @@ import org.json.JSONObject; ...@@ -68,7 +68,7 @@ import org.json.JSONObject;
* Article management service. * Article management service.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.1.3, Oct 12, 2012 * @version 1.0.1.4, Jan 18, 2013
* @since 0.3.5 * @since 0.3.5
*/ */
public final class ArticleMgmtService { public final class ArticleMgmtService {
...@@ -148,11 +148,6 @@ public final class ArticleMgmtService { ...@@ -148,11 +148,6 @@ public final class ArticleMgmtService {
*/ */
private static Tags tagUtils = Tags.getInstance(); private static Tags tagUtils = Tags.getInstance();
/**
* Permalink date format(yyyy/MM/dd).
*/
public static final DateFormat PERMALINK_FORMAT = new SimpleDateFormat("yyyy/MM/dd");
/** /**
* Cancels publish an article by the specified article id. * Cancels publish an article by the specified article id.
* *
...@@ -990,13 +985,13 @@ public final class ArticleMgmtService { ...@@ -990,13 +985,13 @@ public final class ArticleMgmtService {
*/ */
private void archiveDate(final JSONObject article) throws RepositoryException { private void archiveDate(final JSONObject article) throws RepositoryException {
final Date createDate = (Date) article.opt(Article.ARTICLE_CREATE_DATE); final Date createDate = (Date) article.opt(Article.ARTICLE_CREATE_DATE);
final String createDateString = ArchiveDate.DATE_FORMAT.format(createDate); final String createDateString = DateFormatUtils.format(createDate, "yyyy/MM");
JSONObject archiveDate = archiveDateRepository.getByArchiveDate(createDateString); JSONObject archiveDate = archiveDateRepository.getByArchiveDate(createDateString);
if (null == archiveDate) { if (null == archiveDate) {
archiveDate = new JSONObject(); archiveDate = new JSONObject();
try { try {
archiveDate.put(ArchiveDate.ARCHIVE_TIME, ArchiveDate.DATE_FORMAT.parse(createDateString).getTime()); archiveDate.put(ArchiveDate.ARCHIVE_TIME, DateUtils.parseDate(createDateString, new String[] {"yyyy/MM"}).getTime());
archiveDate.put(ArchiveDate.ARCHIVE_DATE_ARTICLE_COUNT, 0); archiveDate.put(ArchiveDate.ARCHIVE_DATE_ARTICLE_COUNT, 0);
archiveDate.put(ArchiveDate.ARCHIVE_DATE_PUBLISHED_ARTICLE_COUNT, 0); archiveDate.put(ArchiveDate.ARCHIVE_DATE_PUBLISHED_ARTICLE_COUNT, 0);
...@@ -1064,7 +1059,7 @@ public final class ArticleMgmtService { ...@@ -1064,7 +1059,7 @@ public final class ArticleMgmtService {
String ret = article.optString(Article.ARTICLE_PERMALINK); String ret = article.optString(Article.ARTICLE_PERMALINK);
if (Strings.isEmptyOrNull(ret)) { if (Strings.isEmptyOrNull(ret)) {
ret = "/articles/" + PERMALINK_FORMAT.format(date) + "/" + article.optString(Keys.OBJECT_ID) + ".html"; ret = "/articles/" + DateFormatUtils.format(date, "yyyy/MM/dd") + "/" + article.optString(Keys.OBJECT_ID) + ".html";
} }
if (!ret.startsWith("/")) { if (!ret.startsWith("/")) {
...@@ -1102,7 +1097,7 @@ public final class ArticleMgmtService { ...@@ -1102,7 +1097,7 @@ public final class ArticleMgmtService {
if (!oldPermalink.equals(ret)) { if (!oldPermalink.equals(ret)) {
if (Strings.isEmptyOrNull(ret)) { if (Strings.isEmptyOrNull(ret)) {
ret = "/articles/" + PERMALINK_FORMAT.format(createDate) + "/" + articleId + ".html"; ret = "/articles/" + DateFormatUtils.format(createDate, "yyyy/MM/dd") + "/" + articleId + ".html";
} }
if (!ret.startsWith("/")) { if (!ret.startsWith("/")) {
......
...@@ -23,6 +23,7 @@ import java.util.logging.Level; ...@@ -23,6 +23,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.event.Event; import org.b3log.latke.event.Event;
...@@ -55,7 +56,7 @@ import org.json.JSONObject; ...@@ -55,7 +56,7 @@ import org.json.JSONObject;
* Comment management service. * Comment management service.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.3, Aug 12, 2012 * @version 1.0.0.4, Jan 18, 2013
* @since 0.3.5 * @since 0.3.5
*/ */
public final class CommentMgmtService { public final class CommentMgmtService {
...@@ -168,7 +169,7 @@ public final class CommentMgmtService { ...@@ -168,7 +169,7 @@ public final class CommentMgmtService {
final Date date = TimeZones.getTime(timeZoneId); final Date date = TimeZones.getTime(timeZoneId);
comment.put(Comment.COMMENT_DATE, date); comment.put(Comment.COMMENT_DATE, date);
ret.put(Comment.COMMENT_DATE, Comment.DATE_FORMAT.format(date)); ret.put(Comment.COMMENT_DATE, DateFormatUtils.format(date, "yyyy-MM-dd hh:mm:ss"));
if (!Strings.isEmptyOrNull(originalCommentId)) { if (!Strings.isEmptyOrNull(originalCommentId)) {
originalComment = commentRepository.get(originalCommentId); originalComment = commentRepository.get(originalCommentId);
if (null != originalComment) { if (null != originalComment) {
...@@ -288,7 +289,7 @@ public final class CommentMgmtService { ...@@ -288,7 +289,7 @@ public final class CommentMgmtService {
final Date date = TimeZones.getTime(timeZoneId); final Date date = TimeZones.getTime(timeZoneId);
comment.put(Comment.COMMENT_DATE, date); comment.put(Comment.COMMENT_DATE, date);
ret.put(Comment.COMMENT_DATE, Comment.DATE_FORMAT.format(date)); ret.put(Comment.COMMENT_DATE, DateFormatUtils.format(date, "yyyy-MM-dd hh:mm:ss"));
if (!Strings.isEmptyOrNull(originalCommentId)) { if (!Strings.isEmptyOrNull(originalCommentId)) {
originalComment = commentRepository.get(originalCommentId); originalComment = commentRepository.get(originalCommentId);
......
...@@ -25,6 +25,8 @@ import java.util.Set; ...@@ -25,6 +25,8 @@ import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.Latkes; import org.b3log.latke.Latkes;
import org.b3log.latke.RuntimeEnv; import org.b3log.latke.RuntimeEnv;
...@@ -57,7 +59,7 @@ import org.json.JSONObject; ...@@ -57,7 +59,7 @@ import org.json.JSONObject;
* B3log Solo initialization service. * B3log Solo initialization service.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.1.3, Jan 4, 2013 * @version 1.0.1.4, Jan 18, 2013
* @since 0.4.0 * @since 0.4.0
*/ */
public final class InitService { public final class InitService {
...@@ -345,11 +347,11 @@ public final class InitService { ...@@ -345,11 +347,11 @@ public final class InitService {
*/ */
public void archiveDate(final JSONObject article) throws RepositoryException { public void archiveDate(final JSONObject article) throws RepositoryException {
final Date createDate = (Date) article.opt(Article.ARTICLE_CREATE_DATE); final Date createDate = (Date) article.opt(Article.ARTICLE_CREATE_DATE);
final String createDateString = ArchiveDate.DATE_FORMAT.format(createDate); final String createDateString = DateFormatUtils.format(createDate, "yyyy/MM");
final JSONObject archiveDate = new JSONObject(); final JSONObject archiveDate = new JSONObject();
try { try {
archiveDate.put(ArchiveDate.ARCHIVE_TIME, ArchiveDate.DATE_FORMAT.parse(createDateString).getTime()); archiveDate.put(ArchiveDate.ARCHIVE_TIME, DateUtils.parseDate(createDateString, new String[] {"yyyy/MM"}).getTime());
archiveDate.put(ArchiveDate.ARCHIVE_DATE_ARTICLE_COUNT, 1); archiveDate.put(ArchiveDate.ARCHIVE_DATE_ARTICLE_COUNT, 1);
archiveDate.put(ArchiveDate.ARCHIVE_DATE_PUBLISHED_ARTICLE_COUNT, 1); archiveDate.put(ArchiveDate.ARCHIVE_DATE_PUBLISHED_ARTICLE_COUNT, 1);
......
...@@ -19,15 +19,13 @@ package org.b3log.solo.util; ...@@ -19,15 +19,13 @@ package org.b3log.solo.util;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
import org.b3log.latke.util.freemarker.Templates; import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.model.ArchiveDate;
import org.b3log.solo.model.Comment;
/** /**
* Time zone utilities. * Time zone utilities.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.3, Dec 29, 2011 * @version 1.0.0.4, Jan 18, 2013
*/ */
public final class TimeZones { public final class TimeZones {
...@@ -64,8 +62,6 @@ public final class TimeZones { ...@@ -64,8 +62,6 @@ public final class TimeZones {
TimeZone.setDefault(timeZone); TimeZone.setDefault(timeZone);
System.setProperty("user.timezone", timeZoneId); System.setProperty("user.timezone", timeZoneId);
ArchiveDate.DATE_FORMAT.setTimeZone(timeZone);
Comment.DATE_FORMAT.setTimeZone(timeZone);
Templates.MAIN_CFG.setTimeZone(timeZone); Templates.MAIN_CFG.setTimeZone(timeZone);
Templates.MOBILE_CFG.setTimeZone(timeZone); Templates.MOBILE_CFG.setTimeZone(timeZone);
} }
......
...@@ -17,8 +17,10 @@ package org.b3log.solo.repository.impl; ...@@ -17,8 +17,10 @@ package org.b3log.solo.repository.impl;
import java.util.List; import java.util.List;
import junit.framework.Assert; import junit.framework.Assert;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.repository.Transaction; import org.b3log.latke.repository.Transaction;
import org.b3log.solo.AbstractTestCase; import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.ArchiveDate; import org.b3log.solo.model.ArchiveDate;
import org.b3log.solo.repository.ArchiveDateRepository; import org.b3log.solo.repository.ArchiveDateRepository;
import org.json.JSONObject; import org.json.JSONObject;
...@@ -28,7 +30,7 @@ import org.testng.annotations.Test; ...@@ -28,7 +30,7 @@ import org.testng.annotations.Test;
* {@link ArchiveDateRepositoryImpl} test case. * {@link ArchiveDateRepositoryImpl} test case.
* *
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a> * @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.0, Dec 31, 2011 * @version 1.0.0.1, Jan 18, 2013
*/ */
@Test(suiteName = "repository") @Test(suiteName = "repository")
public class ArchiveDateRepositoryImplTestCase extends AbstractTestCase { public class ArchiveDateRepositoryImplTestCase extends AbstractTestCase {
...@@ -44,7 +46,7 @@ public class ArchiveDateRepositoryImplTestCase extends AbstractTestCase { ...@@ -44,7 +46,7 @@ public class ArchiveDateRepositoryImplTestCase extends AbstractTestCase {
final JSONObject archiveDate = new JSONObject(); final JSONObject archiveDate = new JSONObject();
archiveDate.put(ArchiveDate.ARCHIVE_TIME, ArchiveDate.DATE_FORMAT.parse("2011/12").getTime()); archiveDate.put(ArchiveDate.ARCHIVE_TIME, DateUtils.parseDate("2011/12", new String[] {"yyyy/MM"}).getTime());
archiveDate.put(ArchiveDate.ARCHIVE_DATE_ARTICLE_COUNT, 1); archiveDate.put(ArchiveDate.ARCHIVE_DATE_ARTICLE_COUNT, 1);
archiveDate.put(ArchiveDate.ARCHIVE_DATE_PUBLISHED_ARTICLE_COUNT, 1); archiveDate.put(ArchiveDate.ARCHIVE_DATE_PUBLISHED_ARTICLE_COUNT, 1);
...@@ -68,5 +70,6 @@ public class ArchiveDateRepositoryImplTestCase extends AbstractTestCase { ...@@ -68,5 +70,6 @@ public class ArchiveDateRepositoryImplTestCase extends AbstractTestCase {
final JSONObject archiveDate = archiveDateRepository.getByArchiveDate("2011/12"); final JSONObject archiveDate = archiveDateRepository.getByArchiveDate("2011/12");
Assert.assertNotNull(archiveDate); Assert.assertNotNull(archiveDate);
System.out.println(archiveDate.toString(SoloServletListener.JSON_PRINT_INDENT_FACTOR));
} }
} }
...@@ -17,7 +17,8 @@ package org.b3log.solo.service; ...@@ -17,7 +17,8 @@ package org.b3log.solo.service;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.model.User; import org.b3log.latke.model.User;
import org.b3log.solo.AbstractTestCase; import org.b3log.solo.AbstractTestCase;
...@@ -80,10 +81,10 @@ public class ArchiveDateQueryServiceTestCase extends AbstractTestCase { ...@@ -80,10 +81,10 @@ public class ArchiveDateQueryServiceTestCase extends AbstractTestCase {
public void getByArchiveDateString() throws Exception { public void getByArchiveDateString() throws Exception {
final ArchiveDateQueryService archiveDateQueryService = ArchiveDateQueryService.getInstance(); final ArchiveDateQueryService archiveDateQueryService = ArchiveDateQueryService.getInstance();
final String archiveDateString = ArchiveDate.DATE_FORMAT.format(new Date()); final String archiveDateString = DateFormatUtils.format(new Date(), "yyyy/MM");
final JSONObject result = archiveDateQueryService.getByArchiveDateString(archiveDateString); final JSONObject result = archiveDateQueryService.getByArchiveDateString(archiveDateString);
Assert.assertNotNull(result); Assert.assertNotNull(result);
Assert.assertEquals(result.getJSONObject(ArchiveDate.ARCHIVE_DATE).getLong(ArchiveDate.ARCHIVE_TIME), Assert.assertEquals(result.getJSONObject(ArchiveDate.ARCHIVE_DATE).getLong(ArchiveDate.ARCHIVE_TIME),
ArchiveDate.DATE_FORMAT.parse(archiveDateString).getTime()); DateUtils.parseDate(archiveDateString, new String[] {"yyyy/MM"}).getTime());
} }
} }
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
<div class="footerWrapper"> <div class="footerWrapper">
<div class="footer"> <div class="footer">
&copy; ${year} - <a href="${blogHost}">${blogTitle}</a><br/> &copy; ${year} - <a href="${servePath}">${blogTitle}</a><br/>
Powered by Powered by
<a href="http://b3log.org" target="_blank"> <a href="http://b3log.org" target="_blank">
${b3logLabel}&nbsp; ${b3logLabel}&nbsp;
......
...@@ -241,6 +241,7 @@ ...@@ -241,6 +241,7 @@
(function () { (function () {
try { try {
$("#userEmail").focus();
$("input").keypress(function (event) { $("input").keypress(function (event) {
if (event.keyCode === 13) { if (event.keyCode === 13) {
event.preventDefault(); event.preventDefault();
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
<div class="footerWrapper"> <div class="footerWrapper">
<div class="footer"> <div class="footer">
&copy; ${year} - <a href="${blogHost}">${blogTitle}</a><br/> &copy; ${year} - <a href="${servePath}">${blogTitle}</a><br/>
Powered by Powered by
<a href="http://b3log.org" target="_blank"> <a href="http://b3log.org" target="_blank">
${b3logLabel}&nbsp; ${b3logLabel}&nbsp;
......
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
</div> </div>
<div class="footerWrapper"> <div class="footerWrapper">
<div class="footer"> <div class="footer">
&copy; ${year} - <a href="${blogHost}">${blogTitle}</a><br/> &copy; ${year} - <a href="${servePath}">${blogTitle}</a><br/>
Powered by Powered by
<a href="http://b3log.org" target="_blank"> <a href="http://b3log.org" target="_blank">
${b3logLabel}&nbsp; ${b3logLabel}&nbsp;
......
<ul> <div class="content articles">
<div class="vertical"></div>
<#list articles as article> <#list articles as article>
<li class="article<#if !article_has_next> article-last</#if>"> <article<#if !article_has_next> class="last"</#if>>
<div class="article-title"> <div>
<div class="dot"></div>
<div class="arrow"></div>
<time>
<span>
${article.articleCreateDate?string("yy-MM-dd HH:mm")}
</span>
</time>
<h2> <h2>
<a rel="bookmark" class="ft-gray" href="${servePath}${article.articlePermalink}"> <a rel="bookmark" href="${servePath}${article.articlePermalink}">
${article.articleTitle} ${article.articleTitle}
</a> </a>
<#if article.hasUpdated> <#if article.hasUpdated>
...@@ -17,41 +25,35 @@ ...@@ -17,41 +25,35 @@
</sup> </sup>
</#if> </#if>
</h2> </h2>
<div class="right"> <p>
<a rel="nofollow" class="ft-gray" href="${servePath}${article.articlePermalink}#comments">
${article.articleCommentCount}&nbsp;&nbsp;${commentLabel}
</a>&nbsp;&nbsp;
<a rel="nofollow" class="ft-gray" href="${servePath}${article.articlePermalink}">
${article.articleViewCount}&nbsp;&nbsp;${viewLabel}
</a>
</div>
<div class="clear"></div>
</div>
<div class="article-body">
<div id="abstract${article.oId}">
${article.articleAbstract} ${article.articleAbstract}
</div> </p>
<div id="content${article.oId}" class="none"></div> <span class="ico-tags" title="${tagLabel}">
</div> <#list article.articleTags?split(",") as articleTag><a rel="category tag" href="${servePath}/tags/${articleTag?url('UTF-8')}">${articleTag}</a><#if articleTag_has_next>,</#if></#list>
<div class="right ft-gray"> </span>
<#if article.hasUpdated> <span class="ico-author" title="${authorLabel}">
${article.articleUpdateDate?string("yy-MM-dd HH:mm")} <a rel="author" href="${servePath}/authors/${article.authorId}">${article.authorName}</a>
<#else> </span>
${article.articleCreateDate?string("yy-MM-dd HH:mm")} <span class="ico-comment" title="${commentLabel}">
</#if> <#if article.articleCommentCount == 0>
<a rel="nofollow" href="${servePath}/authors/${article.authorId}">${article.authorName}</a> <a rel="nofollow" href="${servePath}${article.articlePermalink}#comments">
</div> ${noCommentLabel}
<div class="left ft-gray"> </a>
${tag1Label} <#else>
<#list article.articleTags?split(",") as articleTag> <a rel="nofollow" href="${servePath}${article.articlePermalink}#comments">
<a rel="tag" href="${servePath}/tags/${articleTag?url('UTF-8')}"> ${article.articleCommentCount}
${articleTag}</a><#if articleTag_has_next>, </#if> </a>
</#list> </#if>
</span>
<span class="ico-view" title="${viewLabel}">
<a rel="nofollow" href="${servePath}${article.articlePermalink}">
${article.articleViewCount}
</a>
</span>
</div> </div>
<div class="clear"></div> </article>
</li>
</#list> </#list>
</ul> </div>
<#if paginationCurrentPageNum != paginationPageCount && 0 != paginationPageCount> <#if paginationCurrentPageNum != paginationPageCount && 0 != paginationPageCount>
<div class="article-next ft-gray" onclick="getNextPage()" data-page="${paginationCurrentPageNum}">${moreLabel}</div> <div class="article-next ft-gray" onclick="getNextPage()" data-page="${paginationCurrentPageNum}">${moreLabel}</div>
</#if> </#if>
\ No newline at end of file
...@@ -28,13 +28,11 @@ html, body { ...@@ -28,13 +28,11 @@ html, body {
} }
body { body {
font-family: Verdana, arial, '\5fae\8f6f\96c5\9ed1'; font: 0.81em Verdana, arial, '\5fae\8f6f\96c5\9ed1';
font-size: 14px;
background: url("../../timeline/images/bg.png") repeat scroll 0 0 #DEE4EA; background: url("../../timeline/images/bg.png") repeat scroll 0 0 #DEE4EA;
color: #666666; color: #666666;
} }
button, button,
input, input,
select, select,
...@@ -46,6 +44,22 @@ textarea { ...@@ -46,6 +44,22 @@ textarea {
outline: none; outline: none;
} }
a {
color: #6599C6;
outline: medium none;
text-decoration: none;
transition: color 1s ease 0s;
}
a:hover {
color: #000;
}
img {
max-width: 100%;
vertical-align: middle;
}
::selection { ::selection {
background-color: #D5D5D5; background-color: #D5D5D5;
color: #FCFCFC; color: #FCFCFC;
...@@ -77,6 +91,10 @@ textarea { ...@@ -77,6 +91,10 @@ textarea {
overflow: hidden; overflow: hidden;
} }
.none {
display: none;
}
.fn-clear:before, .fn-clear:before,
.fn-clear:after { .fn-clear:after {
display: table; display: table;
...@@ -201,8 +219,231 @@ textarea { ...@@ -201,8 +219,231 @@ textarea {
} }
/* end common */ /* end common */
/* start icon */
.articles .arrow,
.ico-author,
.ico-tags,
.ico-comment,
.ico-top,
.ico-view,
#search {
background-repeat: no-repeat;
background-image: url("../../timeline/images/icons.png");
}
.ico-author,
.ico-tags,
.ico-comment,
.ico-view {
padding-left: 20px;
background-position: -1px -63px;
margin-right: 10px;
}
.ico-tags {
background-position: -1px -83px;
}
.ico-comment {
background-position: -1px -41px;
}
.ico-view {
background-position: 0 -122px;
}
#search {
background-position: 5px -138px;
border: medium none;
border-radius: 12px 12px 12px 12px;
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.4) inset, 0 1px 0 rgba(255, 255, 255, 0.1);
color: #A5A099;
height: 22px;
margin-top: 14px;
padding-left: 25px;
transition: width 0.7s ease 0s;
width: 60px;
}
#search:focus {
color: #333;
width: 140px;
}
.ico-top {
background-color: #363A3D;
background-position: 4px -100px;
border-radius: 20em 20em 20em 20em;
bottom: 60px;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.3) inset, 0 1px 0 rgba(255, 255, 255, 0.15);
height: 25px;
position: fixed;
left: 90%;
width: 25px;
cursor: pointer;
}
/* end icon */
/* start framework */ /* start framework */
.wrapper { .wrapper {
margin: 0 auto; margin: 0 auto;
width: 80%;
min-width: 500px;
}
.header {
background-color: #BFBFBF;
background-image: url("../../timeline/images/nav-bg.png"), linear-gradient(to bottom, #CCCCCC 0%, #A9A9A9 100%);
border-bottom: 1px solid #898989;
box-shadow: 0 -1px 0 rgba(255, 255, 255, 0.3) inset, 0 1px 1px rgba(0, 0, 0, 0.2);
height: 50px;
overflow: hidden;
}
.content {
margin: 50px 0;
}
.footer {
background-color: #363A3D;
border-top: 1px solid #232323;
padding: 20px 0;
color: #ddd;
font-size: 80%;
}
.footer a {
color: #9CC0DE;
}
.footer a:hover {
text-decoration: underline;
} }
/* end framework */ /* end framework */
/* start header */
.header .title {
font-size: 150%;
margin: 3px 0 0;
}
.header a {
color: #414141;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);
}
.header a:hover {
color: #000;
}
.header li {
float: left;
list-style-type: none;
margin-right: 20px;
}
/* end header */
/* start article list */
.articles {
position: relative;
}
.articles > .vertical {
background-color: #9EB5C6;
border-radius: 20em 20em 20em 20em;
box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5) inset, 0 0 1px 0 rgba(255, 255, 255, 0.6);
height: 100%;
left: 50%;
margin-left: -3px;
position: absolute;
top: 0;
width: 6px
}
.articles > article {
width: 50%;
position: absolute;
}
.articles > article > div {
background-color: #FFFFFF;
border: 1px solid #BEC3C7;
border-radius: 5px 5px 5px 5px;
margin-bottom: 20px;
padding: 15px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
.articles > article.l > div {
margin-right: 30px;
}
.articles > article.r > div {
margin-left: 30px;
position: relative;
}
.articles .dot {
background-color: #FFFFFF;
border: 3px solid #60829F;
border-radius: 20em 20em 20em 20em;
height: 6px;
position: absolute;
right: -6px;
top: 22px;
width: 6px;
}
.articles .r .dot {
left: -37px;
right: inherit;
}
.articles .arrow {
height: 15px;
position: absolute;
right: 22px;
top: 21px;
width: 9px;
}
.articles .r .arrow {
background-position: 0 -22px;
left: -9px;
right: inherit
}
.articles > article time {
top: -8px;
left: 50%;
position: absolute;
}
.articles > article time > span {
background-color: #FFFFFF;
border: 1px solid #A8A9A9;
border-radius: 20em 20em 20em 20em;
font-size: 80%;
margin-left: -56px;
padding: 5px 10px;
}
.articles > article > div > h2 {
margin: 0;
}
.articles > article > div > h2 > a {
color: #000;
text-decoration: none;
}
.articles > article > div > span > a {
color: #999999;
font-size: 80%;
text-decoration: none;
}
.articles > article > div > span > a:hover {
color: #000;
}
/* end article list */
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<div class="clear"></div> <div class="clear"></div>
</div> </div>
</div> </div>
<div id="goTop" onclick="Util.goTop()">TOP</div> <div class="ico-top none" onclick="Util.goTop()" title="TOP"></div>
<script type="text/javascript"> <script type="text/javascript">
var latkeConfig = { var latkeConfig = {
"servePath": "${servePath}", "servePath": "${servePath}",
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
}; };
var Label = { var Label = {
"tag1Label": "${tag1Label}", "tagLabel": "${tagLabel}",
"viewLabel": "${viewLabel}", "viewLabel": "${viewLabel}",
"commentLabel": "${commentLabel}", "commentLabel": "${commentLabel}",
"topArticleLabel": "${topArticleLabel}", "topArticleLabel": "${topArticleLabel}",
......
<div class="header"> <div class="header">
<div class="wrapper banner"> <div class="wrapper fn-clear">
<div class="left"> <div class="left">
<h1> <h1 class="title">
<a class="title ft-gray" href="${servePath}"> <a href="${servePath}">
${blogTitle} ${blogTitle}
</a> </a>
</h1> </h1>
<span class="sub-title">${blogSubtitle}</span> <span>${blogSubtitle}</span>
</div>
<#if "" != noticeBoard>
<div class="notice">
${noticeBoard}
</div>
</#if>
<div class="clear"></div>
</div>
<div class="nav">
<div class="wrapper">
<ul>
<li>
<a rel="nofollow" href="${servePath}/">${indexLabel}</a>
</li>
<#list pageNavigations as page>
<li>
<a href="${page.pagePermalink}" target="${page.pageOpenTarget}">${page.pageTitle}</a>
</li>
</#list>
<li>
<a href="${servePath}/dynamic.html">${dynamicLabel}</a>
</li>
<li>
<a href="${servePath}/tags.html">${allTagsLabel}</a>
</li>
<li>
<a href="${servePath}/archives.html">${archiveLabel}</a>
</li>
<li>
<a href="${servePath}/links.html">${linkLabel}</a>
</li>
<li>
<a rel="alternate" href="${servePath}/blog-articles-feed.do">Atom<img src="${staticServePath}/images/feed.png" alt="Atom"/></a>
</li>
</ul>
<form target="_blank" method="get" action="http://www.google.com/search">
<input id="search" type="text" name="q" />
<input type="submit" name="btnG" value="" class="none" />
<input type="hidden" name="oe" value="UTF-8" />
<input type="hidden" name="ie" value="UTF-8" />
<input type="hidden" name="newwindow" value="0" />
<input type="hidden" name="sitesearch" value="${blogHost}" />
</form>
<div class="clear"></div>
</div> </div>
<ul class="left">
<#list pageNavigations as page>
<li>
<a href="${page.pagePermalink}" target="${page.pageOpenTarget}">${page.pageTitle}</a>
</li>
</#list>
<li>
<a href="${servePath}/dynamic.html">${dynamicLabel}</a>
</li>
<li>
<a href="${servePath}/tags.html">${allTagsLabel}</a>
</li>
<li>
<a href="${servePath}/archives.html">${archiveLabel}</a>
</li>
<li>
<a href="${servePath}/links.html">${linkLabel}</a>
</li>
<li>
<a rel="alternate" href="${servePath}/blog-articles-feed.do">Atom <img src="${staticServePath}/images/feed.png" alt="Atom"/></a>
</li>
</ul>
<form class="right" target="_blank" method="get" action="http://www.google.com/search">
<input id="search" type="text" name="q" />
<input type="submit" name="btnG" value="" class="none" />
<input type="hidden" name="oe" value="UTF-8" />
<input type="hidden" name="ie" value="UTF-8" />
<input type="hidden" name="newwindow" value="0" />
<input type="hidden" name="sitesearch" value="${blogHost}" />
</form>
</div> </div>
</div> </div>
\ No newline at end of file
...@@ -14,5 +14,33 @@ ...@@ -14,5 +14,33 @@
<#include "article-list.ftl"> <#include "article-list.ftl">
</div> </div>
<#include "footer.ftl"> <#include "footer.ftl">
<script>
timeline.$articles = $(".articles");
$(window).resize(function () {
timeline.colH = [0, 20];
timeline.$articles.find("article").each(function () {
var $it = $(this),
isLeft = timeline.colH[1] > timeline.colH[0],
left = isLeft ? 0 : Math.floor(timeline.$articles.width() / 2),
top = isLeft ? timeline.colH[0] : timeline.colH[1];
$it.css({
"left": left + "px",
"top": top + "px"
});
if (isLeft) {
$it.addClass("l");
} else {
$it.addClass("r");
}
timeline.colH[( isLeft ? '0' : '1' )] += parseInt($it.outerHeight(true));
});
timeline.$articles.height(timeline.colH[0] > timeline.colH[1] ? timeline.colH[0] : timeline.colH[1]);
});
$(window).resize();$(window).resize();
</script>
</body> </body>
</html> </html>
...@@ -20,6 +20,56 @@ ...@@ -20,6 +20,56 @@
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a> * @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.0.1, Jan 14, 2013 * @version 1.0.0.1, Jan 14, 2013
*/ */
var timeline = {
$articles: $(".articles"),
_COLH: [0, 20],
_layoutArticleList: function () {
timeline.$articles.find("article").each(function () {
var $it = $(this),
isLeft = timeline.colH[1] > timeline.colH[0],
left = isLeft ? 0 : Math.floor(timeline.$articles.width() / 2),
top = isLeft ? timeline.colH[0] : timeline.colH[1];
$it.css({
"left": left + "px",
"top": top + "px"
});
if (isLeft) {
$it.addClass("l");
} else {
$it.addClass("r");
}
timeline.colH[( isLeft ? '0' : '1' )] += parseInt($it.outerHeight(true));
});
timeline.$articles.height(timeline.colH[0] > timeline.colH[1] ? timeline.colH[0] : timeline.colH[1]);
timeline.colH = timeline._COLH;
},
_initArticleList: function () {
$(window).resize(function () {
timeline._layoutArticleList();
});
$(window).resize();
$(window).resize();
},
init: function () {
$(window).scroll(function () {
if ($(window).scrollTop() > 60) {
$(".ico-top").show();
} else {
$(".ico-top").hide();
}
});
if ($(".articles").length === 1) {
timeline._initArticleList();
}
}
};
var goTranslate = function () { var goTranslate = function () {
window.open("http://translate.google.com/translate?sl=auto&tl=auto&u=" + location.href); window.open("http://translate.google.com/translate?sl=auto&tl=auto&u=" + location.href);
}; };
...@@ -28,4 +78,6 @@ var goTranslate = function () { ...@@ -28,4 +78,6 @@ var goTranslate = function () {
Util.init(); Util.init();
Util.replaceSideEm($(".recent-comments-content")); Util.replaceSideEm($(".recent-comments-content"));
Util.buildTags("tagsSide"); Util.buildTags("tagsSide");
timeline.init();
})(); })();
\ No newline at end of file
...@@ -60,6 +60,7 @@ em12Label=Heart ...@@ -60,6 +60,7 @@ em12Label=Heart
em13Label=Heart Broken em13Label=Heart Broken
em14Label=Devil em14Label=Devil
commentLabel=Comment commentLabel=Comment
noCommentLabel=No Comment
viewLabel=View viewLabel=View
authorLabel=Author authorLabel=Author
previousPageLabel=Previous Page previousPageLabel=Previous Page
......
...@@ -62,6 +62,7 @@ em12Label=\u7231\u5fc3 ...@@ -62,6 +62,7 @@ em12Label=\u7231\u5fc3
em13Label=\u5fc3\u788e em13Label=\u5fc3\u788e
em14Label=\u9b54\u9b3c em14Label=\u9b54\u9b3c
commentLabel=\u8bc4\u8bba commentLabel=\u8bc4\u8bba
noCommentLabel=\u65e0\u8bc4\u8bba
viewLabel=\u6d4f\u89c8 viewLabel=\u6d4f\u89c8
authorLabel=\u4f5c\u8005 authorLabel=\u4f5c\u8005
previousPageLabel=\u4e0a\u4e00\u9875 previousPageLabel=\u4e0a\u4e00\u9875
...@@ -70,7 +71,7 @@ firstPageLabel=\u7b2c\u4e00\u9875 ...@@ -70,7 +71,7 @@ firstPageLabel=\u7b2c\u4e00\u9875
lastPageLabel=\u6700\u540e\u4e00\u9875 lastPageLabel=\u6700\u540e\u4e00\u9875
archive1Label=\u5b58\u6863\uff1a archive1Label=\u5b58\u6863\uff1a
author1Label=\u4f5c\u8005\uff1a author1Label=\u4f5c\u8005\uff1a
tag1Label=\u6807\u7b7e\uff1a tagLabel=\u6807\u7b7e
sorryLabel=\u5bf9\u4e0d\u8d77\uff01 sorryLabel=\u5bf9\u4e0d\u8d77\uff01
notFoundLabel=\u627e\u4e0d\u5230\uff01 notFoundLabel=\u627e\u4e0d\u5230\uff01
returnTo1Label=\u8fd4\u56de\uff1a returnTo1Label=\u8fd4\u56de\uff1a
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
background-image: -webkit-linear-gradient(#FFFFFF,#E5E5E5); background-image: -webkit-linear-gradient(#FFFFFF,#E5E5E5);
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#FFFFFF', endColorstr='#E5E5E5'); filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#FFFFFF', endColorstr='#E5E5E5');
border-bottom: 1px solid #E5E5E5; border-bottom: 1px solid #E5E5E5;
height: 26px;
line-height: 26px; line-height: 26px;
display: none; display: none;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment