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; + } +}