Compatible with markdown file from hexo (#1492)

* hexo语法省略开头的---时无法解析元信息,兼容此种情况

* 修复导入markdown文件时固定条件下出现 [该标签已存在] 的异常

* hexo语法的博客在实际使用时可以省略开头的 --- 分隔符 : add unit test

* fix code style

Co-authored-by: zhanglei <zhanglei9588@foxmail.com>
pull/1494/head
zllr 2021-10-08 15:39:02 +08:00 committed by GitHub
parent de71f40de6
commit 8c26430b31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 3 deletions

View File

@ -31,7 +31,7 @@ public interface TagService extends CrudService<Tag, Integer> {
* @param slug slug
* @return tag
*/
@NonNull
@Nullable
Tag getBySlug(@NonNull String slug);
/**

View File

@ -412,10 +412,14 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
tagName = StringUtils.strip(tagName, "\"");
tagName = StringUtils.strip(tagName, "\'");
tag = tagService.getByName(tagName);
String slug = SlugUtils.slug(tagName);
if (null == tag) {
tag = tagService.getBySlug(slug);
}
if (null == tag) {
tag = new Tag();
tag.setName(tagName);
tag.setSlug(SlugUtils.slug(tagName));
tag.setSlug(slug);
tag = tagService.create(tag);
}
tagIds.add(tag.getId());

View File

@ -71,7 +71,7 @@ public class MarkdownUtils {
private static final Parser PARSER = Parser.builder(OPTIONS).build();
private static final HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build();
private static final Pattern FRONT_MATTER = Pattern.compile("^---[\\s\\S]*?---");
private static final Pattern FRONT_MATTER = Pattern.compile("^(---)?[\\s\\S]*?---");
// /**
// * Render html document to markdown document.
@ -136,6 +136,9 @@ public class MarkdownUtils {
return row;
}
}).collect(Collectors.joining("\n"));
if (!markdown.startsWith("---\n")) {
markdown = "---\n" + markdown;
}
AbstractYamlFrontMatterVisitor visitor = new AbstractYamlFrontMatterVisitor();
Node document = PARSER.parse(markdown);
visitor.visit(document);

View File

@ -3,6 +3,8 @@ package run.halo.app.utils;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
@ -33,6 +35,15 @@ class MarkdownUtilsTest {
+ "---"
+ "test---";
assertEquals("test---", MarkdownUtils.removeFrontMatter(markdown));
markdown = "title: \"test remove\"\n"
+ "test---";
assertEquals("", MarkdownUtils.removeFrontMatter(markdown));
markdown = "title: \"test remove\"\n"
+ "---"
+ "test---";
assertEquals("test---", MarkdownUtils.removeFrontMatter(markdown));
}
@Test
@ -70,4 +81,18 @@ class MarkdownUtilsTest {
+ "</section>\n";
assertTrue(StringUtils.equals(s2Expected, s2));
}
@Test
void getFrontMatter() {
String markdown = "---\n"
+ "title: \"test remove\"\n"
+ "---";
Map<String, List<String>> frontMatter = MarkdownUtils.getFrontMatter(markdown);
assertEquals("\"test remove\"", frontMatter.get("title").get(0));
markdown = "title: \"test remove\"\n"
+ "---";
frontMatter = MarkdownUtils.getFrontMatter(markdown);
assertEquals("\"test remove\"", frontMatter.get("title").get(0));
}
}