Main.hs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. module Main where
  2. import Development.Shake
  3. import Development.Shake.Command
  4. import Development.Shake.FilePath
  5. import Development.Shake.Util
  6. indexes :: [FilePath] -> [FilePath]
  7. indexes = map (\file -> "_site" </> file </> "index.html")
  8. csses :: [FilePath] -> [FilePath]
  9. csses = map (\file -> "_site" </> file <.> "css")
  10. main :: IO ()
  11. main = shakeArgs shakeOptions{shakeFiles="_build"} $ do
  12. want (indexes ["", "about", "articles", "languages/dapiica", "languages/tava", "doctor-who", "log"])
  13. want (csses ["style", "dapiica", "doctor-who/style"])
  14. want ["_site/images/marker.txt"]
  15. phony "push" $ do
  16. cmd_ "neocities push _site"
  17. phony "clean" $ do
  18. putNormal "Cleaning files from _site and _build"
  19. removeFilesAfter "_site" ["//*"]
  20. removeFilesAfter "_build" ["//*"]
  21. "//*index.html" %> \out -> do
  22. case out of
  23. "_site/doctor-who/index.html"
  24. -> do let db = "src/dw/DrWhoDB.yaml"
  25. let code = ["src/dw/DrWho.hs", "src/dw/IntroOutro.hs", "src/dw/HTML.hs", "src/dw/Data.hs"]
  26. need (db : code)
  27. mkdir (takeDirectory out)
  28. command_ [Cwd "src/dw"] "cabal" ["run", "output", "../../" ++ out]
  29. _
  30. -> do let src = case getMiddle out of
  31. "" -> "src/index.md"
  32. "log" -> "_build/logfile.html"
  33. name -> "src" </> name <.> "md"
  34. let navbar = "_build" </> getMiddle out </> "header.html"
  35. let css = generatePrefix (takeDirectory out)
  36. ++ if contains "languages/dapiica" (getMiddle out)
  37. then "dapiica.css" else "style.css"
  38. let leipzig = if contains "languages" out
  39. then "--css //cdn.jsdelivr.net/leipzig/latest/leipzig.min.css"
  40. else ""
  41. dirExists <- doesDirectoryExist ("src" </> getMiddle out)
  42. (if dirExists
  43. then do files <- getDirectoryFiles ("src" </> getMiddle out) ["//*md"]
  44. let buildnames = map (\file -> "_site" </> getMiddle out </> dropExtension file </> "index.html") files
  45. need buildnames
  46. else pure ())
  47. need [src, navbar]
  48. mkdir (takeDirectory out)
  49. cmd_ "pandoc --standalone -B" [navbar] "--css" [css] leipzig "-o" [out] [src]
  50. "//*header.html" %> \out -> do
  51. let prefix = generatePrefix (takeDirectory out)
  52. let script = if contains "languages" out then includeScript else ""
  53. mkdir (takeDirectory out)
  54. writeFile' out (header prefix ++ script)
  55. "_site/style.css" %> \out -> do
  56. let css = "src/style.css"
  57. copyFile' css out
  58. "_site/dapiica.css" %> \out -> do
  59. let css = "src/dapiica.css"
  60. copyFile' css out
  61. "_site/doctor-who/style.css" %> \out -> do
  62. let css = "src/dw/style.css"
  63. copyFile' css out
  64. "_site/archive-2017.zip" %> \out -> do
  65. let zip = "src/archive-2017.zip"
  66. copyFile' zip out
  67. "_build/logfile.html" %> \out -> do
  68. logs <- getDirectoryFiles "src/log" ["//*.md"]
  69. let builtLogs = map (\log -> "_build/log/" ++ (log -<.> "html")) logs
  70. need builtLogs
  71. cmd_ "pandoc --standalone --metadata=title:Log -o" out (reverse builtLogs)
  72. -- cmd_ "pandoc --file-scope --template" [template] "-o" [out] logs
  73. "_site/images/marker.txt" %> \out -> do
  74. mkdir (takeDirectory out)
  75. images <- getDirectoryFiles "src/images" ["//*"]
  76. mapM_ (\img -> copyFile' ("src/images" </> img) (takeDirectory out </> img)) images
  77. writeFile' out markerText
  78. (\filepath -> (contains "_build/log" filepath) && (not $ contains "header" filepath)) ?> \out -> do
  79. let src = "src" </> dropDirectory1 out -<.> "md"
  80. let template = "src/log.template"
  81. let date = dropExtension $ takeBaseName out
  82. need [src, template]
  83. cmd_ "pandoc --template" [template] "-o" [out] ("--metadata=date:" ++ date) src
  84. getMiddle :: FilePath -> FilePath
  85. getMiddle string = dropDirectory1 $ takeDirectory string
  86. countLayers s = length (filter (=='/') s)
  87. generatePrefix s = generatePrefix' (countLayers s)
  88. where
  89. generatePrefix' 0 = "./"
  90. generatePrefix' n = concat $ replicate n "../"
  91. header prefix = "<div id=\"header\">\n"
  92. ++ "<div id=navigation>\n"
  93. ++ link headerStyle (prefix) "Home"
  94. ++ "\n"
  95. ++ link headerStyle (prefix ++ "articles") "Articles"
  96. ++ "\n"
  97. ++ link headerStyle (prefix ++ "doctor-who") "Doctor&nbsp;Who&nbsp;Guide"
  98. ++ "\n"
  99. ++ link headerStyle (prefix ++ "languages/dapiica") "Dapiica"
  100. ++ "\n"
  101. ++ link headerStyle (prefix ++ "about") "About"
  102. ++ "\n"
  103. ++ link headerStyle (prefix ++ "log") "Log"
  104. ++ "\n"
  105. ++ "</div></div>\n"
  106. where headerStyle = "headerlink"
  107. link style url name = "<a class=\"" ++ style ++ "\" href=\"" ++ url ++ "\">" ++ name ++ "</a>"
  108. contains (x:xs) [] = False
  109. contains xs ys
  110. | prefix xs ys = True
  111. | contains xs (tail ys) = True
  112. | otherwise = False
  113. where
  114. prefix [] ys = True
  115. prefix (x:xs) [] = False
  116. prefix (x:xs) (y:ys) = (x == y) && prefix xs ys
  117. mkdir = cmd_ "mkdir -p"
  118. markerText = "This file only exists to satisfy the build system"
  119. includeScript =
  120. "<script src=\"//cdn.jsdelivr.net/leipzig/latest/leipzig.min.js\"></script>"
  121. ++ "\n"
  122. ++ "<script>"
  123. ++ "\n"
  124. ++ " document.addEventListener('DOMContentLoaded', function() {"
  125. ++ "\n"
  126. ++ " Leipzig({ firstLineOrig: true}).gloss();"
  127. ++ "\n"
  128. ++ " });"
  129. ++ "\n"
  130. ++ "</script>"