Studio

Studio converts markdown file to organized html pages - having the flexibility to change templates and adding custom css and javascript. With static webpages - your site is fast, secure and easy to deploy

I built this program during summer 2014. The purpose of this program was to improve my Haskell knowledge and to start posting online. I tried other static site generators but found they didn't meet my needs

At the time, I was having fun doing code golf, so I set a goal to create a static-site generator in 100 lines of Haskell. I reached my goal, sacraficing all of the readability. I later made it corrected that, adding spaces and expanding the equations.

.md text files are the inputs to studio. I used markdown which is a standard so you can add titles, links and images. We take the titles in the text files and create a table of contents for a main page, generating a link for each article.

Haskell is a functional language, I had to divide the functional vs the unfunctional real world. It is also a dense language, you can do a lot of modifications in a few lines of codes vs other languages. We divide this program into 3 steps

I made a data structure called Page which has the file path and date.

data Page = Page { title :: FilePath -- Path to words , static :: [FilePath] -- List of static files , date :: [String] -- Month,day,year } deriving (Show)

Create and order pages

Each folder in a directory is added to a list and sent to the getPages function, this returns an IO with the pages seen inside. GetStatic file creates a list of extra js or css files linked to the article. This offered some flexiblility to have custom assets for an article

getPages :: [FilePath] -> IO [Page] getPages = mapM (\x -> do static <- getStatic ("Articles/" ++ x) date <- getPageDate ("Articles/" ++ x ++ "/words.md") return (Page x static date))

Create html from template and pages

To write a page required a template in the form of a HTML and a Page from above. Pandoc library converted the markdown text files to HTML

writePage :: String -> Page -> IO () writePage template page = do let year = last $ date page let urlTitle = urlConvert (title page) mdArt <- readFile ("Articles/" ++ urlTitle ++ "/words.md") let pandocArt = readMarkdown def mdArt let html = writeHtmlString (siteOptions template) pandocArt createDirectoryIfMissing True $ "Output/" ++ year ++ "/" ++ urlTitle writeFile ("Output/" ++ year ++ "/" ++ urlTitle ++ "/index.html") html

Write table of contents

The table of contents also use the template but also include some html to make it look pretty

writeTOC :: String -> [Page] -> IO () writeTOC template pages = do list <- mapM getItem pages let html = writeHtmlString (siteOptions template) (tocWrap list) createDirectoryIfMissing True $ "Output/archives" writeFile "Output/archives/index.html" html

That is most likely 80% of the functions of the studio. With most other things being moving files around. Thank you for reading. You can find the code here