= Source Highlighting Themes
:url-jneen-rouge: https://github.com/jneen/rouge
:url-ruby-rouge-themes: https://github.com/rouge-ruby/rouge/tree/master/lib/rouge/themes
:url-rouge-project: https://rouge.jneen.net/

You can apply a bundled source highlighter theme to your source blocks or define and apply your own.

== Using a bundled highlighting theme

Rouge bundles several themes you can use to colorize your source blocks.
To use one of these themes, first set the value of the `source-highlighter` document attribute to `rouge`.
Then, specify the desired theme using the `rouge-style` document attribute.

The following example demonstrates how to apply the monokai theme from Rouge to source blocks.

[,asciidoc]
----
= Document Title
:source-highlighter: rouge
:rouge-style: monokai
----

You can generate a list of all available themes by running the following command:

 $ ruby -e 'require :rouge.to_s; puts Rouge::Theme.registry.keys.sort.join ?\n'

You can also find the {url-ruby-rouge-themes}[list of themes in the Rouge source repository].

If the bundled themes don't suit your needs, you can define one of your own.

== Define a custom highlighting theme

A custom theme for Rouge is defined using a Ruby class.
Start by creating a Ruby source file to define your theme.
Name the file according to the name of your theme and put the file in a folder of your choice (e.g., [.path]_rouge_themes/custom.rb_).
The name of the Ruby class doesn't matter, though it's customary to name it according to the name of the theme as well.

.rouge_themes/custom.rb
[,ruby]
----
require 'rouge' unless defined? ::Rouge.version

module Rouge; module Themes
  class Custom < CSSTheme
    name 'custom'

    style Comment,           fg: '#008800', italic: true
    style Error,             fg: '#a61717', bg: '#e3d2d2'
    style Str,               fg: '#0000ff'
    style Str::Char,         fg: '#800080'
    style Num,               fg: '#0000ff'
    style Keyword,           fg: '#000080', bold: true
    style Operator::Word,    bold: true
    style Name::Tag,         fg: '#000080', bold: true
    style Name::Attribute,   fg: '#ff0000'
    style Generic::Deleted,  fg: '#000000', bg: '#ffdddd', inline_block: true, extend: true
    style Generic::Inserted, fg: '#000000', bg: '#ddffdd', inline_block: true, extend: true
    style Text, {}
  end
end; end
----

Each style declaration accepts the following properties:

* `fg` - sets the foreground (text) color
* `bg` - sets the background color
* `bold` - change the font weight to bold
* `italic` - change the font style to italic
* `underline` - add an underline to the text
* `inline_block` - fill the background color to the height of the line (Asciidoctor PDF only)
* `extend` - extend the background color to the end of the line for a line-oriented match (Asciidoctor PDF only)

Colors are defined using hexadecimal format (e.g., #ff0000 for red).

Use the `Text` token to set the background color of the source block and the default text color.

The complete list of tokens can be found in the {url-jneen-rouge}/blob/master/lib/rouge/token.rb[token.rb file^] from Rouge.
Refer to the {url-jneen-rouge}/tree/master/lib/rouge/themes[bundled themes^] to find more examples.

Once you've defined your theme, you need to enable it to use it using the `rouge-style` document attribute, which you specify in the document header or via the Asciidoctor CLI or API.

[,asciidoc]
----
= Document Title
:source-highlighter: rouge
:rouge-style: custom
----

Finally, you need to activate your theme by requiring the theme file when you invoke Asciidoctor.

 $ asciidoctor -r ./rouge_themes/custom.rb sample.adoc

You should now see that the source code is highlighted to your liking.
For more information about source highlighting with Rouge, refer to the {url-rouge-project}[Rouge project page^].
