이번 기술 블로그에서는 Draft.js를 사용하여 텍스트 에디터에서 블록 병합 및 분할 기능을 구현하는 방법에 대해 알아보겠습니다. Draft.js는 React를 기반으로 한 강력한 텍스트 에디팅 라이브러리로, Rich Text 기능을 쉽게 구현할 수 있습니다.
Draft.js란?
Draft.js는 Facebook에서 개발한 오픈 소스 텍스트 에디팅 라이브러리로, React 컴포넌트 기반의 방식으로 동작합니다. Draft.js를 사용하면 텍스트 에디터를 빠르고 쉽게 구현할 수 있으며, 다양한 Rich Text 기능을 추가할 수 있습니다.
블록 병합 기능 구현하기
먼저, 텍스트 에디터에서 연속된 블록을 병합하는 기능을 구현해보겠습니다. 이 기능을 구현하기 위해서는 Draft.js의 ContentState를 사용해야 합니다.
import { Modifier, EditorState } from 'draft-js';
// 블록을 병합하는 함수
function mergeBlocks(editorState) {
const content = editorState.getCurrentContent();
const selection = editorState.getSelection();
// 현재 선택된 블록 이전의 블록 가져오기
const previousBlock = content.getBlockBefore(selection.getStartKey());
// 현재 선택된 블록 가져오기
const currentBlock = content.getBlockForKey(selection.getStartKey());
// 현재 블록의 텍스트 가져오기
const currentText = currentBlock.getText();
// 이전 블록의 텍스트 가져오기
const previousText = previousBlock.getText();
// 이전 블록의 텍스트와 현재 블록의 텍스트를 병합
const mergedText = previousText + currentText;
// 이전 블록에 병합된 텍스트 적용
const newContentState = Modifier.replaceText(
content,
selection.merge({
anchorKey: previousBlock.getKey(),
anchorOffset: 0,
focusKey: currentBlock.getKey(),
focusOffset: currentText.length
}),
mergedText
);
const newEditorState = EditorState.push(
editorState,
newContentState,
'merge-blocks'
);
return EditorState.forceSelection(newEditorState, selection);
}
위의 코드는 mergeBlocks라는 함수를 통해 블록을 병합할 수 있는 기능을 구현한 예시입니다. 이 함수를 적절한 이벤트 핸들러와 연결하여 사용할 수 있습니다.
블록 분할 기능 구현하기
이제 텍스트 에디터에서 선택한 위치에서 블록을 분할하는 기능을 구현해보겠습니다. 마찬가지로 ContentState를 사용하여 구현할 수 있습니다.
import { Modifier, EditorState } from 'draft-js';
// 블록을 분할하는 함수
function splitBlock(editorState) {
const content = editorState.getCurrentContent();
const selection = editorState.getSelection();
// 현재 선택된 블록 가져오기
const currentBlock = content.getBlockForKey(selection.getStartKey());
// 분할된 텍스트 생성
const splitText = currentBlock.getText().slice(0, selection.getStartOffset());
// 분할된 텍스트를 기준으로 블록 분할
const [contentWithNewBlock, newBlock] = Modifier.splitBlock(
content,
selection,
);
const newContentState = Modifier.replaceText(
contentWithNewBlock,
newBlock.getSelectionAfter(),
splitText
);
const newEditorState = EditorState.push(
editorState,
newContentState,
'split-block'
);
return EditorState.forceSelection(newEditorState, newBlock.getSelectionAfter());
}
위의 코드는 splitBlock이라는 함수를 통해 블록을 분할하는 기능을 구현한 예시입니다. 이 함수를 적절한 이벤트 핸들러와 연결하여 사용할 수 있습니다.
마무리
이번 포스트에서는 Draft.js를 사용하여 텍스트 에디터에서 블록 병합 및 분할 기능을 구현하는 방법에 대해 알아보았습니다. Draft.js는 강력한 기능을 제공하며, 커스터마이즈도 용이합니다. 다양한 Rich Text 에디터 기능 추가에 활용해보세요!
참고 자료
- Draft.js 공식 문서: https://draftjs.org/
- Draft.js GitHub 저장소: https://github.com/facebook/draft-js
- React 공식 문서: https://reactjs.org/