summaryrefslogtreecommitdiffstats
path: root/vendor/gitlab.com/golang-commonmark/markdown/autolink.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gitlab.com/golang-commonmark/markdown/autolink.go')
-rw-r--r--vendor/gitlab.com/golang-commonmark/markdown/autolink.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/vendor/gitlab.com/golang-commonmark/markdown/autolink.go b/vendor/gitlab.com/golang-commonmark/markdown/autolink.go
new file mode 100644
index 00000000..ab51c71b
--- /dev/null
+++ b/vendor/gitlab.com/golang-commonmark/markdown/autolink.go
@@ -0,0 +1,70 @@
+// 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 markdown
+
+import (
+ "regexp"
+ "strings"
+)
+
+var (
+ rAutolink = regexp.MustCompile(`^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>`)
+ rEmail = regexp.MustCompile(`^<([a-zA-Z0-9.!#$%&'*+/=?^_{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>`)
+)
+
+func ruleAutolink(s *StateInline, silent bool) bool {
+ pos := s.Pos
+ src := s.Src
+
+ if src[pos] != '<' {
+ return false
+ }
+
+ tail := src[pos:]
+
+ if strings.IndexByte(tail, '>') < 0 {
+ return false
+ }
+
+ link := rAutolink.FindString(tail)
+ if link != "" {
+ link = link[1 : len(link)-1]
+ href := normalizeLink(link)
+ if !validateLink(href) {
+ return false
+ }
+
+ if !silent {
+ s.PushOpeningToken(&LinkOpen{Href: href})
+ s.PushToken(&Text{Content: normalizeLinkText(link)})
+ s.PushClosingToken(&LinkClose{})
+ }
+
+ s.Pos += len(link) + 2
+
+ return true
+ }
+
+ email := rEmail.FindString(tail)
+ if email != "" {
+ email = email[1 : len(email)-1]
+ href := normalizeLink("mailto:" + email)
+ if !validateLink(href) {
+ return false
+ }
+
+ if !silent {
+ s.PushOpeningToken(&LinkOpen{Href: href})
+ s.PushToken(&Text{Content: normalizeLinkText(email)})
+ s.PushClosingToken(&LinkClose{})
+ }
+
+ s.Pos += len(email) + 2
+
+ return true
+ }
+
+ return false
+}