← 목록
기타 2026-07-12 4KB 읽기 3분

크라우니워드프로세서 기초도구 — HTML왕복

개요

크라우니워드프로세서 기초도구 시리즈의 "HTML왕복" 도메인. 문서 내부 표현(런 속성·문단정렬·표·이미지)을 HTML로 내보내고, HTML을 다시 파싱해 되돌리는 왕복 변환을 완전 한선씨로 구현.

무엇을 했는지

  • 파일: /Users/ef/crowny-word/도구/HTML왕복.한선 (자기완결, 가져오기 없음)
  • 공개 함수(요구 10종 전부 + 보조 4종):
  • 인라인CSS생성 — 서식런 속성 토큰(굵게/기울임/밑줄/크기:N/색:V/배경:V/정렬:V) → CSS 선언
  • 내보내기확장(타입,페이로드) — 디스패처. 하위: 런투span, 문단투p, 표투table, 이미지투img
  • 목록ul변환 / 목록ol변환
  • 태그스택파서(html) — p/b/i/h1~3/li만 허용, 스택으로 짝 검증 → "OK:N"/"MISMATCH:.."/"EXTRA_CLOSE:.."/"UNCLOSED:N"/"UNKNOWN_TAG:.."
  • 스택짝검증 — 위 파서를 1/-1 불리언으로
  • 태그속성파싱 — 태그 문자열 → ["key=value",..] (따옴표 값 내부 공백 정확히 처리)
  • HTML문서변환(html) — 역변환. 블록(p/h1~3/li) 단위로 추출, 내부 인라인(b/i) 태그 제거 + 엔티티 디코드
  • 엔티티디코드 — & < > " ' 5종
  • 태그제거플레인 — 태그 제거 + 엔티티 디코드 (innerText 대응)
  • 왕복시험함수(정렬,텍스트) — 문단 내보내기→불러오기 왕복 후 원문 일치 검증(1/-1), 재사용 가능한 공개 검증기
  • 내부 헬퍼: 나누기/합치기 없이 나누기만(합치기 불요), 인덱스찾기(부분문자열 검색), 전체바꾸기(전역 치환, 엔티티 인/디코드에 재사용), 시작하나, 태그 파싱 보조(태그닫힘인가/자체닫힘인가/태그이름추출/허용태그인가/블록태그인가/정렬CSS)
  • 표 데이터는 행렬을 평면 배열(행*열)로 표현 — 배열 1023캡 회피 관례를 따름
  • 자체시험 30개 assert 전부 PASS (검사: PASS 30/30)
  • 함정/교훈

    • 통과 = 통과 + 검사(...) 인라인 함수호출 누적식이 조용히 소실되는 VM 함정을 실측 재현(1차 실행 시 개별 PASS 30개 출력되지만 합계는 "PASS 1/30"). 임시변수(변수 r1 = 검사(...); 통과 = 통과 + r1)로 전부 수정 후 "PASS 30/30" 확정.
    • \" 이스케이프와 != 비교연산자가 hanseonc_high에서 정상 컴파일됨을 사전 스모크테스트로 확인 후 본작업 진행(두 함정 모두 아님으로 판명, 별도 우회 불필요).
    • 엔티티 디코드 순서: 명명 엔티티(</>/"/') 먼저, & 마지막 — 역순이면 < 같은 이중이스케이프가 잘못 풀림.

    관련 파일

    • /Users/ef/crowny-word/도구/HTML왕복.한선 (신규, 이번 작업 산출물)
    • 참고(재사용 검토, 이식 없이 컴파일 확인만): /Users/ef/crowny-word/도구/서식런.한선 (나누기/합치기/속성토큰 관례), /Users/ef/crowny-word/도구/문단배치.한선 (정렬/워드랩 관례)
    • 학습DB 등재: crownycode-learn.sh add HTML태그스택파서, HTML태그속성파싱, HTML엔티티디코드5종, HTML내보내기확장디스패처

    잔여 이슈

    • HTML문서변환은 블록 태그 동일종류 중첩을 가정하지 않음(p 안에 p 없음) — 표준 워드프로세서 export 범위에선 문제 없으나 임의 HTML 전체 파서는 아님(범위 밖, 명세대로 p/b/i/h1~3/li 한정).
    • 표/셀 값에 탭·개행이 포함되면 페이로드 직렬화가 깨짐(TSV/CSV 공통 제약) — 실제 연동 시 셀 값 이스케이프 규약 추가 필요.