Commit 4df4d7e2 authored by Liang Ding's avatar Liang Ding

Merge remote-tracking branch 'refs/remotes/origin/1.8.0-dev'

parents 523b7a62 833e48c8
...@@ -15,9 +15,6 @@ ...@@ -15,9 +15,6 @@
*/ */
package org.b3log.solo.api.symphony; package org.b3log.solo.api.symphony;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.b3log.latke.Keys; import org.b3log.latke.Keys;
import org.b3log.latke.logging.Level; import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger; import org.b3log.latke.logging.Logger;
...@@ -42,11 +39,15 @@ import org.json.JSONObject; ...@@ -42,11 +39,15 @@ import org.json.JSONObject;
import org.jsoup.Jsoup; import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist; import org.jsoup.safety.Whitelist;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** /**
* Article receiver (from B3log Symphony). * Article receiver (from B3log Symphony).
* *
* @author <a href="http://88250.b3log.org">Liang Ding</a> * @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.2.7, Nov 8, 2016 * @version 1.0.3.7, Jan 15, 2017
* @since 0.5.5 * @since 0.5.5
*/ */
@RequestProcessor @RequestProcessor
...@@ -56,39 +57,33 @@ public class ArticleReceiver { ...@@ -56,39 +57,33 @@ public class ArticleReceiver {
* Logger. * Logger.
*/ */
private static final Logger LOGGER = Logger.getLogger(ArticleReceiver.class.getName()); private static final Logger LOGGER = Logger.getLogger(ArticleReceiver.class.getName());
/**
* Article abstract length.
*/
private static final int ARTICLE_ABSTRACT_LENGTH = 500;
/** /**
* Preference query service. * Preference query service.
*/ */
@Inject @Inject
private PreferenceQueryService preferenceQueryService; private PreferenceQueryService preferenceQueryService;
/** /**
* Article management service. * Article management service.
*/ */
@Inject @Inject
private ArticleMgmtService articleMgmtService; private ArticleMgmtService articleMgmtService;
/** /**
* Article query service. * Article query service.
*/ */
@Inject @Inject
private ArticleQueryService articleQueryService; private ArticleQueryService articleQueryService;
/** /**
* User query service. * User query service.
*/ */
@Inject @Inject
private UserQueryService userQueryService; private UserQueryService userQueryService;
/**
* Article abstract length.
*/
private static final int ARTICLE_ABSTRACT_LENGTH = 500;
/** /**
* Adds an article with the specified request. * Adds an article with the specified request.
*
* <p> * <p>
* Renders the response with a json object, for example, * Renders the response with a json object, for example,
* <pre> * <pre>
...@@ -100,21 +95,17 @@ public class ArticleReceiver { ...@@ -100,21 +95,17 @@ public class ArticleReceiver {
* </pre> * </pre>
* </p> * </p>
* *
* @param request the specified http servlet request, for example, <pre> * @param request the specified http servlet request, for example,
* { * "article": {
* "article": { * "oId": "",
* "oId": "", * "articleTitle": "",
* "articleTitle": "", * "articleContent": "",
* "articleContent": "", * "articleTags": "tag1,tag2,tag3",
* "articleTags": "tag1,tag2,tag3", * "userB3Key": "",
* "userB3Key": "", * "articleEditorType": ""
* "articleEditorType": "" * }
* }
* }
* </pre>
*
* @param response the specified http servlet response * @param response the specified http servlet response
* @param context the specified http request context * @param context the specified http request context
* @throws Exception exception * @throws Exception exception
*/ */
@RequestProcessing(value = "/apis/symphony/article", method = HTTPRequestMethod.POST) @RequestProcessing(value = "/apis/symphony/article", method = HTTPRequestMethod.POST)
...@@ -179,7 +170,6 @@ public class ArticleReceiver { ...@@ -179,7 +170,6 @@ public class ArticleReceiver {
/** /**
* Updates an article with the specified request. * Updates an article with the specified request.
*
* <p> * <p>
* Renders the response with a json object, for example, * Renders the response with a json object, for example,
* <pre> * <pre>
...@@ -190,21 +180,17 @@ public class ArticleReceiver { ...@@ -190,21 +180,17 @@ public class ArticleReceiver {
* </pre> * </pre>
* </p> * </p>
* *
* @param request the specified http servlet request, for example, <pre> * @param request the specified http servlet request, for example,
* { * "article": {
* "article": { * "oId": "", // Symphony Article#clientArticleId
* "oId": "", // Symphony Article#clientArticleId * "articleTitle": "",
* "articleTitle": "", * "articleContent": "",
* "articleContent": "", * "articleTags": "tag1,tag2,tag3",
* "articleTags": "tag1,tag2,tag3", * "userB3Key": "",
* "userB3Key": "", * "articleEditorType": ""
* "articleEditorType": "" * }
* }
* }
* </pre>
*
* @param response the specified http servlet response * @param response the specified http servlet response
* @param context the specified http request context * @param context the specified http request context
* @throws Exception exception * @throws Exception exception
*/ */
@RequestProcessing(value = "/apis/symphony/article", method = HTTPRequestMethod.PUT) @RequestProcessing(value = "/apis/symphony/article", method = HTTPRequestMethod.PUT)
...@@ -240,8 +226,8 @@ public class ArticleReceiver { ...@@ -240,8 +226,8 @@ public class ArticleReceiver {
return; return;
} }
final String plainTextContent = Jsoup.parse(article.optString(Article.ARTICLE_CONTENT)).text(); final String articleContent = article.optString(Article.ARTICLE_CONTENT);
final String plainTextContent = Jsoup.clean(Markdowns.toHTML(articleContent), Whitelist.none());
if (plainTextContent.length() > ARTICLE_ABSTRACT_LENGTH) { if (plainTextContent.length() > ARTICLE_ABSTRACT_LENGTH) {
article.put(Article.ARTICLE_ABSTRACT, plainTextContent.substring(0, ARTICLE_ABSTRACT_LENGTH) + "...."); article.put(Article.ARTICLE_ABSTRACT, plainTextContent.substring(0, ARTICLE_ABSTRACT_LENGTH) + "....");
} else { } else {
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
admin.about = { admin.about = {
init: function() { init: function() {
$.ajax({ $.ajax({
url: "http://rhythm.b3log.org/version/solo/latest/" + Label.version, url: window.location.protocol + '://' + "rhythm.b3log.org/version/solo/latest/" + Label.version,
type: "GET", type: "GET",
cache: false, cache: false,
dataType: "jsonp", dataType: "jsonp",
......
...@@ -4105,7 +4105,7 @@ admin.register.main = { ...@@ -4105,7 +4105,7 @@ admin.register.main = {
admin.about = { admin.about = {
init: function() { init: function() {
$.ajax({ $.ajax({
url: "http://rhythm.b3log.org/version/solo/latest/" + Label.version, url: window.location.protocol + '://' + "rhythm.b3log.org/version/solo/latest/" + Label.version,
type: "GET", type: "GET",
cache: false, cache: false,
dataType: "jsonp", dataType: "jsonp",
......
...@@ -579,6 +579,7 @@ img { ...@@ -579,6 +579,7 @@ img {
.sidebar section { .sidebar section {
opacity: 0; opacity: 0;
position: relative; position: relative;
overflow: auto;
} }
.sidebar > ul > li { .sidebar > ul > li {
......
This diff is collapsed.
...@@ -99,7 +99,7 @@ var NexT = { ...@@ -99,7 +99,7 @@ var NexT = {
$('.sidebar').prepend(articleTocHTML); $('.sidebar').prepend(articleTocHTML);
var $sectionF = $('.sidebar section:first').html($('.b3-solo-list')), var $sectionF = $('.sidebar section:first').html($('.b3-solo-list')),
$sectionL = $('.sidebar section:last'); $sectionL = $('.sidebar section:last');
$sectionF.height($(window).height() - 90);
// 切换 tab // 切换 tab
$('.sidebar > ul > li').click(function () { $('.sidebar > ul > li').click(function () {
if ($(this).data('tab') === 'toc') { if ($(this).data('tab') === 'toc') {
......
...@@ -13,4 +13,4 @@ ...@@ -13,4 +13,4 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
var NexT={init:function(){$(".sidebar-toggle").click(function(){var i=$(".sidebar");$(this).hasClass("sidebar-active")?($(this).removeClass("sidebar-active"),$("body").animate({"padding-right":0}),i.animate({right:-320}),i.find("section").css("opacity",0)):($(this).addClass("sidebar-active"),$("body").animate({"padding-right":320}),i.animate({right:0},function(){i.find("section:first").animate({opacity:1})}))}),$(".site-nav-toggle").click(function(){$(".site-nav").slideToggle()}),$(document).ready(function(){setTimeout(function(){$(".logo-wrap").css("opacity",1),$(".logo-line-before i").animate({left:"0"},function(){$(".site-title").css("opacity",1).animate({top:0},function(){$(".menu").css("opacity",1).animate({"margin-top":"15px"}),$(".main").css("opacity",1).animate({top:"0"},function(){$(".b3-solo-list li").length>0&&$(window).width()>1e3&&$(".sidebar-toggle").click()})})}),$(".logo-line-after i").animate({right:"0"})},500)})},initArticle:function(){if($(".b3-solo-list li").length>0&&$(window).width()>1e3){$(".sidebar-toggle").addClass("has-toc");var i='<ul><li class="current" data-tab="toc">'+Label.tocLabel+'</li><li data-tab="site">'+Label.siteViewLabel+"</li></ul><section></section>";$(".sidebar").prepend(i);var t=$(".sidebar section:first").html($(".b3-solo-list")),a=$(".sidebar section:last");$(".sidebar > ul > li").click(function(){"toc"===$(this).data("tab")?a.animate({opacity:"0",top:"-50px"},300,function(){t.show().css("top","-50px"),t.animate({opacity:"1",top:"0"},300)}):t.animate({opacity:"0",top:"-50px"},300,function(){t.hide().css("top","-50px"),a.animate({opacity:"1",top:"0"},300)}),$(".sidebar > ul > li").removeClass("current"),$(this).addClass("current")})}}};NexT.init(); var NexT={init:function(){$(".sidebar-toggle").click(function(){var i=$(".sidebar");$(this).hasClass("sidebar-active")?($(this).removeClass("sidebar-active"),$("body").animate({"padding-right":0}),i.animate({right:-320}),i.find("section").css("opacity",0)):($(this).addClass("sidebar-active"),$("body").animate({"padding-right":320}),i.animate({right:0},function(){i.find("section:first").animate({opacity:1})}))}),$(".site-nav-toggle").click(function(){$(".site-nav").slideToggle()}),$(document).ready(function(){setTimeout(function(){$(".logo-wrap").css("opacity",1),$(".logo-line-before i").animate({left:"0"},function(){$(".site-title").css("opacity",1).animate({top:0},function(){$(".menu").css("opacity",1).animate({"margin-top":"15px"}),$(".main").css("opacity",1).animate({top:"0"},function(){$(".b3-solo-list li").length>0&&$(window).width()>1e3&&$(".sidebar-toggle").click()})})}),$(".logo-line-after i").animate({right:"0"})},500)})},initArticle:function(){if($(".b3-solo-list li").length>0&&$(window).width()>1e3){$(".sidebar-toggle").addClass("has-toc");var i='<ul><li class="current" data-tab="toc">'+Label.tocLabel+'</li><li data-tab="site">'+Label.siteViewLabel+"</li></ul><section></section>";$(".sidebar").prepend(i);var t=$(".sidebar section:first").html($(".b3-solo-list")),a=$(".sidebar section:last");t.height($(window).height()-90),$(".sidebar > ul > li").click(function(){"toc"===$(this).data("tab")?a.animate({opacity:"0",top:"-50px"},300,function(){t.show().css("top","-50px"),t.animate({opacity:"1",top:"0"},300)}):t.animate({opacity:"0",top:"-50px"},300,function(){t.hide().css("top","-50px"),a.animate({opacity:"1",top:"0"},300)}),$(".sidebar > ul > li").removeClass("current"),$(this).addClass("current")})}}};NexT.init();
\ No newline at end of file \ No newline at end of file
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