Metadata-Version: 2.4
Name: PyUMSN
Version: 2.1.0
Summary: 엄슨(UMSN) 프로그래밍 언어 — 엄슨 ↔ 파이썬 변환기, 실행기, UMSN-IDE
Author: hyjys
License-Expression: MIT
Project-URL: Homepage, https://github.com/hyjys/UMSN-Lang
Project-URL: Source, https://github.com/hyjys/UMSN-Lang
Project-URL: Issues, https://github.com/hyjys/UMSN-Lang/issues
Keywords: umsn,엄슨,esolang,korean,programming-language,transpiler
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Natural Language :: Korean
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX :: Linux
Classifier: Topic :: Software Development :: Compilers
Classifier: Topic :: Education
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: libs
Requires-Dist: numpy; extra == "libs"
Requires-Dist: pandas; extra == "libs"
Requires-Dist: matplotlib; extra == "libs"
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Provides-Extra: release
Requires-Dist: build; extra == "release"
Requires-Dist: twine; extra == "release"
Dynamic: license-file

# 엄슨(UMSN) 프로그래밍 언어

> 우리 학교 유행어 **'엄슨'** 으로 만든 프로그래밍 언어. 파이썬과 1:1로 대응되어 서로 변환할 수 있고,
> 파이썬 라이브러리를 그대로 쓸 수 있습니다.

```
엄슨하다 인사..하이름..다..한
    엄슨한 형"안녕, {이름}! 엄슨!"

엄슨마다 번호 엄속 엄범위..하1..고 4..다..한
    어엄슨 번호 ..나머지 2 ..같슨 0..한
        엄!..하번호..고 "짝수"..다
    슨엄..한
        엄!..하번호..고 "홀수"..다

엄!..하인사..하"엄슨"..다..다
```

위 코드는 아래 파이썬 코드와 **완전히 같습니다** (줄 번호까지 같음).

```python
def 인사(이름):
    return f"안녕, {이름}! 엄슨!"

for 번호 in range(1, 4):
    if 번호 % 2 == 0:
        print(번호, "짝수")
    else:
        print(번호, "홀수")

print(인사("엄슨"))
```

