Commit 8b5d0f46 authored by Liang Ding's avatar Liang Ding

Merge remote-tracking branch 'origin/0.4.6'

Conflicts:
	core/src/main/java/org/b3log/solo/util/Articles.java
	core/src/test/java/org/b3log/solo/repository/impl/UserRepositoryImplTestCase.java
	war/src/main/webapp/CHANGE_LOGS.html
	war/src/main/webapp/css/default-admin.css
	war/src/main/webapp/css/default-base.css
	war/src/main/webapp/css/default-init.css
	war/src/main/webapp/js/admin/admin.js
	war/src/main/webapp/js/admin/editorKindEditor.js
	war/src/main/webapp/js/admin/editorTinyMCE.js
	war/src/main/webapp/js/admin/pageList.js
	war/src/main/webapp/js/admin/preference.js
	war/src/main/webapp/js/admin/tablePaginate.js
	war/src/main/webapp/js/lib/jquery/jquery.bowknot.min.js
	war/src/main/webapp/skins/classic/css/classic.css
parents c9216004 3fab14b0
/war/mysql/target/
/core/target/
/war/gae/target/
/war/target/
\ No newline at end of file
/war/target/
/war/mysql/target/
\ No newline at end of file
......@@ -5,6 +5,16 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h2>Release 0.4.6 - Jul 1, 2012</h2>
<ul>
<li><a href="https://github.com/b3log/b3log-solo/issues/10">10 评论表情后台管理不显示</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/12">12 编辑自定义导航报错</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/15">15 sitemap.xml 导航生成重复</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/17">17 默认皮肤改为 ease</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/23">23 偏好设定关键参数校验</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/27">27 自定义导航后台链接问题</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/32">32 升级 FreeMarker 到 2.3.19</a></li>
</ul>
<h2>Release 0.4.5 - Jun 1, 2012</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=302">302 文章加密</a></li>
......
......@@ -4,19 +4,19 @@ Project home: https://github.com/b3log/b3log-solo
Request features/Report bugs: https://github.com/b3log/b3log-solo/issues/new
* QQ Qun: 13139268
* User Guide: http://code.google.com/p/b3log-solo/wiki/UserGuide
* Dev Guide: http://code.google.com/p/b3log-solo/wiki/pre_dev
* Skin Dev Guide: http://code.google.com/p/b3log-solo/wiki/develop_steps
* User Guide: https://github.com/b3log/b3log-solo/wiki/Pre_installation
* Dev Guide: https://github.com/b3log/b3log-solo/wiki/Pre_dev
* Skin Dev Guide: https://github.com/b3log/b3log-solo/wiki/Develop_steps
* Plugin Dev Guide: https://docs.google.com/document/pub?id=15H7Q3EBo-44v61Xp_epiYY7vK_gPJLkQaT7T1gkE64w&pli=1
====
B3log Index: http://b3log.org
B3log Team: http://code.google.com/p/b3log-solo/wiki/about_us
Join B3log Team: http://code.google.com/p/b3log-solo/wiki/join_us
B3log Team: https://github.com/b3log/b3log-solo/wiki/About_us
Join B3log Team: https://github.com/b3log/b3log-solo/wiki/Join_us
====
平等,自由,奔放
Equality, Freedom, Passion
;-)
\ No newline at end of file
;-)
<?xml version="1.0" encoding="UTF-8"?>
<!--
Description: B3log Solo core.
Version: 2.0.0.8, May 11, 2012
Version: 2.0.0.9, Jun 19, 2012
Author: Liang Ding
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
......@@ -17,7 +17,7 @@
<parent>
<groupId>org.b3log</groupId>
<artifactId>solo</artifactId>
<version>0.4.5</version>
<version>0.4.6</version>
</parent>
<dependencies>
......
......@@ -52,7 +52,7 @@ import org.json.JSONObject;
* B3log Solo servlet listener.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.7.1, May 29, 2011
* @version 1.0.7.3, Jun 19, 2011
* @since 0.3.1
*/
public final class SoloServletListener extends AbstractServletListener {
......@@ -60,7 +60,7 @@ public final class SoloServletListener extends AbstractServletListener {
/**
* B3log Solo version.
*/
public static final String VERSION = "0.4.5";
public static final String VERSION = "0.4.6";
/**
* Logger.
*/
......@@ -84,8 +84,8 @@ public final class SoloServletListener extends AbstractServletListener {
super.contextInitialized(servletContextEvent);
// Default to skin "classic", loads from preference later
Skins.setDirectoryForTemplateLoading("classic");
// Default to skin "ease", loads from preference later
Skins.setDirectoryForTemplateLoading("ease");
final PreferenceRepository preferenceRepository = PreferenceRepositoryImpl.getInstance();
......
......@@ -194,7 +194,7 @@ public final class Preference {
* Default preference.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.1.0.6, Mar 28, 2012
* @version 1.1.0.7, Jun 12, 2012
* @since 0.3.1
*/
public static final class Default {
......@@ -238,7 +238,7 @@ public final class Preference {
/**
* Default skin directory name.
*/
public static final String DEFAULT_SKIN_DIR_NAME = "classic";
public static final String DEFAULT_SKIN_DIR_NAME = "ease";
/**
* Default language.
*/
......
......@@ -770,6 +770,7 @@ public final class ArticleProcessor {
@RequestProcessing(value = "/article", method = HTTPRequestMethod.GET)
public void showArticle(final HTTPRequestContext context, final HttpServletRequest request, final HttpServletResponse response)
throws IOException {
// See PermalinkFiler#dispatchToArticleOrPageProcessor()
final JSONObject article = (JSONObject) request.getAttribute(Article.ARTICLE);
if (null == article) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
......
......@@ -28,7 +28,10 @@ import org.b3log.latke.annotation.RequestProcessor;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.user.UserService;
import org.b3log.latke.user.UserServiceFactory;
import org.b3log.latke.util.Locales;
import org.b3log.solo.model.Common;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.PreferenceQueryService;
......@@ -38,7 +41,7 @@ import org.json.JSONObject;
* Error processor.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.0, May 18, 2012
* @version 1.0.0.1, Jun 20, 2012
* @since 0.4.5
*/
@RequestProcessor
......@@ -60,6 +63,10 @@ public final class ErrorProcessor {
* Language service.
*/
private LangPropsService langPropsService = LangPropsService.getInstance();
/**
* User service.
*/
private static UserService userService = UserServiceFactory.getUserService();
/**
* Shows the user template page.
......@@ -90,6 +97,8 @@ public final class ErrorProcessor {
filler.fillBlogHeader(request, dataModel, preference);
filler.fillBlogFooter(dataModel, preference);
dataModel.put(Common.LOGIN_URL, userService.createLoginURL(Common.ADMIN_INDEX_URI));
} catch (final Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
......
......@@ -29,6 +29,7 @@ import org.b3log.latke.annotation.RequestProcessing;
import org.b3log.latke.annotation.RequestProcessor;
import org.b3log.latke.model.User;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.PropertyFilter;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.servlet.HTTPRequestContext;
......@@ -125,7 +126,7 @@ public final class FeedProcessor {
final Query query = new Query().setCurrentPageNum(1).
setPageSize(ENTRY_OUTPUT_CNT).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true).
setFilter(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true)).
addSort(Article.ARTICLE_UPDATE_DATE, SortDirection.DESCENDING).
setPageCount(1);
......@@ -335,7 +336,7 @@ public final class FeedProcessor {
final Query query = new Query().setCurrentPageNum(1).
setPageSize(ENTRY_OUTPUT_CNT).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true).
setFilter(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true)).
addSort(Article.ARTICLE_UPDATE_DATE, SortDirection.DESCENDING).
setPageCount(1);
......
......@@ -110,7 +110,8 @@ public final class PageProcessor {
final Map<String, String> langs = langPropsService.getAll(Latkes.getLocale());
request.setAttribute(CACHED_TYPE, langs.get(PageTypes.PAGE));
// See PermalinkFiler#dispatchToArticleOrPageProcessor()
final JSONObject page = (JSONObject) request.getAttribute(Page.PAGE);
if (null == page) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
......
......@@ -26,6 +26,7 @@ import org.b3log.latke.Keys;
import org.b3log.latke.annotation.RequestProcessing;
import org.b3log.latke.annotation.RequestProcessor;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.PropertyFilter;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.servlet.HTTPRequestContext;
......@@ -53,7 +54,7 @@ import org.json.JSONObject;
* Site map (sitemap) processor.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.3, May 7, 2012
* @version 1.0.0.4, Jun 11, 2012
* @since 0.3.1
*/
@RequestProcessor
......@@ -100,7 +101,7 @@ public final class SitemapProcessor {
final JSONObject preference = preferenceQueryService.getPreference();
addArticles(sitemap, preference);
addPages(sitemap, preference);
addNavigations(sitemap, preference);
addTags(sitemap, preference);
addArchives(sitemap, preference);
......@@ -113,7 +114,6 @@ public final class SitemapProcessor {
try {
context.getResponse().sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
return;
} catch (final IOException ex) {
throw new RuntimeException(ex);
}
......@@ -132,7 +132,7 @@ public final class SitemapProcessor {
// XXX: query all articles?
final Query query = new Query().setCurrentPageNum(1).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true).
setFilter(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true)).
addSort(Article.ARTICLE_CREATE_DATE, SortDirection.DESCENDING);
// Closes cache avoid Java heap space out of memory while caching
......@@ -160,13 +160,13 @@ public final class SitemapProcessor {
}
/**
* Adds pages into the specified sitemap.
* Adds navigations into the specified sitemap.
*
* @param sitemap the specified sitemap
* @param preference the specified preference
* @throws Exception exception
*/
private void addPages(final Sitemap sitemap, final JSONObject preference) throws Exception {
private void addNavigations(final Sitemap sitemap, final JSONObject preference) throws Exception {
final String host = preference.getString(Preference.BLOG_HOST);
final JSONObject result = pageRepository.get(new Query());
......@@ -176,7 +176,13 @@ public final class SitemapProcessor {
final String permalink = page.getString(Page.PAGE_PERMALINK);
final URL url = new URL();
url.setLoc("http://" + host + permalink);
// The navigation maybe a page or a link
// Just filters for user mistakes tolerance
if (!permalink.contains("://")) {
url.setLoc("http://" + host + permalink);
} else {
url.setLoc(permalink);
}
sitemap.addURL(url);
}
......
......@@ -37,7 +37,7 @@ import org.json.JSONObject;
* Upgrader.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.1.0.9, Apr 29, 2012
* @version 1.1.1.0, Jun 19, 2012
* @since 0.3.1
*/
@RequestProcessor
......@@ -99,8 +99,8 @@ public final class UpgradeProcessor {
return;
}
if ("0.4.1".equals(version)) {
v041ToV045();
if ("0.4.5".equals(version)) {
v045ToV046();
} else {
final String msg = "Your B3log Solo is too old to upgrader, please contact the B3log Solo developers";
LOGGER.warning(msg);
......@@ -114,54 +114,25 @@ public final class UpgradeProcessor {
}
/**
* Upgrades from version 041 to version 045.
* Upgrades from version 045 to version 046.
*
* <p>
* Model:
* <ul>
* <li>
* Adds a property(named {@value Article#ARTICLE_EDITOR_TYPE}) to entity {@link Article}
* </li>
* <li>
* Adds a property(named {@value Page#PAGE_EDITOR_TYPE}) to entity {@link Page}
* </li>
* <li>
* Adds a property(named {@value Preference#EDITOR_TYPE}) to entity {@link Preference}
* </li>
* </ul>
* </p>
* @throws Exception upgrade fails
*/
private void v041ToV045() throws Exception {
LOGGER.info("Upgrading from version 041 to version 045....");
private void v045ToV046() throws Exception {
LOGGER.info("Upgrading from version 045 to version 046....");
articleRepository.setCacheEnabled(false);
Transaction transaction = null;
try {
upgradeArticles();
transaction = userRepository.beginTransaction();
// Upgrades page model
final JSONObject result = pageRepository.get(new Query());
final JSONArray pages = result.getJSONArray(Keys.RESULTS);
for (int i = 0; i < pages.length(); i++) {
final JSONObject page = pages.getJSONObject(i);
page.put(Page.PAGE_EDITOR_TYPE, "tinyMCE");
pageRepository.update(page.getString(Keys.OBJECT_ID), page);
}
LOGGER.log(Level.FINEST, "Updated pages");
// Upgrades preference model
final JSONObject preference = preferenceRepository.get(Preference.PREFERENCE);
preference.put(Preference.COMMENTABLE, Preference.Default.DEFAULT_COMMENTABLE);
preference.put(Preference.EDITOR_TYPE, Preference.Default.DEFAULT_EDITOR_TYPE);
preference.put(Preference.VERSION, "0.4.5");
preference.put(Preference.VERSION, "0.4.6");
preferenceRepository.update(Preference.PREFERENCE, preference);
......@@ -174,12 +145,12 @@ public final class UpgradeProcessor {
}
LOGGER.log(Level.SEVERE, "Upgrade failed.", e);
throw new Exception("Upgrade failed from version 041 to version 045");
throw new Exception("Upgrade failed from version 045 to version 046");
} finally {
articleRepository.setCacheEnabled(true);
}
LOGGER.info("Upgraded from version 041 to version 045 successfully :-)");
LOGGER.info("Upgraded from version 045 to version 046 successfully :-)");
}
/**
......
......@@ -35,13 +35,15 @@ import org.b3log.solo.service.PageQueryService;
import org.b3log.solo.util.QueryResults;
import org.b3log.solo.util.Users;
import org.b3log.latke.util.Requests;
import org.b3log.solo.model.Page;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* Plugin console request processing.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.0, Oct 27, 2011
* @version 1.0.0.1, Jun 20, 2012
* @since 0.4.0
*/
@RequestProcessor
......@@ -419,6 +421,19 @@ public final class PageConsole {
final JSONObject requestJSONObject = Requests.buildPaginationRequest(path);
final JSONObject result = pageQueryService.getPages(requestJSONObject);
final JSONArray pages = result.optJSONArray(Page.PAGES);
// Site-internal URLs process
for (int i = 0; i < pages.length(); i++) {
final JSONObject page = pages.getJSONObject(i);
if ("page".equals(page.optString(Page.PAGE_TYPE))) {
final String permalink = page.optString(Page.PAGE_PERMALINK);
page.put(Page.PAGE_PERMALINK, Latkes.getServePath() + permalink);
}
}
result.put(Keys.STATUS_CODE, true);
renderer.setJSONObject(result);
......
......@@ -41,7 +41,7 @@ import org.json.JSONObject;
* Preference console request processing.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.2, Mar 28, 2012
* @version 1.0.0.3, Jun 20, 2012
* @since 0.4.0
*/
@RequestProcessor
......@@ -213,7 +213,7 @@ public final class PreferenceConsole {
final JSONArray signs = new JSONArray();
final JSONArray allSigns = // includes the empty sign(id=0)
new JSONArray(preference.getString(Preference.SIGNS));
new JSONArray(preference.getString(Preference.SIGNS));
for (int i = 1; i < allSigns.length(); i++) { // excludes the empty sign
signs.put(allSigns.getJSONObject(i));
}
......@@ -241,13 +241,17 @@ public final class PreferenceConsole {
* {
* "sc": boolean,
* "preference": {
* "recentArticleDisplayCount": int,
* "mostViewArticleDisplayCount": int,
* "recentCommentDisplayCount": int,
* "mostUsedTagDisplayCount": int,
* "articleListDisplayCount": int,
* "articleListPaginationWindowSize": int,
* "mostCommentArticleDisplayCount": int,
* "externalRelevantArticlesDisplayCount": int,
* "relevantArticlesDisplayCount": int,
* "randomArticlesDisplayCount": int,
* "blogTitle": "",
* "blogSubtitle": "",
* "mostCommentArticleDisplayCount": int,
* "blogHost": "",
* "localeString": "",
* "timeZoneId": "",
......@@ -259,9 +263,6 @@ public final class PreferenceConsole {
* }, ....]",
* "noticeBoard": "",
* "htmlHead": "",
* "externalRelevantArticlesDisplayCount": int,
* "relevantArticlesDisplayCount": int,
* "randomArticlesDisplayCount": int,
* "adminEmail": "",
* "metaKeywords": "",
* "metaDescription": "",
......@@ -326,22 +327,23 @@ public final class PreferenceConsole {
* <pre>
* {
* "preference": {
* "recentArticleDisplayCount": int,
* "mostViewArticleDisplayCount": int,
* "recentCommentDisplayCount": int,
* "mostUsedTagDisplayCount": int,
* "articleListDisplayCount": int,
* "articleListPaginationWindowSize": int
* "articleListPaginationWindowSize": int,
* "mostCommentArticleDisplayCount": int,
* "externalRelevantArticlesDisplayCount": int,
* "relevantArticlesDisplayCount": int,
* "randomArticlesDisplayCount": int,
* "blogTitle": "",
* "blogSubtitle": "",
* "mostCommentArticleDisplayCount": int,
* "skinDirName": "",
* "blogHost": "",
* "localeString": "",
* "timeZoneId": "",
* "noticeBoard": "",
* "htmlHead": "",
* "externalRelevantArticlesDisplayCount": int,
* "relevantArticlesDisplayCount": int,
* "randomArticlesDisplayCount": int,
* "metaKeywords": "",
* "metaDescription": "",
* "enableArticleUpdateHint": boolean,
......@@ -376,14 +378,17 @@ public final class PreferenceConsole {
final JSONObject preference = requestJSONObject.getJSONObject(Preference.PREFERENCE);
preferenceMgmtService.updatePreference(preference);
final JSONObject ret = new JSONObject();
renderer.setJSONObject(ret);
if (isInvalid(preference, ret)) {
return;
}
preferenceMgmtService.updatePreference(preference);
ret.put(Keys.STATUS_CODE, true);
ret.put(Keys.MSG, langPropsService.get("updateSuccLabel"));
renderer.setJSONObject(ret);
} catch (final ServiceException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
......@@ -392,4 +397,106 @@ public final class PreferenceConsole {
jsonObject.put(Keys.MSG, e.getMessage());
}
}
/**
* Checks whether the specified preference is invalid and sets the specified response object.
*
* @param preference the specified preference
* @param responseObject the specified response object
* @return {@code true} if the specified preference is invalid, returns {@code false} otherwise
*/
private boolean isInvalid(final JSONObject preference, final JSONObject responseObject) {
responseObject.put(Keys.STATUS_CODE, false);
final StringBuilder errMsgBuilder = new StringBuilder('[' + langPropsService.get("paramSettingsLabel"));
errMsgBuilder.append(" - ");
String input = preference.optString(Preference.EXTERNAL_RELEVANT_ARTICLES_DISPLAY_CNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("externalRelevantArticlesDisplayCntLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.RELEVANT_ARTICLES_DISPLAY_CNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("relevantArticlesDisplayCntLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.RANDOM_ARTICLES_DISPLAY_CNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("randomArticlesDisplayCntLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.MOST_COMMENT_ARTICLE_DISPLAY_CNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("indexMostCommentArticleDisplayCntLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.MOST_VIEW_ARTICLE_DISPLAY_CNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("indexMostViewArticleDisplayCntLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.RECENT_COMMENT_DISPLAY_CNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("indexRecentCommentDisplayCntLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.MOST_USED_TAG_DISPLAY_CNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("indexTagDisplayCntLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.ARTICLE_LIST_DISPLAY_COUNT);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("pageSizeLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
input = preference.optString(Preference.ARTICLE_LIST_PAGINATION_WINDOW_SIZE);
if (!isNonNegativeInteger(input)) {
errMsgBuilder.append(langPropsService.get("windowSizeLabel")).append("] ").append(langPropsService.get(
"nonNegativeIntegerOnlyLabel"));
responseObject.put(Keys.MSG, errMsgBuilder.toString());
return true;
}
return false;
}
/**
* Checks whether the specified input is a non-negative integer.
*
* @param input the specified input
* @return {@code true} if it is, returns {@code false} otherwise
*/
private boolean isNonNegativeInteger(final String input) {
try {
return 0 <= Integer.valueOf(input);
} catch (final Exception e) {
return false;
}
}
}
......@@ -39,9 +39,7 @@ import org.b3log.latke.model.Pagination;
import org.b3log.latke.model.Plugin;
import org.b3log.latke.model.User;
import org.b3log.latke.plugin.ViewLoadEventData;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.repository.*;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.*;
import org.b3log.latke.util.freemarker.Templates;
......@@ -154,7 +152,7 @@ public final class Filler {
final int pageCount = (int) Math.ceil((double) publishedArticleCnt / (double) pageSize);
final Query query = new Query().setCurrentPageNum(currentPageNum).setPageSize(pageSize).setPageCount(pageCount).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, PUBLISHED).
setFilter(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, PUBLISHED)).
addSort(Article.ARTICLE_PUT_TOP, SortDirection.DESCENDING).
index(Article.ARTICLE_PERMALINK);
......
......@@ -16,12 +16,8 @@
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.*;
import org.b3log.solo.model.Article;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.SortDirection;
import org.b3log.solo.model.ArchiveDate;
import org.b3log.solo.repository.ArchiveDateArticleRepository;
import org.json.JSONArray;
......@@ -45,8 +41,8 @@ public final class ArchiveDateArticleRepositoryImpl extends AbstractRepository i
@Override
public JSONObject getByArchiveDateId(final String archiveDateId, final int currentPageNum, final int pageSize)
throws RepositoryException {
final Query query = new Query().addFilter(ArchiveDate.ARCHIVE_DATE + "_" + Keys.OBJECT_ID,
FilterOperator.EQUAL, archiveDateId).
final Query query = new Query().setFilter(new PropertyFilter(ArchiveDate.ARCHIVE_DATE + "_" + Keys.OBJECT_ID,
FilterOperator.EQUAL, archiveDateId)).
addSort(Article.ARTICLE + "_" + Keys.OBJECT_ID,
SortDirection.DESCENDING).
setCurrentPageNum(currentPageNum).
......@@ -59,7 +55,7 @@ public final class ArchiveDateArticleRepositoryImpl extends AbstractRepository i
@Override
public JSONObject getByArticleId(final String articleId) throws RepositoryException {
final Query query = new Query();
query.addFilter(Article.ARTICLE + "_" + Keys.OBJECT_ID, FilterOperator.EQUAL, articleId);
query.setFilter(new PropertyFilter(Article.ARTICLE + "_" + Keys.OBJECT_ID, FilterOperator.EQUAL, articleId));
final JSONObject result = get(query);
final JSONArray array = result.optJSONArray(Keys.RESULTS);
......
......@@ -21,11 +21,7 @@ import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.repository.*;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.solo.model.ArchiveDate;
import org.b3log.solo.repository.ArchiveDateRepository;
......@@ -61,7 +57,7 @@ public final class ArchiveDateRepositoryImpl extends AbstractRepository implemen
}
final Query query = new Query();
query.addFilter(ArchiveDate.ARCHIVE_TIME, FilterOperator.EQUAL, time).setPageCount(1);
query.setFilter(new PropertyFilter(ArchiveDate.ARCHIVE_TIME, FilterOperator.EQUAL, time)).setPageCount(1);
final JSONObject result = get(query);
final JSONArray array = result.optJSONArray(Keys.RESULTS);
......
......@@ -54,8 +54,9 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
@Override
public JSONObject getByAuthorEmail(final String authorEmail, final int currentPageNum, final int pageSize)
throws RepositoryException {
final Query query = new Query().addFilter(Article.ARTICLE_AUTHOR_EMAIL, FilterOperator.EQUAL, authorEmail).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true).
final Query query = new Query().setFilter(CompositeFilterOperator.and(
new PropertyFilter(Article.ARTICLE_AUTHOR_EMAIL, FilterOperator.EQUAL, authorEmail),
new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true))).
addSort(Article.ARTICLE_UPDATE_DATE, SortDirection.DESCENDING).
setCurrentPageNum(currentPageNum).setPageSize(pageSize).setPageCount(1);
......@@ -64,7 +65,8 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
@Override
public JSONObject getByPermalink(final String permalink) throws RepositoryException {
final Query query = new Query().addFilter(Article.ARTICLE_PERMALINK, FilterOperator.EQUAL, permalink).
final Query query = new Query().setFilter(
new PropertyFilter(Article.ARTICLE_PERMALINK, FilterOperator.EQUAL, permalink)).
setPageCount(1);
final JSONObject result = get(query);
......@@ -80,7 +82,7 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
@Override
public List<JSONObject> getRecentArticles(final int fetchSize) throws RepositoryException {
final Query query = new Query();
query.addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true);
query.setFilter(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true));
query.addSort(Article.ARTICLE_UPDATE_DATE, SortDirection.DESCENDING);
query.setCurrentPageNum(1);
query.setPageSize(fetchSize);
......@@ -96,7 +98,7 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
public List<JSONObject> getMostCommentArticles(final int num) throws RepositoryException {
final Query query = new Query().addSort(Article.ARTICLE_COMMENT_COUNT, SortDirection.DESCENDING).
addSort(Article.ARTICLE_UPDATE_DATE, SortDirection.DESCENDING).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true).
setFilter(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true)).
setCurrentPageNum(1).setPageSize(num).setPageCount(1);
final JSONObject result = get(query);
......@@ -110,7 +112,7 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
final Query query = new Query();
query.addSort(Article.ARTICLE_VIEW_COUNT, SortDirection.DESCENDING).
addSort(Article.ARTICLE_UPDATE_DATE, SortDirection.DESCENDING);
query.addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true);
query.setFilter(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true));
query.setCurrentPageNum(1);
query.setPageSize(num);
query.setPageCount(1);
......@@ -126,8 +128,10 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
final JSONObject currentArticle = get(articleId);
final Date currentArticleCreateDate = (Date) currentArticle.opt(Article.ARTICLE_CREATE_DATE);
final Query query = new Query().addFilter(Article.ARTICLE_CREATE_DATE, FilterOperator.LESS_THAN, currentArticleCreateDate).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true).
final Query query = new Query().setFilter(
CompositeFilterOperator.and(
new PropertyFilter(Article.ARTICLE_CREATE_DATE, FilterOperator.LESS_THAN, currentArticleCreateDate),
new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true))).
addSort(Article.ARTICLE_CREATE_DATE, SortDirection.DESCENDING).setCurrentPageNum(1).
setPageSize(1).setPageCount(1).
addProjection(Article.ARTICLE_TITLE, String.class).
......@@ -158,8 +162,10 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
final JSONObject currentArticle = get(articleId);
final Date currentArticleCreateDate = (Date) currentArticle.opt(Article.ARTICLE_CREATE_DATE);
final Query query = new Query().addFilter(Article.ARTICLE_CREATE_DATE, FilterOperator.GREATER_THAN, currentArticleCreateDate).
addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true).
final Query query = new Query().setFilter(
CompositeFilterOperator.and(
new PropertyFilter(Article.ARTICLE_CREATE_DATE, FilterOperator.GREATER_THAN, currentArticleCreateDate),
new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true))).
addSort(Article.ARTICLE_CREATE_DATE, SortDirection.ASCENDING).setCurrentPageNum(1).
setPageSize(1).setPageCount(1).
addProjection(Article.ARTICLE_TITLE, String.class).
......@@ -207,9 +213,10 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
LOGGER.log(Level.FINEST, "Random mid[{0}]", mid);
Query query = new Query();
query.addFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.GREATER_THAN_OR_EQUAL, mid);
query.addFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.LESS_THAN_OR_EQUAL, mid);
query.addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true);
query.setFilter(CompositeFilterOperator.and(
new PropertyFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.GREATER_THAN_OR_EQUAL, mid),
new PropertyFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.LESS_THAN_OR_EQUAL, mid),
new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true)));
query.setCurrentPageNum(1);
query.setPageSize(fetchSize);
query.setPageCount(1);
......@@ -223,9 +230,10 @@ public final class ArticleRepositoryImpl extends AbstractRepository implements A
final int reminingSize = fetchSize - array1.length();
if (0 != reminingSize) { // Query for remains
query = new Query();
query.addFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.GREATER_THAN_OR_EQUAL, 0D);
query.addFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.LESS_THAN_OR_EQUAL, mid);
query.addFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true);
query.setFilter(CompositeFilterOperator.and(
new PropertyFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.GREATER_THAN_OR_EQUAL, 0D),
new PropertyFilter(Article.ARTICLE_RANDOM_DOUBLE, FilterOperator.LESS_THAN_OR_EQUAL, mid),
new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true)));
query.setCurrentPageNum(1);
query.setPageSize(reminingSize);
query.setPageCount(1);
......
......@@ -22,11 +22,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.cache.Cache;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.repository.*;
import org.b3log.solo.model.Comment;
import org.b3log.solo.repository.CommentRepository;
import org.b3log.latke.util.CollectionUtils;
......@@ -79,7 +75,7 @@ public final class CommentRepositoryImpl extends AbstractRepository implements C
public List<JSONObject> getComments(final String onId, final int currentPageNum, final int pageSize)
throws RepositoryException {
final Query query = new Query().addSort(Keys.OBJECT_ID, SortDirection.DESCENDING).
addFilter(Comment.COMMENT_ON_ID, FilterOperator.EQUAL, onId).
setFilter(new PropertyFilter(Comment.COMMENT_ON_ID, FilterOperator.EQUAL, onId)).
setCurrentPageNum(currentPageNum).
setPageSize(pageSize).
setPageCount(1);
......
......@@ -17,11 +17,7 @@ package org.b3log.solo.repository.impl;
import java.util.logging.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.repository.*;
import org.b3log.solo.model.Link;
import org.b3log.solo.repository.LinkRepository;
import org.json.JSONArray;
......@@ -47,7 +43,8 @@ public final class LinkRepositoryImpl extends AbstractRepository implements Link
@Override
public JSONObject getByAddress(final String address) throws RepositoryException {
final Query query = new Query().addFilter(Link.LINK_ADDRESS, FilterOperator.EQUAL, address).
final Query query = new Query().setFilter(
new PropertyFilter(Link.LINK_ADDRESS, FilterOperator.EQUAL, address)).
setPageCount(1);
final JSONObject result = get(query);
......@@ -78,7 +75,7 @@ public final class LinkRepositoryImpl extends AbstractRepository implements Link
@Override
public JSONObject getByOrder(final int order) throws RepositoryException {
final Query query = new Query();
query.addFilter(Link.LINK_ORDER, FilterOperator.EQUAL, order);
query.setFilter(new PropertyFilter(Link.LINK_ORDER, FilterOperator.EQUAL, order));
final JSONObject result = get(query);
final JSONArray array = result.optJSONArray(Keys.RESULTS);
......@@ -98,7 +95,8 @@ public final class LinkRepositoryImpl extends AbstractRepository implements Link
}
final Query query = new Query();
query.addFilter(Link.LINK_ORDER, FilterOperator.LESS_THAN, link.optInt(Link.LINK_ORDER)).
query.setFilter(
new PropertyFilter(Link.LINK_ORDER, FilterOperator.LESS_THAN, link.optInt(Link.LINK_ORDER))).
addSort(Link.LINK_ORDER, SortDirection.DESCENDING);
query.setCurrentPageNum(1);
query.setPageSize(1);
......@@ -121,7 +119,7 @@ public final class LinkRepositoryImpl extends AbstractRepository implements Link
}
final Query query = new Query();
query.addFilter(Link.LINK_ORDER, FilterOperator.GREATER_THAN, link.optInt(Link.LINK_ORDER)).
query.setFilter(new PropertyFilter(Link.LINK_ORDER, FilterOperator.GREATER_THAN, link.optInt(Link.LINK_ORDER))).
addSort(Link.LINK_ORDER, SortDirection.ASCENDING);
query.setCurrentPageNum(1);
query.setPageSize(1);
......
......@@ -18,11 +18,7 @@ package org.b3log.solo.repository.impl;
import java.util.List;
import java.util.logging.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.repository.*;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.solo.model.Page;
import org.b3log.solo.repository.PageRepository;
......@@ -49,7 +45,8 @@ public final class PageRepositoryImpl extends AbstractRepository implements Page
@Override
public JSONObject getByPermalink(final String permalink) throws RepositoryException {
final Query query = new Query().addFilter(Page.PAGE_PERMALINK, FilterOperator.EQUAL, permalink).
final Query query = new Query().setFilter(
new PropertyFilter(Page.PAGE_PERMALINK, FilterOperator.EQUAL, permalink)).
setPageCount(1);
final JSONObject result = get(query);
final JSONArray array = result.optJSONArray(Keys.RESULTS);
......@@ -82,7 +79,8 @@ public final class PageRepositoryImpl extends AbstractRepository implements Page
return null;
}
final Query query = new Query().addFilter(Page.PAGE_ORDER, FilterOperator.LESS_THAN, page.optInt(Page.PAGE_ORDER)).
final Query query = new Query().setFilter(
new PropertyFilter(Page.PAGE_ORDER, FilterOperator.LESS_THAN, page.optInt(Page.PAGE_ORDER))).
addSort(Page.PAGE_ORDER, SortDirection.DESCENDING).
setCurrentPageNum(1).setPageSize(1).setPageCount(1);
......@@ -103,7 +101,8 @@ public final class PageRepositoryImpl extends AbstractRepository implements Page
return null;
}
final Query query = new Query().addFilter(Page.PAGE_ORDER, FilterOperator.GREATER_THAN, page.optInt(Page.PAGE_ORDER)).
final Query query = new Query().setFilter(
new PropertyFilter(Page.PAGE_ORDER, FilterOperator.GREATER_THAN, page.optInt(Page.PAGE_ORDER))).
addSort(Page.PAGE_ORDER, SortDirection.ASCENDING).setCurrentPageNum(1).
setPageSize(1).
setPageCount(1);
......@@ -120,7 +119,8 @@ public final class PageRepositoryImpl extends AbstractRepository implements Page
@Override
public JSONObject getByOrder(final int order) throws RepositoryException {
final Query query = new Query().addFilter(Page.PAGE_ORDER, FilterOperator.EQUAL, order).
final Query query = new Query().setFilter(
new PropertyFilter(Page.PAGE_ORDER, FilterOperator.EQUAL, order)).
setPageCount(1);
final JSONObject result = get(query);
final JSONArray array = result.optJSONArray(Keys.RESULTS);
......
......@@ -21,11 +21,7 @@ import org.b3log.solo.model.Article;
import org.b3log.solo.model.Tag;
import org.b3log.solo.repository.TagArticleRepository;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.repository.*;
import org.b3log.latke.util.CollectionUtils;
import org.json.JSONArray;
import org.json.JSONObject;
......@@ -50,7 +46,8 @@ public final class TagArticleRepositoryImpl extends AbstractRepository implement
@Override
public List<JSONObject> getByArticleId(final String articleId) throws RepositoryException {
final Query query = new Query().addFilter(Article.ARTICLE + "_" + Keys.OBJECT_ID, FilterOperator.EQUAL, articleId).
final Query query = new Query().setFilter(
new PropertyFilter(Article.ARTICLE + "_" + Keys.OBJECT_ID, FilterOperator.EQUAL, articleId)).
setPageCount(1);
final JSONObject result = get(query);
......@@ -62,7 +59,8 @@ public final class TagArticleRepositoryImpl extends AbstractRepository implement
@Override
public JSONObject getByTagId(final String tagId, final int currentPageNum, final int pageSize)
throws RepositoryException {
final Query query = new Query().addFilter(Tag.TAG + "_" + Keys.OBJECT_ID, FilterOperator.EQUAL, tagId).
final Query query = new Query().setFilter(
new PropertyFilter(Tag.TAG + "_" + Keys.OBJECT_ID, FilterOperator.EQUAL, tagId)).
addSort(Article.ARTICLE + "_" + Keys.OBJECT_ID, SortDirection.DESCENDING).
setCurrentPageNum(currentPageNum).
setPageSize(pageSize).
......
......@@ -21,11 +21,7 @@ import java.util.logging.Logger;
import org.b3log.solo.model.Tag;
import org.b3log.solo.repository.TagRepository;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.repository.*;
import org.b3log.latke.util.CollectionUtils;
import org.json.JSONArray;
import org.json.JSONObject;
......@@ -54,7 +50,8 @@ public final class TagRepositoryImpl extends AbstractRepository implements TagRe
@Override
public JSONObject getByTitle(final String tagTitle) throws RepositoryException {
final Query query = new Query().addFilter(Tag.TAG_TITLE, FilterOperator.EQUAL, tagTitle).
final Query query = new Query().setFilter(
new PropertyFilter(Tag.TAG_TITLE, FilterOperator.EQUAL, tagTitle)).
setPageCount(1);
final JSONObject result = get(query);
......
......@@ -19,10 +19,7 @@ import java.util.logging.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.latke.repository.AbstractRepository;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.*;
import org.b3log.solo.repository.UserRepository;
import org.json.JSONArray;
import org.json.JSONObject;
......@@ -48,7 +45,8 @@ public final class UserRepositoryImpl extends AbstractRepository implements User
@Override
public JSONObject getByEmail(final String email) throws RepositoryException {
final Query query = new Query().setPageCount(1);
query.addFilter(User.USER_EMAIL, FilterOperator.EQUAL, email.toLowerCase().trim());
query.setFilter(
new PropertyFilter(User.USER_EMAIL, FilterOperator.EQUAL, email.toLowerCase().trim()));
final JSONObject result = get(query);
final JSONArray array = result.optJSONArray(Keys.RESULTS);
......@@ -62,7 +60,8 @@ public final class UserRepositoryImpl extends AbstractRepository implements User
@Override
public JSONObject getAdmin() throws RepositoryException {
final Query query = new Query().addFilter(User.USER_ROLE, FilterOperator.EQUAL, Role.ADMIN_ROLE).setPageCount(1);
final Query query = new Query().setFilter(
new PropertyFilter(User.USER_ROLE, FilterOperator.EQUAL, Role.ADMIN_ROLE)).setPageCount(1);
final JSONObject result = get(query);
final JSONArray array = result.optJSONArray(Keys.RESULTS);
......
......@@ -35,7 +35,7 @@ import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.repository.*;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.latke.util.Paginator;
......@@ -258,7 +258,8 @@ public final class ArticleQueryService {
setPageSize(pageSize).
addSort(ARTICLE_PUT_TOP, SortDirection.DESCENDING).
addSort(ARTICLE_CREATE_DATE, SortDirection.DESCENDING).
addFilter(ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, articleIsPublished);
setFilter(
new PropertyFilter(ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, articleIsPublished));
int articleCount = statistics.getBlogArticleCount();
if (!articleIsPublished) {
......@@ -335,7 +336,8 @@ public final class ArticleQueryService {
final List<JSONObject> ret = new ArrayList<JSONObject>();
final Query query = new Query().addFilter(Keys.OBJECT_ID, FilterOperator.IN, articleIds).
final Query query = new Query().setFilter(
new PropertyFilter(Keys.OBJECT_ID, FilterOperator.IN, articleIds)).
setPageCount(1).index(Article.ARTICLE_PERMALINK);
result = articleRepository.get(query);
final JSONArray articles = result.getJSONArray(Keys.RESULTS);
......@@ -389,7 +391,8 @@ public final class ArticleQueryService {
final List<JSONObject> ret = new ArrayList<JSONObject>();
final Query query = new Query().addFilter(Keys.OBJECT_ID, FilterOperator.IN, articleIds).
final Query query = new Query().setFilter(
new PropertyFilter(Keys.OBJECT_ID, FilterOperator.IN, articleIds)).
setPageCount(1).index(Article.ARTICLE_PERMALINK);
result = articleRepository.get(query);
final JSONArray articles = result.getJSONArray(Keys.RESULTS);
......
......@@ -42,7 +42,7 @@ import org.json.JSONObject;
* Page management service.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.6, Feb 25, 2012
* @version 1.0.0.7, Jun 8, 2012
* @since 0.4.0
*/
public final class PageMgmtService {
......@@ -149,7 +149,7 @@ public final class PageMgmtService {
// Editor type
final JSONObject preference = preferenceQueryService.getPreference();
page.put(Page.PAGE_EDITOR_TYPE, preference.optString(Preference.EDITOR_TYPE));
newPage.put(Page.PAGE_EDITOR_TYPE, preference.optString(Preference.EDITOR_TYPE));
pageRepository.update(pageId, newPage);
......
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -303,3 +304,308 @@ public final class Articles {
}
}
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.b3log.solo.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.b3log.solo.model.Article;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.*;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.user.UserService;
import org.b3log.latke.user.UserServiceFactory;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.latke.util.Strings;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Preference;
import org.b3log.solo.repository.ArticleRepository;
import org.b3log.solo.repository.UserRepository;
import org.b3log.solo.repository.impl.ArticleRepositoryImpl;
import org.b3log.solo.repository.impl.UserRepositoryImpl;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Article utilities.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.2.8, May 6, 2012
* @since 0.3.1
*/
public final class Articles {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(Articles.class.getName());
/**
* Article repository.
*/
private ArticleRepository articleRepository = ArticleRepositoryImpl.getInstance();
/**
* User repository.
*/
private UserRepository userRepository = UserRepositoryImpl.getInstance();
/**
* User service.
*/
private UserService userService = UserServiceFactory.getUserService();
/**
* Builds article view password form parameters with the specified article.
*
* @param article the specified article
* @return parameters string, for example,
* <pre>
* "?articleId=xxx&articleTitle=xxx&articlePermalink=xxx&articleAbstract=xxx"
* </pre>
* @throws UnsupportedEncodingException if can not encode the arguments
*/
public String buildArticleViewPwdFormParameters(final JSONObject article) throws UnsupportedEncodingException {
final StringBuilder parametersBuilder =
new StringBuilder("?articleId=").append(article.optString(Keys.OBJECT_ID)).
append("&articleTitle=").append(URLEncoder.encode(article.optString(Article.ARTICLE_TITLE), "UTF-8")).
append("&articlePermalink=").append(URLEncoder.encode(article.optString(Article.ARTICLE_PERMALINK), "UTF-8")).
append("&articleAbstract=").append(URLEncoder.encode(article.optString(Article.ARTICLE_ABSTRACT, " "), "UTF-8"));
return parametersBuilder.toString();
}
/**
* Checks whether need password to view the specified article with the specified request.
*
* <p>
* Checks session, if not represents, checks article property {@link Article#ARTICLE_VIEW_PWD view password}.
* </p>
*
* <p>
* The blogger itself dose not need view password never.
* </p>
*
* @param request the specified request
* @param article the specified article
* @return {@code true} if need, returns {@code false} otherwise
*/
public boolean needViewPwd(final HttpServletRequest request, final JSONObject article) {
final String articleViewPwd = article.optString(Article.ARTICLE_VIEW_PWD);
if (Strings.isEmptyOrNull(articleViewPwd)) {
return false;
}
final HttpSession session = request.getSession(false);
if (null != session) {
@SuppressWarnings("unchecked")
Map<String, String> viewPwds = (Map<String, String>) session.getAttribute(Common.ARTICLES_VIEW_PWD);
if (null == viewPwds) {
viewPwds = new HashMap<String, String>();
}
if (articleViewPwd.equals(viewPwds.get(article.optString(Keys.OBJECT_ID)))) {
return false;
}
}
if (null != userService.getCurrentUser(request)) {
return false;
}
return true;
}
/**
* Gets the specified article's author.
*
* <p>
* The specified article has a property
* {@value Article#ARTICLE_AUTHOR_EMAIL}, this method will use this property
* to get a user from users.
* </p>
*
* <p>
* If can't find the specified article's author (i.e. the author has been
* removed by administrator), returns administrator.
* </p>
*
* @param article the specified article
* @return user, {@code null} if not found
* @throws ServiceException service exception
*/
public JSONObject getAuthor(final JSONObject article) throws ServiceException {
try {
final String email = article.getString(Article.ARTICLE_AUTHOR_EMAIL);
JSONObject ret = userRepository.getByEmail(email);
if (null == ret) {
LOGGER.log(Level.WARNING,
"Gets author of article failed, assumes the administrator is the author of this article[id={0}]",
article.getString(Keys.OBJECT_ID));
// This author may be deleted by admin, use admin as the author
// of this article
ret = userRepository.getAdmin();
}
return ret;
} catch (final RepositoryException e) {
LOGGER.log(Level.SEVERE, "Gets author of article[id={0}] failed", article.optString(Keys.OBJECT_ID));
throw new ServiceException(e);
} catch (final JSONException e) {
LOGGER.log(Level.SEVERE, "Gets author of article[id={0}] failed", article.optString(Keys.OBJECT_ID));
throw new ServiceException(e);
}
}
/**
* Article comment count +1 for an article specified by the given article id.
*
* @param articleId the given article id
* @throws JSONException json exception
* @throws RepositoryException repository exception
*/
public void incArticleCommentCount(final String articleId) throws JSONException, RepositoryException {
final JSONObject article = articleRepository.get(articleId);
final JSONObject newArticle = new JSONObject(article, JSONObject.getNames(article));
final int commentCnt = article.getInt(Article.ARTICLE_COMMENT_COUNT);
newArticle.put(Article.ARTICLE_COMMENT_COUNT, commentCnt + 1);
articleRepository.update(articleId, newArticle);
}
/**
* Gets the sign of an article specified by the sign id.
*
* @param signId the specified article id
* @param preference the specified preference
* @return article sign, returns the default sign (which oId is "1") if not found
* @throws RepositoryException repository exception
* @throws JSONException json exception
*/
public JSONObject getSign(final String signId, final JSONObject preference) throws JSONException, RepositoryException {
final JSONArray signs = new JSONArray(preference.getString(Preference.SIGNS));
JSONObject defaultSign = null;
for (int i = 0; i < signs.length(); i++) {
final JSONObject ret = signs.getJSONObject(i);
if (signId.equals(ret.optString(Keys.OBJECT_ID))) {
return ret;
}
if ("1".equals(ret.optString(Keys.OBJECT_ID))) {
defaultSign = ret;
}
}
LOGGER.log(Level.WARNING, "Can not find the sign[id={0}], returns a default sign[id=1]", signId);
if (null == defaultSign) {
throw new IllegalStateException("Can not find the default sign which id equals to 1");
}
return defaultSign;
}
/**
* Determines the specified article has updated.
*
* @param article the specified article
* @return {@code true} if it has updated, {@code false} otherwise
* @throws JSONException json exception
*/
public boolean hasUpdated(final JSONObject article) throws JSONException {
final Date updateDate = (Date) article.get(Article.ARTICLE_UPDATE_DATE);
final Date createDate = (Date) article.get(Article.ARTICLE_CREATE_DATE);
return !createDate.equals(updateDate);
}
/**
* Determines the specified article had been published.
*
* @param article the specified article
* @return {@code true} if it had been published, {@code false} otherwise
* @throws JSONException json exception
*/
public boolean hadBeenPublished(final JSONObject article) throws JSONException {
return article.getBoolean(Article.ARTICLE_HAD_BEEN_PUBLISHED);
}
/**
* Gets all unpublished articles.
*
* @return articles all unpublished articles
* @throws RepositoryException repository exception
* @throws JSONException json exception
*/
public List<JSONObject> getUnpublishedArticles() throws RepositoryException, JSONException {
final Map<String, SortDirection> sorts = new HashMap<String, SortDirection>();
sorts.put(Article.ARTICLE_CREATE_DATE, SortDirection.DESCENDING);
sorts.put(Article.ARTICLE_PUT_TOP, SortDirection.DESCENDING);
final Query query = new Query().setFilter(
new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true));
final JSONObject result = articleRepository.get(query);
final JSONArray articles = result.getJSONArray(Keys.RESULTS);
return CollectionUtils.jsonArrayToList(articles);
}
/**
* Gets the {@link Articles} singleton.
*
* @return the singleton
*/
public static Articles getInstance() {
return SingletonHolder.SINGLETON;
}
/**
* Private default constructor.
*/
private Articles() {
}
/**
* Singleton holder.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.0, Jan 12, 2011
*/
private static final class SingletonHolder {
/**
* Singleton.
*/
private static final Articles SINGLETON = new Articles();
/**
* Private default constructor.
*/
private SingletonHolder() {
}
}
}
>>>>>>> origin/0.4.6
......@@ -44,7 +44,7 @@ import org.json.JSONObject;
* Skin utilities.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.2.5, Jan 7, 2012
* @version 1.0.2.6, Jun 12, 2012
* @since 0.3.1
*/
public final class Skins {
......@@ -56,9 +56,8 @@ public final class Skins {
/**
* Properties map.
*/
private static final Map<String, Map<String, String>> LANG_MAP =
new HashMap<String, Map<String, String>>();
private static final Map<String, Map<String, String>> LANG_MAP = new HashMap<String, Map<String, String>>();
/**
* Private default constructor.
*/
......@@ -74,9 +73,7 @@ public final class Skins {
* @param dataModel the specified data model
* @throws ServiceException service exception
*/
public static void fillSkinLangs(final String localeString,
final String currentSkinDirName,
final Map<String, Object> dataModel)
public static void fillSkinLangs(final String localeString, final String currentSkinDirName, final Map<String, Object> dataModel)
throws ServiceException {
Stopwatchs.start("Fill Skin Langs");
......@@ -86,8 +83,7 @@ public final class Skins {
if (null == langs) {
LANG_MAP.clear(); // Collect unused skin languages
LOGGER.log(Level.INFO,
"Loading skin[dirName={0}, locale={1}]",
LOGGER.log(Level.INFO, "Loading skin[dirName={0}, locale={1}]",
new Object[]{currentSkinDirName, localeString});
langs = new HashMap<String, String>();
......@@ -97,25 +93,18 @@ public final class Skins {
final String country = Locales.getCountry(localeString);
final Properties props = new Properties();
props.load(new FileReader(webRootPath + "skins"
+ File.separator
+ currentSkinDirName
+ File.separator
+ Keys.LANGUAGE + File.separator
+ Keys.LANGUAGE + '_' + language
+ '_'
+ country + ".properties"));
props.load(new FileReader(webRootPath + "skins" + File.separator
+ currentSkinDirName + File.separator
+ Keys.LANGUAGE + File.separator + Keys.LANGUAGE + '_' + language
+ '_' + country + ".properties"));
final Set<Object> keys = props.keySet();
for (final Object key : keys) {
langs.put((String) key, props.getProperty((String) key));
}
LANG_MAP.put(langName, langs);
LOGGER.log(Level.INFO,
"Loaded skin[dirName={0}, locale={1}, keyCount={2}]",
new Object[]{currentSkinDirName,
localeString,
langs.size()});
LOGGER.log(Level.INFO, "Loaded skin[dirName={0}, locale={1}, keyCount={2}]",
new Object[]{currentSkinDirName, localeString, langs.size()});
}
dataModel.putAll(langs);
......@@ -151,9 +140,7 @@ public final class Skins {
final JSONObject skin = new JSONObject();
final String name = getSkinName(dirName);
if (null == name) {
LOGGER.log(Level.WARNING, "The directory[{0}] does not"
+ "contain any skin, ignored it",
dirName);
LOGGER.log(Level.WARNING, "The directory[{0}] does not contain any skin, ignored it", dirName);
continue;
}
......@@ -168,21 +155,17 @@ public final class Skins {
LOGGER.log(Level.INFO, "Current skin[name={0}]", skinName);
if (!skinDirNames.contains(currentSkinDirName)) {
LOGGER.log(Level.WARNING,
"Configred skin[dirName={0}] can not find, try to use "
+ "default skin[dirName=classic] instead.",
currentSkinDirName);
if (!skinDirNames.contains("classic")) {
LOGGER.log(Level.SEVERE, "Can not find skin[dirName=classic]");
throw new IllegalStateException(
"Can not find default skin[dirName=classic], please "
+ "redeploy your B3log Solo and make sure contains this "
+ "default skin!");
LOGGER.log(Level.WARNING, "Configred skin[dirName={0}] can not find, try to use "
+ "default skin[dirName=ease] instead.", currentSkinDirName);
if (!skinDirNames.contains("ease")) {
LOGGER.log(Level.SEVERE, "Can not find skin[dirName=ease]");
throw new IllegalStateException("Can not find default skin[dirName=ease], please redeploy your B3log Solo and make sure "
+ "contains this default skin!");
}
preference.put(SKIN_DIR_NAME, "classic");
preference.put(SKIN_NAME, "经典淡蓝");
preference.put(SKIN_DIR_NAME, "ease");
preference.put(SKIN_NAME, "ease");
PreferenceMgmtService.getInstance().updatePreference(preference);
PageCaches.removeAll(); // Clears cache manually.
......@@ -243,8 +226,9 @@ public final class Skins {
* using the subdirectory of it as the skin directory name, for example,
* <pre>
* ${Web root}/skins/
* <b>default</b>/
* <b>mobile</b>/
* <b>classic</b>/
* <b>simple-art</b>/
* </pre>
* Skips files that name starts with . and {@linkplain File#isHidden()
* hidden} files.
......@@ -265,7 +249,7 @@ public final class Skins {
final Set<String> ret = new HashSet<String>();
if (null == skinDirs) {
LOGGER.severe("Skin directory is null");
return ret;
}
......
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -100,3 +101,107 @@ public final class UserRepositoryImplTestCase extends AbstractTestCase {
Assert.assertEquals(found.getString(User.USER_PASSWORD), "pass1");
}
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.PropertyFilter;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.Transaction;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.model.UserExt;
import org.b3log.solo.repository.UserRepository;
import org.json.JSONArray;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* {@link UserRepositoryImpl} test case.
*
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.0.1, Feb 21, 2012
*/
@Test(suiteName = "repository")
public final class UserRepositoryImplTestCase extends AbstractTestCase {
/**
* Tests.
*
* @throws Exception exception
*/
@Test
public void test() throws Exception {
final UserRepository userRepository = getUserRepository();
final JSONObject another = new JSONObject();
another.put(User.USER_NAME, "test1");
another.put(User.USER_EMAIL, "test1@gmail.com");
another.put(User.USER_PASSWORD, "pass1");
another.put(User.USER_ROLE, Role.DEFAULT_ROLE);
another.put(UserExt.USER_ARTICLE_COUNT, 0);
another.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0);
Transaction transaction = userRepository.beginTransaction();
userRepository.add(another);
transaction.commit();
Assert.assertNull(userRepository.getAdmin());
JSONObject admin = new JSONObject();
admin.put(User.USER_NAME, "test");
admin.put(User.USER_EMAIL, "test@gmail.com");
admin.put(User.USER_PASSWORD, "pass");
admin.put(User.USER_ROLE, Role.ADMIN_ROLE);
admin.put(UserExt.USER_ARTICLE_COUNT, 0);
admin.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0);
transaction = userRepository.beginTransaction();
userRepository.add(admin);
transaction.commit();
Assert.assertTrue(userRepository.isAdminEmail("test@gmail.com"));
Assert.assertFalse(userRepository.isAdminEmail("notFound@gmail.com"));
admin = userRepository.getAdmin();
Assert.assertNotNull(admin);
Assert.assertEquals("test", admin.optString(User.USER_NAME));
final JSONObject result =
userRepository.get(new Query().setFilter(
new PropertyFilter(User.USER_NAME, FilterOperator.EQUAL, "test1")));
final JSONArray users = result.getJSONArray(Keys.RESULTS);
Assert.assertEquals(users.length(), 1);
Assert.assertEquals(users.getJSONObject(0).getString(User.USER_EMAIL),
"test1@gmail.com");
final JSONObject notFound =
userRepository.getByEmail("not.found@gmail.com");
Assert.assertNull(notFound);
final JSONObject found = userRepository.getByEmail("test1@gmail.com");
Assert.assertNotNull(found);
Assert.assertEquals(found.getString(User.USER_PASSWORD), "pass1");
}
}
>>>>>>> origin/0.4.6
#
# Copyright (C) 2009, 2010, 2010, B3log Team
# Copyright (C) 2009, 2010, 2011, B3log Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
......@@ -15,13 +15,12 @@
#
#
# Description: Classic blue skin.
# Version: 1.0.0.6, May 7, 2012
# Description: ease skin (mock for test).
# Version: 1.0.0.0, Jun 27, 2012
# Author: Liang Ding
# Author: Liyuan Li
#
name=\u7ecf\u5178\u6de1\u84dd
version=2.0.3
forSolo=0.4.5
memo=\u8fd9\u4e2a\u76ae\u80a4\u5f88\u4e11\u4e48\uff1f\u6211\u52d2\u4e2a\u53bb\u3002
name=ease
version=1.0.1
forSolo=0.4.6
memo=\u56de\u5f52\u606c\u9759
<?xml version="1.0" encoding="UTF-8"?>
<!--
Description: B3log Solo parent POM.
Version: 2.0.1.9, May 29, 2012
Version: 2.0.2.1, Jun 27, 2012
Author: Liang Ding
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
......@@ -11,7 +11,7 @@
<groupId>org.b3log</groupId>
<artifactId>solo</artifactId>
<packaging>pom</packaging>
<version>0.4.5</version>
<version>0.4.6</version>
<name>B3log Solo</name>
<url>https://github.com/b3log/b3log-solo</url>
<description>
......@@ -28,13 +28,13 @@
<!-- Properties -->
<properties>
<servlet.version>2.5</servlet.version>
<org.b3log.solo.version>0.4.5</org.b3log.solo.version>
<org.b3log.solo.version>0.4.6</org.b3log.solo.version>
<org.b3log.latke.version>0.5.0-SNAPSHOT</org.b3log.latke.version>
<org.b3log.latke-gae.version>0.5.0-SNAPSHOT</org.b3log.latke-gae.version>
<org.b3log.latke-repository-mysql.version>0.5.0-SNAPSHOT</org.b3log.latke-repository-mysql.version>
<gae.version>1.6.5</gae.version>
<gae.version>1.7.0</gae.version>
<freemarker-gae.version>2.3.18</freemarker-gae.version>
<freemarker-gae.version>2.3.19</freemarker-gae.version>
<jsoup.version>1.5.2</jsoup.version>
<markdownpapers-core.version>1.2.7</markdownpapers-core.version>
<!-- <com.google.api.client.version>1.2.1-alpha</com.google.api.client.version>-->
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
Description: B3log Solo GAE POM.
Version: 2.0.0.6, May 11, 2012
Version: 2.0.0.7, Jun 19, 2012
Author: Liang Ding
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
......@@ -19,7 +19,7 @@
<parent>
<groupId>org.b3log</groupId>
<artifactId>solo-war</artifactId>
<version>0.4.5</version>
<version>0.4.6</version>
</parent>
<properties>
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
Description: B3log Solo (MySQL) standard Servlet container POM.
Version: 1.0.0.2, May 11, 2012
Version: 1.0.0.3, Jun 19, 2012
Author: Liang Ding
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
......@@ -19,7 +19,7 @@
<parent>
<groupId>org.b3log</groupId>
<artifactId>solo-war</artifactId>
<version>0.4.5</version>
<version>0.4.6</version>
</parent>
<properties>
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
Description: B3log Solo WAR POM.
Version: 2.0.1.0, May 29, 2012
Version: 2.0.1.1, Jun 19, 2012
Author: Liang Ding
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
......@@ -19,7 +19,7 @@
<parent>
<groupId>org.b3log</groupId>
<artifactId>solo</artifactId>
<version>0.4.5</version>
<version>0.4.6</version>
</parent>
<modules>
......
......@@ -16,7 +16,7 @@
#
# Description: B3log Solo language configurations(en_US).
# Version: 2.0.9.2, May 22, 2012
# Version: 2.0.9.3, Jun 20, 2012
# Author: Liang Ding
# Author: Liyuan Li
#
......@@ -184,15 +184,25 @@ categoryLabel=Category
noticeBoard1Label=Notice Board:
noticeBoardLabel=Notice Board
htmlhead1Label=HTML head:
indexTagDisplayCntLabel=Index Tag Display Count
indexTagDisplayCnt1Label=Index Tag Display Count:
indexRecentArticleDisplayCntLabel=Recent Article Display Count
indexRecentArticleDisplayCnt1Label=Recent Article Display Count:
indexRecentCommentDisplayCntLabel=Recent Comment Display Count
indexRecentCommentDisplayCnt1Label=Recent Comment Display Count:
indexMostCommentArticleDisplayCntLabel=Most Comment Article Display Count
indexMostCommentArticleDisplayCnt1Label=Most Comment Article Display Count:
indexMostViewArticleDisplayCntLabel=Most View Article Display Count
indexMostViewArticleDisplayCnt1Label=Most View Article Display Count:
relevantArticlesDisplayCntLabel=Relevant Article Display Count
relevantArticlesDisplayCnt1Label=Relevant Article Display Count:
randomArticlesDisplayCntLabel=Random Article Display Count
randomArticlesDisplayCnt1Label=Random Article Display Count:
externalRelevantArticlesDisplayCntLabel=External Relevant Article Display Count
externalRelevantArticlesDisplayCnt1Label=External Relevant Article Display Count:
windowSizeLabel=Pagination Window Size
windowSize1Label=Pagination Window Size:
pageSizeLabel=Pagination Page Size
pageSize1Label=Pagination Page Size:
blogTitle1Label=Blog Title:
blogSubtitle1Label=Blog Subtitle:
......@@ -298,6 +308,7 @@ nameTooLongLabel=Sorry, your username must be between 2 and 20 characters long.
mailCannotEmptyLabel=Mail is empty
mailInvalidLabel=Mail is invalid
urlInvalidLabel=URL is invalid
nonNegativeIntegerOnlyLabel=Non-Negative integer only
commentContentCannotEmptyLabel=Sorry, your content must be between 2 and 500 characters long.
captchaCannotEmptyLabel=Captcha is empty
loadingLabel=Loading....
......
......@@ -16,7 +16,7 @@
#
# Description: B3log Solo default language configurations(zh_CN).
# Version: 2.0.9.8, May 22, 2012
# Version: 2.0.9.9, Jun 20, 2012
# Author: Liang Ding
# Author: Liyuan Li
#
......@@ -184,15 +184,25 @@ categoryLabel=\u5206\u7c7b
noticeBoard1Label=\u516c\u544a\uff1a
noticeBoardLabel=\u516c\u544a
htmlhead1Label=HTML head\uff1a
indexTagDisplayCnt1Label= \u9996\u9875\u6807\u7b7e\u663e\u793a\u6570\uff1a
indexTagDisplayCntLabel=\u9996\u9875\u6807\u7b7e\u663e\u793a\u6570
indexTagDisplayCnt1Label=\u9996\u9875\u6807\u7b7e\u663e\u793a\u6570\uff1a
indexRecentArticleDisplayCntLabel=\u6700\u65b0\u6587\u7ae0\u663e\u793a\u6570\u76ee
indexRecentArticleDisplayCnt1Label=\u6700\u65b0\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
indexRecentCommentDisplayCntLabel=\u6700\u65b0\u8bc4\u8bba\u663e\u793a\u6570\u76ee
indexRecentCommentDisplayCnt1Label=\u6700\u65b0\u8bc4\u8bba\u663e\u793a\u6570\u76ee\uff1a
indexMostCommentArticleDisplayCntLabel=\u8bc4\u8bba\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee
indexMostCommentArticleDisplayCnt1Label=\u8bc4\u8bba\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
indexMostViewArticleDisplayCnt1Label=\u8bbf\u95ee\u6700\u591a\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
indexMostViewArticleDisplayCntLabel=\u8bbf\u95ee\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee
indexMostViewArticleDisplayCnt1Label=\u8bbf\u95ee\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
relevantArticlesDisplayCntLabel=\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee
relevantArticlesDisplayCnt1Label=\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
randomArticlesDisplayCntLabel=\u968f\u673a\u9605\u8bfb\u663e\u793a\u6570\u76ee
randomArticlesDisplayCnt1Label=\u968f\u673a\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
externalRelevantArticlesDisplayCntLabel=\u7ad9\u5916\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee
externalRelevantArticlesDisplayCnt1Label=\u7ad9\u5916\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
windowSizeLabel=\u5206\u9875\u9875\u7801\u6700\u5927\u5bbd\u5ea6
windowSize1Label=\u5206\u9875\u9875\u7801\u6700\u5927\u5bbd\u5ea6\uff1a
pageSizeLabel=\u5206\u9875\u6bcf\u9875\u663e\u793a\u6587\u7ae0\u6570
pageSize1Label=\u5206\u9875\u6bcf\u9875\u663e\u793a\u6587\u7ae0\u6570\uff1a
blogTitle1Label=\u535a\u5ba2\u6807\u9898\uff1a
blogSubtitle1Label=\u535a\u5ba2\u5b50\u6807\u9898\uff1a
......@@ -298,6 +308,7 @@ nameTooLongLabel=\u59d3\u540d\u53ea\u80fd\u4e3a 2 \u5230 20 \u4e2a\u5b57\u7b26\u
mailCannotEmptyLabel=\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a\uff01
mailInvalidLabel=\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e\uff01
urlInvalidLabel=\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e\uff01
nonNegativeIntegerOnlyLabel=\u53ea\u80fd\u4e3a\u975e\u8d1f\u6574\u6570\uff01
commentContentCannotEmptyLabel=\u8bc4\u8bba\u5185\u5bb9\u53ea\u80fd\u4e3a 2 \u5230 500 \u4e2a\u5b57\u7b26\uff01
captchaCannotEmptyLabel=\u9a8c\u8bc1\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01
loadingLabel=\u8f7d\u5165\u4e2d....
......
......@@ -47,4 +47,4 @@ cache=GAE
userService=LOCAL
#### Static resource version ####
staticResourceVersion=201205021456
\ No newline at end of file
staticResourceVersion=201206280945
\ No newline at end of file
<<<<<<< HEAD
<!DOCTYPE html>
<html>
<head>
......@@ -335,3 +336,352 @@
</ul>
</body>
</html>
=======
<!DOCTYPE html>
<html>
<head>
<title>B3log Solo Change Logs</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h2>Release 0.4.6 - Jul 1, 2012</h2>
<ul>
<li><a href="https://github.com/b3log/b3log-solo/issues/10">10 评论表情后台管理不显示</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/12">12 编辑自定义导航报错</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/15">15 sitemap.xml 导航生成重复</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/17">17 默认皮肤改为 ease</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/23">23 偏好设定关键参数校验</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/27">27 自定义导航后台链接问题</a></li>
<li><a href="https://github.com/b3log/b3log-solo/issues/32">32 升级 FreeMarker 到 2.3.19</a></li>
</ul>
<h2>Release 0.4.5 - Jun 1, 2012</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=302">302 文章加密</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=392">392 支持应用路径部署</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=393">393 支持多编辑器</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=394">394 支持 Markdown</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=395">395 发布包中加入项目说明</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=396">396 新皮肤——ease</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=399">399 i-nove 皮肤问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=400">400 GAE 版 sitemap.xml 问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=401">401 升级 GAE SDK 1.6.5</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=402">402 本地版用户退出问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=404">404 TinyMCE 升级到 3.5</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=405">405 添加 KindEditor </a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=406">406 Fancybox 鼠标滚轮事件</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=407">407 表情修改</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=408">408 在线人数计数问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=409">409 允许用户添加 ftl 模版</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=410">410 模版缓存问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=411">411 错误页面改造</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=412">412 评论默认头像变更</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=413">413 链接上添加 rel</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=416">416 项目迁到 GitHub</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=417">417 移除 sleepycat 版本</a></li>
</ul>
<h2>Release 0.4.1 - Apr 25, 2012</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=303">303 开启/关闭允许评论</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=333">333 优化签名档存储</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=338">338 具体化版本号</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=351">351 导航可以选择为内容页面或链接</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=365">365 Admin Action 改造</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=367">367 移除文件管理功能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=370">370 禁用异步 Sessions 持久化</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=373">373 Feed 可设置成全文输出/摘要输出</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=374">374 升级 GAE SDK 1.6.4.1</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=378">378 本地版(MySQL)发布</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=381">381 数据备份</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=383">383 topbar 展现方式调整</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=387">387 上一篇,下一篇的问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=388">388 jQuery Fancybox 插件</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=389">389 编辑器加入“字体”、“字号”配置</a></li>
</ul>
<h2>Release 0.4.0 - Feb 19, 2012</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=281">281 写文章标签处支持鼠标点击选择</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=282">282 评论回复邮件提醒模版</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=287">287 去除 Jabsorb</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=293">293 Not Found 问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=296">296 标签-文章 Atom 异常</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=297">297 文件管理分页问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=298">298 自定义页面/链接排序问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=299">299 增加友情链接描述</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=301">301 移除同步腾讯微博</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=304">304 删除自定义页面,博客总评论数未减</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=306">306 MetaWeblog API 支持</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=307">307 移动设备前台皮肤</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=308">308 优化配额使用</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=309">309 加入超配额时的默认页面</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=313">313 升级 GAE SDK 1.6.2.1</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=314">314 评论跨站安全问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=315">315 jQuery upgrade</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=316">316 改进代码高亮 JS 加载</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=317">317 JS、CSS 版本号</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=319">319 Atom/RSS 请求方法加入 HEAD 方法</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=320">320 RSS 输出问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=322">322 从本地加载 jQuery</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=323">323 移除文件上传功能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=325">325 使用本地缓存替换 Memcache</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=330">330 0.4.0 beta1 统计丢失问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=332">332 HTML 编辑器支持 style 标签</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=334">334 文章操作防重复提交</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=339">339 /upgrade/checker.do 返回渲染</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=340">340 更改文章/页面链接后,评论的链接不更新</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=341">341 WLW 配置出错</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=342">342 在线访客计数</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=343">343 皮肤乱码问题【Tree house】</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=344">344 移除皮肤 Zoltan</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=347">347 优化初始化</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=348">348 修改数据索引</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=349">349 后台文章列表分页问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=350">350 增加对自定义链接的空格替换</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=353">353 编辑器支持样式</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=354">354 支持 SyntaxHighlighter 和 google-code-prettify</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=355">355 不统计爬虫带来的访问量</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=356">356 取消摘要必填</a></li>
</ul>
<h2>Release 0.3.5 - Oct 22, 2011</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=231">231 社区同步过来的评论没有转义</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=270">270 文章列表显示方式</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=272">272 标签墙改造</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=273">273 登录状态检查</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=275">275 登录 Cookie 失效过快</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=277">277 目录不能被访问</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=278">278 存档页面报错</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=279">279 优化实例启动速度</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=284">284 升级 GAE SDK 1.5.5</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=285">285 签名档默认第一个</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=286">286 站内相关文章优化</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=288">288 调整数据索引</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=289">289 修复移除无用标签报错</a></li>
</ul>
<h2>Release 0.3.1 - Oct 1, 2011</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=226">226 皮肤语言配置</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=237">237 改进 admin-cache 插件</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=243">243 验证码不能刷新</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=246">246 后台 js 合并压缩</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=250">250 友情链接改进</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=251">251 已压缩的 CSS、JS 文件编码问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=253">253 点击任何一个菜单都会弹出一错误提示窗口</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=254">254 CSS编码错误</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=255">255 改进评论数据结构</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=257">257 部署后自动升级</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=258">258 新皮肤——NeoEase</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=259">259 支持 RSS 2.0</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=260">260 升级到 GAE 1.5.4</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=261">261 重构 Web 请求分发,使用 Latke 新的分发器</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=262">262 编辑器插入 html 代码不可进行高亮</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=264">264 文章中的代码总是出现竖向滚动条</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=266">266 编辑器自动替换 &lt;a&gt; 问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=267">267 sitemap 输出</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=268">268 用户验证改造</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=269">269 About 页面</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=271">271 标签分隔符提示</a></li>
</ul>
<h2>Release 0.3.0 - Aug 20, 2011</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=9">9 更换标签墙</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=42">42 对标签提示进一步完善</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=73">73 B3log 新闻获取插件</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=111">111 插件机制</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=120">120 优化链接 URL</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=134">134 缓存页面管理</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=149">149 表情图片合并</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=187">187 “主题”->“皮肤”</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=188">188 Elegant-Box-C友情链接BUG</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=189">189 ErrorAction(/error.do)加入模版数据</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=190">190 改进“博客地址”配置</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=194">194 初始化失败</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=197">197 b3log.org 域名发放</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=198">198 TinyMCE HTML Editor不能插入 iframe</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=199">199 标题使用 HTML 代码问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=201">201 Community 皮肤正文中链接和内容区别不明显</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=203">203 升级到 FreeMarker for GAE 2.3.18</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=204">204 升级到 GAE 1.5.2</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=205">205 皮肤文件结构的重新设计</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=206">206 单独的评论管理功能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=207">207 后台改版</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=208">208 页面缓存启用/禁用</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=209">209 升级版本后找不到皮肤</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=211">211 初始化页面(/init.do)判断 IE6</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=216">216 新皮肤 for 0.3.0</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=219">219 优化前台性能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=220">220 存档时区问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=221">221 0.2.6-0.3.0 升级程序</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=222">222 项目加入 Change log</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=223">223 修复不能在 maven3.0+ 下使用的 bug</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=224">224 改进错误页面</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=225">225 移除博客同步功能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=227">227 升级 TinyMCE 到 3.4.3.2</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=228">228 评论/回复折行</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=229">229 移除情侣皮肤(valentine,向左走向右走)</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=230">230 最新评论转义问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=232">232 通过链接(Permalink)访问草稿</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=234">234 代码渲染</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=236">236 标签-文章计数修复程序</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=240">240 Kill IE功能异常</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=247">247 新一篇问题</a></li>
</ul>
<h2>Release 0.2.5 - Apr 30, 2011</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=153">153 增加“发布到社区”选项</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=154">154 TinyMCE 使用绝对地址</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=155">155 添加一个页面后,就开始404了。连主页都404</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=157">157 Andrea 皮肤图片压缩</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=158">158 评论提交过程中禁用提交按钮</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=160">160 删除已发表文章的非管理员用户后浏览报错</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=163">163 移除不必要的过滤器,优化性能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=165">165 加入 Symphony 到 Solo 的评论同步</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=166">166 从中文切换英文后后台 Preference 报错</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=167">167 文章随机值生成报错</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=168">168 恢复签名档为默认值</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=170">170 屏蔽载入站外相关文章错误弹出</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=171">171 更新文章事务问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=179">179 robots.txt 问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=180">180 新皮肤——Elegant-Box-C</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=181">181 升级到 GAE SDK 1.4.3</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=183">183 先存草稿再发布不能同步微博、社区</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=184">184 删除文章存档数反而增加</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=185">185 “博客同步”管理界面微调</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=186">186 新皮肤——owmx-3.0</a></li>
</ul>
<h2>Release 0.2.5 - Feb 13, 2011</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=33">33 加入文章发布/取消发布/保存功能(草稿夹)</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=43">43 修改评论中的 URL 填写方式</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=60">60 评论时信息的自动填充</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=89">89 新皮肤</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=90">90 新皮肤</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=91">91 页面管理中的顺序</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=92">92 皮肤 favourite 对 IE 7,8 的支持 </a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=93">93 文章访问次数统计失效</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=94">94 加入多人写作</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=95">95 Atom 不使用第三方库</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=96">96 移除“偏好设定”中管理员邮件的配置</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=97">97 删除通过 Google Profiles 获取用户信息</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=98">98 改进 403 错误页面</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=99">99 上传空文件</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=100">100 链接、页面排序</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=101">101 改进初始化</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=103">103 整理界面中已定义的元素 ID</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=105">105 加入对“有更新”提示的配置</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=107">107 新皮肤</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=108">108 IE 8 下 Feed 不能显示</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=110">110 Feed Entry 中加入文章分类、作者</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=112">112 评论提交改为 jQuery AJAX</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=113">113 判断是否登录使用 jQuery AJAX</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=114">114 更友好的评论评论邮件提醒</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=116">116 初始化时发布一篇默认文章</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=118">118 优化缓存</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=119">119 评论输入框</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=121">121 占无评论</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=122">122 签名档</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=126">126 调整“经典淡蓝”皮肤</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=128">128 对后台的皮肤选择添加验证,避免出现异常和空白页</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=129">129 取消默认链接</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=131">131 存档边界时间的判断</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=132">132 加入时区配置</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=133">133 访问统计问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=135">135 改进获取随机文章性能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=137">137 发布/更新文章时 Ping Google Blog Search Engine</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=138">138 移除 Guice、Guice Servlet</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=139">139 后台报错</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=141">141 将文章浏览计数修改为异步方式</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=142">142 博客地址配置更新检查</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=144">144 删除所有数据</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=145">145 文章发布同步到腾讯微博</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=146">146 TinyMCE 使用相对地址</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=147">147 换肤问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=148">148 移除 AddThis</a></li>
</ul>
<h2>Release 0.2.1 - Dec 1, 2010</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=46">46 偏好设定与统计丢失</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=47">47 升级 0.2.0 后皮肤首次显示错乱</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=48">48 完善初始化界面</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=49">49 按标签查看文章时排序有错</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=50">50 前台统计显示使用模板</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=51">51 前台最新评论使用模板</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=52">52 向 Rhythm 发送发文数据时加入版本</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=53">53 评论加入表情</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=54">54 TinyMCE 加入中文</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=56">56 加入文章自定义链接</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=57">57 加入页面自定义链接</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=58">58 评论偶尔出现重复提交</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=61">61 修改“上一篇”、“下一篇”链接为结构化链接</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=62">62 后台查看评论应该附带邮件</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=63">63 标签链接</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=64">64 查看存档文章列表时排序有错 </a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=65">65 优化更新数据性能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=66">66 整理无用的 jar,减小 Solo 体积</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=67">67 切换皮肤后按标签访问文章页面错乱</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=68">68 移除所有页面缓存时异常</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=72">72 文章同步更新失败</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=74">74 后台查看页面评论应该附带邮件</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=75">75 初始化功能需要加入“确定”对话框</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=76">76 上传文件不应刷新整个页面</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=77">77 IE 7 下:前台头部登录与 logo 对不齐</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=78">78 FF 下 多媒体无法显示</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=79">79 新皮肤</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=80">80 侧边栏文字内容太长则数字统计看不到</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=81">81 侧边栏“访问最多的文章”在“偏好设定”中不能进行自定义</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=82">82 修改“标签墙”链接为 /tags.html</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=83">83 meta 修改</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=84">84 修改自定义页面默认链接为 /pages/${oId}.html</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=86">86 提交评论/回复后只刷新局部</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=87">87 IE 7 下后台展现 bug</a></li>
</ul>
<h2>Release 0.2.0 - Nov 12, 2010</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=4">4 标签管理</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=5">5 缓存状态查看</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=6">6 自定义页面关键字、描述</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=7">7 皮肤 iNove</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=10">10 文章内容样式问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=11">11 TinyMCE 代码高亮</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=12">12 前台添加“回到顶部”</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=13">13 500 Server Error</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=14">14 站外相关阅读</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=15">15 取消从 0.1.0 到 0.1.1 自动升级后台任务</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=16">16 有时博客配置会被重新初始化</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=17">17 自定义页面评论</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=18">18 分页加载顺序</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=19">19 文章页面缓存重复问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=20">20 不能清除本页缓存</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=21">21 文章页面看不到“回到顶部箭头”</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=22">22 文章列表标签列字体太大</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=23">23 页面管理添加链接</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=24">24 同步 Buzz 失败时文章发布失败</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=25">25 自定义页面内容样式有问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=26">26 刷新文章页面,浏览数加2</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=28">28 链接管理 URL 列应该可以点击</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=29">29 弹出查看评论 div 后下面的界面应该不可操作</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=30">30 每次弹出评论 div 时数据应该重新获取</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=31">31 文件管理</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=32">32 评论预览只能显示一次?</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=34">34 NPE</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=35">35 IE 8 下 侧边栏长度过长会向下溢出</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=36">36 博客同步操作异常反馈应该更具体</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=37">37 加强博客地址配置的容错性</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=38">38 考虑关闭 Google Buzz 同步功能</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=39">39 后台查看评论显示问题</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=40">40 回复预览</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=41">41 “经典淡蓝”皮肤公告栏内容自动换行</a></li>
</ul>
<h2>Release 0.1.1 - Oct 26, 2010</h2>
<ul>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=1">1 前台文章列表中的文章统计数据与文章细节页面统计数据不一致</a></li>
<li><a href="http://code.google.com/p/b3log-solo/issues/detail?id=2">2 Tree-House 皮肤评论预览有问题</a></li>
</ul>
</body>
</html>
>>>>>>> origin/0.4.6
......@@ -4,16 +4,16 @@ Project home: https://github.com/b3log/b3log-solo
Request features/Report bugs: https://github.com/b3log/b3log-solo/issues/new
* QQ Qun: 13139268
* User Guide: http://code.google.com/p/b3log-solo/wiki/UserGuide
* Dev Guide: http://code.google.com/p/b3log-solo/wiki/pre_dev
* Skin Dev Guide: http://code.google.com/p/b3log-solo/wiki/develop_steps
* User Guide: https://github.com/b3log/b3log-solo/wiki/Pre_installation
* Dev Guide: https://github.com/b3log/b3log-solo/wiki/Pre_dev
* Skin Dev Guide: https://github.com/b3log/b3log-solo/wiki/Develop_steps
* Plugin Dev Guide: https://docs.google.com/document/pub?id=15H7Q3EBo-44v61Xp_epiYY7vK_gPJLkQaT7T1gkE64w&pli=1
====
B3log Index: http://b3log.org
B3log Team: http://code.google.com/p/b3log-solo/wiki/about_us
Join B3log Team: http://code.google.com/p/b3log-solo/wiki/join_us
B3log Team: https://github.com/b3log/b3log-solo/wiki/About_us
Join B3log Team: https://github.com/b3log/b3log-solo/wiki/Join_us
====
平等,自由,奔放
......
......@@ -20,12 +20,12 @@
Description: Web deployment descriptor on GAE. See
http://code.google.com/intl/en/appengine/docs/java/config/appconfig.html
for more details.
Version: 1.0.3.5, May 18, 2012
Version: 1.0.3.7, Jun 19, 2012
Author: Liang Ding
-->
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>solo-demo</application>
<version>045</version>
<version>046</version>
<sessions-enabled>true</sessions-enabled>
......@@ -41,7 +41,6 @@
<include path="/favicon.ico" />
<include path="/favicon.png" />
<include path="/robots.txt" />
<include path="/error/*.html" />
<include path="/js/**.js" />
<include path="/js/**/*.js" />
......
......@@ -21,8 +21,8 @@
</#if>
</head>
<body onhashchange="admin.setCurByHash();">
<div id="loadMsg">${loadingLabel}</div>
<div id="tipMsg"></div>
<div class="tip"><span id="loadMsg">${loadingLabel}</span></div>
<div class="tip tip-msg"><span id="tipMsg"></span></div>
<div id="allPanel">
<div id="top">
<a href="http://b3log.org" target="_blank" class="hover">
......
......@@ -4,6 +4,7 @@
"servePath": "${servePath}"
};
var Label = {
"skinDirName": "ease",
"editorType": "${editorType}",
"userRole": "${userRole}",
"PAGE_SIZE": "${articleListDisplayCount}",
......@@ -81,7 +82,34 @@
"linkEmptyLabel": "${linkEmptyLabel}",
"openMethodLabel": "${openMethodLabel}",
"typeLabel": "${typeLabel}",
"markdownHelpLabel": "${markdownHelpLabel}"
"markdownHelpLabel": "${markdownHelpLabel}",
"notFoundLabel": "${notFoundLabel}",
"em00Label": "${em00Label}",
"em01Label": "${em01Label}",
"em02Label": "${em02Label}",
"em03Label": "${em03Label}",
"em04Label": "${em04Label}",
"em05Label": "${em05Label}",
"em06Label": "${em06Label}",
"em07Label": "${em07Label}",
"em08Label": "${em08Label}",
"em09Label": "${em09Label}",
"em10Label": "${em10Label}",
"em11Label": "${em11Label}",
"em12Label": "${em12Label}",
"em13Label": "${em13Label}",
"em14Label": "${em14Label}",
"paramSettingsLabel": "${paramSettingsLabel}",
"nonNegativeIntegerOnlyLabel": "${nonNegativeIntegerOnlyLabel}",
"indexTagDisplayCntLabel": "${indexTagDisplayCntLabel}",
"indexRecentCommentDisplayCntLabel": "${indexRecentCommentDisplayCntLabel}",
"indexMostCommentArticleDisplayCntLabel": "${indexMostCommentArticleDisplayCntLabel}",
"indexMostViewArticleDisplayCntLabel": "${indexMostViewArticleDisplayCntLabel}",
"pageSizeLabel": "${pageSizeLabel}",
"windowSizeLabel": "${windowSizeLabel}",
"randomArticlesDisplayCntLabel": "${randomArticlesDisplayCntLabel}",
"relevantArticlesDisplayCntLabel": "${relevantArticlesDisplayCntLabel}",
"externalRelevantArticlesDisplayCntLabel": "${externalRelevantArticlesDisplayCntLabel}"
};
admin.init();
......
<<<<<<< HEAD
/**
* admin style
*
......@@ -653,3 +654,680 @@ button#submitArticle {
position: absolute;
z-index: 1;
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* admin style
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.3.9, Jun 26, 2012
*/
/* start resset */
body, input, textarea {
font-family: sans-serif,\5fae\8f6f\96c5\9ed1;
}
html, body {
height: 100%;
min-width: 1024px;
background-color: #FAFAFA;
}
a:link {
color: #21759B;
}
a:visited {
color: #551A8B;
}
a:active {
color: #D54121;
}
a:hover {
color: #D54121;
}
button.selected {
background: url("../images/bowknot/completed.png") no-repeat scroll right bottom transparent;
color: #D54121;
}
/* end reset */
/* start ico */
.ico-arrow-down, .ico-arrow-up {
background: url("../images/arrows.png") repeat scroll 0 4px transparent;
float: right;
height: 20px;
margin: 2px 3px 0 0;
width: 18px;
}
.ico-arrow-up {
background-position: 0 -30px;
}
.aboutIcon {
background-position: -16px -48px;
}
/* end ico */
/* start frame */
#allPanel {
height: auto;
min-height: 100%;
position: relative;
}
#tabsPanel {
margin: 30px 0 0 162px;
padding: 0 12px;
}
#tabsPanel>div {
padding-bottom: 36px;
}
.tip {
font-weight: bold;
margin: 0 auto;
overflow: hidden;
padding: 2px 0;
position: fixed;
text-align: center;
top: 5px;
width: 100%;
z-index: 2;
}
.tip-msg {
top: 33px;
}
#tipMsg, #loadMsg {
background-color: #E5E7EB;
border-radius: 3px;
padding: 2px 0;
}
.footer {
bottom: 12px;
position: absolute;
text-align: center;
width: 100%;
}
/* end frame */
/* start top-nav */
#top {
background-image: linear-gradient(top,#666666,#7F7F7F);
background-image: -moz-linear-gradient(top,#666666,#7F7F7F);
background-image: -ms-linear-gradient(top,#666666,#7F7F7F);
background-image: -o-linear-gradient(top,#666666,#7F7F7F);
background-image: -webkit-gradient(linear,left top,left bottom,from(#666666),to(#7F7F7F));
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#666666', endColorstr='#7F7F7F');
}
#top a, #top span span {
float: left;
line-height: 18px;
margin: 6px 0;
padding: 0 6px;
text-decoration: none;
text-shadow: 0 -1px 0 #FFFFFF;
font-weight: normal;
border-right: 1px solid #686868;
color: #CCCCCC;
text-shadow: 0 -1px 0 #555555;
}
#top>a {
color: #FFFFFF;
}
#top a:hover, #top a.hover {
border-radius: 0 13px 13px 0;
margin: 0px;
line-height: 30px;
background-color: #4C4C4C;
border-left-color: #707070;
}
/* end top-nav */
/* start first tab */
#tabs {
background-color: #ECECEC;
border-radius: 0 5px 5px 0;
border-right: 1px solid #CCC;
border-top: 1px solid #DDD;
bottom: 0;
box-shadow: 6px 0 6px #ECECEC;
min-height: 468px;
padding: 15px 0;
position: absolute;
top: 58px;
width: 145px;
}
#tabs ul {
list-style: none;
}
#tabs li {
margin-left: 0px;
}
#tabs a, #tabs>ul>li>div {
color: #21759B;
display: block;
text-decoration: none;
cursor: pointer;
letter-spacing: 1px;
}
#tabs a:hover, #tabs>ul>li>div:hover {
color: #D54121;
}
#tabs>ul>li>div {
border-bottom: 1px solid #DFDFDF;
border-top: 1px solid #F9F9F9;
font-weight: bold;
padding-left: 12px;
line-height: 30px;
height: 30px;
}
#tabs>ul>li>div>a.tab-current{
background-color: #777777;
border-bottom: 1px solid #6D6D6D;
border-top: 1px solid #808080;
color: #FFFFFF;
margin-left: -12px;
padding-left: 12px;
text-shadow: 0 -1px 0 #333333;
}
#tabs li li a {
background-color: #FFFFFF;
padding-left: 36px;
line-height: 28px;
height: 28px;
}
#tabs .tab-current {
background-color: #EAF2FA;
color: #333333;
font-weight: bold;
}
#tabs li li a:hover {
background-color: #EAF2FA;
color: #333333;
}
#tabs .commentIcon, #tabs .postIcon, #tabs .preferenceIcon, #tabs .usersIcon,
#tabs .aboutIcon {
margin: 6px 9px 0 0;
}
/* end first tabs */
/* start sub tabs */
.sub-tabs {
height: 30px;
}
.sub-tabs ul {
float: right;
list-style: none outside none;
margin-right: 24px;
}
.sub-tabs li {
float: left;
}
.sub-tabs li a {
background-color: #ECECEC;
border: 1px solid #DFDFDF;
border-bottom: 0px;
border-radius: 5px 5px 0 0;
color: #333333;
display: block;
line-height: 29px;
padding: 0 12px;
text-decoration: none;
}
.sub-tabs .tab-current, .sub-tabs .tab-current:hover {
background-color: #FFFFFF;
font-weight: bold;
line-height: 30px;
}
.sub-tabs a:hover {
background-color: #F5F5F5;
}
.sub-tabs-main {
background-color: #FFFFFF;
border: 1px solid #DFDFDF;
padding: 12px;
border-radius: 6px;
}
/* end preference tabs*/
/* start form */
.form>div {
margin: 12px 0;
}
.form>div label {
font-weight: bold;
line-height: 28px;
margin-right: 12px;
}
/* end form */
/* start module */
.module-panel {
border: 1px solid #DFDFDF;
border-radius: 3px 3px 3px 3px;
box-shadow: 0 1px 0 #FFFFFF inset;
background-color: #F5F5F5;
margin-bottom: 36px;
min-height: 160px;
}
.module-header {
background-color: #f1f1f1;
background-image: linear-gradient(top,#f9f9f9,#ececec);
background-image: -moz-linear-gradient(top,#f9f9f9,#ececec);
background-image: -ms-linear-gradient(top,#f9f9f9,#ececec);
background-image: -o-linear-gradient(top,#f9f9f9,#ececec);
background-image: -webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#ececec));
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#ececec');
border-bottom-color: #DFDFDF;
box-shadow: 0 1px 0 #FFFFFF;
text-shadow: 0 1px 0 #FFFFFF;
padding: 5px 10px;
}
.module-header h2 {
color: #464646;
font-size: 16px;
}
.module-header a {
text-decoration: none;
}
/* end module */
/* start comments */
.comment-title {
background-color: #ECECEC;
border-bottom: 1px solid #DFDFDF;
border-top: 1px solid #F9F9F9;
padding: 3px 6px 3px 12px;
}
#comments {
height: 462px;
overflow: auto;
}
/* end comments */
/* start article */
.markdown-preivew {
background-image: -moz-linear-gradient(top,#FFFFFF,#F3F3F3);
background-image: -ms-linear-gradient(top,#FFFFFF,#F3F3F3);
background-image: -o-linear-gradient(top,#FFFFFF,#F3F3F3);
background-image: -webkit-gradient(linear,left top,left bottom,from(#FFFFFF),to(#F3F3F3));
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#F3F3F3');
border-color: #C0C0C0 #D9D9D9 #D9D9D9;
border-style: solid;
border-width: 1px;
float: left;
height: 500px;
margin-left: 20px;
overflow: auto;
width: 47%;
word-wrap: break-word;
}
.markdown-help.ico-help, .markdown-help.ico-close {
background-image: url("../images/icon.png");
background-position: -16px -47px;
cursor: pointer;
float: right;
height: 17px;
width: 17px;
}
.markdown-help.ico-close {
height: 16px;
background-position: -48px -16px;
}
.markdown-help-main, .markdown-preview-main {
color: #21759B;
padding: 0 12px
}
.markdown-help-main dt {
font-size: 14px;
font-weight: bold;
margin: 12px 0 6px 0;
}
.markdown-help-main dd {
margin-left: 12px;
}
button#submitArticle {
background: none repeat scroll 0 0 #D54121;
box-shadow: 0 0 0 1px #FFFFFF inset, 0 1px 1px rgba(0, 0, 0, 0.1);
text-shadow: 0 1px rgba(0, 0, 0, 0.1);
color: #FFF;
}
/* end article */
/* start preference */
#skinsPanel {
min-width: 328px;
width: 99%;
}
.skinPreview {
cursor: pointer;
height: 160px;
margin: 6px;
width: 280px;
}
.skinItem {
background-color: #FAFAFA;
border-radius: 3px;
box-shadow: 1px 1px 3px #333333;
line-height: 16px;
margin: 24px 12px;
padding: 5px;
text-align: center;
}
#skinMain .skinItem.selected {
background-color: #D54121;
}
.skinItem:hover {
background-color: #EEE;
}
.f-blue, .error-msg {
color: #3366CC;
}
.signs button {
margin: 0 12px;
}
/* end preference */
/* start common list */
.small-head {
float: left;
height: 35px;
margin: 3px 9px 0 3px;
width: 35px;
}
#commentTable .table-main td {
vertical-align: top;
}
/* end common list */
/* start about */
.about-logo {
float: left;
margin: 62px 36px 62px 24px;
}
.about-margin {
font-size: 20px;
margin: 20px 0;
}
.ico-alipay-me {
background-image: url("../images/alipay-me.png");
font-size: 20px;
height: 24px;
margin: 20px 0;
width: 126px;
}
/* end about */
/*
* jQuly plugin: bowknot style
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.0.7, Oct 29, 2011
*/
.completed-input {
margin: 2px 12px 0 0;
}
.completed-panel {
background-color: #ECECEC;
border: 1px solid #CCCCCC;
color: #0000CC;
display: none;
overflow: auto;
padding: 2px;
position: absolute;
z-index: 10;
}
.completed-panel a {
display: block;
text-decoration: none;
}
.completed-panel a.selected {
background-color: #FFFFFF;
color: #D54121;
}
.completed-ck {
margin-top: 9px;
}
.completed-ck span {
background: url(../images/icon.png) repeat center bottom;
border: 1px solid;
border-color: #CCC #BBBBBB #A0A0A0;
border-radius: 4px;
color: #21759B;
cursor: pointer;
float: left;
height: 28px;
line-height: 26px;
margin: 3px 6px;
padding: 0 6px;
vertical-align: top;
}
.completed-ck span:hover {
border-color: #BBB;
}
.completed-ck span.selected {
color: #D54121;
background: url(../images/bowknot/completed.png) no-repeat right bottom;
}
.dialog-background {
background-color: #000000;
display: none;
filter: alpha(opacity=30);
height: 100%;
left: 0;
opacity: .3;
position: absolute;
top: 0;
width: 100%;
z-index: 90;
}
.dialog-panel {
display: none;
position: absolute;
z-index: 100;
}
.dialog-title {
color: #FFFFFF;
float: left;
font-size: 12px;
line-height: 27px;
margin-left: 3px;
}
.dialog-header-bg {
background: url("../images/icon.png") repeat scroll center bottom #F1F1F1;
border-color: #C0C0C0 #D9D9D9 #D9D9D9;
border-radius: 6px 6px 0 0;
border-style: solid;
border-width: 1px 1px 0;
cursor: move;
height: 34px;
}
.dialog-close-icon {
background: url("../images/bowknot/dialog-close.png") no-repeat scroll 0 0 transparent;
cursor: pointer;
float: right;
height: 18px;
margin-top: 6px;
padding: 3px;
width: 22px;
}
.dialog-close-icon:hover {
background-image: url("../images/bowknot/dialog-close-hover.png");
}
.dialog-main {
background-color: #FFFFFF;
border: 2px solid #666666;
border-color: #C0C0C0 #D9D9D9 #D9D9D9;
border-top-width: 0;
padding: 12px;
}
.paginate-paginate div, .paginate-paginate a, .paginate-pageCount{
float: left;
height: 20px;
line-height: 20px;
margin: 0 5px;
text-decoration: none;
}
.pagination-pages {
background: url(../images/icon.png) repeat center bottom;
border: 1px solid;
border-color: #CCC #BBBBBB #A0A0A0;
border-radius: 4px;
padding: 0 6px;
cursor: pointer;
float: left;
height: 20px;
line-height: 20px;
margin: 0 5px;
}
.pagination-current-page {
cursor: auto;
font-weight: bold;
border-color: #BBB;
}
.paginate-inputPage {
height: 14px;
width: 24px;
}
.table-main {
margin: 0;
padding: 0;
position: relative;
}
.table-main table {
word-break: break-all;
word-wrap: break-word;
}
.table-header {
border: 1px solid #D0D0D0;
border-bottom: 0px;
border-radius: 6px 6px 0 0;
}
.table-header th {
height: 34px;
line-height: 34px;
text-align: left;
text-indent: 6px;
font-size: 14px;
font-weight: normal;
background: url("../images/icon.png") repeat scroll center bottom #F1F1F1;
}
.table-main td {
border-bottom: 1px solid #D0D0D0;
color: #333;
padding: 3px 0;
}
.table-lineHover .table-hasExpend td {
border-bottom: 0px;
}
.table-heiglight td, .table-lineHover td {
background-color: #F3F3F3;
border-right-color: #F3F3F3;
}
.table-expendRow td {
padding: 0 0 5px 36px;
}
.table-expendRow td span {
margin-left: 60px;
}
.table-expendRow td a {
background-color: #999;
border-radius: 3px;
color: #FFF;
font-size: 12px;
margin-right: 5px;
padding: 1px 6px;
text-decoration: none;
}
.table-expendRow td a:hover {
background-color: #BBB;
}
.table-center {
margin: 0 auto;
}
.table-upIcon,.table-downIcon {
background-image: url("../images/icon.png");
cursor: pointer;
float: left;
height: 16px;
width: 16px;
background-position: -79px -32px;
}
.table-upIcon {
background-position: -64px -32px;
margin-right: 6px;
}
.table-tag {
color: #D54121;
font-size: 12px;
font-style: italic;
margin-left: 10px;
}
.tip-panel {
background-color: #FFF;
box-shadow: 0 3px 10px #8B8B8B;
display: none;
max-height: 500px;
max-width: 500px;
overflow: hidden;
padding: 3px;
position: absolute;
z-index: 1;
}
>>>>>>> origin/0.4.6
<<<<<<< HEAD
/**
* base style
*
......@@ -500,4 +501,524 @@ button:hover,.button:hover {
#captcha, #captchaReply {
cursor: pointer;
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* base style
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.2.1, Mar 28, 2012
*/
html, body, div, ul, li, h1, h2, h3, h4, h5, h6, p, dd, dl, ol {
margin: 0;
padding: 0;
}
body {
background-color: #FFF;
color: #000;
font-family: Helvetica,Arial,sans-serif,\5fae\8f6f\96c5\9ed1;
font-size: small;
}
img {
border: medium none;
margin: 0;
padding: 0;
vertical-align: middle;
}
h1 {
font-size: 160%;
}
h2 {
font-size: 140%;
}
h3 {
font-size: 120%;
}
h4 {
font-size: 110%;
}
textarea {
overflow: auto;
}
li {
margin-left: 12px;
}
button, .button {
background: url(../images/icon.png) repeat center bottom;
border: 1px solid;
border-color: #CCC #BBBBBB #A0A0A0;
border-radius: 4px;
height: 28px;
margin: 0;
padding: 0 6px;
vertical-align: top;
}
button:hover,.button:hover {
border-color: #BBB;
}
.padding12 {
padding: 12px;
}
.paddingBottom12 {
padding-bottom: 12px !important;
}
.paddingTop12 {
padding-top: 12px !important;
}
.margin12 {
margin: 12px;
}
.marginTop12 {
margin-top: 12px !important;
}
.marginBottom12 {
margin-bottom: 12px !important;
}
.marginLeft12 {
margin-left: 12px !important;;
}
.marginLeft6 {
margin-left: 6px !important;;
}
.marginRight12 {
margin-right: 12px !important;;
}
.f-bold {
font-weight: bold !important;
}
.nowrap {
white-space: nowrap;
}
.left {
float: left;
}
.right {
float: right;
}
.clear {
background-color: transparent;
border: 0;
clear: both;
display: block;
font-size: 0;
height: 0;
line-height: 0;
overflow: hidden;
}
.none {
display: none;
}
.pointer {
cursor: pointer;
}
.no-underline {
text-decoration: none !important;
}
.red {
color: red;
}
.contentBody {
margin-bottom: 12px;
padding: 3px 12px;
}
/* start form */
.form th {
text-align: right;
white-space: nowrap;
}
.form input[type='text'], .form input[type='password'], .form textarea {
border-color: #C0C0C0 #D9D9D9 #D9D9D9;
border-right: 1px solid #D9D9D9;
border-style: solid;
border-width: 1px;
font-family: Helvetica,Arial,sans-serif;
font-size: 12px;
outline: medium none;
width: 99%;
padding: 0 3px;
}
.form input {
height: 24px;
}
.form input[type='checkbox'] {
border: 0px;
vertical-align: middle;
}
.form input.normalInput {
width: auto;
}
.form input[type='checkbox']:focus {
border: 0px;
}
.form input:focus, .form textarea:focus {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) inset;
}
.form textarea {
padding: 3px;
overflow: auto;
resize: vertical;
}
/* end form */
.logo {
padding: 0 5px;
text-decoration: none;
text-shadow: 0 0 1px #EEEEEE;
}
/* start icon */
.putTopIcon,.notPutTopIcon,.deleteIcon,.updateIcon,.commentIcon,
.homeIcon,.adminIcon,.loginIcon,.logoutIcon,.calendarIcon,.browserIcon,
.postIcon,.articlesIcon,.draftsIcon,.usersIcon,.linkIcon,
.preferenceIcon, .pageIcon, .trueIcon,.falseIcon,
.fileIcon, .othersIcon, .goTopIcon, .goBottomIcon, .cacheIcon, .aboutIcon {
background-image: url("../images/icon.png");
cursor: pointer;
height: 16px;
width: 16px;
}
.adminIcon,.loginIcon,.logoutIcon,.homeIcon {
margin-top: 3px;
}
.pageIcon {
background-position: -144px 0px;
}
.postIcon {
background-position: -16px 0;
}
.linkIcon {
background-position: -32px 0;
}
.preferenceIcon {
background-position: -48px 0;
}
.articlesIcon {
background-position: -64px 0;
}
.trueIcon {
background-position: -80px 0;
cursor: auto;
}
.falseIcon {
background-position: -96px 0;
cursor: auto;
}
.fileIcon {
background-position: -112px 0;
}
.deleteIcon {
background-position: 0 -16px;
}
.updateIcon {
background-position: -16px -16px;
}
.commentIcon {
background-position: -32px -16px;
}
.homeIcon {
background-position: -64px -16px;
}
.adminIcon {
background-position: -80px -16px;
}
.logoutIcon {
background-position: -96px -16px;
}
.loginIcon {
background-position: -112px -16px;
}
.browserIcon {
background-position: -128px -16px;
}
.calendarIcon {
background-position: -144px -16px;
}
.putTopIcon {
background-position: -16px -32px;
float: left;
}
.notPutTopIcon {
background-position: -32px -32px;
float: left;
}
.othersIcon {
background-position: -48px -32px;
}
.cacheIcon {
background-position: -96px -32px;
}
.draftsIcon {
background-position: -96px -32px;
}
.usersIcon {
background-position: -112px -32px;
}
.goTopIcon {
background-position: -64px -32px;
position: fixed;
right: 20px;
top: 45%;
}
.goBottomIcon {
background-position: -80px -32px;
bottom: 40%;
position: fixed;
right: 20px;
}
.article-body {
overflow: hidden;
line-height: 145%;
word-wrap: break-word;
}
.article-body blockquote {
border: 1px dotted #98A47F;
font-style: italic;
margin: 12px;
padding: 12px;
}
.article-body h1 {
font-size: 2em;
margin: .67em 0;
}
.article-body h2 {
font-size: 1.5em;
margin: .75em 0;
}
.article-body h3 {
font-size: 1.17em;
margin: .83em 0;
}
.article-body h4, .article-body p, .article-body blockquote,
.article-body ul, .article-body fieldset, .article-body form, .article-body ol,
.article-body dl, .article-body dir, .article-body menu {
margin: 1.12em 0;
}
.article-body h5 {
font-size: .83em;
margin: 1.5em 0;
}
.article-body h6 {
font-size: .75em;
margin: 1.67em 0;
}
.article-body blockquote {
margin-left: 40px;
margin-right: 40px;
}
.article-body ol, .article-body ul, .article-body dir,
.article-body menu, .article-body dd {
margin-left: 40px;
}
/* start icon */
/* start emotions */
.em00, .em01, .em02, .em03, .em04, .em05, .em06, .em07, .em08, .em09,
.em10, .em11, .em12, .em13, .em14 {
background-image: url("../images/emotions/classic/emotions-classic.png");
float: left;
height: 24px;
margin-right: 5px;
width: 24px;
}
#emotions span {
cursor: pointer;
}
.em01 {
background-position: -24px 0;
}
.em02 {
background-position: -48px 0;
}
.em03 {
background-position: -72px 0;
}
.em04 {
background-position: -96px 0;
}
.em05 {
background-position: 0px -24px;
}
.em06 {
background-position: -24px -24px;
}
.em07 {
background-position: -48px -24px;
}
.em08 {
background-position: -72px -24px;
}
.em09 {
background-position: -96px -24px;
}
.em10 {
background-position: 0 -48px;
}
.em11 {
background-position: -24px -48px ;
}
.em12 {
background-position: -48px -48px;
}
.em13 {
background-position: -72px -48px;
}
.em14 {
background-position: -96px -48px;
}
/* end emotions */
/* start tags */
#tags {
list-style: none;
}
#tags li {
float: left;
list-style: none;
height: 38px;
}
#tags a:hover {
text-shadow: 0 0 2px #555555;
}
#tags a {
border-radius: 3px 3px 3px 3px;
box-shadow: 1px 1px 3px #555555;
float: left;
margin: 3px 6px;
padding: 3px 12px;
text-decoration: none;
}
#tags .tags1 {
font-size: 12px;
font-weight: normal;
}
#tags .tags2 {
font-size: 14px;
font-weight: normal;
}
#tags .tags3 {
font-size: 16px;
font-weight: normal;
}
#tags .tags4 {
font-size: 18px;
font-weight: bold;
}
#tags .tags5 {
font-size: 20px;
font-weight: bold;
}
/* end tags */
/* start comment */
#captcha, #captchaReply {
cursor: pointer;
}
>>>>>>> origin/0.4.6
/* end comment */
\ No newline at end of file
<<<<<<< HEAD
/**
* 403, 500, article-pwd, init, login and kill-browser page style.
*
......@@ -224,4 +225,256 @@ input:focus {
font-weight: bold;
margin-top: 18px;
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 403, 404, 500, article-pwd, init, login and kill-browser page style.
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.1.1, Jun 13, 2012
*/
html {
height: 100%;
overflow: hidden;
}
*,html,body {
margin: 0;
padding: 0;
}
body {
background-color: #F3F1E5;
color: #4D505D;
font-family: \5fae\8f6f\96c5\9ed1;
font-size: small;
height: 100%;
}
button {
background: url(../images/icon.png) repeat center bottom;
border: 1px solid;
border-color: #CCC #BBBBBB #A0A0A0;
border-radius: 4px;
height: 28px;
margin: 0;
padding: 0 6px;
vertical-align: top;
float: right;
margin: 12px 0 0 24px;
outline: none;
}
input {
background: none repeat scroll 0 0 #FBFBFB;
border: 1px solid #E5E5E5;
box-shadow: 1px 1px 2px rgba(200, 200, 200, 0.2) inset;
color: #4D505D;
font-family: Helvetica,Arial,sans-serif,\5fae\8f6f\96c5\9ed1;
font-size: 20px;
font-weight: 200;
height: 28px;
margin-top: 10px;
outline: medium none;
padding: 3px;
width: 280px;
}
input:focus {
box-shadow: 0px 0px 5px rgba(200, 200, 200, 0.9);
}
.clear {
background-color: transparent;
border: 0px;
clear: both;
display: block;
font-size: 0px;
height: 0px;
line-height: 0px;
overflow: hidden;
}
.none {
display: none;
}
.icon {
position: absolute;
right: 0px;
top: 0px;
width:16px;
height:16px;
}
.solo {
color: orangered;
font-weight: bold;
}
.logo {
float: left;
padding: 162px 12px 0;
width: 153px;
}
.wrapper {
height: auto;
min-height: 100%;
position: relative;
}
.wrap {
border-top: 5px solid #E6E5D9;
min-height: 400px;
}
.content {
background: url("../images/zz.jpg") repeat-x scroll center bottom white;
border-color: #E6E5D9;
border-style: solid solid none;
border-width: 1px;
margin: 0 auto;
position: relative;
width: 700px;
top: 60px;
}
.main {
border-left: 1px solid #E6E5D9;
float: right;
font-size: 15px;
margin: 24px 0;
padding: 12px 24px;
width: 470px;
height: 338px;
}
.main a {
text-decoration: none;
}
.main ul {
margin-bottom: 73px;
}
.main li {
margin: 6px 0 6px 16px;
}
.main p {
margin: 12px 0;
}
.mian tr {
height: 54px;
}
.footerWrapper {
background-color: #FFFFFF;
border-top: 1px solid #E6E5D9;
bottom: 0;
padding: 12px 0;
position: absolute;
text-align: center;
width: 100%;
}
.footerWrapper a {
text-decoration: none;
}
/* start article-pwd */
.article-pwd > div {
margin-bottom: 10px;
max-height: 264px;
overflow: auto;
word-wrap: break-word;
}
.article-pwd #confirm {
margin-top: 6px;
}
/* end article-pwd */
/* start 403/404/500 */
.img-404, .img-403, .img-500 {
box-shadow: 0 0 5px #E6E5D9;
margin: 20px 0 0 45px;
padding: 5px;
}
.a-404, .a-403, .a-500 {
margin: 20px 50px 0 0 ;
text-align: right;
}
.img-403 {
margin: 20px 0 0 60px;
}
.a-403 {
margin: 20px 75px 0 0 ;
}
.img-500 {
margin: 25px 0 0 25px;
}
.a-500 {
margin: 25px 35px 0 0 ;
}
/* end 403/404/500 */
/* start login */
.login table {
margin: 66px auto;
}
/* end login */
/* start kill */
.kill {
position: absolute;
right: 40px;
top: 230px;
}
/* end kill */
/* start init and login */
#init {
position: absolute;
top: 102px;
width: 470px;
}
#sys p {
height: 166px;
}
#initButton {
margin-right: 10px;
}
#tip {
color: #21759B;
float: right;
font-weight: bold;
margin-top: 18px;
}
>>>>>>> origin/0.4.6
/* end init and login */
\ No newline at end of file
......@@ -2,14 +2,8 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="none" />
<title>${blogTitle} - 403 Forbidden!</title>
<meta name="keywords" content="GAE 博客,GAE blog,b3log,init" />
<meta name="description" content="An open source blog with Java. Java 开源博客" />
<meta name="author" content="B3log Team" />
<meta name="generator" content="B3log" />
<meta name="copyright" content="B3log" />
<meta name="revised" content="B3log, ${year}" />
<meta http-equiv="Window-target" content="_top" />
<link type="text/css" rel="stylesheet" href="${staticServePath}/css/default-init${miniPostfix}.css?${staticResourceVersion}" charset="utf-8" />
<link rel="icon" type="image/png" href="${staticServePath}/favicon.png" />
</head>
......@@ -24,6 +18,11 @@
</div>
<div class="main">
<h2>403 Forbidden!</h2>
<img class="img-403" src="${staticServePath}/images/403.png" alt="403: forbidden" title="403: forbidden" />
<div class="a-403">
<a href="${servePath}">Index</a> |
<a href="${loginURL}">Login</a>
</div>
<a href="http://b3log.org" target="_blank">
<img border="0" class="icon" alt="B3log" title="B3log" src="${staticServePath}/favicon.png"/>
</a>
......@@ -34,7 +33,7 @@
</div>
<div class="footerWrapper">
<div class="footer">
&copy; 2012
&copy; ${year}
Powered by
<a href="http://b3log.org" target="_blank">
<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
......
......@@ -2,14 +2,8 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="none" />
<title>${blogTitle} - 404 Not Found!</title>
<meta name="keywords" content="GAE 博客,GAE blog,b3log,init" />
<meta name="description" content="An open source blog with Java. Java 开源博客" />
<meta name="author" content="B3log Team" />
<meta name="generator" content="B3log" />
<meta name="copyright" content="B3log" />
<meta name="revised" content="B3log, ${year}" />
<meta http-equiv="Window-target" content="_top" />
<link type="text/css" rel="stylesheet" href="${staticServePath}/css/default-init${miniPostfix}.css?${staticResourceVersion}" charset="utf-8" />
<link rel="icon" type="image/png" href="${staticServePath}/favicon.png" />
</head>
......@@ -24,6 +18,8 @@
</div>
<div class="main">
<h2>404 Not Found!</h2>
<img class="img-404" alt="404: not found" title="404: not found" src="${staticServePath}/images/404.png" />
<div class="a-404"><a href="${servePath}">Index</a></div>
<a href="http://b3log.org" target="_blank">
<img border="0" class="icon" alt="B3log" title="B3log" src="${staticServePath}/favicon.png"/>
</a>
......@@ -34,7 +30,7 @@
</div>
<div class="footerWrapper">
<div class="footer">
&copy; 2012
&copy; ${year}
Powered by
<a href="http://b3log.org" target="_blank">
<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
......
......@@ -3,13 +3,6 @@
<head>
<meta charset="utf-8" />
<title>${blogTitle} - 500 Internal Server Error!</title>
<meta name="keywords" content="GAE 博客,GAE blog,b3log,init" />
<meta name="description" content="An open source blog with Java. Java 开源博客" />
<meta name="author" content="B3log Team" />
<meta name="generator" content="B3log" />
<meta name="copyright" content="B3log" />
<meta name="revised" content="B3log, ${year}" />
<meta http-equiv="Window-target" content="_top" />
<link type="text/css" rel="stylesheet" href="${staticServePath}/css/default-init${miniPostfix}.css?${staticResourceVersion}" charset="utf-8" />
<link rel="icon" type="image/png" href="${staticServePath}/favicon.png" />
</head>
......@@ -24,27 +17,29 @@
</div>
<div class="main">
<h2>500 Internal Server Error!</h2>
<p>
Maybe it is a bug, please
<a href="https://github.com/b3log/b3log-solo/issues/new">report<a> it to help us.
</p>
<a href="http://b3log.org" target="_blank">
<img border="0" class="icon" alt="B3log" title="B3log" src="${staticServePath}/favicon.png"/>
</a>
</div>
<span class="clear"></span>
</div>
</div>
</div>
<div class="footerWrapper">
<div class="footer">
&copy; 2012
Powered by
<a href="http://b3log.org" target="_blank">
<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
<span class="solo">Solo</span>
</a>
</div>
</div>
</body>
</html>
<img class="img-500" src="${staticServePath}/images/500.png" title="500: internal error" alt="500: internal error" />
<div class="a-500">
Please
<a href="https://github.com/b3log/b3log-solo/issues/new">report</a> it to help us.
Return to <a href="${servePath}">Index</a>.
</div>
<a href="http://b3log.org" target="_blank">
<img border="0" class="icon" alt="B3log" title="B3log" src="${staticServePath}/favicon.png"/>
</a>
</div>
<span class="clear"></span>
</div>
</div>
</div>
<div class="footerWrapper">
<div class="footer">
&copy; ${year}
Powered by
<a href="http://b3log.org" target="_blank">
<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
<span class="solo">Solo</span>
</a>
</div>
</div>
</body>
</html>
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -252,4 +253,260 @@ $.extend(Admin.prototype, {
this.setCurByHash();
}
});
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* index for admin
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.1.9, Jun 19, 2012
*/
var Admin = function () {
this.register = {};
// 工具栏下的工具
this.tools = ['#page-list', '#file-list', '#link-list', '#preference',
'#user-list', '#plugin-list', '#others'];
// 多用户时,一般用户不能使用的功能
this.adTools = ['link-list', 'preference', 'file-list', 'page-list',
'user-list', 'plugin-list'];
};
$.extend(Admin.prototype, {
/*
* 登出
*/
logout: function () {
window.location.href = latkeConfig.servePath + "/logout?goto=" + latkeConfig.servePath;
},
/*
* 根据当前页数设置 hash
* @currentPage {string} 当前页
*/
setHashByPage: function (currentPage) {
var hash = window.location.hash,
hashList = hash.split("/");
if (/^\d*$/.test(hashList[hashList.length - 1])) {
hashList[hashList.length - 1] = currentPage;
} else {
hashList.push(currentPage);
}
window.location.hash = hashList.join("/");
},
/*
* 设置某个 tab 被选择
* @id tab id
*/
selectTab: function (id) {
window.location.hash = "#" + id;
},
/*
* 根据当前 hash 解析出当前页数及 hash 数组。
*/
analyseHash: function () {
var hash = window.location.hash;
var tag = hash.substr(1, hash.length - 1);
var tagList = tag.split("/");
var tags = {};
tags.page = 1,
tags.hashList = [];
for (var i = 0; i < tagList.length; i++) {
if (i === tagList.length - 1 && (/^\d+$/.test(tagList[i]))) {
tags.page = tagList[i];
} else {
tags.hashList.push(tagList[i]);
}
}
return tags;
},
/*
* 根据当前 hash 设置当前 tab
*/
setCurByHash: function () {
var tags = admin.analyseHash();
var tab = tags.hashList[1],
subTab = tags.hashList[2];
if (tags.hashList.length === 1) {
tab = tags.hashList[0];
}
if (tab === "") {
return;
}
// 离开编辑器时进行提示
try {
// 除更新、发布、取消发布文章,编辑器中无内容外,离开编辑器需进行提示。
if (tab !== "article" && admin.article.isConfirm &&
admin.editorArticle.getContent().replace(/\s/g, '') !== "") {
if (!confirm(Label.editorLeaveLabel)) {
window.location.hash = "#article/article";
return;
}
}
// 不离开编辑器,hash 需变为 "#article/article",此时不需要做任何处理。
if (tab === "article" && admin.article.isConfirm &&
admin.editorArticle.getContent().replace(/\s/g, '') !== "") {
return;
}
} catch (e) {
var $articleContent = $('#articleContent');
if ($articleContent.length > 0) {
if (tab !== "article" && admin.article.isConfirm &&
$articleContent.val().replace(/\s/g, '') !== "") {
if (!confirm(Label.editorLeaveLabel)) {
window.location.hash = "#article/article";
return;
}
}
// 不离开编辑器,hash 需变为 "#article/article",此时不需要做任何处理。
if (tab === "article" && admin.article.isConfirm &&
$articleContent.val().replace(/\s/g, '') !== "") {
return;
}
}
}
// clear article
if (tab !== "article" && admin.editorArticle.setContent) {
admin.article.clear();
}
admin.article.isConfirm = true;
$("#tabs").tabs("setCurrent", tab);
$("#loadMsg").text(Label.loadingLabel);
if ($("#tabsPanel_" + tab).length === 1) {
if ($("#tabsPanel_" + tab).html().replace(/\s/g, "") === "") {
// 还未加载 HTML
$("#tabsPanel_" + tab).load("admin-" + tab + ".do", function () {
// 页面加载完后,回调初始函数
if (tab === "article" && admin.article.status.id) {
// 当文章页面编辑器未初始化时,调用更新文章需先初始化编辑器
admin.register[tab].init.call(admin.register[tab].obj, admin.article.getAndSet);
} else {
admin.register[tab].init.call(admin.register[tab].obj, tags.page);
}
// 页面包含子 tab,需根据 hash 定位到相应的 tab
if (subTab) {
$("#tab" + tab.substring(0, 1).toUpperCase() + tab.substring(1)).
tabs("setCurrent", subTab);
}
// 根据 hash 调用现有的插件函数
admin.plugin.setCurByHash(tags);
});
} else {
if (tab === "article" && admin.article.status.id) {
admin.article.getAndSet();
}
// 已加载过 HTML,只需调用刷新函数
if (admin.register[tab] && admin.register[tab].refresh) {
admin.register[tab].refresh.call(admin.register[tab].obj, tags.page);
}
// 页面包含子 tab,需根据 hash 定位到相应的 tab
if (subTab) {
$("#tab" + tab.substring(0, 1).toUpperCase() + tab.substring(1)).
tabs("setCurrent", subTab);
}
// 根据 hash 调用现有的插件函数
admin.plugin.setCurByHash(tags);
}
} else {
$("#tipMsg").text("Error: No tab! " + Label.reportIssueLabel);
$("#loadMsg").text("");
}
},
/*
* 初始化整个后台
*/
init: function () {
//window.onerror = Util.error;
Util.killIE();
$("#loadMsg").text(Label.loadingLabel);
// 构建 tabs
$("#tabs").tabs();
// tipMsg
setInterval(function () {
if($("#tipMsg").text() !== "") {
setTimeout(function () {
$("#tipMsg").text("");
}, 7000);
}
}, 6000);
$("#loadMsg").text("");
},
/*
* @description tools and article collapse
* @param {bom} it 触发事件对象
*/
collapseNav: function (it) {
var subNav = $(it).next();
subNav.slideToggle("normal", function () {
if (this.style.display !== "none") {
$(it).find(".ico-arrow-down")[0].className = "ico-arrow-up";
} else {
$(it).find(".ico-arrow-up")[0].className = "ico-arrow-down";
}
});
/*if (subNav.className === "none") {
$(it).find(".ico-arrow-down")[0].className = "ico-arrow-up";
subNav.className = "collapsed";
} else {
$(it).find(".ico-arrow-up")[0].className = "ico-arrow-down";
subNav.className = "none";
}*/
},
/*
* 后台及当前页面所需插件初始化完后,对权限进行控制及当前页面属于 tools 时,tools 选项需展开。
*/
inited: function () {
// Removes functions with the current user role
if (Label.userRole !== "adminRole") {
for (var i = 0; i < this.adTools.length; i++) {
$("#tabs").tabs("remove", this.adTools[i]);
}
$("#tabs>ul>li").last().remove();
} else {
// 当前 tab 属于 Tools 时,设其展开
for (var j = 0; j < this.tools.length; j++) {
if ("#" + window.location.hash.split("/")[1] === this.tools[j]) {
$("#tabToolsTitle").click();
break;
}
}
}
this.setCurByHash();
}
});
>>>>>>> origin/0.4.6
var admin = new Admin();
\ No newline at end of file
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -94,4 +95,104 @@ admin.editors.KindEditor = {
$("#" + id).val(content);
}
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview KindEditor
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.0.2, Jun 19, 2012
*/
admin.editors.KindEditor = {
/*
* @description 初始化编辑器
* @param conf 编辑器初始化参数
* @param conf.kind 编辑器类型
* @param conf.id 编辑器渲染元素 id
* @param conf.fun 编辑器首次加载完成后回调函数
*/
init: function (conf) {
var language = "zh_CN";
if ("en_US" === Label.localeString) {
language = "en"
}
if (conf.kind && conf.kind === "simple") {
try {
this[conf.id] = KindEditor.create('#' + conf.id, {
langType : language,
resizeType: 0,
items: ["bold", "italic", "underline", "strikethrough", "|", "undo", "redo", "|",
"insertunorderedlist", "insertorderedlist",
]
});
} catch (e) {
$("#tipMsg").text("KindEditor load fail");
}
} else {
try {
this[conf.id] = KindEditor.create('#' + conf.id, {
langType : language,
items: ["formatblock", "fontname", "fontsize", "|", "bold", "italic", "underline", "strikethrough", "forecolor", "|",
"link", "unlink", "image", "media", "|", "pagebreak", "emoticons", "code", "/",
"undo", "redo", "|", "insertunorderedlist", "insertorderedlist", "indent", "outdent", "|",
"justifyleft", "justifycenter", "justifyright", "justifyfull", "|", "plainpaste", "wordpaste", "|",
"clearhtml", "source", "preview"
],
afterCreate: function () {
// TODO: chrome bug
window.onhashchange = admin.setCurByHash;
if (typeof(conf.fun) === "function") {
conf.fun();
}
}
});
} catch (e) {
$("#tipMsg").text("KindEditor load fail");
}
}
},
/*
* @description 获取编辑器值
* @param {string} id 编辑器id
* @returns {string} 编辑器值
*/
getContent: function (id) {
var content = "";
try {
content = this[id].html();
} catch (e) {
content = $("#" + id).val();
}
return content;
},
/*
* @description 设置编辑器值
* @param {string} id 编辑器 id
* @param {string} content 设置编辑器值
*/
setContent: function (id, content) {
try {
this[id].html(content);
} catch (e) {
$("#" + id).val(content);
}
}
>>>>>>> origin/0.4.6
};
\ No newline at end of file
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -121,4 +122,131 @@ admin.editors.tinyMCE = {
$("#" + id).val(content);
}
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview tinyMCE editor
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.0.5, Jun 19, 2012
*/
admin.editors.tinyMCE = {
/*
* @description 初始化编辑器
* @param conf 编辑器初始化参数
* @param conf.kind 编辑器类型
* @param conf.id 编辑器渲染元素 id
* @param conf.fun 编辑器首次加载完成后回调函数
*/
init: function (conf) {
var language = Label.localeString.substring(0, 2);
if (language === "zh") {
language = "zh-cn";
}
if (conf.kind && conf.kind === "simple") {
try {
tinyMCE.init({
// General options
language: language,
mode : "exact",
elements : conf.id,
theme : "advanced",
// Theme options
theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,undo,redo,|,bullist,numlist",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
valid_children : "+body[style]"
});
} catch (e) {
$("#tipMsg").text("TinyMCE load fail");
}
} else {
try {
tinyMCE.init({
// General options
language: language,
mode : "exact",
elements : conf.id,
theme : "advanced",
plugins : "autosave,style,advhr,advimage,advlink,preview,inlinepopups,media,paste,syntaxhl,wordcount",
// Theme options
theme_advanced_buttons1 : "formatselect,fontselect,fontsizeselect,|,bold,italic,underline,strikethrough,forecolor,|,advhr,blockquote,syntaxhl,",
theme_advanced_buttons2 : "undo,redo,|,bullist,numlist,outdent,indent,|,justifyleft,justifycenter,justifyright,justifyfull,|,pastetext,pasteword,|,link,unlink,image,iespell,media,|,cleanup,code,preview,",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_resizing : true,
theme_advanced_statusbar_location : "bottom",
extended_valid_elements: "link[type|rel|href|charset],pre[name|class],iframe[src|width|height|name|align],+a[*]",
valid_children : "+body[style]",
relative_urls: false,
remove_script_host: false,
oninit : function () {
// TODO: chrome bug
window.onhashchange = admin.setCurByHash;
if (typeof(conf.fun) === "function") {
conf.fun();
}
}
});
} catch (e) {
$("#tipMsg").text("TinyMCE load fail");
}
}
},
/*
* @description 获取编辑器值
* @param {string} id 编辑器id
* @returns {string} 编辑器值
*/
getContent: function (id) {
var content = "";
try {
content = tinyMCE.get(id).getContent();
} catch (e) {
content = $("#" + id).val();
}
return content;
},
/*
* @description 设置编辑器值
* @param {string} id 编辑器 id
* @param {string} content 设置编辑器值
*/
setContent: function (id, content) {
try {
if (tinyMCE.get(id)) {
tinyMCE.get(id).setContent(content);
} else {
$("#" + id).val(content);
}
} catch (e) {
$("#" + id).val(content);
}
}
>>>>>>> origin/0.4.6
};
\ No newline at end of file
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -433,4 +434,441 @@ admin.register["page-list"] = {
"obj": admin.pageList,
"init": admin.pageList.init,
"refresh": admin.pageList.getList
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* page list for admin
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.2.1, Jun 20, 2012
*/
/* page-list 相关操作 */
admin.pageList = {
tablePagination: new TablePaginate("page"),
pageInfo: {
currentCount: 1,
pageCount: 1,
currentPage: 1
},
id: "",
type: "link",
/*
* 初始化 table, pagination, comments dialog
*/
init: function (page) {
this.tablePagination.buildTable([{
text: "",
index: "pageOrder",
width: 60,
style: "padding-left: 12px;font-size:14px;"
}, {
style: "padding-left: 12px;",
text: Label.titleLabel,
index: "pageTitle",
width: 300
}, {
style: "padding-left: 12px;",
text: Label.permalinkLabel,
index: "pagePermalink",
minWidth: 300
}, {
style: "padding-left: 12px;",
text: Label.openMethodLabel,
index: "pageTarget",
width: 120
}, {
style: "padding-left: 12px;",
text: Label.typeLabel,
index: "pageType",
width: 80
}, {
text: Label.commentLabel,
index: "comments",
width: 80,
style: "padding-left: 12px;"
}]);
this.tablePagination.initPagination();
this.tablePagination.initCommentsDialog();
this.getList(page);
var language = Label.localeString.substring(0, 2);
if (language === "zh") {
language = "zh-cn";
}
admin.editorPage = new Editor({
language: language,
kind: "all",
id: "pageContent"
});
// select type
$(".fn-type").click(function () {
var $it = $(this);
if ($it.hasClass("selected")) {
return;
}
$(".fn-type").removeClass("selected");
$it.addClass("selected");
admin.pageList.type = $it.data("type");
if (admin.pageList.type === "page") {
$("#pagePagePanel").slideDown();
// 使用 CodeMirror 编辑器时,当编辑器初始之前,元素为 display:none 时,行号显示不正常
if (Label.editorType === "CodeMirror-Markdown" && admin.editorPage.getContent() === "") {
admin.editorPage.setContent("");
}
} else {
$("#pagePagePanel").slideUp();
}
});
},
/*
* 根据当前页码获取列表
* @pagNum 当前页码
*/
getList: function (pageNum) {
$("#loadMsg").text(Label.loadingLabel);
var that = this;
$.ajax({
url: latkeConfig.servePath + "/console/pages/" + pageNum + "/" + Label.PAGE_SIZE + "/" + Label.WINDOW_SIZE,
type: "GET",
cache: false,
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
var pages = result.pages;
var pageData = [];
admin.pageList.pageInfo.currentCount = pages.length;
admin.pageList.pageInfo.pageCount = result.pagination.paginationPageCount === 0 ? 1 : result.pagination.paginationPageCount;
for (var i = 0; i < pages.length; i++) {
pageData[i] = {};
if (i === 0) {
if (pages.length === 1) {
pageData[i].pageOrder = "";
} else {
pageData[i].pageOrder = '<div class="table-center" style="width:14px">\
<span onclick="admin.pageList.changeOrder(' + pages[i].oId + ', ' + i + ', \'down\');" \
class="table-downIcon"></span></div>';
}
} else if (i === pages.length - 1) {
pageData[i].pageOrder = '<div class="table-center" style="width:14px">\
<span onclick="admin.pageList.changeOrder(' + pages[i].oId + ', ' + i + ', \'up\');" class="table-upIcon"></span>\
</div>';
} else {
pageData[i].pageOrder = '<div class="table-center" style="width:38px">\
<span onclick="admin.pageList.changeOrder(' + pages[i].oId + ', ' + i + ', \'up\');" class="table-upIcon"></span>\
<span onclick="admin.pageList.changeOrder(' + pages[i].oId + ', ' + i + ', \'down\');" class="table-downIcon"></span>\
</div>';
}
pageData[i].pageTitle = "<a class='no-underline' href='" + pages[i].pagePermalink + "' target='_blank'>" +
pages[i].pageTitle + "</a>";
pageData[i].pagePermalink = "<a class='no-underline' href='" + pages[i].pagePermalink + "' target='_blank'>"
+ pages[i].pagePermalink + "</a>";
pageData[i].pageTarget = pages[i].pageOpenTarget;
pageData[i].pageType = pages[i].pageType ;
pageData[i].comments = pages[i].pageCommentCount;
pageData[i].expendRow = "<span><a href='" + pages[i].pagePermalink + "' target='_blank'>" + Label.viewLabel + "</a> \
<a href='javascript:void(0)' onclick=\"admin.pageList.get('" + pages[i].oId + "')\">" + Label.updateLabel + "</a>\
<a href='javascript:void(0)' onclick=\"admin.pageList.del('" + pages[i].oId + "')\">" + Label.removeLabel + "</a>\
<a href='javascript:void(0)' onclick=\"admin.comment.open('" + pages[i].oId + "', 'page')\">" + Label.commentLabel + "</a></span>";
}
that.tablePagination.updateTablePagination(pageData, pageNum, result.pagination);
$("#loadMsg").text("");
}
});
},
/*
* 获取自定义页面
* @id 自定义页面 id
*/
get: function (id) {
$("#loadMsg").text(Label.loadingLabel);
$("#tipMsg").text("");
$.ajax({
url: latkeConfig.servePath + "/console/page/" + id,
type: "GET",
cache: false,
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
admin.pageList.id = id;
$("#pageTitle").val(result.page.pageTitle);
$("#pagePermalink").val(result.page.pagePermalink);
$("#pageTarget").val(result.page.pageOpenTarget);
if (result.page.pageType === "page") {
$($(".fn-type").get(1)).click();
} else {
$($(".fn-type").get(0)).click();
}
$("#pageCommentable").prop("checked", result.page.pageCommentable);
admin.editorPage.setContent(result.page.pageContent);
$("#loadMsg").text("");
}
});
},
/*
* 删除自定义页面
* @id 自定义页面 id
*/
del: function (id) {
var isDelete = confirm(Label.confirmRemoveLabel);
if (isDelete) {
$("#loadMsg").text(Label.loadingLabel);
$("#tipMsg").text("");
$.ajax({
url: latkeConfig.servePath + "/console/page/" + id,
type: "DELETE",
cache: false,
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
var pageNum = admin.pageList.pageInfo.currentPage;
if (admin.pageList.pageInfo.currentCount === 1 && admin.pageList.pageInfo.pageCount !== 1 &&
admin.pageList.pageInfo.currentPage === admin.pageList.pageInfo.pageCount) {
admin.pageList.pageInfo.pageCount--;
pageNum = admin.pageList.pageInfo.pageCount;
}
var hashList = window.location.hash.split("/");
if (pageNum == hashList[hashList.length - 1]) {
admin.pageList.getList(pageNum);
} else {
admin.setHashByPage(pageNum);
}
$("#loadMsg").text("");
}
});
}
},
/*
* 添加自定义页面
*/
add: function () {
if (this.validate()) {
$("#loadMsg").text(Label.loadingLabel);
$("#tipMsg").text("");
var pageContent = admin.editorPage.getContent();
var pagePermalink = $("#pagePermalink").val().replace(/(^\s*)|(\s*$)/g, "");
if (admin.pageList.type === "link") {
pagePermalink = Util.proessURL(pagePermalink);
}
var requestJSONObject = {
"page": {
"pageTitle": $("#pageTitle").val(),
"pageContent": pageContent,
"pagePermalink": pagePermalink,
"pageCommentable": $("#pageCommentable").prop("checked"),
"pageType": admin.pageList.type,
"pageOpenTarget": $("#pageTarget").val()
}
};
$.ajax({
url: latkeConfig.servePath + "/console/page/",
type: "POST",
cache: false,
data: JSON.stringify(requestJSONObject),
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
admin.pageList.id = "";
$("#pagePermalink").val("");
$("#pageTitle").val("");
$("#pageCommentable").prop("cheked", false);
$("#pageTarget").val("_self");
$($(".fn-type").get(0)).click();
admin.editorPage.setContent("");
if (admin.pageList.pageInfo.currentCount === Label.PAGE_SIZE &&
admin.pageList.pageInfo.currentPage === admin.pageList.pageInfo.pageCount) {
admin.pageList.pageInfo.pageCount++;
}
var hashList = window.location.hash.split("/");
if (admin.pageList.pageInfo.pageCount == hashList[hashList.length - 1]) {
admin.pageList.getList(admin.pageList.pageInfo.pageCount);
} else {
admin.setHashByPage(admin.pageList.pageInfo.pageCount);
}
$("#loadMsg").text("");
}
});
}
},
/*
* 更新自定义页面
*/
update: function () {
if (this.validate()) {
$("#loadMsg").text(Label.loadingLabel);
$("#tipMsg").text("");
var pageContent = admin.editorPage.getContent();
var pagePermalink = $("#pagePermalink").val().replace(/(^\s*)|(\s*$)/g, "");
if (admin.pageList.type === "link") {
pagePermalink = Util.proessURL(pagePermalink);
}
var requestJSONObject = {
"page": {
"pageTitle": $("#pageTitle").val(),
"oId": this.id,
"pageContent": pageContent,
"pagePermalink": pagePermalink,
"pageCommentable": $("#pageCommentable").prop("checked"),
"pageType": admin.pageList.type,
"pageOpenTarget": $("#pageTarget").val()
}
};
$.ajax({
url: latkeConfig.servePath + "/console/page/",
type: "PUT",
cache: false,
data: JSON.stringify(requestJSONObject),
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
admin.pageList.id = "";
admin.pageList.getList(admin.pageList.pageInfo.currentPage);
$("#pageTitle").val("");
$("#pagePermalink").val("");
$("#pageCommentable").prop("cheked", false);
$("#pageTarget").val("_self");
$($(".fn-type").get(0)).click();
admin.editorPage.setContent("");
$("#loadMsg").text("");
}
});
}
},
/*
* 验证字段
*/
validate: function () {
if ($("#pageTitle").val().replace(/\s/g, "") === "") {
$("#tipMsg").text(Label.titleEmptyLabel);
$("#pageTitle").focus();
} else if (admin.pageList.type === "link" &&
$("#pagePermalink").val().replace(/\s/g, "") === "") {
$("#tipMsg").text(Label.linkEmptyLabel);
} else {
return true;
}
return false;
},
/*
* 提交自定义页面
*/
submit: function () {
if (this.id !== "") {
this.update();
} else {
this.add();
}
},
/*
* 调换顺序
*/
changeOrder: function (id, order, status) {
$("#loadMsg").text(Label.loadingLabel);
$("#tipMsg").text("");
var requestJSONObject = {
"oId": id.toString(),
"direction": status
};
$.ajax({
url: latkeConfig.servePath + "/console/page/order/",
type: "PUT",
cache: false,
data: JSON.stringify(requestJSONObject),
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
// Refershes the page list
admin.pageList.getList(admin.pageList.pageInfo.currentPage);
$("#loadMsg").text("");
}
});
}
};
/*
* 注册到 admin 进行管理
*/
admin.register["page-list"] = {
"obj": admin.pageList,
"init": admin.pageList.init,
"refresh": admin.pageList.getList
>>>>>>> origin/0.4.6
}
\ No newline at end of file
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -220,4 +221,275 @@ admin.register["preference"] = {
"refresh": function () {
$("#loadMsg").text("");
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* preference for admin.
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @author <a href="mailto:DL88250@gmail.com">Liang Ding</a>
* @version 1.0.1.5, Jun 26, 2012
*/
/* preference 相关操作 */
admin.preference = {
locale: "",
editorType: "",
/*
* 初始化
*/
init: function () {
$("#tabPreference").tabs();
$.ajax({
url: latkeConfig.servePath + "/console/preference/",
type: "GET",
cache: false,
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
var preference = result.preference;
// 线上环境严禁使用 localhost, 默认将其设为 host
if (preference.blogHost.indexOf("localhost") > -1 && Label.miniPostfix === ".min") {
preference.blogHost = window.location.host;
$("#tipMsg").text(Label.resetBlogHostLabel);
}
$("#metaKeywords").val(preference.metaKeywords),
$("#metaDescription").val(preference.metaDescription),
$("#blogTitle").val(preference.blogTitle),
$("#blogSubtitle").val(preference.blogSubtitle),
$("#mostCommentArticleDisplayCount").val(preference.mostCommentArticleDisplayCount);
$("#mostViewArticleDisplayCount").val(preference.mostViewArticleDisplayCount),
$("#recentCommentDisplayCount").val(preference.recentCommentDisplayCount);
$("#mostUsedTagDisplayCount").val(preference.mostUsedTagDisplayCount);
$("#articleListDisplayCount").val(preference.articleListDisplayCount);
$("#articleListPaginationWindowSize").val(preference.articleListPaginationWindowSize);
$("#blogHost").val(preference.blogHost);
$("#localeString").val(preference.localeString);
$("#timeZoneId").val(preference.timeZoneId);
$("#noticeBoard").val(preference.noticeBoard);
$("#htmlHead").val(preference.htmlHead);
$("#externalRelevantArticlesDisplayCount").val(preference.externalRelevantArticlesDisplayCount);
$("#relevantArticlesDisplayCount").val(preference.relevantArticlesDisplayCount);
$("#randomArticlesDisplayCount").val(preference.randomArticlesDisplayCount);
$("#keyOfSolo").val(preference.keyOfSolo);
preference.enableArticleUpdateHint ? $("#enableArticleUpdateHint").attr("checked", "checked") : $("#enableArticleUpdateHint").removeAttr("checked");
preference.allowVisitDraftViaPermalink ? $("#allowVisitDraftViaPermalink").attr("checked", "checked") : $("allowVisitDraftViaPermalink").removeAttr("checked");
admin.preference.locale = preference.localeString;
admin.preference.editorType = preference.editorType;
// skin
$("#skinMain").data("skinDirName", preference.skinDirName);
var skins = eval('(' + preference.skins + ')');
var skinsHTML = "";
for (var i = 0; i < skins.length; i++) {
if (skins[i].skinName === preference.skinName
&& skins[i].skinDirName === preference.skinDirName ) {
skinsHTML += "<div title='" + skins[i].skinDirName
+ "' class='left skinItem selected'><img class='skinPreview' src='skins/"
+ skins[i].skinDirName + "/preview.png'/><div>" + skins[i].skinName + "</div></div>"
} else {
skinsHTML += "<div title='" + skins[i].skinDirName
+ "' class='left skinItem'><img class='skinPreview' src='skins/"
+ skins[i].skinDirName + "/preview.png'/><div>" + skins[i].skinName + "</div></div>"
}
}
$("#skinMain").append(skinsHTML + "<div class='clear'></div>");
$(".skinItem").click(function () {
$(".skinItem").removeClass("selected");
$(this).addClass("selected");
$("#skinMain").data("skinDirName", this.title);
});
// sign
var signs = eval('(' + preference.signs + ')');
for (var j = 1; j < signs.length; j++) {
$("#preferenceSign" + j).val(signs[j].signHTML);
$("#preferenceSignButton" + j).tip({
content: signs[j].signHTML === "" ? Label.signIsNullLabel : signs[j].signHTML.replace(/\n/g, "").replace(/<script.*<\/script>/ig, ""),
position: "bottom"
});
}
// Article list style
$("#articleListDisplay").val(preference.articleListStyle);
// Editor Type
$("#editorType").val(preference.editorType);
// Feed output mode
$("#feedOutputMode").val(preference.feedOutputMode);
// Commentable
preference.commentable ? $("#commentable").attr("checked", "checked") : $("commentable").removeAttr("checked");
$("#loadMsg").text("");
}
});
},
/*
* @description 参数校验
*/
validate: function () {
if (!/^\d+$/.test($("#mostUsedTagDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.indexTagDisplayCntLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#mostUsedTagDisplayCount").focus();
return false;
} else if (!/^\d+$/.test($("#recentCommentDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.indexRecentCommentDisplayCntLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#recentCommentDisplayCount").focus();
return false;
} else if (!/^\d+$/.test($("#mostCommentArticleDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.indexMostCommentArticleDisplayCntLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#mostCommentArticleDisplayCount").focus();
return false;
} else if (!/^\d+$/.test($("#mostViewArticleDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.indexMostViewArticleDisplayCntLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#mostViewArticleDisplayCount").focus();
return false;
} else if (!/^\d+$/.test($("#articleListDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.pageSizeLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#articleListDisplayCount").focus();
return false;
} else if (!/^\d+$/.test($("#articleListPaginationWindowSize").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.windowSizeLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#articleListPaginationWindowSize").focus();
return false;
} else if (!/^\d+$/.test($("#randomArticlesDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.randomArticlesDisplayCntLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#randomArticlesDisplayCount").focus();
return false;
} else if (!/^\d+$/.test($("#relevantArticlesDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.relevantArticlesDisplayCntLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#relevantArticlesDisplayCount").focus();
return false;
} else if (!/^\d+$/.test($("#externalRelevantArticlesDisplayCount").val())) {
$("#tipMsg").text("[" + Label.paramSettingsLabel + " - " + Label.externalRelevantArticlesDisplayCntLabel + "] " + Label.nonNegativeIntegerOnlyLabel);
$("#externalRelevantArticlesDisplayCount").focus();
return false;
}
return true;
},
/*
* @description 更新
*/
update: function () {
if (!admin.preference.validate()) {
return;
}
$("#tipMsg").text("");
$("#loadMsg").text(Label.loadingLabel);
var signs = [{
"oId": 0,
"signHTML": ""
}, {
"oId": 1,
"signHTML": $("#preferenceSign1").val()
}, {
"oId": 2,
"signHTML": $("#preferenceSign2").val()
}, {
"oId": 3,
"signHTML": $("#preferenceSign3").val()
}];
var requestJSONObject = {
"preference": {
"metaKeywords": $("#metaKeywords").val(),
"metaDescription": $("#metaDescription").val(),
"blogTitle": $("#blogTitle").val(),
"blogSubtitle": $("#blogSubtitle").val(),
"mostCommentArticleDisplayCount": $("#mostCommentArticleDisplayCount").val(),
"mostViewArticleDisplayCount": $("#mostViewArticleDisplayCount").val(),
"recentCommentDisplayCount": $("#recentCommentDisplayCount").val(),
"mostUsedTagDisplayCount": $("#mostUsedTagDisplayCount").val(),
"articleListDisplayCount": $("#articleListDisplayCount").val(),
"articleListPaginationWindowSize": $("#articleListPaginationWindowSize").val(),
"skinDirName": $("#skinMain").data("skinDirName"),
"blogHost": $("#blogHost").val(),
"localeString": $("#localeString").val(),
"timeZoneId": $("#timeZoneId").val(),
"noticeBoard": $("#noticeBoard").val(),
"htmlHead": $("#htmlHead").val(),
"externalRelevantArticlesDisplayCount": $("#externalRelevantArticlesDisplayCount").val(),
"relevantArticlesDisplayCount": $("#relevantArticlesDisplayCount").val(),
"randomArticlesDisplayCount": $("#randomArticlesDisplayCount").val(),
"enableArticleUpdateHint": $("#enableArticleUpdateHint").prop("checked"),
"signs": signs,
"keyOfSolo": $("#keyOfSolo").val(),
"allowVisitDraftViaPermalink": $("#allowVisitDraftViaPermalink").prop("checked"),
"articleListStyle": $("#articleListDisplay").val(),
"editorType": $("#editorType").val(),
"feedOutputMode": $("#feedOutputMode").val(),
"commentable": $("#commentable").prop("checked")
}
};
$.ajax({
url: latkeConfig.servePath + "/console/preference/",
type: "PUT",
cache: false,
data: JSON.stringify(requestJSONObject),
success: function(result, textStatus){
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
if ($("#localeString").val() !== admin.preference.locale ||
$("#editorType").val() !== admin.preference.editorType) {
window.location.reload();
}
// update article and preferences signs
for (var i = 1; i < signs.length; i++) {
if ($("#articleSign" + signs[i].oId).length === 1) {
$("#articleSign" + signs[i].oId).tip("option", "content",
signs[i].signHTML === "" ? Label.signIsNullLabel : signs[i].signHTML.replace(/\n/g, "").replace(/<script.*<\/script>/ig, ""));
}
$("#preferenceSignButton" + signs[i].oId).tip("option", "content",
signs[i].signHTML === "" ? Label.signIsNullLabel : signs[i].signHTML.replace(/\n/g, "").replace(/<script.*<\/script>/ig, ""));
}
$("#loadMsg").text("");
}
});
}
};
/*
* 注册到 admin 进行管理
*/
admin.register["preference"] = {
"obj": admin.preference,
"init": admin.preference.init,
"refresh": function () {
$("#loadMsg").text("");
}
>>>>>>> origin/0.4.6
}
\ No newline at end of file
<<<<<<< HEAD
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
......@@ -110,4 +111,119 @@ $.extend(TablePaginate.prototype, {
});
this.currentPage = currentPage;
}
=======
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* table and paginate util
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.0.8, Jun 11, 2012
*/
var TablePaginate = function (id) {
this.id = id;
this.currentPage = 1;
};
$.extend(TablePaginate.prototype, {
/*
* 构建 table 框架
* @colModel table 列宽,标题等数据
*/
buildTable: function (colModel, noExpend) {
var tableData = {
colModel: colModel,
noDataTip: Label.noDataLabel
}
if (!noExpend) {
tableData.expendRow = {
index: "expendRow"
}
}
$("#" + this.id + "Table").table(tableData);
},
/*
* 初始化分页
*/
initPagination: function () {
var id = this.id;
$("#" + id + "Pagination").paginate({
"bind": function(currentPage, errorMessage) {
if (errorMessage) {
$("#tipMsg").text(errorMessage);
} else {
admin.setHashByPage(currentPage);
}
},
"currentPage": 1,
"errorMessage": Label.inputErrorLabel,
"nextPageText": Label.nextPagePabel,
"previousPageText": Label.previousPageLabel,
"goText": Label.gotoLabel,
"type": "custom",
"custom": [1],
"pageCount": 1
});
},
/*
* 初始化评论对话框
*/
initCommentsDialog: function () {
var that = this;
$("#" + this.id + "Comments").dialog({
"modal": true,
"hideFooter": true,
"close": function () {
admin[that.id + "List"].getList(that.currentPage);
return true;
}
});
},
/*
* 更新 table & paginateion
*/
updateTablePagination: function (data, currentPage, pageInfo) {
currentPage = parseInt(currentPage);
if (currentPage > pageInfo.paginationPageCount && currentPage > 1) {
$("#tipMsg").text(Label.pageLabel + currentPage + Label.notFoundLabel);
$("#loadMsg").text("");
return;
}
$("#" + this.id + "Table").table("update", {
data: [{
groupName: "all",
groupData: data
}]
});
if (pageInfo.paginationPageCount === 0) {
pageInfo.paginationPageCount = 1;
}
$("#" + this.id + "Pagination").paginate("update", {
pageCount: pageInfo.paginationPageCount,
currentPage: currentPage,
custom: pageInfo.paginationPageNums
});
this.currentPage = currentPage;
}
>>>>>>> origin/0.4.6
});
\ No newline at end of file
<<<<<<< HEAD
/*
* Copyright (C) 2010,2011, Liyuan Li
*
......@@ -19,4 +20,27 @@
(function($){$.fn.extend({dialog:{version:"0.0.1.5",author:"lly219@gmail.com"}});var m=new Date().getTime();var n='dialog';var o=function(){this._defaults={"styleClass":{"background":"dialog-background","panel":"dialog-panel","main":"dialog-main","footer":"dialog-footer","headerLeft":"dialog-header-left","headerRight":"dialog-header-right","headerMiddle":"dialog-header-middle","headerBg":"dialog-header-bg","closeIcon":"dialog-close-icon","closeIconHover":"dialog-close-icon-hover","title":"dialog-title","buttonRight":"dialog-button-right"}}};$.extend(o.prototype,{_attach:function(a,b){if(!a.id){this.uuid++;a.id='dp'+this.uuid}var c=this._newInst($(a));c.settings=$.extend({},b||{});$.data(a,n,c);this._init(a)},_newInst:function(a){var b=a[0].id.replace(/([^A-Za-z0-9_])/g,'\\\\$1');return{id:b}},_getInst:function(a){try{return $.data(a,n)}catch(err){throw'Missing instance data for this dialog';}},_destroyDialog:function(a){var b=$.dialog._getInst(a);var c=b.id;$.removeData(a,n);$(a).prependTo("#"+c+"Wrap").unwrap();$(a).removeAttr("style");var d=this._getDefaults($.dialog._defaults,b.settings,"styleClass");$("."+d.background).remove();$("#"+c+"Dialog").remove()},_init:function(b){var c=this._getInst(b);var d=c.id,settings=c.settings;var e=this._getDefaults($.dialog._defaults,settings,"styleClass"),height=settings.height,width=settings.width;settings.title=settings.title?settings.title:"";settings.okText=settings.okText?settings.okText:"Ok";settings.cancelText=settings.cancelText?settings.cancelText:"Cancel";var f="",headerHTML="<div class='"+e.headerLeft+"'></div><div class='"+e.headerBg+"' style='width: "+(width+24)+"px;'><div class='"+e.title+"'>"+settings.title+"</div><a href='javascript:void(0);' class='"+e.closeIcon+"'></a></div><div class='"+e.headerRight+"'></div><div class='clear'></div>";if(!settings.hideFooter){f="<a href='javascript:void(0);'><span>"+settings.okText+"</span><span class='"+e.buttonRight+"'></span></a><a href='javascript:void(0);'><span>"+settings.cancelText+"</span><span class='"+e.buttonRight+"'></span></a>"}var g="<div id='"+d+"Dialog' class='"+e.panel+"' style='width: "+(width+26)+"px;' onselectstart='return false;'><div>"+headerHTML+"</div><div class='"+e.main+"'><div style='overflow: auto; height: "+height+"px; width: "+width+"px;'></div><div class='"+e.footer+"'>"+f+"</div><div class='clear'></div></div>";var h="";if(settings.modal&&$("."+e.background).length===0){var i=$(window).height()<$("body").height()?$("body").height():$(window).height();h="<div style='height:"+i+"px;' class='"+e.background+"'></div>"}$("#"+d).wrap("<div id='"+d+"Wrap'></div>");var j=$(b).clone(true);$(b).remove();$('body').append(h+g);$($("#"+d+"Dialog ."+e.main+" div").get(0)).append(j);$(j).show();var k="",left="",$dialog=$("#"+d+"Dialog");if(settings.position){k=settings.position.top;left=settings.position.left}else{k=($(window).height()-$dialog.height())/2;left=($(window).width()-$dialog.width())/2}$dialog.css({"top":k+"px","left":left+"px"});$("#"+d+"Dialog ."+e.closeIcon).bind("click",function(){$.dialog._close(d,settings)});var l=$("#"+d+"Dialog ."+e.footer+" a");$(l.get(1)).bind("click",function(){$.dialog._close(d,settings)});$(l.get(0)).bind("click",function(){if(settings.ok===undefined||settings.ok()){$.dialog._close(d,settings)}});this._bindMove(d,e.headerBg,height,width);$(window).resize(function(){var a=$(window).height()<document.documentElement.clientHeight?document.documentElement.clientHeight:$(window).height();$("."+e.background).height(a)});$(window).keyup(function(a){if(a.keyCode===27){$.dialog._close(d,settings)}})},_bindMove:function(f,g){$("#"+f+"Dialog ."+g).mousedown(function(c){var d=document;if(!c){c=window.event}var e=document.getElementById(f+"Dialog");var x=c.clientX-parseInt(e.style.left),y=c.clientY-parseInt(e.style.top);d.ondragstart="return false;";d.onselectstart="return false;";d.onselect="document.selection.empty();";if(this.setCapture){this.setCapture()}else if(window.captureEvents){window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP)}d.onmousemove=function(a){if(!a){a=window.event}var b=a.clientX-x,positionY=a.clientY-y;if(b<0){b=0}if(b>$(window).width()-$(e).width()){b=$(window).width()-$(e).width()}if(positionY<0){positionY=0}if(positionY>$(window).height()-$(e).height()){positionY=$(window).height()-$(e).height()}e.style.left=b+"px";e.style.top=positionY+"px"};d.onmouseup=function(){if(this.releaseCapture){this.releaseCapture()}else if(window.captureEvents){window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP)}d.onmousemove=null;d.onmouseup=null;d.ondragstart=null;d.onselectstart=null;d.onselect=null}})},_close:function(a,b){if(b.close===undefined||b.close()){$("#"+a+"Dialog").hide();if(b.modal){var c=this._getDefaults($.dialog._defaults,b,"styleClass");$("."+c.background).hide()}}},_closeDialog:function(a){var b=this._getInst(a);var c=b.id,settings=b.settings;$.dialog._close(c,settings)},_openDialog:function(a){var b=this._getInst(a);var c=b.id,settings=b.settings;$("#"+c+"Dialog").show();if(settings.modal){var d=this._getDefaults($.dialog._defaults,settings,"styleClass");$("."+d.background).show()}},_updateDialog:function(a,b){var c=this._getInst(a);var d=c.id,settings=c.settings;var e=this._getDefaults($.dialog._defaults,settings,"styleClass");$.extend(settings,b);var f=$("#"+d+"Dialog");if(b.position){f.css({"top":b.position.top,"left":b.position.left})}if(b.width){f.width(b.width+26);f.find("."+e.main+" div")[0].style.width=b.width+"px";f.find("."+e.headerBg).width(b.width+18)}if(b.height){f.find("."+e.main+" div")[0].style.height=b.height+"px"}if(b.title){f.find("."+e.title).html(b.title)}if(b.modal!==undefined){if(b.modal){$("."+e.background).show()}else{$("."+e.background).hide()}}if(b.hideFooter!==undefined){if(b.hideFooter){f.find("."+e.footer).hide()}else{f.find("."+e.footer).show()}}},_getDefaults:function(a,b,c){if(c==="styleClass"){if(b.theme==="default"||b.theme===undefined){return a.styleClass}b.styleClass={};for(var d in a[c]){b.styleClass[d]=b.theme+"-"+a.styleClass[d]}}else if(c==="height"||c==="width"){if(b[c]===null||b[c]===undefined){return"auto"}else{return b[c]+"px"}}else{if(b[c]===null||b[c]===undefined){return a[c]}}return b[c]}});$.fn.dialog=function(a){var b=Array.prototype.slice.call(arguments);if(typeof a==='string'){b.shift();return $.dialog['_'+a+'Dialog'].apply($.dialog,[this[0]].concat(b))}return this.each(function(){$.dialog._attach(this,a)})};$.dialog=new o();window['DP_jQuery_'+m]=$})(jQuery);
(function($){var j=new Date().getTime();var k='completed';var l=function(){this._defaults={"styleClass":{"panelClass":"completed-panel","inputClass":"completed-input","ckClass":"completed-ck"},"separator":","},this._settingsDataFormat={}};$.extend(l.prototype,{_attach:function(a,b){if(!a.id){this.uuid++;a.id='dp'+this.uuid}var c=this._newInst($(a));c.settings=$.extend({"buttonText":"\u9009\u62e9"},b||{});$.data(a,k,c);this._init(a)},_newInst:function(a){var b=a[0].id.replace(/([^A-Za-z0-9_])/g,'\\\\$1');return{"id":b}},_getInst:function(a){try{return $.data(a,k)}catch(err){throw'Missing instance data for this completed';}},_destroyCompleted:function(){},_init:function(b){var c=this._getInst(b);var d=c.id,settings=c.settings;this._buildHTML(d,settings);$(document).click(function(a){if(a.target.id!==d){$("#"+d+"SelectedPanel").hide()}});this._buildCheckboxPanel(d,settings.data)},_buildHTML:function(b,c){var d=c.height+"px",classStyle=this._getDefaults($.completed._defaults,c,"styleClass");var e=$("#"+b);var f="<button onclick=\"$('#"+b+"CheckboxPanel').toggle()\">"+c.buttonText+"</button><div id='"+b+"SelectedPanel' class='"+classStyle.panelClass+"' style='height:"+d+";'></div><div class='none "+classStyle.ckClass+"' id='"+b+"CheckboxPanel'><div>";c.data.sort();e.after(f).bind("keyup",{settings:c},this._keyupAction).bind("keydown",function(a){c.chinese=a.keyCode}).addClass(classStyle.inputClass).width(e.width()-78);var g=$("#"+b+"SelectedPanel");c.tipNum=0;g.width(e.width()+2)},_keyupAction:function(a){var b=a.data.settings,currentWordObj=$.completed._getCurrentWord(this,b);if(currentWordObj.currentWord===""||a.keyCode===27||a.keyCode===16||a.keyCode===16){$("#"+this.id+"SelectedPanel").hide();b.tipNum=0;return}var c=$.completed._getMatchData(b.data,this.value,currentWordObj.currentWord);if(a.keyCode===38){if(b.tipNum>0){b.tipNum--}else{b.tipNum=c.length-1}}if(a.keyCode===40){if(b.tipNum<c.length-1){b.tipNum++}else{b.tipNum=0}}$.completed._buildSelectedPanel(this.id,c,b,currentWordObj.currentWord);if(a.keyCode===13&&c[b.tipNum]&&b.chinese!==229){var d=this.value;this.value=d.substring(0,currentWordObj.startPos)+c[b.tipNum]+d.substring(currentWordObj.endPos,d.length);$("#"+this.id+"SelectedPanel").hide();b.chinese=undefined}if(a.keyCode!==38&&a.keyCode!==40){b.tipNum=0}},_getCurrentWord:function(a,b){var c=$(a).val(),tag=true,endPos=0,startPos=0,separator=$.completed._defaults.separator;if(c===""){return{currentWord:"",startPos:startPos,endPos:endPos}}if(document.selection){try{var d=document.selection.createRange();var f=a.createTextRange();f.collapse(true);f.select();var g=document.selection.createRange();g.setEndPoint("EndToEnd",d);b.curPos=g.text.length;d.select()}catch(e){delete e}}else{b.curPos=a.selectionStart}var h=b.curPos;for(var i=0;i<c.length;i++){if(c.charAt(i)===separator){if(i>=h&&tag){endPos=i;tag=false}}}if(tag===true){tag=false;endPos=c.length}for(var j=endPos;j>-1;j--){if(c.charAt(j)===separator){if(j<h&&!tag){startPos=j+1;tag=true}}}return{currentWord:c.substring(startPos,endPos),startPos:startPos,endPos:endPos}},_getMatchData:function(a,b,c){var d=b.split($.completed._defaults.separator);var e=[];for(var i=0;i<a.length;i++){if(typeof a[i]==="number"){a[i]=a[i].toString()}if(a[i].toLowerCase().indexOf(c.toLowerCase())>-1){var f=true;for(var k=0;k<d.length;k++){if(a[i]===d[k].toString()&&a[i].toLowerCase()!==c.toLowerCase()){f=false}}if(f){e.push(a[i])}}}return e},_mousemoveSelectPanel:function(a,i,b){$(a).parent().find("a").removeClass("selected");a.className='selected';var c=$.completed._getInst(document.getElementById(b));c.settings.tipNum=i},_buildSelectedPanel:function(e,f,g,h){var j=$("#"+e+"SelectedPanel");if(f.length===0){j.html("").hide();return}if(g.tipNum>=f.length){g.tipNum=0}var k="";for(var i=0;i<f.length;i++){var l="",highlightHTML=f[i].replace(h,"<b>"+h+"</b>");if(g.tipNum===i){l="class='selected'"}k+="<a href='javascript:void(0);' onmousemove=\"$.completed._mousemoveSelectPanel(this, "+i+", '"+e+"');\" "+l+">"+highlightHTML+"</a>"}j.html(k).show();var m=$("#"+e+"SelectedPanel a.selected");if(m.position().top+j.scrollTop()>50-m.height()){j.scrollTop(m.position().top+j.scrollTop()+m.height()-50)}if(m.position().top<0){j.scrollTop(j.scrollTop-m.height())}$("#"+e+"SelectedPanel a").click(function(){var a=document.getElementById(e);var b=$.completed._getCurrentWord(document.getElementById(e),g);var c=$.completed._getMatchData(g.data,a.value,b.currentWord);var d=a.value;a.value=d.substring(0,b.startPos)+c[g.tipNum]+d.substring(b.endPos,d.length);g.tipNum=0;$(a).focus()})},_buildCheckboxPanel:function(c,d){var e="",$input=$("#"+c);for(var i=0;i<d.length;i++){e+="<span>"+d[i]+"</span>"}$("#"+c+"CheckboxPanel").html(e+"<div class='clear'></div>");$("#"+c+"CheckboxPanel"+" span").click(function(){var a=$input.val(),currentVal=this.innerHTML;if(this.className==="selected"){this.className="";var b=a.substr(a.indexOf(currentVal)+currentVal.length,1);if(currentVal===a||b!==","){$input.val(a.replace(currentVal,""))}else{$input.val(a.replace(currentVal+",",""))}}else{this.className="selected";if(a.replace(/\s/g,"")===""||a.substr(a.length-1,1)===","){$input.val(a+currentVal)}else{$input.val(a+","+currentVal)}}});this._matchChecked(c);$input.blur(function(){$.completed._matchChecked(c)})},_matchChecked:function(a){var b=$("#"+a).val().split(",");$("#"+a+"CheckboxPanel span").removeClass().each(function(){for(var i=0;i<b.length;i++){if(this.innerHTML===b[i]){this.className="selected"}}})},_getDefaults:function(a,b,c){if(c==="styleClass"){if(b.theme==="default"||b.theme===undefined){return a.styleClass}b.styleClass={};for(var d in a[c]){b.styleClass[d]=b.theme+"-"+a.styleClass[d]}}else if(c==="height"||c==="width"){if(b[c]===null||b[c]===undefined){return"auto"}else{return b[c]+"px"}}else{if(b[c]===null||b[c]===undefined){return a[c]}}return b[c]}});$.fn.completed=function(a){var b=Array.prototype.slice.call(arguments);return this.each(function(){typeof a=='string'?$.completed['_'+a+'Completed'].apply($.completed,[this].concat(b)):$.completed._attach(this,a)})};$.completed=new l();window['DP_jQuery_'+j]=$})(jQuery);
(function($){$.fn.extend({tip:{version:"0.0.0.3",author:"lly219@gmail.com"}});var f=new Date().getTime();var g='tip';var h=function(){this._defaults={"styleClass":{"panel":"tip-panel"}},this._settingsDataFormat={}};$.extend(h.prototype,{_attach:function(a,b){if(!a.id){this.uuid++;a.id='dp'+this.uuid}var c=this._newInst($(a));c.settings=$.extend({},b||{});$.data(a,g,c);this._init(a)},_newInst:function(a){var b=a[0].id.replace(/([^A-Za-z0-9_])/g,'\\\\$1');return{id:b}},_getInst:function(a){try{return $.data(a,g)}catch(err){throw'Missing instance data for this tip.';}},_destroyTip:function(a){$.removeData(a,g);$("#"+a.id+"Panel").remove()},_init:function(a){var b=this._getInst(a);var c=b.id,settings=b.settings;var d='',styleClass=settings.className?settings.className:this._getDefaults($.tip._defaults,settings,"styleClass").panel;d="<div id='"+c+"Panel' class='"+styleClass+"'>"+settings.content+"</div>";$(settings.appendId?"#"+settings.appendId:"body").append(d);$(a).hover(function(){$.tip._parsePosition(settings,a);$("#"+c+"Panel").fadeIn("normal")},function(){$("#"+c+"Panel").fadeOut("normal")})},_optionTip:function(a,b,c){var d=$.tip._getInst(a[0]);var e=d.settings;if(c){e[b]=c;$("#"+a[0].id+"Panel").html(c)}return e[b]},_parsePosition:function(a,b){var c="",$targetPanel=$("#"+b.id+"Panel");if(a.left===undefined&&a.right===undefined&&a.bottom===undefined&&a.top===undefined&&a.position===undefined){a.position="bottom"}if(a.position){var d=$(b);switch(a.position){case"top":c="left: "+parseInt(d.position().left)+"px; top: "+parseInt(d.position().top-$targetPanel.height()-6-parseInt(d.css("padding-top"))-parseInt($targetPanel.css("padding-top")))+"px;";break;case"bottom":c="left: "+parseInt(d.position().left)+"px; top: "+parseInt(d.position().top+d.height())+"px;";break;default:alert("Has no type!");break}$targetPanel.attr("style",c);return}if(a.left!==undefined){c+="left:"+a.left+"px;"}if(a.top!==undefined){c+="top:"+a.top+"px;"}if(a.bottom!==undefined){c+="bottom:"+a.bottom+"px;"}if(a.right!==undefined){c+="right:"+a.right+"px;"}$targetPanel.attr("style",c)},_getDefaults:function(a,b,c){if(c==="styleClass"){if(b.theme==="default"||b.theme===undefined){return a.styleClass}b.styleClass={};for(var d in a[c]){b.styleClass[d]=b.theme+"-"+a.styleClass[d]}}else if(c==="height"||c==="width"){if(b[c]===null||b[c]===undefined){return"auto"}else{return b[c]+"px"}}else{if(b[c]===null||b[c]===undefined){return a[c]}}return b[c]}});$.fn.tip=function(a){var b=Array.prototype.slice.call(arguments);if(a==="option"){b.shift();return $.tip['_'+a+'Tip'].apply($.tip,[this].concat(b))}return this.each(function(){typeof a=='string'?$.tip['_'+a+'Tip'].apply($.tip,[this].concat(b)):$.tip._attach(this,a)})};$.tip=new h();window['DP_jQuery_'+f]=$})(jQuery);
=======
/*
* Copyright (C) 2010,2011, Liyuan Li
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function(a){var b=function(){};a.extend(b.prototype,{bowknot:{version:"0.0.0.9",author:"lly219@gmail.com"},getDate:function(a,b){var c=new Date(a);var d=c.getFullYear().toString().substr(2,2),e=c.getMonth()+1,f=c.getDate(),g=c.getHours(),h=c.getSeconds(),i=c.getMinutes();switch(b){case undefined:return e+"/"+f+"/"+d;break;case 1:return e+"/"+f+"/"+d+" "+g+":"+i+":"+h;break;default:return false;break}}});a.bowknot=new b})(jQuery);
(function($){$.fn.extend({paginate:{version:"0.0.0.8",author:"lly219@gmail.com"}});var dpuuid=new Date().getTime();var PROP_NAME="paginate";var Paginate=function(){this._defaults={"styleClass":{"pageCountClass":"paginate-pageCount","goPageClass":"paginate-goPage","inputPageClass":"paginate-inputPage","goPageHoverClass":"paginate-goPageHover","prePageClass":"paginate-prePage","nextPageClass":"paginate-nextPage","prePageDisableClass":"paginate-prePageDisable","nextPageDisableClass":"paginate-nextPageDisable","prePageHoverClass":"paginate-prePageHover","nextPageHoverClass":"paginate-nextPageHover","paginateClass":"paginate-paginate"}}};$.extend(Paginate.prototype,{_attach:function(target,settings){if(!target.id){this.uuid++;target.id="dp"+this.uuid}var inst=this._newInst($(target));inst.settings=$.extend({"errorMessage":"input error!"},settings||{});$.data(target,PROP_NAME,inst);this._init(target)},_newInst:function(target){var id=target[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1");return{id:id}},_getInst:function(target){try{return $.data(target,PROP_NAME)}catch(err){throw"Missing instance data for this paginate";}},_init:function(target){var inst=this._getInst(target);var id=inst.id,settings=inst.settings;$("#"+id).html("<div id='"+id+"Paginate' class='"+this._getDefaults($.paginate._defaults,settings,"styleClass").paginateClass+"'></div>");this._build(target)},_build:function(target){var inst=this._getInst(target);var id=inst.id,settings=inst.settings;var styleClass=this._getDefaults(this._defaults,settings,"styleClass"),pageCount=settings.pageCount,currentPage=settings.currentPage;var prePageHTML="<$tagStart class='button paginate-page'> <span class='button-left'></span> <span class='button-bg'>"+settings.previousPageText+"</span> <span class='button-right'></span> </$tagEnd>",nextPageHTML="<$tagStart class='button paginate-page'> <span class='button-left'></span> <span class='button-bg'>"+settings.nextPageText+"</span> <span class='button-right'></span> </$tagEnd>",pagesHTML="",pageCountHTML="<span class='"+styleClass.pageCountClass+"'>"+currentPage+"/"+pageCount+"</span>",goToPageHTML="<div class='button'> <span class='button-left'></span> <span class='button-bg'> <input class='"+styleClass.inputPageClass+"' id='"+id+"PaginateInput'/> </span> <span class='button-right'></span> </div> <a href='javascript:void(0);' class='button' id='"+id+"PaginateSubmit'> <span class='button-left'></span> <span class='button-bg'>"+settings.goText+"</span> <span class='button-right'></span> </a>";if(currentPage===1||currentPage===0){prePageHTML=prePageHTML.replace("$tagStart","div").replace("$tagEnd","div")}else{prePageHTML=prePageHTML.replace("$tagStart","a href='javascript:void(0)'").replace("$tagEnd","a")}if(currentPage!==pageCount){nextPageHTML=nextPageHTML.replace("$tagStart","a href='javascript:void(0)'").replace("$tagEnd","a")}else{nextPageHTML=nextPageHTML.replace("$tagStart","div").replace("$tagEnd","div")}switch(settings.type){case"taobao":var pages=this._getTaobaoPages(currentPage,pageCount),currentClass="";goToPageHTML="";for(var i=0;i<pages.length;i++){if(currentPage===pages[i].pageNum){currentClass=" pagination-current-page"}else{currentClass=""}pagesHTML+="<span data-page='"+pages[i].pageNum+"' class='pagination-pages"+currentClass+"'>"+pages[i].text+"</span>"}break;case"custom":var pages=settings.custom,currentClass="";for(var i=0;i<pages.length;i++){if(currentPage===pages[i]){currentClass=" pagination-current-page"}else{currentClass=""}pagesHTML+="<span data-page='"+pages[i]+"' class='pagination-pages"+currentClass+"'>"+pages[i]+"</span>"}break;default:break}if(pageCount===1){$("#"+id+"Paginate").html(pageCountHTML)}else{$("#"+id+"Paginate").html(prePageHTML+pagesHTML+nextPageHTML+pageCountHTML+goToPageHTML)}this._bindEvent(target)},_getTaobaoPages:function(currentPage,pageCount){var pagination=[],i=2,len=4,begin=3,end=0,maxEnd=0,pre=0;if(currentPage>=len){begin=currentPage-Math.ceil(len/2);maxEnd=currentPage+Math.ceil(len/2)+1;if(maxEnd<pageCount){end=maxEnd}else{end=pageCount}}else if(currentPage<len){maxEnd=currentPage+Math.ceil(len/2)+1;if(maxEnd<pageCount){end=maxEnd}else{end=pageCount}}if(begin<3){begin=3}for(i=begin;i<=end;i++){pagination.push({"pageNum":i,"text":i})}if(begin>3){pre=2+(begin-2);pagination.unshift({"pageNum":pre,"text":"..."})}if(pageCount<2){i=(currentPage===0)?0:1}else{i=2}for(;i>=1;i=i-1){pagination.unshift({"pageNum":i,"text":i})}if(end<pageCount){pre=end+Math.ceil(len/2);if(pre>pageCount){pre=pageCount}pagination.push({"pageNum":pre,"text":"..."})}return pagination},_bindEvent:function(target){var inst=this._getInst(target);var id=inst.id;$("#"+id+"PaginateInput").bind("keypress",{target:target},function(event){if(event.keyCode===13){$.paginate._goToPageAction(event)}});$("#"+id+"Paginate .pagination-pages").bind("click",{target:target,isPage:true},function(event){$.paginate._goToPageAction(event)});$("#"+id+"PaginateSubmit").bind("click",{target:target},this._goToPageAction);$("#"+id+"Paginate a.paginate-page").bind("click",{target:target,isPage:true},function(event){$.paginate._goToPageAction(event)})},_goToPageAction:function(event){var target=event.data.target;var inst=$.paginate._getInst(target);var id=inst.id,settings=inst.settings;var currentPage=$("#"+id+"PaginateInput").val();if(event.data.isPage){currentPage=settings.currentPage;var text=event.target.parentNode.innerText?event.target.parentNode.innerText:event.target.parentNode.text;if($.trim(text)===settings.previousPageText){currentPage--}else if($.trim(text)===settings.nextPageText){currentPage++}else{currentPage=parseInt($(event.target).data("page"))}}if(settings.currentPage===currentPage){return}var r=/^[0-9]*[1-9][0-9]*$/;if(currentPage>0&&currentPage<=settings.pageCount&&r.test(currentPage)){settings.bind(currentPage)}else{settings.bind(currentPage,settings.errorMessage);$("#"+id+"PaginateInput").val("")}},_updatePaginate:function(target,updateSettings){if(updateSettings){$.extend(this._getInst(target).settings,updateSettings)}this._build(target)},_getDefaults:function(defaults,settings,key){if(key==="styleClass"){if(settings.theme==="default"||settings.theme===undefined){return defaults.styleClass}settings.styleClass={};for(var styleName in defaults[key]){settings.styleClass[styleName]=settings.theme+"-"+defaults.styleClass[styleName]}}else if((key==="height"&&settings[key]!=="auto")||key==="width"){if(settings[key]===null||settings[key]===undefined){return defaults[key]+"px"}else{return settings[key]+"px"}}else{if(settings[key]===null||settings[key]===undefined){return defaults[key]}}return settings[key]},_destroyPaginate:function(){}});$.fn.paginate=function(options){var otherArgs=Array.prototype.slice.call(arguments);if(typeof options==='string'){otherArgs.shift();return $.paginate['_'+options+'Paginate'].apply($.paginate,[this[0]].concat(otherArgs))}return this.each(function(){$.paginate._attach(this,options)})};$.paginate=new Paginate();window["DP_jQuery_"+dpuuid]=$})(jQuery);
(function($){$.fn.extend({table:{version:"0.0.1.0",author:"lly219@gmail.com"}});var n=new Date().getTime();var o="table";var p=function(){this._defaults={"styleClass":{"lineSelectedClass":"table-lineSelected","mainClass":"table-main","bodyClass":"table-body","headerClass":"table-header","lineHoverClass":"table-lineHover","sortClass":"table-sort","sortASCClass":"table-sortASC","sortDESCClass":"table-sortDESC","sortUnASCClass":"table-sortUnactiveASC","sortUnDESCClass":"table-sortUnactiveDESC","oddRowClass":"table-oddRow","evenRowClass":"table-evenRow","subTitleClass":"table-subTitle","subTitleHoverClass":"table-subTitleHover","subTitleShowClass":"table-subTitleShow","subTitleHideClass":"table-subTitleHide","expendRowClass":"table-expendRow","hasExpendClass":"table-hasExpend"}}};$.extend(p.prototype,{_attach:function(a,b){if(!a.id){this.uuid++;a.id="dp"+this.uuid}var c=this._newInst($(a));c.settings=$.extend({length:0,noDataTip:"no data!",selectedRows:[]},b||{});$.data(a,o,c);this._init(a)},_newInst:function(a){var b=a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1");return{id:b}},_getInst:function(a){try{return $.data(a,o)}catch(err){throw"Missing instance data for this table";}},_init:function(a){var b=this._getInst(a),settings=b.settings;$(a).html("<div class='"+this._getDefaults(this._defaults,settings,"styleClass").mainClass+"' id='"+b.id+"Table'></div>");this._build(a)},_build:function(a){var b=this._getInst(a),settings=b.settings;var c=b.id;var d=this._getDefaults(this._defaults,settings,"styleClass");var e="<div id='"+c+"TableHeader' class='"+d.headerClass+"'></div>"+"<div id='"+c+"TableMain' class='"+d.bodyClass+"' style='height:"+(settings.height?settings.height+"px":"auto")+"'></div>";$("#"+c+"Table").html(e);this._buildHeader(a);if(settings.data){this._buildBody(a);this._bindEvent(a)}},_buildHeader:function(a){var b=this._getInst(a).settings;var c=b.colModel,id=this._getInst(a).id,headerHTML="<table cellpadding='0' cellspacing='0' style='width:100%'><tr>";for(var i=0;i<c.length;i++){var d=id+"_"+c[i].index;if(c[i].minWidth){headerHTML+="<th style='min-width:"+c[i].minWidth+"px;'>"}else{headerHTML+="<th style='width:"+c[i].width+"px;'>"}if(c[i].type==="checkbox"){if(c[i].isLabel){headerHTML+=c[i].text}else{headerHTML+="<input id='"+d+"' onclick=\"DP_jQuery_"+n+".table._selectHeaderCheckbox(this);\" type='checkbox'/></th>"}}else{headerHTML+="<span id='"+d+"'>"+c[i].text?c[i].text:""+"</span></th>"}}$("#"+id+"TableHeader").html(headerHTML+"</tr></table>")},_buildBody:function(a){var b=this._getInst(a).id,settings=this._getInst(a).settings,data=settings.data;var c=this._getDefaults(this._defaults,settings,"styleClass"),bodyHTML="";for(var d=0;d<data.length;d++){if(data[d].groupName!=="all"){bodyHTML+="<div id='"+b+"SubTitle"+d+"'class='"+c.subTitleClass+"'><div class='left "+c.subTitleShowClass+"'></div><div class='left'>"+data[d].groupName+"</div><div class='clear'></div></div>"}bodyHTML+="<table id="+b+"SubTable"+d+" style='width:100%;' cellpadding='0' cellspacing='0'>"+this._buildData(a,data[d].groupData,d)+"</table>"}$("#"+b+"TableMain").html(bodyHTML)},_buildData:function(a,b,c){var d=this._getInst(a).id,settings=this._getInst(a).settings;var e=settings.colModel,styleClass=this._getDefaults(this._defaults,settings,"styleClass");var f="";for(var i=0;i<b.length;i++){var g=b[i],tBodyHTML="<tbody class='$CLASS'>",trHTML="<tr>",rowClass=styleClass.oddRowClass;if(i%2===1){rowClass=styleClass.evenRowClass}if(settings.expendRow){trHTML='<tr class="'+styleClass.hasExpendClass+'">'}g.uuuid=settings.length++;for(var j=0;j<e.length;j++){var h=e[j].index;var k=g[h],styleHTML=e[j].align?"text-align:"+e[j].align+";":"";if(k===undefined||k===null||$.trim(k)===""){k="&nbsp;"}if(i===0){if(e[j].minWidth){styleHTML+="min-width:"+e[j].minWidth+"px;"}else{styleHTML+="width:"+e[j].width+"px;"}}trHTML+="<td style='"+styleHTML+"'>";if(e[j].type){var l="",isCheckedHTML="",isDisabledHTML="",inputId=d+"_"+h+"_"+c+"_"+i;if(g[h].value){isCheckedHTML="checked='checked'";tBodyHTML=tBodyHTML.replace("$CLASS",styleClass.lineSelectedClass+" "+rowClass);settings.selectedRows.push(g)}if(g[h].disabled){isDisabledHTML="disabled='disabled'"}l="<input name='"+d+"_"+h+"' id='"+inputId+"' type='"+e[j].type+"' onclick=\"DP_jQuery_"+n+".table._selectCheckbox(this);\" "+isCheckedHTML+" "+isDisabledHTML+"/>";k=l}if(e[j].style){k="<div style='"+e[j].style+"'>"+k+"</div>"}trHTML+=k+"</td>"}f+=tBodyHTML.replace("$CLASS",rowClass)+trHTML+"</tr>";if(settings.expendRow){var m=g[settings.expendRow.index];if(m===undefined){m=""}f+="<tr class='none "+styleClass.expendRowClass+" "+rowClass+"'><td colspan='"+e.length+"'>"+m+"</td></tr>"}f+="</tbody>"}if(b.length===0){f="<tbody><tr><td align='center' colspan='"+e.length+"'>"+settings.noDataTip+"</td></tr></tbody>"}return f},_bindEvent:function(b){var c=this._getInst(b);var d=c.id,settings=c.settings,colModel=c.settings.colModel,styleClass=this._getDefaults(this._defaults,settings,"styleClass"),data=settings.data;for(var e=0;e<data.length;e++){if(data[0].groupName!=="all"){$("#"+d+"SubTitle"+e).click(function(){var a=$(this).find("div")[0];if(a.className.indexOf(styleClass.subTitleShowClass)!=-1){a.className=a.className.replace(styleClass.subTitleShowClass,styleClass.subTitleHideClass);$(this).next().hide()}else{a.className=a.className.replace(styleClass.subTitleHideClass,styleClass.subTitleShowClass);$(this).next().show()}}).mouseover(function(){this.className=styleClass.subTitleHoverClass}).mouseout(function(){this.className=styleClass.subTitleClass})}var f=settings.bind?settings.bind:[],groupData=data[e].groupData;for(var m=0;m<groupData.length;m++){var g=$($("#"+d+"SubTable"+e+" tbody")[m]);for(var l=0;l<f.length;l++){g.bind(f[l].type,{"groupData":groupData[m],"bindNum":l},function(a){f[a.data.bindNum].action(a,a.data.groupData)})}g.mouseover(function(){if(!$(this).hasClass(styleClass.lineHoverClass)){$("#"+d+" tbody").each(function(){$(this).removeClass(styleClass.lineHoverClass);if($(this).find("tr").length===2){$(this).find("tr")[1].style.display="none"}});$(this).addClass(styleClass.lineHoverClass);if($(this).find("tr").length===2){if($.browser.msie){if($.browser.version>7){$(this).find("tr")[1].style.display="block"}}else{$(this).find("tr")[1].style.display="table-row"}}}});for(var j=0;j<colModel.length;j++){if(colModel[j].bind){var h=colModel[j].bind;for(var i=0;i<h.length;i++){$(g.find("td")[j]).bind(h[i].type,{"groupData":groupData[m],"bindNum":i,"colNum":j},function(a){colModel[a.data.colNum].bind[a.data.bindNum].action(a,a.data.groupData)})}}}}}},_selectHeaderCheckbox:function(a){var b=a.id.split("_")[0],index=a.id.split("_")[1];var c=$("#"+b).data(o).settings;var d=c.data,styleClass=this._getDefaults(this._defaults,c,"styleClass");for(var i=0;i<d.length;i++){var e=d[i].groupData;for(var j=0;j<e.length;j++){var f=$("#"+b+"_"+index+"_"+i+"_"+j);if(f.prop("disabled")===false){if(a.checked){c.selectedRows.push(e[j])}else{c.selectedRows.splice(j,1)}f.prop("checked",a.checked)}}}if(a.checked){$("#"+b+"TableMain tbody").addClass(styleClass.lineSelectedClass)}else{$("#"+b+"TableMain tbody").removeClass(styleClass.lineSelectedClass)}$.unique(c.selectedRows)},_selectCheckbox:function(a){var b=a.id.split("_")[0],index=a.id.split("_")[1],groupNum=a.id.split("_")[2],rowNum=a.id.split("_")[3];var c=$("#"+b).data(o).settings;var d=c.data,styleClass=this._getDefaults(this._defaults,c,"styleClass"),$checkbox=$("#"+b+"_"+index),$row=$($("#"+b+"SubTable"+groupNum+" tbody")[rowNum]);if(a.checked){$row.addClass(styleClass.lineSelectedClass);c.selectedRows.push(d[groupNum].groupData[rowNum])}else{$row.removeClass(styleClass.lineSelectedClass);for(var j in c.selectedRows){if(c.selectedRows[j].uuuid===d[groupNum].groupData[rowNum].uuuid){c.selectedRows.splice(j,1)}}}if(c.selectedRows.length===c.length){$checkbox.prop("checked",true)}else{$checkbox.prop("checked",false)}},_getRow:function(a,b,c){var d={};for(var e in b){var f=b[e].groupData;for(var g in f){if(c===f[g].uuuid){d.data=f[g];d.$row=$($("#"+a+"SubTable"+e+" tbody")[g])}}}return d},_getDefaults:function(a,b,c){if(c==="styleClass"){if(b.theme==="default"||b.theme===undefined){return a.styleClass}b.styleClass={};for(var d in a[c]){b.styleClass[d]=b.theme+"-"+a.styleClass[d]}}else{if(b[c]===null||b[c]===undefined){return a[c]}}return b[c]},_strToInt:function(a){if(!a){return false}return parseInt(a.substring(0,a.length-2))},_updateTable:function(a,b,c){var d=this._getInst(a);var e=d.id,settings=d.settings;if(!c){if(b.height){var f=b.height;$("#"+e+"TableMain").height(f);settings.height=f}else{settings.data=b.data;this._build(a)}}else{var g=settings.data,colModel=settings.colModel;var h=this._getRow(e,g,b);$.extend(h.data,c);for(var i=0;i<colModel.length;i++){if(colModel[i].type!=="checkbox"){var j=colModel[i].index;h.$row.find("td")[i].innerHTML=h.data[j]?h.data[j]:"&nbsp;"}}if(settings.expendRow){$(h.$row.find("tr")[1]).find("td").html(c[settings.expendRow.index]?c[settings.expendRow.index]:"&nbsp;")}}},_getRowsTable:function(a,b,c){var d=this._getInst(a);var e=d.settings;if(!b){return e.selectedRows}var f=[];for(var i=0;i<e.data.length;i++){var g=e.data[i].groupData;for(var h in g){if(g[h][b]===c){f.push(g[h])}}}return f},_destroyTable:function(a){var b=this._getInst(a);$.removeData(a,o);$("#"+b.id).remove()},_selectedTable:function(a,b){var c=this._getInst(a);var d=c.id,settings=c.settings;var e=c.settings.data,styleClass=this._getDefaults(this._defaults,settings,"styleClass");for(var f in e){var g=e[f].groupData;for(var h in g){if(b===g[h].uuuid){settings.selectedRows.push(g[h]);$.unique(settings.selectedRows);var i=$($("#"+d+"SubTable"+f+" tbody")[h]);i.addClass(styleClass.lineSelectedClass);i.find("input").prop("checked",true)}}}},_unSelectedTable:function(a,b){var c=this._getInst(a);var d=c.id,settings=c.settings;var e=c.settings.data,styleClass=this._getDefaults(this._defaults,settings,"styleClass");for(var f in e){var g=e[f].groupData;for(var h in g){if(b===g[h].uuuid){var j=settings.selectedRows;for(var i=0;i<j.length;i++){if(j[i].uuuid===b){j.splice(i,1)}}var k=$($("#"+d+"SubTable"+f+" tbody")[h]);k.removeClass(styleClass.lineSelectedClass);k.find("input").prop("checked",false)}}}}});$.fn.table=function(a){var b=Array.prototype.slice.call(arguments);if(typeof a==='string'){b.shift();return $.table['_'+a+'Table'].apply($.table,[this[0]].concat(b))}return this.each(function(){$.table._attach(this,a)})};$.table=new p();window["DP_jQuery_"+n]=$})(jQuery);
(function($){$.fn.extend({dialog:{version:"0.0.1.7",author:"lly219@gmail.com"}});var dpuuid=new Date().getTime();var PROP_NAME='dialog';var Dialog=function(){this._defaults={"styleClass":{"background":"dialog-background","panel":"dialog-panel","main":"dialog-main","footer":"dialog-footer","headerMiddle":"dialog-header-middle","headerBg":"dialog-header-bg","closeIcon":"dialog-close-icon","closeIconHover":"dialog-close-icon-hover","title":"dialog-title"}}};$.extend(Dialog.prototype,{_attach:function(target,settings){if(!target.id){this.uuid++;target.id='dp'+this.uuid}var inst=this._newInst($(target));inst.settings=$.extend({},settings||{});$.data(target,PROP_NAME,inst);this._init(target)},_newInst:function(target){var id=target[0].id.replace(/([^A-Za-z0-9_])/g,'\\\\$1');return{id:id}},_getInst:function(target){try{return $.data(target,PROP_NAME)}catch(err){throw'Missing instance data for this dialog';}},_destroyDialog:function(target){var inst=$.dialog._getInst(target);var id=inst.id;$.removeData(target,PROP_NAME);$(target).prependTo("#"+id+"Wrap").unwrap();$(target).removeAttr("style");var styleClass=this._getDefaults($.dialog._defaults,inst.settings,"styleClass");$("."+styleClass.background).remove();$("#"+id+"Dialog").remove()},_init:function(target){var inst=this._getInst(target);var id=inst.id,settings=inst.settings;var windowH=$(window).height(),windowW=$(window).width();var styleClass=this._getDefaults($.dialog._defaults,settings,"styleClass"),dialogH=settings.height?settings.height:parseInt(windowH*0.6),dialogW=settings.width?settings.width:parseInt(windowW*0.6);settings.title=settings.title?settings.title:"";settings.okText=settings.okText?settings.okText:"Ok";settings.cancelText=settings.cancelText?settings.cancelText:"Cancel";var footerHTML="",headerHTML="<div class='"+styleClass.headerBg+"'><div class='"+styleClass.title+"'>"+settings.title+"</div><a href='javascript:void(0);' class='"+styleClass.closeIcon+"'></a></div>";if(!settings.hideFooter){footerHTML="<a href='javascript:void(0);'>"+settings.okText+"</a><a href='javascript:void(0);'>"+settings.cancelText+"</a>"}var dialogHTML="<div id='"+id+"Dialog' class='"+styleClass.panel+"' style='width: "+(dialogW+26)+"px;' onselectstart='return false;'>"+headerHTML+"<div class='"+styleClass.main+"'><div style='overflow: auto; height: "+dialogH+"px;'></div><div class='"+styleClass.footer+"'>"+footerHTML+"</div></div>";var bgHTML="";if(settings.modal&&$("."+styleClass.background).length===0){var bgHeight=windowH<document.documentElement.scrollHeight?document.documentElement.scrollHeight:windowH;bgHTML="<div style='height:"+bgHeight+"px;' class='"+styleClass.background+"'></div>"}$("#"+id).wrap("<div id='"+id+"Wrap'></div>");var cloneObj=$(target).clone(true);$(target).remove();$('body').append(bgHTML+dialogHTML);$($("#"+id+"Dialog ."+styleClass.main+" div").get(0)).append(cloneObj);$(cloneObj).show();var top="",left="",$dialog=$("#"+id+"Dialog");if(settings.position){top=settings.position.top;left=settings.position.left}else{top=parseInt((windowH-dialogH)/2);left=parseInt((windowW-dialogW)/2)}$dialog.css({"top":top+"px","left":left+"px"});$("#"+id+"Dialog ."+styleClass.closeIcon).bind("click",function(){$.dialog._close(id,settings)});var $buttons=$("#"+id+"Dialog ."+styleClass.footer+" a");$($buttons.get(1)).bind("click",function(){$.dialog._close(id,settings)});$($buttons.get(0)).bind("click",function(){if(settings.ok===undefined||settings.ok()){$.dialog._close(id,settings)}});this._bindMove(id,styleClass.headerBg,dialogH,dialogW);$(window).keyup(function(event){if(event.keyCode===27){$.dialog._close(id,settings)}})},_bindMove:function(id,className){$("#"+id+"Dialog ."+className).mousedown(function(event){var _document=document;if(!event){event=window.event}var dialog=document.getElementById(id+"Dialog");var x=event.clientX-parseInt(dialog.style.left),y=event.clientY-parseInt(dialog.style.top);_document.ondragstart="return false;";_document.onselectstart="return false;";_document.onselect="document.selection.empty();";if(this.setCapture){this.setCapture()}else if(window.captureEvents){window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP)}_document.onmousemove=function(event){if(!event){event=window.event}var positionX=event.clientX-x,positionY=event.clientY-y;if(positionX<0){positionX=0}if(positionX>$(window).width()-$(dialog).width()){positionX=$(window).width()-$(dialog).width()}if(positionY<0){positionY=0}if(positionY>$(window).height()-$(dialog).height()){positionY=$(window).height()-$(dialog).height()}dialog.style.left=positionX+"px";dialog.style.top=positionY+"px"};_document.onmouseup=function(){if(this.releaseCapture){this.releaseCapture()}else if(window.captureEvents){window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP)}_document.onmousemove=null;_document.onmouseup=null;_document.ondragstart=null;_document.onselectstart=null;_document.onselect=null}})},_close:function(id,settings){if($("#"+id+"Dialog").css("display")==="none"){return}if(settings.close===undefined||settings.close()){$("#"+id+"Dialog").hide();if(settings.modal){var styleClass=this._getDefaults($.dialog._defaults,settings,"styleClass");$("."+styleClass.background).hide()}}},_closeDialog:function(target){var inst=this._getInst(target);var id=inst.id,settings=inst.settings;$.dialog._close(id,settings)},_openDialog:function(target){var inst=this._getInst(target);var id=inst.id,settings=inst.settings;$("#"+id+"Dialog").show();if(settings.modal){var styleClass=this._getDefaults($.dialog._defaults,settings,"styleClass");$("."+styleClass.background).show()}},_updateDialog:function(target,data){var inst=this._getInst(target);var id=inst.id,settings=inst.settings;var styleClass=this._getDefaults($.dialog._defaults,settings,"styleClass");$.extend(settings,data);var $dialog=$("#"+id+"Dialog");if(data.position){$dialog.css({"top":data.position.top,"left":data.position.left})}if(data.width){$dialog.width(data.width+26);$dialog.find("."+styleClass.main+" div")[0].style.width=data.width+"px";$dialog.find("."+styleClass.headerBg).width(data.width+18)}if(data.height){$dialog.find("."+styleClass.main+" div")[0].style.height=data.height+"px"}if(data.title){$dialog.find("."+styleClass.title).html(data.title)}if(data.modal!==undefined){if(data.modal){$("."+styleClass.background).show()}else{$("."+styleClass.background).hide()}}if(data.hideFooter!==undefined){if(data.hideFooter){$dialog.find("."+styleClass.footer).hide()}else{$dialog.find("."+styleClass.footer).show()}}},_getDefaults:function(defaults,settings,key){if(key==="styleClass"){if(settings.theme==="default"||settings.theme===undefined){return defaults.styleClass}settings.styleClass={};for(var styleName in defaults[key]){settings.styleClass[styleName]=settings.theme+"-"+defaults.styleClass[styleName]}}else if(key==="height"||key==="width"){if(settings[key]===null||settings[key]===undefined){return"auto"}else{return settings[key]+"px"}}else{if(settings[key]===null||settings[key]===undefined){return defaults[key]}}return settings[key]}});$.fn.dialog=function(options){var otherArgs=Array.prototype.slice.call(arguments);if(typeof options==='string'){otherArgs.shift();return $.dialog['_'+options+'Dialog'].apply($.dialog,[this[0]].concat(otherArgs))}return this.each(function(){$.dialog._attach(this,options)})};$.dialog=new Dialog();window['DP_jQuery_'+dpuuid]=$})(jQuery);
(function($){var j=new Date().getTime();var k='completed';var l=function(){this._defaults={"styleClass":{"panelClass":"completed-panel","inputClass":"completed-input","ckClass":"completed-ck"},"separator":","},this._settingsDataFormat={}};$.extend(l.prototype,{_attach:function(a,b){if(!a.id){this.uuid++;a.id='dp'+this.uuid}var c=this._newInst($(a));c.settings=$.extend({"buttonText":"\u9009\u62e9"},b||{});$.data(a,k,c);this._init(a)},_newInst:function(a){var b=a[0].id.replace(/([^A-Za-z0-9_])/g,'\\\\$1');return{"id":b}},_getInst:function(a){try{return $.data(a,k)}catch(err){throw'Missing instance data for this completed';}},_destroyCompleted:function(){},_init:function(b){var c=this._getInst(b);var d=c.id,settings=c.settings;this._buildHTML(d,settings);$(document).click(function(a){if(a.target.id!==d){$("#"+d+"SelectedPanel").hide()}});this._buildCheckboxPanel(d,settings.data)},_buildHTML:function(b,c){var d=c.height+"px",classStyle=this._getDefaults($.completed._defaults,c,"styleClass");var e=$("#"+b);var f="<button onclick=\"$('#"+b+"CheckboxPanel').toggle()\">"+c.buttonText+"</button><div id='"+b+"SelectedPanel' class='"+classStyle.panelClass+"' style='height:"+d+";'></div><div class='none "+classStyle.ckClass+"' id='"+b+"CheckboxPanel'><div>";c.data.sort();e.after(f).bind("keyup",{settings:c},this._keyupAction).bind("keydown",function(a){c.chinese=a.keyCode}).addClass(classStyle.inputClass).width(e.width()-78);var g=$("#"+b+"SelectedPanel");c.tipNum=0;g.width(e.width()+2)},_keyupAction:function(a){var b=a.data.settings,currentWordObj=$.completed._getCurrentWord(this,b);if(currentWordObj.currentWord===""||a.keyCode===27||a.keyCode===16||a.keyCode===16){$("#"+this.id+"SelectedPanel").hide();b.tipNum=0;return}var c=$.completed._getMatchData(b.data,this.value,currentWordObj.currentWord);if(a.keyCode===38){if(b.tipNum>0){b.tipNum--}else{b.tipNum=c.length-1}}if(a.keyCode===40){if(b.tipNum<c.length-1){b.tipNum++}else{b.tipNum=0}}$.completed._buildSelectedPanel(this.id,c,b,currentWordObj.currentWord);if(a.keyCode===13&&c[b.tipNum]&&b.chinese!==229){var d=this.value;this.value=d.substring(0,currentWordObj.startPos)+c[b.tipNum]+d.substring(currentWordObj.endPos,d.length);$("#"+this.id+"SelectedPanel").hide();b.chinese=undefined}if(a.keyCode!==38&&a.keyCode!==40){b.tipNum=0}},_getCurrentWord:function(a,b){var c=$(a).val(),tag=true,endPos=0,startPos=0,separator=$.completed._defaults.separator;if(c===""){return{currentWord:"",startPos:startPos,endPos:endPos}}if(document.selection){try{var d=document.selection.createRange();var f=a.createTextRange();f.collapse(true);f.select();var g=document.selection.createRange();g.setEndPoint("EndToEnd",d);b.curPos=g.text.length;d.select()}catch(e){delete e}}else{b.curPos=a.selectionStart}var h=b.curPos;for(var i=0;i<c.length;i++){if(c.charAt(i)===separator){if(i>=h&&tag){endPos=i;tag=false}}}if(tag===true){tag=false;endPos=c.length}for(var j=endPos;j>-1;j--){if(c.charAt(j)===separator){if(j<h&&!tag){startPos=j+1;tag=true}}}return{currentWord:c.substring(startPos,endPos),startPos:startPos,endPos:endPos}},_getMatchData:function(a,b,c){var d=b.split($.completed._defaults.separator);var e=[];for(var i=0;i<a.length;i++){if(typeof a[i]==="number"){a[i]=a[i].toString()}if(a[i].toLowerCase().indexOf(c.toLowerCase())>-1){var f=true;for(var k=0;k<d.length;k++){if(a[i]===d[k].toString()&&a[i].toLowerCase()!==c.toLowerCase()){f=false}}if(f){e.push(a[i])}}}return e},_mousemoveSelectPanel:function(a,i,b){$(a).parent().find("a").removeClass("selected");a.className='selected';var c=$.completed._getInst(document.getElementById(b));c.settings.tipNum=i},_buildSelectedPanel:function(e,f,g,h){var j=$("#"+e+"SelectedPanel");if(f.length===0){j.html("").hide();return}if(g.tipNum>=f.length){g.tipNum=0}var k="";for(var i=0;i<f.length;i++){var l="",highlightHTML=f[i].replace(h,"<b>"+h+"</b>");if(g.tipNum===i){l="class='selected'"}k+="<a href='javascript:void(0);' onmousemove=\"$.completed._mousemoveSelectPanel(this, "+i+", '"+e+"');\" "+l+">"+highlightHTML+"</a>"}j.html(k).show();var m=$("#"+e+"SelectedPanel a.selected");if(m.position().top+j.scrollTop()>50-m.height()){j.scrollTop(m.position().top+j.scrollTop()+m.height()-50)}if(m.position().top<0){j.scrollTop(j.scrollTop-m.height())}$("#"+e+"SelectedPanel a").click(function(){var a=document.getElementById(e);var b=$.completed._getCurrentWord(document.getElementById(e),g);var c=$.completed._getMatchData(g.data,a.value,b.currentWord);var d=a.value;a.value=d.substring(0,b.startPos)+c[g.tipNum]+d.substring(b.endPos,d.length);g.tipNum=0;$(a).focus()})},_buildCheckboxPanel:function(c,d){var e="",$input=$("#"+c);for(var i=0;i<d.length;i++){e+="<span>"+d[i]+"</span>"}$("#"+c+"CheckboxPanel").html(e+"<div class='clear'></div>");$("#"+c+"CheckboxPanel"+" span").click(function(){var a=$input.val(),currentVal=this.innerHTML;if(this.className==="selected"){this.className="";var b=a.substr(a.indexOf(currentVal)+currentVal.length,1);if(currentVal===a||b!==","){$input.val(a.replace(currentVal,""))}else{$input.val(a.replace(currentVal+",",""))}}else{this.className="selected";if(a.replace(/\s/g,"")===""||a.substr(a.length-1,1)===","){$input.val(a+currentVal)}else{$input.val(a+","+currentVal)}}});this._matchChecked(c);$input.blur(function(){$.completed._matchChecked(c)})},_matchChecked:function(a){var b=$("#"+a).val().split(",");$("#"+a+"CheckboxPanel span").removeClass().each(function(){for(var i=0;i<b.length;i++){if(this.innerHTML===b[i]){this.className="selected"}}})},_getDefaults:function(a,b,c){if(c==="styleClass"){if(b.theme==="default"||b.theme===undefined){return a.styleClass}b.styleClass={};for(var d in a[c]){b.styleClass[d]=b.theme+"-"+a.styleClass[d]}}else if(c==="height"||c==="width"){if(b[c]===null||b[c]===undefined){return"auto"}else{return b[c]+"px"}}else{if(b[c]===null||b[c]===undefined){return a[c]}}return b[c]}});$.fn.completed=function(a){var b=Array.prototype.slice.call(arguments);return this.each(function(){typeof a=='string'?$.completed['_'+a+'Completed'].apply($.completed,[this].concat(b)):$.completed._attach(this,a)})};$.completed=new l();window['DP_jQuery_'+j]=$})(jQuery);
(function($){$.fn.extend({tip:{version:"0.0.0.3",author:"lly219@gmail.com"}});var f=new Date().getTime();var g='tip';var h=function(){this._defaults={"styleClass":{"panel":"tip-panel"}},this._settingsDataFormat={}};$.extend(h.prototype,{_attach:function(a,b){if(!a.id){this.uuid++;a.id='dp'+this.uuid}var c=this._newInst($(a));c.settings=$.extend({},b||{});$.data(a,g,c);this._init(a)},_newInst:function(a){var b=a[0].id.replace(/([^A-Za-z0-9_])/g,'\\\\$1');return{id:b}},_getInst:function(a){try{return $.data(a,g)}catch(err){throw'Missing instance data for this tip.';}},_destroyTip:function(a){$.removeData(a,g);$("#"+a.id+"Panel").remove()},_init:function(a){var b=this._getInst(a);var c=b.id,settings=b.settings;var d='',styleClass=settings.className?settings.className:this._getDefaults($.tip._defaults,settings,"styleClass").panel;d="<div id='"+c+"Panel' class='"+styleClass+"'>"+settings.content+"</div>";$(settings.appendId?"#"+settings.appendId:"body").append(d);$(a).hover(function(){$.tip._parsePosition(settings,a);$("#"+c+"Panel").fadeIn("normal")},function(){$("#"+c+"Panel").fadeOut("normal")})},_optionTip:function(a,b,c){var d=$.tip._getInst(a[0]);var e=d.settings;if(c){e[b]=c;$("#"+a[0].id+"Panel").html(c)}return e[b]},_parsePosition:function(a,b){var c="",$targetPanel=$("#"+b.id+"Panel");if(a.left===undefined&&a.right===undefined&&a.bottom===undefined&&a.top===undefined&&a.position===undefined){a.position="bottom"}if(a.position){var d=$(b);switch(a.position){case"top":c="left: "+parseInt(d.position().left)+"px; top: "+parseInt(d.position().top-$targetPanel.height()-6-parseInt(d.css("padding-top"))-parseInt($targetPanel.css("padding-top")))+"px;";break;case"bottom":c="left: "+parseInt(d.position().left)+"px; top: "+parseInt(d.position().top+d.height())+"px;";break;default:alert("Has no type!");break}$targetPanel.attr("style",c);return}if(a.left!==undefined){c+="left:"+a.left+"px;"}if(a.top!==undefined){c+="top:"+a.top+"px;"}if(a.bottom!==undefined){c+="bottom:"+a.bottom+"px;"}if(a.right!==undefined){c+="right:"+a.right+"px;"}$targetPanel.attr("style",c)},_getDefaults:function(a,b,c){if(c==="styleClass"){if(b.theme==="default"||b.theme===undefined){return a.styleClass}b.styleClass={};for(var d in a[c]){b.styleClass[d]=b.theme+"-"+a.styleClass[d]}}else if(c==="height"||c==="width"){if(b[c]===null||b[c]===undefined){return"auto"}else{return b[c]+"px"}}else{if(b[c]===null||b[c]===undefined){return a[c]}}return b[c]}});$.fn.tip=function(a){var b=Array.prototype.slice.call(arguments);if(a==="option"){b.shift();return $.tip['_'+a+'Tip'].apply($.tip,[this].concat(b))}return this.each(function(){typeof a=='string'?$.tip['_'+a+'Tip'].apply($.tip,[this].concat(b)):$.tip._attach(this,a)})};$.tip=new h();window['DP_jQuery_'+f]=$})(jQuery);
>>>>>>> origin/0.4.6
(function($){$.fn.extend({tabs:{version:"0.0.1.9",author:"lly219@gmail.com"}});var g=new Date().getTime();var h='tabs';var k=function(){};$.extend(k.prototype,{_attach:function(a,b){if(!a.id){this.uuid++;a.id='dp'+this.uuid}var c=this._newInst($(a));c.settings=$.extend({length:0},b||{});$.data(a,h,c);this._init(a)},_newInst:function(a){var b=a[0].id.replace(/([^A-Za-z0-9_])/g,'\\\\$1');return{id:b}},_getInst:function(a){try{return $.data(a,h)}catch(err){throw'Missing instance data for this tabs';}},_init:function(a){var b=this._getInst(a);var c=b.settings,id=b.id;var d=$(a).find("li");c.data=[];for(var i=0,j=0;i<d.length;i++){if(d[i].children[0].id){c.data[j]=d[i].children[0].id.replace(id+"_","");j++}}},_setCurrentTabs:function(a,b){var c=this._getInst(a);var d=c.settings,id=c.id;if($("#"+id+"_"+b+" a").hasClass("tab-current")){return}var e=d.data;for(var i=0;i<e.length;i++){var f=$("#"+id+"Panel_"+e[i]),$tab=$("#"+id+"_"+e[i]);if(b===e[i]){f.show();$tab.find("a").addClass("tab-current")}else{f.hide();$tab.find("a").removeClass("tab-current")}}},_addTabs:function(a,b){var c=this._getInst(a);var d=c.settings,id=c.id;d.data.push(b.id);var e="";if(b.hash){e="<a href='"+b.hash+"'>"+b.text+"</a>"}else{e="<span>"+b.text+"</span>"}$(b.target).before("<li><div id='"+id+"_"+b.id+"'>"+e+"</div></li>");$("#"+id+"Panel").append("<div id="+id+"Panel_"+b.id+" class='none'>"+b.content+"</div>")},_removeTabs:function(a,b){var c=this._getInst(a);var d=c.settings.data,id=c.id;for(var i=0;i<d.length;i++){if(d[i]===b){d.splice(i,1)}}$("#"+id+"_"+b).remove();$("#"+id+"Pabel_"+b).remove()}});$.fn.tabs=function(a){var b=Array.prototype.slice.call(arguments);if(typeof a==='string'){b.shift();return $.tabs['_'+a+'Tabs'].apply($.tabs,[this[0]].concat(b))}return this.each(function(){$.tabs._attach(this,a)})};$.tabs=new k();window['DP_jQuery_'+g]=$})(jQuery);
\ No newline at end of file
<div>
<#list articles as article>
<div class="article">
<div class="article-header">
<div class="article-date">
<#if article.hasUpdated>
${article.articleUpdateDate?string("yyyy-MM-dd HH:mm:ss")}
<#else>
${article.articleCreateDate?string("yyyy-MM-dd HH:mm:ss")}
</#if>
</div>
<div class="article-title">
<h2>
<a rel="bookmark" class="no-underline" href="${servePath}${article.articlePermalink}">
${article.articleTitle}
</a>
<#if article.hasUpdated>
<sup class="red">
${updatedLabel}
</sup>
</#if>
<#if article.articlePutTop>
<sup class="red">
${topArticleLabel}
</sup>
</#if>
</h2>
<div class="article-tags">
${tags1Label}
<#list article.articleTags?split(",") as articleTag>
<span>
<a rel="tag" href="${servePath}/tags/${articleTag?url('UTF-8')}">
${articleTag}</a><#if articleTag_has_next>,</#if>
</span>
</#list>&nbsp;&nbsp;&nbsp;
<#-- 注释掉填充用户名部分
${author1Label}<a rel="nofollow" href="${servePath}/authors/${article.authorId}">${article.authorName}</a>
-->
</div>
</div>
<div class="clear"></div>
</div>
<div class="article-body">
<div class="article-abstract">
${article.articleAbstract}
</div>
</div>
<div class="article-footer">
<div class="right">
<span class="article-create-date left">
&nbsp;${article.articleCreateDate?string("yyyy-MM-dd HH:mm:ss")}&nbsp;&nbsp
</span>
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments" class="left">
<span class="left commentIcon" title="${commentLabel}"></span>
${article.articleCommentCount}
</a>
<span class="left">&nbsp;&nbsp;</span>
<a rel="nofollow" href="${servePath}${article.articlePermalink}" class="left">
<span class="left browserIcon" title="${viewLabel}"></span>
${article.articleViewCount}
</a>
</div>
<div class="clear"></div>
</div>
</div>
</#list>
<#if 0 != paginationPageCount>
<div class="pagination">
<#if 1 != paginationPageNums?first>
<a href="${servePath}${path}/1">${firstPageLabel}</a>
<a id="previousPage" href="${servePath}${path}/${paginationPreviousPageNum}">${previousPageLabel}</a>
</#if>
<#list paginationPageNums as paginationPageNum>
<#if paginationPageNum == paginationCurrentPageNum>
<a href="${servePath}${path}/${paginationPageNum}" class="selected">${paginationPageNum}</a>
<#else>
<a href="${servePath}${path}/${paginationPageNum}">${paginationPageNum}</a>
</#if>
</#list>
<#if paginationPageNums?last != paginationPageCount>
<a id="nextPage" href="${servePath}${path}/${paginationNextPageNum}">${nextPagePabel}</a>
<a href="${servePath}${path}/${paginationPageCount}">${lastPageLabel}</a>
</#if>
&nbsp;&nbsp;${sumLabel} ${paginationPageCount} ${pageLabel}
</div>
</#if>
</div>
\ No newline at end of file
<#include "macro-head.ftl">
<#include "macro-comments.ftl">
<!DOCTYPE html>
<html>
<head>
<@head title="${article.articleTitle} - ${blogTitle}">
<meta name="keywords" content="${article.articleTags}" />
<meta name="description" content="${article.articleAbstract?html}" />
</@head>
</head>
<body>
${topBarReplacement}
<div class="content">
<div class="header">
<#include "header.ftl">
</div>
<div class="body">
<div class="left main">
<div>
<div class="article">
<div class="article-header">
<div class="article-date">
<#if article.hasUpdated>
${article.articleUpdateDate?string("yyyy-MM-dd HH:mm:ss")}
<#else>
${article.articleCreateDate?string("yyyy-MM-dd HH:mm:ss")}
</#if>
</div>
<div class="article-title">
<h2>
<a class="no-underline" href="${servePath}${article.articlePermalink}">${article.articleTitle}</a>
<#if article.hasUpdated>
<sup class="red">
${updatedLabel}
</sup>
</#if>
<#if article.articlePutTop>
<sup class="red">
${topArticleLabel}
</sup>
</#if>
</h2>
<div class="article-tags">
${tags1Label}
<#list article.articleTags?split(",") as articleTag>
<span>
<a rel="tag" href="${servePath}/tags/${articleTag?url('UTF-8')}">
${articleTag}</a><#if articleTag_has_next>,</#if>
</span>
</#list>&nbsp;&nbsp;&nbsp;
<#-- 注释掉填充用户名部分
${author1Label}<a rel="nofollow" href="${servePath}/authors/${article.authorId}">${article.authorName}</a>
-->
</div>
</div>
<div class="clear"></div>
</div>
<div class="article-body">
${article.articleContent}
<#if "" != article.articleSign.signHTML?trim>
<div class="marginTop12">
${article.articleSign.signHTML}
</div>
</#if>
</div>
<div class="article-details-footer">
<div class="left">
<#if nextArticlePermalink??>
<a href="${servePath}${nextArticlePermalink}">${nextArticle1Label}${nextArticleTitle}</a><br/>
</#if>
<#if previousArticlePermalink??>
<a href="${servePath}${previousArticlePermalink}">${previousArticle1Label}${previousArticleTitle}</a>
</#if>
</div>
<div class="right">
<span class="article-create-date left">
${article.articleCreateDate?string("yyyy-MM-dd HH:mm:ss")}&nbsp;&nbsp;
</span>
<a rel="nofollow" href="${servePath}${article.articlePermalink}#comments" class="left">
<span class="left commentIcon" title="${commentLabel}"></span>
<span class="left">${article.articleCommentCount}</span>&nbsp;&nbsp;
</a>
<a rel="nofollow" href="${servePath}${article.articlePermalink}" class="left">
<span class="left browserIcon" title="${viewLabel}"></span>
<span id="articleViewCount">${article.articleViewCount}</span>
</a>
</div>
<div class="clear"></div>
</div>
<#if 0 != relevantArticlesDisplayCount>
<div id="relevantArticles" class="article-relative left" style="width: 50%;"></div>
</#if>
<div id="randomArticles" class="left article-relative"></div>
<div class="clear"></div>
<div id="externalRelevantArticles" class="article-relative"></div>
</div>
<div class="clear"></div>
<@comments commentList=articleComments article=article></@comments>
</div>
</div>
<div class="right side">
<#include "side.ftl">
</div>
<div class="clear"></div>
</div>
<div class="footer">
<#include "footer.ftl">
</div>
</div>
<@comment_script oId=article.oId>
page.tips.externalRelevantArticlesDisplayCount = "${externalRelevantArticlesDisplayCount}";
<#if 0 != randomArticlesDisplayCount>
page.loadRandomArticles();
</#if>
<#if 0 != relevantArticlesDisplayCount>
page.loadRelevantArticles('${article.oId}', '<h4>${relevantArticles1Label}</h4>');
</#if>
<#if 0 != externalRelevantArticlesDisplayCount>
page.loadExternalRelevantArticles("<#list article.articleTags?split(",") as articleTag>${articleTag}<#if articleTag_has_next>,</#if></#list>");
</#if>
</@comment_script>
</body>
</html>
<div class="marginBottom12">
<h1 class="title">
<a href="${servePath}" id="logoTitle" >
${blogTitle}
</a>
<span class="sub-title">${blogSubtitle}</span>
</h1>
</div>
<div class="left">
<#list pageNavigations as page>
<span>
<a href="${page.pagePermalink}" target="${page.pageOpenTarget}">${page.pageTitle}</a>&nbsp;&nbsp;
</span>
</#list>
<a href="${servePath}/tags.html">${allTagsLabel}</a>&nbsp;&nbsp;
<a rel="alternate" href="${servePath}/blog-articles-feed.do">${atomLabel}</a><a href="${servePath}/blog-articles-feed.do"><img src="${staticServePath}/images/feed.png" alt="Atom"/></a>
</div>
<div class="right" id="statistic">
<span>${viewCount1Label}
<span class='error-msg'>
${statistic.statisticBlogViewCount}
</span>
&nbsp;&nbsp;
</span>
<span>
${articleCount1Label}
<span class='error-msg'>
${statistic.statisticPublishedBlogArticleCount}
</span>
&nbsp;&nbsp;
</span>
<span>
${commentCount1Label}
<span class='error-msg'>
${statistic.statisticPublishedBlogCommentCount}
</span>
</span>
</div>
<div class="clear"></div>
\ No newline at end of file
#
# Copyright (c) 2009, 2010, 2011, B3log Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Description: B3log Solo language configurations(en_US).
# Version: 1.0.5.9, Feb 25, 2012
# Author: Liang Ding
# Author: Liyuan Li
#
adminConsoleLabel=Admin
adminIndexLabel=Admin Index
postArticleLabel=Post
articleListLabel=Articles
commentListLabel=Comments
draftListLabel=Drafts
userManageLabel=Users
commonUserLabel=Common User
addUserLabel=Add User
updateUserLabel=Update User
linkManagementLabel=Links
pluginMgmtLabel=Plugins
pluginNameLabel=Name
versionLabel=Version
statusLabel=Status
enabledLabel=Enabled
disabledLabel=Disabled
enableLabel=Enable
disableLabel=Disable
preferenceLabel=Preference
localeString1Label=Language:
timeZoneId1Label=Time Zone:
adminLabel=Admin
administratorLabel=Administrator
loginLabel=Login
logoutLabel=Logout
initLabel=Initial
popTagsLabel=Popular Tags
tag1Label=Tag:
tags1Label=Tags:
recentArticlesLabel=Recent Articles
recentCommentsLabel=Recent Comments
postCommentsLabel=Post Comment
mostCommentArticlesLabel=Most Comment Articles
mostViewCountArticlesLabel=Most View Articles
em00Label=Smile
em01Label=Laughter
em02Label=Happy
em03Label=Sad
em04Label=Cry
em05Label=No Comments
em06Label=Fidget
em07Label=Angry
em08Label=Look Around
em09Label=Surprise
em10Label=Cool
em11Label=Cheeky
em12Label=Heart
em13Label=Heart Broken
em14Label=Devil
linkLabel=Friend Links
sumLabel=
pageLabel=Page
commentLabel=Comment
linkTitleLabel=Link Title
linkTitle1Label=Title:
updateLabel=Update
removeLabel=Remove
putTopLabel=Put Top
cancelPutTopLabel=Cancel Put Top
downloadCountLabel=Count
sizeLabel=Size
uploadDateLabel=Upload Date
downloadURLLabel=Download URL
downloadLabel=Download
createDateLabel=Create Date
updateDateLabel=Update Date
titleLabel=Title
title1Label=Title:
content1Label=Content:
abstract1Label=Summary:
publishLabel=Publish
unPublishLabel=Un Publish
urlLabel=URL
url1Label=URL (start protocol, e.g.: http://):
addLinkLabel=Add Link
updateLinkLabel=Update Link
archiveLabel=Archive
archive1Label=archive:
yearLabel=
monthLabel=
pageLabel=Page
pageMgmtLabel=Pages
othersLabel=Others
fileListLabel=Files
submitUploadLabel=Upload
fileNameLabel=File Name
paramSettingsLabel=Parameters
skinLabel=Skins
signLabel=Signs
sign1Label=Signs:
noSignLabel=No Signs
signIsNullLabel=This Sign is Null
statisticLabel=Blog Statistic
viewLabel=View
countLabel=Posts
viewCount1Label=View Count:
articleCount1Label=Article Count:
commentCountLabel=Comment Count
commentCount1Label=Comment Count:
commentEmotions1Label=Emotions:
commentEmotionsLabel=Emotions
commentName1Label=Name:
commentNameLabel=Name
commentEmail1Label=Email:
commentEmailLabel=Email
commentURL1Label=URL:
commentURLLabel=URL
commentContent1Label=Content:
commentContentLabel=Content
getDateLabel=Get Date
getArticleLabel=Get Article
selectDateLabel=Select Date
selectDate1Label=Select Date:
importLabel=Import
chooseBlog1Label=Choose Blog:
blogArticleImportLabel=Article Import
userName1Label=Username:
userPassword1Label=Password:
categoryLabel=Category
noticeBoard1Label=Notice Board:
noticeBoardLabel=Notice Board
htmlhead1Label=HTML head:
indexTagDisplayCnt1Label=Index Tag Display Count:
indexRecentArticleDisplayCnt1Label=Recent Article Display Count:
indexRecentCommentDisplayCnt1Label=Recent Comment Display Count:
indexMostCommentArticleDisplayCnt1Label=Most Comment Article Display Count:
indexMostViewArticleDisplayCnt1Label=Most View Article Display Count:
relevantArticlesDisplayCnt1Label=Relevant Article Display Count:
randomArticlesDisplayCnt1Label=Random Article Display Count:
externalRelevantArticlesDisplayCnt1Label=External Relevant Article Display Count:
windowSize1Label=Pagination Window Size:
pageSize1Label=Pagination Page Size:
blogTitle1Label=Blog Title:
blogSubtitle1Label=Blog Subtitle:
blogHost1Label=Blog Host:
submmitCommentLabel=Commit Comment
saveLabel=Save
tagLabel=Tag
tagsLabel=Tags
importedLabel=Imported
captcha1Label=Captcha:
captchaLabel=Captcha
clearAllCacheLabel=Clear all cache
clearCacheLabel=Clear cache
indexLabel=Index
nextArticle1Label=Next:
previousArticle1Label=Previous:
updatedLabel=Updated!
topArticleLabel=Top!
CSDNBlogLabel=CSDN Blog
BlogJavaLabel=BlogJava
CnBlogsLabel=CnBlogs
previousPageLabel=Previous Page
nextPagePabel=Next Page
firstPageLabel=First Page
lastPageLabel=Last Page
returnTo1Label=Return to:
tencentLabel=Tencent
appKey1Label=App Key:
appSecret1Label=App Secret:
postToTencentMicroblogWhilePublishArticleLabel=Post to Tencent microblog while publish an article:
postToCommunityLabel=Post to Community:
authorizeTencentMicroblog1Label=Click to authorize:
googleLabel=Google
OAuthConsumerSecret1Label=OAuth Consumer Secret:
atomLabel=Atom
relevantArticles1Label=Relevant Articles:
randomArticles1Label=Random Articles:
externalRelevantArticles1Label=External Relevant Articles:
metaKeywords1Label=Meta Keywords:
metaDescription1Label=Meta Description:
removeUnusedTagsLabel=Remove Unused Tags
goTopLabel=Top
permalink1Label=Permalink:
permalinkLabel=Permalink
b3logLabel=<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
killBrowserLabel=<h2>Let's kill outdated and insecure browser!</h2><p>Let's kill outdated and insecure browser for browser evolution, human progress and better experience.</p><p>You can download</p><ul><li><a href="http://www.mozilla.com/" target="_blank">Firefox</a></li><li><a href="http://www.google.com/chrome" target="_blank">Chrome</a></li><li><a href="http://windows.microsoft.com/en-US/internet-explorer/downloads/ie" target="_blank">IE8 / IE9</a></li><li><a href="http://www.maxthon.com/" target="_blank">Maxthon</a> and <a href="http://www.google.com" target="_blank">so on</a>.</li></ul>
readmoreLabel=Read more\u00bb
readmore2Label=Read more
replyLabel=Reply\u00bb
homeLabel=Home
enableArticleUpdateHint1Label=Enable Article Update Hint:
allowVisitDraftViaPermalink1Label=Allow Visit Draft Via Link:
author1Label=Author:
authorLabel=Author
keyOfSolo1Label=Solo Key:
articleLabel=Article
tagArticlesLabel=Tag Articles
dateArticlesLabel=Archive Date Articles
authorArticlesLabel=Author Articles
indexArticleLabel=Index Articles
allTagsLabel=Tag Cloud
customizedPageLabel=Customized Page
killBrowserPageLabel=Kill Browser Page
pageNumLabel=Page Number
####
forbiddenLabel=Forbidden Access!
sorryLabel=Sorry!
notFoundLabel=Not Found!
unPulbishSuccLabel=Un Publish Successfully
unPulbishFailLabel=Un Publish Fail
removeSuccLabel=Remove Successfully
removeFailLabel=Remove Fail
removeUserFailSkinNeedMulUsersLabel=Remove Fail, the current skin need multiple users!
putTopSuccLabel=Put Top Successfully
putTopFailLabel=Put Top Fail
cancelTopSuccLabel=Cancel Top Successfully
cancelTopFailLabel=Cancel Top Fail
addSuccLabel=Add Successfully
addFailLabel=Add Fail
updateSuccLabel=Update Successfully
updateFailLabel=Update Fail
updatePreferenceFailNeedMulUsersLabel=Update Fail, the selected skin need multiple users!
setFailLabel=Set Fail
setSuccLabel=Set Successfully
getFailLabel=Get Fail
noSettingLabel=No Setting
getSuccLabel=Get Successfully
importSuccLabel=Import Successfully :-)
importFailLabel=Some Import Fail %>_<%
noCommentLabel=No Comment
captchaErrorLabel=Captcha Error
inputErrorLabel=Input Error!
gotoLabel=Go
nameEmptyLabel=Username is empty
passwordEmptyLabel=Password is empty
blogEmptyLabel=Blogging service is empty
blogArticleEmptyLabel=Please select articles
nameTooLongLabel=Sorry, your username must be between 2 and 20 characters long.
mailCannotEmptyLabel=Mail is empty
mailInvalidLabel=Mail is invalid
commentContentCannotEmptyLabel=Sorry, your content must be between 2 and 500 characters long.
captchaCannotEmptyLabel=Captcha is empty
loadingLabel=Loading....
titleEmptyLabel=Title is empty
contentEmptyLabel=Content is empty
orderEmptyLabel=Order is empty
abstractEmptyLabel=Abstract is empty
tagsEmptyLabel=Tags is empty
addressEmptyLabel=Address is empty
noAuthorizationURLLabel=Can not retrieve authorization URL from Google, please \
make sure the <em>Consumer Secret</em> you typed in and then try again.
duplicatedPermalinkLabel=Duplicated permalink!
invalidPermalinkFormatLabel=Invalid permalink format!
duplicatedEmailLabel=Duplicated email!
refreshAndRetryLabel=Please refresh and try again!
editorLeaveLabel=Content is not null, Do you leave\uff1f
editorPostLabel=Content is not null, Do you clear\uff1f
####
confirmRemoveLabel=Are You Sure?
confirmInitLabel=Are You Sure?
#
# Copyright (c) 2009, 2010, 2011, B3log Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Description: B3log Solo default language configurations(zh_CN).
# Version: 1.0.6.5, Feb 25, 2012
# Author: Liang Ding
# Author: Liyuan Li
#
adminConsoleLabel=\u540e\u53f0\u7ba1\u7406
adminIndexLabel=\u540e\u53f0\u9996\u9875
postArticleLabel=\u53d1\u5e03\u6587\u7ae0
articleListLabel=\u6587\u7ae0\u7ba1\u7406
commentListLabel=\u8bc4\u8bba\u7ba1\u7406
draftListLabel=\u8349\u7a3f\u5939
userManageLabel=\u7528\u6237\u7ba1\u7406
commonUserLabel=\u4e00\u822c\u7528\u6237
addUserLabel=\u6dfb\u52a0\u7528\u6237
updateUserLabel=\u66f4\u65b0\u7528\u6237
linkManagementLabel=\u94fe\u63a5\u7ba1\u7406
pluginMgmtLabel=\u63d2\u4ef6\u7ba1\u7406
pluginNameLabel=\u63d2\u4ef6\u540d
versionLabel=\u7248\u672c
statusLabel=\u72b6\u6001
enabledLabel=\u5df2\u542f\u7528
disabledLabel=\u5df2\u7981\u7528
enableLabel=\u542f\u7528
disableLabel=\u7981\u7528
preferenceLabel=\u504f\u597d\u8bbe\u5b9a
localeString1Label=\u8bed\u8a00\uff1a
timeZoneId1Label=\u65f6\u533a\uff1a
adminLabel=\u7ba1\u7406
administratorLabel=\u7ba1\u7406\u5458
loginLabel=\u767b\u5f55
logoutLabel=\u767b\u51fa
initLabel=\u521d\u59cb\u5316
popTagsLabel=\u5206\u7c7b\u6807\u7b7e
tag1Label=\u6807\u7b7e\uff1a
tags1Label=\u6807\u7b7e\uff1a
recentArticlesLabel=\u6700\u65b0\u6587\u7ae0
recentCommentsLabel=\u6700\u65b0\u8bc4\u8bba
postCommentsLabel=\u53d1\u8868\u8bc4\u8bba
mostCommentArticlesLabel=\u8bc4\u8bba\u6700\u591a\u7684\u6587\u7ae0
mostViewCountArticlesLabel=\u8bbf\u95ee\u6700\u591a\u7684\u6587\u7ae0
em00Label=\u5fae\u7b11
em01Label=\u5927\u7b11
em02Label=\u9ad8\u5174
em03Label=\u60b2\u4f24
em04Label=\u54ed\u6ce3
em05Label=\u65e0\u8bed
em06Label=\u70e6\u8e81
em07Label=\u751f\u6c14
em08Label=\u6211\u7785
em09Label=\u60ca\u8bb6
em10Label=\u9177
em11Label=\u987d\u76ae
em12Label=\u7231\u5fc3
em13Label=\u5fc3\u788e
em14Label=\u9b54\u9b3c
linkLabel=\u53cb\u60c5\u94fe\u63a5
sumLabel=\u5171
pageLabel=\u9875
commentLabel=\u8bc4\u8bba
linkTitleLabel=\u94fe\u63a5\u6807\u9898
linkTitle1Label=\u6807\u9898\uff1a
updateLabel=\u66f4\u65b0
removeLabel=\u5220\u9664
putTopLabel=\u7f6e\u9876
cancelPutTopLabel=\u53d6\u6d88\u7f6e\u9876
downloadCountLabel=\u4e0b\u8f7d\u6b21\u6570
sizeLabel=\u5927\u5c0f
uploadDateLabel=\u4e0a\u4f20\u65e5\u671f
downloadURLLabel=\u4e0b\u8f7d\u5730\u5740
downloadLabel=\u4e0b\u8f7d
createDateLabel=\u521b\u5efa\u65e5\u671f
updateDateLabel=\u66f4\u65b0\u65e5\u671f
titleLabel=\u6807\u9898
title1Label=\u6807\u9898\uff1a
content1Label=\u6b63\u6587\uff1a
abstract1Label=\u6458\u8981\uff1a
publishLabel=\u53d1\u5e03
unPublishLabel=\u53d6\u6d88\u53d1\u5e03
urlLabel=URL
url1Label=URL (\u8bf7\u4ee5\u534f\u8bae\u5f00\u5934\uff0c\u5982: http://)\uff1a
addLinkLabel=\u6dfb\u52a0\u94fe\u63a5
updateLinkLabel=\u66f4\u65b0\u94fe\u63a5
archiveLabel=\u5b58\u6863
archive1Label=\u5b58\u6863\uff1a
yearLabel=\u5e74
monthLabel=\u6708
blogSyncLabel=\u535a\u5ba2\u540c\u6b65
pageLabel=\u9875\u9762
pageMgmtLabel=\u9875\u9762\u7ba1\u7406
othersLabel=\u5176\u4ed6
fileListLabel=\u6587\u4ef6\u7ba1\u7406
submitUploadLabel=\u4e0a\u4f20
fileNameLabel=\u6587\u4ef6\u540d
paramSettingsLabel=\u53c2\u6570\u8bbe\u7f6e
skinLabel=\u76ae\u80a4
signLabel=\u7b7e\u540d\u6863
sign1Label=\u7b7e\u540d\u6863\uff1a
noSignLabel=\u4e0d\u4f7f\u7528\u7b7e\u540d\u6863
signIsNullLabel=\u8be5\u7b7e\u540d\u6863\u4e3a\u7a7a
statisticLabel=\u535a\u5ba2\u7edf\u8ba1
viewLabel=\u6d4f\u89c8
countLabel=\u7bc7
viewCount1Label=\u6d4f\u89c8\u6b21\u6570\uff1a
articleCount1Label=\u6587\u7ae0\u603b\u6570\uff1a
commentCountLabel=\u8bc4\u8bba\u6570
commentCount1Label=\u8bc4\u8bba\u603b\u6570\uff1a
commentEmotions1Label=\u8868\u60c5\uff1a
commentEmotionsLabel=\u8868\u60c5
commentName1Label=\u59d3\u540d\uff1a
commentNameLabel=\u59d3\u540d
commentEmail1Label=\u90ae\u7bb1\uff1a
commentEmailLabel=\u90ae\u7bb1
commentURL1Label=URL\uff1a
commentURLLabel=URL
commentContent1Label=\u8bc4\u8bba\u5185\u5bb9\uff1a
commentContentLabel=\u8bc4\u8bba\u5185\u5bb9
getDateLabel=\u83b7\u53d6\u65e5\u671f
getArticleLabel=\u83b7\u53d6\u6587\u7ae0
selectDateLabel=\u9009\u62e9\u65e5\u671f
selectDate1Label=\u9009\u62e9\u65e5\u671f\uff1a
importLabel=\u5bfc\u5165
chooseBlog1Label=\u8bf7\u9009\u62e9\u9700\u8981\u7ba1\u7406\u7684\u535a\u5ba2\uff1a
blogArticleImportLabel=\u6587\u7ae0\u5bfc\u5165
blogSyncMgmtLabel=\u535a\u5ba2\u540c\u6b65\u7ba1\u7406
syncMgmtLabel=\u540c\u6b65\u7ba1\u7406\u535a\u5ba2
userName1Label=\u7528\u6237\u540d\uff1a
userPassword1Label=\u5bc6\u7801\uff1a
syncPostLabel=\u540c\u6b65\u53d1\u5e03
syncUpdateLabel=\u540c\u6b65\u66f4\u65b0
syncRemoveLabel=\u540c\u6b65\u5220\u9664
categoryLabel=\u5206\u7c7b
noticeBoard1Label=\u516c\u544a\uff1a
noticeBoardLabel=\u516c\u544a
htmlhead1Label=HTML head\uff1a
indexTagDisplayCnt1Label= \u9996\u9875\u6807\u7b7e\u663e\u793a\u6570\uff1a
indexRecentArticleDisplayCnt1Label=\u6700\u65b0\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
indexRecentCommentDisplayCnt1Label=\u6700\u65b0\u8bc4\u8bba\u663e\u793a\u6570\u76ee\uff1a
indexMostCommentArticleDisplayCnt1Label=\u8bc4\u8bba\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
indexMostViewArticleDisplayCnt1Label=\u8bbf\u95ee\u6700\u591a\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
relevantArticlesDisplayCnt1Label=\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
randomArticlesDisplayCnt1Label=\u968f\u673a\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
externalRelevantArticlesDisplayCnt1Label=\u7ad9\u5916\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
windowSize1Label=\u5206\u9875\u9875\u7801\u6700\u5927\u5bbd\u5ea6\uff1a
pageSize1Label=\u5206\u9875\u6bcf\u9875\u663e\u793a\u6587\u7ae0\u6570\uff1a
blogTitle1Label=\u535a\u5ba2\u6807\u9898\uff1a
blogSubtitle1Label=\u535a\u5ba2\u5b50\u6807\u9898\uff1a
blogHost1Label=\u535a\u5ba2\u5730\u5740\uff1a
submmitCommentLabel=\u63d0\u4ea4\u8bc4\u8bba
saveLabel=\u4fdd\u5b58
tagLabel=\u6807\u7b7e
tagsLabel=\u6807\u7b7e
importedLabel=\u5df2\u5bfc\u5165
captcha1Label=\u9a8c\u8bc1\u7801\uff1a
captchaLabel=\u9a8c\u8bc1\u7801
clearAllCacheLabel=\u6e05\u9664\u6240\u6709\u9875\u9762\u7f13\u5b58
clearCacheLabel=\u6e05\u9664\u672c\u9875\u7f13\u5b58
indexLabel=\u9996\u9875
nextArticle1Label=\u65b0\u4e00\u7bc7\uff1a
previousArticle1Label=\u65e7\u4e00\u7bc7\uff1a
updatedLabel=\u6709\u66f4\u65b0\uff01
topArticleLabel=\u7f6e\u9876\uff01
CSDNBlogLabel=CSDN \u535a\u5ba2
BlogJavaLabel=BlogJava
CnBlogsLabel=\u535a\u5ba2\u56ed
previousPageLabel=\u4e0a\u4e00\u9875
nextPagePabel=\u4e0b\u4e00\u9875
firstPageLabel=\u7b2c\u4e00\u9875
lastPageLabel=\u6700\u540e\u4e00\u9875
returnTo1Label=\u8fd4\u56de\uff1a
tencentLabel=\u817e\u8baf
appKey1Label=App Key:
appSecret1Label=App Secret:
postToTencentMicroblogWhilePublishArticleLabel=\u53d1\u6587\u7ae0\u65f6\u540c\u6b65\u5230\u817e\u8baf\u5fae\u535a\uff1a
postToCommunityLabel=\u53d1\u5e03\u5230\u793e\u533a\uff1a
authorizeTencentMicroblog1Label=\u70b9\u51fb\u56fe\u6807\u8fdb\u884c\u6388\u6743:
googleLabel=Google
OAuthConsumerSecret1Label=OAuth Consumer Secret\uff1a
atomLabel=Atom
relevantArticles1Label=\u76f8\u5173\u9605\u8bfb\uff1a
randomArticles1Label=\u968f\u673a\u9605\u8bfb\uff1a
externalRelevantArticles1Label=\u7ad9\u5916\u76f8\u5173\u9605\u8bfb\uff1a
metaKeywords1Label=Meta Keywords:
metaDescription1Label=Meta Description:
removeUnusedTagsLabel=\u79fb\u9664\u672a\u4f7f\u7528\u6807\u7b7e
goTopLabel=\u9876\u90e8
permalink1Label=\u94fe\u63a5\uff1a
permalinkLabel=\u94fe\u63a5
b3logLabel=<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
killBrowserLabel=<h2>\u8ba9\u6211\u4eec\u653e\u5f03\u4f7f\u7528\u90a3\u4e9b\u8fc7\u65f6\u3001\u4e0d\u5b89\u5168\u7684\u6d4f\u89c8\u5668\u5427\uff01</h2><p>\u4e3a\u4e86\u8ba9\u6d4f\u89c8\u5668\u66f4\u597d\u7684\u53d1\u5c55\uff0c\u4eba\u7c7b\u66f4\u52a0\u7684\u8fdb\u6b65\uff0c\u62e5\u6709\u66f4\u597d\u7684\u4f53\u9a8c\uff0c\u8ba9\u6211\u4eec\u653e\u5f03\u4f7f\u7528\u90a3\u4e9b\u8fc7\u65f6\u3001\u4e0d\u5b89\u5168\u7684\u6d4f\u89c8\u5668\u3002</p>\u60a8\u53ef\u4ee5\u4e0b\u8f7d<ul><li><a href="http://www.mozilla.com/" target="_blank">\u706b\u72d0</a></li><li><a href="http://www.google.com/chrome" target="_blank">\u8c37\u6b4c\u6d4f\u89c8\u5668</a></li><li><a href="http://windows.microsoft.com/en-US/internet-explorer/downloads/ie" target="_blank">IE8 / IE9</a></li><li><a href="http://www.maxthon.com/" target="_blank">\u9068\u6e38</a>\u6216\u8005<a href="http://www.google.com" target="_blank">\u5176\u5b83\u6d4f\u89c8\u5668</a>.</li></ul>
readmoreLabel=\u9605\u8bfb\u66f4\u591a\u00bb
readmore2Label=\u9605\u8bfb\u66f4\u591a
replyLabel=\u56de\u590d\u00bb
homeLabel=\u9996\u9875
enableArticleUpdateHint1Label=\u542f\u7528\u6587\u7ae0\u66f4\u65b0\u63d0\u793a\uff1a
allowVisitDraftViaPermalink1Label=\u5141\u8bb8\u901a\u8fc7\u94fe\u63a5\u8bbf\u95ee\u8349\u7a3f\uff1a
author1Label=\u4f5c\u8005\uff1a
authorLabel=\u4f5c\u8005
keyOfSolo1Label=Solo Key\uff1a
articleLabel=\u6587\u7ae0
tagArticlesLabel=\u6807\u7b7e\u6587\u7ae0\u5217\u8868
dateArticlesLabel=\u5b58\u6863\u6587\u7ae0\u5217\u8868
authorArticlesLabel=\u4f5c\u8005\u6587\u7ae0\u5217\u8868
indexArticleLabel=\u9996\u9875\u6587\u7ae0\u5217\u8868
allTagsLabel=\u6807\u7b7e\u5899
customizedPageLabel=\u81ea\u5b9a\u4e49\u9875\u9762
killBrowserPageLabel=Kill Browser Page
pageNumLabel=\u9875\u53f7
####
forbiddenLabel=\u64cd\u4f5c\u88ab\u7981\u6b62\uff01
sorryLabel=\u5bf9\u4e0d\u8d77\uff01
notFoundLabel=\u627e\u4e0d\u5230\uff01
unPulbishSuccLabel=\u53d6\u6d88\u53d1\u5e03\u6210\u529f
unPulbishFailLabel=\u53d6\u6d88\u53d1\u5e03\u5931\u8d25
removeSuccLabel=\u5220\u9664\u6210\u529f
removeFailLabel=\u5220\u9664\u5931\u8d25
removeUserFailSkinNeedMulUsersLabel=\u5220\u9664\u5931\u8d25\uff0c\u5f53\u524d\u4f7f\u7528\u7684\u76ae\u80a4\u9700\u8981\u591a\u7528\u6237\u652f\u6301
putTopSuccLabel=\u7f6e\u9876\u6210\u529f
putTopFailLabel=\u7f6e\u9876\u5931\u8d25
cancelTopSuccLabel=\u53d6\u6d88\u7f6e\u9876\u6210\u529f
cancelTopFailLabel=\u53d6\u6d88\u7f6e\u9876\u5931\u8d25
addSuccLabel=\u6dfb\u52a0\u6210\u529f
addFailLabel=\u6dfb\u52a0\u5931\u8d25
updateSuccLabel=\u66f4\u65b0\u6210\u529f
updateFailLabel=\u66f4\u65b0\u5931\u8d25
updatePreferenceFailNeedMulUsersLabel=\u66f4\u65b0\u5931\u8d25\uff0c\u9700\u8981\u591a\u7528\u6237\u624d\u80fd\u4f7f\u7528\u9009\u62e9\u7684\u76ae\u80a4
setFailLabel=\u8bbe\u7f6e\u5931\u8d25
setSuccLabel=\u8bbe\u7f6e\u6210\u529f
getFailLabel=\u83b7\u53d6\u5931\u8d25
noSettingLabel=\u8be5\u535a\u5ba2\u65e0\u8d26\u53f7\uff0c\u8bf7\u6dfb\u52a0
getSuccLabel=\u83b7\u53d6\u6210\u529f
importSuccLabel=\u5bfc\u5165\u6210\u529f :-)
importFailLabel=\u90e8\u5206\u5bfc\u5165\u5931\u8d25 %>_<%
noCommentLabel=\u6682\u65e0\u8bc4\u8bba
captchaErrorLabel=\u9a8c\u8bc1\u7801\u9519\u8bef
inputErrorLabel=\u8f93\u5165\u9519\u8bef\uff01
gotoLabel=\u8df3\u8f6c
nameEmptyLabel=\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a\uff01
passwordEmptyLabel=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01
blogEmptyLabel=\u8bf7\u9009\u62e9\u535a\u5ba2\u670d\u52a1\uff01
blogArticleEmptyLabel=\u8bf7\u9009\u62e9\u9700\u8981\u5bfc\u5165\u7684\u6587\u7ae0
nameTooLongLabel=\u59d3\u540d\u53ea\u80fd\u4e3a 2 \u5230 20 \u4e2a\u5b57\u7b26\uff01
mailCannotEmptyLabel=\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a\uff01
mailInvalidLabel=\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e\uff01
commentContentCannotEmptyLabel=\u8bc4\u8bba\u5185\u5bb9\u53ea\u80fd\u4e3a 2 \u5230 500 \u4e2a\u5b57\u7b26\uff01
captchaCannotEmptyLabel=\u9a8c\u8bc1\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01
loadingLabel=\u8f7d\u5165\u4e2d....
titleEmptyLabel=\u6807\u9898\u4e0d\u80fd\u4e3a\u7a7a\uff01
contentEmptyLabel=\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a\uff01
orderEmptyLabel=\u5e8f\u53f7\u4e0d\u80fd\u4e3a\u7a7a\uff01
abstractEmptyLabel=\u6458\u8981\u4e0d\u80fd\u4e3a\u7a7a\uff01
tagsEmptyLabel=\u6807\u7b7e\u4e0d\u80fd\u4e3a\u7a7a\uff01
addressEmptyLabel=\u5730\u5740\u4e0d\u80fd\u4e3a\u7a7a\uff01
noAuthorizationURLLabel=\u4ece Google \u83b7\u53d6\u6388\u6743\u5730\u5740\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4\u60a8\u8f93\u5165\u7684 \
<em>Consumer Secret</em> \u662f\u6b63\u786e\u7684\uff0c\u7136\u540e\u8fdb\u884c\u91cd\u8bd5\u3002
duplicatedPermalinkLabel=\u94fe\u63a5\u91cd\u590d\uff01
invalidPermalinkFormatLabel=\u975e\u6cd5\u7684\u94fe\u63a5\u683c\u5f0f\uff01
duplicatedEmailLabel=\u90ae\u4ef6\u5730\u5740\u91cd\u590d\uff01
refreshAndRetryLabel=\u8bf7\u5237\u65b0\u91cd\u8bd5\uff01
editorLeaveLabel=\u7f16\u8f91\u5668\u4e2d\u8fd8\u6709\u5185\u5bb9\uff0c\u662f\u5426\u79bb\u5f00\uff1f
editorPostLabel=\u7f16\u8f91\u5668\u4e2d\u8fd8\u6709\u5185\u5bb9\uff0c\u662f\u5426\u6e05\u7a7a\uff1f
####
confirmRemoveLabel=\u786e\u5b9a\u5220\u9664\uff1f
confirmInitLabel=\u786e\u5b9a\u8fdb\u884c\u521d\u59cb\u5316\u5417\uff1f
<div id="sideNavi" class="side-navi">
<#if "" != noticeBoard>
<ul class="marginTop12">
<li>
<h4>${noticeBoardLabel}</h4>
</li>
<li class="side-navi-notice">${noticeBoard}</li>
</ul>
<div class="line"></div>
</#if>
<#if 0 != recentComments?size>
<ul>
<li>
<h4>${recentCommentsLabel}</h4>
</li>
<li>
<ul id="recentComments">
<#list recentComments as comment>
<li>
<#if "http://" == comment.commentURL>
${comment.commentName}<#else>
<a target="_blank" href="${comment.commentURL}">
${comment.commentName}</a></#if>:
<a rel="nofollow" class='side-comment' title="${comment.commentContent}" href="${servePath}${comment.commentSharpURL}">
${comment.commentContent}
</a>
</li>
</#list>
</ul>
</li>
</ul>
<div class="line"></div>
</#if>
<#if 0 != mostCommentArticles?size>
<ul>
<li>
<h4>${mostCommentArticlesLabel}</h4>
</li>
<li>
<ul>
<#list mostCommentArticles as article>
<li>
<sup>[${article.articleCommentCount}]</sup><a rel="nofollow" title="${article.articleTitle}" href="${servePath}${article.articlePermalink}">${article.articleTitle}</a>
</li>
</#list>
</ul>
</li>
</ul>
<div class="line"></div>
</#if>
<#if 0 != mostViewCountArticles?size>
<ul>
<li>
<h4>${mostViewCountArticlesLabel}</h4>
</li>
<li>
<ul id="mostViewCountArticles">
<#list mostViewCountArticles as article>
<li>
<sup>[${article.articleViewCount}]</sup><a trel="nofollow" itle="${article.articleTitle}" href="${servePath}${article.articlePermalink}">${article.articleTitle}</a>
</li>
</#list>
</ul>
</li>
</ul>
<div class="line"></div>
</#if>
<#if 0 != mostUsedTags?size>
<ul>
<li>
<h4>${popTagsLabel}</h4>
</li>
<li>
<ul>
<#list mostUsedTags as tag>
<li>
<a rel="alternate" href="${servePath}/tag-articles-feed.do?oId=${tag.oId}" class="no-underline">
<img alt="${tag.tagTitle}" src="${staticServePath}/images/feed.png"/>
</a>
<a rel="tag" title="${tag.tagTitle}(${tag.tagPublishedRefCount})" href="${servePath}/tags/${tag.tagTitle?url('UTF-8')}">
${tag.tagTitle}</a>
(${tag.tagPublishedRefCount})
</li>
</#list>
</ul>
</li>
</ul>
<div class="line"></div>
</#if>
<#if 0 != links?size>
<ul>
<li>
<h4>${linkLabel}</h4>
</li>
<li>
<ul id="sideLink">
<#list links as link>
<li>
<a rel="friend" href="${link.linkAddress}" title="${link.linkTitle}" target="_blank">
<img alt="${link.linkTitle}"
src="http://www.google.com/s2/u/0/favicons?domain=<#list link.linkAddress?split('/') as x><#if x_index=2>${x}<#break></#if></#list>" /></a>
<a rel="friend" href="${link.linkAddress}" title="${link.linkTitle}" target="_blank">${link.linkTitle}
</a>
<#-- ${link.linkDescription} -->
</li>
</#list>
</ul>
</li>
</ul>
<div class="line"></div>
</#if>
<#if 0 != archiveDates?size>
<ul>
<li>
<h4>${archiveLabel}</h4>
</li>
<li>
<ul id="archiveSide">
<#list archiveDates as archiveDate>
<li data-year="${archiveDate.archiveDateYear}">
<#if "en" == localeString?substring(0, 2)>
<a href="${servePath}/archives/${archiveDate.archiveDateYear}/${archiveDate.archiveDateMonth}"
title="${archiveDate.monthName} ${archiveDate.archiveDateYear}(${archiveDate.archiveDatePublishedArticleCount})">
${archiveDate.monthName} ${archiveDate.archiveDateYear}</a>(${archiveDate.archiveDatePublishedArticleCount})
<#else>
<a href="${servePath}/archives/${archiveDate.archiveDateYear}/${archiveDate.archiveDateMonth}"
title="${archiveDate.archiveDateYear} ${yearLabel} ${archiveDate.archiveDateMonth} ${monthLabel}(${archiveDate.archiveDatePublishedArticleCount})">
${archiveDate.archiveDateYear} ${yearLabel} ${archiveDate.archiveDateMonth} ${monthLabel}</a>(${archiveDate.archiveDatePublishedArticleCount})
</#if>
</li>
</#list>
</ul>
</li>
</ul>
</#if>
</div>
<#include "macro-head.ftl">
<!DOCTYPE html>
<html>
<head>
<@head title="${allTagsLabel} - ${blogTitle}">
<meta name="keywords" content="${metaKeywords},${allTagsLabel}"/>
<meta name="description" content="<#list tags as tag>${tag.tagTitle}<#if tag_has_next>,</#if></#list>"/>
</@head>
</head>
<body>
${topBarReplacement}
<div class="content">
<div class="header">
<#include "header.ftl">
</div>
<div class="body">
<div class="left main">
<div>
<ul id="tags">
<#list tags as tag>
<li>
<a rel="tag" data-count="${tag.tagPublishedRefCount}"
href="${servePath}/tags/${tag.tagTitle?url('UTF-8')}" title="${tag.tagTitle}">
<span>${tag.tagTitle}</span>
(<b>${tag.tagPublishedRefCount}</b>)
</a>
</li>
</#list>
</ul>
</div>
</div>
<div class="right side">
<#include "side.ftl">
</div>
<div class="clear"></div>
</div>
<div class="footer">
<#include "footer.ftl">
</div>
</div>
<script type="text/javascript">
Util.buildTags();
</script>
</body>
</html>
......@@ -9,31 +9,17 @@
</head>
<body>
${topBarReplacement}
<div class="content">
<div class="header">
<#include "header.ftl">
</div>
<div class="body">
<div class="left main">
<div>
<h2 class="marginLeft12 marginBottom12">${archive1Label}
<#if "en" == localeString?substring(0, 2)>
${archiveDate.archiveDateMonth} ${archiveDate.archiveDateYear} (${archiveDate.archiveDatePublishedArticleCount})
<#else>
${archiveDate.archiveDateYear} ${yearLabel} ${archiveDate.archiveDateMonth} ${monthLabel} (${archiveDate.archiveDatePublishedArticleCount})
</#if>
</h2>
</div>
<#include "article-list.ftl">
</div>
<div class="right side">
<#include "side.ftl">
</div>
<div class="clear"></div>
</div>
<div class="footer">
<#include "footer.ftl">
</div>
<#include "header.ftl">
<div class="body">
<h2>${archive1Label}
<#if "en" == localeString?substring(0, 2)>
${archiveDate.archiveDateMonth} ${archiveDate.archiveDateYear} (${archiveDate.archiveDatePublishedArticleCount})
<#else>
${archiveDate.archiveDateYear} ${yearLabel} ${archiveDate.archiveDateMonth} ${monthLabel} (${archiveDate.archiveDatePublishedArticleCount})
</#if>
</h2>
<#include "article-list.ftl">
</div>
<#include "footer.ftl">
</body>
</html>
<#include "macro-head.ftl">
<!DOCTYPE html>
<html>
<head>
<@head title="${blogTitle}">
<meta name="keywords" content="${metaKeywords},${archiveLabel}"/>
<meta name="description" content="${metaDescription},${archiveLabel}"/>
</@head>
</head>
<body>
${topBarReplacement}
<#include "header.ftl">
<div class="body">
<#if 0 != archiveDates?size>
<div class="other-main archives">
<#list archiveDates as archiveDate>
<span data-year="${archiveDate.archiveDateYear}">
<#if "en" == localeString?substring(0, 2)>
<a href="${servePath}/archives/${archiveDate.archiveDateYear}/${archiveDate.archiveDateMonth}"
title="${archiveDate.monthName} ${archiveDate.archiveDateYear}(${archiveDate.archiveDatePublishedArticleCount})">
${archiveDate.monthName} ${archiveDate.archiveDateYear}(${archiveDate.archiveDatePublishedArticleCount})</a>
<#else>
<a href="${servePath}/archives/${archiveDate.archiveDateYear}/${archiveDate.archiveDateMonth}"
title="${archiveDate.archiveDateYear} ${yearLabel} ${archiveDate.archiveDateMonth} ${monthLabel}(${archiveDate.archiveDatePublishedArticleCount})">
${archiveDate.archiveDateYear} ${yearLabel} ${archiveDate.archiveDateMonth} ${monthLabel}(${archiveDate.archiveDatePublishedArticleCount})</a>
</#if>
</span>
</#list>
</div>
</#if>
</div>
<#include "footer.ftl">
</body>
</html>
<ul>
<#list articles as article>
<li class="article">
<div class="article-title">
<h2>
<a rel="bookmark" class="ft-gray" href="${servePath}${article.articlePermalink}">
${article.articleTitle}
</a>
<#if article.hasUpdated>
<sup>
${updatedLabel}
</sup>
</#if>
<#if article.articlePutTop>
<sup>
${topArticleLabel}
</sup>
</#if>
</h2>
<div class="right">
<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}
</div>
<div id="content${article.oId}" class="none"></div>
</div>
<div class="article-info">
<div class="right ft-gray">
<#if article.hasUpdated>
${article.articleUpdateDate?string("yy-MM-dd HH:mm")}
<#else>
${article.articleCreateDate?string("yy-MM-dd HH:mm")}
</#if>
<a rel="nofollow" href="${servePath}/authors/${article.authorId}">${article.authorName}</a>
</div>
<div class="left ft-gray">
${tag1Label}
<#list article.articleTags?split(",") as articleTag>
<a rel="tag" href="${servePath}/tags/${articleTag?url('UTF-8')}">
${articleTag}</a><#if articleTag_has_next>, </#if>
</#list>
</div>
<div class="clear"></div>
</div>
</li>
</#list>
</ul>
<#if paginationCurrentPageNum != paginationPageCount>
<div class="article-next ft-gray" onclick="getNextPage()" data-page="${paginationCurrentPageNum}">${moreLabel}</div>
</#if>
\ No newline at end of file
<#include "macro-head.ftl">
<#include "macro-comments.ftl">
<!DOCTYPE html>
<html>
<head>
<@head title="${article.articleTitle} - ${blogTitle}">
<meta name="keywords" content="${article.articleTags}" />
<meta name="description" content="${article.articleAbstract?html}" />
</@head>
</head>
<body>
${topBarReplacement}
<#include "header.ftl">
<div class="body">
<div class="article">
<div class="article-title">
<h2>
<a class="ft-gray" href="${servePath}${article.articlePermalink}">
${article.articleTitle}
</a>
<#if article.hasUpdated>
<sup>
${updatedLabel}
</sup>
</#if>
<#if article.articlePutTop>
<sup>
${topArticleLabel}
</sup>
</#if>
</h2>
<div class="right">
<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">
${article.articleContent}
<#if "" != article.articleSign.signHTML?trim>
<p>
${article.articleSign.signHTML}
</p>
</#if>
</div>
<div class="article-info">
<div class="right ft-gray">
<#if article.hasUpdated>
${article.articleUpdateDate?string("yy-MM-dd HH:mm")}
<#else>
${article.articleCreateDate?string("yy-MM-dd HH:mm")}
</#if>
<a rel="nofollow" href="${servePath}/authors/${article.authorId}">${article.authorName}</a>
</div>
<div class="left ft-gray">
${tag1Label}
<#list article.articleTags?split(",") as articleTag>
<a rel="tag" href="${servePath}/tags/${articleTag?url('UTF-8')}">${articleTag}</a><#if articleTag_has_next>,</#if>
</#list>
</div>
<div class="clear"></div>
</div>
<div>
<#if 0 != relevantArticlesDisplayCount>
<div id="relevantArticles" class="article-relative"></div>
</#if>
<#if 0 != randomArticlesDisplayCount>
<div id="randomArticles" class="article-relative"></div>
</#if>
<div class="clear"></div>
</div>
<div>
<#if nextArticlePermalink??>
<div class="left">
<span class="ft-gray">&lt;</span>
<a href="${servePath}${nextArticlePermalink}">${nextArticleTitle}</a>
</div>
</#if>
<#if previousArticlePermalink??>
<div class="right">
<a href="${servePath}${previousArticlePermalink}">${previousArticleTitle}</a>
<span class="ft-gray">&gt;</span>
</div>
</#if>
<div class="clear"></div>
</div>
</div>
<@comments commentList=articleComments article=article></@comments>
</div>
<#include "footer.ftl">
<@comment_script oId=article.oId>
page.tips.externalRelevantArticlesDisplayCount = "${externalRelevantArticlesDisplayCount}";
<#if 0 != randomArticlesDisplayCount>
page.loadRandomArticles('<h4 class="ft-gray">${randomArticlesLabel}</h4>');
</#if>
<#if 0 != relevantArticlesDisplayCount>
page.loadRelevantArticles('${article.oId}', '<h4 class="ft-gray">${relevantArticlesLabel}</h4>');
</#if>
<#if 0 != externalRelevantArticlesDisplayCount>
page.loadExternalRelevantArticles("<#list article.articleTags?split(",") as articleTag>${articleTag}<#if articleTag_has_next>,</#if></#list>");
</#if>
</@comment_script>
</body>
</html>
......@@ -9,27 +9,11 @@
</head>
<body>
${topBarReplacement}
<div class="content">
<div class="header">
<#include "header.ftl">
</div>
<div class="body">
<div class="left main">
<div>
<h2 class="marginLeft12 marginBottom12">
${author1Label}${authorName}
</h2>
</div>
<#include "article-list.ftl">
</div>
<div class="right side">
<#include "side.ftl">
</div>
<div class="clear"></div>
</div>
<div class="footer">
<#include "footer.ftl">
</div>
<#include "header.ftl">
<div class="body">
<h2>${author1Label}${authorName}</h2>
<#include "article-list.ftl">
</div>
<#include "footer.ftl">
</body>
</html>
/*
* skin ease style for IE8
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.0.1, May 22, 2012
*/
.nav {
border-top: 1px solid #e2e2e2;
border-bottom: 1px solid #e2e2e2;
}
.article-next {
border: 1px solid #e2e2e2;
border-top-color: #fefefe;
}
.article-next:hover {
background-color: #f2f2f2;
border: 1px solid #e2e2e2;
}
.comment-body-ref {
border: 1px solid #e2e2e2;
}
#tags a,
.archives > div,
.dynamic .module,
.form input[type="text"],
.form input[type="password"],
.form textarea,
.article-relative {
border: 1px solid #f2f2f2;
}
#tags a:hover,
.archives>div:hover,
.dynamic .module:hover,
.form input:focus,
.form textarea:focus,
.article-relative:hover {
border: 1px solid #e2e2e2;
}
.article-relative {
width: 363px;
}
\ No newline at end of file
.nav{border-top:1px solid #e2e2e2;border-bottom:1px solid #e2e2e2;}
.article-next{border:1px solid #e2e2e2;border-top-color:#fefefe;}
.article-next:hover{background-color:#f2f2f2;border:1px solid #e2e2e2;}
#tags a,.archives > div,.dynamic .module,.form input[type=text],.form input[type=password],.form textarea,.article-relative{border:1px solid #f2f2f2;}
.article-relative{width:363px;}
.comment-body-ref,#tags a:hover,.archives>div:hover,.dynamic .module:hover,.form input:focus,.form textarea:focus,.article-relative:hover{border:1px solid #e2e2e2;}
\ No newline at end of file
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* skin ease style
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.1.3, Jun 27, 2012
*/
/* start base */
html, body, div, ul, li {
margin: 0;
padding: 0;
}
body {
font-family: Verdana,arial,\5fae\8f6f\96c5\9ed1;
font-size: 12px;
}
a {
outline: none;
color: #009EB8;
text-decoration: none;
}
a:visited {
color: #00b4d2;
}
a:hover {
text-decoration: underline;
}
a:active {
color: #00889f;
}
img {
vertical-align: middle;
border: 0;
}
textarea, input {
outline: none;
}
sup {
font-size: 10px;
font-weight: normal;
-webkit-text-size-adjust: none;
}
.left {
float: left;
}
.right {
float: right;
}
.clear {
background-color: transparent;
border: 0;
clear: both;
display: block;
font-size: 0;
height: 0;
line-height: 0;
overflow: hidden;
}
.none {
display: none;
}
.ft-gray {
color: #808080;
}
.ft-gray:visited {
color: #9a9a9a
}
.ft-gray:hover {
color: #676767;
text-decoration: none;
}
.logo {
padding: 0 5px;
text-shadow: 0 0 1px #D5D5D5;
}
.em00, .em01, .em02, .em03, .em04, .em05, .em06, .em07, .em08, .em09,
.em10, .em11, .em12, .em13, .em14 {
cursor: pointer;
background-image: url("../../ease/images/emotions/emotions-ease.png");
float: left;
height: 24px;
margin-right: 5px;
width: 24px;
transition: all .2s ease-out;
-webkit-transition: all .2s ease-out;
-moz-transition: all .2s ease-out;
}
#emotions span:hover {
transform: scale(1.2) rotate(360deg);
-webkit-transform: scale(1.2) rotate(360deg);
-moz-transform: scale(1.2) rotate(360deg);
}
.em01 {
background-position: -24px 0;
}
.em02 {
background-position: -48px 0;
}
.em03 {
background-position: -72px 0;
}
.em04 {
background-position: -96px 1px;
}
.em05 {
background-position: 0 -24px;
}
.em06 {
background-position: -24px -24px;
}
.em07 {
background-position: -48px -24px;
}
.em08 {
background-position: -72px -24px;
}
.em09 {
background-position: -96px -24px;
}
.em10 {
background-position: 0 -48px;
}
.em11 {
background-position: -24px -48px ;
}
.em12 {
background-position: -48px -48px;
}
.em13 {
background-position: -72px -48px;
}
.em14 {
background-position: -96px -48px;
}
/* end base */
/* start ico */
#search,
.translate-ico {
background-image: url("/skins/ease/images/icons.png");
}
.translate-ico {
background-position: 1px -125px;
background-repeat: no-repeat;
border: 1px solid #D5D5D5;
border-radius: 3px;
cursor: pointer;
float: right;
height: 16px;
margin: -3px 0 0 15px;;
padding: 1px;
width: 16px;
}
.translate-ico:hover {
border-color: #9a9a9a;
box-shadow: 0 0 1px #808080;
background-color: #FCFCFC;
}
/* end ico */
/* start frame */
.wrapper {
margin: 0 50px;
}
.body {
margin: 0 auto 50px;
width: 990px;
}
/* end frame */
/* start header */
.header {
width: 100%;
background-color: #FCFCFC;
z-index: 1;
}
.header .title {
border-bottom: 1px solid #808080;
font-size: 26px;
font-weight: normal;
}
.header .sub-title {
font-size: 11px;
}
#search {
background-position: 7px -99px;
background-repeat: no-repeat;
background-color: #FFF;
border: 1px solid #D5D5D5;
border-radius: 2px 2px 2px 2px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset;
color: #808080;
float: right;
font-size: 14px;
height: 19px;
line-height: 145%;
padding: 4px 10px 4px 28px;
width: 24px;
-moz-transition: width 0.4s ease, background 0.4s ease;
-webkit-transition: width 0.4s ease, background 0.4s ease;
transition: width 0.4s ease, background 0.4s ease;
}
#search:focus {
background-color: #FCFCFC;
width: 196px;
}
.banner {
margin-bottom: 20px;
}
.banner .notice {
float: left;
margin: 20px 0 0 50px;
}
.nav {
background-color: #2C2C2C;
box-shadow: 0 2px 2px #D5D5D5, 0 3px 3px -3px #D5D5D5 inset;
height: 29px;
top: 0;
width: 100%;
}
.nav ul {
list-style: none;
float: left;
}
.nav li {
float: left;
}
.nav a {
color: #C9C9C9;
display: block;
float: left;
font-size: 14px;
font-weight: 700;
line-height: 29px;
margin-right: 20px;
padding: 0 10px;
text-decoration: none;
transition: color .4s ease, background-color .8s ease;
-webkit-transition: color .4s ease, background-color .8s ease;
-moz-transition: color .4s ease, background-color .8s ease;
}
.nav a:hover {
color: #FFF;
background-color: #535353;
}
.nav a.current {
background-color: #FFF;
box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.1) inset, 0 1px 1px rgba(0, 0, 0, 0.1) inset;
color: #808080;
}
.nav img {
margin-left: 3px;
}
/* end header */
/* start footer */
.footer {
background-color: #FCFCFC;
border-top: 2px solid #D5D5D5;
font-size: 11px;
padding: 12px 0;
-webkit-text-size-adjust: none;
}
#goTop {
background: url("/skins/ease/images/icons.png") no-repeat scroll 5px -51px #D5D5D5;
border-radius: 2px 2px 0 0;
cursor: pointer;
font-size: 11px;
height: 21px;
line-height: 21px;
padding: 0 10px 0 23px;
position: absolute;
right: 50px;
display: none;
}
#goTop:hover {
background-color: #D5D5D5;
}
/* end footer*/
/* start article list */
.body > ul {
list-style: none;
}
.article {
border-bottom: 1px solid #f6f6f6;
padding: 20px 70px 20px;
}
.article:hover {
border-bottom-color: #D5D5D5;
box-shadow: 0 0 1px #f6f6f6 inset;
background-color: #FCFCFC;
}
.article-body {
line-height: 145%;
overflow: hidden;
word-wrap: break-word;
}
.article-body ol, .article-body ul {
margin-left: 40px;
}
.article-body a {
color: #808080;
text-decoration: underline;
}
.article-body a:vidited {
color: #9a9a9a
}
.article-body a:hover {
color: #676767;
}
.article-body>div {
min-height: 32px;
}
.article-title h2 {
display: inline;
}
.article-title span {
cursor: pointer;
}
.article-next {
background-color: #FCFCFC;
box-shadow: 0 0 3px #D5D5D5 inset;
cursor: pointer;
font-size: 14px;
line-height: 36px;
text-align: center;
}
.article-next:hover {
box-shadow: 0 0 3px #D5D5D5, 0 0 3px #D5D5D5 inset;
}
/* end article list */
/* start article */
.article-relative {
background-color: #FCFCFC;
box-shadow: 0 0 2px #D5D5D5;
float: left;
margin: 20px 0;
padding: 0 20px 10px;
width: 365px;
}
.article-relative:hover {
background-color: #fff;
box-shadow: 0 0 4px #D5D5D5;
}
.article-relative ul {
list-style: none;
}
#relevantArticles {
margin-right: 40px;
}
#externalRelevantArticles {
width: 297px;
margin-top: 0;
}
/* end article*/
/* start comment */
#comments {
padding: 20px 70px 20px;
position: relative;
}
.comment-header {
float: left;
background-color: #FFF;
border: 1px solid #DEDEDE;
padding: 2px;
height: 60px;
width: 60px;
}
.comment-panel {
float: left;
line-height: 16px;
margin: 0 10px 20px;
min-height: 64px;
overflow: hidden;
width: 760px;
}
.comment-body-ref {
background-color: #FCFCFC;
box-shadow: 0 0 2px #D5D5D5;
display: block;
left: 140px;
padding: 10px;
opacity: 0.9;
filter: alpha(opacity=90);
position: absolute;
}
.comment-body-ref > .comment-header {
border: 0 none;
float: right;
height: 48px;
width: 48px;
padding: 0;
}
.comment-body-ref > .comment-panel {
margin: 0 20px 0 0;
min-height: 48px;
width: 756px;
}
.form {
padding: 0 70px 20px;
float: left;
}
.form th {
text-align: right;
white-space: nowrap;
}
.form input[type="text"],
.form input[type="password"],
.form textarea {
background-color: #FCFCFC;
border-width: 0;
box-shadow: 0 0 2px #BCBCBC;
font-family: Verdana,arial,\5fae\8f6f\96c5\9ed1;
font-size: 12px;
margin: 0 5px 10px 0;
outline: medium none;
padding: 0 3px;
height: 28px;
line-height: 28px;
width: 260px;
}
.form input:focus,
.form textarea:focus {
box-shadow: 0 0 4px #D5D5D5;
}
.form textarea {
height: 120px;
overflow: auto;
width: 426px;
line-height: 16px;
}
.form button {
background-color: #F6F6F6;
border: 0 none;
box-shadow: 0 0 2px #D5D5D5;
height: 28px;
line-height: 28px;
padding: 0 12px;
color: #A7A7A7;
}
.form button:hover {
box-shadow: 0 0 4px #D5D5D5;
text-shadow: 0 0 2px;
}
.form img {
background-color: #FCFCFC;
box-shadow: 0 0 2px #D5D5D5;
cursor: pointer;
height: 24px;
padding: 1px;
}
/* end comment */
/* start tags */
#tags li {
float: left;
height: 38px;
}
#tags a {
margin: 3px 6px;
padding: 3px 12px;
background-color: #FCFCFC;
box-shadow: 0 0 2px #D5D5D5;
float: left;
}
#tags a:hover {
text-shadow: 0 0 2px;
text-decoration: none;
box-shadow: 0 0 4px #D5D5D5;
}
.tags1, .tags1:visited {
font-size: 12px;
color: #a7a7a7;
}
.tags2, .tags2:visited {
font-size: 14px;
color: #808080;
}
.tags3, .tags3:visited {
font-size: 16px;
color: #595959;
}
.tags4, .tags4:visited {
font-size: 18px;
color: #323232;
}
.tags5, .tags5:visited {
font-size: 20px;
color: #0a0a0a;
}
/* end tags */
/* start archives */
.archives {
position: relative;
}
.archives > div {
background-color: #FCFCFC;
box-shadow: 0 0 2px #D5D5D5;
padding-bottom: 20px;
line-height: 20px;
margin: 20px;
width: 276px;
position: absolute;
top: 0;
}
.archives h3 {
text-align: center;
}
.archives > div:hover {
box-shadow: 0 0 4px #D5D5D5;
}
.archives a {
display: block;
margin-left: 80px;
}
/* end archives */
/* start dynamic */
.dynamic ul {
list-style: none;
}
.dynamic h3 {
text-align: center;
}
.dynamic .module {
background-color: #FCFCFC;
box-shadow: 0 0 2px #D5D5D5;
float: left;
line-height: 20px;
margin: 20px;
padding: 10px 20px 20px;
width: 393px;
}
.dynamic .module:hover {
box-shadow: 0 0 4px #D5D5D5;
}
.dynamic .side-comments {
width: 600px;
}
.dynamic .side-comments .comment-panel {
width: 510px;
}
.dynamic .side-tags {
width: 186px;
}
.dynamic .side-tags li {
float: left;
margin: 0 5px;
}
/* end dynamic */
/* start links */
.links li {
float: left;
margin: 0 20px 10px;
width: 273px;
}
/* end links */
/* start not list */
.other-main {
display: inline-block;
margin: 50px 20px 0;
width: 950px;
}
/* end not list */
\ No newline at end of file
html,body,div,ul,li{margin:0;padding:0;}
body{font-family:Verdana,arial,\5fae\8f6f\96c5\9ed1;font-size:12px;}
a{outline:none;color:#009EB8;text-decoration:none;}
a:visited{color:#00b4d2;}
a:hover{text-decoration:underline;}
a:active{color:#00889f;}
img{vertical-align:middle;border:0;}
textarea,input{outline:none;}
sup{font-size:10px;font-weight:normal;-webkit-text-size-adjust:none;}
.left{float:left;}
.right{float:right;}
.clear{background-color:transparent;border:0;clear:both;display:block;font-size:0;height:0;line-height:0;overflow:hidden;}
.none{display:none;}
.ft-gray{color:#808080;}
.ft-gray:visited{color:#9a9a9a;}
.ft-gray:hover{color:#676767;text-decoration:none;}
.logo{padding:0 5px;text-shadow:0 0 1px #D5D5D5;}
.em00,.em01,.em02,.em03,.em04,.em05,.em06,.em07,.em08,.em09,.em10,.em11,.em12,.em13,.em14{cursor:pointer;background-image:url(../../ease/images/emotions/emotions-ease.png);float:left;height:24px;margin-right:5px;width:24px;transition:all .2s ease-out;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;}
#emotions span:hover{transform:scale(1.2) rotate(360deg);-webkit-transform:scale(1.2) rotate(360deg);-moz-transform:scale(1.2) rotate(360deg);}
.em01{background-position:-24px 0;}
.em02{background-position:-48px 0;}
.em03{background-position:-72px 0;}
.em04{background-position:-96px 1px;}
.em05{background-position:0 -24px;}
.em06{background-position:-24px -24px;}
.em07{background-position:-48px -24px;}
.em08{background-position:-72px -24px;}
.em09{background-position:-96px -24px;}
.em10{background-position:0 -48px;}
.em11{background-position:-24px -48px;}
.em12{background-position:-48px -48px;}
.em13{background-position:-72px -48px;}
.em14{background-position:-96px -48px;}
#search,.translate-ico{background-image:url(/skins/ease/images/icons.png);}
.translate-ico{background-position:1px -125px;background-repeat:no-repeat;border:1px solid #D5D5D5;border-radius:3px;cursor:pointer;float:right;height:16px;margin:-3px 0 0 15px;padding:1px;width:16px;}
.translate-ico:hover{border-color:#9a9a9a;box-shadow:0 0 1px #808080;background-color:#FCFCFC;}
.wrapper{margin:0 50px;}
.body{margin:0 auto 50px;width:990px;}
.header{width:100%;background-color:#FCFCFC;z-index:1;}
.header .title{border-bottom:1px solid #808080;font-size:26px;font-weight:normal;}
.header .sub-title{font-size:11px;}
#search{background-position:7px -99px;background-repeat:no-repeat;background-color:#FFF;border:1px solid #D5D5D5;border-radius:2px 2px 2px 2px;box-shadow:0 1px 1px rgba(0,0,0,0.1) inset;color:#808080;float:right;font-size:14px;height:19px;line-height:145%;padding:4px 10px 4px 28px;width:24px;-moz-transition:width .4s ease, background .4s ease;-webkit-transition:width .4s ease, background .4s ease;transition:width .4s ease, background .4s ease;}
#search:focus{background-color:#FCFCFC;width:196px;}
.banner{margin-bottom:20px;}
.banner .notice{float:left;margin:20px 0 0 50px;}
.nav{background-color:#2C2C2C;box-shadow:0 2px 2px #D5D5D5, 0 3px 3px -3px #D5D5D5 inset;height:29px;top:0;width:100%;}
.nav ul{list-style:none;float:left;}
.nav li{float:left;}
.nav a{color:#C9C9C9;display:block;float:left;font-size:14px;font-weight:700;line-height:29px;margin-right:20px;padding:0 10px;text-decoration:none;transition:color .4s ease, background-color .8s ease;-webkit-transition:color .4s ease, background-color .8s ease;-moz-transition:color .4s ease, background-color .8s ease;}
.nav a:hover{color:#FFF;background-color:#535353;}
.nav a.current{background-color:#FFF;box-shadow:0 -1px 1px rgba(0,0,0,0.1) inset, 0 1px 1px rgba(0,0,0,0.1) inset;color:#808080;}
.nav img{margin-left:3px;}
.footer{background-color:#FCFCFC;border-top:2px solid #D5D5D5;font-size:11px;padding:12px 0;-webkit-text-size-adjust:none;}
#goTop{background:url(/skins/ease/images/icons.png) no-repeat scroll 5px -51px #D5D5D5;border-radius:2px 2px 0 0;cursor:pointer;font-size:11px;height:21px;line-height:21px;padding:0 10px 0 23px;position:absolute;right:50px;display:none;}
#goTop:hover{background-color:#D5D5D5;}
.body > ul{list-style:none;}
.article{border-bottom:1px solid #f6f6f6;padding:20px 70px;}
.article:hover{border-bottom-color:#D5D5D5;box-shadow:0 0 1px #f6f6f6 inset;background-color:#FCFCFC;}
.article-body{line-height:145%;overflow:hidden;word-wrap:break-word;}
.article-body ol,.article-body ul{margin-left:40px;}
.article-body a{color:#808080;text-decoration:underline;}
.article-body a:vidited{color:#9a9a9a;}
.article-body a:hover{color:#676767;}
.article-body>div{min-height:32px;}
.article-title h2{display:inline;}
.article-title span{cursor:pointer;}
.article-next{background-color:#FCFCFC;box-shadow:0 0 3px #D5D5D5 inset;cursor:pointer;font-size:14px;line-height:36px;text-align:center;}
.article-next:hover{box-shadow:0 0 3px #D5D5D5, 0 0 3px #D5D5D5 inset;}
.article-relative{background-color:#FCFCFC;box-shadow:0 0 2px #D5D5D5;float:left;margin:20px 0;padding:0 20px 10px;width:365px;}
.article-relative:hover{background-color:#fff;box-shadow:0 0 4px #D5D5D5;}
.article-relative ul{list-style:none;}
#relevantArticles{margin-right:40px;}
#externalRelevantArticles{width:297px;margin-top:0;}
#comments{padding:20px 70px;position:relative;}
.comment-header{float:left;background-color:#FFF;border:1px solid #DEDEDE;padding:2px;height:60px;width:60px;}
.comment-panel{float:left;line-height:16px;margin:0 10px 20px;min-height:64px;overflow:hidden;width:760px;}
.comment-body-ref{background-color:#FCFCFC;box-shadow:0 0 2px #D5D5D5;display:block;left:140px;padding:10px;opacity:0.9;filter:alpha(opacity=90);position:absolute;}
.comment-body-ref > .comment-header{border:0 none;float:right;height:48px;width:48px;padding:0;}
.comment-body-ref > .comment-panel{margin:0 20px 0 0;min-height:48px;width:756px;}
.form{padding:0 70px 20px;float:left;}
.form th{text-align:right;white-space:nowrap;}
.form input[type=text],.form input[type=password],.form textarea{background-color:#FCFCFC;border-width:0;box-shadow:0 0 2px #BCBCBC;font-family:Verdana,arial,\5fae\8f6f\96c5\9ed1;font-size:12px;margin:0 5px 10px 0;outline:medium none;padding:0 3px;height:28px;line-height:28px;width:260px;}
.form input:focus,.form textarea:focus{box-shadow:0 0 4px #D5D5D5;}
.form textarea{height:120px;overflow:auto;width:426px;line-height:16px;}
.form button{background-color:#F6F6F6;border:0 none;box-shadow:0 0 2px #D5D5D5;height:28px;line-height:28px;padding:0 12px;color:#A7A7A7;}
.form button:hover{box-shadow:0 0 4px #D5D5D5;text-shadow:0 0 2px;}
.form img{background-color:#FCFCFC;box-shadow:0 0 2px #D5D5D5;cursor:pointer;height:24px;padding:1px;}
#tags li{float:left;height:38px;}
#tags a{margin:3px 6px;padding:3px 12px;background-color:#FCFCFC;box-shadow:0 0 2px #D5D5D5;float:left;}
#tags a:hover{text-shadow:0 0 2px;text-decoration:none;box-shadow:0 0 4px #D5D5D5;}
.tags1,.tags1:visited{font-size:12px;color:#a7a7a7;}
.tags2,.tags2:visited{font-size:14px;color:#808080;}
.tags3,.tags3:visited{font-size:16px;color:#595959;}
.tags4,.tags4:visited{font-size:18px;color:#323232;}
.tags5,.tags5:visited{font-size:20px;color:#0a0a0a;}
.archives{position:relative;}
.archives > div{background-color:#FCFCFC;box-shadow:0 0 2px #D5D5D5;padding-bottom:20px;line-height:20px;margin:20px;width:276px;position:absolute;top:0;}
.archives h3{text-align:center;}
.archives > div:hover{box-shadow:0 0 4px #D5D5D5;}
.archives a{display:block;margin-left:80px;}
.dynamic ul{list-style:none;}
.dynamic h3{text-align:center;}
.dynamic .module{background-color:#FCFCFC;box-shadow:0 0 2px #D5D5D5;float:left;line-height:20px;margin:20px;padding:10px 20px 20px;width:393px;}
.dynamic .module:hover{box-shadow:0 0 4px #D5D5D5;}
.dynamic .side-comments{width:600px;}
.dynamic .side-comments .comment-panel{width:510px;}
.dynamic .side-tags{width:186px;}
.dynamic .side-tags li{float:left;margin:0 5px;}
.links li{float:left;margin:0 20px 10px;width:273px;}
.other-main{display:inline-block;margin:50px 20px 0;width:950px;}
\ No newline at end of file
<#include "macro-head.ftl">
<!DOCTYPE html>
<html>
<head>
<@head title="${blogTitle}">
<meta name="keywords" content="${metaKeywords},${dynamicLabel}"/>
<meta name="description" content="${metaDescription},${dynamicLabel}"/>
</@head>
</head>
<body>
${topBarReplacement}
<#include "header.ftl">
<div class="body dynamic">
<div class="other-main">
<#if 0 != recentComments?size>
<div class="module side-comments">
<h3 class="ft-gray">${recentCommentsLabel}</h3>
<ul>
<#list recentComments as comment>
<li>
<img class='comment-header'
alt='${comment.commentName}'
src='${comment.commentThumbnailURL}'/>
<div class='comment-panel'>
<span class="left">
<#if "http://" == comment.commentURL>
${comment.commentName}
<#else>
<a target="_blank" href="${comment.commentURL}">${comment.commentName}</a>
</#if>
</span>
<div class="right ft-gray">
${comment.commentDate?string("yyyy-MM-dd HH:mm:ss")}
<a rel="nofollow" href="${servePath}${comment.commentSharpURL}">${viewLabel}</a>
</div>
<span class="clear"></span>
<div class="article-body">
${comment.commentContent}
</div>
</div>
<div class='clear'></div>
</li>
</#list>
</ul>
</div>
</#if>
<#if 0 != mostUsedTags?size>
<div class="module side-tags">
<h3 class="ft-gray">${popTagsLabel}</h3>
<ul>
<#list mostUsedTags as tag>
<li>
<a rel="tag" href="${servePath}/tags/${tag.tagTitle?url('UTF-8')}"
title="${tag.tagTitle}(${tag.tagPublishedRefCount})">
<span>${tag.tagTitle}</span>
</a>
</li>
</#list>
</ul>
<div class="clear"></div>
</div>
</#if>
<div class="clear"></div>
<#if 0 != mostCommentArticles?size>
<div class="module side-most-comment">
<h3 class="ft-gray">${mostCommentArticlesLabel}</h3>
<ul>
<#list mostCommentArticles as article>
<li>
<a rel="nofollow" class="left" title="${article.articleTitle}"
href="${servePath}${article.articlePermalink}">
${article.articleTitle}
</a>
<a rel="nofollow" class="ft-gray right" href="${servePath}${article.articlePermalink}#comments">
${article.articleCommentCount}&nbsp;&nbsp;${commentLabel}
</a>
<span class="clear"></span>
</li>
</#list>
</ul>
</div>
</#if>
<#if 0 != mostViewCountArticles?size>
<div class="module side-most-view">
<h3 class="ft-gray">${mostViewCountArticlesLabel}</h3>
<ul>
<#list mostViewCountArticles as article>
<li>
<a rel="nofollow" class="left" title="${article.articleTitle}" href="${servePath}${article.articlePermalink}">
${article.articleTitle}
</a>
<a rel="nofollow" class="ft-gray right" href="${servePath}${article.articlePermalink}">
${article.articleViewCount}&nbsp;&nbsp;${viewLabel}
</a>
<span class="clear"></span>
</li>
</#list>
</ul>
</div>
</#if>
<div class="clear"></div>
</div>
</div>
<#include "footer.ftl">
</body>
</html>
<span style="color: gray;">&copy; ${year}</span> - <a href="${servePath}">${blogTitle}</a><br/>
Powered by
<a href="http://b3log.org" target="_blank" class="logo">
${b3logLabel}&nbsp;
<span style="color: orangered; font-weight: bold;">Solo</span></a>,
ver ${version}&nbsp;&nbsp;
Theme by <a rel="friend" href="http://vanessa.b3log.org" target="_blank">Vanessa</a>.
<div class='goTopIcon' onclick='Util.goTop();'></div>
<div class='goBottomIcon' onclick='Util.goBottom();'></div>
<script type="text/javascript" src="${staticServePath}/js/lib/jquery/jquery.min.js" charset="utf-8"></script>
<script type="text/javascript" src="${staticServePath}/js/common${miniPostfix}.js?${staticResourceVersion}" charset="utf-8"></script>
<div class="footer">
<div class="wrapper">
<div class="left">
<span class="ft-gray">&copy; ${year}</span> - <a href="${servePath}">${blogTitle}</a>
Powered by
<a href="http://b3log.org" target="_blank" class="logo">
${b3logLabel}&nbsp;
<span style="color: orangered; font-weight: bold;">Solo</span></a>,
ver ${version}&nbsp;&nbsp;
Theme by <a rel="friend" rel="friend" href="http://vanessa.b3log.org" target="_blank">Vanessa</a>.
</div>
<div class="right">
<div class="left">
${viewCount1Label}
<span class="ft-gray">
${statistic.statisticBlogViewCount}
</span>
&nbsp;&nbsp;
${articleCount1Label}
<span class="ft-gray">
${statistic.statisticPublishedBlogArticleCount}
</span>
&nbsp;&nbsp;
${commentCount1Label}
<span class="ft-gray">
${statistic.statisticPublishedBlogCommentCount}
</span>
</div>
<span class="translate-ico" onclick="goTranslate()"></span>
<div class="clear"></div>
</div>
<div class="clear"></div>
</div>
</div>
<div id="goTop" onclick="Util.goTop()">TOP</div>
<script type="text/javascript">
var latkeConfig = {
"servePath": "${servePath}",
"staticServePath": "${staticServePath}"
};
var Label = {
"tag1Label": "${tag1Label}",
"viewLabel": "${viewLabel}",
"commentLabel": "${commentLabel}",
"topArticleLabel": "${topArticleLabel}",
"updatedLabel": "${updatedLabel}",
"contentLabel": "${contentLabel}",
"abstractLabel": "${abstractLabel}",
"clearAllCacheLabel": "${clearAllCacheLabel}",
"clearCacheLabel": "${clearCacheLabel}",
"adminLabel": "${adminLabel}",
"logoutLabel": "${logoutLabel}",
"skinDirName": "${skinDirName}",
"loginLabel": "${loginLabel}",
"em00Label": "${em00Label}",
"em01Label": "${em01Label}",
"em02Label": "${em02Label}",
......@@ -33,51 +69,8 @@ Theme by <a rel="friend" href="http://vanessa.b3log.org" target="_blank">Vanessa
"em13Label": "${em13Label}",
"em14Label": "${em14Label}"
};
var collapseArchive = function (it, year) {
var tag = true,
text = it.innerHTML;
if (text.indexOf("-") > -1) {
it.innerHTML = text.replace("-", "+");
tag = false;
} else {
it.innerHTML = text.replace("+", "-");
}
$("#archiveSide li").each(function () {
var $this = $(this);
// hide other year month archives
if ($this.data("year") === year) {
if (tag) {
$(this).show();
} else {
$(this).hide();
}
}
});
};
$(document).ready(function () {
var currentYear = (new Date()).getFullYear(),
year = currentYear;
$("#archiveSide li").each(function (i) {
var $this = $(this);
// hide other year month archives
if ($this.data("year") !== currentYear) {
$(this).hide()
}
// append year archive
if (year !== $this.data("year")) {
year = $this.data("year");
$this.before("<li class='pointer'><div onclick='collapseArchive(this, " +
year + ")'>" + year + "&nbsp;\u5e74 +</div></li>");
}
});
Util.init();
Util.replaceSideEm($("#recentComments li"));
});
</script>
<script type="text/javascript" src="${staticServePath}/js/lib/jquery/jquery.min.js" charset="utf-8"></script>
<script type="text/javascript" src="${staticServePath}/js/common${miniPostfix}.js?${staticResourceVersion}" charset="utf-8"></script>
<script type="text/javascript" src="${staticServePath}/skins/${skinDirName}/js/${skinDirName}${miniPostfix}.js?${staticResourceVersion}" charset="utf-8"></script>
${plugins}
<div class="header">
<div class="wrapper banner">
<div class="left">
<h1>
<a class="title ft-gray" href="${servePath}">
${blogTitle}
</a>
</h1>
<span class="sub-title">${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>
</div>
\ No newline at end of file
......@@ -9,22 +9,10 @@
</head>
<body>
${topBarReplacement}
<div class="content">
<div class="header">
<#include "header.ftl">
</div>
<div class="body">
<div class="left main">
<#include "article-list.ftl">
</div>
<div class="right side">
<#include "side.ftl">
</div>
<div class="clear"></div>
</div>
<div class="footer">
<#include "footer.ftl">
</div>
<#include "header.ftl">
<div class="body">
<#include "article-list.ftl">
</div>
<#include "footer.ftl">
</body>
</html>
/*
* Copyright (c) 2009, 2010, 2011, 2012, B3log Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview ease js.
*
* @author <a href="mailto:LLY219@gmail.com">Liyuan Li</a>
* @version 1.0.1.1, Jun 18, 2012
*/
var goTranslate = function () {
window.open("http://translate.google.com/translate?sl=auto&tl=auto&u=" + location.href);
};
var getNextPage = function () {
var $more = $(".article-next");
currentPage += 1;
var path = "/articles/";
if(location.pathname.indexOf("tags") > -1) {
var tagsPathnaem = location.pathname.split("/tags/");
var tags = tagsPathnaem[1].split("/");
path = "/articles/tags/" + tags[0] + "/";
} else if (location.pathname.indexOf("archives") > -1) {
var archivesPathname = location.pathname.split("/archives/");
var archives = archivesPathname[1].split("/");
path = "/articles/archives/" + archives[0] + "/" + archives[1] + "/";
}
$.ajax({
url: latkeConfig.staticServePath + path + currentPage,
type: "GET",
beforeSend: function () {
$more.css("background",
"url(" + latkeConfig.staticServePath + "/skins/ease/images/ajax-loader.gif) no-repeat scroll center center #fefefe");
},
success: function(result, textStatus){
if (!result.sc) {
return;
}
var articlesHTML = "",
pagination = result.rslts.pagination;
// append articles
for (var i = 0; i < result.rslts.articles.length; i++) {
var article = result.rslts.articles[i];
articlesHTML += '<li class="article">' +
'<div class="article-title">' +
'<h2>' +
'<a rel="bookmark" class="ft-gray" href="' + latkeConfig.servePath + article.articlePermalink + '">' +
article.articleTitle +
'</a>';
if (article.hasUpdated) {
articlesHTML += '<sup>' + Label.updatedLabel + '</sup>';
}
if (article.articlePutTop) {
articlesHTML += '<sup>' + Label.topArticleLabel + '</sup>';
}
articlesHTML += '</h2>' +
'<div class="right">' +
'<a rel="nofollow" class="ft-gray" href="' + latkeConfig.servePath + article.articlePermalink + '#comments">' +
+ article.articleCommentCount + '&nbsp;&nbsp;' + Label.commentLabel +
'</a>&nbsp;&nbsp;' +
'<a rel="nofollow" class="ft-gray" href="' + latkeConfig.servePath + article.articlePermalink + '">' +
article.articleViewCount + '&nbsp;&nbsp;' + Label.viewLabel +
'</a>' +
'</div>' +
'<div class="clear"></div>' +
'</div>' +
'<div class="article-body">' +
'<div id="abstract' + article.oId + '">' +
article.articleAbstract +
'</div>' +
'<div id="content' + article.oId + '" class="none"></div>' +
'</div>' +
'<div class="article-info">' +
'<div class="right ft-gray">';
if (article.hasUpdated) {
articlesHTML += Util.toDate(article.articleUpdateDate, 'yy-MM-dd HH:mm');
} else {
articlesHTML += Util.toDate(article.articleCreateDate, 'yy-MM-dd HH:mm');
}
articlesHTML += ' <a href="' + latkeConfig.servePath + '/authors/' + article.authorId + '">' + article.authorName + '</a>' +
'</div>' +
'<div class="left ft-gray">' +
Label.tag1Label + " ";
var articleTags = article.articleTags.split(",");
for (var j = 0; j < articleTags.length; j++) {
articlesHTML += '<a rel="tag" href="' + latkeConfig.servePath + '/tags/' + encodeURIComponent(articleTags[j]) + '">' +
articleTags[j] + '</a>';
if (j < articleTags.length - 1) {
articlesHTML += ", ";
}
}
articlesHTML += '</div>' +
'<div class="clear"></div>' +
'</div>' +
'</li>';
}
$(".body>ul").append(articlesHTML);
// 最后一页处理
if (pagination.paginationPageCount === currentPage) {
$more.remove();
} else {
$more.css("background", "none");
}
}
});
};
var ease = {
$header: $(".header"),
headerH: $(".header").height(),
$body: $(".body"),
$nav: $(".nav"),
getCurrentPage: function () {
var $next = $(".article-next");
if ($next.length > 0) {
window.currentPage = $next.data("page");
}
},
setNavCurrent: function () {
$(".nav ul a").each(function () {
var $this = $(this);
if ($this.attr("href") === latkeConfig.servePath + location.pathname) {
$this.addClass("current");
} else if (/\/[0-9]+$/.test(location.pathname)) {
$(".nav ul li")[0].className = "current";
}
});
},
initCommon: function () {
Util.init();
Util.replaceSideEm($(".recent-comments-content"));
Util.buildTags("tagsSide");
},
initArchives: function () {
var $archives = $(".archives");
if ($archives.length < 1) {
return;
}
var years = [],
$archiveList = $archives.find("span").each(function () {
var year = $(this).data("year"),
tag = true;
for (var i = 0; i < years.length; i++) {
if (year === years[i]) {
tag = false;
break;
}
}
if (tag) {
years.push(year);
}
});
var yearsHTML = "";
for (var j = 0; j < years.length; j++) {
var monthsHTML = "";
for (var l = 0; l < $archiveList.length; l++) {
var $month = $($archiveList[l]);
if ($month.data("year") === years[j]) {
monthsHTML += $month.html();
}
}
yearsHTML += "<div><h3 class='ft-gray'>" + years[j] + "</h3>" + monthsHTML + "</div>";
}
$archives.html(yearsHTML);
// position
var $items = $(".archives>div"),
line = 0,
top = 0,
heights = [];
for (var m = 0; m < $items.length; m++) {
for (var n = 0; n < 3; n++) {
if (m >= $items.length) {
break;
}
$items[m].style.left = (n * 318) + "px";
if (line > 0) {
if ($items[m - 3].style.top !== "") {
top = parseInt($items[m - 3].style.top);
}
$items[m].style.top = $($items[m - 3]).height() + 60 + top + "px";
heights[n] = parseInt($items[m].style.top) + $($items[m]).height() + 60;
} else {
heights[n] = $($items[m]).height() + 60;
}
if (n < 2) {
m += 1;
}
}
line += 1;
}
// archive height
$archives.height(heights.sort()[heights.length - 1]);
},
scrollEvent: function () {
var _it = this;
$(window).scroll(function () {
var y = $(window).scrollTop();
// header event
if (y >= _it.headerH + $("#top").height()) {
_it.$nav.css("position", "fixed");
_it.$body.css("marginTop", "58px");
} else {
_it.$nav.css("position" ,"inherit");
_it.$body.css("marginTop", "0");
}
// go top icon show or hide
if (y > _it.headerH) {
var bodyH = $(window).height();
var top = y + bodyH - 21;
if ($("body").height() - 58 <= y + bodyH) {
top = $(".footer").offset().top - 21;
}
$("#goTop").fadeIn("slow").css("top", top);
} else {
$("#goTop").hide();
}
});
},
setDynamic: function () {
var $dynamic = $(".dynamic");
if ($(".dynamic").length < 1) {
return;
}
var $comments = $dynamic.find(".side-comments"),
$tags = $dynamic.find(".side-tags"),
$mostComment = $dynamic.find(".side-most-comment"),
$mostView = $dynamic.find(".side-most-view");
if ($comments.height() > $tags.height()) {
$tags.height($comments.height());
} else {
$comments.height($tags.height());
}
if ($mostComment.height() > $mostView.height()) {
$mostView.height($mostComment.height());
} else {
$mostComment.height($mostView.height());
}
// emotions
$(".article-body").each(function () {
this.innerHTML = Util.replaceEmString($(this).html());
});
}
};
(function () {
ease.getCurrentPage();
ease.initCommon();
ease.scrollEvent();
ease.setNavCurrent();
ease.initArchives();
ease.setDynamic();
})();
\ No newline at end of file
var goTranslate=function(){window.open("http://translate.google.com/translate?sl=auto&tl=auto&u="+location.href)};var getNextPage=function(){var $more=$(".article-next");currentPage+=1;var path="/articles/";if(location.pathname.indexOf("tags")>-1){var tagsPathnaem=location.pathname.split("/tags/");var tags=tagsPathnaem[1].split("/");path="/articles/tags/"+tags[0]+"/"}else if(location.pathname.indexOf("archives")>-1){var archivesPathname=location.pathname.split("/archives/");var archives=archivesPathname[1].split("/");path="/articles/archives/"+archives[0]+"/"+archives[1]+"/"}$.ajax({url:latkeConfig.staticServePath+path+currentPage,type:"GET",beforeSend:function(){$more.css("background","url("+latkeConfig.staticServePath+"/skins/ease/images/ajax-loader.gif) no-repeat scroll center center #fefefe")},success:function(result,textStatus){if(!result.sc){return}var articlesHTML="",pagination=result.rslts.pagination;for(var i=0;i<result.rslts.articles.length;i++){var article=result.rslts.articles[i];articlesHTML+='<li class="article">'+'<div class="article-title">'+'<h2>'+'<a rel="bookmark" class="ft-gray" href="'+latkeConfig.servePath+article.articlePermalink+'">'+article.articleTitle+'</a>';if(article.hasUpdated){articlesHTML+='<sup>'+Label.updatedLabel+'</sup>'}if(article.articlePutTop){articlesHTML+='<sup>'+Label.topArticleLabel+'</sup>'}articlesHTML+='</h2>'+'<div class="right">'+'<a rel="nofollow" class="ft-gray" href="'+latkeConfig.servePath+article.articlePermalink+'#comments">'+ +article.articleCommentCount+'&nbsp;&nbsp;'+Label.commentLabel+'</a>&nbsp;&nbsp;'+'<a rel="nofollow" class="ft-gray" href="'+latkeConfig.servePath+article.articlePermalink+'">'+article.articleViewCount+'&nbsp;&nbsp;'+Label.viewLabel+'</a>'+'</div>'+'<div class="clear"></div>'+'</div>'+'<div class="article-body">'+'<div id="abstract'+article.oId+'">'+article.articleAbstract+'</div>'+'<div id="content'+article.oId+'" class="none"></div>'+'</div>'+'<div class="article-info">'+'<div class="right ft-gray">';if(article.hasUpdated){articlesHTML+=Util.toDate(article.articleUpdateDate,'yy-MM-dd HH:mm')}else{articlesHTML+=Util.toDate(article.articleCreateDate,'yy-MM-dd HH:mm')}articlesHTML+=' <a href="'+latkeConfig.servePath+'/authors/'+article.authorId+'">'+article.authorName+'</a>'+'</div>'+'<div class="left ft-gray">'+Label.tag1Label+" ";var articleTags=article.articleTags.split(",");for(var j=0;j<articleTags.length;j++){articlesHTML+='<a rel="tag" href="'+latkeConfig.servePath+'/tags/'+encodeURIComponent(articleTags[j])+'">'+articleTags[j]+'</a>';if(j<articleTags.length-1){articlesHTML+=", "}}articlesHTML+='</div>'+'<div class="clear"></div>'+'</div>'+'</li>'}$(".body>ul").append(articlesHTML);if(pagination.paginationPageCount===currentPage){$more.remove()}else{$more.css("background","none")}}})};var ease={$header:$(".header"),headerH:$(".header").height(),$body:$(".body"),$nav:$(".nav"),getCurrentPage:function(){var $next=$(".article-next");if($next.length>0){window.currentPage=$next.data("page")}},setNavCurrent:function(){$(".nav ul a").each(function(){var $this=$(this);if($this.attr("href")===latkeConfig.servePath+location.pathname){$this.addClass("current")}else if(/\/[0-9]+$/.test(location.pathname)){$(".nav ul li")[0].className="current"}})},initCommon:function(){Util.init();Util.replaceSideEm($(".recent-comments-content"));Util.buildTags("tagsSide")},initArchives:function(){var $archives=$(".archives");if($archives.length<1){return}var years=[],$archiveList=$archives.find("span").each(function(){var year=$(this).data("year"),tag=true;for(var i=0;i<years.length;i++){if(year===years[i]){tag=false;break}}if(tag){years.push(year)}});var yearsHTML="";for(var j=0;j<years.length;j++){var monthsHTML="";for(var l=0;l<$archiveList.length;l++){var $month=$($archiveList[l]);if($month.data("year")===years[j]){monthsHTML+=$month.html()}}yearsHTML+="<div><h3 class='ft-gray'>"+years[j]+"</h3>"+monthsHTML+"</div>"}$archives.html(yearsHTML);var $items=$(".archives>div"),line=0,top=0,heights=[];for(var m=0;m<$items.length;m++){for(var n=0;n<3;n++){if(m>=$items.length){break}$items[m].style.left=(n*318)+"px";if(line>0){if($items[m-3].style.top!==""){top=parseInt($items[m-3].style.top)}$items[m].style.top=$($items[m-3]).height()+60+top+"px";heights[n]=parseInt($items[m].style.top)+$($items[m]).height()+60}else{heights[n]=$($items[m]).height()+60}if(n<2){m+=1}}line+=1}$archives.height(heights.sort()[heights.length-1])},scrollEvent:function(){var _it=this;$(window).scroll(function(){var y=$(window).scrollTop();if(y>=_it.headerH+$("#top").height()){_it.$nav.css("position","fixed");_it.$body.css("marginTop","58px")}else{_it.$nav.css("position","inherit");_it.$body.css("marginTop","0")}if(y>_it.headerH){var bodyH=$(window).height();var top=y+bodyH-21;if($("body").height()-58<=y+bodyH){top=$(".footer").offset().top-21}$("#goTop").fadeIn("slow").css("top",top)}else{$("#goTop").hide()}})},setDynamic:function(){var $dynamic=$(".dynamic");if($(".dynamic").length<1){return}var $comments=$dynamic.find(".side-comments"),$tags=$dynamic.find(".side-tags"),$mostComment=$dynamic.find(".side-most-comment"),$mostView=$dynamic.find(".side-most-view");if($comments.height()>$tags.height()){$tags.height($comments.height())}else{$comments.height($tags.height())}if($mostComment.height()>$mostView.height()){$mostView.height($mostComment.height())}else{$mostComment.height($mostView.height())}$(".article-body").each(function(){this.innerHTML=Util.replaceEmString($(this).html())})}};(function(){ease.getCurrentPage();ease.initCommon();ease.scrollEvent();ease.setNavCurrent();ease.initArchives();ease.setDynamic()})();
\ No newline at end of file
#
# Copyright (c) 2009, 2010, 2011, B3log Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Description: Language configurations(en_US) for skin "ease".
# Version: 1.0.0.5, May 22, 2012
# Author: Liyuan Li
#
dynamicLabel=Dynamic
moreLabel=More
contentLabel=More...
abstractLabel=Abstract
viewCount1Label=View Count:
articleCount1Label=Article Count:
commentCount1Label=Comment Count:
allTagsLabel=Tags
archiveLabel=Archive
yearLabel=
monthLabel=
recentArticlesLabel=Recent Articles
recentCommentsLabel=Recent Comments
mostCommentArticlesLabel=Most Comment Articles
mostViewCountArticlesLabel=Most View Articles
popTagsLabel=Popular Tags
linkLabel=Friend Links
indexLabel=Home
sumLabel=
pageLabel=Page
clearAllCacheLabel=Clear all cache
clearCacheLabel=Clear cache
adminLabel=Admin
logoutLabel=Logout
loginLabel=Login
em00Label=Smile
em01Label=Laughter
em02Label=Happy
em03Label=Sad
em04Label=Cry
em05Label=No Comments
em06Label=Fidget
em07Label=Angry
em08Label=Look Around
em09Label=Surprise
em10Label=Cool
em11Label=Cheeky
em12Label=Heart
em13Label=Heart Broken
em14Label=Devil
commentLabel=Comment
viewLabel=View
authorLabel=Author
previousPageLabel=Previous Page
nextPagePabel=Next Page
firstPageLabel=First Page
lastPageLabel=Last Page
archive1Label=Archive:
author1Label=Author:
tag1Label=Tags:
sorryLabel=Sorry!
notFoundLabel=Not Found!
returnTo1Label=Return:
updatedLabel=Updated!
topArticleLabel=Top!
replyLabel=Reply
commentNameLabel=Name
commentEmailLabel=Email
commentURLLabel=URL
submmitCommentLabel=Commit Comment
nameTooLongLabel=Sorry, your username must be between 2 and 20 characters long!
mailCannotEmptyLabel=Mail is empty!
mailInvalidLabel=Mail is invalid!
commentContentCannotEmptyLabel=Sorry, your content must be between 2 and 500 characters long!
captchaCannotEmptyLabel=Captcha is empty!
loadingLabel=loading....
relevantArticlesLabel=Relevant Articles
randomArticlesLabel=Random Articles
externalRelevantArticlesLabel=External Relevant Articles:
captchaErrorLabel=Captcha Error
b3logLabel=<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
killBrowserLabel=<h2>Let's kill outdated and insecure browser!</h2><p>Let's kill outdated and insecure browser for browser evolution, human progress and better experience.</p><p>You can download</p><ul><li><a href="http://www.mozilla.com/" target="_blank">Firefox</a></li><li><a href="http://www.google.com/chrome" target="_blank">Chrome</a></li><li><a href="http://windows.microsoft.com/en-US/internet-explorer/downloads/ie" target="_blank">IE8 / IE9</a></li><li><a href="http://www.maxthon.com/" target="_blank">Maxthon</a> and <a href="http://www.google.com" target="_blank">so on</a>.</li></ul>
\ No newline at end of file
#
# Copyright (c) 2009, 2010, 2011, B3log Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Description: Language configurations(zh_CN) for skin "ease".
# Version: 1.0.0.5, May 22, 2012
# Author: Liyuan Li
#
dynamicLabel=\u52a8\u6001
moreLabel=\u66f4\u591a
contentLabel=\u5168\u6587
abstractLabel=\u6458\u8981
viewCount1Label=\u6d4f\u89c8\u6b21\u6570\uff1a
articleCount1Label=\u6587\u7ae0\u603b\u6570\uff1a
commentCount1Label=\u8bc4\u8bba\u603b\u6570\uff1a
allTagsLabel=\u6807\u7b7e\u5899
updatedLabel=\u6709\u66f4\u65b0\uff01
topArticleLabel=\u7f6e\u9876\uff01
archiveLabel=\u5b58\u6863
yearLabel=\u5e74
monthLabel=\u6708
recentArticlesLabel=\u6700\u65b0\u6587\u7ae0
recentCommentsLabel=\u6700\u65b0\u8bc4\u8bba
mostCommentArticlesLabel=\u8bc4\u8bba\u6700\u591a\u7684\u6587\u7ae0
mostViewCountArticlesLabel=\u8bbf\u95ee\u6700\u591a\u7684\u6587\u7ae0
popTagsLabel=\u5206\u7c7b\u6807\u7b7e
linkLabel=\u53cb\u60c5\u94fe\u63a5
indexLabel=\u9996\u9875
sumLabel=\u5171
pageLabel=\u9875
clearAllCacheLabel=\u6e05\u9664\u6240\u6709\u9875\u9762\u7f13\u5b58
clearCacheLabel=\u6e05\u9664\u672c\u9875\u7f13\u5b58
adminLabel=\u7ba1\u7406
logoutLabel=\u767b\u51fa
loginLabel=\u767b\u5f55
em00Label=\u5fae\u7b11
em01Label=\u5927\u7b11
em02Label=\u9ad8\u5174
em03Label=\u60b2\u4f24
em04Label=\u54ed\u6ce3
em05Label=\u65e0\u8bed
em06Label=\u70e6\u8e81
em07Label=\u751f\u6c14
em08Label=\u6211\u7785
em09Label=\u60ca\u8bb6
em10Label=\u9177
em11Label=\u987d\u76ae
em12Label=\u7231\u5fc3
em13Label=\u5fc3\u788e
em14Label=\u9b54\u9b3c
commentLabel=\u8bc4\u8bba
viewLabel=\u6d4f\u89c8
authorLabel=\u4f5c\u8005
previousPageLabel=\u4e0a\u4e00\u9875
nextPagePabel=\u4e0b\u4e00\u9875
firstPageLabel=\u7b2c\u4e00\u9875
lastPageLabel=\u6700\u540e\u4e00\u9875
archive1Label=\u5b58\u6863\uff1a
author1Label=\u4f5c\u8005\uff1a
tag1Label=\u6807\u7b7e\uff1a
sorryLabel=\u5bf9\u4e0d\u8d77\uff01
notFoundLabel=\u627e\u4e0d\u5230\uff01
returnTo1Label=\u8fd4\u56de\uff1a
replyLabel=\u56de\u590d
commentNameLabel=\u59d3\u540d
commentEmailLabel=\u90ae\u7bb1
commentURLLabel=URL
submmitCommentLabel=\u63d0\u4ea4\u8bc4\u8bba
nameTooLongLabel=\u59d3\u540d\u53ea\u80fd\u4e3a 2 \u5230 20 \u4e2a\u5b57\u7b26\uff01
mailCannotEmptyLabel=\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a\uff01
mailInvalidLabel=\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e\uff01
commentContentCannotEmptyLabel=\u8bc4\u8bba\u5185\u5bb9\u53ea\u80fd\u4e3a 2 \u5230 500 \u4e2a\u5b57\u7b26\uff01
captchaCannotEmptyLabel=\u9a8c\u8bc1\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01
loadingLabel=\u8f7d\u5165\u4e2d....
relevantArticlesLabel=\u76f8\u5173\u9605\u8bfb
randomArticlesLabel=\u968f\u673a\u9605\u8bfb
externalRelevantArticlesLabel=\u7ad9\u5916\u76f8\u5173\u9605\u8bfb
captchaErrorLabel=\u9a8c\u8bc1\u7801\u9519\u8bef
b3logLabel=<span style="color: orange;">B</span><span style="color: blue;"><sup>3</sup></span><span style="color: green;">L</span><span style="color: red;">O</span><span style="color: blue;">G</span>
killBrowserLabel=<h2>\u8ba9\u6211\u4eec\u653e\u5f03\u4f7f\u7528\u90a3\u4e9b\u8fc7\u65f6\u3001\u4e0d\u5b89\u5168\u7684\u6d4f\u89c8\u5668\u5427\uff01</h2><p>\u4e3a\u4e86\u8ba9\u6d4f\u89c8\u5668\u66f4\u597d\u7684\u53d1\u5c55\uff0c\u4eba\u7c7b\u66f4\u52a0\u7684\u8fdb\u6b65\uff0c\u62e5\u6709\u66f4\u597d\u7684\u4f53\u9a8c\uff0c\u8ba9\u6211\u4eec\u653e\u5f03\u4f7f\u7528\u90a3\u4e9b\u8fc7\u65f6\u3001\u4e0d\u5b89\u5168\u7684\u6d4f\u89c8\u5668\u3002</p>\u60a8\u53ef\u4ee5\u4e0b\u8f7d<ul><li><a href="http://www.mozilla.com/" target="_blank">\u706b\u72d0</a></li><li><a href="http://www.google.com/chrome" target="_blank">\u8c37\u6b4c\u6d4f\u89c8\u5668</a></li><li><a href="http://windows.microsoft.com/en-US/internet-explorer/downloads/ie" target="_blank">IE8 / IE9</a></li><li><a href="http://www.maxthon.com/" target="_blank">\u9068\u6e38</a>\u6216\u8005<a href="http://www.google.com" target="_blank">\u5176\u5b83\u6d4f\u89c8\u5668</a>.</li></ul>
<#include "macro-head.ftl">
<!DOCTYPE html>
<html>
<head>
<@head title="${blogTitle}">
<meta name="keywords" content="${metaKeywords},${linkLabel}"/>
<meta name="description" content="${metaDescription},${linkLabel}"/>
</@head>
</head>
<body>
${topBarReplacement}
<#include "header.ftl">
<div class="body">
<#if 0 != links?size>
<ul class="other-main links">
<#list links as link>
<li>
<a rel="friend" href="${link.linkAddress}" alt="${link.linkTitle}" target="_blank">
<img alt="${link.linkTitle}"
src="http://www.google.com/s2/u/0/favicons?domain=<#list link.linkAddress?split('/') as x><#if x_index=2>${x}<#break></#if></#list>" /></a>
<a rel="friend" href="${link.linkAddress}" title="${link.linkDescription}" target="_blank">${link.linkTitle}
</a>
</li>
</#list>
</ul>
</#if>
</div>
<#include "footer.ftl">
</body>
</html>
<#macro comments commentList article>
<h2 class="marginBottom12">${commentLabel}</h2>
<div class="comments" id="comments">
<#if 0 == commentList?size>
${noCommentLabel}
</#if>
<div id="comments">
<#list commentList as comment>
<div id="${comment.oId}">
<img class="comment-header" title="${comment.commentName}"
alt="${comment.commentName}" src="${comment.commentThumbnailURL}"/>
<div class="comment-panel">
<div class="comment-title">
<div class="left">
<#if "http://" == comment.commentURL>
<a>${comment.commentName}</a>
${comment.commentName}
<#else>
<a href="${comment.commentURL}" target="_blank">${comment.commentName}</a>
</#if>
<#if comment.isReply>
@
<#if comment.isReply>&nbsp;@
<a href="${servePath}${article.permalink}#${comment.commentOriginalCommentId}"
onmouseover="page.showComment(this, '${comment.commentOriginalCommentId}', 23);"
onmouseover="page.showComment(this, '${comment.commentOriginalCommentId}', 20);"
onmouseout="page.hideComment('${comment.commentOriginalCommentId}')">${comment.commentOriginalCommentName}</a>
</#if>
<div class="right">
${comment.commentDate?string("yyyy-MM-dd HH:mm:ss")}
<#if article.commentable>
<a class="no-underline"
href="javascript:replyTo('${comment.oId}');">${replyLabel}</a>
</#if>
</div>
<div class="clear"></div>
</div>
<div class="comment-body">
<div class="left comment-picture">
<img alt="${comment.commentName}" src="${comment.commentThumbnailURL}"/>
</div>
<div class="comment-content">
${comment.commentContent}
</div>
<div class="clear"></div>
<#if article.commentable>
<div class="right ft-gray">
${comment.commentDate?string("yy-MM-dd HH:mm")}
<a rel="nofollow" href="javascript:replyTo('${comment.oId}');">${replyLabel}</a>
</div>
</#if>
<span class="clear"></span>
<div class="article-body">${comment.commentContent}</div>
</div>
<span class="clear"></span>
</div>
</#list>
</div>
<#if article.commentable>
<div class="comment-title">
${postCommentsLabel}
</div>
<div class="comment-body">
<table id="commentForm" class="form">
<div class="form">
<table id="commentForm">
<tbody>
<tr>
<th>
${commentName1Label}
</th>
<td colspan="2">
<input type="text" class="normalInput" id="commentName"/>
<label for="commentName">${commentNameLabel}</label>
</td>
</tr>
<tr>
<th>
${commentEmail1Label}
</th>
<td colspan="2">
<input type="text" class="normalInput" id="commentEmail"/>
<label for="commentEmail">${commentEmailLabel}</label>
</td>
</tr>
<tr>
<th>
${commentURL1Label}
</th>
<td colspan="2">
<input type="text" id="commentURL"/>
<label for="commentURL">${commentURLLabel}</label>
</td>
</tr>
<tr>
<th>
${commentEmotions1Label}
</th>
<td id="emotions">
<td id="emotions" colspan="2">
<span class="em00" title="${em00Label}"></span>
<span class="em01" title="${em01Label}"></span>
<span class="em02" title="${em02Label}"></span>
......@@ -96,33 +72,31 @@
</td>
</tr>
<tr>
<th valign="top">
${commentContent1Label}
</th>
<td colspan="2">
<textarea rows="10" cols="96" id="comment"></textarea>
</td>
</tr>
<tr>
<th>
${captcha1Label}
</th>
<td>
<td colspan="2">
<input type="text" class="normalInput" id="commentValidate"/>
<img id="captcha" alt="validate" src="${servePath}/captcha.do" />
</td>
<th>
<span class="error-msg" id="commentErrorTip"></span>
</th>
</tr>
<tr>
<td colspan="3" align="right">
<td>
<span class="ft-gray" id="commentErrorTip"></span>
</td>
<td align="right">
<button id="submitCommentButton" onclick="page.submitComment();">${submmitCommentLabel}</button>
</td>
</tr>
</tbody>
</table>
</div>
<#if externalRelevantArticlesDisplayCount?? && 0 != externalRelevantArticlesDisplayCount>
<div id="externalRelevantArticles" class="article-relative"></div>
</#if>
<span class="clear"></span>
</#if>
</#macro>
......@@ -135,46 +109,49 @@
"mailInvalidLabel": "${mailInvalidLabel}",
"commentContentCannotEmptyLabel": "${commentContentCannotEmptyLabel}",
"captchaCannotEmptyLabel": "${captchaCannotEmptyLabel}",
"captchaErrorLabel": "${captchaErrorLabel}",
"loadingLabel": "${loadingLabel}",
"oId": "${oId}",
"skinDirName": "${skinDirName}",
"blogHost": "${blogHost}",
"randomArticles1Label": "${randomArticles1Label}",
"externalRelevantArticles1Label": "${externalRelevantArticles1Label}"
"randomArticles1Label": "${randomArticlesLabel}",
"externalRelevantArticles1Label": "${externalRelevantArticlesLabel}"
});
var addComment = function (result, state) {
var commentHTML = '<div id="' + result.oId +
'"><div class="comment-panel"><div class="comment-title">' + result.replyNameHTML;
var commentHTML = '<div id="' + result.oId + '"><img class="comment-header" \
title="' + $("#commentName" + state).val() + '" alt="' + $("#commentName" + state).val() +
'" src="' + result.commentThumbnailURL + '"/><div class="comment-panel"><div class="left">' + result.replyNameHTML;
if (state !== "") {
var commentOriginalCommentName = $("#" + page.currentCommentId).find(".comment-title a").first().text();
var commentOriginalCommentName = $("#" + page.currentCommentId + " .comment-panel>.left a").first().text();
commentHTML += '&nbsp;@&nbsp;<a href="${servePath}' + result.commentSharpURL.split("#")[0] + '#' + page.currentCommentId + '"'
+ 'onmouseover="page.showComment(this, \'' + page.currentCommentId + '\', 23);"'
+ 'onmouseover="page.showComment(this, \'' + page.currentCommentId + '\', 20);"'
+ 'onmouseout="page.hideComment(\'' + page.currentCommentId + '\')">' + commentOriginalCommentName + '</a>';
}
commentHTML += '<div class="right">' + result.commentDate
+ '&nbsp;<a class="no-underline" href="javascript:replyTo(\'' + result.oId + '\');">${replyLabel}</a>'
+ '</div><div class="clear"></div></div><div class="comment-body">'
+ '<div class="left comment-picture"><img alt="' + $("#commentName" + state).val()
+ '" src="' + result.commentThumbnailURL + '"/>'
+ '</div><div class="comment-content">' +
commentHTML += '</div><div class="right ft-gray">' + result.commentDate.substring(2, 16)
+ '&nbsp;<a rel="nofollow" href="javascript:replyTo(\'' + result.oId
+ '\');">${replyLabel}</a></div><span class="clear"></span><div class="article-body">' +
Util.replaceEmString($("#comment" + state).val().replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\n/g,"<br/>"))
+ '</div><div class="clear"></div>'
+ '</div></div></div>';
+ '</div></div><span class="clear"></span></div>';
return commentHTML;
}
var replyTo = function (id) {
var commentFormHTML = "<table class='form comment-reply' id='replyForm'>";
page.addReplyForm(id, commentFormHTML);
$("#replyForm label").each(function () {
$this = $(this);
$this.attr("for", $this.attr("for") + "Reply");
});
};
(function () {
page.load();
// emotions
page.replaceCommentsEm("#comments .comment-content");
page.replaceCommentsEm("#comments .article-body");
<#nested>
})();
</script>
......
......@@ -7,8 +7,10 @@
<meta name="copyright" content="B3log" />
<meta name="revised" content="B3log, ${year}" />
<meta http-equiv="Window-target" content="_top" />
<link type="text/css" rel="stylesheet" href="${staticServePath}/css/default-base${miniPostfix}.css?${staticResourceVersion}" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="${staticServePath}/skins/${skinDirName}/css/${skinDirName}.css?${staticResourceVersion}" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="${staticServePath}/skins/${skinDirName}/css/${skinDirName}${miniPostfix}.css?${staticResourceVersion}" charset="utf-8" />
<!--[if IE 8]>
<link type="text/css" rel="stylesheet" href="${staticServePath}/skins/${skinDirName}/css/${skinDirName}-ie8${miniPostfix}.css?${staticResourceVersion}" charset="utf-8" />
<![endif]-->
<link href="${servePath}/blog-articles-feed.do" title="ATOM" type="application/atom+xml" rel="alternate" />
<link rel="icon" type="image/png" href="${staticServePath}/favicon.png" />
${htmlHead}
......
......@@ -10,30 +10,14 @@
</head>
<body>
${topBarReplacement}
<div class="content">
<div class="header">
<#include "header.ftl">
</div>
<div class="body">
<div class="left main">
<div>
<div class="article">
<div class="article-body">
${page.pageContent}
</div>
</div>
<@comments commentList=pageComments article=page></@comments>
</div>
</div>
<div class="right side">
<#include "side.ftl">
</div>
<div class="clear"></div>
</div>
<div class="footer">
<#include "footer.ftl">
<#include "header.ftl">
<div class="body">
<div class="article-body article">
${page.pageContent}
</div>
<@comments commentList=pageComments article=page></@comments>
</div>
<@comment_script oId=page.oId></@comment_script>
<#include "footer.ftl">
<@comment_script oId=page.oId></@comment_script>
</body>
</html>
#
# Copyright (C) 2009, 2010, 2011, B3log Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Description: ease skin.
# Version: 1.0.0.1, Jun 19, 2012
# Author: Liyuan Li
#
name=ease
version=1.0.1
forSolo=0.4.6
memo=\u56de\u5f52\u606c\u9759
......@@ -9,29 +9,17 @@
</head>
<body>
${topBarReplacement}
<div class="content">
<div class="header">
<#include "header.ftl">
</div>
<div class="body">
<div class="left main">
<div>
<h2 class="marginLeft12 marginBottom12">${tag1Label}
<a rel="alternate" href="${servePath}/tag-articles-feed.do?oId=${tag.oId}"><span id="tagArticlesTag">
${tag.tagTitle}
</span>(${tag.tagPublishedRefCount})</a>
</h2>
</div>
<#include "article-list.ftl">
</div>
<div class="right side">
<#include "side.ftl">
</div>
<div class="clear"></div>
</div>
<div class="footer">
<#include "footer.ftl">
</div>
<#include "header.ftl">
<div class="body">
<h2>
<a rel="alternate" href="${servePath}/tag-articles-feed.do?oId=${tag.oId}">
${tag1Label}
${tag.tagTitle}
(${tag.tagPublishedRefCount})
</a>
</h2>
<#include "article-list.ftl">
</div>
<#include "footer.ftl">
</body>
</html>
<#include "macro-head.ftl">
<!DOCTYPE html>
<html>
<head>
<@head title="${allTagsLabel} - ${blogTitle}">
<meta name="keywords" content="${metaKeywords},${allTagsLabel}"/>
<meta name="description" content="<#list tags as tag>${tag.tagTitle}<#if tag_has_next>,</#if></#list>"/>
</@head>
</head>
<body>
${topBarReplacement}
<#include "header.ftl">
<div class="body">
<ul id="tags" class="other-main">
<#list tags as tag>
<li>
<a rel="tag" data-count="${tag.tagPublishedRefCount}"
href="${servePath}/tags/${tag.tagTitle?url('UTF-8')}" title="${tag.tagTitle}">
<span>${tag.tagTitle}</span>
(<b>${tag.tagPublishedRefCount}</b>)
</a>
</li>
</#list>
</ul>
<div class="clear"></div>
</div>
<#include "footer.ftl">
<script type="text/javascript">
Util.buildTags();
</script>
</body>
</html>
......@@ -16,11 +16,11 @@
#
# Description: Mobile skin.
# Version: 1.0.0.2, May 7, 2012
# Version: 1.0.0.3, Jun 19, 2012
# Author: Liang Ding
#
name=Mobile
version=0.1.2
forSolo=0.4.5
forSolo=0.4.6
memo=\u8bf7\u4e0d\u8981\u4ece\u90e8\u7f72\u76ee\u5f55\u4e2d\u5220\u9664\u8be5\u76ae\u80a4\uff0c\u5426\u5219\u79fb\u52a8\u8bbe\u5907\u8bbf\u95ee\u65f6\u535a\u5ba2\u5c06\u4e0d\u53ef\u7528\u3002
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