add local TailwindCSS, fix side bar folder view, add more function to Markdown editor and allow .markdown files
This commit is contained in:
@@ -13,6 +13,7 @@ import (
|
||||
"github.com/yuin/goldmark/extension"
|
||||
"github.com/yuin/goldmark/parser"
|
||||
"github.com/yuin/goldmark/renderer/html"
|
||||
emoji "github.com/yuin/goldmark-emoji"
|
||||
|
||||
"gobsidian/internal/config"
|
||||
)
|
||||
@@ -22,6 +23,38 @@ type Renderer struct {
|
||||
config *config.Config
|
||||
}
|
||||
|
||||
// processMermaidFences wraps fenced code blocks marked as "mermaid" into <div class="mermaid">...</div>
|
||||
func (r *Renderer) processMermaidFences(content string) string {
|
||||
// ```mermaid\n...\n```
|
||||
re := regexp.MustCompile("(?s)```mermaid\\s*(.*?)\\s*```")
|
||||
return re.ReplaceAllString(content, "<div class=\"mermaid\">$1</div>")
|
||||
}
|
||||
|
||||
// processMediaEmbeds turns a bare URL on its own line into an embed element
|
||||
// Supports: audio (mp3|wav|ogg), video (mp4|webm|ogg), pdf
|
||||
func (r *Renderer) processMediaEmbeds(content string) string {
|
||||
lines := strings.Split(content, "\n")
|
||||
mediaRe := regexp.MustCompile(`^(https?://\S+\.(?:mp3|wav|ogg|mp4|webm|ogg|pdf))$`)
|
||||
|
||||
for i, ln := range lines {
|
||||
trimmed := strings.TrimSpace(ln)
|
||||
m := mediaRe.FindStringSubmatch(trimmed)
|
||||
if len(m) == 0 {
|
||||
continue
|
||||
}
|
||||
url := m[1]
|
||||
switch {
|
||||
case strings.HasSuffix(strings.ToLower(url), ".mp3") || strings.HasSuffix(strings.ToLower(url), ".wav") || strings.HasSuffix(strings.ToLower(url), ".ogg"):
|
||||
lines[i] = fmt.Sprintf("<audio controls preload=\"metadata\" src=\"%s\"></audio>", url)
|
||||
case strings.HasSuffix(strings.ToLower(url), ".mp4") || strings.HasSuffix(strings.ToLower(url), ".webm") || strings.HasSuffix(strings.ToLower(url), ".ogg"):
|
||||
lines[i] = fmt.Sprintf("<video controls preload=\"metadata\" style=\"max-width:100%%\" src=\"%s\"></video>", url)
|
||||
case strings.HasSuffix(strings.ToLower(url), ".pdf"):
|
||||
lines[i] = fmt.Sprintf("<iframe src=\"%s\" style=\"width:100%%;height:70vh;border:1px solid #374151;border-radius:8px\"></iframe>", url)
|
||||
}
|
||||
}
|
||||
return strings.Join(lines, "\n")
|
||||
}
|
||||
|
||||
func NewRenderer(cfg *config.Config) *Renderer {
|
||||
md := goldmark.New(
|
||||
goldmark.WithExtensions(
|
||||
@@ -29,6 +62,11 @@ func NewRenderer(cfg *config.Config) *Renderer {
|
||||
extension.Table,
|
||||
extension.Strikethrough,
|
||||
extension.TaskList,
|
||||
extension.Footnote,
|
||||
extension.DefinitionList,
|
||||
extension.Linkify,
|
||||
extension.Typographer,
|
||||
emoji.Emoji,
|
||||
highlighting.NewHighlighting(
|
||||
highlighting.WithStyle("github-dark"),
|
||||
highlighting.WithFormatOptions(
|
||||
@@ -61,6 +99,12 @@ func (r *Renderer) RenderMarkdown(content string, notePath string) (string, erro
|
||||
// Process Obsidian links
|
||||
content = r.processObsidianLinks(content)
|
||||
|
||||
// Convert Mermaid fenced code blocks to <div class="mermaid"> for client rendering
|
||||
content = r.processMermaidFences(content)
|
||||
|
||||
// Convert bare media links on their own line to embedded players (audio/video/pdf)
|
||||
content = r.processMediaEmbeds(content)
|
||||
|
||||
var buf bytes.Buffer
|
||||
if err := r.md.Convert([]byte(content), &buf); err != nil {
|
||||
return "", err
|
||||
|
||||
Reference in New Issue
Block a user