2021-10-08 21:02:09 +08:00
|
|
|
|
import { Extension, textInputRule } from '@tiptap/core'
|
|
|
|
|
|
2022-02-04 17:14:00 +08:00
|
|
|
|
export interface TypographyOptions {
|
|
|
|
|
emDash: false,
|
|
|
|
|
ellipsis: false,
|
|
|
|
|
openDoubleQuote: false,
|
|
|
|
|
closeDoubleQuote: false,
|
|
|
|
|
openSingleQuote: false,
|
|
|
|
|
closeSingleQuote: false,
|
|
|
|
|
leftArrow: false,
|
|
|
|
|
rightArrow: false,
|
|
|
|
|
copyright: false,
|
|
|
|
|
trademark: false,
|
|
|
|
|
registeredTrademark: false,
|
|
|
|
|
oneHalf: false,
|
|
|
|
|
plusMinus: false,
|
|
|
|
|
notEqual: false,
|
|
|
|
|
laquo: false,
|
|
|
|
|
raquo: false,
|
|
|
|
|
multiplication: false,
|
|
|
|
|
superscriptTwo: false,
|
|
|
|
|
superscriptThree: false,
|
|
|
|
|
oneQuarter: false,
|
|
|
|
|
threeQuarters: false,
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-08 21:02:09 +08:00
|
|
|
|
export const emDash = textInputRule({
|
|
|
|
|
find: /--$/,
|
|
|
|
|
replace: '—',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const ellipsis = textInputRule({
|
|
|
|
|
find: /\.\.\.$/,
|
|
|
|
|
replace: '…',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const openDoubleQuote = textInputRule({
|
|
|
|
|
find: /(?:^|[\s{[(<'"\u2018\u201C])(")$/,
|
|
|
|
|
replace: '“',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const closeDoubleQuote = textInputRule({
|
|
|
|
|
find: /"$/,
|
|
|
|
|
replace: '”',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const openSingleQuote = textInputRule({
|
|
|
|
|
find: /(?:^|[\s{[(<'"\u2018\u201C])(')$/,
|
|
|
|
|
replace: '‘',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const closeSingleQuote = textInputRule({
|
|
|
|
|
find: /'$/,
|
|
|
|
|
replace: '’',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const leftArrow = textInputRule({
|
|
|
|
|
find: /<-$/,
|
|
|
|
|
replace: '←',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const rightArrow = textInputRule({
|
|
|
|
|
find: /->$/,
|
|
|
|
|
replace: '→',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const copyright = textInputRule({
|
|
|
|
|
find: /\(c\)$/,
|
|
|
|
|
replace: '©',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const trademark = textInputRule({
|
|
|
|
|
find: /\(tm\)$/,
|
|
|
|
|
replace: '™',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const registeredTrademark = textInputRule({
|
|
|
|
|
find: /\(r\)$/,
|
|
|
|
|
replace: '®',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const oneHalf = textInputRule({
|
|
|
|
|
find: /1\/2$/,
|
|
|
|
|
replace: '½',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const plusMinus = textInputRule({
|
|
|
|
|
find: /\+\/-$/,
|
|
|
|
|
replace: '±',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const notEqual = textInputRule({
|
|
|
|
|
find: /!=$/,
|
|
|
|
|
replace: '≠',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const laquo = textInputRule({
|
|
|
|
|
find: /<<$/,
|
|
|
|
|
replace: '«',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const raquo = textInputRule({
|
|
|
|
|
find: />>$/,
|
|
|
|
|
replace: '»',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const multiplication = textInputRule({
|
|
|
|
|
find: /\d+\s?([*x])\s?\d+$/,
|
|
|
|
|
replace: '×',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const superscriptTwo = textInputRule({
|
|
|
|
|
find: /\^2$/,
|
|
|
|
|
replace: '²',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const superscriptThree = textInputRule({
|
|
|
|
|
find: /\^3$/,
|
|
|
|
|
replace: '³',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const oneQuarter = textInputRule({
|
|
|
|
|
find: /1\/4$/,
|
|
|
|
|
replace: '¼',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const threeQuarters = textInputRule({
|
|
|
|
|
find: /3\/4$/,
|
|
|
|
|
replace: '¾',
|
|
|
|
|
})
|
2020-11-06 05:50:07 +08:00
|
|
|
|
|
2022-02-04 17:14:00 +08:00
|
|
|
|
export const Typography = Extension.create<TypographyOptions>({
|
2020-12-02 16:44:46 +08:00
|
|
|
|
name: 'typography',
|
|
|
|
|
|
2020-11-01 07:28:46 +08:00
|
|
|
|
addInputRules() {
|
2022-02-04 17:14:00 +08:00
|
|
|
|
const rules = []
|
|
|
|
|
|
|
|
|
|
if (this.options.emDash !== false) {
|
|
|
|
|
rules.push(emDash)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.ellipsis !== false) {
|
|
|
|
|
rules.push(ellipsis)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.openDoubleQuote !== false) {
|
|
|
|
|
rules.push(openDoubleQuote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.closeDoubleQuote !== false) {
|
|
|
|
|
rules.push(closeDoubleQuote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.openSingleQuote !== false) {
|
|
|
|
|
rules.push(openSingleQuote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.closeSingleQuote !== false) {
|
|
|
|
|
rules.push(closeSingleQuote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.leftArrow !== false) {
|
|
|
|
|
rules.push(leftArrow)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.rightArrow !== false) {
|
|
|
|
|
rules.push(rightArrow)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.copyright !== false) {
|
|
|
|
|
rules.push(copyright)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.trademark !== false) {
|
|
|
|
|
rules.push(trademark)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.registeredTrademark !== false) {
|
|
|
|
|
rules.push(registeredTrademark)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.oneHalf !== false) {
|
|
|
|
|
rules.push(oneHalf)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.plusMinus !== false) {
|
|
|
|
|
rules.push(plusMinus)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.notEqual !== false) {
|
|
|
|
|
rules.push(notEqual)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.laquo !== false) {
|
|
|
|
|
rules.push(laquo)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.raquo !== false) {
|
|
|
|
|
rules.push(raquo)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.multiplication !== false) {
|
|
|
|
|
rules.push(multiplication)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.superscriptTwo !== false) {
|
|
|
|
|
rules.push(superscriptTwo)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.superscriptThree !== false) {
|
|
|
|
|
rules.push(superscriptThree)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.oneQuarter !== false) {
|
|
|
|
|
rules.push(oneQuarter)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.threeQuarters !== false) {
|
|
|
|
|
rules.push(threeQuarters)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rules
|
2020-11-01 07:28:46 +08:00
|
|
|
|
},
|
|
|
|
|
})
|