// markdownify renders a given string from Markdown to HTML. func markdownify(in interface{}) template.HTML { text := cast.ToString(in) m := helpers.RenderBytes(&helpers.RenderingContext{Content: []byte(text), PageFmt: "markdown"}) m = bytes.TrimPrefix(m, markdownTrimPrefix) m = bytes.TrimSuffix(m, markdownTrimSuffix) return template.HTML(m) }
func ShortcodesHandle(stringToParse string, p *Page, t Template) string { leadStart := strings.Index(stringToParse, `{{%`) if leadStart >= 0 { leadEnd := strings.Index(stringToParse[leadStart:], `%}}`) + leadStart if leadEnd > leadStart { name, par := SplitParams(stringToParse[leadStart+3 : leadEnd]) tmpl := GetTemplate(name, t) if tmpl == nil { return stringToParse } params := Tokenize(par) // Always look for closing tag. endStart, endEnd := FindEnd(stringToParse[leadEnd:], name) var data = &ShortcodeWithPage{Params: params, Page: p} if endStart > 0 { s := stringToParse[leadEnd+3 : leadEnd+endStart] data.Inner = template.HTML(helpers.RenderBytes([]byte(CleanP(ShortcodesHandle(s, p, t))), p.guessMarkupType(), p.UniqueId())) remainder := CleanP(stringToParse[leadEnd+endEnd:]) return CleanP(stringToParse[:leadStart]) + ShortcodeRender(tmpl, data) + CleanP(ShortcodesHandle(remainder, p, t)) } return CleanP(stringToParse[:leadStart]) + ShortcodeRender(tmpl, data) + CleanP(ShortcodesHandle(stringToParse[leadEnd+3:], p, t)) } } return stringToParse }
func (p *Page) renderContent(content []byte) []byte { var fn helpers.LinkResolverFunc var fileFn helpers.FileResolverFunc if p.getRenderingConfig().SourceRelativeLinksEval { fn = func(ref string) (string, error) { return p.Node.Site.SourceRelativeLink(ref, p) } fileFn = func(ref string) (string, error) { return p.Node.Site.SourceRelativeLinkFile(ref, p) } } return helpers.RenderBytes(&helpers.RenderingContext{Content: content, RenderTOC: true, PageFmt: p.determineMarkupType(), DocumentID: p.UniqueID(), Config: p.getRenderingConfig(), LinkResolver: fn, FileResolver: fileFn}) }
func renderShortcode(sc shortcode, parent *ShortcodeWithPage, p *Page, t tpl.Template) string { tmpl := getShortcodeTemplate(sc.name, t) if tmpl == nil { jww.ERROR.Printf("Unable to locate template for shortcode '%s' in page %s", sc.name, p.BaseFileName()) return "" } data := &ShortcodeWithPage{Params: sc.params, Page: p, Parent: parent} if sc.params != nil { data.IsNamedParams = reflect.TypeOf(sc.params).Kind() == reflect.Map } if len(sc.inner) > 0 { var inner string for _, innerData := range sc.inner { switch innerData.(type) { case string: inner += innerData.(string) case shortcode: inner += renderShortcode(innerData.(shortcode), data, p, t) default: jww.ERROR.Printf("Illegal state on shortcode rendering of '%s' in page %s. Illegal type in inner data: %s ", sc.name, p.BaseFileName(), reflect.TypeOf(innerData)) return "" } } if sc.doMarkup { newInner := helpers.RenderBytes(&helpers.RenderingContext{ Content: []byte(inner), PageFmt: p.guessMarkupType(), DocumentID: p.UniqueID(), Config: p.getRenderingConfig()}) // If the type is “unknown” or “markdown”, we assume the markdown // generation has been performed. Given the input: `a line`, markdown // specifies the HTML `<p>a line</p>\n`. When dealing with documents as a // whole, this is OK. When dealing with an `{{ .Inner }}` block in Hugo, // this is not so good. This code does two things: // // 1. Check to see if inner has a newline in it. If so, the Inner data is // unchanged. // 2 If inner does not have a newline, strip the wrapping <p> block and // the newline. This was previously tricked out by wrapping shortcode // substitutions in <div>HUGOSHORTCODE-1</div> which prevents the // generation, but means that you can’t use shortcodes inside of // markdown structures itself (e.g., `[foo]({{% ref foo.md %}})`). switch p.guessMarkupType() { case "unknown", "markdown": if match, _ := regexp.MatchString(innerNewlineRegexp, inner); !match { cleaner, err := regexp.Compile(innerCleanupRegexp) if err == nil { newInner = cleaner.ReplaceAll(newInner, []byte(innerCleanupExpand)) } } } data.Inner = template.HTML(newInner) } else { data.Inner = template.HTML(inner) } } return renderShortcodeWithPage(tmpl, data) }
func (p *Page) renderBytes(content []byte) []byte { return helpers.RenderBytes( &helpers.RenderingContext{Content: content, PageFmt: p.guessMarkupType(), DocumentID: p.UniqueID(), Config: p.getRenderingConfig()}) }
func Markdownify(text string) template.HTML { m := helpers.RenderBytes(&helpers.RenderingContext{Content: []byte(text), PageFmt: "markdown"}) m = bytes.TrimPrefix(m, markdownTrimPrefix) m = bytes.TrimSuffix(m, markdownTrimSuffix) return template.HTML(m) }
func Markdownify(text string) template.HTML { return template.HTML(helpers.RenderBytes(&helpers.RenderingContext{Content: []byte(text), PageFmt: "markdown"})) }
func (p *Page) renderBytes(content []byte) []byte { return helpers.RenderBytes(content, p.guessMarkupType(), p.UniqueId()) }