개발하다 마주친 요청사항을 반영하기 위한 여정입니다
참고
국내 회사인 nhn에서 개발한 에디터 라이브러리
요구사항 구체적인 예시
마크다운으로 ${안녕}하세요 라고 쓰면
글에서 안녕하세요로 노출되고
안녕이라는 글자는 버튼이 되어야 한다
커스텀 문법을 어떻게 구현하지 고민하면서 프로젝트 내 다른 기능을 먼저 만들었는데 본격적으로 개발하기 시작하니 생각보단 간단해 보였다 역시 고민보다 고
참고 자료로 올렸던 링크에 이미 예시가 있어서 적용하기 어렵지 않아 보였다...
// 1. 플러그인 함수 생성
function plugin(노드정보){
// 전처리 코드 작성
return{
toHTMLRenderers,
toMarkdownRenderers,
//...
}
}
return (
<Editor
//...
plugins={[plugin]} // 2. 플러그인 적용
/>
)
const plugin = () => {
return {
// Markdown-it 규칙 추가
toHTMLRenderer: {
// HTML 렌더러
span(node) {
if (node.__customToken) {
const value = node.__customToken;
return {
type: 'html',
content: `<button type="button">${value}</button>`,
};
}
},
},
// Markdown 파서
markdownParser: (markdownIt: any) => {
// 커스텀 인라인 rule
markdownIt.inline.ruler.after('escape', 'custom_token', (state, silent) => {
const src = state.src.slice(state.pos);
const match = src.match(/^\$\$\{([^}]+)\}/);
if (!match) return false;
if (silent) return false;
const full = match[0]; // $${안녕}
const content = match[1]; // 안녕
const token = state.push('span_open', 'span', 1);
token.__customToken = content;
const text = state.push('text', '', 0);
text.content = content;
state.pos += full.length;
state.push('span_close', 'span', -1);
return true;
});
},
};
}
역시 기본 개념도 공부하기 좋지만 개념 정리 노트를 블로그에 적는 느낌이라면
프로젝트를 진행하면서 쓰는 글이 더 블로그 답고 재밌는 것 같다