summaryrefslogtreecommitdiffstats
path: root/README.md
blob: 3c9e21e42c64aa3fc5fdc0ae5ffe04697c009c91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
# Hugo

A really fast static site generator written in GoLang.

## Overview

Hugo is a static site generator written in GoLang. It is optimized for
speed, easy use and configurability. Hugo takes a directory with content and
templates and renders them into a full html website.

Hugo makes use of markdown files with front matter for meta data.

A typical website of moderate size can be
rendered in a fraction of a second. It is written to work well with any
kind of website including blogs, tumbles and docs.


# Getting Started

## Installing Hugo

Hugo is written in GoLang with support for Windows, Linux, FreeBSD and OSX.

The latest release can be found at [hugo releases](https://github.com/spf13/hugo/releases).
We currently build for Windows, Linux, FreeBSD and OS X for x64
and 386 architectures.

### Installing Hugo (binary)

Installation is very easy. Simply download the appropriate version for your
platform from [hugo releases](https://github.com/spf13/hugo/releases).
Once downloaded it can be run from anywhere. You don't need to install
it into a global location. This works well for shared hosts and other systems
where you don't have a privileged account.

Ideally you should install it somewhere in your path for easy use. `/usr/local/bin` 
is the most probable location.

*the Hugo executible has no external dependencies.*

### Installing from source

#### Dependencies

* Git
* Go 1.1+
* Mercurial
* Bazaar

#### Clone locally (for contributors):

    git clone https://github.com/spf13/hugo
    cd hugo
    go get

Because go expects all of your libraries to be found in either $GOROOT or $GOPATH,
it's helpful to symlink the project to one of the following paths:

 * ln -s /path/to/your/hugo $GOPATH/src/github.com/spf13/hugo
 * ln -s /path/to/your/hugo $GOROOT/src/pkg/github.com/spf13/hugo

#### Get directly from Github:

If you don't intend to contribute, it's even easier. 

    go get github.com/spf13/hugo

#### Running Hugo

    cd /path/to/hugo
    go run main.go

#### Building Hugo

    cd /path/to/hugo
    go build -o hugo main.go
    mv hugo /usr/local/bin/

## Source Directory Organization

Hugo takes a single directory and uses it as the input for creating a complete website.

Hugo has a very small amount of configuration, while remaining highly customizable.
It accomplishes by assuming that you will only provide templates with the intent of
using them.

An example directory may look like:

    .
    ├── config.json
    ├── content
    |   ├── post
    |   |   ├── firstpost.md
    |   |   └── secondpost.md
    |   └── quote
    |   |   ├── first.md
    |   |   └── second.md
    ├── layouts
    |   ├── chrome
    |   |   ├── header.html
    |   |   └── footer.html
    |   ├── indexes
    |   |   ├── category.html
    |   |   ├── post.html
    |   |   ├── quote.html
    |   |   └── tag.html
    |   ├── post
    |   |   ├── li.html
    |   |   ├── single.html
    |   |   └── summary.html
    |   ├── quote
    |   |   ├── li.html
    |   |   ├── single.html
    |   |   └── summary.html
    |   ├── shortcodes
    |   |   ├── img.html
    |   |   ├── vimeo.html
    |   |   └── youtube.html
    |   ├── index.html
    |   └── rss.xml
    └── public

This directory structure tells us a lot about this site:

1. the website intends to have two different types of content, posts and quotes.
2. It will also apply two different indexes to that content, categories and tags.
3. It will be displaying content in 3 different views, a list, a summary and a full page view.

Included with the repository is an example site ready to be rendered.

## Configuration

The directory structure and templates provide the majority of the
configuration for a site. In fact a config file isn't even needed for many websites
since the defaults used follow commonly used patterns.

**Please note the field names must be all lowercase**

### Config Examples

The following is an example of a yaml config file with the default values:

    ---
    sourcedir: "content"
    layoutdir: "layouts"
    publishdir: "public"
    builddrafts: false
    indexes:
       category: "categories"
       tag: "tags"
    baseurl: "http://yoursite.com/"
    ...


The following is an example of a json config file with the default values:

    {
        "sourcedir": "content",
        "layoutdir": "layouts",
        "publishdir": "public",
        "builddrafts": false,
        "indexes": {
           category: "categories",
           tag: "tags"
        },
        "baseurl": "http://yoursite.com/"
    }


The following is an example of a toml config file with the default values:

    sourcedir = "content"
    layoutdir = "layouts"
    publishdir = "public"
    builddrafts = false
    baseurl = "http://yoursite.com/"
    [indexes]
       category = "categories"
       tag = "tags"


## Usage
Make sure either hugo is in your path or provide a path to it.

    $ hugo --help
    usage: hugo [flags] []
      -b, --base-url="": hostname (and path) to the root eg. http://spf13.com/
      -d, --build-drafts=false: include content marked as draft
          --config="": config file (default is path/config.yaml|json|toml)
      -h, --help=false: show this help
          --port="1313": port to run web server on, default :1313
      -S, --server=false: run a (very) simple web server
      -s, --source="": filesystem path to read files relative from
          --uglyurls=false: use /filename.html instead of /filename/
      -v, --verbose=false: verbose output
          --version=false: which version of hugo
      -w, --watch=false: watch filesystem for changes and recreate as needed

The most common use is probably to run hugo with your current
directory being the input directory.


    $ hugo
    > X pages created
    > Y indexes created


If you are working on things and want to see the changes
immediately, tell Hugo to watch for changes. **It will
recreate the site faster than you can tab over to
your browser to view the changes.**

    $ hugo --source ~/mysite --watch
       Watching for changes. Press ctrl+c to stop
       15 pages created
       0 tags created

Hugo can even run a server and create your site at the same time!

    $hugo --server -ws ~/mysite
       Watching for changes. Press ctrl+c to stop
       15 pages created
       0 tags created
       Web Server is available at http://localhost:1313
       Press ctrl+c to stop

# Layout

Hugo is very flexible about how you organize and structure your content.

## Templates

Hugo uses the excellent golang html/template library for it's template engine. It is an extremely
lightweight engine that provides a very small amount of logic. In our
experience that it is just the right amount of logic to be able to create a good static website

This document will not cover how to use golang templates, but the [golang docs](http://golang.org/pkg/html/template/)
provide a good introduction.

### Template roles

There are 5 different kinds of templates that Hugo works with.

#### index.html
This file must exist in the layouts directory. It is the template used to render the
homepage of your site.

#### rss.xml
This file must exist in the layouts directory. It will be used to render all rss documents.
The one provided in the example application will generate an ATOM format.

*Important: Hugo will automatically add the following header line to this file.*

    <?xml version="1.0" encoding="utf-8" standalone="yes" ?>

#### Indexes
An index is a page that list multiple pieces of content. If you think of a typical blog, the tag
pages are good examples of indexes.


#### Content Type(s)
Hugo supports multiple types of content. Another way of looking at this is that Hugo has the ability
to render content in a variety of ways as determined by the type.

#### Chrome
Chrome is simply the decoration of your site. It's not a requirement to have this, but in practice
it's very convenient. Hugo doesn't know anything about Chrome, it's simply a convention that you may
likely find beneficial. As you create the rest of your templates you will include templates from the
/layout/chrome directory. I've found it helpful to include a header and footer template
in Chrome so I can include those in the other full page layouts (index.html, indexes/ type/single.html).

### Adding a new content type

Adding a type is easy.

**Step 1:**
Create a directory with the name of the type in layouts.Type is always singular.  *Eg /layouts/post*.

**Step 2:**
Create a file called single.html inside your directory. *Eg /layouts/post/single.html*.

**Step 3:**
Create a file with the same name as your directory in /layouts/indexes/. *Eg /layouts/index/post.html*.

**Step 4:**
Many sites support rendering content in a few different ways, for instance a single page view and a
summary view to be used when displaying a list of contents on a single page. Hugo makes no assumptions
here about how you want to display your content, and will support as many different views of a content
type as your site requires. All that is required for these additional views is that a template
exists in each layout/type directory with the same name.

For these, reviewing the example site will be very helpful in order to understand how these types work.

## Variables

Hugo makes a set of values available to the templates. Go templates are context based. The following
are available in the context for the templates.

**.Title**  The title for the content. <br>
**.Description** The description for the content.<br>
**.Keywords** The meta keywords for this content.<br>
**.Date** The date the content is published on.<br>
**.Indexes** These will use the field name of the plural form of the index (see tags and categories above)<br>
**.Permalink** The Permanent link for this page.<br>
**.FuzzyWordCount** The approximate number of words in the content.<br>
**.RSSLink** Link to the indexes' rss link <br>

Any value defined in the front matter, including indexes will be made available under `.Params`.
Take for example I'm using tags and categories as my indexes. The following would be how I would access them:

**.Params.Tags** <br>
**.Params.Categories** <br>

Also available is `.Site` which has the following:

**.Site.BaseUrl** The base URL for the site as defined in the config.json file.<br>
**.Site.Indexes** The names of the indexes of the site.<br>
**.Site.LastChange** The date of the last change of the most recent content.<br>
**.Site.Recent** Array of all content ordered by Date, newest first<br>

# Content
Hugo uses markdown files with headers commonly called the front matter. Hugo respects the organization
that you provide for your content to minimize any extra configuration, though this can be overridden
by additional configuration in the front matter.

## Organization
In Hugo the content should be arranged in the same way they are intended for the rendered website.
Without any additional configuration the following will just work.

    .
    └── content
        ├── post
        |   ├── firstpost.md   // <- http://site.com/post/firstpost.html
        |   └── secondpost.md  // <- http://site.com/post/secondpost.html
        └── quote
            ├── first.md       // <- http://site.com/quote/first.html
            └── second.md      // <- http://site.com/quote/second.html


## Front Matter

The front matter is one of the features that gives Hugo it's strength. It enables
you to include the meta data of the content right with it. Hugo supports a few
different formats each with their own identifying tokens.

Supported formats: <br>
  **YAML**, identified by '\-\-\-'. <br>
  **TOML**, indentified with '+++'.<br>
  **JSON**, a single JSON object which is surrounded by '{' and '}' each on their own line.

### YAML Example

    ---
    title: "spf13-vim 3.0 release and new website"
    description: "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
    tags: [ ".vimrc", "plugins", "spf13-vim", "vim" ]
    pubdate: "2012-04-06"
    categories:
      - "Development"
      - "VIM"
    slug: "spf13-vim-3-0-release-and-new-website"
    ---
    Content of the file goes Here

### TOML Example

    +++
    title = "spf13-vim 3.0 release and new website"
    description = "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
    tags = [ ".vimrc", "plugins", "spf13-vim", "vim" ]
    Pubdate = "2012-04-06"
    categories = [
      "Development",
      "VIM"
    ]
    slug = "spf13-vim-3-0-release-and-new-website"
    +++
    Content of the file goes Here

### JSON Example

    {
    "title": "spf13-vim 3.0 release and new website",
    "description": "spf13-vim is a cross platform distribution of vim plugins and resources for Vim.",
    "tags": [ ".vimrc", "plugins", "spf13-vim", "vim" ],
    "date": "2012-04-06",
    "categories": [
        "Development",
        "VIM"
    ],
    "slug": "spf13-vim-3-0-release-and-new-website",
    }
    Content of the file goes Here

### Variables
There are a few predefined variables that Hugo is aware of and utilizes. The user can also create
any variable they want to. These will be placed into the `.Params` variable available to the templates.
**Field names are case insensitive.**

#### Required

**title**  The title for the content. <br>
**description** The description for the content.<br>
**date** The date the content will be sorted by.<br>
**indexes** These will use the field name of the plural form of the index (see tags and categories above)

#### Optional

**draft** If true the content will not be rendered unless `hugo` is called with -d<br>
**type** The type of the content (will be derived from the directory automatically if unset).<br>
**markup** (Experimental) Specify "rst" for reStructuredText (requires
           `rst2html`,) or "md" (default) for the Markdown.<br>
**slug** The token to appear in the tail of the url.<br>
  *or*<br>
**url** The full path to the content from the web root.<br>
*If neither is present the filename will be used.*

## Example
Somethings are better shown than explained. The following is a very basic example of a content file:

**mysite/project/nitro.md  <- http://mysite.com/project/nitro.html**

    ---
    Title: "Nitro : A quick and simple profiler for golang"
    Description": ""
    Keywords": [ "Development", "golang", "profiling" ]
    Tags": [ "Development", "golang", "profiling" ]
    Pubdate": "2013-06-19"
    Topics": [ "Development", "GoLang" ]
    Slug": "nitro"
    project_url": "http://github.com/spf13/nitro"
    ---

    # Nitro

    Quick and easy performance analyzer library for golang.

    ## Overview

    Nitro is a quick and easy performance analyzer library for golang.
    It is useful for comparing A/B against different drafts of functions
    or different functions.

    ## Implementing Nitro

    Using Nitro is simple. First use go get to install the latest version
    of the library.

        $ go get github.com/spf13/nitro

    Next include nitro in your application.


# Extras

## Shortcodes
Because Hugo uses markdown for it's content format, it was clear that there's a lot of things that
markdown doesn't support well. This is good, the simple nature of markdown is exactly why we chose it.

However we cannot accept being constrained by our simple format. Also unacceptable is writing raw
html in our markdown every time we want to include unsupported content such as a video. To do
so is in complete opposition to the intent of using a bare bones format for our content and
utilizing templates to apply styling for display.

To avoid both of these limitations Hugo has full support for shortcodes.

### What is a shortcode?
A shortcode is a simple snippet inside a markdown file that Hugo will render using a template.

Short codes are designated by the opening and closing characters of '{{%' and '%}}' respectively.
Short codes are space delimited. The first word is always the name of the shortcode.  Following the
name are the parameters. The author of the shortcode can choose if the short code
will use positional parameters or named parameters (but not both). A good rule of thumb is that if a
short code has a single required value in the case of the youtube example below then positional
works very well. For more complex layouts with optional parameters named parameters work best.

The format for named parameters models that of html with the format name="value"

### Example: youtube

    {{% youtube 09jf3ow9jfw %}}

This would be rendered as

    <div class="embed video-player">
    <iframe class="youtube-player" type="text/html"
        width="640" height="385"
        src="http://www.youtube.com/embed/09jf3ow9jfw"
        allowfullscreen frameborder="0">
    </iframe>
    </div>

### Example: image with caption

    {{% img src="/media/spf13.jpg" title="Steve Francia" %}}

Would be rendered as:

    <figure >
        <img src="/media/spf13.jpg"  />
        <figcaption>
            <h4>Steve Francia</h4>
        </figcaption>
    </figure>


### Creating a shortcode

All that you need to do to create a shortcode is place a template in the layouts/shortcodes directory.

The template name will be the name of the shortcode.

**Inside the template**

To access a parameter by either position or name the index method can be used.

    {{ index .Params 0 }}
    or
    {{ index .Params "class" }}

To check if a parameter has been provided use the isset method provided by Hugo.

    {{ if isset .Params "class"}} class="{{ index .Params "class"}}" {{ end }}


# Meta

## Release Notes

* **0.7.0** July 4, 2013
  * Hugo now includes a simple server
  * First public release
* **0.6.0** July 2, 2013
  * Hugo includes an [example documentation site](http://hugo.spf13.com) which it builds
* **0.5.0** June 25, 2013
  * Hugo is quite usable and able to build [spf13.com](http://spf13.com)

## Roadmap
In no particular order, here is what I'm working on:

 * Pagination
 * Support for top level pages (other than homepage)
 * Series support
 * Syntax highlighting
 * Previous & Next
 * Related Posts
 * Support for TOML front matter -- in head
 * Proper YAML support for front matter -- in head
 * Support for other formats

## Contributing

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request

## Contributors

* [spf13](https://github.com/spf13)


## License

Hugo is released under the Simple Public License. See [LICENSE.md](https://github.com/spf13/hugo/blob/master/LICENSE.md).