릴리즈 3.0.0 이상
저장된 문서들의 추가/삭제된 이력을 비교할 수 있는 플러그인입니다.
사용방법
플러그인 파일 불러오기
<!-- 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 |
|
headers | string |
| ||
params | string |
| ||
| data | url | string | O |
|
| headers | string |
| ||
| params | string |
| ||
| paramKey | string |
|
에디터 설정
'documentComparison.config': {
'list': { // 저장된 문서 목록 리스트에 대한 config 설정입니다.
'url': '/getDocumentVersionList',
'headers': {},
'params': {}
},
'data': { // 저장된 문서 목록 중 하나의 데이터에 대한 config 설정입니다.
'url': '/getDocumentVersionData',
'headers': {},
'params': {},
'paramKey': ''
}
}
API 예제 코드:
server.js
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);

