# Markdown

The [Gitiles](https://code.google.com/p/gitiles/) source browser
automatically renders `*.md` Markdown files into HTML for simplified
documentation.

[TOC]

## Access controls

Access controls for documentation is identical to source code.

Documentation stored with source files shares the same permissions.
Documentation stored in a separate Git repository can use different
access controls.  If Gerrit Code Review is being used, branch level
read permissions can be used to grant or restrict access to any
documentation branches.

## READMEs

Files named `README.md` are automatically displayed below the file's
directory listing.  For the top level directory this mirrors the
standard [GitHub](https://github.com/) presentation.

*** promo
README.md files are meant to provide orientation for developers
browsing the repository, especially first-time users.
***

We recommend that Git repositories have an up-to-date top-level
`README.md` file.

## Markdown syntax

Gitiles supports the core Markdown syntax described in
[Markdown Basics]. Additional extensions are supported
to more closely match [GitHub Flavored Markdown] and
simplify documentation writing.

[Markdown Basics]: http://daringfireball.net/projects/markdown/basics
[GitHub Flavored Markdown]: https://help.github.com/articles/github-flavored-markdown/

### Paragraphs

Paragraphs are one or more lines of consecutive text, followed by
one or more blank lines. Line breaks within a paragraph are ignored
by the parser, allowing authors to line-wrap text at any comfortable
column width.

```
Documentation writing can be fun and profitable
by helping users to learn and solve problems.

After documentation is written, it needs to be published on the
web where it can be easily accessed for reading.
```

### Headings

Headings can be indicated by starting the line with one or more `#`
marks.  The number of `#` used determines the depth of the heading in
the document outline.  Headings 1 through 6 (`######`) are supported.

```
# A level one (H1) heading
## A level two (H2) heading
### A level three (H3) heading
```

Headings can also use the less popular two line `======` and `------`
forms to create H1 and H2 level headers:

```
A first level header
====================

A second level header
---------------------
```

This form is discouraged as maintaining the length of the `===` or
`---` lines to match the preceding line can be tedious work that is
unnecessary with the `#` headers.

### Lists

A bullet list:

```
* Fruit
    * Orange
    * Pear
* Cake
```

will render into HTML as:

* Fruit
    * Orange
    * Pear
* Cake

The second level items (above Orange, Pear) must be indented with more
spaces than the item they are nested under. Above 2 spaces were used.

A numbered list:

```
1. Fruit
     1. Orange
     2. Pear
5. Cake
```

will render into HTML as:

1. Fruit
     1. Orange
     2. Pear
5. Cake

List items will be renumbered sequentially by the browser, which is
why `5` above displays as `2`. Even with this feature it is a good
idea to maintain list item numbers in the source Markdown to simplify
reading the source file.

Like bullet lists, numbered lists can be nested by using more leading
space than the prior list item.

### Tables

Simple tables are supported with column alignment.  The first line is
the header row and subsequent lines are data rows:

```
| Food  | Calories | Tasty? |
|-------|---------:|:------:|
| Apple |    95    | Yes    |
| Pear  |   102    | Yes    |
| Hay   |   977    |        |
[Food and its benefits]
```

will render as:

| Food  | Calories | Tasty? |
|-------|---------:|:------:|
| Apple |    95    | Yes    |
| Pear  |   102    | Yes    |
| Hay   |   977    |        |
[Food and its benefits]

Placing `:` in the separator line indicates how the column should be
aligned.  A colon on the left side is a **left-aligned** column; a
colon on the right-most side is **right-aligned**; a colon on both
sides is **center-aligned**.

An optional table title can be placed under the table in brackets
(`[...]`).

Cells may span multiple columns and include formatting accepted within
paragraphs such as emphasis, images or links:

|              | Grouping                    ||  
| First Header | Second Header | Third Header |  
| ------------ | :-----------: | -----------: |  
| Content      | *Long Cell*                 ||  
| Content      | **Cell 2**    | Cell 3       |  

the above table was created by:

```
|              | Grouping                    ||  
| First Header | Second Header | Third Header |  
| ------------ | :-----------: | -----------: |  
| Content      | *Long Cell*                 ||  
| Content      | **Cell 2**    | Cell 3       |  
```

Empty table cells are indicated by whitespace between the column
dividers (`| |`) while multiple column cells omit the whitespace.

### Emphasis

Emphasize paragraph text with *italic* and **bold** styles.  Either `_`
or `*` can be used for italic (1 character) and bold text (2
characters).  This allows styles to be mixed within a statement:

```
Emphasize paragraph text with *italic* and **bold** text.

**It is _strongly_ encouraged to review documentation for typos.**
```

**It is _strongly_ encouraged to review documentation for typos.**

Emphasis within_words_is_ignored which helps write technical
documentation. Literal \*bold* can be forced by prefixing the
opening `*` with \ such as `\*bold*`.

### Strikethrough

Text can be ~~struck out~~ within a paragraph:

```
Text can be ~~struck out~~ within a paragraph.
```

Note two tildes are required (`~~`) on either side of the struck out
section of text.

### Smart quotes

'Single', "double" and <<double angle>> quotes in paragraph text are
replaced with smart quotes.  Apostrophes (this doc's text), ellipses
("...") and dashes ("--" and "---") are also replaced with HTML
entities to make the documentation appear typeset.

To force use of the ASCII characters prefix with \, for example `\'`
for a \' normal single quote.

### Blockquotes

Blockquoted text can be used to stand off text obtained from
another source:

```
Sir Winston Churchill once said:

> A lie gets halfway around the world before the truth has a
> chance to get its pants on.
```

renders as:

Sir Winston Churchill once said:

> A lie gets halfway around the world before the truth has a
> chance to get its pants on.

### Code (inline)

Use `backticks` to markup inline code within a paragraph:

```
Use `backticks` to markup inline code within a paragraph.
```

### Code (blocks)

Create a fenced code block using three backticks before and after a
block of code, preceeded and followed by blank lines:

```
 This is a simple hello world program in C:

 ```c
 #include <stdio.h>
 
 int main() {
   printf("Hello, World.\n");
   return 0;
 }
 ```

 To compile it use `gcc hello.c`.
```

Text within a fenced code block is taken verbatim and is not
processed for Markdown markup.

Syntax highlighting can optionally be enabled for common languages
by adding the language name in lowercase on the opening line.
Supported languages include:

|||---||| 2,2,2,2,4

#### Scripting
* bash, sh
* lua
* perl
* python, py
* ruby
* tcl

### Web
* css
* dart
* html
* javascript, js
* json

#### Compiled
* basic, vb
* c
* cpp (C++)
* go
* java
* pascal
* scala

#### Markup
* tex, latex
* wiki
* xml
* xquery
* xsl
* yaml

#### Other
* clj (Clojure)
* erlang
* hs (Haskell)
* lisp
* [llvm](http://llvm.org/docs/LangRef.html)
* matlab
* ml (OCaml, SML, F#)
* r
* [rd](http://cran.r-project.org/doc/manuals/R-exts.html)
* rust
* sql
* vhdl
|||---|||

### Horizontal rules

A horizontal rule can be inserted using GitHub style `--` surrounded
by blank lines.  Alternatively repeating `-` or `*` and space on a
line will also create a horizontal rule:

```
--

- - - -

* * * *
```

### Links

Wrap text in `[brackets]` and the link destination in parens
`(http://...)` such as:

```
Visit [this site](http://example.com/) for more examples.
```

Links can also use references to obtain URLs from elsewhere in the
same document.  This style can be useful if the same URL needs to be
mentioned multiple times, is too long to cleanly place within text,
or the link is within a table cell:

```
Search for [markdown style][1] examples.

[1]: https://www.google.com/?gws_rd=ssl#q=markdown+style+guide
```

References can be simplified if the text alone is sufficient:

```
Visit [Google] to search the web.

[Google]: https://www.google.com/
```

Automatic hyperlinking can be used where the link text should
obviously also be the URL:

```
Use https://www.google.com/ to search the web.
```

Well formed URLs beginning with `https://`, `http://`, and `mailto:`
are used as written for the link's destination.  Malformed URLs may be
replaced with `#zSoyz` to prevent browser evaluation of dangerous
content.

HTML escaping of URL characters such as `&` is handled internally by
the parser/formatter.  Documentation writers should insert the URL
literally and allow the parser and formatter to make it HTML safe.

Relative links such as `../src/api.md` are resolved relative to the
current markdown's file path within the Git repository.  Absolute
links such as `/src/api.md` are resolved relative to the top of the
enclosing Git repository, but within the same branch or Git commit.
Links may point to any file in the repository.  A link to a `*.md`
file will present the rendered markdown, while a link to a source file
will display the syntax highlighted source.

### Named anchors

Explicit anchors can be inserted anywhere in the document using
`<a name="tag"></a>` or `{#tag}`.

Implicit anchors are automatically created for each
[heading](#Headings).  For example `## Section 1` will have
the anchor `Section-1`.

*** note
*Anchor generation*

* letters and digits, after removing accents (á →  a)
* spaces are replaced with -
* other characters are replaced with _
* runs of - and _ are collapsed
***

If a document contains the same named subsection under different
parents the parent anchor will prefix the subsections to
disambiguate. For example the following document will have anchors
`Running-Format` and `Coding-Format` and `Libraries` as that subsection
is unique:

```
## Running
### Format
## Coding
### Format
### Libraries
```

When placed in a section header the explicit anchor will override
the automatic anchor.  The following are identical and associate
the anchor `live-examples` with the section header instead of the
automaticly generated name `Examples`.

```
## Examples {#live-examples}
## Examples <a name="live-examples"></a>
```

### Images

Similar to links but begin with `!` to denote an image reference:

```
![diffy the kung fu review cuckoo](http://commondatastorage.googleapis.com/gerrit-static/diffy-w200.png)
```

For images the text in brackets will be included as the alt text for
screen readers.

Well formed image URLs beginning with `https://` and `http://` will be
used as written for the `<img src="...">` attribute.  Malformed URLs
will be replaced with a broken `data:` reference to prevent browsers
from trying to load a bad destination.

Relative and absolute links to image files within the Git repository
(such as `../images/banner.png`) are resolved during rendering by
inserting the base64 encoding of the image using a `data:` URI.  Only
PNG (`*.png`), JPEG (`*.jpg` or `*.jpeg`) and GIF (`*.gif`) image
formats are supported when referenced from the Git repository.

Unsupported extensions or files larger than [image size](#Image-size)
limit (default 256K) will display a broken image.

*** note
_Inline image caching_

Gitiles allows browsers to locally cache rendered markdown pages.
Cache invalidation is triggered by the markdown file being modified
and having a different SHA-1 in Git.  Inlined images may need a
documentation file update to be refreshed when viewed through unstable
URLs like `/docs/+/master/index.md`.
***

### HTML

HTML tags are not supported.  HTML will be dropped on the floor by the
parser with no warnings, and no output from that section of the
document.

There is a small exception for `<a name>` and `<iframe>` elements, see
[named anchor](#Named-anchors) and [HTML IFrame](#HTML-IFrame).

## Markdown extensions

Gitiles includes additional extensions to the Markdown language that
make documentation writing for the web easier without using raw HTML.

### Table of contents

Place `[TOC]` surrounded by blank lines to insert a generated
table of contents extracted from the H1, H2, and H3 headers
used within the document:

```
# Title

[TOC]

## Section 1
Blah blah...

## Section 2
Go on...
```

H1 headers are omitted from the table of contents if there is only one
level one header present.  This allows H1 to be used as the document
title without creating an unnecessary entry in the table of contents.

Anchors are automatically extracted from the headers, see
[named anchors](#Named-anchors).

### Notification, aside, promotion blocks

Similar to fenced code blocks these blocks start and end with `***`,
are surrounded by blank lines, and include the type of block on the
opening line.

#### Note

```
*** note
**Warning:** watch out for nested formatting.
***
```

*** note
**Warning:** watch out for nested formatting.
***

#### Aside

```
*** aside
An aside can stand off less interesting text.
***
```

*** aside
An aside can stand off less interesting text.
***

#### Promo

```
*** promo
Promotions can raise awareness of an important concept.
***
```

*** promo
Promotions can raise awareness of an important concept.
***

### Column layout

Gitiles markdown includes support for up to 12 columns of text across
the width of the page.  By default space is divided equally between
the columns.

|||---|||
#### Columns

can save space.

#### Prettify

the page layout.

*** promo
#### Can be

trendy.
***
|||---|||

A column layout is denoted by a block starting and ending with the
sequence `|||---|||`.  Within the layout a new column is started for
each header or note/promo/aside block and all text and formatting flow
into that column until a new column is started.

```
|||---|||
#### Columns

can save space.

#### Prettify

the page layout.

*** promo
#### Can be

trendy.
***
|||---|||
```

Column spans can be specified on the first line as a comma separated
list.  In the example below the first column is 4 wide or 4/12ths of
the page width, the second is 2 wide (or 2/12ths) and the final column
is 6 wide (6/12ths or 50%) of the page.

```
|||---||| 4,2,6
```

An empty column can be inserted by prefixing its width with `:`,
for example shifting content onto the right by padding 6 columns
on the left:

```
|||---||| :6,3
#### Right
|||---|||
```

renders as:

|||---||| :6,3
#### Right
|||---|||

### HTML IFrame

Although HTML is stripped the parser has special support for a limited
subset of `<iframe>` elements:

```
<iframe src="https://example.com/embed" height="200px" width="400px"></iframe>
```

The parser allows whitespace including newlines between attributes,
but strictly limits the supported attribute set to:

src
: An `https://` or `http://` URL of the page to embed inside of an
iframe at this position in the document.  Malformed URLs will cause
the iframe to be silently dropped.  _(required)_

height
: CSS pixel height such as `250px` defining the amount of vertical
space to give to the embedded content.  Only `px` units are supported;
a malformed dimension will drop the iframe.  _(required)_

width
: CSS pixel width such as `250px` or a precentage such as `80%`
defining the amount of horizontal space to give to the embedded
content.  Only `px` units or `%` are supported; a malformed dimension
will drop the iframe.  _(required)_

frameborder
: By default a border is drawn around the iframe by the browser.  The
border can be hidden by adding `frameborder="0"` to the iframe tag.
_(optional)_

Embedded source URLs must also be whitelisted by the Gitiles
`markdown.allowiframe` configuration variable.

## Site layout

Gitiles includes additional support to create functional documentation
sites served directly from Git repositories.

### Navigation bar

A top level navigation bar is automatically included on all pages if
there is a `navbar.md` file present in the top of the repository.
This file should be a simple bulleted list of links to include in the
navigation bar.

```
* [Home](/index.md)
* [Markdown](/docs/markdown.md)
* [Configuration](/docs/configuration.md)
```

Links are resolved relative to the current page, not `navbar.md`.
Links to other files within the repository should use absolute paths
to ensure they are resolved correctly from any Markdown file within
the repository.

### Site title

A site wide banner is displayed on all Markdown pages if `navbar.md`
includes a H1 header.  The text of the header is display on the left
side of the banner.

```
# Gitiles

* [Home](/index.md)
```

### Site logo

An optional logo image is displayed in the banner to the left of the
site title if a `[logo]` reference exists in `navbar.md`. This image
should be no taller than 45 px.

```
# Gitiles

[logo]: /images/site_logo.png
```

See [images](#Images) above for acceptable URLs and how repository
relative paths are handled by inline data URIs.

### Home link

Both the site logo (if present) and site title are wrapped in a link
if the `[home]` reference is declared in `navbar.md`.  This is
typically also used in the outline for the navigation bar:

```
# Gitiles

* [Home][home]
* [Markdown](/docs/markdown.md)

[home]: /index.md
```

### Page title

Titles for pages are extracted from the first H1 heading appearing in
the document. This is traditionally placed on the first line of the
markdown file, e.g.:

```
# Markdown
```

The title is included in the HTML `<title>` element and also in the
right side of the banner if `navbar.md` defines a
[site title](#Site-title).

## Configuration

The `gitiles.config` file supporting the site contains several
configuration options that impact markdown rendering.

### Disabling markdown

Markdown can be completely disabled by setting render to false.

```
[markdown]
  render = false
```

### Markdown size

Markdown files are limited by default to 5 MiB of input text
per file. This limit is configurable, but should not be raised
beyond available memory.

```
[markdown]
  inputLimit = 5M
```

### Image size

Referenced [images are inlined](#Images) as base64 encoded URIs.
The image limit places an upper bound on the byte size of input.

```
[markdown]
  imageLimit = 256K
```

### Google Analytics

[Google Analytics](https://www.google.com/analytics/) can be
enabled on every rendered markdown page by adding the Property ID
to the configuration file:

```
[google]
  analyticsId = UA-XXXX-Y
```
