2
0
mirror of https://github.com/42wim/matterbridge synced 2024-11-17 03:26:07 +00:00
matterbridge/vendor/gitlab.com/golang-commonmark/markdown/image.go
Wim 04567c765e
Add support for markdown to HTML conversion (matrix). Closes #663 (#670)
This uses our own gomatrix lib with the SendHTML function which
adds HTML to formatted_body in matrix.
golang-commonmark is used to convert markdown into valid HTML.
2019-01-06 22:25:19 +01:00

132 lines
2.1 KiB
Go

// 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
func ruleImage(s *StateInline, silent bool) bool {
pos := s.Pos
max := s.PosMax
if pos+2 >= max {
return false
}
src := s.Src
if src[pos] != '!' || src[pos+1] != '[' {
return false
}
labelStart := pos + 2
labelEnd := parseLinkLabel(s, pos+1, false)
if labelEnd < 0 {
return false
}
var href, title, label string
oldPos := pos
pos = labelEnd + 1
if pos < max && src[pos] == '(' {
pos++
for pos < max {
b := src[pos]
if !byteIsSpace(b) && b != '\n' {
break
}
pos++
}
if pos >= max {
return false
}
start := pos
url, _, endpos, ok := parseLinkDestination(src, pos, s.PosMax)
if ok {
url = normalizeLink(url)
if validateLink(url) {
href = url
pos = endpos
}
}
start = pos
for pos < max {
b := src[pos]
if !byteIsSpace(b) && b != '\n' {
break
}
pos++
}
if pos >= max {
return false
}
title, _, endpos, ok = parseLinkTitle(src, pos, s.PosMax)
if pos < max && start != pos && ok {
pos = endpos
for pos < max {
b := src[pos]
if !byteIsSpace(b) && b != '\n' {
break
}
pos++
}
}
if pos >= max || src[pos] != ')' {
s.Pos = oldPos
return false
}
pos++
} else {
if s.Env.References == nil {
return false
}
if pos < max && src[pos] == '[' {
start := pos + 1
pos = parseLinkLabel(s, pos, false)
if pos >= 0 {
label = src[start:pos]
pos++
} else {
pos = labelEnd + 1
}
} else {
pos = labelEnd + 1
}
if label == "" {
label = src[labelStart:labelEnd]
}
ref, ok := s.Env.References[normalizeReference(label)]
if !ok {
s.Pos = oldPos
return false
}
href = ref["href"]
title = ref["title"]
}
if !silent {
content := src[labelStart:labelEnd]
tokens := s.Md.Inline.Parse(content, s.Md, s.Env)
s.PushToken(&Image{
Src: href,
Title: title,
Tokens: tokens,
})
}
s.Pos = pos
s.PosMax = max
return true
}