summaryrefslogtreecommitdiffstats
path: root/vendor/gitlab.com/golang-commonmark/markdown/replacements.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gitlab.com/golang-commonmark/markdown/replacements.go')
-rw-r--r--vendor/gitlab.com/golang-commonmark/markdown/replacements.go229
1 files changed, 229 insertions, 0 deletions
diff --git a/vendor/gitlab.com/golang-commonmark/markdown/replacements.go b/vendor/gitlab.com/golang-commonmark/markdown/replacements.go
new file mode 100644
index 00000000..8d67af6e
--- /dev/null
+++ b/vendor/gitlab.com/golang-commonmark/markdown/replacements.go
@@ -0,0 +1,229 @@
+// 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 "strings"
+
+func exclquest(b byte) bool {
+ return b == '!' || b == '?'
+}
+
+func byteToLower(b byte) byte {
+ if b >= 'A' && b <= 'Z' {
+ return b - 'A' + 'a'
+ }
+ return b
+}
+
+var replChar = [256]bool{
+ '(': true,
+ '!': true,
+ '+': true,
+ ',': true,
+ '-': true,
+ '.': true,
+ '?': true,
+}
+
+func performReplacements(s string) string {
+ var ss []string
+
+ start := 0
+ for i := 0; i < len(s); i++ {
+ b := s[i]
+
+ if replChar[b] {
+
+ outer:
+ switch b {
+ case '(':
+ if i+2 >= len(s) {
+ break
+ }
+
+ b2 := s[i+1]
+
+ b2 = byteToLower(b2)
+ switch b2 {
+ case 'c', 'r', 'p':
+ if s[i+2] != ')' {
+ break outer
+ }
+ switch b2 {
+ case 'c':
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, "©")
+ case 'r':
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, "®")
+ case 'p':
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, "§")
+ }
+ i += 2
+ start = i + 1
+ continue
+
+ case 't':
+ if i+3 >= len(s) {
+ break outer
+ }
+ if s[i+3] != ')' || byteToLower(s[i+2]) != 'm' {
+ break outer
+ }
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, "™")
+ i += 3
+ start = i + 1
+ continue
+ default:
+ break outer
+ }
+
+ case '+':
+ if i+1 >= len(s) || s[i+1] != '-' {
+ break
+ }
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, "±")
+ i++
+ start = i + 1
+ continue
+
+ case '.':
+ if i+1 >= len(s) || s[i+1] != '.' {
+ break
+ }
+
+ j := i + 2
+ for j < len(s) && s[j] == '.' {
+ j++
+ }
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ if i == 0 || !(s[i-1] == '?' || s[i-1] == '!') {
+ ss = append(ss, "…")
+ } else {
+ ss = append(ss, "..")
+ }
+ i = j - 1
+ start = i + 1
+ continue
+
+ case '?', '!':
+ if i+3 >= len(s) {
+ break
+ }
+ if !(exclquest(s[i+1]) && exclquest(s[i+2]) && exclquest(s[i+3])) {
+ break
+ }
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, s[i:i+3])
+ j := i + 3
+ for j < len(s) && exclquest(s[j]) {
+ j++
+ }
+ i = j - 1
+ start = i + 1
+ continue
+
+ case ',':
+ if i+1 >= len(s) || s[i+1] != ',' {
+ break
+ }
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, ",")
+ j := i + 2
+ for j < len(s) && s[j] == ',' {
+ j++
+ }
+ i = j - 1
+ start = i + 1
+ continue
+
+ case '-':
+ if i+1 >= len(s) || s[i+1] != '-' {
+ break
+ }
+ if i+2 >= len(s) || s[i+2] != '-' {
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, "–")
+ i++
+ start = i + 1
+ continue
+ }
+ if i+3 >= len(s) || s[i+3] != '-' {
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, "—")
+ i += 2
+ start = i + 1
+ continue
+ }
+
+ j := i + 3
+ for j < len(s) && s[j] == '-' {
+ j++
+ }
+ if start < i {
+ ss = append(ss, s[start:i])
+ }
+ ss = append(ss, s[i:j])
+ i = j - 1
+ start = i + 1
+ continue
+ }
+ }
+ }
+ if ss == nil {
+ return s
+ }
+ if start < len(s) {
+ ss = append(ss, s[start:])
+ }
+ return strings.Join(ss, "")
+}
+
+func ruleReplacements(s *StateCore) {
+ if !s.Md.Typographer {
+ return
+ }
+
+ insideLink := false
+ for _, tok := range s.Tokens {
+ if tok, ok := tok.(*Inline); ok {
+ for _, itok := range tok.Children {
+ switch itok := itok.(type) {
+ case *LinkOpen:
+ insideLink = true
+ case *LinkClose:
+ insideLink = false
+ case *Text:
+ if !insideLink {
+ itok.Content = performReplacements(itok.Content)
+ }
+ }
+ }
+ }
+ }
+}