mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-03-07 20:40:48 +08:00
feat: add tieba emoji support
This commit is contained in:
@@ -2,6 +2,7 @@ import MarkdownIt from 'markdown-it'
|
||||
import hljs from 'highlight.js'
|
||||
import 'highlight.js/styles/github.css'
|
||||
import { toast } from '../main'
|
||||
import { tiebaEmoji, TIEBA_EMOJI_CDN } from './tiebaEmoji'
|
||||
|
||||
function mentionPlugin(md) {
|
||||
const mentionReg = /^@\[([^\]]+)\]/
|
||||
@@ -27,6 +28,28 @@ function mentionPlugin(md) {
|
||||
md.inline.ruler.before('emphasis', 'mention', mention)
|
||||
}
|
||||
|
||||
function tiebaEmojiPlugin(md) {
|
||||
md.renderer.rules['tieba-emoji'] = (tokens, idx) => {
|
||||
const name = tokens[idx].content
|
||||
const file = tiebaEmoji[name]
|
||||
return `<img class="emoji" src="${TIEBA_EMOJI_CDN}${file}" alt="${name}">`
|
||||
}
|
||||
md.inline.ruler.before('emphasis', 'tieba-emoji', (state, silent) => {
|
||||
const pos = state.pos
|
||||
if (state.src.charCodeAt(pos) !== 0x3a) return false
|
||||
const match = state.src.slice(pos).match(/^:tieba(\d+):/)
|
||||
if (!match) return false
|
||||
const key = `tieba${match[1]}`
|
||||
if (!tiebaEmoji[key]) return false
|
||||
if (!silent) {
|
||||
const token = state.push('tieba-emoji', '', 0)
|
||||
token.content = key
|
||||
}
|
||||
state.pos += match[0].length
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
const md = new MarkdownIt({
|
||||
html: false,
|
||||
linkify: true,
|
||||
@@ -43,6 +66,7 @@ const md = new MarkdownIt({
|
||||
})
|
||||
|
||||
md.use(mentionPlugin)
|
||||
md.use(tiebaEmojiPlugin)
|
||||
|
||||
export function renderMarkdown(text) {
|
||||
return md.render(text || '')
|
||||
|
||||
10
frontend/src/utils/tiebaEmoji.js
Normal file
10
frontend/src/utils/tiebaEmoji.js
Normal file
@@ -0,0 +1,10 @@
|
||||
export const TIEBA_EMOJI_CDN = 'https://cdn.jsdelivr.net/gh/microlong666/tieba_mobile_emotions@master/'
|
||||
|
||||
export const tiebaEmoji = (() => {
|
||||
const map = { tieba1: 'image_emoticon.png' }
|
||||
for (let i = 2; i <= 124; i++) {
|
||||
if (i > 50 && i < 62) continue
|
||||
map[`tieba${i}`] = `image_emoticon${i}.png`
|
||||
}
|
||||
return map
|
||||
})()
|
||||
@@ -3,6 +3,7 @@ import 'vditor/dist/index.css'
|
||||
import { API_BASE_URL } from '../main'
|
||||
import { getToken, authState } from './auth'
|
||||
import { searchUsers, fetchFollowings, fetchAdmins } from './user'
|
||||
import { tiebaEmoji, TIEBA_EMOJI_CDN } from './tiebaEmoji'
|
||||
|
||||
export function getEditorTheme() {
|
||||
return document.documentElement.dataset.theme === 'dark' ? 'dark' : 'classic'
|
||||
@@ -42,8 +43,14 @@ export function createVditor(editorId, options = {}) {
|
||||
placeholder,
|
||||
height: 'auto',
|
||||
theme: getEditorTheme(),
|
||||
preview: Object.assign({ theme: { current: getPreviewTheme() } }, preview),
|
||||
preview: Object.assign({
|
||||
theme: { current: getPreviewTheme() },
|
||||
customEmoji: tiebaEmoji,
|
||||
emojiPath: TIEBA_EMOJI_CDN
|
||||
}, preview),
|
||||
hint: {
|
||||
emoji: tiebaEmoji,
|
||||
emojiPath: TIEBA_EMOJI_CDN,
|
||||
extend: [
|
||||
{
|
||||
key: '@',
|
||||
|
||||
Reference in New Issue
Block a user