Files
2026-08-14 23:41:57 +08:00

52 lines
1.5 KiB
Go

package remotecontrol
import (
"strings"
qrcode "github.com/skip2/go-qrcode"
)
// Render encodes url as a QR code drawn with Unicode half-block characters,
// suitable for scanning off a terminal by a phone camera. Two matrix rows are
// packed into each text line (▀ ▄ █ and space), halving the printed height.
//
// The rendering assumes a dark-background terminal: light QR modules are drawn
// as bright block glyphs and dark modules as the terminal background. go-qrcode
// includes the mandatory quiet-zone border in its bitmap.
//
// On any encoding error Render returns ("", err); callers should degrade
// gracefully by printing the URL alone (the QR is a convenience, not required).
func Render(url string) (string, error) {
q, err := qrcode.New(url, qrcode.Medium)
if err != nil {
return "", err
}
bm := q.Bitmap() // true = dark module; includes quiet-zone border.
var b strings.Builder
for y := 0; y < len(bm); y += 2 {
row := bm[y]
for x := 0; x < len(row); x++ {
// A "light" pixel is drawn as a block; a "dark" pixel is left as
// background. Rows beyond the matrix are treated as light (quiet).
topLight := !bm[y][x]
botLight := true
if y+1 < len(bm) {
botLight = !bm[y+1][x]
}
switch {
case topLight && botLight:
b.WriteRune('█')
case topLight && !botLight:
b.WriteRune('▀')
case !topLight && botLight:
b.WriteRune('▄')
default:
b.WriteByte(' ')
}
}
b.WriteByte('\n')
}
return b.String(), nil
}