aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/vendor/rsc.io/markdown/break.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/vendor/rsc.io/markdown/break.go')
-rw-r--r--src/cmd/vendor/rsc.io/markdown/break.go99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/cmd/vendor/rsc.io/markdown/break.go b/src/cmd/vendor/rsc.io/markdown/break.go
new file mode 100644
index 0000000000..c0ddaabffb
--- /dev/null
+++ b/src/cmd/vendor/rsc.io/markdown/break.go
@@ -0,0 +1,99 @@
+// Copyright 2021 The Go 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 (
+ "bytes"
+)
+
+type ThematicBreak struct {
+ Position
+ raw string
+}
+
+func (b *ThematicBreak) PrintHTML(buf *bytes.Buffer) {
+ buf.WriteString("<hr />\n")
+}
+
+func (b *ThematicBreak) printMarkdown(buf *bytes.Buffer, s mdState) {
+ buf.WriteString(s.prefix)
+ buf.WriteString(b.raw)
+ buf.WriteByte('\n')
+}
+
+func newHR(p *parseState, s line) (line, bool) {
+ if isHR(s) {
+ p.doneBlock(&ThematicBreak{Position{p.lineno, p.lineno}, s.string()})
+ return line{}, true
+ }
+ return s, false
+}
+
+func isHR(s line) bool {
+ t := s
+ t.trimSpace(0, 3, false)
+ switch c := t.peek(); c {
+ case '-', '_', '*':
+ for i := 0; ; i++ {
+ if !t.trim(c) {
+ if i >= 3 {
+ break
+ }
+ return false
+ }
+ t.skipSpace()
+ }
+ return t.eof()
+ }
+ return false
+}
+
+type HardBreak struct{}
+
+func (*HardBreak) Inline() {}
+
+func (x *HardBreak) PrintHTML(buf *bytes.Buffer) {
+ buf.WriteString("<br />\n")
+}
+
+func (x *HardBreak) printMarkdown(buf *bytes.Buffer) {
+ buf.WriteString("\\\n")
+}
+
+func (x *HardBreak) PrintText(buf *bytes.Buffer) {
+ buf.WriteString("\n")
+}
+
+type SoftBreak struct{}
+
+func (*SoftBreak) Inline() {}
+
+func (x *SoftBreak) PrintHTML(buf *bytes.Buffer) {
+ buf.WriteString("\n")
+}
+
+func (x *SoftBreak) printMarkdown(buf *bytes.Buffer) {
+ buf.WriteString("\n")
+}
+
+func (x *SoftBreak) PrintText(buf *bytes.Buffer) {
+ buf.WriteString("\n")
+}
+
+func parseBreak(_ *parseState, s string, i int) (Inline, int, int, bool) {
+ start := i
+ for start > 0 && (s[start-1] == ' ' || s[start-1] == '\t') {
+ start--
+ }
+ end := i + 1
+ for end < len(s) && (s[end] == ' ' || s[end] == '\t') {
+ end++
+ }
+ // TODO: Do tabs count? That would be a mess.
+ if i >= 2 && s[i-1] == ' ' && s[i-2] == ' ' {
+ return &HardBreak{}, start, end, true
+ }
+ return &SoftBreak{}, start, end, true
+}