feat: unified formatted slug.

pull/389/head
ruibaby 2019-11-18 12:55:32 +08:00
parent 020fe50be9
commit cd2c3a17b3
8 changed files with 62 additions and 43 deletions

View File

@ -4,7 +4,6 @@ import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import run.halo.app.model.dto.base.InputConverter;
import run.halo.app.model.entity.Category;
import run.halo.app.utils.HaloUtils;
import run.halo.app.utils.SlugUtils;
import javax.validation.constraints.NotBlank;
@ -14,7 +13,8 @@ import javax.validation.constraints.Size;
* Category param.
*
* @author johnniang
* @date 3/21/19
* @author ryanwang
* @date 2019-03-21
*/
@Data
public class CategoryParam implements InputConverter<Category> {
@ -46,13 +46,8 @@ public class CategoryParam implements InputConverter<Category> {
@Override
public Category convertTo() {
// Handle default value
if (StringUtils.isBlank(slugName)) {
slugName = SlugUtils.slugify(name);
if (StringUtils.isBlank(slugName)) {
slugName = HaloUtils.initializeUrlIfBlank(slugName);
}
}
slugName = StringUtils.isBlank(slugName) ? SlugUtils.slug(name) : SlugUtils.slug(slugName);
return InputConverter.super.convertTo();
}

View File

@ -1,17 +1,16 @@
package run.halo.app.model.params;
import cn.hutool.crypto.digest.BCrypt;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import run.halo.app.model.dto.base.InputConverter;
import run.halo.app.model.entity.Post;
import run.halo.app.model.enums.PostCreateFrom;
import run.halo.app.model.enums.PostStatus;
import run.halo.app.utils.SlugUtils;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Set;
@ -20,7 +19,7 @@ import java.util.Set;
*
* @author johnniang
* @author ryanwang
* @date 3/21/19
* @date 2019-03-21
*/
@Data
public class PostParam implements InputConverter<Post> {
@ -62,9 +61,8 @@ public class PostParam implements InputConverter<Post> {
@Override
public Post convertTo() {
if (StringUtils.isBlank(url)) {
url = URLEncoder.encode(title.replace(".",""));
}
url = StringUtils.isBlank(url) ? SlugUtils.slug(title) : SlugUtils.slug(url);
if (null == thumbnail) {
thumbnail = "";
}
@ -74,9 +72,8 @@ public class PostParam implements InputConverter<Post> {
@Override
public void update(Post post) {
if (StringUtils.isBlank(url)) {
url = URLEncoder.encode(title.replace(".",""));
}
url = StringUtils.isBlank(url) ? SlugUtils.slug(title) : SlugUtils.slug(url);
if (null == thumbnail) {
thumbnail = "";
}

View File

@ -1,12 +1,11 @@
package run.halo.app.model.params;
import cn.hutool.crypto.digest.BCrypt;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import run.halo.app.model.dto.base.InputConverter;
import run.halo.app.model.entity.Sheet;
import run.halo.app.model.enums.PostStatus;
import run.halo.app.utils.HaloUtils;
import run.halo.app.utils.SlugUtils;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
@ -18,7 +17,7 @@ import java.util.Date;
*
* @author johnniang
* @author ryanwang
* @date 19-4-24
* @date 2019-4-24
*/
@Data
public class SheetParam implements InputConverter<Sheet> {
@ -52,9 +51,7 @@ public class SheetParam implements InputConverter<Sheet> {
@Override
public Sheet convertTo() {
if (StringUtils.isBlank(url)) {
url = title.replace(".","");
}
url = StringUtils.isBlank(url) ? SlugUtils.slug(title) : SlugUtils.slug(url);
if (null == thumbnail) {
thumbnail = "";
@ -65,9 +62,7 @@ public class SheetParam implements InputConverter<Sheet> {
@Override
public void update(Sheet sheet) {
if (StringUtils.isBlank(url)) {
url = title.replace(".","");
}
url = StringUtils.isBlank(url) ? SlugUtils.slug(title) : SlugUtils.slug(url);
if (null == thumbnail) {
thumbnail = "";

View File

@ -4,7 +4,6 @@ import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import run.halo.app.model.dto.base.InputConverter;
import run.halo.app.model.entity.Tag;
import run.halo.app.utils.HaloUtils;
import run.halo.app.utils.SlugUtils;
import javax.validation.constraints.NotBlank;
@ -14,7 +13,8 @@ import javax.validation.constraints.Size;
* Tag param.
*
* @author johnniang
* @date 3/20/19
* @author ryanwang
* @date 2019-03-20
*/
@Data
public class TagParam implements InputConverter<Tag> {
@ -28,12 +28,8 @@ public class TagParam implements InputConverter<Tag> {
@Override
public Tag convertTo() {
if (StringUtils.isBlank(slugName)) {
// Handle slug name
slugName = SlugUtils.slugify(name);
}
slugName = HaloUtils.initializeUrlIfBlank(slugName);
slugName = StringUtils.isBlank(slugName) ? SlugUtils.slug(name) : SlugUtils.slug(slugName);
return InputConverter.super.convertTo();
}

View File

@ -24,6 +24,7 @@ import run.halo.app.service.BackupService;
import run.halo.app.service.OptionService;
import run.halo.app.service.PostService;
import run.halo.app.service.PostTagService;
import run.halo.app.utils.SlugUtils;
import java.io.File;
import java.io.IOException;
@ -213,7 +214,7 @@ public class BackupServiceImpl implements BackupService {
public static String sanitizeFilename(final String unsanitized) {
return unsanitized.
replaceAll("[^(a-zA-Z0-9\\u4e00-\\u9fa5\\.)]", "").
replaceAll("[\\?\\\\/:|<>\\*\\[\\]\\(\\)\\$%\\{\\}@~]", "").
replaceAll("[\\?\\\\/:|<>\\*\\[\\]\\(\\)\\$%\\{\\}@~\\.]", "").
replaceAll("\\s", "");
}

View File

@ -2,7 +2,6 @@ package run.halo.app.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -17,6 +16,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import run.halo.app.event.logger.LogEvent;
import run.halo.app.event.post.PostSaveBeforeEvent;
import run.halo.app.event.post.PostVisitEvent;
import run.halo.app.model.dto.CategoryDTO;
import run.halo.app.model.dto.TagDTO;
@ -30,7 +30,10 @@ import run.halo.app.model.vo.PostDetailVO;
import run.halo.app.model.vo.PostListVO;
import run.halo.app.repository.PostRepository;
import run.halo.app.service.*;
import run.halo.app.utils.*;
import run.halo.app.utils.DateUtils;
import run.halo.app.utils.MarkdownUtils;
import run.halo.app.utils.ServiceUtils;
import run.halo.app.utils.SlugUtils;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
@ -49,6 +52,7 @@ import static org.springframework.data.domain.Sort.Direction.DESC;
*/
@Slf4j
@Service
@Deprecated
public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostService {
private final PostRepository postRepository;
@ -256,8 +260,7 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
if (null == tag) {
tag = new Tag();
tag.setName(ele);
String slugName = SlugUtils.slugify(ele);
tag.setSlugName(HaloUtils.initializeUrlIfBlank(slugName));
tag.setSlugName(SlugUtils.slug(ele));
tag = tagService.create(tag);
}
tagIds.add(tag.getId());
@ -267,8 +270,7 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
if (null == category) {
category = new Category();
category.setName(ele);
String slugName = SlugUtils.slugify(ele);
category.setSlugName(HaloUtils.initializeUrlIfBlank(slugName));
category.setSlugName(SlugUtils.slug(ele));
category.setDescription(ele);
category = categoryService.create(category);
}
@ -290,7 +292,7 @@ public class PostServiceImpl extends BasePostServiceImpl<Post> implements PostSe
}
if (StrUtil.isEmpty(post.getUrl())) {
post.setUrl(DateUtil.format(new Date(), "yyyyMMddHHmmss" + RandomUtil.randomNumbers(5)));
post.setUrl(SlugUtils.slug(post.getTitle()));
}
post.setOriginalContent(markdown);

View File

@ -1,5 +1,6 @@
package run.halo.app.utils;
import cn.hutool.core.util.StrUtil;
import org.springframework.lang.NonNull;
import org.springframework.util.Assert;
@ -11,7 +12,8 @@ import java.util.regex.Pattern;
* Slugify utilities.
*
* @author johnniang
* @date 3/20/19
* @author ryanwang
* @date 2019-03-20
*/
public class SlugUtils {
@ -25,6 +27,7 @@ public class SlugUtils {
* @return slug string
*/
@NonNull
@Deprecated
public static String slugify(@NonNull String input) {
Assert.hasText(input, "Input string must not be blank");
@ -33,4 +36,21 @@ public class SlugUtils {
String slug = NON_LATIN.matcher(normalized).replaceAll("");
return slug.toLowerCase(Locale.ENGLISH);
}
/**
* Slugify string.
*
* @param input input string must not be blank
* @return slug string
*/
public static String slug(@NonNull String input) {
Assert.hasText(input, "Input string must not be blank");
String slug = input.
replaceAll("[^(a-zA-Z0-9\\u4e00-\\u9fa5\\.\\-)]", "").
replaceAll("[\\?\\\\/:|<>\\*\\[\\]\\(\\)\\$%\\{\\}@~\\.]", "").
replaceAll("\\s", "")
.toLowerCase(Locale.ENGLISH);
return StrUtil.isNotEmpty(slug) ? slug : String.valueOf(System.currentTimeMillis());
}
}

View File

@ -4,7 +4,6 @@ import org.junit.Assert;
import org.junit.Test;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.*;
/**
* @author johnniang
@ -18,4 +17,18 @@ public class SlugUtilsTest {
Assert.assertThat(slugResult, equalTo("hello-world"));
}
@Test
public void slugTest() {
String slug = SlugUtils.slug("一二三四 +/~!@#$%^&*()_+ - hello-world");
Assert.assertThat(slug, equalTo("一二三四-hello-world"));
}
@Test
public void nullSlugTest() {
String slug = SlugUtils.slug("+/~!@#$%^&*()_+");
System.out.println("slug" + slug);
}
}