211 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var editor = [];
 | 
						||
$(function () {
 | 
						||
    initCkeditor()
 | 
						||
})
 | 
						||
 | 
						||
/*  --Uplaod Adapater   */
 | 
						||
//class MyUploadAdapter {
 | 
						||
//    constructor(loader) {
 | 
						||
//        this.loader = loader;
 | 
						||
//    }
 | 
						||
//    // start upload methods
 | 
						||
//    upload() {
 | 
						||
//        return new Promise((resolve, reject) => {
 | 
						||
//            // 使用 FileReader() 物件讀取檔案
 | 
						||
//            const reader = this.reader = new window.FileReader();
 | 
						||
 | 
						||
//            // 觸發錯誤事件,以 reject 丟回 Promise 失敗原因
 | 
						||
//            reader.addEventListener('error', err => {
 | 
						||
//                reject(err);
 | 
						||
//            });
 | 
						||
//            // 觸發 abort 事件時,以 reject() ,使 Promise 失敗
 | 
						||
//            reader.addEventListener('abort', () => {
 | 
						||
//                reject();
 | 
						||
//            });
 | 
						||
 | 
						||
//            // 告訴 FileReader 物件用 url 格式讀取,用於設定 img.src 性質
 | 
						||
//            this.loader.file.then(file => {
 | 
						||
 | 
						||
//                console.log(file)
 | 
						||
 | 
						||
//                // 觸發 load 事件後,resolve 丟回物件完成 Promise
 | 
						||
//                reader.addEventListener('load', () => {
 | 
						||
//                    //file.src = reader.result;
 | 
						||
//                    let myFile = new BICYCLER.Utility.File();
 | 
						||
//                    let myMath = new BICYCLER.Utility.Math();
 | 
						||
//                    let strExtName = "", strOrgName = "", strSaveName = ""
 | 
						||
//                    strSaveName = myMath.guid().replace(' ', '');
 | 
						||
//                    strExtName = myFile.getFileExtension(file.name);
 | 
						||
//                    strOrgName = (strExtName === null || strExtName === "") ? file.name : file.name.replace('.' + strExtName, '');
 | 
						||
 | 
						||
//                    editorImage.push(file)
 | 
						||
//                    resolve({
 | 
						||
//                        filename: file.name,
 | 
						||
//                        orgname: strOrgName,
 | 
						||
//                        savename: strSaveName,
 | 
						||
//                        extname: strExtName,
 | 
						||
//                        size: file.size,
 | 
						||
//                        urls: {
 | 
						||
//                            default: reader.result
 | 
						||
//                        }
 | 
						||
//                    });
 | 
						||
//                });
 | 
						||
//                reader.readAsDataURL(file);
 | 
						||
//            });
 | 
						||
 | 
						||
//            //this.loader.read().then(data => {
 | 
						||
//            //    editor.editing.view.change(writer => {
 | 
						||
//            //        writer.setAttribute('src', data, viewImg);
 | 
						||
//            //    });
 | 
						||
//            //});
 | 
						||
//        });
 | 
						||
//    }
 | 
						||
//    // start abort()
 | 
						||
//    abort() {
 | 
						||
//        //  觸發 FileReader abort 事件
 | 
						||
//        this.reader.abort();
 | 
						||
//    }
 | 
						||
//}
 | 
						||
 | 
						||
