스키마 정의
밑줄 마크 타입의 스키마 정의:
{
underline: {
}
}모델 표현
모델 표현 예제:
{
type: 'text',
text: '밑줄 텍스트',
marks: [{ type: 'underline' }]
}HTML 직렬화
모델을 HTML로 변환:
function serializeUnderlineMark(text, mark) {
return '<u>' + text + '</u>';
}HTML 역직렬화
HTML을 모델로 파싱:
function extractUnderlineMark(element) {
if (element.tagName === 'U') {
return { type: 'underline' };
}
return null;
}뷰 연동
뷰 연동 노트: 이 노드 타입을 뷰 레이어에서 구현할 때 contenteditable 동작, 선택 처리, 이벤트 관리에 특히 주의하세요.
뷰 연동 코드:
// 밑줄 토글
function toggleUnderline() {
const selection = window.getSelection();
if (!selection.rangeCount) return;
const range = selection.getRangeAt(0);
const hasUnderline = hasMarkInSelection(range, 'underline');
if (hasUnderline) {
removeMark('underline');
} else {
addMark({ type: 'underline' });
}
}일반적인 문제
일반적인 함정: 이 노드 타입을 구현할 때 자주 발생하는 문제들입니다. 구현 전에 주의 깊게 검토하세요.
일반적인 문제 및 해결 방법:
// 문제: <u>는 일부 컨텍스트에서 사용 중단됨
// 해결: CSS 또는 style이 있는 <span> 사용 고려
function serializeUnderlineAlternative(text) {
return '<span style="text-decoration: underline">' + text + '</span>';
}
// 문제: 링크와 함께 밑줄
// 해결: 링크 내부의 중첩된 밑줄 처리
function handleUnderlineInLink(link, underline) {
// 링크는 기본적으로 밑줄이 있음
// 의도적인 밑줄을 구분해야 할 수 있음
}구현
완전한 구현 예제:
class UnderlineMark {
constructor() {
this.type = 'underline';
}
toDOM() {
return ['u', 0];
}
static fromDOM(element) {
if (element.tagName === 'U') {
return new UnderlineMark();
}
return null;
}
}