summaryrefslogtreecommitdiff
path: root/transformations.go
diff options
context:
space:
mode:
authorNicolas Paul <n@nc0.fr>2023-04-26 03:45:11 +0200
committerNicolas Paul <n@nc0.fr>2023-04-26 03:45:11 +0200
commit3b41c3e2008498a804a03154f5b876827f1f4e7c (patch)
treebd36b8671ad9b99fecfd353e335e1660287224c6 /transformations.go
parentdab887d5b26df8ba45bf61e426736684a1d8df78 (diff)
Add HTML generation
Diffstat (limited to 'transformations.go')
-rw-r--r--transformations.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/transformations.go b/transformations.go
new file mode 100644
index 0000000..7053a94
--- /dev/null
+++ b/transformations.go
@@ -0,0 +1,105 @@
+// Copyright (c) 2023 Nicolas Paul All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/gomarkdown/markdown"
+ "github.com/gomarkdown/markdown/html"
+ "github.com/gomarkdown/markdown/parser"
+)
+
+// TransformMarkdownFile simply copy a non-markdown file to the output
+// directory.
+func TransformNonMarkdownFile(inputDir, inputFile, outputDir string) error {
+ inputPath := filepath.Join(inputDir, inputFile)
+
+ input, err := os.ReadFile(inputPath)
+ if err != nil {
+ return err
+ }
+
+ outputPath := filepath.Join(outputDir, inputFile)
+ if err := os.WriteFile(outputPath, input, 0666); err != nil {
+ return err
+ }
+
+ log.Printf("copied file %q to %q", inputPath, outputPath)
+
+ return nil
+}
+
+// TransformDirectory creates a directory in the output directory.
+func TransformDirectory(inputDir, inputFile, outputDir string) error {
+ outputPath := filepath.Join(outputDir, inputFile)
+
+ if err := os.MkdirAll(outputPath, 0777); err != nil {
+ return err
+ }
+
+ log.Printf("created directory %q", outputPath)
+
+ return nil
+}
+
+// TransformMarkdownFile generates the corresponding HTML document from a
+// Markdown file.
+func TransformMarkdownFile(inputDir, inputFile, outputDir string) error {
+ inputPath := filepath.Join(inputDir, inputFile)
+
+ // The output file is the same as the input file, but with a different
+ // extension.
+ fn := strings.TrimSuffix(inputFile, filepath.Ext(inputFile)) + ".html"
+ outputPath := filepath.Join(outputDir, fn)
+
+ contentRaw, err := os.ReadFile(inputPath)
+ if err != nil {
+ return err
+ }
+
+ // Parse front matter
+ fm, contentMD, err := ParseFrontMatter(contentRaw)
+ if err != nil {
+ return err
+ }
+
+ // Skip hidden files unless -hidden is specified
+ if fm.Hide && !*generateHidden {
+ log.Printf("skipped hidden file %q", inputPath)
+ return nil
+ }
+
+ // Render Markdown to HTML
+ pExtensions := parser.Tables | parser.FencedCode |
+ parser.Autolink | parser.Strikethrough | parser.SpaceHeadings |
+ parser.HeadingIDs | parser.BackslashLineBreak |
+ parser.AutoHeadingIDs | parser.Footnotes | parser.SuperSubscript |
+ parser.NoIntraEmphasis
+ p := parser.NewWithExtensions(pExtensions)
+ doc := p.Parse(contentMD)
+
+ htmlFlags := html.Smartypants | html.SmartypantsFractions |
+ html.SmartypantsDashes | html.SmartypantsLatexDashes |
+ html.HrefTargetBlank | html.LazyLoadImages
+ renderer := html.NewRenderer(html.RendererOptions{Flags: htmlFlags})
+ contentHTML := markdown.Render(doc, renderer)
+
+ outputFile, err := os.Create(outputPath)
+ if err != nil {
+ return err
+ }
+ defer outputFile.Close()
+
+ if err := GenerateHTML(outputFile, fm, string(contentHTML)); err != nil {
+ return err
+ }
+
+ log.Printf("generated file %q", outputPath)
+ return nil
+}