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 `
`
+ }
+ 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,