diff --git a/config/config.go b/config/config.go index 9c5ff27..4dae89e 100755 --- a/config/config.go +++ b/config/config.go @@ -105,7 +105,7 @@ const defaultWrapper = ` body > form > textarea { margin-top: 2.5em; } - body > h2:nth-child(2) { + rendered > h2:nth-child(2) { margin: 0; position: fixed; padding: .25em; @@ -113,6 +113,35 @@ const defaultWrapper = ` background: #3b242b; top: 0; } + h1, h2, h3, h4, h5, h6, h7, h8 { + position: relative; + } + .comment { + display: none; + margin: 0; + padding: 0; + flex-direction: column; + justify-content: center; + position: absolute; + right: 100%; + padding-right: 1em; + width: 10em; + top: 0; + text-align: right; + font-size: 12pt; + } + h1:hover > .comment, + h2:hover > .comment, + h3:hover > .comment, + h4:hover > .comment, + h5:hover > .comment, + h6:hover > .comment, + h7:hover > .comment, + h8:hover > .comment, + .comment:focus, + .comment:focus-within { + display: inline-flex; + }
diff --git a/notes/file.go b/notes/file.go index f3a6490..63fc8b8 100755 --- a/notes/file.go +++ b/notes/file.go @@ -1,11 +1,16 @@ package notes import ( + "encoding/base64" "errors" + "fmt" + "io" "io/ioutil" "local/notes-server/filetree" + "strings" "github.com/gomarkdown/markdown" + "github.com/gomarkdown/markdown/ast" "github.com/gomarkdown/markdown/html" "github.com/gomarkdown/markdown/parser" ) @@ -17,9 +22,39 @@ func (n *Notes) File(urlPath string) (string, error) { } b, _ := ioutil.ReadFile(p.Local) renderer := html.NewRenderer(html.RendererOptions{ - Flags: html.CommonFlags | html.TOC, + Flags: html.CommonFlags | html.TOC, + RenderNodeHook: n.commentFormer(), }) parser := parser.NewWithExtensions(parser.CommonExtensions | parser.HeadingIDs | parser.AutoHeadingIDs | parser.Titleblock) content := markdown.ToHTML(b, parser, renderer) return string(content) + "\n", nil } + +func (n *Notes) commentFormer() html.RenderNodeFunc { + header_n := 0 + return func(w io.Writer, node ast.Node, entering bool) (ast.WalkStatus, bool) { + if heading, ok := node.(*ast.Heading); ok { + if !entering { + literal := "" + ast.WalkFunc(heading, func(n ast.Node, e bool) ast.WalkStatus { + if leaf := n.AsLeaf(); e && leaf != nil { + if literal != "" { + literal += ".*" + } + literal += string(leaf.Literal) + } + return ast.GoToNext + }) + level := heading.Level + id := base64.URLEncoding.EncodeToString([]byte(fmt.Sprintf(`^[ \t]*%s\s*%s(].*)?\s*$`, strings.Repeat("#", level), literal))) + fmt.Fprintf(w, ` + + `, id) + } + } + return ast.GoToNext, false + } +}