initial version generated by chatgpt, but cabal file does not work

This commit is contained in:
Willem van den Ende 2025-07-29 12:48:18 +02:00
commit 68507e85d1
8 changed files with 1872 additions and 0 deletions

1
LICENSE Normal file
View File

@ -0,0 +1 @@
MIT License

17
README.md Normal file
View File

@ -0,0 +1,17 @@
# Docster
A self-contained CLI tool that converts Markdown with Mermaid diagrams into PDF or HTML using Pandoc and Mermaid CLI.
## Usage
docster -pdf path/to/file.md
docster -html path/to/file.md
Mermaid code blocks (```mermaid) will be rendered to SVG and embedded.
## Requirements
- GHC + Cabal (via ghcup)
- Pandoc
- TeX Live (for PDF)
- Mermaid CLI (`npm install -g @mermaid-js/mermaid-cli`)

68
app/Main.hs Normal file
View File

@ -0,0 +1,68 @@
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Text.Pandoc
import Text.Pandoc.Error
import Text.Pandoc.Class (runIOorExplode)
import Text.Pandoc.PDF (makePDF)
import System.Environment (getArgs)
import System.FilePath (replaceExtension)
import System.Process (callProcess)
import System.IO (writeFile)
import System.Directory (doesFileExist)
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Data.Hashable (hash)
import Control.Monad (when, void)
-- Transform Mermaid code blocks into image embeds
processMermaid :: Block -> IO Block
processMermaid (CodeBlock (id', classes, _) contents)
| "mermaid" `elem` classes = do
let baseName = if null id' then "diagram-" ++ take 6 (show (abs (hash contents))) else id'
mmdFile = baseName ++ ".mmd"
svgFile = baseName ++ ".svg"
writeFile mmdFile contents
exists <- doesFileExist svgFile
when (not exists) $ void $ callProcess "mmdc" ["-i", mmdFile, "-o", svgFile]
return $ Para [Image nullAttr [] (T.pack svgFile, "Mermaid diagram")]
processMermaid x = return x
-- Walk the Pandoc AST and process blocks
transformDoc :: Pandoc -> IO Pandoc
transformDoc = walkM processMermaid
main :: IO ()
main = do
args <- getArgs
case args of
["-pdf", path] -> compileToPDF path
["-html", path] -> compileToHTML path
_ -> putStrLn "Usage: docster -pdf|-html <file.md>"
compileToPDF :: FilePath -> IO ()
compileToPDF path = do
content <- TIO.readFile path
pandoc <- runIOorExplode $ readMarkdown def content
transformed <- transformDoc pandoc
let outputPath = replaceExtension path "pdf"
result <- runIOorExplode $ makePDF "pdflatex" [] transformed
case result of
Left err -> error $ "PDF error: " ++ show err
Right bs -> writeFile outputPath bs >> putStrLn ("✅ PDF written to " ++ outputPath)
compileToHTML :: FilePath -> IO ()
compileToHTML path = do
content <- TIO.readFile path
pandoc <- runIOorExplode $ readMarkdown def content
transformed <- transformDoc pandoc
let outputPath = replaceExtension path "html"
html <- runIOorExplode $ writeHtml5String def transformed
TIO.writeFile outputPath html
putStrLn ("✅ HTML written to " ++ outputPath)

BIN
dist-newstyle/cache/config vendored Normal file

Binary file not shown.

19
docster.cabal Normal file
View File

@ -0,0 +1,19 @@
cabal-version: >=1.24
name: docster
version: 0.1.0.0
build-type: Simple
executable docster
main-is: Main.hs
hs-source-dirs: app
build-depends:
base >=4.14 && <5,
text,
filepath,
directory,
process,
hashable,
pandoc,
pandoc-types,
pandoc-pdf
default-language: Haskell2010

9
mermaid-to-svg/sample.md Normal file
View File

@ -0,0 +1,9 @@
# Example Document
This diagram should render:
```mermaid
graph TD
A --> B
B --> C
```

6
mise.toml Normal file
View File

@ -0,0 +1,6 @@
[tools]
cabal = "3.16.0.0"
# Node.js - required for Claude Code (18+) and frontend assets
node = "24.0.1"

1752
participant-pointers.md Normal file

File diff suppressed because it is too large Load Diff