更新
This commit is contained in:
		
							parent
							
								
									37c5a38930
								
							
						
					
					
						commit
						88030a0b16
					
				@ -50,7 +50,7 @@ class Editor
 | 
			
		||||
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.css">
 | 
			
		||||
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/themes/prism-tomorrow.min.css">
 | 
			
		||||
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css">
 | 
			
		||||
        <link rel="stylesheet" href="<?php Helper::options()->themeUrl('typecho/write/css/joe.write.min.css?v=2021042208') ?>">
 | 
			
		||||
        <link rel="stylesheet" href="<?php Helper::options()->themeUrl('typecho/write/css/joe.write.min.css?v=2021042210') ?>">
 | 
			
		||||
        <script>
 | 
			
		||||
            window.JoeConfig = {
 | 
			
		||||
                uploadAPI: '<?php Helper::security()->index('/action/upload'); ?>',
 | 
			
		||||
@ -59,14 +59,15 @@ class Editor
 | 
			
		||||
                characterAPI: '<?php Helper::options()->themeUrl('typecho/write/json/character.json') ?>',
 | 
			
		||||
                playerAPI: '<?php Helper::options()->JCustomPlayer ? Helper::options()->JCustomPlayer() : Helper::options()->themeUrl('library/player.php?url=') ?>',
 | 
			
		||||
                autoSave: <?php Helper::options()->autoSave(); ?>,
 | 
			
		||||
                themeURL: '<?php Helper::options()->themeUrl(); ?>'
 | 
			
		||||
                themeURL: '<?php Helper::options()->themeUrl(); ?>',
 | 
			
		||||
                canPreview: false
 | 
			
		||||
            }
 | 
			
		||||
        </script>
 | 
			
		||||
        <script src="https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.js"></script>
 | 
			
		||||
        <script src="https://cdn.jsdelivr.net/npm/typecho-joe-next@6.2.4/plugin/prism/prism.min.js"></script>
 | 
			
		||||
        <script src="<?php Helper::options()->themeUrl('typecho/write/js/joe.parse.min.js?v=2021042208') ?>"></script>
 | 
			
		||||
        <script src="<?php Helper::options()->themeUrl('typecho/write/js/joe.write.chunk.js?v=2021042208') ?>"></script>
 | 
			
		||||
        <script src="<?php Helper::options()->themeUrl('assets/js/joe.short.min.js?v=2021042208') ?>"></script>
 | 
			
		||||
        <script src="<?php Helper::options()->themeUrl('typecho/write/js/joe.parse.min.js?v=2021042210') ?>"></script>
 | 
			
		||||
        <script src="<?php Helper::options()->themeUrl('typecho/write/js/joe.write.chunk.js?v=2021042210') ?>"></script>
 | 
			
		||||
        <script src="<?php Helper::options()->themeUrl('assets/js/joe.short.min.js?v=2021042210') ?>"></script>
 | 
			
		||||
<?php
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
/* 获取主题当前版本号 */
 | 
			
		||||
