# Go — `github.com/minjun0219/mdwire/go`

> 표준 라이브러리만 쓰는 Go 구현의 Render, RenderWith, Options, Streamer, Channel, Repairs 를 설명합니다.

HTML: https://minjun.kim/mdwire/ko/docs/go/

Rust 코어를 Go 로 옮긴 구현이며 표준 라이브러리만 씁니다. 같은 테스트 케이스를 통과하고 무작위 입력과 실제
문서로 Rust 코어와 같은 결과를 출력하는지도 대조합니다. 전체 레퍼런스는
[pkg.go.dev](https://pkg.go.dev/github.com/minjun0219/mdwire/go)에 있습니다.

```sh
go get github.com/minjun0219/mdwire/go@latest
```

## `Render`

```go
import "github.com/minjun0219/mdwire/go"

parts := mdwire.Render(input, mdwire.TelegramHTML) // []string
```

완성된 문서를 변환합니다. 길이 제한을 넘으면 열린 마크업이 없는 지점에서 나눕니다.

## `RenderWith`

```go
out := mdwire.RenderWith(input, mdwire.SlackMarkdown, mdwire.Options{Limit: 4096})
out.Parts                  // []string
out.Repairs.ClosedEmphasis // 아래 Repairs 참고
```

## `Options`

제로 값이 곧 기본값입니다.

```go
type Options struct {
	Limit int         // 0 = 채널의 Limit(). MinLimit(256) 보다 작으면 올림
	HTML  HTMLOptions // HTML 채널에서만
}

type HTMLOptions struct {
	LineBreaks LineBreaks // LineBreaksBR(제로 값) | LineBreaksSpace
	Images     Images     // ImagesLink(제로 값) | ImagesLoad
	Schemes    []string   // nil = http, https, mailto. 목록을 주면 기본값을 대체. nil 이 아닌 빈 슬라이스는 어떤 스킴도 허용하지 않음
}
```

## `Streamer`

```go
s := mdwire.NewStreamer(mdwire.SlackMarkdown)
var out []byte
for _, chunk := range chunks {
	s.PushTo(chunk, &out) // 청크마다 할당 없음
}
s.FinishTo(&out)
```

| | |
|---|---|
| `NewStreamer(ch)` · `NewStreamerWith(ch, opts)` | 문서 하나에 스트리머 하나를 씁니다. |
| `PushTo(chunk, *[]byte)` · `Push(chunk) string` | 지금 보내도 안전한 출력입니다. 할당이 없는 쪽은 `PushTo` 입니다. |
| `FinishTo(*[]byte)` · `Finish() string` | 남은 출력입니다. 열린 마크업은 닫아서 반환합니다. |
| `PreviewTo(*[]byte)` · `Preview() string` | 메시지 전체를 다시 렌더링할 때 붙이는 뒷부분입니다. |
| `CloseOpenTo(*[]byte)` · `CloseOpen() string` | 이미 보낸 블록 마크업만 닫는 뒷부분입니다. |
| `Revised() bool` | `Finish` 다음에 호출합니다. 완성본이 마지막 미리보기와 다른지 알려 줍니다. |
| `Repairs() Repairs` | 지금까지 센 정규화 보고를 반환합니다. |

계약은 [Concepts](https://minjun.kim/mdwire/ko/docs/#%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D-%EA%B3%84%EC%95%BD)에 있습니다.

## `Channel`

```go
const ( TelegramHTML Channel = iota; SlackMarkdown; Plain; GithubMarkdown; HTML; NotionMarkdown )
```

상수의 숫자 값은 `Channels()` 의 순서와 다릅니다. 채널을 저장하거나 주고받을 때는 이름을 쓰세요.

| | |
|---|---|
| `Channels() []Channel` | 모든 채널을 반환합니다. |
| `(Channel) Name() string` · `ParseChannel(string) (Channel, bool)` | 문자열 이름과 채널을 서로 바꿉니다. |
| `(Channel) Limit() int` | 조각 길이 제한을 반환합니다. |

## `Repairs`

```go
type Repairs struct {
	ClosedEmphasis, ClosedFence, RevertedCodeSpan, DroppedMarker, GuessedPair int
	// 채널에 맞춰 바꾼 것
	EscapedChar, TagEmphasis, StrippedHTML, RewrittenBullet, RewrittenTable, ConvertedMarker int
}
```

`Repaired()` 는 하나라도 고쳤는지(앞의 네 필드), `Changed()` 는 고쳤든 바꿨든 하나라도 했는지 알려
줍니다. 각 필드가 세는 것은 [Concepts](https://minjun.kim/mdwire/ko/docs/#%EC%A0%95%EA%B7%9C%ED%99%94-%EB%B3%B4%EA%B3%A0)에 있습니다.

## 표시 폭

`CharWidth(rune) int`, `StrWidth(string) int` 는 고정폭 표에 쓰는 표시 폭 함수입니다.

## CLI

`go install github.com/minjun0219/mdwire/go/cmd/mdwire@latest` 로 Rust 와 같은 CLI 를 설치할 수 있습니다.
플래그도 같고, `-V`/`--version` 만 없습니다. 자세한 내용은 [CLI](https://minjun.kim/mdwire/ko/docs/cli/)를 참고하세요.
