From 2ac0dda82bf2c32225b5544e756bc70f0ed8eddc Mon Sep 17 00:00:00 2001 From: ruibaby Date: Wed, 14 Nov 2018 22:45:13 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=94=B9=E7=94=A8=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=B8=B2=E6=9F=93Markdown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- pom.xml | 18 +++++ .../halo/service/impl/OptionsServiceImpl.java | 4 ++ .../halo/service/impl/PostServiceImpl.java | 2 +- .../java/cc/ryanc/halo/utils/HaloUtils.java | 6 +- .../cc/ryanc/halo/utils/MarkdownUtils.java | 65 +++++++++++++++++++ .../web/controller/admin/PageController.java | 2 + .../web/controller/admin/PostController.java | 5 +- .../controller/core/InstallController.java | 3 +- .../resources/templates/admin/admin_login.ftl | 4 +- .../templates/admin/admin_option.ftl | 19 +----- .../templates/admin/admin_page_md_editor.ftl | 1 - .../templates/admin/admin_post_md_editor.ftl | 1 - .../templates/admin/admin_profile.ftl | 6 +- .../templates/admin/module/_macro.ftl | 28 +------- 15 files changed, 108 insertions(+), 58 deletions(-) create mode 100644 src/main/java/cc/ryanc/halo/utils/MarkdownUtils.java diff --git a/README.md b/README.md index 0bc6abb4f..da085a539 100755 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Let's start: http://localhost:8090 Halo的诞生离不开下面这些项目: - [IntelliJ IDEA](https://www.jetbrains.com/idea/):个人认为最强大的Java IDE,没有之一 -- [Spring Boot](https://github.com/spring-projects/spring-boot):Spring的微服务框架 +- [Spring Boot](https://github.com/spring-projects/spring-boot):Spring的快速开发框架 - [Freemarker](https://freemarker.apache.org/):模板引擎,使页面静态化 - [H2 Database](https://github.com/h2database/h2database):嵌入式数据库,无需安装 - [Druid](https://github.com/alibaba/druid):阿里开发的连接池 diff --git a/pom.xml b/pom.xml index aaf2d9d1a..ad19df4bc 100755 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ 7.2.14 0.4.8 2.3.0 + 0.12.1 @@ -174,6 +175,23 @@ ${jaxb-api.version} + + + com.atlassian.commonmark + commonmark + ${commonmark.version} + + + com.atlassian.commonmark + commonmark-ext-gfm-tables + ${commonmark.version} + + + com.atlassian.commonmark + commonmark-ext-yaml-front-matter + ${commonmark.version} + + diff --git a/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java index 358287e31..993317c5a 100755 --- a/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java @@ -5,6 +5,7 @@ import cc.ryanc.halo.repository.OptionsRepository; import cc.ryanc.halo.service.OptionsService; import cn.hutool.core.util.StrUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import java.util.HashMap; @@ -25,12 +26,15 @@ public class OptionsServiceImpl implements OptionsService { @Autowired private OptionsRepository optionsRepository; + private static final String POSTS_CACHE_NAME = "posts"; + /** * 批量保存设置 * * @param options options */ @Override + @CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true) public void saveOptions(Map options) { if (null != options && !options.isEmpty()) { options.forEach((k, v) -> saveOption(k, v)); diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java index 9b621e104..f9eeded0b 100755 --- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java @@ -104,7 +104,7 @@ public class PostServiceImpl implements PostService { public void updateAllSummary(Integer postSummary) { List posts = this.findAllPosts(PostTypeEnum.POST_TYPE_POST.getDesc()); for (Post post : posts) { - String text = StrUtil.trim(HtmlUtil.cleanHtmlTag(post.getPostContent())); + String text = StrUtil.cleanBlank(HtmlUtil.cleanHtmlTag(post.getPostContent())); if (text.length() > postSummary) { post.setPostSummary(text.substring(0, postSummary)); } else { diff --git a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java index 1d1a2796f..f32e48c3d 100755 --- a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java +++ b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java @@ -84,17 +84,17 @@ public class HaloUtils { * @return String */ public static String parseSize(long size) { - if (size < CommonParamsEnum.NOT_FOUND.getValue()) { + if (size < CommonParamsEnum.BYTE.getValue()) { return String.valueOf(size) + "B"; } else { size = size / 1024; } - if (size < CommonParamsEnum.NOT_FOUND.getValue()) { + if (size < CommonParamsEnum.BYTE.getValue()) { return String.valueOf(size) + "KB"; } else { size = size / 1024; } - if (size < CommonParamsEnum.NOT_FOUND.getValue()) { + if (size < CommonParamsEnum.BYTE.getValue()) { size = size * 100; return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB"; } else { diff --git a/src/main/java/cc/ryanc/halo/utils/MarkdownUtils.java b/src/main/java/cc/ryanc/halo/utils/MarkdownUtils.java new file mode 100644 index 000000000..d9bfb73a9 --- /dev/null +++ b/src/main/java/cc/ryanc/halo/utils/MarkdownUtils.java @@ -0,0 +1,65 @@ +package cc.ryanc.halo.utils; + +import org.commonmark.Extension; +import org.commonmark.ext.front.matter.YamlFrontMatterExtension; +import org.commonmark.ext.front.matter.YamlFrontMatterVisitor; +import org.commonmark.ext.gfm.tables.TablesExtension; +import org.commonmark.node.Node; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author : RYAN0UP + * @date : 2018/11/14 + */ +public class MarkdownUtils { + + /** + * Front-matter插件 + */ + private static final Set EXTENSIONS_YAML = Collections.singleton(YamlFrontMatterExtension.create()); + + /** + * Table插件 + */ + private static final Set EXTENSIONS_TABLE = Collections.singleton(TablesExtension.create()); + + /** + * 解析Markdown文档 + */ + private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS_YAML).extensions(EXTENSIONS_TABLE).build(); + + /** + * 渲染HTML文档 + */ + private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS_YAML).extensions(EXTENSIONS_TABLE).build(); + + /** + * 渲染Markdown + * + * @param content content + * @return String + */ + public static String renderMarkdown(String content) { + Node document = PARSER.parse(content); + return RENDERER.render(document); + } + + /** + * 获取元数据 + * + * @param content content + * @return Map + */ + public static Map> getFrontMatter(String content) { + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); + Node document = PARSER.parse(content); + document.accept(visitor); + return visitor.getData(); + } +} diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java index 59df99b29..918258449 100755 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/PageController.java @@ -13,6 +13,7 @@ import cc.ryanc.halo.service.LogsService; import cc.ryanc.halo.service.PostService; import cc.ryanc.halo.utils.HaloUtils; import cc.ryanc.halo.utils.LocaleMessageUtil; +import cc.ryanc.halo.utils.MarkdownUtils; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; @@ -235,6 +236,7 @@ public class PageController { post.setPostDate(DateUtil.date()); post.setPostUpdate(DateUtil.date()); } + post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd())); //当没有选择文章缩略图的时候,自动分配一张内置的缩略图 if (StrUtil.equals(post.getPostThumbnail(), BlogPropertiesEnum.DEFAULT_THUMBNAIL.getProp())) { post.setPostThumbnail("/static/images/thumbnail/thumbnail-" + RandomUtil.randomInt(1, 10) + ".jpg"); diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java index f3aa541a6..4a4aab80b 100755 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/PostController.java @@ -14,6 +14,7 @@ import cc.ryanc.halo.service.PostService; import cc.ryanc.halo.service.TagService; import cc.ryanc.halo.utils.HaloUtils; import cc.ryanc.halo.utils.LocaleMessageUtil; +import cc.ryanc.halo.utils.MarkdownUtils; import cc.ryanc.halo.web.controller.core.BaseController; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; @@ -169,13 +170,14 @@ public class PostController extends BaseController { User user = (User) session.getAttribute(HaloConst.USER_SESSION_KEY); String msg = localeMessageUtil.getMessage("code.admin.common.save-success"); try { + post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd())); //提取摘要 int postSummary = 50; if (StrUtil.isNotEmpty(HaloConst.OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp()))) { postSummary = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.POST_SUMMARY.getProp())); } //文章摘要 - String summaryText = StrUtil.trim(HtmlUtil.cleanHtmlTag(post.getPostContent())); + String summaryText = StrUtil.cleanBlank(HtmlUtil.cleanHtmlTag(post.getPostContent())); if (summaryText.length() > postSummary) { String summary = summaryText.substring(0, postSummary); post.setPostSummary(summary); @@ -210,6 +212,7 @@ public class PostController extends BaseController { return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), msg); } catch (Exception e) { log.error("Save article failed: {}", e.getMessage()); + e.printStackTrace(); return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.save-failed")); } } diff --git a/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java b/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java index 18d97eb9d..b68fb551e 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/core/InstallController.java @@ -7,6 +7,7 @@ import cc.ryanc.halo.model.enums.AllowCommentEnum; import cc.ryanc.halo.model.enums.BlogPropertiesEnum; import cc.ryanc.halo.model.enums.TrueFalseEnum; import cc.ryanc.halo.service.*; +import cc.ryanc.halo.utils.MarkdownUtils; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; @@ -131,7 +132,7 @@ public class InstallController { post.setPostTitle("Hello Halo!"); post.setPostContentMd("# Hello Halo!\n" + "欢迎使用Halo进行创作,删除这篇文章后赶紧开始吧。"); - post.setPostContent("

