저장된 문서들의 추가/삭제된 이력을 비교할 수 있는 플러그인입니다.

사용방법

플러그인 파일 불러오기

<!-- SynapEditor 객체가 존재해야 적용할 수 있기 때문에 에디터 스크립트 파일 아래에 include 해야 합니다 -->

<script src="documentComparison.min.js의 url"></script>

UI

플러그인 이름인 'documentComparison'을 사용하여 툴바 영역에 버튼을 추가할 수 있습니다.

툴바에 추가

//...
'editor.toolbar': [
    //...,
    'documentComparison',
    //...
],
// ...

메뉴에 추가

//...
'editor.menu.definition': {
	//...,
	'tools': [
		//...,
		'documentComparison',
		//...
	],
	//...
},
//...

플러그인 설정하기

사용 가능한 키

Key


Type

필수

설명

list

url

string

O

  • 요청을 보낼 URL을 설정합니다.

    • 저장된 문서 목록 리스트를 가져오는 API 주소

  • 설정이 되지 않으면 문서 이력 플러그인이 동작하지 않습니다.

headers

string


  • 요청을 보낼 헤더를 설정합니다.

params

string


  • 요청을 보낼 때 함께 보낼 기본 파라미터를 설정합니다.

dataurlstringO
  • 요청을 보낼 URL을 설정합니다.

    • 저장된 문서 목록 리스트 중 하나의 데이터를 가져오는 API 주소

  • 설정이 되지 않으면 문서 이력 플러그인이 동작하지 않습니다.

headersstring
  • 요청을 보낼 헤더를 설정합니다.
paramsstring
  • 요청을 보낼 때 함께 보낼 기본 파라미터를 설정합니다.
paramKeystring
  • 요청을 보낼 때 함께 보낼 파라미터의 Key 값을 설정합니다.


'documentComparison.config': {
        'list': { // 저장된 문서 목록 리스트에 대한 config 설정입니다.
            'url': '/getDocumentVersionList',
            'headers': {},
            'params': {}
        },
        'data': { // 저장된 문서 목록 중 하나의 데이터에 대한 config 설정입니다.
            'url': '/getDocumentVersionData', 
            'headers': {},
            'params': {},
            'paramKey': ''
        }
    }

API 예제 코드:

const express = require('express');
const bodyParser = require('body-parser');
const { fetchEventSource } = require('./modules/FetchEventSource');

const GPT_API_URL = ''; // API URL ex) 'https://api.openai.com/v1/chat/completions'
const GPT_API_KEY = ''; // API KEY

const app = express();
const router = express.Router();

router.post('/request', (request, response) => {
    const bodyData = Object.assign({}, request.body, {
        model: 'gpt-3.5-turbo',
        stream: true
    });

    requestGPT(response, bodyData)
        .then(() => response.end())
        .catch((error) => response.status(error.status).json(error).end());
});

/**
 * GPT 서버로 요청합니다.
 * @param {Response} response
 * @param {Object} bodyData
 * @returns {Promise}
 */
function requestGPT(response, bodyData) {
    const abortController = new AbortController();
    return new Promise(async (resolve, reject) => {
        try {
            await fetchEventSource(GPT_API_URL, {
                method: 'post',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': `Bearer ${GPT_API_KEY}` // OpenAI
                    // 'Api-Key': GPT_API_KEY` // Azure OpenAI
                },
                body: JSON.stringify(bodyData),
                signal: abortController.signal,
                onopen: async (openResponse) => {
                    if (openResponse.status === 200) {
                        response.on('close', () => {
                            abortController.abort();
                            resolve();
                        });
                        response.set({
                            'Cache-Control': 'no-cache',
                            'Connection': 'keep-alive',
                            'Content-Type': 'text/event-stream'
                        });
                        response.flushHeaders();
                        return;
                    }
                    let error;
                    try {
                        const json = await openResponse.json();
                        error = json;
                    } catch (e) {
                        error = e;
                    }
                    error.status = openResponse.status;
                    throw error;
                },
                onclose: () => resolve(),
                onerror: (error) => {
                    reject(error);
                    throw error;
                },
                onmessage: (message) => {
                    if (!message.data || message.event === 'ping') {
                        return;
                    }
                    response.write('data:' + message.data + '\n\n');
                },
            });
        } catch (e) {
            reject(e);
        }
    });
}

app.use(bodyParser.json());
app.use('/', router);
app.listen(8080);