Beep boop
-` - ) - - article, err := parseArticle(raw) - assert.NoError(t, err) - assert.Equal(t, meta, article.ArticleMeta) - assert.Equal(t, body, article.Content) -} diff --git a/cmd/blog/main.go b/cmd/blog/main.go deleted file mode 100644 index d5d835e2eab4153e10fc157dd07aec9cbb7507d4..0000000000000000000000000000000000000000 --- a/cmd/blog/main.go +++ /dev/null @@ -1,116 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - "path/filepath" - - "github.com/pelletier/go-toml/v2" - "go.jolheiser.com/blog" - "gopkg.in/yaml.v3" -) - -type args struct { - ArticleDir string `yaml:"article-dir" toml:"article-dir"` - TemplateDir string `yaml:"template-dir" toml:"template-dir"` - OutDir string `yaml:"out-dir" toml:"out-dir"` - Author blog.Author `yaml:"author" toml:"author"` -} - -func main() { - if err := maine(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func maine() error { - var args args - - fs := flag.NewFlagSet("blog", flag.ExitOnError) - - configFlag := fs.String("config", "", "Configuration, TOML or YAML") - fs.StringVar(configFlag, "c", *configFlag, "--config") - articlesFlag := fs.String("articles", "", "Path to articles") - fs.StringVar(articlesFlag, "a", *articlesFlag, "--articles") - templatesFlag := fs.String("templates", "", "Path to templates") - fs.StringVar(templatesFlag, "t", *templatesFlag, "--templates") - outFlag := fs.String("out", "", "Path to output") - fs.StringVar(outFlag, "o", *outFlag, "--out") - - if err := fs.Parse(os.Args[1:]); err != nil { - return err - } - - if *configFlag != "" { - data, err := os.ReadFile(*configFlag) - if err != nil { - return err - } - switch ext := filepath.Ext(*configFlag); ext { - case ".yaml", ".yml": - if err := yaml.Unmarshal(data, &args); err != nil { - return err - } - case ".toml": - if err := toml.Unmarshal(data, &args); err != nil { - return err - } - default: - return fmt.Errorf("could not determine config type %q", ext) - } - } - - if *articlesFlag != "" { - args.ArticleDir = *articlesFlag - } - if args.ArticleDir == "" { - args.ArticleDir = "articles" - } - if *templatesFlag != "" { - args.TemplateDir = *templatesFlag - } - if args.TemplateDir == "" { - args.TemplateDir = "templates" - } - if *outFlag != "" { - args.OutDir = *outFlag - } - if args.OutDir == "" { - args.OutDir = "out" - } - - if err := os.MkdirAll(args.OutDir, os.ModePerm); err != nil { - return err - } - - blog, err := blog.NewBlog(args.ArticleDir, args.TemplateDir, args.Author) - if err != nil { - return err - } - - indexFile, err := os.Create(filepath.Join(args.OutDir, "index.html")) - if err != nil { - return err - } - defer indexFile.Close() - if err := blog.Index(indexFile); err != nil { - return err - } - - for _, article := range blog.Articles { - if err := func() error { - articleFile, err := os.Create(filepath.Join(args.OutDir, article.Filename+".html")) - if err != nil { - return err - } - defer articleFile.Close() - return blog.Article(articleFile, article) - }(); err != nil { - return err - } - } - - return nil -} diff --git a/cmd/chromacss/main.go b/cmd/chromacss/main.go deleted file mode 100644 index edf8cd5022a0e2574837c673ee0f869f4389a39f..0000000000000000000000000000000000000000 --- a/cmd/chromacss/main.go +++ /dev/null @@ -1,71 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - - "github.com/alecthomas/chroma/v2/formatters/html" - "github.com/alecthomas/chroma/v2/styles" -) - -func main() { - if err := maine(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func maine() error { - fs := flag.NewFlagSet("chromacss", flag.ExitOnError) - lightFlag := fs.String("light", "catppuccin-latte", "Light theme") - fs.StringVar(lightFlag, "l", *lightFlag, "--light") - darkFlag := fs.String("dark", "catppuccin-mocha", "Dark theme") - fs.StringVar(darkFlag, "d", *darkFlag, "--dark") - outFlag := fs.String("out", "", "Output (default: stdout)") - fs.StringVar(outFlag, "o", *outFlag, "--out") - if err := fs.Parse(os.Args[1:]); err != nil { - return err - } - - out := os.Stdout - if *outFlag != "" { - fi, err := os.Create(*outFlag) - if err != nil { - return err - } - defer fi.Close() - out = fi - } - - formatter := html.New(html.WithClasses(true), html.WithAllClasses(true)) - - lightStyle := *lightFlag - darkStyle := *darkFlag - - if lightStyle == "" { - lightStyle = "catppuccin-latte" - if darkStyle != "" { - lightStyle = darkStyle - darkStyle = "" - } - } - - styles.Fallback = styles.Get("catppuccin-latte") - style := styles.Get(lightStyle) - if err := formatter.WriteCSS(out, style); err != nil { - return err - } - - if darkStyle != "" { - out.WriteString("@media (prefers-color-scheme: dark) {") - styles.Fallback = styles.Get("catpuccin-mocha") - style = styles.Get(darkStyle) - if err := formatter.WriteCSS(out, style); err != nil { - return err - } - out.WriteString("}") - } - - return nil -} diff --git a/go.mod b/go.mod index 8c1aa017c7924a7b8ed3b4ceab8cde26ece9de51..ebf428e62bc7377fd661ad412ab8c6c312f3c820 100644 --- a/go.mod +++ b/go.mod @@ -3,30 +3,16 @@ go 1.21.6 require ( - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/alecthomas/assert v1.0.0 // indirect github.com/alecthomas/chroma/v2 v2.12.0 // indirect - github.com/alecthomas/colour v0.1.0 // indirect - github.com/alecthomas/repr v0.2.0 // indirect github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect github.com/dlclark/regexp2 v1.10.0 // indirect module go.jolheiser.com/blog - - github.com/jolheiser/goldmark-meta v0.0.2 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/pelletier/go-toml/v2 v2.1.1 // indirect -module go.jolheiser.com/blog github.com/alecthomas/assert v1.0.0 // indirect module go.jolheiser.com/blog - github.com/alecthomas/chroma/v2 v2.12.0 // indirect -module go.jolheiser.com/blog github.com/alecthomas/colour v0.1.0 // indirect github.com/yuin/goldmark-emoji v1.0.2 // indirect github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc // indirect github.com/yuin/goldmark-meta v1.1.0 // indirect - - go 1.21.6 - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 62a81853e4095cb8c64512a1f9d8ff9e25a8fc83..caa7d4f6c0a660af8270928e7bdf133b7c732019 100644 --- a/go.sum +++ b/go.sum @@ -1,18 +1,9 @@ -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/alecthomas/assert v1.0.0 h1:3XmGh/PSuLzDbK3W2gUbRXwgW5lqPkuqvRgeQ30FI5o= -github.com/alecthomas/assert v1.0.0/go.mod h1:va/d2JC+M7F6s+80kl/R3G7FUiW6JzUO+hPhLyJ36ZY= github.com/alecthomas/chroma/v2 v2.2.0 h1:Aten8jfQwUqEdadVFFjNyjx7HTexhKP0XuqBG67mRDY= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= github.com/alecthomas/chroma/v2 v2.12.0 h1:Wh8qLEgMMsN7mgyG8/qIpegky2Hvzr4By6gEF7cmWgw= github.com/alecthomas/chroma/v2 v2.12.0/go.mod h1:4TQu7gdfuPjSh76j78ietmqh9LiurGF0EpseFXdKMBw= -github.com/alecthomas/colour v0.1.0 h1:nOE9rJm6dsZ66RGWYSFrXw461ZIt9A6+nHgL7FRrDUk= -github.com/alecthomas/colour v0.1.0/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/alecthomas/assert v1.0.0/go.mod h1:va/d2JC+M7F6s+80kl/R3G7FUiW6JzUO+hPhLyJ36ZY= github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -22,33 +13,12 @@ github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/gorilla/feeds v1.1.2 h1:pxzZ5PD3RJdhFH2FsJJ4x6PqMqbgFk1+Vez4XWBW8Iw= -github.com/gorilla/feeds v1.1.2/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y= -github.com/jolheiser/goldmark-meta v0.0.2 h1:3qnvGnp1n7Cdu1L9LpuZrM6dfmbMAS22+hNJnxGPn6s= -github.com/jolheiser/goldmark-meta v0.0.2/go.mod h1:x5vZW1+kBEhR4+AKHwnNsD+nQaYdgmXoiFgG3fc6ZFc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= -github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= github.com/peterbourgon/ff/v3 v3.4.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/alecthomas/assert v1.0.0/go.mod h1:va/d2JC+M7F6s+80kl/R3G7FUiW6JzUO+hPhLyJ36ZY= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/alecthomas/assert v1.0.0/go.mod h1:va/d2JC+M7F6s+80kl/R3G7FUiW6JzUO+hPhLyJ36ZY= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.3.7 h1:NSaHgaeJFCtWXCBkBKXw0rhgMuJ0VoE9FB5mWldcrQ4= github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.15 h1:CFa84T0goNn/UIXYS+dmjjVxMyTAvpOmzld40N/nfK0= @@ -62,16 +32,8 @@ github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -github.com/alecthomas/assert v1.0.0 h1:3XmGh/PSuLzDbK3W2gUbRXwgW5lqPkuqvRgeQ30FI5o= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/goldmark.go b/goldmark.go index 404e8a5ff1189ddd0c7569bb22b4a44217dca46b..99f519f9fdc3e2bc2d605a469bc28c8d51a4eba7 100644 --- a/goldmark.go +++ b/goldmark.go @@ -1,14 +1,13 @@ package blog import ( - chromahtml "github.com/alecthomas/chroma/v2/formatters/html" + "github.com/alecthomas/chroma/v2/formatters/html" "github.com/yuin/goldmark" emoji "github.com/yuin/goldmark-emoji" highlighting "github.com/yuin/goldmark-highlighting/v2" meta "github.com/yuin/goldmark-meta" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/parser" - "github.com/yuin/goldmark/renderer/html" ) // Markdown is the default markdown converter @@ -16,9 +15,6 @@ // Set over this variable to alter how the other functions convert var Markdown = goldmark.New( goldmark.WithParserOptions( parser.WithAutoHeadingID(), - ), - goldmark.WithRendererOptions( - html.WithUnsafe(), ), goldmark.WithExtensions( extension.GFM, @@ -26,10 +22,11 @@ meta.Meta, emoji.Emoji, highlighting.NewHighlighting( highlighting.WithFormatOptions( - chromahtml.WithClasses(true), + html.WithClasses(true), - chromahtml.WithAllClasses(true), + html.WithLineNumbers(true), - chromahtml.WithLineNumbers(true), + html.WithLinkableLineNumbers(true, "code-"), import ( + highlighting "github.com/yuin/goldmark-highlighting/v2" ), ), ),