From 41edec82137e749ea838031837dcb6b32ce1d23f Mon Sep 17 00:00:00 2001 From: coortop <49756728+coortop@users.noreply.github.com> Date: Tue, 21 Jul 2020 21:58:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E7=AB=A0=E8=A1=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AD=97=E6=95=B0=E7=BB=9F=E8=AE=A1=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C=E4=B8=BB=E9=A2=98=E5=8F=AF=E4=BD=BF=E7=94=A8${post.wo?= =?UTF-8?q?rdCount}=E8=B0=83=E7=94=A8=20(#965)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/dto/post/BasePostSimpleDTO.java | 2 + .../run/halo/app/model/entity/BasePost.java | 12 ++++++ .../app/service/impl/BasePostServiceImpl.java | 5 +++ .../app/service/impl/PostServiceImpl.java | 5 +++ .../java/run/halo/app/utils/StringUtils.java | 42 +++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 src/main/java/run/halo/app/utils/StringUtils.java diff --git a/src/main/java/run/halo/app/model/dto/post/BasePostSimpleDTO.java b/src/main/java/run/halo/app/model/dto/post/BasePostSimpleDTO.java index 1337e41de..725ddb8e2 100644 --- a/src/main/java/run/halo/app/model/dto/post/BasePostSimpleDTO.java +++ b/src/main/java/run/halo/app/model/dto/post/BasePostSimpleDTO.java @@ -30,6 +30,8 @@ public class BasePostSimpleDTO extends BasePostMinimalDTO { private Long likes; + private Long wordCount; + public boolean isTopped() { return this.topPriority != null && this.topPriority > 0; } diff --git a/src/main/java/run/halo/app/model/entity/BasePost.java b/src/main/java/run/halo/app/model/entity/BasePost.java index deb22d19a..de67d8ea8 100644 --- a/src/main/java/run/halo/app/model/entity/BasePost.java +++ b/src/main/java/run/halo/app/model/entity/BasePost.java @@ -16,6 +16,7 @@ import java.util.Date; * * @author johnniang * @author ryanwang + * @author coor.top */ @Data @Entity(name = "BasePost") @@ -151,6 +152,13 @@ public class BasePost extends BaseEntity { @Column(name = "meta_description", length = 1023) private String metaDescription; + /** + * Content word count + */ + @Column(name = "word_count") + @ColumnDefault("0") + private Long wordCount; + @Override public void prePersist() { super.prePersist(); @@ -206,6 +214,10 @@ public class BasePost extends BaseEntity { if (editorType == null) { editorType = PostEditorType.MARKDOWN; } + + if (wordCount == null || wordCount < 0) { + wordCount = 0L; + } } } diff --git a/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java b/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java index ceb529fb1..6985131cb 100644 --- a/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/BasePostServiceImpl.java @@ -231,6 +231,11 @@ public abstract class BasePostServiceImpl extends Abstrac public POST createOrUpdateBy(POST post) { Assert.notNull(post, "Post must not be null"); + String originalContent = post.getOriginalContent(); + originalContent = run.halo.app.utils.StringUtils.htmlToString(originalContent); + + post.setWordCount((long) originalContent.length()); + // Render content if (post.getEditorType().equals(PostEditorType.MARKDOWN)) { post.setFormatContent(MarkdownUtils.renderHtml(post.getOriginalContent())); diff --git a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java index d9ddde6f4..50b7a57bf 100644 --- a/src/main/java/run/halo/app/service/impl/PostServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/PostServiceImpl.java @@ -54,6 +54,7 @@ import static run.halo.app.model.support.HaloConst.URL_SEPARATOR; * @author ryanwang * @author guqing * @author evanwang + * @author coor.top * @date 2019-03-14 */ @Slf4j @@ -560,6 +561,8 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe postListVO.setFullPath(buildFullPath(post)); + postListVO.setWordCount(post.getWordCount()); + return postListVO; }); } @@ -618,6 +621,8 @@ public class PostServiceImpl extends BasePostServiceImpl implements PostSe postListVO.setFullPath(buildFullPath(post)); + postListVO.setWordCount(post.getWordCount()); + return postListVO; }).collect(Collectors.toList()); } diff --git a/src/main/java/run/halo/app/utils/StringUtils.java b/src/main/java/run/halo/app/utils/StringUtils.java new file mode 100644 index 000000000..6414f21d3 --- /dev/null +++ b/src/main/java/run/halo/app/utils/StringUtils.java @@ -0,0 +1,42 @@ +package run.halo.app.utils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @program: halo + * @description: processing strings Utlis + * @author: coor.top + * @create: 2020-07-14 01:24 + **/ +public class StringUtils { + + private StringUtils() { + } + + /** + * html convert to string + * + * @param htmlStr + */ + public static String htmlToString(String htmlStr) { + htmlStr = htmlStr.trim().replaceAll("\"", "'"); //如果有双引号将其先转成单引号 + String regExScript = "]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式 + String regExStyle = "]*?>[\\s\\S]*?<\\/style>"; // 定义style的正则表达式 + String regExHtml = "<[^>]+>"; // 定义HTML标签的正则表达式 + + Pattern pScript = Pattern.compile(regExScript, Pattern.CASE_INSENSITIVE); + Matcher mScript = pScript.matcher(htmlStr); + htmlStr = mScript.replaceAll(""); // 过滤script标签 + + Pattern pStyle = Pattern.compile(regExStyle, Pattern.CASE_INSENSITIVE); + Matcher mStyle = pStyle.matcher(htmlStr); + htmlStr = mStyle.replaceAll(""); // 过滤style标签 + + Pattern pHtml = Pattern.compile(regExHtml, Pattern.CASE_INSENSITIVE); + Matcher mHtml = pHtml.matcher(htmlStr); + htmlStr = mHtml.replaceAll(""); // 过滤html标签 + + return htmlStr; + } +}