Studio

studio convert markdown files and organizes the resulting html pages. In addition, having the flexibility to change a template 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

In addition, I was tainted by the influence of code golf. My goal was to create this static-site generator in 100 lines of Haskell. I reached my goal, sacraficing all of the readability. I later made it readable, 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) </code></pre>

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