| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- // 插件代码内容
- 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 }
- }
- }
- })
|