diff options
Diffstat (limited to 'vendor/gitlab.com/golang-commonmark/linkify/email.go')
-rw-r--r-- | vendor/gitlab.com/golang-commonmark/linkify/email.go | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/vendor/gitlab.com/golang-commonmark/linkify/email.go b/vendor/gitlab.com/golang-commonmark/linkify/email.go new file mode 100644 index 00000000..35bfb679 --- /dev/null +++ b/vendor/gitlab.com/golang-commonmark/linkify/email.go @@ -0,0 +1,93 @@ +// 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 linkify + +import ( + "unicode" + "unicode/utf8" +) + +func findEmailStart(s string, start int) (_ int, _ bool) { + end := start + allowDot := false + for end >= 0 { + b := s[end] + switch { + case emailcs[b]: + allowDot = true + case b == '.': + if !allowDot { + return + } + allowDot = false + default: + if end == start { + return + } + if s[end+1] == '.' { + return + } + r, _ := utf8.DecodeLastRuneInString(s[:end+1]) + if r == utf8.RuneError { + return + } + if !unicode.IsSpace(r) { + return + } + return end + 1, true + } + end-- + } + if end < start && s[end+1] == '.' { + return + } + return end + 1, true +} + +func findEmailEnd(s string, start int) (_ int, _ bool) { + end := start + allowDot := false +loop: + for end < len(s) { + b := s[end] + switch { + case emailcs[b]: + allowDot = true + case b == '.': + if !allowDot { + return + } + allowDot = false + case b == '@': + break loop + default: + return + } + end++ + } + if end >= len(s)-5 { + return + } + if end > start && s[end-1] == '.' { + return + } + + var dot int + var ok bool + end, dot, ok = findHostnameEnd(s, end+1) + if !ok || dot == -1 { + return + } + + if dot+5 <= len(s) && s[dot+1:dot+5] == "xn--" { + return end, true + } + + if length := match(s[dot+1:]); dot+length+1 != end { + return + } + + return end, true +} |