| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- "use strict";
- function do_insert_data(data) {
- const name = 'opennamu_edit_textarea';
- if(get_select_editor() === 'textarea') {
- // https://stackoverflow.com/questions/11076975/insert-text-into-textarea-at-cursor-position-javascript
- if(document.selection) {
- document.getElementById(name).focus();
- let sel = document.selection.createRange();
- sel.text = data;
- } else if(
- document.getElementById(name).selectionStart ||
- document.getElementById(name).selectionStart === '0'
- ) {
- let startPos = document.getElementById(name).selectionStart;
- let endPos = document.getElementById(name).selectionEnd;
- let myPos = document.getElementById(name).value;
- document.getElementById(name).value = myPos.substring(0, startPos) + data + myPos.substring(endPos, myPos.length);
- } else {
- document.getElementById(name).value += data;
- }
- } else {
- let selection = editor.getSelection();
- let id = { major: 1, minor: 1 };
- let text = data;
- let op = {
- identifier: id,
- range: selection,
- text: text,
- forceMoveMarkers: true
- };
-
- editor.executeEdits("my-source", [op]);
- }
- }
- // 아직 개편이 더 필요함
- function do_paste_image() {
- document.getElementById('opennamu_edit_textarea').addEventListener("paste", pasteListener);
- }
- function pasteListener(e) {
- if(e.clipboardData && e.clipboardData.items) {
- const items = e.clipboardData.items;
- const formData = new FormData();
- let haveImageInClipboard = false;
- let file_name = '';
- let file;
-
- for(let i = 0; i < items.length; i++) {
- if(items[i].type.indexOf("image") !== -1) {
- file = items[i].getAsFile();
-
- haveImageInClipboard = true;
- e.preventDefault();
-
- break;
- }
- }
- if(!haveImageInClipboard) {
- return;
- }
- let lang_data = new FormData();
- lang_data.append('data', 'file_name empty save authority_error same_file_error error');
- fetch('/api/v2/lang', {
- method : 'POST',
- body : lang_data,
- }).then(function(res) {
- return res.json();
- }).then(function(lang) {
- lang = lang["data"];
- const customName = prompt(lang['file_name']);
-
- if(!customName) {
- return alert(lang['empty']);
- }
-
- file_name = customName + ".png";
-
- const customFile = new File([file], file_name, { type: file.type });
- formData.append("f_data[]", customFile);
- fetch("/upload", {
- method : "POST",
- body : formData,
- }).then((res) => {
- if (res.status === 200 || res.status === 201) {
- const url = res.url;
- alert(lang['save'] + ' : [[file:' + file_name + ']]');
- do_insert_data('[[file:' + file_name + ']]');
- } else {
- console.error("[ERROR] PasteUpload Fail :", res.statusText);
- if(res.status === 400) {
- alert(lang['same_file_error']);
- } else if(res.status === 401) {
- alert(lang['authority_error']);
- } else {
- alert(lang['error']);
- }
- }
- }).catch((err) => {
- console.error("[ERROR] PasteUpload Fail :", JSON.stringify(err), err);
- alert(lang['error']);
- });
- });
- }
- }
- function do_stop_exit() {
- window.onbeforeunload = function() {
- do_sync_monaco_and_textarea();
- let data = document.getElementById('opennamu_edit_textarea').value;
- let origin = document.getElementById('opennamu_edit_origin').value;
- if(data !== origin) {
- return '';
- }
- }
- }
- function do_stop_exit_release() {
- do_sync_monaco_and_textarea();
-
- window.onbeforeunload = function () {}
- }
- function opennamu_edit_turn_off_monaco() {
- let now_selected = get_select_editor();
- let editor_list = [
- ['opennamu_edit_textarea', 'none'],
- ['opennamu_monaco_editor', 'none']
- ];
- if(now_selected === 'textarea') {
- editor_list[0][1] = 'block';
- } else if(now_selected === 'monaco') {
- editor_list[1][1] = 'block';
- } else {
- }
- for(let for_a = 0; for_a < editor_list.length; for_a++) {
- document.getElementById(editor_list[for_a][0]).style.display = editor_list[for_a][1];
- }
- }
- function do_monaco_to_textarea(set_value) {
- document.getElementById('opennamu_edit_textarea').value = set_value;
- }
- function do_textarea_to_monaco(set_value) {
- window.editor.setValue(set_value);
- }
- function get_select_editor() {
- let now_selected = document.getElementById("opennamu_select_editor").value;
- if(now_selected === 'default') {
- return 'textarea';
- } else if(now_selected === 'monaco') {
- return 'monaco';
- } else {
- return '';
- }
- }
- function get_select_editor_markup() {
- let now_selected = document.getElementById("opennamu_editor_markup").value;
- if(now_selected === 'namumark' || now_selected === 'namumark_beta') {
- return 'namumark';
- } else if(now_selected === 'markdown') {
- return 'markdown';
- } else {
- return 'plaintext';
- }
- }
- function do_sync_monaco_and_textarea(select = '') {
- let now_selected = get_select_editor();
- if(select === 'textarea_to' || now_selected === 'textarea') {
- let set_value = document.getElementById('opennamu_edit_textarea').value;
- do_textarea_to_monaco(set_value);
- } else if(now_selected === 'monaco') {
- let set_value = window.editor.getValue();
- do_monaco_to_textarea(set_value);
- } else {
- }
- }
- // https://github.com/microsoft/monaco-editor/issues/568
- class PlaceholderContentWidget {
- static ID = 'editor.widget.placeholderHint';
- constructor(placeholder, editor) {
- this.placeholder = placeholder;
- this.editor = editor;
- editor.onDidChangeModelContent(() => this.onDidChangeModelContent());
- this.onDidChangeModelContent();
- }
- onDidChangeModelContent() {
- if(this.editor.getValue() === '') {
- this.editor.addContentWidget(this);
- } else {
- this.editor.removeContentWidget(this);
- }
- }
- getId() {
- return PlaceholderContentWidget.ID;
- }
- getDomNode() {
- if(!this.domNode) {
- this.domNode = document.createElement('div');
- this.domNode.style.width = 'max-content';
- this.domNode.textContent = this.placeholder;
- this.domNode.style.fontStyle = 'italic';
- this.editor.applyFontInfo(this.domNode);
- }
- return this.domNode;
- }
- getPosition() {
- return {
- position: { lineNumber: 1, column: 1 },
- preference: [monaco.editor.ContentWidgetPositionPreference.EXACT],
- };
- }
- dispose() {
- this.editor.removeContentWidget(this);
- }
- }
- function do_monaco_init(monaco_thema) {
- require.config({ paths: { 'vs' : 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.48.0/min/vs' }});
- require.config({ 'vs/nls' : { availableLanguages: { '*' : 'ko' } }});
- require(["vs/editor/editor.main"], function () {
- monaco.languages.register({ id : "namumark" });
- monaco.languages.setMonarchTokensProvider("namumark", {
- tokenizer : {
- root : [
- [/\[/, "namumark-color"],
- [/\]/, "namumark-color"],
-
- [/\{/, "namumark-color"],
- [/\}/, "namumark-color"],
- [/'/, "namumark-color"],
- [/-/, "namumark-color"],
- [/~/, "namumark-color"],
- [/=/, "namumark-color"],
- [/_/, "namumark-color"],
- [/\^/, "namumark-color"],
- [/,/, "namumark-color"],
- [/\\/, "namumark-color"],
- [/\*/, "namumark-color"],
- ],
- },
- });
- let thema_set = [["namumark", "vs"], ["namumark-vs-dark", "vs-dark"]]
- for(let for_a = 0; for_a < thema_set.length; for_a++) {
- monaco.editor.defineTheme(thema_set[for_a][0], {
- base : thema_set[for_a][1],
- inherit : true,
- rules : [
- { token : "namumark-color", foreground : "d94844" },
- ],
- colors : {},
- });
- }
- window.editor = monaco.editor.create(document.getElementById('opennamu_monaco_editor'), {
- value : document.getElementById('opennamu_edit_textarea').value,
- language : 'namumark',
- automaticLayout : true,
- wordWrap : true,
- theme : "namumark" + (monaco_thema === "" ? "" : "-" + monaco_thema)
- });
- if(typeof opennamu_monaco_custom === 'function') {
- opennamu_monaco_custom();
- }
- new PlaceholderContentWidget(document.getElementById('opennamu_edit_textarea').placeholder, window.editor);
- opennamu_do_sync_monaco_markup();
- });
- }
- function opennamu_do_editor_preview() {
- do_sync_monaco_and_textarea();
- const input = document.querySelector('#opennamu_edit_textarea');
- if(input !== null) {
- let name = "test";
- if(document.getElementById('opennamu_editor_doc_name')) {
- name = opennamu_xss_filter_decode(document.getElementById('opennamu_editor_doc_name').value);
- }
- opennamu_do_render('opennamu_preview_area', input.value, name);
- }
- }
- function opennamu_do_sync_monaco_markup() {
- let now_selected = get_select_editor_markup();
- monaco.editor.setModelLanguage(window.editor.getModel(), now_selected);
- }
- function opennamu_do_editor_temp_save() {
- do_sync_monaco_and_textarea();
- const input = document.querySelector('#opennamu_edit_textarea');
- if(input !== null) {
- localStorage.setItem("key", input.value);
- }
- }
- function opennamu_do_editor_temp_save_load() {
- const data = localStorage.getItem("key");
- if(data !== null) {
- const input = document.querySelector('#opennamu_edit_textarea');
- if(input !== null) {
- input.value = data;
- }
-
- do_sync_monaco_and_textarea('textarea_to');
- }
- }
- function opennamu_do_user_editor_insert() {
- let data = prompt();
- if(data !== null && data !== "") {
- let form_data = new FormData();
- form_data.append('data', data);
- fetch('/api/v2/user/setting/editor', {
- method : 'POST',
- body : form_data,
- }).then(function() {
- opennnamu_do_user_editor();
- });
- }
- }
- function opennamu_do_user_editor_delete() {
- let data = prompt();
- if(data !== null && data !== "") {
- let form_data = new FormData();
- form_data.append('data', data);
- fetch('/api/v2/user/setting/editor', {
- method : 'DELETE',
- body : form_data,
- }).then(function() {
- opennnamu_do_user_editor();
- });
- }
- }
- function opennnamu_do_user_editor() {
- fetch('/api/v2/user/setting/editor').then(function(res) {
- return res.json();
- }).then(function(data) {
- if(data["response"] === "ok") {
- let data_html = '';
- for(let for_a = 0; for_a < data["data"].length; for_a++) {
- data_html += '<a href="javascript:do_insert_data(\'' + opennamu_xss_filter(data["data"][for_a]) + '\');">(' + opennamu_xss_filter(data["data"][for_a]) + ')</a> ';
- }
- data_html += '<a href="javascript:opennamu_do_user_editor_insert();">(+)</a> ';
- data_html += '<a href="javascript:opennamu_do_user_editor_delete();">(-)</a>';
- data_html += '<hr class="main_hr">';
- document.getElementById("opennamu_editor_user_button").innerHTML = data_html;
- }
- });
- }
|