Rendering Process
● Differs from Ruby Jekyll — modified
Markdown is rendered by goldmark, not kramdown: raw </> is treated as HTML, header IDs are generated differently, there are no smart quotes, and kramdown's TOC, math, and ALDs are not supported. Sass files skip Liquid entirely.
Like Jekyll, Jigyll renders each file in stages, with the output of one stage feeding the next:
- Front matter is read and stripped from the file.
- Liquid expressions in the body are evaluated.
- Converters run, based on the file's extension — Markdown becomes HTML,
Sass/SCSS becomes CSS. Markdown inside a
.htmlfile remains untouched. - Layouts wrap the result: the
layoutfrom the page's front matter is rendered around the content, and each layout's ownlayout:key chains to its parent, Russian-doll style. Layout bodies are processed as Liquid only, never as Markdown.
Files without front matter are copied verbatim as static files (unless the jekyll-optional-front-matter plugin is enabled).
Differs from Jekyll. Sass/SCSS files skip the Liquid stage entirely — the body after front matter goes straight to the Sass compiler. In Jekyll, a Sass file is a page like any other and may contain Liquid.
Markdown: goldmark, not kramdown
Markdown is rendered by goldmark, a
CommonMark engine, with GitHub Flavored Markdown extensions — tables,
strikethrough, autolinks, task lists — plus definition lists and footnotes.
The renderer is not configurable: markdown: and kramdown: settings in
_config.yml are ignored.
Most Markdown renders identically. The differences that matter:
- Raw
<and>are treated as HTML.This is <b>bold</b>renders as bold text. This matches the Markdown spec but differs from kramdown's default escaping. - No smart quotes. kramdown typographically curls quotes by default;
goldmark leaves them straight. (The
smartifyLiquid filter is available when you want that.) - Math is not supported.
$...$and$$...$$pass through as literal text. - No table of contents. kramdown's TOC marker is not expanded. Use a Liquid loop or hand-written links instead.
Header IDs
Headings get auto-generated id attributes, but the algorithm differs from
kramdown's:
- Punctuation becomes a hyphen, not the empty string:
## Either/orgets#either-or(kramdown:#eitheror);## I'm Luckygets#i-m-lucky(kramdown:#im-lucky). - HTML inside a heading is ignored when computing the ID — only the text counts.
- Non-ASCII characters are dropped, not transliterated.
- Duplicate IDs get
-1,-2, … suffixes.
You can always set an explicit ID with an inline attribute list:
## My Heading {: #my-id}.
Inline attribute lists
kramdown-style inline attribute lists (IALs) on headings —
{: .class #id key="value"} — are supported; they are
rewritten to goldmark's attribute syntax before parsing.
Differs from Jekyll. The IAL rewrite is a plain text substitution over the whole file, so a literal
{: ...}inside a code span or code block is also rewritten (the colon disappears). Not supported at all: attribute list definitions (ALDs, reusable{:refname: ...}sets) andmarkdown="span"/markdown="block"on HTML elements —markdown="1"works.
Syntax highlighting
Fenced code blocks and the {% highlight %} tag are
highlighted by chroma, emitting
Rouge-compatible CSS classes — your existing Pygments/Rouge stylesheet
works unchanged. The linenos argument to
{% highlight %} adds line numbers; fenced code blocks
don't support line numbers. Code fences with an unrecognized language are
wrapped in plain <pre><code>.