summaryrefslogtreecommitdiff
path: root/teleirc/matterbridge/vendor/github.com/gomarkdown/markdown/parser/ref.go
diff options
context:
space:
mode:
Diffstat (limited to 'teleirc/matterbridge/vendor/github.com/gomarkdown/markdown/parser/ref.go')
-rw-r--r--teleirc/matterbridge/vendor/github.com/gomarkdown/markdown/parser/ref.go104
1 files changed, 104 insertions, 0 deletions
diff --git a/teleirc/matterbridge/vendor/github.com/gomarkdown/markdown/parser/ref.go b/teleirc/matterbridge/vendor/github.com/gomarkdown/markdown/parser/ref.go
new file mode 100644
index 0000000..c1e0534
--- /dev/null
+++ b/teleirc/matterbridge/vendor/github.com/gomarkdown/markdown/parser/ref.go
@@ -0,0 +1,104 @@
+package parser
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/gomarkdown/markdown/ast"
+)
+
+// parse '(#r, text)', where r does not contain spaces, but text may (similar to a citation). Or. (!item) (!item,
+// subitem), for an index, (!!item) signals primary.
+func maybeShortRefOrIndex(p *Parser, data []byte, offset int) (int, ast.Node) {
+ if len(data[offset:]) < 4 {
+ return 0, nil
+ }
+ // short ref first
+ data = data[offset:]
+ i := 1
+ switch data[i] {
+ case '#': // cross ref
+ i++
+ Loop:
+ for i < len(data) {
+ c := data[i]
+ switch {
+ case c == ')':
+ break Loop
+ case !IsAlnum(c):
+ if c == '_' || c == '-' || c == ':' || c == ' ' || c == ',' {
+ i++
+ continue
+ }
+ i = 0
+ break Loop
+ }
+ i++
+ }
+ if i >= len(data) {
+ return 0, nil
+ }
+ if data[i] != ')' {
+ return 0, nil
+ }
+
+ id := data[2:i]
+ node := &ast.CrossReference{}
+ node.Destination = id
+ if c := bytes.Index(id, []byte(",")); c > 0 {
+ idpart := id[:c]
+ suff := id[c+1:]
+ suff = bytes.TrimSpace(suff)
+ node.Destination = idpart
+ node.Suffix = suff
+ }
+ if bytes.Index(node.Destination, []byte(" ")) > 0 {
+ // no spaces allowed in id
+ return 0, nil
+ }
+ if bytes.Index(node.Destination, []byte(",")) > 0 {
+ // nor comma
+ return 0, nil
+ }
+
+ return i + 1, node
+
+ case '!': // index
+ i++
+ start := i
+ i = skipUntilChar(data, start, ')')
+
+ // did we reach the end of the buffer without a closing marker?
+ if i >= len(data) {
+ return 0, nil
+ }
+
+ if len(data[start:i]) < 1 {
+ return 0, nil
+ }
+
+ idx := &ast.Index{}
+
+ idx.ID = fmt.Sprintf("idxref:%d", p.indexCnt)
+ p.indexCnt++
+
+ idx.Primary = data[start] == '!'
+ buf := data[start:i]
+
+ if idx.Primary {
+ buf = buf[1:]
+ }
+ items := bytes.Split(buf, []byte(","))
+ switch len(items) {
+ case 1:
+ idx.Item = bytes.TrimSpace(items[0])
+ return i + 1, idx
+ case 2:
+ idx.Item = bytes.TrimSpace(items[0])
+ idx.Subitem = bytes.TrimSpace(items[1])
+ return i + 1, idx
+ }
+ }
+
+ return 0, nil
+}