An open API service indexing awesome lists of open source software.

https://github.com/agrison/jssg

Java static site generator
https://github.com/agrison/jssg

Last synced: 11 months ago
JSON representation

Java static site generator

Awesome Lists containing this project

README

          

# Jssg: Java Static Site Generator

Jssg is a simple static site generator like Jekyll, but with less features and written in Java.
The concept behind is the same as all static site generators.
The program takes a directory containing blog posts and site pages written in either `Markdown` or `Textile`, and merge the generated markup in a complete set of `HTML` files using `Freemarker`.
Then the site can be easily put on any web server, or even on GitHub.

## Getting Started

### Install Jssg

To get a copy of **jssg** just clone the git repository and `mvn package`.

$ git clone git://github.com/agrison/jssg.git
$ cd jssg
$ mvn package
-- add jsgg to your $PATH

### Init

To create a default site structure, just call `jssg -init`.

$ mkdir myblog
$ cd myblog
$ jssg -init

After the `init` command has finish to run, you should have the following structure:

+ _layout/
|--+ index.html
|--+ blog.html
+ _posts/
|--+ yyyy-MM-dd-Hello.markdown
|--+ 2011-11-20-Unix-Prompt.markdown
+ index.textile
+ config.properties

You can edit some of the properties in the `config.properties` file, for instance the path to `pygments`.

* A default index page content is written in the `index.textile` file, and its layout is written in `_layout/index.html`.
* A default blog post is written in the `_posts/yyyy-MM-dd-Hello.mkd` file, and its layout is written in `_layout/blog.html`.

### Write content

With the `jssg -init` command you have already a default index page and a first blog post, but you can add more if you want.

$ cat < _posts/2011-10-29-Hello.mkd
---
title: Hello
layout: blog
description: Welcome
date: 2011-10-29
comments: true
url: /2011/10/29/Hello
---

Hello
==============
Welcome to my blog.
EOF

Write an about page.

$ cat < about.textile
---
title: My awesome webpage
layout: index
description: About page
---

h2. About

I'm what's up New York.

### Create your layout

If you need to customize the layouts, the files are located in `_layouts`, below are two commands that shows what are the defaults
bundled in the sample.

$ cat < _layout/blog.html



${header['title']}



${header['date']?date?string.medium}

${content}

<#if header['comments']??>




var disqus_shortname = '***';
var disqus_identifier = '/blog/${header['title']}';
var disqus_url = 'http://www.foo.com${header['url']}';
var disqus_developer = 1;
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();

Please enable JavaScript to view the comments powered by Disqus.

#if>


Create the index page:

$ cat < _layout/index.html



Welcome to my website



${content}

Blog posts



    <#assign blogPosts = posts?sort_by("date")>
    <#foreach post in blogPosts?reverse>

  • ${post.date?date?string.medium}${post.title}

  • #foreach>



### Run jssg

Run the command `jssg -build -serve` to generate the whole site, then browse the site.

$ jssg -build -serve
.--.
.--,`| .--.--. .--.--. ,----._,.
| |. / / ' / / ' / / ' /
'--`_ | : /`./ | : /`./ | : |
,--,'| | : ;_ | : ;_ | | .\ .
| | ' \ \ `. \ \ `. . ; '; |
: | | `----. \ `----. \ ' . . |
__| : ' / /`--' / / /`--' / `---`-'| |
.'__/\_: | '--'. / '--'. / .'__/\_: |
| : : `--'---' `--'---' | : :
\ \ / \ \ /
`--`-' `--`-'

Looking for posts in _posts/
About to process 1 file
+ Processing 2011-10-29-Hello.markdown...

Looking for pages in ./
About to process 1 file
+ Processing index.textile...

Site generated in 0.50 sec
Starting the Jetty server at http://localhost:9876 ...

$ curl http://localhost:9876/2011/10/29/Hello | grep Hello
Hello

Hello


var disqus_identifier = '/blog/Hello';
var disqus_url = 'http://www.foo.com/2011/10/29/Hello';

$ curl http://localhost:9876 | grep personal

Welcome to my personal web site. You will find some great stuff here.

$ open http://localhost:9876

When you run `jssg` with the `-serve` argument, it rebuilds any post or static page that you modify when it notices it,
so that you just have to refresh your browser.

## How it works

Invoking `jssg -build` will build the website by doing specific tasks:

* Scan the `_posts/` directory for each file having the pattern `yyyy-MM-dd-something.(mkd|markdown|textile)`
* Detect code snippets (if any)
* Generate the HTML markup equivalent for the `Markdown` or `Textile` file content
* Highlight code snippets with (`Jygments` / `Pygments`)
* Merge the HTML into the layout found in the `_layout/` directory using Freemarker
* Write the whole content in `_build/yyyy/MM/dd/something`
* Scan the current directory for each file having the `mkd|markdown|textile` extension
* Do exactly the same as above
* Copy everything that is in the current directory that has not already been processed into the `_build/` directory.

All these tasks are being executed automatically and takes just seconds.

## Dependencies

**Jssg** supports code snippets higlighting through `Pygments`, so it should be in your `PATH` or you may set the path to it in the `config.properties` file.

**Jssg** is packaged as only one big fat JAR which includes all its dependencies.
These dependencies are resolved through Maven or via the `libs` directory bundled with the source code:

* Spring
* Google Guava
* Markdown4J
* Textile4j
* Freemarker
* SnakeYaml
* Jsoup
* Jygments
* Logback
* Args4j
* Jetty

## Todos

* Refactoring of external formatters, to generate multiple outputs like `LaTeX`, `PDF` through `Flying Saucer`, ...
* More features
* Less bugs.