Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
- 支持 Markdown、Word(.doc、.docx)文档导入,包含关联的图片资源。
- 支持文章克隆。
- 支持复制文章内容。
- 支持内容片段:可将编辑器中选中的内容保存为可复用片段,在编辑器中通过 `/`、`、` 或“插入内容”菜单快速插入,支持中文、全拼和拼音首字母搜索;插入的是片段当前内容的快照,后续修改片段不会影响已插入内容。
- 支持在工具菜单中管理内容片段,支持新建、编辑和删除。

## 使用方式

Expand All @@ -21,6 +23,11 @@
3. 在文章管理页面中,点击文章的 `···` 按钮即可看到 **转换** 和 **导出** 的功能选项。
4. 也可以在文章编辑页面顶部的编辑器选择框中选择 **内容格式转换器** 进行转换。
5. 在工具菜单中提供了文章导入功能,可以导入本地的 Markdown、Word 文档。
6. 在文章编辑器中选中内容后,可通过浮动菜单的 **保存为片段** 将选区保存为内容片段;输入已有片段名称时可以选择替换原有片段。
7. 在编辑器中输入 `/` 或 `、`,再输入片段名称、全拼或拼音首字母即可插入片段;也可以通过编辑器工具栏的 **插入内容** → **内容片段** 打开选择器,选择器中还支持按描述搜索。
8. 在左侧菜单的 **工具** → **内容片段** 页面中可以新建、编辑、删除和搜索片段。

内容片段相关功能目前仅对超级管理员开放。

## 预览

Expand Down
17 changes: 17 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,23 @@ tasks.named('classes') {
}

halo {
port = 8091
version = '2.26.0'
}

haloPlugin {
openApi {
groupingRules {
contentSnippetApis {
displayName = 'Content Snippet API for content-tools'
pathsToMatch = ['/apis/content-tools.halo.run/v1alpha1/**']
}
}
groupedApiMappings = [
'/v3/api-docs/contentSnippetApis': 'contentSnippetApis.json'
]
generator {
outputDir = file("${projectDir}/ui/src/api/generated")
}
}
}
18 changes: 17 additions & 1 deletion src/main/java/cc/ryanc/contenttools/ContentToolsPlugin.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package cc.ryanc.contenttools;

import cc.ryanc.contenttools.extension.ContentSnippet;
import org.springframework.stereotype.Component;
import run.halo.app.extension.Scheme;
import run.halo.app.extension.SchemeManager;
import run.halo.app.plugin.BasePlugin;
import run.halo.app.plugin.PluginContext;

Expand All @@ -10,7 +13,20 @@
@Component
public class ContentToolsPlugin extends BasePlugin {

public ContentToolsPlugin(PluginContext pluginContext) {
private final SchemeManager schemeManager;

public ContentToolsPlugin(PluginContext pluginContext, SchemeManager schemeManager) {
super(pluginContext);
this.schemeManager = schemeManager;
}

@Override
public void start() {
schemeManager.register(ContentSnippet.class);
}

@Override
public void stop() {
schemeManager.unregister(Scheme.buildFromType(ContentSnippet.class));
}
}
39 changes: 39 additions & 0 deletions src/main/java/cc/ryanc/contenttools/extension/ContentSnippet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package cc.ryanc.contenttools.extension;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK;

/**
* A reusable piece of rich text content.
*
* @author ryanwang
*/
@Data
@EqualsAndHashCode(callSuper = true)
@GVK(group = "content-tools.halo.run",
version = "v1alpha1",
kind = "ContentSnippet",
plural = "contentsnippets",
singular = "contentsnippet")
public class ContentSnippet extends AbstractExtension {

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private Spec spec;

@Data
@Schema(name = "ContentSnippetSpec")
public static class Spec {

@Schema(requiredMode = Schema.RequiredMode.REQUIRED, maxLength = 100)
private String displayName;

@Schema(maxLength = 500)
private String description;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String content;
}
}
5 changes: 4 additions & 1 deletion ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"dependencies": {
"@halo-dev/api-client": "^2.26.0",
"@halo-dev/components": "^2.26.0",
"@halo-dev/richtext-editor": "2.26.0",
"@halo-dev/ui-shared": "^2.26.0",
"@joplin/turndown-plugin-gfm": "^1.0.64",
"@tanstack/vue-query": "4",
Expand All @@ -35,9 +36,11 @@
"mammoth": "^1.12.0",
"markdown-it": "^14.1.1",
"markdown-it-anchor": "^9.2.0",
"pinyin-pro": "^3.29.5",
"turndown": "^7.2.4",
"vue": "^3.5.41",
"vue-reactive-queue": "^0.0.1"
"vue-reactive-queue": "^0.0.1",
"vue-router": "~5.1.0"
},
"devDependencies": {
"@halo-dev/ui-plugin-bundler-kit": "^2.26.0",
Expand Down
Loading
Loading