function initCkeditor() {
 | 
						||
    return new Promise((resolve) => {
 | 
						||
        let toolbar = {
 | 
						||
            toolbar: {
 | 
						||
                items: [
 | 
						||
                    'heading',
 | 
						||
                    '|',
 | 
						||
                    'fontfamily', 'fontsize', 'fontColor', 'fontBackgroundColor',
 | 
						||
                    '|',
 | 
						||
                    'bold', 'italic', 'underline', 'strikethrough',
 | 
						||
                    '-',
 | 
						||
                    'alignment', 'numberedList', 'bulletedList',
 | 
						||
                    '|',
 | 
						||
                    'indent', 'outdent',
 | 
						||
                    '|',
 | 
						||
                    'link', 'blockquote', /*'ckfinder ,'*/ 'insertTable',
 | 
						||
                    '|',
 | 
						||
                    'undo', 'redo',
 | 
						||
                    '|',
 | 
						||
                    'fullScreen'
 | 
						||
                ],
 | 
						||
                shouldNotGroupWhenFull: true,
 | 
						||
                language: "zh",
 | 
						||
            },
 | 
						||
            image: {
 | 
						||
                toolbar: [
 | 
						||
                    'toggleImageCaption', 'linkImage',
 | 
						||
                    '|',
 | 
						||
                    'imageStyle:alignBlockLeft', 'imageStyle:alignCenter', 'imageStyle:alignBlockRight', 'imageStyle:wrapText',
 | 
						||
                    "|",
 | 
						||
                    'resizeImage:original', 'resizeImage:25', 'resizeImage:50', 'resizeImage:75'
 | 
						||
                ],
 | 
						||
            },
 | 
						||
            table: {
 | 
						||
                contentToolbar: ['tableProperties', 'tableCellProperties', 'tableRow', 'tableColumn', 'mergeTableCells']
 | 
						||
            },
 | 
						||
            //image介面刪除callback
 | 
						||
            //imageRemoveEvent: {
 | 
						||
            //    additionalElementTypes: null, 
 | 
						||
            //    callback: (imagesSrc, nodeObjects) => {
 | 
						||
            //        console.log('callback called', imagesSrc, nodeObjects)
 | 
						||
            //    }
 | 
						||
            //},
 | 
						||
            ckfinder: {
 | 
						||
                //ckfinder 連接器
 | 
						||
                uploadUrl: '/By_Admin/CKfinder/CKfinder/connector?command=Init&type=Images&lang=zh-tw&langCode=zh-tw',
 | 
						||
                options: {
 | 
						||
                    language: 'zh-tw',
 | 
						||
                    resourceType: 'Images'
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        $("[data-toggle^=ckeditor]").each((index, value) => {
 | 
						||
            //取得原有element class
 | 
						||
            let oriWidth = $(value).css("width");
 | 
						||
            let oriMaxWidth = $(value).css("max-width");
 | 
						||
 | 
						||
            ClassicEditor.create(value, toolbar)
 | 
						||
                .then(NewEditor => {
 | 
						||
                    if ($("[data-toggle^=ckeditor]").length == 1) {
 | 
						||
                        editor = NewEditor;
 | 
						||
 | 
						||
                        //讀進來的Source element disabled時,該CKEditor => enableReadOnlyMode('secret string')
 | 
						||
                        if ($(value).prop("disabled") == true) {
 | 
						||
                            editor.enableReadOnlyMode('bicycler');
 | 
						||
                        }
 | 
						||
 | 
						||
                        //剪貼簿讀進來不呈現樣式
 | 
						||
                        //const plugin = editor.plugins.get('Clipboard');
 | 
						||
                        //plugin.on('inputTransformation', (evt, data) => {
 | 
						||
                        //    const dataTransfer = data.dataTransfer;
 | 
						||
                        //    data.content = editor.data.processor.toView(regexTextToHtml(dataTransfer.getData('text/plain')));
 | 
						||
                        //})
 | 
						||
 | 
						||
                        //上傳照片(非CKfinder)配置UploadAdapter
 | 
						||
                        //editor.plugins.get('FileRepository').createUploadAdapter = loader => {
 | 
						||
                        //    console.log(editor.plugins.get('FileRepository'))
 | 
						||
                        //    return new MyUploadAdapter(loader)
 | 
						||
                        //}
 | 
						||
 | 
						||
                        //放入原有col- class 
 | 
						||
                        $(editor.ui.view.element).css("width", oriWidth);
 | 
						||
                        $(editor.ui.view.element).css("max-width", oriMaxWidth);
 | 
						||
 | 
						||
                        resolve();
 | 
						||
                    } else {
 | 
						||
                        let sub = $(value).data("toggle").split("ckeditor")[1];
 | 
						||
                        editor[sub] = NewEditor
 | 
						||
 | 
						||
                        //讀進來的Source element disabled時,該CKEditor => enableReadOnlyMode('secret string')
 | 
						||
                        if ($(value).prop("disabled") == true) {
 | 
						||
                            editor[sub].enableReadOnlyMode('2421ww');
 | 
						||
                        }
 | 
						||
 | 
						||
                        //貼上時指文字呈現
 | 
						||
                        //const plugin = editor[sub].plugins.get('Clipboard');
 | 
						||
                        //plugin.on('inputTransformation', (evt, data) => {
 | 
						||
                        //    const dataTransfer = data.dataTransfer;
 | 
						||
                        //    data.content = editor[sub].data.processor.toView(regexTextToHtml(dataTransfer.getData('text/plain')));
 | 
						||
                        //})
 | 
						||
 | 
						||
                        //上傳照片(非CKfinder)配置UploadAdapter
 | 
						||
                        editor[sub].plugins.get('FileRepository').createUploadAdapter = loader => {
 | 
						||
                            console.log(editor[sub].plugins.get('FileRepository'))
 | 
						||
                            return new MyUploadAdapter(loader)
 | 
						||
                        }
 | 
						||
 | 
						||
                        //放入原有col- class 
 | 
						||
                        $(editor[sub].ui.view.element).css("width", oriWidth);
 | 
						||
                        $(editor[sub].ui.view.element).css("max-width", oriMaxWidth);
 | 
						||
 | 
						||
                        resolve();
 | 
						||
                    }
 | 
						||
                })
 | 
						||
                .catch(err => {
 | 
						||
                    console.error(err.stack);
 | 
						||
                    resolve();
 | 
						||
                });
 | 
						||
        })
 | 
						||
    })
 | 
						||
 | 
						||
}
 | 
						||
 | 
						||
function regexTextToHtml(text) {
 | 
						||
    let data = text;
 | 
						||
    data = data.replace(/\r/gm, "");
 | 
						||
    data = data.replace(/\n\n/gm, "\n");
 | 
						||
    data = data.replace(/^/gm, "<p>");
 | 
						||
    data = data.replace(/\n|\n\n/gm, "</p>");
 | 
						||
    return data;
 | 
						||
}
 | 
						||
 | 
						||
function regexHtmlToText(html) {
 | 
						||
    let data = html;
 | 
						||
    data = data.replace(/<p>/gm, "");
 | 
						||
    data = data.replace(/<\/p>/gm, "\n");
 | 
						||
    data = data.replace(/ /gm, " ");
 | 
						||
    data = data.replace(/ /gm, " ");
 | 
						||
    data = data.replace(/ /gm, " ");
 | 
						||
    return data;
 | 
						||
} |