diff options
author | Wim <wim@42.be> | 2019-01-06 22:25:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-06 22:25:19 +0100 |
commit | 04567c765e92ad60c685c1b2fe7e77c46e065645 (patch) | |
tree | 34a587a6545c8e71e991e2a1551885faa0075738 /vendor/gitlab.com/golang-commonmark/puny/puny.go | |
parent | 048158ad6db08cd714f39467fc0066ce41cfe6c5 (diff) | |
download | matterbridge-msglm-04567c765e92ad60c685c1b2fe7e77c46e065645.tar.gz matterbridge-msglm-04567c765e92ad60c685c1b2fe7e77c46e065645.tar.bz2 matterbridge-msglm-04567c765e92ad60c685c1b2fe7e77c46e065645.zip |
Add support for markdown to HTML conversion (matrix). Closes #663 (#670)
This uses our own gomatrix lib with the SendHTML function which
adds HTML to formatted_body in matrix.
golang-commonmark is used to convert markdown into valid HTML.
Diffstat (limited to 'vendor/gitlab.com/golang-commonmark/puny/puny.go')
-rw-r--r-- | vendor/gitlab.com/golang-commonmark/puny/puny.go | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/vendor/gitlab.com/golang-commonmark/puny/puny.go b/vendor/gitlab.com/golang-commonmark/puny/puny.go new file mode 100644 index 00000000..8f71402c --- /dev/null +++ b/vendor/gitlab.com/golang-commonmark/puny/puny.go @@ -0,0 +1,287 @@ +// Copyright 2015 The Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package puny provides functions for encoding/decoding to/from punycode. +package puny + +import ( + "errors" + "strings" + "unicode/utf8" +) + +const ( + maxInt32 int32 = 2147483647 + base int32 = 36 + tMin int32 = 1 + baseMinusTMin = base - tMin + tMax int32 = 26 + skew int32 = 38 + damp int32 = 700 + initialBias int32 = 72 + initialN int32 = 128 +) + +var ( + ErrOverflow = errors.New("overflow: input needs wider integers to process") + ErrNotBasic = errors.New("illegal input >= 0x80 (not a basic code point)") + ErrInvalidInput = errors.New("invalid input") +) + +func adapt(delta, numPoints int32, firstTime bool) int32 { + if firstTime { + delta /= damp + } else { + delta /= 2 + } + delta += delta / numPoints + k := int32(0) + for delta > baseMinusTMin*tMax/2 { + delta = delta / baseMinusTMin + k += base + } + return k + (baseMinusTMin+1)*delta/(delta+skew) +} + +func basicToDigit(b byte) int32 { + switch { + case b >= '0' && b <= '9': + return int32(b - 22) + case b >= 'A' && b <= 'Z': + return int32(b - 'A') + case b >= 'a' && b <= 'z': + return int32(b - 'a') + } + return base +} + +func digitToBasic(digit int32) byte { + switch { + case digit >= 0 && digit <= 25: + return byte(digit) + 'a' + case digit >= 26 && digit <= 35: + return byte(digit) - 26 + '0' + } + panic("unreachable") +} + +func lastIndex(s string, c byte) int { + for i := len(s) - 1; i >= 0; i-- { + if s[i] == c { + return i + } + } + return -1 +} + +func ascii(s string) bool { + for _, r := range s { + if r > 0x7e { + return false + } + } + return true +} + +// Decode converts a Punycode string of ASCII-only symbols to a string of Unicode symbols. +func Decode(s string) (string, error) { + basic := lastIndex(s, '-') + output := make([]rune, 0, len(s)) + for i := 0; i < basic; i++ { + b := s[i] + if b >= 0x80 { + return "", ErrNotBasic + } + output = append(output, rune(b)) + } + + i, n, bias, pos := int32(0), initialN, initialBias, basic+1 + + for pos < len(s) { + oldi, w, k := i, int32(1), base + for { + digit := basicToDigit(s[pos]) + pos++ + + if digit >= base || digit > (maxInt32-i)/w { + return "", ErrOverflow + } + + i += digit * w + + t := k - bias + if t < tMin { + t = tMin + } else if t > tMax { + t = tMax + } + + if digit < t { + break + } + + if pos == len(s) { + return "", ErrInvalidInput + } + + baseMinusT := base - t + if w > maxInt32/baseMinusT { + return "", ErrOverflow + } + + w *= baseMinusT + k += base + } + + out := int32(len(output) + 1) + bias = adapt(i-oldi, out, oldi == 0) + + if i/out > maxInt32-n { + return "", ErrOverflow + } + + n += i / out + i %= out + + output = append(output, 0) + copy(output[i+1:], output[i:]) + output[i] = rune(n) + + i++ + } + + return string(output), nil +} + +// Encode converts a string of Unicode symbols (e.g. a domain name label) to a +// Punycode string of ASCII-only symbols. +func Encode(input string) (string, error) { + n := initialN + delta := int32(0) + bias := initialBias + + var output []byte + runes := 0 + for _, r := range input { + if r >= 0x80 { + runes++ + continue + } + output = append(output, byte(r)) + } + + basicLength := len(output) + handledCPCount := basicLength + + if basicLength > 0 { + output = append(output, '-') + } + + for runes > 0 { + m := maxInt32 + for _, r := range input { + if r >= n && r < m { + m = r + } + } + + handledCPCountPlusOne := int32(handledCPCount + 1) + if m-n > (maxInt32-delta)/handledCPCountPlusOne { + return "", ErrOverflow + } + + delta += (m - n) * handledCPCountPlusOne + n = m + + for _, r := range input { + if r < n { + delta++ + if delta < 0 { + return "", ErrOverflow + } + continue + } + if r > n { + continue + } + q := delta + for k := base; ; k += base { + t := k - bias + if t < tMin { + t = tMin + } else if t > tMax { + t = tMax + } + if q < t { + break + } + qMinusT := q - t + baseMinusT := base - t + output = append(output, digitToBasic(t+qMinusT%baseMinusT)) + q = qMinusT / baseMinusT + } + + output = append(output, digitToBasic(q)) + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength) + delta = 0 + handledCPCount++ + runes-- + } + delta++ + n++ + } + return string(output), nil +} + +func sep(r rune) bool { return r == '.' || r == '。' || r == '.' || r == '。' } + +func mapLabels(s string, fn func(string) string) string { + var result string + i := strings.IndexByte(s, '@') + if i != -1 { + result = s[:i+1] + s = s[i+1:] + } + var labels []string + start := 0 + for i, r := range s { + if !sep(r) { + continue + } + labels = append(labels, fn(s[start:i])) + start = i + utf8.RuneLen(r) + } + labels = append(labels, fn(s[start:])) + return result + strings.Join(labels, ".") +} + +// ToUnicode converts a Punycode string representing a domain name or an email address +// to Unicode. Only the Punycoded parts of the input will be converted. +func ToUnicode(s string) string { + return mapLabels(s, func(s string) string { + if !strings.HasPrefix(s, "xn--") { + return s + } + d, err := Decode(strings.ToLower(s[4:])) + if err != nil { + return s + } + return d + }) +} + +// ToASCII converts a Unicode string representing a domain name or an email address to +// Punycode. Only the non-ASCII parts of the domain name will be converted. +func ToASCII(s string) string { + return mapLabels(s, func(s string) string { + if ascii(s) { + return s + } + d, err := Encode(s) + if err != nil { + return s + } + return "xn--" + d + }) +} |