ASCII 다이어그램 에디터 - 텍스트 다이어그램 온라인 편집
박스, 화살표, 선을 ASCII 또는 유니코드 텍스트로 그려 코드 주석, 문서, README에 활용하세요 — 100% 클라이언트 사이드, 서버 전송 없음.
자주 묻는 질문
ASCII 다이어그램 에디터란 무엇인가요?
ASCII 다이어그램 에디터는 그리드 기반 캔버스에서 ASCII 또는 유니코드 문자를 사용하여 박스, 선, 화살표, 텍스트를 시각적으로 그릴 수 있는 온라인 도구입니다. 이미지를 생성하는 그래픽 다이어그램 도구와 달리, 이 에디터는 소스 코드 주석, README 파일, 이메일, 터미널 출력, 일반 텍스트 문서에 직접 삽입할 수 있는 순수 텍스트를 출력합니다.
이 ASCII 다이어그램 에디터는 어떻게 사용하나요?
툴바에서 그리기 도구를 선택합니다: 박스, 선, 화살표, 텍스트, 지우기, 자유그리기. 캔버스에서 클릭하고 드래그하여 그립니다. 박스는 한 모서리에서 반대쪽 모서리로 드래그합니다. 문자 세트 토글로 ASCII 모드(+, -, |)와 유니코드 모드(┌, ─, │) 중 선택합니다. 다이어그램이 완성되면 복사 버튼으로 클립보드에 복사하거나 .txt 파일로 다운로드합니다.
내 다이어그램 데이터는 안전한가요? 서버로 전송되나요?
모든 그리기 및 편집 작업은 100% 브라우저 클라이언트 측에서 수행됩니다. 다이어그램 데이터, 캔버스 상태, 사용자 정보가 서버로 전송되지 않습니다. 다이어그램은 브라우저 메모리와 자동 저장을 위한 localStorage에만 존재합니다. 독점 아키텍처 다이어그램이나 보안에 민감한 문서에도 안전하게 사용할 수 있습니다.
ASCII와 유니코드 문자 모드의 차이점은 무엇인가요?
ASCII 모드는 모든 키보드에서 사용 가능한 기본 문자를 사용합니다: 모서리에 +, 가로선에 -, 세로선에 |. 모든 텍스트 편집기와 터미널에서 올바르게 렌더링됩니다. 유니코드 모드는 ┌, ─, │ 같은 박스 그리기 문자를 사용하여 더 깔끔하고 전문적인 다이어그램을 만듭니다. 유니코드 모드에서는 5가지 선 스타일(가는선, 굵은선, 이중선, 점선, 둥근선)도 지원합니다.
기존 ASCII 다이어그램을 가져올 수 있나요?
네. 텍스트 출력 패널의 가져오기 버튼을 클릭하고 기존 ASCII 아트나 텍스트 다이어그램을 붙여넣으세요. .txt 파일을 업로드할 수도 있습니다. 가져온 후에는 모든 그리기 도구를 사용하여 다이어그램을 편집, 확장, 수정할 수 있습니다.
캔버스 크기 제한은 어떻게 되나요?
기본 캔버스는 200열 x 100행(20,000개 문자 셀)입니다. 최대 지원 크기는 500열 x 300행(150,000셀)입니다. 플로우차트, 네트워크 다이어그램, 클래스 계층도 등 대부분의 다이어그램에는 기본 크기로 충분합니다. 에디터는 일반적인 사용 사례에서 부드러운 60fps 인터랙션을 유지하도록 최적화되어 있습니다.
에디터가 작업을 자동 저장하나요?
네. 캔버스 상태는 매 편집 후 500ms 디바운스로 브라우저의 localStorage에 자동 저장됩니다. 페이지를 다시 방문하면 마지막 다이어그램이 자동으로 복원됩니다. localStorage는 브라우저별로 독립적이므로 브라우저를 변경하거나 데이터를 삭제하면 저장된 다이어그램이 사라집니다. 영구 저장을 위해서는 .txt 파일로 내보내세요.
ASCII 다이어그램의 일반적인 사용 사례는 무엇인가요?
ASCII 다이어그램은 다양하게 활용됩니다: 소스 코드 주석(함수 위에 아키텍처 개요 삽입), README 파일(프로젝트 구조, 컴포넌트 관계), RFC 및 기술 명세서(프로토콜 흐름, 메시지 시퀀스), 터미널/CLI 도구(도움말 텍스트, 상태 표시), 이메일 및 채팅(어떤 클라이언트에서든 렌더링되는 빠른 다이어그램), git 커밋 및 PR(의미 있는 텍스트 diff를 생성하는 인라인 다이어그램).
코드 예제
// ASCII Diagram Drawing Primitives
function createGrid(width, height) {
return Array.from({ length: height }, () =>
Array.from({ length: width }, () => ' ')
);
}
function drawBox(grid, x, y, w, h, mode = 'ascii') {
const c = mode === 'unicode'
? { tl: '┌', tr: '┐', bl: '└', br: '┘', h: '─', v: '│' }
: { tl: '+', tr: '+', bl: '+', br: '+', h: '-', v: '|' };
grid[y][x] = c.tl;
grid[y][x + w - 1] = c.tr;
grid[y + h - 1][x] = c.bl;
grid[y + h - 1][x + w - 1] = c.br;
for (let i = x + 1; i < x + w - 1; i++) {
grid[y][i] = c.h;
grid[y + h - 1][i] = c.h;
}
for (let j = y + 1; j < y + h - 1; j++) {
grid[j][x] = c.v;
grid[j][x + w - 1] = c.v;
}
}
function drawArrow(grid, x1, y1, x2, y2) {
if (y1 === y2) {
const [s, e] = x1 < x2 ? [x1, x2] : [x2, x1];
for (let i = s; i <= e; i++) grid[y1][i] = '-';
grid[y1][x2] = x2 > x1 ? '>' : '<';
} else if (x1 === x2) {
const [s, e] = y1 < y2 ? [y1, y2] : [y2, y1];
for (let j = s; j <= e; j++) grid[j][x1] = '|';
grid[y2][x1] = y2 > y1 ? 'v' : '^';
}
}
function exportText(grid) {
return grid.map(row => row.join('').trimEnd())
.join('\n').replace(/\n+$/, '');
}
// Example: Simple flowchart
const grid = createGrid(30, 12);
drawBox(grid, 5, 0, 12, 3);
for (let i = 6; i < 16; i++) grid[1][i] = ' ';
grid[1][8] = 'S'; grid[1][9] = 't'; grid[1][10] = 'a';
grid[1][11] = 'r'; grid[1][12] = 't';
drawArrow(grid, 10, 3, 10, 4);
drawBox(grid, 3, 5, 16, 3);
drawArrow(grid, 10, 8, 10, 9);
drawBox(grid, 5, 10, 12, 3);
console.log(exportText(grid));