From d6ad0516585d18ffa671e99e7edf0ff233f507ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B0=8F=E7=99=BD=E5=93=A6?= Date: Thu, 30 Jul 2026 02:59:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=E3=80=8Cjs/src/forum=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/src/forum/codeLang.js | 35 +++++++++++++ js/src/forum/getTheme.js | 40 ++++++++++++++ js/src/forum/index.js | 110 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 js/src/forum/codeLang.js create mode 100644 js/src/forum/getTheme.js create mode 100644 js/src/forum/index.js diff --git a/js/src/forum/codeLang.js b/js/src/forum/codeLang.js new file mode 100644 index 0000000..2c1a896 --- /dev/null +++ b/js/src/forum/codeLang.js @@ -0,0 +1,35 @@ +export function codeLang() { + var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; + var elements = document.querySelectorAll('pre code'); + var observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.type == "attributes") { + show_language(); + } + }); + }); + + elements.forEach(function(element){ + observer.observe(element, { + attributes: true, + attributeFilter: ['class'] + }); + }) + + var pres = document.getElementsByTagName('pre'); + var code_language; + function show_language(){ + for(var i=0; i'; + btnChildT = ''+app.translator.trans('ffans-clipboardjs.forum.ok_btn')+''; + btnChildF = ''+app.translator.trans('ffans-clipboardjs.forum.error_btn')+''; + break; + case 'csdn': + btnChild = ''+app.translator.trans('ffans-clipboardjs.forum.action_copy')+''; + btnChildT = ''+app.translator.trans('ffans-clipboardjs.forum.ok_btn')+''; + btnChildF = ''+app.translator.trans('ffans-clipboardjs.forum.error_btn')+''; + break; + case 'cnblog': + btnChild = ''; + btnChildT = ''; + btnChildF = ''; + break; + case 'jianshu': + btnChild = ''; + btnChildT = ''; + btnChildF = ''; + break; + case 'segmentfault': + btnChild = ''; + break; + default: + btnChild = ''; + break; + } + return [btnChild, btnChildT, btnChildF]; +} diff --git a/js/src/forum/index.js b/js/src/forum/index.js new file mode 100644 index 0000000..2ec2093 --- /dev/null +++ b/js/src/forum/index.js @@ -0,0 +1,110 @@ +import { extend } from 'flarum/common/extend'; + +import app from 'flarum/forum/app'; +import CommentPost from 'flarum/forum/components/CommentPost'; +import ClipboardJS from 'clipboard'; + +import { getTheme } from './getTheme'; +import { codeLang } from "./codeLang"; + +app.initializers.add('ffans/clipboardjs', () => { + + var clipboard = null; + var theme_name, btnChild, btnChildT, btnChildF; + + function getAtt(key) { + return app.forum.attribute(key); + } + function getTrans(key) { + return app.translator.trans('ffans-clipboardjs.forum.' + key); + } + + extend(CommentPost.prototype, 'oncreate', function () { + theme_name = (getAtt('themeName') == '') ? 'default' : getAtt('themeName'); + + if (getAtt('isCopyEnable') == 1) { + btnChild = getTheme(theme_name)[0]; + btnChildT = getTheme(theme_name)[1]; + btnChildF = getTheme(theme_name)[2]; + + var pres = this.element.querySelectorAll('pre'); + console.log('获取 pre' + pres); + [].forEach.call(pres, function (pre) { + if (pre.className.indexOf("copy-ready") == -1) + pre.insertAdjacentHTML('afterBegin', + '' + ); + pre.classList.add("copy-ready"); + if (theme_name == 'lingcoder' || theme_name == 'csdn') { + pre.classList.add("sticky"); + } + }); + } + if (getAtt('isShowCodeLang') == 1) { + codeLang(); + } + }); + + if (clipboard) { + clipboard.destroy(); + } + + clipboard = new ClipboardJS('[data-clipboard-snippet]', { + target: function (trigger) { + return trigger.nextElementSibling; + } + }); + + clipboard.on('success', function (e) { + console.info('Action:', e.action); + + e.trigger.classList.add("succeed"); + + if (isNaN(btnChildT)) + e.trigger.innerHTML = btnChildT; + + setTimeout(function () { + e.trigger.classList.remove("succeed"); + e.trigger.innerHTML = btnChild; + }, 1000) + + e.clearSelection(); + }); + + clipboard.on('error', function (e) { + console.error('Action:', e.action); + + e.trigger.classList.add("failed"); + if (isNaN(btnChildT)) + e.trigger.innerHTML = btnChildF; + + setTimeout(function () { + e.trigger.classList.remove("failed"); + e.trigger.innerHTML = btnChild; + }, 1000) + + fallbackMessage(e.action); + }); + + function fallbackMessage(action) { + var actionMsg = ''; + var actionKey = (action === 'cut' ? 'X' : 'C'); + action = (action === 'copy') ? getTrans('action_copy') : getTrans('action_cut'); + if (/iPhone|iPad/i.test(navigator.userAgent)) { + actionMsg = getTrans('no_support') + ' :('; + } else if (/Mac/i.test(navigator.userAgent)) { + actionMsg = app.translator.trans('ffans-clipboardjs.forum.msg', { + actionKey: '⌘-' + actionKey, + action: action, + }); + } else { + actionMsg = app.translator.trans('ffans-clipboardjs.forum.msg', { + actionKey: 'Ctrl-' + actionKey, + action: action, + }); + } + actionMsg = actionMsg.join(""); + console.log(actionMsg); + alert(actionMsg); + } +});