Hello Halo!

欢迎使用Halo进行创作,删除这篇文章后赶紧开始吧。

\n"); + post.setPostContent(MarkdownUtils.renderMarkdown(post.getPostContentMd())); post.setPostSummary("欢迎使用Halo进行创作,删除这篇文章后赶紧开始吧。"); post.setPostStatus(0); post.setPostDate(DateUtil.date()); diff --git a/src/main/resources/templates/admin/admin_login.ftl b/src/main/resources/templates/admin/admin_login.ftl index f6f0aaafa..bb6e8454a 100755 --- a/src/main/resources/templates/admin/admin_login.ftl +++ b/src/main/resources/templates/admin/admin_login.ftl @@ -23,10 +23,10 @@ -
- -
-
- -
- -
-
-
- -
- -
-
-
-
@@ -588,7 +571,7 @@
- +
diff --git a/src/main/resources/templates/admin/admin_page_md_editor.ftl b/src/main/resources/templates/admin/admin_page_md_editor.ftl index 73d860bce..9e3a75ff0 100755 --- a/src/main/resources/templates/admin/admin_page_md_editor.ftl +++ b/src/main/resources/templates/admin/admin_page_md_editor.ftl @@ -219,7 +219,6 @@ 'postTitle': Title, 'postUrl' : $('#postUrl').html().toString(), 'postContentMd': simplemde.value(), - 'postContent': simplemde.markdown(simplemde.value()), 'postThumbnail': $('#selectImg').attr('src'), 'allowComment' : $('#allowComment').val(), 'customTpl' : $("#customTpl").val() diff --git a/src/main/resources/templates/admin/admin_post_md_editor.ftl b/src/main/resources/templates/admin/admin_post_md_editor.ftl index 44136708a..acb80c7ff 100755 --- a/src/main/resources/templates/admin/admin_post_md_editor.ftl +++ b/src/main/resources/templates/admin/admin_post_md_editor.ftl @@ -310,7 +310,6 @@ 'postTitle': Title, 'postUrl' : $('#postUrl').html().toString(), 'postContentMd': simplemde.value(), - 'postContent': simplemde.markdown(simplemde.value()), 'postThumbnail': $('#selectImg').attr('src'), 'cateList' : cateList.toString(), 'tagList' : $('#tagList').tagEditor('getTags')[0].tags.toString(), diff --git a/src/main/resources/templates/admin/admin_profile.ftl b/src/main/resources/templates/admin/admin_profile.ftl index c9c6012e5..59b10348f 100644 --- a/src/main/resources/templates/admin/admin_profile.ftl +++ b/src/main/resources/templates/admin/admin_profile.ftl @@ -95,19 +95,19 @@
- +
- +
- +
diff --git a/src/main/resources/templates/admin/module/_macro.ftl b/src/main/resources/templates/admin/module/_macro.ftl index db2d51fa7..c474eab06 100644 --- a/src/main/resources/templates/admin/module/_macro.ftl +++ b/src/main/resources/templates/admin/module/_macro.ftl @@ -29,19 +29,6 @@ -<#if (options.admin_loading!'false') == 'true'> -<#-- 页面加载动画 --> -
-
-
-
-
-
-
-
-
-
-
<#-- 顶部栏模块 --> <#include "_header.ftl"> @@ -53,7 +40,7 @@ <#include "_footer.ftl">
<#if (options.admin_pjax!'true') == 'true'> - + @@ -61,27 +48,16 @@ <#if (options.blog_locale!'zh_CN') == 'zh_CN'> - + <@compress single_line=true>