mirror of
https://github.com/veggiemonk/awesome-docker.git
synced 2026-06-30 18:40:32 +02:00
29222bfcb5
* feat: add prune subcommand, drop archived/stale entries, add container-explorer Add a new `awesome-docker prune` subcommand that removes README entries whose repository health status matches a configurable set (default: archived,stale). URLs are read from the local health cache, or from a markdown report file via --from-report when the cache is outdated. Apply it against the issue #1439 health report to remove 5 entries that survived the recent reorg: stitchocker, docker-consul, blockbridge-docker-volume, docker-explorer, dockdash. Add google/container-explorer in the Security section as the actively maintained successor to the now-archived google/docker-explorer. Co-Authored-By: Claude <noreply@anthropic.com> * golangci-lint config * fix: address golangci-lint findings Fixes errcheck on bufio.Writer.WriteString, gocritic rangeValCopy via indexed loops with pointer locals, gosec G703 on user-supplied CLI output path, noctx by switching to exec.CommandContext with a timeout in the TUI url opener, prealloc in the scorer test, plus fieldalignment struct reorders and golines line breaks from --fix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
77 lines
2.0 KiB
Markdown
77 lines
2.0 KiB
Markdown
package builder
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/yuin/goldmark"
|
|
"github.com/yuin/goldmark/extension"
|
|
"github.com/yuin/goldmark/parser"
|
|
"github.com/yuin/goldmark/renderer/html"
|
|
)
|
|
|
|
// Build converts a Markdown file to HTML using a template.
|
|
// The template must contain a placeholder element that will be replaced with the rendered content.
|
|
func Build(markdownPath, templatePath, outputPath string) error {
|
|
md, err := os.ReadFile(markdownPath)
|
|
if err != nil {
|
|
return fmt.Errorf("read markdown: %w", err)
|
|
}
|
|
|
|
tmpl, err := os.ReadFile(templatePath)
|
|
if err != nil {
|
|
return fmt.Errorf("read template: %w", err)
|
|
}
|
|
|
|
// Convert markdown to HTML
|
|
gm := goldmark.New(
|
|
goldmark.WithExtensions(extension.GFM),
|
|
goldmark.WithParserOptions(parser.WithAutoHeadingID()),
|
|
goldmark.WithRendererOptions(html.WithUnsafe()),
|
|
)
|
|
var buf bytes.Buffer
|
|
if err := gm.Convert(md, &buf); err != nil {
|
|
return fmt.Errorf("convert markdown: %w", err)
|
|
}
|
|
|
|
// Inject into template — support both placeholder formats
|
|
output := string(tmpl)
|
|
replacements := []struct {
|
|
old string
|
|
new string
|
|
}{
|
|
{
|
|
old: `<div id="md"></div>`,
|
|
new: `<div id="md">` + buf.String() + `</div>`,
|
|
},
|
|
{
|
|
old: `<section id="md" class="main-content"></section>`,
|
|
new: `<section id="md" class="main-content">` + buf.String() + `</section>`,
|
|
},
|
|
}
|
|
|
|
replaced := false
|
|
for _, r := range replacements {
|
|
if strings.Contains(output, r.old) {
|
|
output = strings.Replace(output, r.old, r.new, 1)
|
|
replaced = true
|
|
break
|
|
}
|
|
}
|
|
if !replaced {
|
|
return errors.New("template missing supported markdown placeholder")
|
|
}
|
|
|
|
// outputPath is a CLI-provided destination for a generated website file;
|
|
// the user controls the destination by design, so the taint warning is expected.
|
|
//nolint:gosec // G306,G304: user-supplied output path is intentional for this CLI
|
|
if err := os.WriteFile(filepath.Clean(outputPath), []byte(output), 0o644); err != nil {
|
|
return fmt.Errorf("write output: %w", err)
|
|
}
|
|
return nil
|
|
}
|