function _getVersion()
 | 
			
		||||
{
 | 
			
		||||
	return "6.5.4";
 | 
			
		||||
	return "6.5.5";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* 判断是否是手机 */
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "typecho-joe-next",
 | 
			
		||||
	"version": "6.5.4",
 | 
			
		||||
	"version": "6.5.5",
 | 
			
		||||
	"description": "A Theme Of Typecho",
 | 
			
		||||
	"main": "index.php",
 | 
			
		||||
	"keywords": [
 | 
			
		||||
 | 
			
		||||
@ -1,38 +1,39 @@
 | 
			
		||||
const parser = new HyperDown();
 | 
			
		||||
const player = window.JoeConfig.playerAPI;
 | 
			
		||||
const div = document.createElement('div');
 | 
			
		||||
 | 
			
		||||
export default function createPreviewHtml(str) {
 | 
			
		||||
    str = str.replace(/ /g, ' ');
 | 
			
		||||
	if (!window.JoeConfig.canPreview) return $('.cm-preview-content').html('1. 预览已默认关闭<br>2. 点击上方预览按钮启用预览<br>3. 若编辑器卡顿可尝试关闭预览');
 | 
			
		||||
 | 
			
		||||
    str = parser.makeHtml(str);
 | 
			
		||||
	str = str.replace(/ /g, ' ');
 | 
			
		||||
 | 
			
		||||
    str = str.replace(/{x}/g, '<input type="checkbox" class="joe_detail__article-checkbox" checked disabled></input>');
 | 
			
		||||
    str = str.replace(/{ }/g, '<input type="checkbox" class="joe_detail__article-checkbox" disabled></input>');
 | 
			
		||||
    str = str.replace(/\:\:\(\s*(呵呵|哈哈|吐舌|太开心|笑眼|花心|小乖|乖|捂嘴笑|滑稽|你懂的|不高兴|怒|汗|黑线|泪|真棒|喷|惊哭|阴险|鄙视|酷|啊|狂汗|what|疑问|酸爽|呀咩爹|委屈|惊讶|睡觉|笑尿|挖鼻|吐|犀利|小红脸|懒得理|勉强|爱心|心碎|玫瑰|礼物|彩虹|太阳|星星月亮|钱币|茶杯|蛋糕|大拇指|胜利|haha|OK|沙发|手纸|香蕉|便便|药丸|红领巾|蜡烛|音乐|灯泡|开心|钱|咦|呼|冷|生气|弱|吐血|狗头)\s*\)/g, function ($0, $1) {
 | 
			
		||||
        $1 = encodeURI($1).replace(/%/g, '');
 | 
			
		||||
        return `<img class="owo" src="${window.JoeConfig.themeURL}assets/owo/paopao/${$1}_2x.png" />`;
 | 
			
		||||
    });
 | 
			
		||||
    str = str.replace(/\:\@\(\s*(高兴|小怒|脸红|内伤|装大款|赞一个|害羞|汗|吐血倒地|深思|不高兴|无语|亲亲|口水|尴尬|中指|想一想|哭泣|便便|献花|皱眉|傻笑|狂汗|吐|喷水|看不见|鼓掌|阴暗|长草|献黄瓜|邪恶|期待|得意|吐舌|喷血|无所谓|观察|暗地观察|肿包|中枪|大囧|呲牙|抠鼻|不说话|咽气|欢呼|锁眉|蜡烛|坐等|击掌|惊喜|喜极而泣|抽烟|不出所料|愤怒|无奈|黑线|投降|看热闹|扇耳光|小眼睛|中刀)\s*\)/g, function ($0, $1) {
 | 
			
		||||
        $1 = encodeURI($1).replace(/%/g, '');
 | 
			
		||||
        return `<img class="owo" src="${window.JoeConfig.themeURL}assets/owo/aru/${$1}_2x.png" />`;
 | 
			
		||||
    });
 | 
			
		||||
    str = str.replace(/{mtitle([^}]*)\/}/g, '<joe-mtitle $1></joe-mtitle>');
 | 
			
		||||
    str = str.replace(/{dplayer([^}]*)\/}/g, '<joe-dplayer player="' + player + '" $1></joe-dplayer>');
 | 
			
		||||
    str = str.replace(/{bilibili([^}]*)\/}/g, '<joe-bilibili $1></joe-bilibili>');
 | 
			
		||||
    str = str.replace(/{music-list([^}]*)\/}/g, '<joe-mlist $1></joe-mlist>');
 | 
			
		||||
    str = str.replace(/{music([^}]*)\/}/g, '<joe-music $1></joe-music>');
 | 
			
		||||
    str = str.replace(/{mp3([^}]*)\/}/g, '<joe-mp3 $1></joe-mp3>');
 | 
			
		||||
    str = str.replace(/{abtn([^}]*)\/}/g, '<joe-abtn $1></joe-abtn>');
 | 
			
		||||
    str = str.replace(/{anote([^}]*)\/}/g, '<joe-anote $1></joe-anote>');
 | 
			
		||||
    str = str.replace(/{dotted([^}]*)\/}/g, '<joe-dotted $1></joe-dotted>');
 | 
			
		||||
    str = str.replace(/{message([^}]*)\/}/g, '<joe-message $1></joe-message>');
 | 
			
		||||
    str = str.replace(/{progress([^}]*)\/}/g, '<joe-progress $1></joe-progress>');
 | 
			
		||||
    str = str.replace(/{hide[^}]*}([\s\S]*?){\/hide}/g, '<joe-hide></joe-hide>');
 | 
			
		||||
    str = str.replace(/{card-default([^}]*)}([\s\S]*?){\/card-default}/g, '<section style="margin-bottom: 15px"><joe-card-default $1><span class="_temp" style="display: none">$2</span></joe-card-default></section>');
 | 
			
		||||
    str = str.replace(/{callout([^}]*)}([\s\S]*?){\/callout}/g, '<section style="margin-bottom: 15px"><joe-callout $1><span class="_temp" style="display: none">$2</span></joe-callout></section>');
 | 
			
		||||
	str = parser.makeHtml(str);
 | 
			
		||||
 | 
			
		||||
    $('.cm-preview-content').html(str);
 | 
			
		||||
    $('.cm-preview-content p:empty').remove();
 | 
			
		||||
    $('.cm-preview-content pre code').each((i, el) => Prism.highlightElement(el));
 | 
			
		||||
	str = str.replace(/{x}/g, '<input type="checkbox" class="joe_detail__article-checkbox" checked disabled></input>');
 | 
			
		||||
	str = str.replace(/{ }/g, '<input type="checkbox" class="joe_detail__article-checkbox" disabled></input>');
 | 
			
		||||
	str = str.replace(/\:\:\(\s*(呵呵|哈哈|吐舌|太开心|笑眼|花心|小乖|乖|捂嘴笑|滑稽|你懂的|不高兴|怒|汗|黑线|泪|真棒|喷|惊哭|阴险|鄙视|酷|啊|狂汗|what|疑问|酸爽|呀咩爹|委屈|惊讶|睡觉|笑尿|挖鼻|吐|犀利|小红脸|懒得理|勉强|爱心|心碎|玫瑰|礼物|彩虹|太阳|星星月亮|钱币|茶杯|蛋糕|大拇指|胜利|haha|OK|沙发|手纸|香蕉|便便|药丸|红领巾|蜡烛|音乐|灯泡|开心|钱|咦|呼|冷|生气|弱|吐血|狗头)\s*\)/g, function ($0, $1) {
 | 
			
		||||
		$1 = encodeURI($1).replace(/%/g, '');
 | 
			
		||||
		return `<img class="owo" src="${window.JoeConfig.themeURL}assets/owo/paopao/${$1}_2x.png" />`;
 | 
			
		||||
	});
 | 
			
		||||
	str = str.replace(/\:\@\(\s*(高兴|小怒|脸红|内伤|装大款|赞一个|害羞|汗|吐血倒地|深思|不高兴|无语|亲亲|口水|尴尬|中指|想一想|哭泣|便便|献花|皱眉|傻笑|狂汗|吐|喷水|看不见|鼓掌|阴暗|长草|献黄瓜|邪恶|期待|得意|吐舌|喷血|无所谓|观察|暗地观察|肿包|中枪|大囧|呲牙|抠鼻|不说话|咽气|欢呼|锁眉|蜡烛|坐等|击掌|惊喜|喜极而泣|抽烟|不出所料|愤怒|无奈|黑线|投降|看热闹|扇耳光|小眼睛|中刀)\s*\)/g, function ($0, $1) {
 | 
			
		||||
		$1 = encodeURI($1).replace(/%/g, '');
 | 
			
		||||
		return `<img class="owo" src="${window.JoeConfig.themeURL}assets/owo/aru/${$1}_2x.png" />`;
 | 
			
		||||
	});
 | 
			
		||||
	str = str.replace(/{mtitle([^}]*)\/}/g, '<joe-mtitle $1></joe-mtitle>');
 | 
			
		||||
	str = str.replace(/{dplayer([^}]*)\/}/g, '<joe-dplayer player="' + player + '" $1></joe-dplayer>');
 | 
			
		||||
	str = str.replace(/{bilibili([^}]*)\/}/g, '<joe-bilibili $1></joe-bilibili>');
 | 
			
		||||
	str = str.replace(/{music-list([^}]*)\/}/g, '<joe-mlist $1></joe-mlist>');
 | 
			
		||||
	str = str.replace(/{music([^}]*)\/}/g, '<joe-music $1></joe-music>');
 | 
			
		||||
	str = str.replace(/{mp3([^}]*)\/}/g, '<joe-mp3 $1></joe-mp3>');
 | 
			
		||||
	str = str.replace(/{abtn([^}]*)\/}/g, '<joe-abtn $1></joe-abtn>');
 | 
			
		||||
	str = str.replace(/{anote([^}]*)\/}/g, '<joe-anote $1></joe-anote>');
 | 
			
		||||
	str = str.replace(/{dotted([^}]*)\/}/g, '<joe-dotted $1></joe-dotted>');
 | 
			
		||||
	str = str.replace(/{message([^}]*)\/}/g, '<joe-message $1></joe-message>');
 | 
			
		||||
	str = str.replace(/{progress([^}]*)\/}/g, '<joe-progress $1></joe-progress>');
 | 
			
		||||
	str = str.replace(/{hide[^}]*}([\s\S]*?){\/hide}/g, '<joe-hide></joe-hide>');
 | 
			
		||||
	str = str.replace(/{card-default([^}]*)}([\s\S]*?){\/card-default}/g, '<section style="margin-bottom: 15px"><joe-card-default $1><span class="_temp" style="display: none">$2</span></joe-card-default></section>');
 | 
			
		||||
	str = str.replace(/{callout([^}]*)}([\s\S]*?){\/callout}/g, '<section style="margin-bottom: 15px"><joe-callout $1><span class="_temp" style="display: none">$2</span></joe-callout></section>');
 | 
			
		||||
 | 
			
		||||
	$('.cm-preview-content').html(str);
 | 
			
		||||
	$('.cm-preview-content p:empty').remove();
 | 
			
		||||
	$('.cm-preview-content pre code').each((i, el) => Prism.highlightElement(el));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -201,6 +201,11 @@ export default [
 | 
			
		||||
		title: '全屏/取消全屏',
 | 
			
		||||
		innerHTML: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="20" height="20"><path d="M181.2 803.4V637H98v208c0 45.9 37.2 83.2 83.2 83.2h208V845H222.8c-23 0-41.6-18.6-41.6-41.6zM844.8 98.6h-208v83.2h166.4c23 0 41.6 18.6 41.6 41.6v166.4H928v-208c0-46-37.3-83.2-83.2-83.2zm-746.6 83v208h83.2V223.2c0-23 18.6-41.6 41.6-41.6h166.4V98.4h-208c-46 0-83.2 37.3-83.2 83.2zm746.4 455.6v166.4c0 23-18.6 41.6-41.6 41.6H636.6v83.2h208c45.9 0 83.2-37.2 83.2-83.2v-208h-83.2z"/></svg>'
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		type: 'preview',
 | 
			
		||||
		title: '预览/取消预览',
 | 
			
		||||
		innerHTML: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="20" height="20"><path d="M832 128c70.692 0 128 57.308 128 128v512c0 70.692-57.308 128-128 128H192c-70.692 0-128-57.308-128-128V256c0-70.692 57.308-128 128-128h640zm0 72H192c-30.619 0-55.498 24.573-56 55.074V768c0 30.619 24.573 55.498 55.074 55.992L192 824h640c30.619 0 55.498-24.573 56-55.074V256c0-30.619-24.573-55.498-55.074-55.992L832 200zM693.031 450.127l.425.417 128 128c13.918 13.918 14.057 36.398.417 50.487l-.417.425-128 128c-14.059 14.059-36.853 14.059-50.912 0-13.918-13.918-14.057-36.398-.417-50.487l.417-.425L745.09 604 642.544 501.456c-13.918-13.918-14.057-36.398-.417-50.487l.417-.425c13.918-13.918 36.398-14.057 50.487-.417zM284 312c19.882 0 36 16.118 36 36s-16.118 36-36 36h-56c-19.882 0-36-16.118-36-36s16.118-36 36-36h56zm512 0c19.882 0 36 16.118 36 36s-16.118 36-36 36H420c-19.882 0-36-16.118-36-36s16.118-36 36-36h376z"/></svg>'
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		type: 'draft',
 | 
			
		||||
		title: '保存草稿',
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -10,27 +10,27 @@ import JoeAction from './_actions';
 | 
			
		||||
import createPreviewHtml from './_create';
 | 
			
		||||
 | 
			
		||||
class Joe extends JoeAction {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super();
 | 
			
		||||
        this.plugins = [history(), classHighlightStyle, bracketMatching(), closeBrackets()];
 | 
			
		||||
        this._isPasting = false;
 | 
			
		||||
        this.init_ViewPort();
 | 
			
		||||
        this.init_Editor();
 | 
			
		||||
        this.init_Preview();
 | 
			
		||||
        this.init_Tools();
 | 
			
		||||
        this.init_Insert();
 | 
			
		||||
        this.init_AutoSave();
 | 
			
		||||
    }
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super();
 | 
			
		||||
		this.plugins = [history(), classHighlightStyle, bracketMatching(), closeBrackets()];
 | 
			
		||||
		this._isPasting = false;
 | 
			
		||||
		this.init_ViewPort();
 | 
			
		||||
		this.init_Editor();
 | 
			
		||||
		this.init_Preview();
 | 
			
		||||
		this.init_Tools();
 | 
			
		||||
		this.init_Insert();
 | 
			
		||||
		this.init_AutoSave();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* 已测 √ */
 | 
			
		||||
    init_ViewPort() {
 | 
			
		||||
        if ($('meta[name="viewport"]').length > 0) $('meta[name="viewport"]').attr('content', 'width=device-width, user-scalable=no, initial-scale=1.0, shrink-to-fit=no, viewport-fit=cover');
 | 
			
		||||
        else $('head').append('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, shrink-to-fit=no, viewport-fit=cover">');
 | 
			
		||||
    }
 | 
			
		||||
	/* 已测 √ */
 | 
			
		||||
	init_ViewPort() {
 | 
			
		||||
		if ($('meta[name="viewport"]').length > 0) $('meta[name="viewport"]').attr('content', 'width=device-width, user-scalable=no, initial-scale=1.0, shrink-to-fit=no, viewport-fit=cover');
 | 
			
		||||
		else $('head').append('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, shrink-to-fit=no, viewport-fit=cover">');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* 已测 √ */
 | 
			
		||||
    init_Editor() {
 | 
			
		||||
        $('#text').before(`
 | 
			
		||||
	/* 已测 √ */
 | 
			
		||||
	init_Editor() {
 | 
			
		||||
		$('#text').before(`
 | 
			
		||||
            <div class="cm-container">
 | 
			
		||||
                <div class="cm-tools"></div>
 | 
			
		||||
                <div class="cm-mainer">
 | 
			
		||||
@ -42,322 +42,328 @@ class Joe extends JoeAction {
 | 
			
		||||
                <div class="cm-progress-right"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
        `);
 | 
			
		||||
        createPreviewHtml($('#text').val());
 | 
			
		||||
        let _temp = null;
 | 
			
		||||
        const cm = new EditorView({
 | 
			
		||||
            state: EditorState.create({
 | 
			
		||||
                doc: $('#text').val(),
 | 
			
		||||
                extensions: [
 | 
			
		||||
                    ...this.plugins,
 | 
			
		||||
                    keymap.of([defaultTabBinding, ...defaultKeymap, ...historyKeymap, ...closeBracketsKeymap]),
 | 
			
		||||
                    EditorView.updateListener.of(update => {
 | 
			
		||||
                        if (!update.docChanged) return;
 | 
			
		||||
                        if (_temp !== update.state.doc.toString()) {
 | 
			
		||||
                            _temp = update.state.doc.toString();
 | 
			
		||||
                            if (window.requestAnimationFrame) window.requestAnimationFrame(() => createPreviewHtml(update.state.doc.toString()));
 | 
			
		||||
                            else createPreviewHtml(update.state.doc.toString());
 | 
			
		||||
                        }
 | 
			
		||||
                    }),
 | 
			
		||||
                    EditorView.domEventHandlers({
 | 
			
		||||
                        paste: e => {
 | 
			
		||||
                            const clipboardData = e.clipboardData;
 | 
			
		||||
                            if (!clipboardData || !clipboardData.items) return;
 | 
			
		||||
                            const items = clipboardData.items;
 | 
			
		||||
                            if (!items.length) return;
 | 
			
		||||
                            let blob = null;
 | 
			
		||||
                            for (let i = 0; i < items.length; i++) {
 | 
			
		||||
                                if (items[i].type.indexOf('image') !== -1) {
 | 
			
		||||
                                    e.preventDefault();
 | 
			
		||||
                                    blob = items[i].getAsFile();
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            if (!blob) return;
 | 
			
		||||
                            let api = window.JoeConfig.uploadAPI;
 | 
			
		||||
                            if (!api) return;
 | 
			
		||||
                            const cid = $('input[name="cid"]').val();
 | 
			
		||||
                            cid && (api = api + '&cid=' + cid);
 | 
			
		||||
                            if (this._isPasting) return;
 | 
			
		||||
                            this._isPasting = true;
 | 
			
		||||
                            const fileName = Date.now().toString(36) + '.png';
 | 
			
		||||
                            let formData = new FormData();
 | 
			
		||||
                            formData.append('name', fileName);
 | 
			
		||||
                            formData.append('file', blob, fileName);
 | 
			
		||||
                            $.ajax({
 | 
			
		||||
                                url: api,
 | 
			
		||||
                                method: 'post',
 | 
			
		||||
                                data: formData,
 | 
			
		||||
                                contentType: false,
 | 
			
		||||
                                processData: false,
 | 
			
		||||
                                dataType: 'json',
 | 
			
		||||
                                xhr: () => {
 | 
			
		||||
                                    const xhr = $.ajaxSettings.xhr();
 | 
			
		||||
                                    if (!xhr.upload) return;
 | 
			
		||||
                                    xhr.upload.addEventListener(
 | 
			
		||||
                                        'progress',
 | 
			
		||||
                                        e => {
 | 
			
		||||
                                            let percent = (e.loaded / e.total) * 100;
 | 
			
		||||
                                            $('.cm-progress-left').width(percent / 2 + '%');
 | 
			
		||||
                                            $('.cm-progress-right').width(percent / 2 + '%');
 | 
			
		||||
                                        },
 | 
			
		||||
                                        false
 | 
			
		||||
                                    );
 | 
			
		||||
                                    return xhr;
 | 
			
		||||
                                },
 | 
			
		||||
                                success: res => {
 | 
			
		||||
                                    $('.cm-progress-left').width(0);
 | 
			
		||||
                                    $('.cm-progress-right').width(0);
 | 
			
		||||
                                    this._isPasting = false;
 | 
			
		||||
                                    const str = `${super._getLineCh(cm) ? '\n' : ''}![${res[1].title}](${res[0]})\n`;
 | 
			
		||||
                                    super._replaceSelection(cm, str);
 | 
			
		||||
                                    cm.focus();
 | 
			
		||||
                                },
 | 
			
		||||
                                error: () => {
 | 
			
		||||
                                    $('.cm-progress-left').width(0);
 | 
			
		||||
                                    $('.cm-progress-right').width(0);
 | 
			
		||||
                                    this._isPasting = false;
 | 
			
		||||
                                }
 | 
			
		||||
                            });
 | 
			
		||||
                        }
 | 
			
		||||
                    })
 | 
			
		||||
                ],
 | 
			
		||||
                tabSize: 4
 | 
			
		||||
            })
 | 
			
		||||
        });
 | 
			
		||||
        $('.cm-mainer').prepend(cm.dom);
 | 
			
		||||
        $('#text')[0].form && $('#text')[0].form.addEventListener('submit', () => $('#text').val(cm.state.doc.toString()));
 | 
			
		||||
        this.cm = cm;
 | 
			
		||||
    }
 | 
			
		||||
		createPreviewHtml($('#text').val());
 | 
			
		||||
		let _temp = null;
 | 
			
		||||
		const cm = new EditorView({
 | 
			
		||||
			state: EditorState.create({
 | 
			
		||||
				doc: $('#text').val(),
 | 
			
		||||
				extensions: [
 | 
			
		||||
					...this.plugins,
 | 
			
		||||
					keymap.of([defaultTabBinding, ...defaultKeymap, ...historyKeymap, ...closeBracketsKeymap]),
 | 
			
		||||
					EditorView.updateListener.of(update => {
 | 
			
		||||
						if (!update.docChanged) return;
 | 
			
		||||
						if (_temp !== update.state.doc.toString()) {
 | 
			
		||||
							_temp = update.state.doc.toString();
 | 
			
		||||
							if (window.requestAnimationFrame) window.requestAnimationFrame(() => createPreviewHtml(update.state.doc.toString()));
 | 
			
		||||
							else createPreviewHtml(update.state.doc.toString());
 | 
			
		||||
						}
 | 
			
		||||
					}),
 | 
			
		||||
					EditorView.domEventHandlers({
 | 
			
		||||
						paste: e => {
 | 
			
		||||
							const clipboardData = e.clipboardData;
 | 
			
		||||
							if (!clipboardData || !clipboardData.items) return;
 | 
			
		||||
							const items = clipboardData.items;
 | 
			
		||||
							if (!items.length) return;
 | 
			
		||||
							let blob = null;
 | 
			
		||||
							for (let i = 0; i < items.length; i++) {
 | 
			
		||||
								if (items[i].type.indexOf('image') !== -1) {
 | 
			
		||||
									e.preventDefault();
 | 
			
		||||
									blob = items[i].getAsFile();
 | 
			
		||||
									break;
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
							if (!blob) return;
 | 
			
		||||
							let api = window.JoeConfig.uploadAPI;
 | 
			
		||||
							if (!api) return;
 | 
			
		||||
							const cid = $('input[name="cid"]').val();
 | 
			
		||||
							cid && (api = api + '&cid=' + cid);
 | 
			
		||||
							if (this._isPasting) return;
 | 
			
		||||
							this._isPasting = true;
 | 
			
		||||
							const fileName = Date.now().toString(36) + '.png';
 | 
			
		||||
							let formData = new FormData();
 | 
			
		||||
							formData.append('name', fileName);
 | 
			
		||||
							formData.append('file', blob, fileName);
 | 
			
		||||
							$.ajax({
 | 
			
		||||
								url: api,
 | 
			
		||||
								method: 'post',
 | 
			
		||||
								data: formData,
 | 
			
		||||
								contentType: false,
 | 
			
		||||
								processData: false,
 | 
			
		||||
								dataType: 'json',
 | 
			
		||||
								xhr: () => {
 | 
			
		||||
									const xhr = $.ajaxSettings.xhr();
 | 
			
		||||
									if (!xhr.upload) return;
 | 
			
		||||
									xhr.upload.addEventListener(
 | 
			
		||||
										'progress',
 | 
			
		||||
										e => {
 | 
			
		||||
											let percent = (e.loaded / e.total) * 100;
 | 
			
		||||
											$('.cm-progress-left').width(percent / 2 + '%');
 | 
			
		||||
											$('.cm-progress-right').width(percent / 2 + '%');
 | 
			
		||||
										},
 | 
			
		||||
										false
 | 
			
		||||
									);
 | 
			
		||||
									return xhr;
 | 
			
		||||
								},
 | 
			
		||||
								success: res => {
 | 
			
		||||
									$('.cm-progress-left').width(0);
 | 
			
		||||
									$('.cm-progress-right').width(0);
 | 
			
		||||
									this._isPasting = false;
 | 
			
		||||
									const str = `${super._getLineCh(cm) ? '\n' : ''}![${res[1].title}](${res[0]})\n`;
 | 
			
		||||
									super._replaceSelection(cm, str);
 | 
			
		||||
									cm.focus();
 | 
			
		||||
								},
 | 
			
		||||
								error: () => {
 | 
			
		||||
									$('.cm-progress-left').width(0);
 | 
			
		||||
									$('.cm-progress-right').width(0);
 | 
			
		||||
									this._isPasting = false;
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
						}
 | 
			
		||||
					})
 | 
			
		||||
				],
 | 
			
		||||
				tabSize: 4
 | 
			
		||||
			})
 | 
			
		||||
		});
 | 
			
		||||
		$('.cm-mainer').prepend(cm.dom);
 | 
			
		||||
		$('#text')[0].form && $('#text')[0].form.addEventListener('submit', () => $('#text').val(cm.state.doc.toString()));
 | 
			
		||||
		this.cm = cm;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* 已测 √ */
 | 
			
		||||
    init_Preview() {
 | 
			
		||||
        const move = (nowClientX, nowWidth, clientX) => {
 | 
			
		||||
            let moveX = nowClientX - clientX;
 | 
			
		||||
            let moveWidth = nowWidth + moveX;
 | 
			
		||||
            if (moveWidth <= 0) moveWidth = 0;
 | 
			
		||||
            if (moveWidth >= $('.cm-mainer').outerWidth() - 16) moveWidth = $('.cm-mainer').outerWidth() - 16;
 | 
			
		||||
            $('.cm-preview').width(moveWidth);
 | 
			
		||||
        };
 | 
			
		||||
        $('.cm-resize').on({
 | 
			
		||||
            mousedown: e => {
 | 
			
		||||
                e.preventDefault();
 | 
			
		||||
                e.stopPropagation();
 | 
			
		||||
                const nowWidth = $('.cm-preview').outerWidth();
 | 
			
		||||
                const nowClientX = e.clientX;
 | 
			
		||||
                $('.cm-preview').addClass('move');
 | 
			
		||||
                document.onmousemove = _e => {
 | 
			
		||||
                    if (window.requestAnimationFrame) requestAnimationFrame(() => move(nowClientX, nowWidth, _e.clientX));
 | 
			
		||||
                    else move(nowClientX, nowWidth, _e.clientX);
 | 
			
		||||
                };
 | 
			
		||||
                document.onmouseup = () => {
 | 
			
		||||
                    document.onmousemove = null;
 | 
			
		||||
                    document.onmouseup = null;
 | 
			
		||||
                    $('.cm-preview').removeClass('move');
 | 
			
		||||
                };
 | 
			
		||||
                return false;
 | 
			
		||||
            },
 | 
			
		||||
            touchstart: e => {
 | 
			
		||||
                e.preventDefault();
 | 
			
		||||
                e.stopPropagation();
 | 
			
		||||
                const nowWidth = $('.cm-preview').outerWidth();
 | 
			
		||||
                const nowClientX = e.originalEvent.targetTouches[0].clientX;
 | 
			
		||||
                $('.cm-preview').addClass('move');
 | 
			
		||||
                document.ontouchmove = _e => {
 | 
			
		||||
                    if (window.requestAnimationFrame) requestAnimationFrame(() => move(nowClientX, nowWidth, _e.targetTouches[0].clientX));
 | 
			
		||||
                    else move(nowClientX, nowWidth, _e.targetTouches[0].clientX);
 | 
			
		||||
                };
 | 
			
		||||
                document.ontouchend = () => {
 | 
			
		||||
                    document.ontouchmove = null;
 | 
			
		||||
                    document.ontouchend = null;
 | 
			
		||||
                    $('.cm-preview').removeClass('move');
 | 
			
		||||
                };
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
	/* 已测 √ */
 | 
			
		||||
	init_Preview() {
 | 
			
		||||
		const move = (nowClientX, nowWidth, clientX) => {
 | 
			
		||||
			let moveX = nowClientX - clientX;
 | 
			
		||||
			let moveWidth = nowWidth + moveX;
 | 
			
		||||
			if (moveWidth <= 0) moveWidth = 0;
 | 
			
		||||
			if (moveWidth >= $('.cm-mainer').outerWidth() - 16) moveWidth = $('.cm-mainer').outerWidth() - 16;
 | 
			
		||||
			$('.cm-preview').width(moveWidth);
 | 
			
		||||
		};
 | 
			
		||||
		$('.cm-resize').on({
 | 
			
		||||
			mousedown: e => {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				const nowWidth = $('.cm-preview').outerWidth();
 | 
			
		||||
				const nowClientX = e.clientX;
 | 
			
		||||
				$('.cm-preview').addClass('move');
 | 
			
		||||
				document.onmousemove = _e => {
 | 
			
		||||
					if (window.requestAnimationFrame) requestAnimationFrame(() => move(nowClientX, nowWidth, _e.clientX));
 | 
			
		||||
					else move(nowClientX, nowWidth, _e.clientX);
 | 
			
		||||
				};
 | 
			
		||||
				document.onmouseup = () => {
 | 
			
		||||
					document.onmousemove = null;
 | 
			
		||||
					document.onmouseup = null;
 | 
			
		||||
					$('.cm-preview').removeClass('move');
 | 
			
		||||
				};
 | 
			
		||||
				return false;
 | 
			
		||||
			},
 | 
			
		||||
			touchstart: e => {
 | 
			
		||||
				e.preventDefault();
 | 
			
		||||
				e.stopPropagation();
 | 
			
		||||
				const nowWidth = $('.cm-preview').outerWidth();
 | 
			
		||||
				const nowClientX = e.originalEvent.targetTouches[0].clientX;
 | 
			
		||||
				$('.cm-preview').addClass('move');
 | 
			
		||||
				document.ontouchmove = _e => {
 | 
			
		||||
					if (window.requestAnimationFrame) requestAnimationFrame(() => move(nowClientX, nowWidth, _e.targetTouches[0].clientX));
 | 
			
		||||
					else move(nowClientX, nowWidth, _e.targetTouches[0].clientX);
 | 
			
		||||
				};
 | 
			
		||||
				document.ontouchend = () => {
 | 
			
		||||
					document.ontouchmove = null;
 | 
			
		||||
					document.ontouchend = null;
 | 
			
		||||
					$('.cm-preview').removeClass('move');
 | 
			
		||||
				};
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* 已测 √ */
 | 
			
		||||
    init_Tools() {
 | 
			
		||||
        tools.forEach(item => {
 | 
			
		||||
            if (item.type === 'title') {
 | 
			
		||||
                super.handleTitle(this.cm, item);
 | 
			
		||||
            } else {
 | 
			
		||||
                const el = $(`<div class="cm-tools-item" title="${item.title}">${item.innerHTML}</div>`);
 | 
			
		||||
                el.on('click', e => {
 | 
			
		||||
                    e.preventDefault();
 | 
			
		||||
                    switch (item.type) {
 | 
			
		||||
                        case 'fullScreen':
 | 
			
		||||
                            super.handleFullScreen(el);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'publish':
 | 
			
		||||
                            super.handlePublish();
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'undo':
 | 
			
		||||
                            super.handleUndo(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'redo':
 | 
			
		||||
                            super.handleRedo(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'time':
 | 
			
		||||
                            super.handleTime(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'bold':
 | 
			
		||||
                            super._insetAmboText(this.cm, '**');
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'italic':
 | 
			
		||||
                            super._insetAmboText(this.cm, '*');
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'delete':
 | 
			
		||||
                            super._insetAmboText(this.cm, '~~');
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'code-inline':
 | 
			
		||||
                            super._insetAmboText(this.cm, '`');
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'indent':
 | 
			
		||||
                            super.handleIndent(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'hr':
 | 
			
		||||
                            super.handleHr(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'clean':
 | 
			
		||||
                            super.handleClean(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'ordered-list':
 | 
			
		||||
                            super.handleOrdered(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'unordered-list':
 | 
			
		||||
                            super.handleUnordered(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'quote':
 | 
			
		||||
                            super.handleQuote(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'download':
 | 
			
		||||
                            super.handleDownload(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'link':
 | 
			
		||||
                            super.handleLink(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'image':
 | 
			
		||||
                            super.handleImage(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'table':
 | 
			
		||||
                            super.handleTable(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'code-block':
 | 
			
		||||
                            super.handleCodeBlock(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'about':
 | 
			
		||||
                            super.handleAbout();
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'character':
 | 
			
		||||
                            super._createTableLists(this.cm, JoeConfig.characterAPI, '星星符号', '字符大全');
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'emoji':
 | 
			
		||||
                            super._createTableLists(this.cm, JoeConfig.emojiAPI, '表情', '符号表情(需数据库支持)');
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'task-no':
 | 
			
		||||
                            super.handleTask(this.cm, false);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'task-yes':
 | 
			
		||||
                            super.handleTask(this.cm, true);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'netease-list':
 | 
			
		||||
                            super.handleNetease(this.cm, true);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'netease-single':
 | 
			
		||||
                            super.handleNetease(this.cm, false);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'bilibili':
 | 
			
		||||
                            super.handleBilibili(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'dplayer':
 | 
			
		||||
                            super.handleDplayer(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'draft':
 | 
			
		||||
                            super.handleDraft();
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'expression':
 | 
			
		||||
                            super.handleExpression(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'mtitle':
 | 
			
		||||
                            super.handleMtitle(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'html':
 | 
			
		||||
                            super.handleHtml(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'abtn':
 | 
			
		||||
                            super.handleAbtn(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'anote':
 | 
			
		||||
                            super.handleAnote(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'dotted':
 | 
			
		||||
                            super.handleDotted(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'hide':
 | 
			
		||||
                            super.handleHide(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'card-default':
 | 
			
		||||
                            super.handleCardDefault(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'message':
 | 
			
		||||
                            super.handleMessage(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'progress':
 | 
			
		||||
                            super.handleProgress(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'callout':
 | 
			
		||||
                            super.handleCallout(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case 'mp3':
 | 
			
		||||
                            super.handleMp3(this.cm);
 | 
			
		||||
                            break;
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                $('.cm-tools').append(el);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
	/* 已测 √ */
 | 
			
		||||
	init_Tools() {
 | 
			
		||||
		tools.forEach(item => {
 | 
			
		||||
			if (item.type === 'title') {
 | 
			
		||||
				super.handleTitle(this.cm, item);
 | 
			
		||||
			} else {
 | 
			
		||||
				const el = $(`<div class="cm-tools-item" title="${item.title}">${item.innerHTML}</div>`);
 | 
			
		||||
				el.on('click', e => {
 | 
			
		||||
					e.preventDefault();
 | 
			
		||||
					switch (item.type) {
 | 
			
		||||
						case 'fullScreen':
 | 
			
		||||
							super.handleFullScreen(el);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'publish':
 | 
			
		||||
							super.handlePublish();
 | 
			
		||||
							break;
 | 
			
		||||
						case 'undo':
 | 
			
		||||
							super.handleUndo(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'redo':
 | 
			
		||||
							super.handleRedo(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'time':
 | 
			
		||||
							super.handleTime(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'bold':
 | 
			
		||||
							super._insetAmboText(this.cm, '**');
 | 
			
		||||
							break;
 | 
			
		||||
						case 'italic':
 | 
			
		||||
							super._insetAmboText(this.cm, '*');
 | 
			
		||||
							break;
 | 
			
		||||
						case 'delete':
 | 
			
		||||
							super._insetAmboText(this.cm, '~~');
 | 
			
		||||
							break;
 | 
			
		||||
						case 'code-inline':
 | 
			
		||||
							super._insetAmboText(this.cm, '`');
 | 
			
		||||
							break;
 | 
			
		||||
						case 'indent':
 | 
			
		||||
							super.handleIndent(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'hr':
 | 
			
		||||
							super.handleHr(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'clean':
 | 
			
		||||
							super.handleClean(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'ordered-list':
 | 
			
		||||
							super.handleOrdered(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'unordered-list':
 | 
			
		||||
							super.handleUnordered(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'quote':
 | 
			
		||||
							super.handleQuote(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'download':
 | 
			
		||||
							super.handleDownload(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'link':
 | 
			
		||||
							super.handleLink(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'image':
 | 
			
		||||
							super.handleImage(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'table':
 | 
			
		||||
							super.handleTable(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'code-block':
 | 
			
		||||
							super.handleCodeBlock(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'about':
 | 
			
		||||
							super.handleAbout();
 | 
			
		||||
							break;
 | 
			
		||||
						case 'character':
 | 
			
		||||
							super._createTableLists(this.cm, JoeConfig.characterAPI, '星星符号', '字符大全');
 | 
			
		||||
							break;
 | 
			
		||||
						case 'emoji':
 | 
			
		||||
							super._createTableLists(this.cm, JoeConfig.emojiAPI, '表情', '符号表情(需数据库支持)');
 | 
			
		||||
							break;
 | 
			
		||||
						case 'task-no':
 | 
			
		||||
							super.handleTask(this.cm, false);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'task-yes':
 | 
			
		||||
							super.handleTask(this.cm, true);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'netease-list':
 | 
			
		||||
							super.handleNetease(this.cm, true);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'netease-single':
 | 
			
		||||
							super.handleNetease(this.cm, false);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'bilibili':
 | 
			
		||||
							super.handleBilibili(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'dplayer':
 | 
			
		||||
							super.handleDplayer(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'draft':
 | 
			
		||||
							super.handleDraft();
 | 
			
		||||
							break;
 | 
			
		||||
						case 'expression':
 | 
			
		||||
							super.handleExpression(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'mtitle':
 | 
			
		||||
							super.handleMtitle(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'html':
 | 
			
		||||
							super.handleHtml(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'abtn':
 | 
			
		||||
							super.handleAbtn(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'anote':
 | 
			
		||||
							super.handleAnote(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'dotted':
 | 
			
		||||
							super.handleDotted(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'hide':
 | 
			
		||||
							super.handleHide(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'card-default':
 | 
			
		||||
							super.handleCardDefault(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'message':
 | 
			
		||||
							super.handleMessage(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'progress':
 | 
			
		||||
							super.handleProgress(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'callout':
 | 
			
		||||
							super.handleCallout(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'mp3':
 | 
			
		||||
							super.handleMp3(this.cm);
 | 
			
		||||
							break;
 | 
			
		||||
						case 'preview':
 | 
			
		||||
							el.toggleClass('active');
 | 
			
		||||
							if (el.hasClass('active')) window.JoeConfig.canPreview = true;
 | 
			
		||||
							else window.JoeConfig.canPreview = false;
 | 
			
		||||
							createPreviewHtml(this.cm.state.doc.toString());
 | 
			
		||||
							break;
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
				$('.cm-tools').append(el);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* 已测 √ */
 | 
			
		||||
    init_Insert() {
 | 
			
		||||
        Typecho.insertFileToEditor = (file, url, isImage) => {
 | 
			
		||||
            const str = `${super._getLineCh(this.cm) ? '\n' : ''}${isImage ? '!' : ''}[${file}](${url})\n`;
 | 
			
		||||
            super._replaceSelection(this.cm, str);
 | 
			
		||||
            this.cm.focus();
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
	/* 已测 √ */
 | 
			
		||||
	init_Insert() {
 | 
			
		||||
		Typecho.insertFileToEditor = (file, url, isImage) => {
 | 
			
		||||
			const str = `${super._getLineCh(this.cm) ? '\n' : ''}${isImage ? '!' : ''}[${file}](${url})\n`;
 | 
			
		||||
			super._replaceSelection(this.cm, str);
 | 
			
		||||
			this.cm.focus();
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* 已测 √ */
 | 
			
		||||
    init_AutoSave() {
 | 
			
		||||
        if (window.JoeConfig.autoSave !== 1) return;
 | 
			
		||||
        const formEl = $('#text')[0].form;
 | 
			
		||||
        let cid = $('input[name="cid"]').val();
 | 
			
		||||
        let temp = null;
 | 
			
		||||
        const saveFn = () => {
 | 
			
		||||
            $('input[name="cid"]').val(cid);
 | 
			
		||||
            $('#text').val(this.cm.state.doc.toString());
 | 
			
		||||
            let data = $(formEl).serialize();
 | 
			
		||||
            if (data !== temp) {
 | 
			
		||||
                $('.cm-autosave').addClass('active');
 | 
			
		||||
                $.ajax({
 | 
			
		||||
                    url: formEl.action,
 | 
			
		||||
                    type: 'POST',
 | 
			
		||||
                    data: data + '&do=save',
 | 
			
		||||
                    dataType: 'json',
 | 
			
		||||
                    success: res => {
 | 
			
		||||
                        cid = res.cid;
 | 
			
		||||
                        temp = data;
 | 
			
		||||
                        let timer = setTimeout(() => {
 | 
			
		||||
                            $('.cm-autosave').removeClass('active');
 | 
			
		||||
                            clearTimeout(timer);
 | 
			
		||||
                        }, 1000);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        setInterval(saveFn, 5000);
 | 
			
		||||
    }
 | 
			
		||||
	/* 已测 √ */
 | 
			
		||||
	init_AutoSave() {
 | 
			
		||||
		if (window.JoeConfig.autoSave !== 1) return;
 | 
			
		||||
		const formEl = $('#text')[0].form;
 | 
			
		||||
		let cid = $('input[name="cid"]').val();
 | 
			
		||||
		let temp = null;
 | 
			
		||||
		const saveFn = () => {
 | 
			
		||||
			$('input[name="cid"]').val(cid);
 | 
			
		||||
			$('#text').val(this.cm.state.doc.toString());
 | 
			
		||||
			let data = $(formEl).serialize();
 | 
			
		||||
			if (data !== temp) {
 | 
			
		||||
				$('.cm-autosave').addClass('active');
 | 
			
		||||
				$.ajax({
 | 
			
		||||
					url: formEl.action,
 | 
			
		||||
					type: 'POST',
 | 
			
		||||
					data: data + '&do=save',
 | 
			
		||||
					dataType: 'json',
 | 
			
		||||
					success: res => {
 | 
			
		||||
						cid = res.cid;
 | 
			
		||||
						temp = data;
 | 
			
		||||
						let timer = setTimeout(() => {
 | 
			
		||||
							$('.cm-autosave').removeClass('active');
 | 
			
		||||
							clearTimeout(timer);
 | 
			
		||||
						}, 1000);
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		setInterval(saveFn, 5000);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
document.addEventListener('DOMContentLoaded', () => new Joe());
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,10 @@
 | 
			
		||||
import { nodeResolve } from '@rollup/plugin-node-resolve';
 | 
			
		||||
import { uglify } from 'rollup-plugin-uglify';
 | 
			
		||||
export default {
 | 
			
		||||
    input: './js/joe.write.js',
 | 
			
		||||
    output: {
 | 
			
		||||
        file: './js/joe.write.chunk.js',
 | 
			
		||||
        format: 'iife'
 | 
			
		||||
    },
 | 
			
		||||
    plugins: [nodeResolve(), uglify()]
 | 
			
		||||
	input: './js/joe.write.js',
 | 
			
		||||
	output: {
 | 
			
		||||
		file: './js/joe.write.chunk.js',
 | 
			
		||||
		format: 'iife'
 | 
			
		||||
	},
 | 
			
		||||
	plugins: [nodeResolve(), uglify()]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user