Documentation
¶
Overview ¶
Package mdwire 는 에이전트가 만든 마크다운을 채팅 채널로 안전하게 내보낸다.
Rust 코어(crates/mdwire-core)의 Go 이식이다. **코퍼스가 정본이다** — 두 구현은 같은 corpus/cases 를 통과해야 하고, 규칙이 갈리면 코퍼스가 판정한다. 의존은 표준 라이브러리뿐이다.
Index ¶
- Constants
- func CharWidth(c rune) int
- func Render(input string, ch Channel) []string
- func StrWidth(s string) int
- type Channel
- type Dialect
- type HTMLOptions
- type Images
- type LineBreaks
- type Options
- type Rendered
- type Repairs
- type Streamer
- func (s *Streamer) CloseOpen() string
- func (s *Streamer) CloseOpenTo(dst *[]byte)
- func (s *Streamer) Finish() string
- func (s *Streamer) FinishTo(dst *[]byte)
- func (s *Streamer) Preview() string
- func (s *Streamer) PreviewTo(dst *[]byte)
- func (s *Streamer) Push(chunk string) string
- func (s *Streamer) PushTo(chunk string, dst *[]byte)
- func (s *Streamer) Repairs() Repairs
- func (s *Streamer) Revised() bool
Constants ¶
const MinLimit = 256
MinLimit 은 호출자가 줄 수 있는 가장 작은 조각 한도다. 조각마다 마크업을 닫고 다시 열 자리가 있어야 한다 — 한도가 태그보다 작으면 분할기가 태그 글자 사이를 가른다(텔레그램 **x** 를 한도 1 로 나누면 < · b · ></b>). 러스트 쪽 MIN_LIMIT 과 같다.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Channel ¶
type Channel int
Channel 은 내보낼 채널이다. 받는 문법이 채널마다 다르고, 출력이 좁은 쪽이 파싱 범위를 정한다.
const ( // TelegramHTML 은 Telegram parse_mode=HTML. 허용 태그 9개, 표·헤딩 없음, 4096자. TelegramHTML Channel = iota // SlackMarkdown 은 Slack markdown_text. 표준 마크다운을 슬랙이 직접 변환한다. 12,000자. SlackMarkdown // Plain 은 모든 마크업 제거. 폴백 경로. Plain // GithubMarkdown 은 GitHub 코멘트·PR 본문(GFM). 65,536자. 슬랙과 같은 마크다운을 내되, // GFM 이 구문으로 읽는 글자 둘(`~` `<`)을 탈출한다. 값이 밀리지 않게 끝에 둔다. GithubMarkdown // HTML 은 브라우저에 넣을 HTML 조각. 헤딩·목록·표·코드블록을 태그로 그린다. 한도 없음. // // innerHTML 로 바로 넣는 것을 전제로 한다 — 글자는 전부 escape 하고, 원문의 HTML 은 // 속성을 버린 인라인 태그만 살리며, 링크는 http(s)·mailto 만 <a> 로 낸다. 스트리밍 // 누적본에 Streamer.CloseOpen 을 붙이면 그대로 넣어도 되는 모양이 된다. 값이 밀리지 않게 끝에 둔다. HTML )
func ParseChannel ¶
ParseChannel 은 이름으로 채널을 찾는다. 없으면 ok 가 false 다.
type Dialect ¶
type Dialect int
Dialect 는 입력 방언 — 에이전트가 무슨 표기로 썼는가다. 기본은 표준 마크다운이다. 슬랙에 답하는 에이전트는 흔히 레거시 mrkdwn(`*굵게*` · `_기울임_` · `~취소~`)으로 쓴다.
type HTMLOptions ¶ added in v0.1.8
type HTMLOptions struct {
LineBreaks LineBreaks
Images Images
// Schemes 는 링크·이미지 주소로 받는 스킴이다("https" 처럼 콜론 없이). nil 이면 http·https·
// mailto. 목록을 주면 그것만 받는다 — 기본값에 더하는 것이 아니다. 빈 슬라이스(nil 이 아닌)는
// 아무 스킴도 받지 않는다.
Schemes []string
}
HTMLOptions 는 브라우저 채널의 정책이다. 영값이 가장 보수적이다 — <br> 줄바꿈, 이미지는 링크로만, 링크는 http·https·mailto 만.
type LineBreaks ¶ added in v0.1.8
type LineBreaks int
LineBreaks 는 블록 안의 줄바꿈을 어떻게 낼지다.
const ( // LineBreaksBR 은 <br> 이다 — 채팅·메모처럼 저자의 줄바꿈이 뜻인 글. 다른 채널이 다 // 줄바꿈을 살린다. LineBreaksBR LineBreaks = iota // LineBreaksSpace 는 줄바꿈 글자만 낸다 — 브라우저가 공백으로 접는다. 80열로 wrap 된 문서를 // 문단으로 읽을 때. LineBreaksSpace )
type Options ¶
type Options struct {
From Dialect
// Limit 은 한 조각의 한도(렌더한 출력의 글자 수)다. 0 이면 채널의 Limit().
//
// 한도는 보내는 쪽이 정한다 — plain 은 어디로 가는지 모르는 폴백이라 텔레그램으로 보내면
// 4096 이어야 한다(12,000 으로 나눈 7,153자 조각이 400 을 받았다).
// 스트리밍은 나누지 않으므로 이 값을 보지 않는다. 브라우저 채널(HTML)도 나누지 않는다 — 분할기가
// 블록 태그를 여닫지 않아 태그 한가운데서 갈린다. MinLimit 보다 작은 값은 그만큼 올린다.
Limit int
// HTML 은 브라우저 채널(HTML)의 정책이다. 다른 채널은 보지 않는다.
HTML HTMLOptions
}
Options 는 변환 옵션이다 — 입력 방언, 조각 한도, 브라우저 채널의 정책. 영값이 기본값이다.
type Repairs ¶
type Repairs struct {
// ClosedEmphasis 는 블록이 끝나도록 안 닫혀서 닫아 준 강조다.
ClosedEmphasis int
// ClosedFence 는 문서 끝까지 안 닫혀서 닫아 준 코드펜스다.
ClosedFence int
// RevertedCodeSpan 은 짝이 없어 코드가 아니라 글자로 되돌린 백틱 런이다.
RevertedCodeSpan int
// DroppedMarker 는 짝 잃은 채 버린 `**` 다.
DroppedMarker int
}
Repairs 는 정규화가 고친 것의 개수다. 모델이 얼마나 자주 서식을 깨는지 재는 데 쓴다.
type Streamer ¶
type Streamer struct {
// contains filtered or unexported fields
}
Streamer 는 스트리밍 변환기다. 조각을 넣으면 지금 안전하게 내보낼 수 있는 만큼만 돌려준다. 경계에 걸린 마크업(`**굵` 에서 끊긴 것)은 안에 남겨 두고 다음 조각을 기다린다.
func NewStreamerWith ¶
NewStreamerWith 는 옵션을 주고 만든다 — 입력 방언 따위.
func (*Streamer) CloseOpenTo ¶
CloseOpenTo 는 지금까지 받은 것을 그대로 보내도 되게 만든다. 상태는 건드리지 않으므로 붙인 뒤에도 스트리밍은 이어진다. 누적본을 중간에 채널로 보내는 쪽(토큰이 오는 대로 메시지를 편집하는 경우)은 보내기 직전에 이걸 덧붙인다 — 누적본 자체에는 넣지 않는다.
func (*Streamer) PreviewTo ¶ added in v0.1.8
PreviewTo 는 지금 입력이 끝났다면 확정분 뒤에 붙을 꼬리를 dst 에 붙인다 — 러스트 쪽 Streamer::preview. CloseOpenTo 와 같은 자리에 들어가지만 붙들고 있던 것까지 그린다: 열린 강조는 닫아서, 표는 지금까지 온 행으로, 코드 스팬은 닫아서. 누적본을 통째로 다시 그리는 쪽 (텔레그램 editMessageText, 슬랙 chat.update)의 기본값이다.
꼬리는 일괄 렌더와 같은 finish 경로라 문법은 늘 맞지만 추측이다 — 뒤의 조각이 모양을 바꿀 수 있다. 끝난 뒤 마지막 미리보기와 달라졌는지는 Revised 가 알려 준다. 비용은 열린 블록 크기에 비례한다(엔진을 복제한다). 조각마다 말고 화면을 그릴 때 부른다.
func (*Streamer) PushTo ¶
PushTo 는 조각을 밀어 넣고 지금 내보낼 수 있는 출력을 dst 에 붙인다. 정본 서명 — 호출자 버퍼에 직접 쓰므로 조각당 할당이 없다.
func (*Streamer) Revised ¶ added in v0.1.8
Revised 는 완성본이 마지막 미리보기와 다른가다 — Finish 뒤에 본다. 거짓이면 마지막으로 그린 화면(누적본 + Preview)이 곧 완성본이라 다시 그릴 필요가 없다. 텔레그램은 같은 내용으로 편집하면 400("message is not modified")을 주므로 이걸 보고 마지막 편집을 건너뛴다. 미리보기를 안 했거나 그 뒤에 조각이 더 왔으면 참이다 — 참은 "다를 수 있다"는 뜻이다. 편집을 솎아 보내 마지막 미리보기가 마지막 조각보다 앞서면 완성본이 같아도 참이니, 그런 쪽은 보낸 문자열과 직접 비교한다.