|
@@ -0,0 +1,101 @@
|
|
|
|
|
+// 插件代码内容
|
|
|
|
|
+tinymce.PluginManager.add('wordlimit', function (editor) {
|
|
|
|
|
+ var pluginName = '字数限制'
|
|
|
|
|
+ var app = tinymce.util.Tools.resolve('tinymce.util.Delay')
|
|
|
|
|
+ var Tools = tinymce.util.Tools.resolve('tinymce.util.Tools')
|
|
|
|
|
+ var wordlimit_event = editor.getParam('ax_wordlimit_event', 'SetContent Undo Redo Keyup input paste')
|
|
|
|
|
+ var options = editor.getParam('wordlimit', {}, 'object')
|
|
|
|
|
+ var close = null
|
|
|
|
|
+ var toast = function (message) {
|
|
|
|
|
+ close && close.close()
|
|
|
|
|
+ close = editor.notificationManager.open({
|
|
|
|
|
+ text: message,
|
|
|
|
|
+ type: 'error',
|
|
|
|
|
+ timeout: 3000
|
|
|
|
|
+ })
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ // 默认配置
|
|
|
|
|
+ var defaults = {
|
|
|
|
|
+ // max: 0, // 最多可以输入多少字
|
|
|
|
|
+ spaces: false, // 是否含空格
|
|
|
|
|
+ isInput: false, // 是否在超出后还可以输入
|
|
|
|
|
+ maxMessage: '超出最大输入字符数量!',
|
|
|
|
|
+ changeCallback: () => {}, // 自定义的回调方法
|
|
|
|
|
+ changeMaxCallback: () => {},
|
|
|
|
|
+ toast // 提示弹窗
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ class WordLimit {
|
|
|
|
|
+ constructor(editor, options) {
|
|
|
|
|
+ options = Tools.extend(defaults, options)
|
|
|
|
|
+ let preCount = 0
|
|
|
|
|
+ let _wordCount = 0
|
|
|
|
|
+ let oldContent = editor.getContent()
|
|
|
|
|
+ let WordCount = editor.plugins.wordcount
|
|
|
|
|
+ let sumLetter = function (html) {
|
|
|
|
|
+ var re1 = new RegExp('<.+?>', 'g')
|
|
|
|
|
+ var txt = html.replace(re1, '')
|
|
|
|
|
+ txt = txt.replace(/\n/g, '')
|
|
|
|
|
+ txt = txt.replace(/ /g, ' ')
|
|
|
|
|
+ return { txt: txt, html }
|
|
|
|
|
+ }
|
|
|
|
|
+ editor.on(wordlimit_event, function (e) {
|
|
|
|
|
+ var content = editor.getContent() || e.content || ''
|
|
|
|
|
+ if (!options.spaces) {
|
|
|
|
|
+ // 字数
|
|
|
|
|
+ _wordCount = WordCount.body.getCharacterCount()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 不含空格字数
|
|
|
|
|
+ _wordCount = WordCount.body.getCharacterCountWithoutSpaces()
|
|
|
|
|
+ }
|
|
|
|
|
+ options.changeCallback({ ...options, editor, num: _wordCount, content, ...sumLetter(content) })
|
|
|
|
|
+ if (_wordCount > options.max) {
|
|
|
|
|
+ preCount = _wordCount
|
|
|
|
|
+ // 禁止再输入
|
|
|
|
|
+ if (options.isInput == !1) {
|
|
|
|
|
+ // 内容超出还原
|
|
|
|
|
+ editor.setContent(oldContent)
|
|
|
|
|
+ // 还原后重新统计
|
|
|
|
|
+ if (!options.spaces) {
|
|
|
|
|
+ _wordCount = WordCount.body.getCharacterCount()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ _wordCount = WordCount.body.getCharacterCountWithoutSpaces()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ editor.getBody().blur()
|
|
|
|
|
+ editor.fire('wordlimit', {
|
|
|
|
|
+ maxCount: options.max,
|
|
|
|
|
+ wordCount: _wordCount,
|
|
|
|
|
+ preCount: preCount,
|
|
|
|
|
+ isPaste: e.type === 'paste' || e.paste || false
|
|
|
|
|
+ })
|
|
|
|
|
+ toast(options.maxMessage)
|
|
|
|
|
+ }
|
|
|
|
|
+ oldContent = editor.getContent()
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ var setup = function () {
|
|
|
|
|
+ // 如果没设置最大输入限制,则不进行下一步操作
|
|
|
|
|
+ if (!options && !options.max) return false
|
|
|
|
|
+ // 如果没有配置字数统计,则不进行下一步,并且提示配置字数统计
|
|
|
|
|
+ if (!editor.plugins.wordcount) return toast('请先在tinymce的plugins配置wordlimit之前加入wordcount插件')
|
|
|
|
|
+ app.setEditorTimeout(
|
|
|
|
|
+ editor,
|
|
|
|
|
+ function () {
|
|
|
|
|
+ let editDom = editor.getContainer()
|
|
|
|
|
+ let wordNum = editDom.querySelector('button.tox-statusbar__wordcount')
|
|
|
|
|
+ if (wordNum?.innerText?.indexOf('字符') == -1) wordNum.click()
|
|
|
|
|
+ new WordLimit(editor, options)
|
|
|
|
|
+ },
|
|
|
|
|
+ 300
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ setup()
|
|
|
|
|
+ return {
|
|
|
|
|
+ getMetadata: function () {
|
|
|
|
|
+ return { name: pluginName }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+})
|