Percentage

쌓으면,
보입니다.

나무위키와 같은 구조와 기능을 목표로 하는 한국어 개방형 위키입니다. 위키 문법 PerMark의 파서를 외부 라이브러리 없이 직접 만들었고, Next.js와 Supabase 위에서 문서, 역사, 토론까지 돌아갑니다.

Next.js 16, React 19, TypeScript, Supabase

요약

7,471줄
TypeScript 코드
1,980줄
PerMark 렉서, 파서, 렌더러
약 200개
Vitest 테스트 케이스
7개
Supabase 마이그레이션

슬로건

“쌓으면, 보입니다.”는 편집이 한 번씩 쌓여서(리비전) 지식이 드러난다는 뜻입니다. 빈 문서 안내나 푸터 같은 화면 문구도 이 말투에 맞춰 씁니다.

나무위키의 기능, 구조, 문법 사양은 참고하지만 로고, 마스코트, CSS, 문서 본문은 가져오지 않습니다. 테스트용 문서도 직접 쓴 내용만 쓰고, 라이선스는 CC BY-NC-SA 2.0 KR 기준 문구를 따로 작성해 표시합니다.

PerMark

Percentage 문서를 쓰는 위키 문법입니다. 제목, 굵게와 기울임, 내부 링크, 각주, 표, 접기 블록, 목차, 틀 불러오기, 분류를 지원합니다.

== 개요 ==
[목차]
'''폰 노이만 구조'''는 명령어와 데이터를 같은 메모리에 두는 방식이다.[* 1945년 EDVAC 보고서 초안]

=== 등장 배경 ===
* [[ENIAC]]은 계산을 바꿀 때마다 배선을 다시 했다.
* 자세한 건 [[프로그램 내장 방식|이 문서]] 참고.

|| 기계 || 시기 ||
|| Manchester Baby || 1948 ||

{{{#!folding 여담
''이름''을 두고 논란이 있다.
}}}

[include(틀:컴퓨터 구조)]
[각주]
[[분류:컴퓨터 구조]]

파서가 알아듣는 요소는 이 밖에도 취소선, 인라인 코드, 코드 블록, 글자 크기와 색 블록, 파일 링크, 리다이렉트, 날짜·나이·D-day·루비·앵커·페이지 수 매크로가 있습니다.

직접 만든 이유

위키 문법은 마크다운과 규칙이 달라서 외부 마크다운 라이브러리를 쓰지 않고 렉서, 파서, 렌더러를 전부 직접 구현했습니다. 잘못 닫히거나 안 닫힌 서식은 에러를 내지 않고 원문 그대로 남깁니다.

작은 부분도 신경 썼습니다. 제목은 앞뒤 =의 개수가 정확히 같아야 인식하는데, 역참조 정규식 /^(={1,6})(.+?)\1\s*$/은 == 개요 = 같은 줄에서 여분의 =를 본문으로 삼켜 버립니다. 그래서 앞뒤 =를 따로 세서 비교합니다. [include(...)]도 한 줄 전체가 정확히 그 형태일 때만 틀 블록으로 펼칩니다.

처리 과정

원문PerMark Lexer블록 토큰177줄 ParserAST1,075줄 틀 전개include.ts RendererReact728줄 문서/w/제목 보기 저장 편집 저장서버 액션 revisions리비전 누적 역사 · 비교diff backlinks역링크 분류document_categories
문서를 볼 때와 저장할 때의 흐름
lib/namumark/ 줄 수 (합계 1,980줄) lexer.ts 177줄 parser.ts 1,075줄 renderer.tsx 728줄
PerMark 처리 코드의 구성

기능

구현한 기능
구분기능
문서보기, 편집, 역사, 두 리비전 비교(diff), 이동, 삭제, 되돌리기, 리다이렉트
연결역링크, 분류, 틀 불러오기
참여토론, 편집 요청, 신고
탐색최근 변경, 검색
계정로그인, 가입, 설정, 프로필
관리문서별 ACL, IP 처리, 요청 횟수 제한

마크다운 변환

이미 가진 노트나 README를 옮기기 쉽게 마크다운을 PerMark로 바꾸는 스크립트를 만들었습니다. 제목, 굵게·기울임·취소선, 인라인 코드, 링크, 이미지, 목록과 체크박스, 인용, 수평선, 코드 블록, GFM 표를 변환합니다.

bun run convert:md <입력.md> [출력파일]

데이터

ORM 없이 Supabase JS 클라이언트와 supabase gen types로 만든 타입을 씁니다. 문서 저장, 되돌리기, 이동처럼 여러 테이블을 함께 바꾸는 작업은 Postgres 함수나 트랜잭션으로 한 번에 처리합니다.

테이블
테이블내용
profiles사용자 프로필
documents문서
revisions문서의 편집 기록
document_categories문서와 분류의 연결
backlinks문서 사이의 링크
discussions, discussion_comments토론과 댓글
edit_requests편집 요청
reports신고

품질 기준

작업이 끝났다고 보는 기준은 네 가지를 모두 통과하는 것입니다.

bun run lint && bun run typecheck && bun run test && bun run build

테스트는 렉서와 렌더러, 마크다운 변환, diff, ACL, IP 처리, 요청 제한, 문서 제목과 사용자 이름 규칙까지 약 200개입니다.

기록

  1. Next.js로 시작, 레이아웃과 ACL, IP 유틸리티
  2. PerMark 렌더러와 문단 나누기, 나무위키형 화면
  3. 마크다운 변환, 토론·편집 요청·신고, 로그인·가입·설정