diff --git a/frontend/src/assets/global.css b/frontend/src/assets/global.css index 77be29063..48188a8e0 100644 --- a/frontend/src/assets/global.css +++ b/frontend/src/assets/global.css @@ -71,6 +71,16 @@ body { top: var(--header-height) !important; } +.vditor-panel { + min-width: 400px; +} + +.emoji { + width: 20px; + height: 20px; + vertical-align: middle; +} + /* .vditor { --textarea-background-color: transparent; border: none !important; @@ -225,7 +235,7 @@ body { } .vditor-toolbar { - display: none; + overflow-x: auto; } .about-content h1, @@ -245,6 +255,11 @@ body { margin-bottom: 3px; } + + .vditor-toolbar--pin { + top: 0 !important; + } + .about-content li, .info-content-text li { font-size: 14px; diff --git a/frontend/src/components/PostEditor.vue b/frontend/src/components/PostEditor.vue index 85b1ca9c5..63644222d 100644 --- a/frontend/src/components/PostEditor.vue +++ b/frontend/src/components/PostEditor.vue @@ -123,7 +123,6 @@ export default { diff --git a/frontend/src/utils/markdown.js b/frontend/src/utils/markdown.js index a3ed32ec7..dbcd352b7 100644 --- a/frontend/src/utils/markdown.js +++ b/frontend/src/utils/markdown.js @@ -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 } 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 `${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 || '') diff --git a/frontend/src/utils/tiebaEmoji.js b/frontend/src/utils/tiebaEmoji.js new file mode 100644 index 000000000..ce91ea0ff --- /dev/null +++ b/frontend/src/utils/tiebaEmoji.js @@ -0,0 +1,11 @@ +export const TIEBA_EMOJI_CDN = 'https://cdn.jsdelivr.net/gh/microlong666/tieba_mobile_emotions@master/' +// export const TIEBA_EMOJI_CDN = 'https://openisle-1307107697.cos.ap-guangzhou.myqcloud.com/assert/vditor/dist/images/emoji/' + +export const tiebaEmoji = (() => { + const map = { tieba1: TIEBA_EMOJI_CDN + 'image_emoticon.png' } + for (let i = 2; i <= 124; i++) { + if (i > 50 && i < 62) continue + map[`tieba${i}`] = TIEBA_EMOJI_CDN + `image_emoticon${i}.png` + } + return map +})() diff --git a/frontend/src/utils/vditor.js b/frontend/src/utils/vditor.js index 2e9a2628c..93564b7d0 100644 --- a/frontend/src/utils/vditor.js +++ b/frontend/src/utils/vditor.js @@ -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 } from './tiebaEmoji' export function getEditorTheme() { return document.documentElement.dataset.theme === 'dark' ? 'dark' : 'classic' @@ -37,13 +38,38 @@ export function createVditor(editorId, options = {}) { return searchUsers(value) } + const isMobile = window.innerWidth <= 768 + const toolbar = isMobile + ? ['emoji', 'upload'] + : [ + 'emoji', + 'bold', + 'italic', + 'strike', + '|', + 'list', + 'line', + 'quote', + 'code', + 'inline-code', + '|', + 'undo', + 'redo', + '|', + 'link', + 'upload' + ] + let vditor vditor = new Vditor(editorId, { placeholder, height: 'auto', theme: getEditorTheme(), - preview: Object.assign({ theme: { current: getPreviewTheme() } }, preview), + preview: Object.assign({ + theme: { current: getPreviewTheme() }, + }, preview), hint: { + emoji: tiebaEmoji, extend: [ { key: '@', @@ -58,24 +84,7 @@ export function createVditor(editorId, options = {}) { ], }, cdn: 'https://openisle-1307107697.cos.ap-guangzhou.myqcloud.com/assert/vditor', - toolbar: [ - 'emoji', - 'bold', - 'italic', - 'strike', - '|', - 'list', - 'line', - 'quote', - 'code', - 'inline-code', - '|', - 'undo', - 'redo', - '|', - 'link', - 'upload' - ], + toolbar, upload: { accept: 'image/*,video/*', multiple: false,