Commit 02c38803 authored by Liang Ding's avatar Liang Ding

Merge branch '2.9.1-dev'

parents c04e12f0 e36b2c8b
......@@ -55,4 +55,13 @@ gulp.task('default', function () {
.pipe(concat('admin-lib.min.js'))
.pipe(gulp.dest('./src/main/webapp/js/lib/compress/'));
// concat js
var jsPjax = ['./src/main/webapp/js/lib/jquery/jquery-3.1.0.min.js',
'./src/main/webapp/js/lib/jquery/jquery.pjax.js',
'./src/main/webapp/js/lib/nprogress/nprogress.js'];
gulp.src(jsPjax)
.pipe(uglify())
.pipe(concat('pjax.min.js'))
.pipe(gulp.dest('./src/main/webapp/js/lib/compress/'));
});
\ No newline at end of file
......@@ -39,12 +39,12 @@ import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.servlet.renderer.TextHTMLRenderer;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.freemarker.FreeMarkerRenderer;
import org.b3log.latke.util.*;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.event.EventTypes;
import org.b3log.solo.model.*;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.*;
import org.b3log.solo.util.Skins;
......@@ -67,7 +67,7 @@ import java.util.*;
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="http://zephyr.b3log.org">Zephyr</a>
* @version 1.4.4.1, Apr 13, 2018
* @version 1.4.4.2, Jun 22, 2018
* @since 0.3.1
*/
@RequestProcessor
......@@ -745,7 +745,7 @@ public class ArticleProcessor {
@RequestProcessing(value = "/authors/**", method = HTTPRequestMethod.GET)
public void showAuthorArticles(final HTTPRequestContext context, final HttpServletRequest request, final HttpServletResponse response)
throws IOException, JSONException {
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(request);
context.setRenderer(renderer);
renderer.setTemplateName("author-articles.ftl");
......@@ -838,7 +838,7 @@ public class ArticleProcessor {
@RequestProcessing(value = "/archives/**", method = HTTPRequestMethod.GET)
public void showArchiveArticles(final HTTPRequestContext context,
final HttpServletRequest request, final HttpServletResponse response) {
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(request);
context.setRenderer(renderer);
renderer.setTemplateName("archive-articles.ftl");
......@@ -961,7 +961,7 @@ public class ArticleProcessor {
LOGGER.log(Level.DEBUG, "Article[id={0}]", articleId);
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(request);
context.setRenderer(renderer);
renderer.setTemplateName("article.ftl");
......
......@@ -30,13 +30,13 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.freemarker.FreeMarkerRenderer;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Strings;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Category;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.*;
import org.b3log.solo.util.Skins;
......@@ -55,7 +55,7 @@ import java.util.Map;
* Category processor.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.1.2, Apr 21, 2017
* @version 1.0.1.3, Jun 22, 2018
* @since 2.0.0
*/
@RequestProcessor
......@@ -149,10 +149,8 @@ public class CategoryProcessor {
*/
@RequestProcessing(value = "/category/**", method = HTTPRequestMethod.GET)
public void showCategoryArticles(final HTTPRequestContext context) throws IOException {
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context.getRequest());
context.setRenderer(renderer);
renderer.setTemplateName("category-articles.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
......@@ -161,7 +159,6 @@ public class CategoryProcessor {
try {
String requestURI = request.getRequestURI();
if (!requestURI.endsWith("/")) {
requestURI += "/";
}
......
......@@ -55,7 +55,7 @@ import java.util.*;
* File upload processor.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.2, Apr 5, 2018
* @version 1.0.1.0, Jun 22, 2018
* @since 2.8.0
*/
@RequestProcessor
......@@ -153,7 +153,7 @@ public class FileUploadProcessor {
final MultipartStreamParser parser = new MultipartStreamParser(new MemoryFileUploadFactory().setMaxFileSize(maxSize));
parser.parseRequestStream(req.getInputStream(), "UTF-8");
final List<String> errFiles = new ArrayList();
final Map<String, String> succMap = new HashMap<>();
final Map<String, String> succMap = new LinkedHashMap<>();
final FileUpload[] files = parser.getFiles("file[]");
final String[] names = parser.getParameterValues("name[]");
String fileName;
......@@ -190,7 +190,8 @@ public class FileUploadProcessor {
for (int i = 0; i < files.length; i++) {
final FileUpload file = files[i];
final String originalName = fileName = file.getHeader().getFileName();
String originalName = fileName = file.getHeader().getFileName();
originalName = originalName.replaceAll("\\W", "");
try {
String suffix = StringUtils.substringAfterLast(fileName, ".");
final String contentType = file.getHeader().getContentType();
......
......@@ -32,7 +32,6 @@ import org.b3log.latke.servlet.URIPatternMode;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.freemarker.FreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.freemarker.Templates;
......@@ -41,6 +40,7 @@ import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Skin;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.StatisticMgmtService;
......@@ -61,7 +61,7 @@ import java.util.Set;
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="mailto:385321165@qq.com">DASHU</a>
* @version 1.2.4.6, Jun 28, 2017
* @version 1.2.4.7, Jun 22, 2018
* @since 0.3.1
*/
@RequestProcessor
......@@ -117,7 +117,7 @@ public class IndexProcessor {
*/
@RequestProcessing(value = {"/\\d*", ""}, uriPatternsMode = URIPatternMode.REGEX, method = HTTPRequestMethod.GET)
public void showIndex(final HTTPRequestContext context, final HttpServletRequest request, final HttpServletResponse response) {
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(request);
context.setRenderer(renderer);
renderer.setTemplateName("index.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
......
......@@ -27,11 +27,11 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.freemarker.FreeMarkerRenderer;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Page;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.CommentQueryService;
import org.b3log.solo.service.PreferenceQueryService;
......@@ -51,7 +51,7 @@ import java.util.Map;
* Page processor.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.1.0.6, Nov 8, 2016
* @version 1.1.0.7, Jun 22, 2018
* @since 0.3.1
*/
@RequestProcessor
......@@ -99,10 +99,8 @@ public class PageProcessor {
*/
@RequestProcessing(value = "/page", method = HTTPRequestMethod.GET)
public void showPage(final HTTPRequestContext context) {
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context.getRequest());
context.setRenderer(renderer);
renderer.setTemplateName("page.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
......
......@@ -30,7 +30,6 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.freemarker.FreeMarkerRenderer;
import org.b3log.latke.util.Paginator;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Strings;
......@@ -38,6 +37,7 @@ import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Tag;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.*;
import org.b3log.solo.util.Skins;
......@@ -58,7 +58,7 @@ import java.util.Map;
* Tag processor.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.1.1.4, Nov 20, 2015
* @version 1.1.1.5, Jun 22, 2018
* @since 0.3.1
*/
@RequestProcessor
......@@ -119,7 +119,7 @@ public class TagProcessor {
*/
@RequestProcessing(value = "/tags/**", method = HTTPRequestMethod.GET)
public void showTagArticles(final HTTPRequestContext context) throws IOException {
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context.getRequest());
context.setRenderer(renderer);
......
......@@ -30,10 +30,10 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.freemarker.FreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.StatisticMgmtService;
......@@ -58,7 +58,7 @@ import java.util.Map;
* </p>
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.5, Nov 20, 2015
* @version 1.0.0.6, Jun 22, 2018
* @since 0.4.5
*/
@RequestProcessor
......@@ -110,7 +110,7 @@ public class UserTemplateProcessor {
templateName = StringUtils.substringBefore(templateName, ".") + ".ftl";
LOGGER.log(Level.DEBUG, "Shows page[requestURI={0}, templateName={1}]", requestURI, templateName);
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(request);
context.setRenderer(renderer);
renderer.setTemplateName(templateName);
......
/*
* Solo - A beautiful, simple, stable, fast Java blogging system.
* Copyright (c) 2010-2018, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.processor.renderer;
import freemarker.template.Template;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import javax.servlet.http.HttpServletRequest;
import java.io.StringWriter;
import java.util.Map;
/**
* Skin renderer.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Jun 22, 2018
* @since 2.9.1
*/
public final class SkinRenderer extends AbstractFreeMarkerRenderer {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(SkinRenderer.class);
/**
* HTTP servlet request.
*/
private final HttpServletRequest request;
/**
* Constructs a skin renderer with the specified HTTP servlet request.
*
* @param request the specified HTTP servlet request
*/
public SkinRenderer(final HttpServletRequest request) {
this.request = request;
}
/**
* Processes the specified FreeMarker template with the specified request, data model, pjax hacking.
*
* @param request the specified request
* @param dataModel the specified data model
* @param template the specified FreeMarker template
* @return generated HTML
* @throws Exception exception
*/
protected String genHTML(final HttpServletRequest request, final Map<String, Object> dataModel, final Template template)
throws Exception {
final boolean isPJAX = isPJAX(request);
dataModel.put("pjax", isPJAX);
if (!isPJAX) {
return super.genHTML(request, dataModel, template);
}
final StringWriter stringWriter = new StringWriter();
template.setOutputEncoding("UTF-8");
template.process(dataModel, stringWriter);
final long endTimeMillis = System.currentTimeMillis();
final String dateString = DateFormatUtils.format(endTimeMillis, "yyyy/MM/dd HH:mm:ss");
final long startTimeMillis = (Long) request.getAttribute(Keys.HttpRequest.START_TIME_MILLIS);
final String msg = String.format("\n<!-- Generated by Latke (https://github.com/b3log/latke) in %1$dms, %2$s -->", endTimeMillis - startTimeMillis, dateString);
final String pjaxContainer = request.getHeader("X-PJAX-Container");
return StringUtils.substringBetween(stringWriter.toString(),
"<!---- pjax {" + pjaxContainer + "} start ---->",
"<!---- pjax {" + pjaxContainer + "} end ---->") + msg;
}
@Override
protected void beforeRender(final HTTPRequestContext context) {
}
@Override
protected void afterRender(final HTTPRequestContext context) {
}
/**
* Determines whether the specified request is sending with pjax.
*
* @param request the specified request
* @return {@code true} if it is sending with pjax, otherwise returns {@code false}
*/
private static boolean isPJAX(final HttpServletRequest request) {
final boolean pjax = Boolean.valueOf(request.getHeader("X-PJAX"));
final String pjaxContainer = request.getHeader("X-PJAX-Container");
return pjax && StringUtils.isNotBlank(pjaxContainer);
}
}
......@@ -83,7 +83,7 @@ Util.processClipBoard = function (clipboardData, cm) {
};
Util.initUploadFile = function (obj) {
var isImg = false;
var cursor;
$('#' + obj.id).fileupload({
multipart: true,
pasteZone: obj.pasteZone,
......@@ -91,6 +91,7 @@ Util.initUploadFile = function (obj) {
url: latkeConfig.servePath + "/upload",
paramName: "file[]",
add: function (e, data) {
obj.uploadingLabel = '';
data.submit();
},
submit: function (e, data) {
......@@ -102,12 +103,11 @@ Util.initUploadFile = function (obj) {
obj.uploadingLabel += '[' + item.name.replace(/\W/g, '') + '](Uploading...)';
}
});
var cursor = obj.editor.getCursor();
cursor = obj.editor.getCursor();
obj.editor.replaceRange(obj.uploadingLabel, cursor, cursor);
}
},
done: function (e, data) {
var cursor = obj.editor.getCursor();
if (!data.result.sc) {
var msg = '';
data.files.forEach(function (item) {
......@@ -119,7 +119,7 @@ Util.initUploadFile = function (obj) {
});
obj.editor.replaceRange(msg,
CodeMirror.Pos(cursor.line, cursor.ch - obj.uploadingLabel.length), cursor);
cursor, CodeMirror.Pos(cursor.line, cursor.ch + obj.uploadingLabel.length));
return;
}
......@@ -127,25 +127,22 @@ Util.initUploadFile = function (obj) {
Object.keys(data.result.data.succMap).forEach(function (key) {
var isImage = false;
data.files.forEach(function (item) {
if (item.name.replace(/\W/g, '') === key) {
isImage = item.type.indexOf('image') > -1
}
});
resultMsg += (isImage ? '![' : '[') +
key.replace(/\W/g, '') + '](' + data.result.data.succMap[key] + ') \n\n';
});
data.result.data.errFiles.forEach(function (name) {
var isImage = false;
data.files.forEach(function (item) {
if (item.name.replace(/\W/g, '') === key) {
isImage = item.type.indexOf('image') > -1
}
});
resultMsg += (isImage ? '![' : '[') +
'[' + name.replace(/\W/g, '')+ '](Error)';
});
obj.editor.replaceRange(resultMsg,
CodeMirror.Pos(cursor.line, cursor.ch - obj.uploadingLabel.length), cursor);
cursor, CodeMirror.Pos(cursor.line, cursor.ch + obj.uploadingLabel.length));
},
fail: function (e, data) {
if (obj.editor.replaceRange) {
......@@ -157,9 +154,8 @@ Util.initUploadFile = function (obj) {
msg += '[' + item.name.replace(/\W/g, '') + '](' + data.errorThrown + ')';
}
});
var cursor = obj.editor.getCursor();
obj.editor.replaceRange('[' + item.name.replace(/\W/g, '') + '](' + data.errorThrown + ')',
CodeMirror.Pos(cursor.line, cursor.ch - obj.uploadingLabel.length), cursor);
obj.editor.replaceRange(msg,
cursor, CodeMirror.Pos(cursor.line, cursor.ch + obj.uploadingLabel.length));
}
}
});
......
......@@ -28,6 +28,87 @@
* @static
*/
var Util = {
_isArticlePage: function (href) {
var isArticle = true;
if (href.indexOf(latkeConfig.servePath + '/tags/') > -1) {
isArticle = false;
}
if (href.indexOf(latkeConfig.servePath + '/tags.html') > -1) {
isArticle = false;
}
if (href.indexOf(latkeConfig.servePath + '/category/') > -1) {
isArticle = false;
}
if (href.indexOf(latkeConfig.servePath + '/archives.html') > -1) {
isArticle = false;
}
if (href.indexOf(latkeConfig.servePath + '/archives/') > -1) {
isArticle = false;
}
if (href.indexOf(latkeConfig.servePath + '/links.html') > -1) {
isArticle = false;
}
if (href === latkeConfig.servePath) {
isArticle = false;
}
if (/^[0-9]*$/.test(href.replace(latkeConfig.servePath + '/', ''))) {
isArticle = false;
}
return isArticle;
},
/**
* pjax
*/
initPjax: function (cb, articelCB) {
if ($('#pjax').length === 1) {
$.pjax({
selector: 'a',
container: '#pjax',
show: '',
cache: false,
storage: true,
titleSuffix: '',
filter: function(href){
return Util._isArticlePage(href);
},
callback: function () {
cb()
},
});
NProgress.configure({ showSpinner: false });
$('#pjax').bind('pjax.start', function(){
NProgress.start();
});
$('#pjax').bind('pjax.end', function(){
NProgress.done();
});
return;
}
if ($('#pjaxArticle').length === 1) {
$.pjax({
selector: 'a',
container: '#pjaxArticle',
show: '',
cache: false,
storage: true,
titleSuffix: '',
filter: function(href){
return !Util._isArticlePage(href);
},
callback: function () {
articelCB();
},
});
NProgress.configure({ showSpinner: false });
$('#pjaxArticle').bind('pjax.start', function(){
NProgress.start();
});
$('#pjaxArticle').bind('pjax.end', function(){
NProgress.done();
});
return;
}
},
/**
* 按需加载 MathJax 及 flow
* @returns {undefined}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/* Make clicks pass-through */
#nprogress {
pointer-events: none;
}
#nprogress .bar {
background: #d23f31;
position: fixed;
z-index: 1031;
top: 0;
left: 0;
width: 100%;
height: 2px;
}
/* Fancy blur effect */
#nprogress .peg {
display: block;
position: absolute;
right: 0px;
width: 100px;
height: 100%;
box-shadow: 0 0 10px #d23f31, 0 0 5px #d23f31;
opacity: 1.0;
-webkit-transform: rotate(3deg) translate(0px, -4px);
-ms-transform: rotate(3deg) translate(0px, -4px);
transform: rotate(3deg) translate(0px, -4px);
}
/* Remove these to get rid of the spinner */
#nprogress .spinner {
display: block;
position: fixed;
z-index: 1031;
top: 15px;
right: 15px;
}
#nprogress .spinner-icon {
width: 18px;
height: 18px;
box-sizing: border-box;
border: solid 2px transparent;
border-top-color: #d23f31;
border-left-color: #d23f31;
border-radius: 50%;
-webkit-animation: nprogress-spinner 400ms linear infinite;
animation: nprogress-spinner 400ms linear infinite;
}
.nprogress-custom-parent {
overflow: hidden;
position: relative;
}
.nprogress-custom-parent #nprogress .spinner,
.nprogress-custom-parent #nprogress .bar {
position: absolute;
}
@-webkit-keyframes nprogress-spinner {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes nprogress-spinner {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
This diff is collapsed.
......@@ -29,6 +29,8 @@
</head>
<body>
<#include "header.ftl">
<div id="pjax">
<#if pjax><!---- pjax {#pjax} start ----></#if>
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
......@@ -54,6 +56,8 @@
</div>
<#include "bottom2.ftl">
</div>
<#if pjax><!---- pjax {#pjax} end ----></#if>
</div>
<#include "footer.ftl">
</body>
</html>
......@@ -28,6 +28,8 @@
</head>
<body>
<#include "header.ftl">
<div id="pjax">
<#if pjax><!---- pjax {#pjax} start ----></#if>
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
......@@ -66,6 +68,8 @@
</#if>
</div>
<#include "bottom.ftl">
</div>
<#if pjax><!---- pjax {#pjax} end ----></#if>
</div>
<#include "footer.ftl">
</body>
......
......@@ -51,6 +51,8 @@
</head>
<body>
<#include "header.ftl">
<div id="pjaxArticle">
<#if pjax><!---- pjax {#pjaxArticle} start ----></#if>
<div class="main post__main">
<#if noticeBoard??>
<div class="board">
......@@ -82,7 +84,9 @@
</div>
</#if>
</section>
<footer class="post__tags">
<footer data-oid="${article.oId}"
class="post__tags"
data-tag="<#list article.articleTags?split(",") as articleTag>${articleTag}<#if articleTag_has_next>,</#if></#list>">
<#list article.articleTags?split(",") as articleTag>
<a class="tag" rel="tag" href="${servePath}/tags/${articleTag?url('UTF-8')}">
${articleTag}</a>
......@@ -212,7 +216,10 @@
data-avatar="${article.authorThumbnailURL}"></span>
</div>
</div>
<script type="text/javascript" src="${staticServePath}/js/lib/jquery/jquery.min.js" charset="utf-8"></script>
<#if pjax><!---- pjax {#pjaxArticle} end ----></#if>
</div>
<script type="text/javascript" src="${staticServePath}/js/lib/compress/pjax.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"
......@@ -251,17 +258,19 @@
Skin.initArticle();
</script>
<@comment_script oId=article.oId>
Skin.initComment = function (articleOId, articleTags) {
page.tips.externalRelevantArticlesDisplayCount = "${externalRelevantArticlesDisplayCount}";
<#if 0 != randomArticlesDisplayCount>
page.loadRandomArticles("<div class='module__title'><span>${randomArticlesLabel}</span></div>");
</#if>
<#if 0 != externalRelevantArticlesDisplayCount>
page.loadExternalRelevantArticles("<#list article.articleTags?split(",") as articleTag>${articleTag}<#if articleTag_has_next>,</#if></#list>"
, "<div class='module__title'><span>${externalRelevantArticlesLabel}</span></div>");
page.loadExternalRelevantArticles(articleTags, "<div class='module__title'><span>${externalRelevantArticlesLabel}</span></div>");
</#if>
<#if 0 != relevantArticlesDisplayCount>
page.loadRelevantArticles('${article.oId}', '<div class="module__title"><span>${relevantArticlesLabel}</span></div>');
page.loadRelevantArticles(articleOId, '<div class="module__title"><span>${relevantArticlesLabel}</span></div>');
</#if>
}
Skin.initComment('${article.oId}', "<#list article.articleTags?split(",") as articleTag>${articleTag}<#if articleTag_has_next>,</#if></#list>")
</@comment_script>
${plugins}
</body>
......
......@@ -29,6 +29,8 @@
</head>
<body>
<#include "header.ftl">
<div id="pjax">
<#if pjax><!---- pjax {#pjax} start ----></#if>
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
......@@ -48,6 +50,8 @@
<#include "article-list.ftl">
</div>
<#include "bottom2.ftl">
</div>
<#if pjax><!---- pjax {#pjax} end ----></#if>
</div>
<#include "footer.ftl">
</body>
......
......@@ -1356,3 +1356,78 @@ blockquote {
padding-left: 0;
}
}
/* Make clicks pass-through */
#nprogress {
pointer-events: none;
}
#nprogress .bar {
background: #d23f31;
position: fixed;
z-index: 1031;
top: 0;
left: 0;
width: 100%;
height: 2px;
}
/* Fancy blur effect */
#nprogress .peg {
display: block;
position: absolute;
right: 0px;
width: 100px;
height: 100%;
box-shadow: 0 0 10px #d23f31, 0 0 5px #d23f31;
opacity: 1.0;
-webkit-transform: rotate(3deg) translate(0px, -4px);
-ms-transform: rotate(3deg) translate(0px, -4px);
transform: rotate(3deg) translate(0px, -4px);
}
/* Remove these to get rid of the spinner */
#nprogress .spinner {
display: block;
position: fixed;
z-index: 1031;
top: 15px;
right: 15px;
}
#nprogress .spinner-icon {
width: 18px;
height: 18px;
box-sizing: border-box;
border: solid 2px transparent;
border-top-color: #d23f31;
border-left-color: #d23f31;
border-radius: 50%;
-webkit-animation: nprogress-spinner 400ms linear infinite;
animation: nprogress-spinner 400ms linear infinite;
}
.nprogress-custom-parent {
overflow: hidden;
position: relative;
}
.nprogress-custom-parent #nprogress .spinner,
.nprogress-custom-parent #nprogress .bar {
position: absolute;
}
@-webkit-keyframes nprogress-spinner {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes nprogress-spinner {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
......@@ -39,7 +39,7 @@
</footer>
</div>
<script type="text/javascript" src="${staticServePath}/js/lib/jquery/jquery.min.js" charset="utf-8"></script>
<script type="text/javascript" src="${staticServePath}/js/lib/compress/pjax.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"
......
......@@ -32,6 +32,8 @@
</head>
<body>
<#include "header.ftl">
<div id="pjax">
<#if pjax><!---- pjax {#pjax} start ----></#if>
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
......@@ -44,6 +46,8 @@
</div>
<#include "bottom2.ftl">
</div>
<#if pjax><!---- pjax {#pjax} end ----></#if>
</div>
<#include "footer.ftl">
</body>
</html>
\ No newline at end of file
......@@ -45,6 +45,42 @@ var Skin = {
}
});
$(window).scroll();
Util.initPjax(function () {
Util.parseMarkdown('content-reset');
if (location.href === latkeConfig.servePath + '/tags.html') {
Skin.initTags()
}
}, function () {
Util.parseMarkdown('content-reset');
Skin.initArticle();
Skin.initComment($('.post__tags').data('oid'), $('.post__tags').data('tag'))
})
},
initTags: function () {
var $tags = $('#tags');
var tagsArray = $tags.find('.tag')
// 根据引用次数添加样式,产生云效果
var max = parseInt(tagsArray.first().data('count'));
var distance = Math.ceil(max / 5);
for (var i = 0; i < tagsArray.length; i++) {
var count = parseInt($(tagsArray[i]).data('count'));
// 算出当前 tag 数目所在的区间,加上 class
for (var j = 0; j < 5; j++) {
if (count > j * distance && count <= (j + 1) * distance) {
tagsArray[i].className = 'tag tag__level' + j;
break;
}
}
}
// 按字母或者中文拼音进行排序
$tags.html(tagsArray.get().sort(function (a, b) {
var valA = $(a).text().toLowerCase();
var valB = $(b).text().toLowerCase();
// 对中英文排序的处理
return valA.localeCompare(valB);
}));
},
initArticle: function () {
Skin._share('#articleShare')
......
......@@ -28,13 +28,15 @@
</head>
<body>
<#include "header.ftl">
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
<div id="pjax">
<#if pjax><!---- pjax {#pjax} start ----></#if>
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
<div class="board">
${noticeBoard}
</div>
</#if>
</#if>
<div class="wrapper content">
<div class="module__title">
<span>
......@@ -56,7 +58,9 @@
</#list>
</#if>
</div>
<#include "bottom.ftl">
<#include "bottom.ftl">
</div>
<#if pjax><!---- pjax {#pjax} end ----></#if>
</div>
<#include "footer.ftl">
</body>
......
......@@ -41,7 +41,6 @@
<section class="content-reset">
${page.pageContent}
</section>
</article>
</div>
</div>
......
......@@ -29,6 +29,8 @@
</head>
<body>
<#include "header.ftl">
<div id="pjax">
<#if pjax><!---- pjax {#pjax} start ----></#if>
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
......@@ -49,6 +51,8 @@
<#include "article-list.ftl">
</div>
<#include "bottom2.ftl">
</div>
<#if pjax><!---- pjax {#pjax} end ----></#if>
</div>
<#include "footer.ftl">
</body>
......
......@@ -28,6 +28,8 @@
</head>
<body>
<#include "header.ftl">
<div id="pjax">
<#if pjax><!---- pjax {#pjax} start ----></#if>
<#include "nav.ftl">
<div class="main">
<#if noticeBoard??>
......@@ -53,34 +55,12 @@
</div>
</div>
<#include "bottom.ftl">
</div>
<#if pjax><!---- pjax {#pjax} end ----></#if>
</div>
<#include "footer.ftl">
<script>
(function () {
var $tags = $('#tags');
var tagsArray = $tags.find('.tag')
// 根据引用次数添加样式,产生云效果
var max = parseInt(tagsArray.first().data('count'));
var distance = Math.ceil(max / 5);
for (var i = 0; i < tagsArray.length; i++) {
var count = parseInt($(tagsArray[i]).data('count'));
// 算出当前 tag 数目所在的区间,加上 class
for (var j = 0; j < 5; j++) {
if (count > j * distance && count <= (j + 1) * distance) {
tagsArray[i].className = 'tag tag__level' + j;
break;
}
}
}
// 按字母或者中文拼音进行排序
$tags.html(tagsArray.get().sort(function (a, b) {
var valA = $(a).text().toLowerCase();
var valB = $(b).text().toLowerCase();
// 对中英文排序的处理
return valA.localeCompare(valB);
}));
})();
Skin.initTags()
</script>
</body>
</html>
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