feat: 文章表添加字数统计字段,主题可使用${post.wordCount}调用 (#965)

pull/992/head^2
coortop 2020-07-21 21:58:04 +08:00 committed by GitHub
parent 0dbbef919c
commit 41edec8213
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 66 additions and 0 deletions

View File

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

View File

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

View File

@ -231,6 +231,11 @@ public abstract class BasePostServiceImpl<POST extends BasePost> 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()));

View File

@ -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<Post> implements PostSe
postListVO.setFullPath(buildFullPath(post));
postListVO.setWordCount(post.getWordCount());
return postListVO;
});
}
@ -618,6 +621,8 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
postListVO.setFullPath(buildFullPath(post));
postListVO.setWordCount(post.getWordCount());
return postListVO;
}).collect(Collectors.toList());
}

View File

@ -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 = "<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
String regExStyle = "<style[^>]*?>[\\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;
}
}