수학 노드 타입

카테고리: 커스텀 • 뷰 연동 노트를 포함한 상세 구현 가이드

스키마 정의

수학 노드 타입의 스키마 정의:

{
  math: {
    group: 'block',
    attrs: {
      formula: { default: '' },
      display: { default: false }
    },
  }
}

모델 표현

모델 표현 예제:

{
  type: 'math',
  attrs: {
    formula: 'E = mc^2',
    display: true
  }
}

HTML 직렬화

모델을 HTML로 변환:

function serializeMath(node) {
  return '<div data-type="math" data-display="' + node.attrs.display + '">' + 
         escapeHtml(node.attrs.formula) + '</div>';
}

HTML 역직렬화

HTML을 모델로 파싱:

function parseMath(domNode) {
  return {
    type: 'math',
    attrs: {
      formula: domNode.textContent || '',
      display: domNode.getAttribute('data-display') === 'true'
    }
  };
}

뷰 연동

뷰 연동 노트: 이 노드 타입을 뷰 레이어에서 구현할 때 contenteditable 동작, 선택 처리, 이벤트 관리에 특히 주의하세요.

뷰 연동 코드:

// 수학 렌더링
const math = document.createElement('div');
math.setAttribute('data-type', 'math');
math.setAttribute('data-display', node.attrs.display);
math.textContent = node.attrs.formula;
math.contentEditable = 'false'; // 수학은 일반적으로 렌더링되며 직접 편집되지 않음

// MathJax 또는 KaTeX로 렌더링
function renderMath(element) {
  if (window.MathJax) {
    MathJax.typesetPromise([element]);
  } else if (window.katex) {
    katex.render(element.textContent, element, { displayMode: element.getAttribute('data-display') === 'true' });
  }
}

일반적인 문제

일반적인 함정: 이 노드 타입을 구현할 때 자주 발생하는 문제들입니다. 구현 전에 주의 깊게 검토하세요.

일반적인 문제 및 해결 방법:

// 문제: 수학 렌더링 라이브러리
// 해결: MathJax 또는 KaTeX 사용
function initMathRenderer() {
  if (window.MathJax) {
    MathJax.startup.defaultReady();
  }
}

// 문제: 수학 공식 검증
// 해결: LaTeX 구문 검증
function validateMathFormula(formula) {
  // 기본 검증 또는 LaTeX 파서 사용
  return formula.length > 0;
}

구현

완전한 구현 예제:

class MathNode {
  constructor(attrs) {
    this.type = 'math';
    this.attrs = {
      formula: attrs?.formula || '',
      display: attrs?.display || false
    };
  }
  
  toDOM() {
    const math = document.createElement('div');
    math.setAttribute('data-type', 'math');
    math.setAttribute('data-display', this.attrs.display);
    math.textContent = this.attrs.formula;
    return math;
  }
  
  static fromDOM(domNode) {
    return new MathNode({
      formula: domNode.textContent || '',
      display: domNode.getAttribute('data-display') === 'true'
    });
  }
}