|
|
@@ -163,7 +163,7 @@ export default {
|
|
|
min_height: this.height,
|
|
|
width: '100%',
|
|
|
autoresize_bottom_margin: 0,
|
|
|
- plugins: 'link lists image hr media autoresize ax_wordlimit paste lineheight',
|
|
|
+ plugins: 'link lists image hr media autoresize ax_wordlimit paste', // 移除 lineheight
|
|
|
toolbar: this.toolbar, // 工具栏
|
|
|
lineheight_formats: '0.5 1.0 1.2 1.5 2.0 2.5 3.0', // 行高选项(倍数)
|
|
|
contextmenu: false, // 右键菜单
|
|
|
@@ -179,6 +179,35 @@ export default {
|
|
|
editor.getBody().style.fontFamily = this.init.font_family; // 设置默认字体
|
|
|
});
|
|
|
|
|
|
+ // 自定义行高下拉(因为没有内置 lineheight 插件)
|
|
|
+ editor.ui.registry.addMenuButton('lineheight', {
|
|
|
+ text: '行高',
|
|
|
+ tooltip: '行高',
|
|
|
+ fetch: (callback) => {
|
|
|
+ const formats = (this.init.lineheight_formats || '').split(/\s+/).filter(Boolean);
|
|
|
+ const items = formats.map((v) => {
|
|
|
+ return {
|
|
|
+ type: 'menuitem',
|
|
|
+ text: v,
|
|
|
+ onAction: () => {
|
|
|
+ try {
|
|
|
+ const name = `lineheight_${v.replace(/\./g, '_')}`;
|
|
|
+ // 动态注册格式(会覆盖同名注册,安全)
|
|
|
+ editor.formatter.register(name, {
|
|
|
+ inline: 'span',
|
|
|
+ styles: { lineHeight: v },
|
|
|
+ });
|
|
|
+ editor.formatter.apply(name);
|
|
|
+ } catch (err) {
|
|
|
+ // 容错处理
|
|
|
+ }
|
|
|
+ },
|
|
|
+ };
|
|
|
+ });
|
|
|
+ callback(items);
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
editor.on('click', () => {
|
|
|
if (editor?.queryCommandState('ToggleToolbarDrawer')) {
|
|
|
editor.execCommand('ToggleToolbarDrawer');
|
|
|
@@ -276,19 +305,44 @@ export default {
|
|
|
},
|
|
|
fontSize: {
|
|
|
handler(newVal) {
|
|
|
- let editor = tinymce.get(this.id);
|
|
|
- if (editor) {
|
|
|
- editor.getBody().style.fontSize = newVal;
|
|
|
- editor.execCommand('FontSize', false, newVal);
|
|
|
+ const editor = tinymce.get(this.id);
|
|
|
+ if (!editor || typeof editor.execCommand !== 'function') return;
|
|
|
+
|
|
|
+ const applyFontSize = () => {
|
|
|
+ try {
|
|
|
+ editor.execCommand('FontSize', false, newVal);
|
|
|
+ } catch (e) {
|
|
|
+ // 容错:某些情况下 execCommand 会抛错,忽略即可
|
|
|
+ // console.warn('apply fontSize failed', e);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 如果 selection 暂不可用,延迟一次执行以避免其他监听器中访问 selection 报错
|
|
|
+ if (!editor.selection || typeof editor.selection.getRng !== 'function') {
|
|
|
+ setTimeout(applyFontSize, 100);
|
|
|
+ } else {
|
|
|
+ applyFontSize();
|
|
|
}
|
|
|
},
|
|
|
},
|
|
|
fontFamily: {
|
|
|
handler(newVal) {
|
|
|
- let editor = tinymce.get(this.id);
|
|
|
- if (editor) {
|
|
|
- editor.getBody().style.fontFamily = newVal;
|
|
|
- editor.execCommand('FontName', false, newVal);
|
|
|
+ const editor = tinymce.get(this.id);
|
|
|
+ if (!editor || typeof editor.execCommand !== 'function') return;
|
|
|
+
|
|
|
+ const applyFontFamily = () => {
|
|
|
+ try {
|
|
|
+ editor.execCommand('FontName', false, newVal);
|
|
|
+ } catch (e) {
|
|
|
+ // 容错:忽略因 selection 不可用或其它原因导致的错误
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 如果 selection 暂不可用,延迟执行
|
|
|
+ if (!editor.selection || typeof editor.selection.getRng !== 'function') {
|
|
|
+ setTimeout(applyFontFamily, 100);
|
|
|
+ } else {
|
|
|
+ applyFontFamily();
|
|
|
}
|
|
|
},
|
|
|
},
|
|
|
@@ -632,9 +686,7 @@ export default {
|
|
|
if (/<[^>]+>/g.test(item)) return item;
|
|
|
|
|
|
return item
|
|
|
- .map((li) =>
|
|
|
- li.map(({ number, con }) => (number && con ? addTone(Number(number), con) : number || con || '')),
|
|
|
- )
|
|
|
+ .map(({ number, con }) => (number && con ? addTone(Number(number), con) : number || con || ''))
|
|
|
.flat();
|
|
|
})
|
|
|
// 如果是数组,将数组字符串每两个之间加一个空格
|