![UMSN-IDE](https://raw.githubusercontent.com/hyjys/UMSN-Lang/main/docs/umsn-ide.png)

## 구성

| 이름 | 설명 |
|---|---|
| **엄슨 언어** (`.umsn`) | 파이썬의 예약어·내장 함수·메소드·문장부호를 엄슨 단어로 바꾼 언어 |
| **PyUMSN** (`pip` 패키지, 모듈 `pyumsn`) | 엄슨 ↔ 파이썬 변환기, 실행기, import 지원, 대화형 셸 |
| **UmsnUMSN** ([`umsnumsn/`](umsnumsn)) | **엄슨 언어로 된** 엄슨 구현체 — PyUMSN 을 `pyumsn -u` 로 바꾼 부트스트래핑 구현체 |
| **`pyumsn`** (명령줄) | 유닉스식 옵션: 실행, `-t`/`-u` 변환, `-n` 검사, `-e` IDE, `-i` 셸, `-w` 단어장 |
| **UMSN-IDE** | **엄슨 언어로 작성된** Tkinter IDE ([`pyumsn/ide/umsn_ide.umsn`](pyumsn/ide/umsn_ide.umsn)) |
| **UMSN-IDE Web** | 설치 없이 브라우저에서 쓰는 정적 웹 IDE ([`web/`](web), Pyodide 314.0.7) |

윈도우와 리눅스를 지원합니다 (파이썬 3.11 ~ 3.14).

## 설치

```bash
pip install PyUMSN            # PyPI 에서 (기본, 의존성 없음)
pip install "PyUMSN[libs]"    # numpy, pandas, matplotlib 까지
```

소스에서 설치하려면:

```bash
git clone https://github.com/hyjys/UMSN-Lang.git
cd UMSN-Lang
pip install .
```

- IDE 와 Tkinter 예제에는 Tkinter 가 필요합니다. 윈도우용 파이썬에는 기본으로 들어 있고,
  리눅스에서는 `sudo apt install python3-tk` (데비안/우분투) 처럼 설치하세요.
- 한글 글꼴(D2Coding, 나눔고딕코딩, 맑은 고딕, Noto Sans CJK KR 중 하나)이 있으면 IDE 가 자동으로 씁니다.

## 명령줄 도구 `pyumsn`

유닉스(POSIX/GNU) 관례를 따르는 옵션 방식입니다. `python` 처럼 파일을 주면 실행하고, 하는 일은 옵션으로 고릅니다.

```
pyumsn [옵션]... [파일.umsn | 폴더 | - | -c 코드 | -m 모듈] [인자]...
pyumsn -t|-u [-aq] [-x 패턴]... [--no-copy] [-o 출력] [파일|폴더]...
pyumsn -n [-q] [-x 패턴]... [파일|폴더]...
pyumsn -e [파일]...
pyumsn -w [-M] [검색어]...
pyumsn --translit 영어이름...  |  --untranslit 엄슨단어...
```

```bash
pyumsn 안녕.umsn 가 나              # 실행 (임시 .py 를 만들어 실행 → 끝나면 삭제), 인자는 프로그램에
pyumsn -k 안녕.umsn                 # 임시 .py 를 남김 / -p : 변환된 파이썬 코드를 먼저 보기
pyumsn -c '엄!..하1 ..더해 2..다'   # 코드 문자열 실행
echo '엄!..하"안녕"..다' | pyumsn   # 표준 입력의 프로그램 실행 (pyumsn - 도 같음)
pyumsn -m 꾸러미 가 나               # 모듈·패키지를 python -m 처럼 실행 (엄슨 패키지의 __main__.umsn 도)
pyumsn                              # 터미널이면 대화형 셸 (엄>>>), -i 로도 열림
pyumsn -t 안녕.umsn                 # 엄슨 → 파이썬 (안녕.py)
pyumsn -u 내프로젝트/ -o 엄슨프로젝트/  # 파이썬 프로젝트를 안쪽 폴더까지 통째로 (아래 참고)
pyumsn -t 안녕.umsn -o -            # -o - 는 표준 출력
pyumsn -t < 안녕.umsn > 안녕.py     # 파일을 안 주면 표준 입력 → 표준 출력 (필터)
pyumsn -u hello.py                  # 파이썬 → 엄슨 (hello.umsn)
pyumsn -ua hello.py                 # 기호 ( ) : , 는 ASCII 그대로 (순한맛, --ascii-symbols)
pyumsn -n 안녕.umsn examples/       # 영어 이름 등 검사 (폴더는 안쪽 폴더까지 .umsn 전부)
pyumsn 엄슨프로젝트/                # 폴더의 __main__.umsn 실행 (python 폴더/ 처럼)
pyumsn -e [파일.umsn]...            # UMSN-IDE
pyumsn -w print                     # 단어장 검색 (-w 만 주면 전체)
pyumsn --translit polyfit           # 영어 이름 → 엄슨 음역
pyumsn -M > docs/VOCABULARY.md      # 전체 단어장을 마크다운으로
```

| 옵션 | 긴 옵션 | 뜻 |
|---|---|---|
| `-c 코드` | `--command=코드` | 코드 문자열 실행 |
| `-m 모듈` | `--module=모듈` | 모듈(엄슨 모듈·패키지 포함)을 `python -m` 처럼 실행. 뒤는 모두 프로그램 인자 |
| `-k` | `--keep` | 임시 파이썬 파일을 지우지 않음 |
| `-p` | `--show-py` | 변환된 파이썬 코드를 먼저 보여줌 (표준 오류) |
| `-i` | `--interactive` | 대화형 셸 |
| `-e` | `--ide`, `--edit` | UMSN-IDE |
| `-t` | `--to-py` | 엄슨 → 파이썬 |
| `-u` | `--to-umsn` | 파이썬 → 엄슨 |
| `-n` | `--check` | 실행하지 않고 검사만 |
| `-o 경로` | `--output=경로` | 출력 파일/폴더 (`-` 는 표준 출력, 피연산자가 여럿이면 폴더) |
| `-x 패턴` | `--exclude=패턴` | (폴더) 이름·경로 패턴에 맞는 파일과 폴더는 건너뜀 (여러 번 가능) |
| | `--no-copy` | (폴더) 다른 폴더로 변환할 때 나머지 파일을 복사하지 않음 |
| `-a` | `--ascii-symbols`, `--keep-symbols` | (`-u`) 기호를 ASCII 그대로 |
| `-q` | `--quiet` | 성공 메시지("만들었슨", "문제 없슨") 끄기 |
| `-w` | `--words` | 단어장 |
| `-M` | `--markdown` | 단어장 전체를 마크다운 표로 |
| | `--translit` / `--untranslit` | 영어 이름 ↔ 엄슨 음역 |
| `-h` / `-V` | `--help` / `--version` | 도움말 / 버전 |

- 짧은 옵션은 묶어 쓸 수 있고(`-tq`), 값은 붙여 써도 됩니다(`-o출력.py`). 긴 옵션은 `--output=파일` 또는 `--output 파일`,
  헷갈리지 않으면 줄여 써도 됩니다(`--to-p`).
- **실행할 때는 파일 이름에서 옵션 읽기를 멈춥니다.** `pyumsn 안녕.umsn -t` 의 `-t` 는 프로그램의 인자입니다 (`python` 과 같음).
  변환·검사처럼 파일을 여러 개 받을 때는 옵션을 파일 뒤에 써도 됩니다 (`pyumsn -t a.umsn -o b.py`, `POSIXLY_CORRECT` 를 따름).
- `--` 뒤는 모두 파일/인자로 읽고, `-` 는 표준 입력(출력)입니다.
- 종료 상태: `0` 성공, `1` 오류, `2` 잘못된 사용법. 실행할 때는 프로그램의 종료 상태를 그대로 돌려줍니다.
- 오류 메시지는 표준 오류로, 결과는 표준 출력으로 나갑니다.

`python -m pyumsn ...` 으로도 똑같이 쓸 수 있습니다.

### 프로젝트를 통째로 변환

`-u` / `-t` 에 폴더를 주면 **안쪽 폴더까지 모두** 들어가 프로젝트 전체를 변환합니다.

```bash
pyumsn -u 내프로젝트 -o 엄슨프로젝트      # 파이썬 프로젝트 → 엄슨 프로젝트
pyumsn 엄슨프로젝트/main.umsn             # 그대로 실행 (패키지·상대 import·자료 파일 모두 동작)
pyumsn -t 엄슨프로젝트 -o 되돌린프로젝트  # 엄슨 → 파이썬: 원래 프로젝트와 똑같이 돌아옴
pyumsn -u 내프로젝트                      # -o 없이: 각 .py 옆에 .umsn 을 만듦 (제자리)
```

- `-o` 로 다른 폴더에 만들면 변환하지 않는 파일(자료, 설정, README 등)도 같은 자리에 **복사**해서 곧바로 실행할 수 있는
  프로젝트가 됩니다. 복사하지 않으려면 `--no-copy`. 변환한 파일과 이름이 겹치는 파일은 복사하지 않습니다.
- `.git`, `__pycache__`, 가상 환경(`.venv`, `pyvenv.cfg` 나 `conda-meta` 가 든 폴더), `node_modules`, `*.egg-info`,
  `.tox`, `.pytest_cache` 같은 폴더는 건너뜁니다. 더 건너뛰려면 `-x tests`, `-x 'docs/*'`, `-x setup.py` 처럼
  이름이나 (`/` 로 쓴) 상대 경로 패턴을 줍니다.
- 출력 폴더가 원본 폴더 안에 있어도 됩니다 (`pyumsn -u . -o 엄슨`). 출력 폴더는 다시 변환하지 않습니다.
- 파일 하나가 실패해도 나머지는 계속 변환하고, 끝에 `변환 N개, 복사 N개, 실패 N개` 를 알려 줍니다 (종료 상태 1).
- 엄슨 모듈 불러오기는 파이썬과 같은 규칙입니다: `패키지/__init__.umsn`, 하위 패키지, `엄에서 .. 엄슨가져와 이름`
  (상대 import) 모두 됩니다. 같은 이름의 `.py` 가 있으면 `.py` 가 먼저입니다.

> 1.x 의 하위 명령(`pyumsn run`, `topy`, `toumsn`, `check`, `ide`, `repl`, `words`)은 2.0 에서 옵션으로 바뀌었습니다.
> 예전 명령을 쓰면 새 옵션을 알려 줍니다: `run` → 파일만, `topy` → `-t`, `toumsn` → `-u`, `check` → `-n`, `ide` → `-e`,
> `repl` → `-i`, `words` → `-w` (`--search 말` → `-w 말`, `--translit` 은 그대로).

## 문법

### 1. 단어 바꾸기

파이썬 예약어·내장 함수·자주 쓰는 메소드는 전부 엄슨 단어가 있습니다. 전체 목록: [docs/VOCABULARY.md](docs/VOCABULARY.md)

| 엄슨 | 파이썬 | 엄슨 | 파이썬 |
|---|---|---|---|
| `엄슨하다` | `def` | `엄!` | `print` |
| `어엄슨` | `if` | `엄?` | `input` |
| `슨엄어엄슨` | `elif` | `엄범위` | `range` |
| `슨엄` | `else` | `엄길이` | `len` |
| `엄슨한` | `return` | `엄목록` | `list` |
| `엄슨마다` | `for` | `엄슨` | `self` |
| `엄슨동안` | `while` | `__엄슨시작__` | `__init__` |
| `엄속` | `in` | `엄붙여` | `.append` |
| `엄슨틀` | `class` | `엄쪼개` | `.split` |
| `엄슨가져와` / `엄에서` / `엄으로` | `import` / `from` / `as` | `엄예외` | `Exception` |
| `엄슨참` / `슨엄거짓` / `엄없슨` | `True` / `False` / `None` | `엄값오류` | `ValueError` |
| `엄시도` / `엄슨예외` / `엄마침내` | `try` / `except` / `finally` | `어엄` | `lambda` |
| `엄그리고` / `엄또는` / `안엄슨` | `and` / `or` / `not` | `엄` | `pass` |

### 2. 문장부호 → `..` 기호어

`..` 뒤에 한글을 붙이면 기호가 됩니다. 앞말에 붙여 써도 됩니다.

| 엄슨 | 파이썬 | 엄슨 | 파이썬 | 엄슨 | 파이썬 |
|---|---|---|---|---|---|
| `..하` | `(` | `..다` | `)` | `..하다` | `()` |
| `..엄` | `[` | `..슨` | `]` | `..엄슨` | `[]` |
| `..어엄` | `{` | `..어슨` | `}` | `..어엄슨` | `{}` |
| `..한` | `:` | `..고` | `,` | `..은` | `=` |
| `..더해` | `+` | `..빼` | `-` | `..곱해` | `*` |
| `..나눠` | `/` | `..몫` | `//` | `..나머지` | `%` |
| `..같슨` | `==` | `..다르슨` | `!=` | `..크슨` / `..작슨` | `>` / `<` |
| `..더해은` | `+=` | `..화살` | `->` | `..바다코끼리` | `:=` |

- 속성 접근 `.` 과 `...` 은 그대로 씁니다: `엄슨.이름`.
- 기호어는 가장 긴 것부터 읽습니다. `..하` 뒤에 `다`로 시작하는 이름이 오면 띄어 쓰세요 (`f..하 다음..다`).
- ASCII 기호 `( ) : , =` 도 그대로 쓸 수 있습니다 (`pyumsn -ua` 결과).

### 3. 한글 전용 규칙 — 영어 이름 금지

엄슨 코드(문자열·주석 밖)의 **모든 이름은 한글·숫자·`_` 만** 쓸 수 있습니다. `print`, `count`, `점수x` 처럼
영문자가 섞인 이름은 변환기(`topy`)·실행기(`run`)·IDE 가 **실행 전에 거부**합니다.

```
엄슨 문법 오류 (영어.umsn 2줄 1칸): 영어 이름 'count' 는 쓸 수 없슨! 한글 이름을 쓰거나 '엄세어' 를 쓰세요.
    count ..은 점수 ..더해 1
    ^^^^^
```

단어장에 없는 영어 이름(라이브러리 함수 등)은 **음역**으로 씁니다. 표지 `외_` 뒤에 알파벳을 한 글자씩
한글로 적고(대문자는 앞에 `대`), 숫자와 `_` 는 그대로 둡니다. 음역은 원래 이름으로 정확히 되돌아갑니다.

| a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 아 | 브 | 크 | 드 | 에 | 프 | 그 | 흐 | 이 | 즈 | 키 | 르 | 므 | 느 | 오 | 피 | 쿠 | 러 | 스 | 트 | 우 | 뷔 | 워 | 엑 | 야 | 지 |

예: `넘엄.외_피오르야프이트(...)` = `np.polyfit(...)`. `pyumsn --translit 이름` 이나 IDE 의 **도움말 → 음역 도구**를 쓰면 편합니다.

파이썬 → 엄슨 변환(`toumsn`)은 사전에 없는 영어 이름을 자동으로 음역하므로, 결과는 항상 이 규칙을 지킵니다.
한글 이름이 엄슨 단어와 겹치면 `$엄슨` 처럼 `$` 를 붙여 "그냥 이름"으로 씁니다.

### 4. 문자열·주석·docstring 은 그대로

따옴표 안의 글자, `#` 주석, docstring 은 한 글자도 바뀌지 않습니다. 문자열 접두사만 한글로 씁니다.

| 엄슨 | 파이썬 |
|---|---|
| `형"안녕 {이름}"` | `f"안녕 {이름}"` (중괄호 안은 엄슨 코드) |
| `날"\d+"` | `r"\d+"` |
| `바"..."` / `유"..."` | `b"..."` / `u"..."` |
| `형날"..."`, `날바"..."`, `대형"..."` | `fr"..."`, `rb"..."`, `F"..."` |
| `템"안녕 {이름}"` | `t"안녕 {이름}"` (파이썬 3.14 템플릿 문자열) |

### 5. UTF-8 전용

엄슨은 **무조건 UTF-8** 만 씁니다. UTF-8 이 아닌 파일(CP949, UTF-16 등)이나 다른 인코딩 선언이 있는 파일은
추측하지 않고 거부합니다. 모든 출력 파일은 BOM 없는 UTF-8 이고, 실행되는 프로그램도 UTF-8 모드
(`PYTHONUTF8=1`)로 돌아가서 윈도우 콘솔에서도 한글이 깨지지 않습니다.

## 파이썬 라이브러리 쓰기

모든 파이썬 라이브러리를 `엄슨가져와` 로 쓸 수 있고, 자주 쓰는 라이브러리는 `라이브러리 이름 + 엄슨` 단어가 있습니다.

| 엄슨 | 파이썬 | 자주 쓰는 단어 예 |
|---|---|---|
| `티킨터엄슨` (`티엄`) | `tkinter` (`tk`) | `창엄슨`=Tk, `버튼엄슨`=Button, `라벨엄슨`=Label, `배치엄슨`=pack, `엄슨루프`=mainloop, `글엄슨`=text, `명령엄슨`=command |
| `넘파이엄슨` (`넘엄`) | `numpy` (`np`) | `배열엄슨`=array, `영배열엄슨`=zeros, `범위배열엄슨`=arange, `평균엄슨`=mean, `모양바꿔엄슨`=reshape |
| `판다스엄슨` (`판엄`) | `pandas` (`pd`) | `데이터프레임엄슨`=DataFrame, `씨에스브이읽어엄슨`=read_csv, `머리엄슨`=head, `묶어보기엄슨`=groupby |
| `맷플롯립엄슨`, `파이플롯엄슨` (`플엄`) | `matplotlib`, `pyplot` (`plt`) | `그려엄슨`=plot, `보여엄슨`=show, `가로이름엄슨`=xlabel, `범례엄슨`=legend |
| `수학엄슨`, `랜덤엄슨`, `운영체제엄슨`, `시스템엄슨`, `시간엄슨`, `제이슨엄슨`, `거북엄슨` … | `math`, `random`, `os`, `sys`, `time`, `json`, `turtle` … | `제곱근엄슨`=sqrt, `랜덤정수엄슨`=randint, `잠자엄슨`=sleep |

```
엄슨가져와 넘파이엄슨 엄으로 넘엄
배열 ..은 넘엄.배열엄슨..하..엄1..고 2..고 3..슨..다
엄!..하넘엄.평균엄슨..하배열..다..다
```

`.umsn` 파일끼리도 import 됩니다: `엄슨가져와 계산기` → 같은 폴더의 `계산기.umsn`,
`엄슨가져와 꾸러미.모듈` → `꾸러미/__init__.umsn` 과 `꾸러미/모듈.umsn`.

예제: [`examples/`](examples) — 안녕, 구구단, 클래스, 넘파이, 판다스, 맷플롯, 티킨터 계산기.

## UmsnUMSN — 엄슨으로 된 엄슨

[`umsnumsn/`](umsnumsn) 은 PyUMSN(변환기·실행기·검사기·대화형 셸·명령줄 전부)을 **엄슨 언어로** 바꾼
부트스트래핑 구현체입니다. 손으로 옮긴 것이 아니라 `pyumsn` 명령으로 폴더째 변환해서 만듭니다.

```bash
pyumsn -u pyumsn -o umsnumsn        # PyUMSN → UmsnUMSN (PyUMSN 을 고친 뒤 이것만 다시 실행)
```

저장소 뿌리에서 `pyumsn -m umsnumsn` 으로 실행하며, 옵션은 `pyumsn` 과 똑같습니다.

```bash
pyumsn -m umsnumsn -V                      # UmsnUMSN (umsnumsn) 2.1.0
pyumsn -m umsnumsn examples/구구단.umsn     # 엄슨으로 된 실행기로 실행
pyumsn -m umsnumsn -t examples/안녕.umsn    # 엄슨으로 된 변환기로 변환
```

**부트스트랩 고정점** — 테스트([`tests/test_umsnumsn.py`](tests/test_umsnumsn.py))에서 확인합니다.

1. `pyumsn -u pyumsn -o umsnumsn` 의 결과가 저장소의 `umsnumsn/` 과 같다 (다시 만드는 것을 잊지 않도록).
2. UmsnUMSN 이 **자기 자신을** 파이썬으로 바꾸면 (`pyumsn -m umsnumsn -t umsnumsn`) PyUMSN 과 한 글자도 다르지 않다.
3. UmsnUMSN 이 PyUMSN 을 엄슨으로 바꾸면 (`pyumsn -m umsnumsn -u pyumsn`) UmsnUMSN 자신이 나온다.
4. 예제 실행 결과·오류 메시지·종료 상태가 PyUMSN 과 같다.

엄슨 코드는 파이썬 위에서 돌기 때문에 UmsnUMSN 을 처음 띄우는 일(엄슨 모듈 불러오기)은 PyUMSN 이 맡습니다.
그 뒤의 변환·검사·실행은 모두 엄슨으로 된 코드가 합니다.

## UMSN-IDE

`pyumsn -e` 로 실행합니다. IDE 자체가 엄슨 언어로 작성되어 있습니다 ([`pyumsn/ide/umsn_ide.umsn`](pyumsn/ide/umsn_ide.umsn)).

- **엄슨 구문 강조** — 예약어, 내장 함수, 라이브러리 단어, `..` 기호어, `엄!`, 음역어, 문자열, 주석, 숫자를 색으로 구분
- **실시간 한글 전용 검사** — 영어 이름에 빨간 밑줄, 오른쪽 클릭 → 사전 단어/음역으로 바꾸기
- **`엄슨!` 버튼 (F5)** — 실행 결과가 아래 콘솔에 실시간 표시, `입력 ▸` 칸으로 `엄?`(input) 에 답하기, `■ 멈춰` (Shift+F5)
- 오류 줄 클릭 → 해당 줄로 이동, 오류 메시지는 엄슨 이름으로 (예: `엄영나누기오류`)
- 줄 번호, 현재 줄 강조, 괄호 짝 표시 (`..하`/`..다` 포함), 자동 들여쓰기 (`..한` 뒤), Tab/Shift+Tab, 주석 토글 (Ctrl+/)
- 여러 탭, 새로 만들기/열기/저장, 최근 파일, 저장 안 한 변경 경고
- 자동 완성 (Ctrl+Space), 엄슨 단어장 패널 (F1, 검색 + 두 번 눌러 넣기)
- 파이썬 코드 보기 (F6), 엄슨 검사 (F7), `.py` 가져오기/내보내기
- 찾기/바꾸기 (Ctrl+F), 줄로 이동 (Ctrl+G), 어두운/밝은 테마 (F9), 글자 크기 (Ctrl +/−, Ctrl+휠)

## UMSN-IDE Web

설치 없이 브라우저에서 엄슨을 쓰고 실행하는 정적 웹 IDE 입니다 ([`web/`](web)). 파이썬은
[Pyodide](https://pyodide.org) **314.0.7** (파이썬 3.14, WebAssembly) 로 브라우저 안에서 돌고, 서버는 파일만 주면 됩니다.
글꼴은 [D2Coding](https://github.com/naver/d2codingfont) 을 씁니다 (편집기·콘솔·맷플롯립 그림의 한글).

- 데스크톱 IDE 와 같은 구문 강조·실시간 한글 전용 검사 (빨간 물결 밑줄, 오른쪽 클릭으로 사전 단어/음역으로 바꾸기)
- `엄슨! ▶` (F5) 실행, 콘솔의 `입력 ▸` 칸으로 `엄?`(input) 에 답하기, `■ 멈춰` (Shift+F5), 프로그램 인자
- 오류 줄 클릭 → 그 줄로 이동, 오류 메시지는 `pyumsn` 과 똑같이 엄슨 이름으로
- 여러 파일(탭) — 열린 `.umsn` 끼리 `엄슨가져와` 가능, 자료 파일 올리기, 프로그램이 만든 파일 내려받기
- 넘파이·판다스·맷플롯립은 처음 쓸 때 자동으로 받아 오고, 그림은 콘솔에 표시
- 파이썬 보기 (F6), `.py` 열기(엄슨으로 변환)·내보내기, 단어장 (F1), 음역 도구, 자동 완성 (Ctrl+Space)
- 찾기/바꾸기, 줄로 이동, 주석 토글, 어두운/밝은 테마, 글자 크기, 코드를 담은 공유 링크
- `.umsn` 파일은 브라우저(localStorage)에 저장됩니다

로컬에서 쓰려면 저장소 뿌리에서 정적 서버를 띄우고 `/web/` 을 엽니다.

```bash
python -m http.server 8000     # → http://localhost:8000/web/
```

GitHub Pages 에는 [`.github/workflows/pages.yml`](.github/workflows/pages.yml) 이 `web/` + `pyumsn/` + `examples/` 를 모아
올립니다 (저장소 **Settings → Pages → Source** 를 **GitHub Actions** 로 한 번 설정). 다른 정적 호스팅에 올릴 때도 같은 모양
(`index.html` 옆에 `pyumsn/`, `examples/`)으로 두면 됩니다.

- 실행 중 `엄?` 에 바로 답하고 멈추려면 SharedArrayBuffer 가 필요합니다. 정적 호스팅은 헤더를 못 바꾸므로 함께 든
  서비스 워커(`sw.js`)가 COOP/COEP 헤더를 붙여 줍니다 (첫 방문 때 한 번 새로 고침). 이것이 안 되는 환경에서는
  실행 전에 입력 칸에 적어 둔 줄이 차례로 `엄?` 에 들어가고, `■ 멈춰` 는 실행기를 새로 띄웁니다.
- 티킨터(tkinter)·거북(turtle) 창은 브라우저에서 열 수 없습니다. 그런 프로그램은 데스크톱 UMSN-IDE (`pyumsn -e`) 를 쓰세요.

## 파이썬에서 쓰기

```python
import pyumsn

pyumsn.umsn_to_py('엄!..하"안녕"..다')        # 'print("안녕")'
pyumsn.py_to_umsn('print("안녕")')             # '엄!..하"안녕"..다'
pyumsn.check_umsn("count ..은 1")             # [(1, 0, 5, "영어 이름 'count' 는 ...")]
pyumsn.run_file("안녕.umsn")                   # 실행, 종료 코드 반환
pyumsn.install_import_hook()                   # import 로 .umsn 모듈 불러오기
```

## 동작 방식

- 변환은 **토큰 단위**입니다. 문자열·주석은 원문 그대로, 이름·기호만 사전으로 바꿉니다. 그래서 줄 번호가 그대로라
  오류 위치가 엄슨 파일의 줄과 정확히 맞습니다.
- `pyumsn 파일.umsn` 은 엄슨을 파이썬으로 바꿔 **임시 `.py` 파일**을 만들고, 그것을 원래 `.umsn` 파일 이름으로 실행합니다.
  그래서 오류 추적 기록에 엄슨 소스 줄이 보입니다. 임시 파일은 실행이 시작되면 바로 지워집니다 (`--keep` 으로 보존).
- 파이썬 → 엄슨 → 파이썬 왕복은 원문과 같습니다 (기호어가 붙어서 헷갈릴 때만 공백 한 칸이 들어감).
  테스트에서 파이썬 표준 라이브러리 파일들로 확인합니다.

## 개발

```bash
pip install -e ".[test]"
python -m pytest
```

`pyumsn/` 을 고쳤으면 `pyumsn -u pyumsn -o umsnumsn` 으로 UmsnUMSN 을 다시 만들어 함께 커밋합니다
(모듈을 지웠다면 `umsnumsn/` 의 그 파일도 지움). 안 하면 테스트가 알려 줍니다.

### PyPI 배포

1. `pyumsn/__init__.py` 의 `__version__` 을 올린다 (예: `2.1.0`). 같은 버전은 PyPI 에 다시 올릴 수 없다.
2. `main` 에 병합한 뒤 GitHub 에서 **Release** 를 만든다. 태그는 `v` + 버전 (예: `v2.1.0`).
3. `.github/workflows/publish.yml` 이 테스트 → 빌드 → PyPI 업로드를 자동으로 한다 (Trusted Publishing, 토큰 불필요).
   TestPyPI 로 먼저 시험하려면 Actions 탭에서 **Publish** 워크플로를 수동 실행하고 `testpypi` 를 고른다.

손으로 올릴 때는 `pip install -e ".[release]"`, `python -m build`, `twine check dist/*`, `twine upload dist/*`.

IDE 의 한국어 입력(IME)은 운영체제의 Tk 지원에 따릅니다.

## 라이선스

[MIT License](LICENSE)
