chore: add plugin demo
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
// 复制内容时带入版权信息,代码仅为参考
|
||||
import Editor from '../../editor'
|
||||
|
||||
export interface ICopyWithCopyrightOption {
|
||||
copyrightText: string;
|
||||
}
|
||||
|
||||
export function copyWithCopyrightPlugin(editor: Editor, options?: ICopyWithCopyrightOption) {
|
||||
const copy = editor.command.executeCopy
|
||||
|
||||
editor.command.executeCopy = () => {
|
||||
const { copyrightText } = options || {}
|
||||
if (copyrightText) {
|
||||
const rangeText = editor.command.getRangeText()
|
||||
if (!rangeText) return
|
||||
const text = `${rangeText}${copyrightText}`
|
||||
const plainText = new Blob([text], { type: 'text/plain' })
|
||||
// @ts-ignore
|
||||
const item = new ClipboardItem({
|
||||
[plainText.type]: plainText
|
||||
})
|
||||
window.navigator.clipboard.write([item])
|
||||
} else {
|
||||
copy()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
// 简化版markdown转IElement插件示例,代码仅为参考
|
||||
import Editor, { Command, ElementType, IElement, ListType, TitleLevel } from '../../editor'
|
||||
|
||||
export type CommandWithMarkdown = Command & {
|
||||
executeInsertMarkdown(markdown: string): void;
|
||||
}
|
||||
|
||||
export const titleNodeNameMapping: Record<string, TitleLevel> = {
|
||||
'1': TitleLevel.FIRST,
|
||||
'2': TitleLevel.SECOND,
|
||||
'3': TitleLevel.THIRD,
|
||||
'4': TitleLevel.FOURTH,
|
||||
'5': TitleLevel.FIFTH,
|
||||
'6': TitleLevel.SIXTH
|
||||
}
|
||||
|
||||
function convertMarkdownToElement(markdown: string): IElement[] {
|
||||
const elementList: IElement[] = []
|
||||
const lines = markdown.trim().split('\n')
|
||||
for (let l = 0; l < lines.length; l++) {
|
||||
const line = lines[l]
|
||||
if (line.startsWith('#')) {
|
||||
const level = line.indexOf(' ')
|
||||
elementList.push({
|
||||
type: ElementType.TITLE,
|
||||
level: titleNodeNameMapping[level],
|
||||
value: '',
|
||||
valueList: [{
|
||||
value: line.slice(level + 1)
|
||||
}]
|
||||
})
|
||||
} else if (line.startsWith('- ')) {
|
||||
elementList.push({
|
||||
type: ElementType.LIST,
|
||||
listType: ListType.UL,
|
||||
value: '',
|
||||
valueList: [{
|
||||
value: line.slice(2)
|
||||
}]
|
||||
})
|
||||
} else if (/^\d+\.\s/.test(line)) {
|
||||
elementList.push({
|
||||
type: ElementType.LIST,
|
||||
listType: ListType.OL,
|
||||
value: '',
|
||||
valueList: [{
|
||||
value: line.replace(/^\d+\.\s/, '')
|
||||
}]
|
||||
})
|
||||
} else if (/^\[.*?\]\(.*?\)$/.test(line)) {
|
||||
const match = line.match(/^\[(.*?)\]\((.*?)\)$/)
|
||||
elementList.push({
|
||||
type: ElementType.HYPERLINK,
|
||||
value: '',
|
||||
valueList: [{
|
||||
value: match![1]
|
||||
}],
|
||||
url: match![2]
|
||||
})
|
||||
} else if (/^\*\*(.*?)\*\*$/.test(line)) {
|
||||
const match = line.match(/^\*\*(.*?)\*\*$/)
|
||||
elementList.push({
|
||||
type: ElementType.TEXT,
|
||||
value: match![1],
|
||||
bold: true
|
||||
})
|
||||
} else if (/^\*(.*?)\*$/.test(line)) {
|
||||
const match = line.match(/^\*(.*?)\*$/)
|
||||
elementList.push({
|
||||
type: ElementType.TEXT,
|
||||
value: match![1],
|
||||
italic: true
|
||||
})
|
||||
} else if (/^__(.*?)__$/.test(line)) {
|
||||
const match = line.match(/^__(.*?)__$/)
|
||||
elementList.push({
|
||||
type: ElementType.TEXT,
|
||||
value: match![1],
|
||||
underline: true
|
||||
})
|
||||
} else if (/^~~(.*?)~~$/.test(line)) {
|
||||
const match = line.match(/^~~(.*?)~~$/)
|
||||
elementList.push({
|
||||
type: ElementType.TEXT,
|
||||
value: match![1],
|
||||
strikeout: true
|
||||
})
|
||||
} else {
|
||||
elementList.push({
|
||||
type: ElementType.TEXT,
|
||||
value: line
|
||||
})
|
||||
}
|
||||
}
|
||||
return elementList
|
||||
}
|
||||
|
||||
export function markdownPlugin(editor: Editor) {
|
||||
const command = <CommandWithMarkdown>editor.command
|
||||
command.executeInsertMarkdown = (markdown: string) => {
|
||||
const elementList = convertMarkdownToElement(markdown)
|
||||
command.executeInsertElementList(elementList)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user