summaryrefslogtreecommitdiff
path: root/doc/asciidoc/doc/source-highlight-filter.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/asciidoc/doc/source-highlight-filter.txt')
-rw-r--r--doc/asciidoc/doc/source-highlight-filter.txt270
1 files changed, 270 insertions, 0 deletions
diff --git a/doc/asciidoc/doc/source-highlight-filter.txt b/doc/asciidoc/doc/source-highlight-filter.txt
new file mode 100644
index 0000000..12ce688
--- /dev/null
+++ b/doc/asciidoc/doc/source-highlight-filter.txt
@@ -0,0 +1,270 @@
+Source Code Highlight Filter
+============================
+
+The AsciiDoc distribution includes a 'source' filter for highlighting
+code syntax.
+
+
+DocBook Outputs
+---------------
+AsciiDoc encloses the source code in a DocBook 'programlisting'
+element and leaves source code highlighting to the DocBook toolchain
+(dblatex has a particularly nice programlisting highlighter). The
+DocBook programlisting element is assigned two attributes:
+
+. The 'language' attribute is set to the AsciiDoc 'language'
+ attribute.
+. The 'linenumbering' attribute is set to the AsciiDoc 'src_numbered'
+ attribute ('numbered' or 'unnumbered').
+
+
+HTML Outputs
+------------
+You have the choice of three HTML source code highlighters, your
+selection is determined by the 'source-highlighter' attribute (defaults
+to 'source-highlight'):
+
+NOTE: Set the 'source-highlighter' attribute from the asciidoc(1)
+command-line or in the document header (not in the document body,
+because the configuration file conditional macros are processed at
+load time).
+
+=== GNU Source Highlight
+The default highlighter is the
+http://www.gnu.org/software/src-highlite/[GNU source-highlight] which
+can highlight 'html4', 'html5' and 'xhtml11' outputs. The GNU
+source-highlight must be installed and the 'source-highlight' command
+must reside in the shell search 'PATH'.
+
+=== Highlight
+You can use
+http://www.andre-simon.de/doku/highlight/en/highlight.html[Highlight]
+syntax highlighter for 'xhtml11', 'html5' and 'html4' outputs (set the
+'source-highlighter' attribute to 'highlighter').
+
+- The 'highlight' command must reside in the shell search 'PATH'.
+- To make Highlighter your default highlighter put the following line
+ your `~/.asciidoc/asciidoc.conf` file:
+
+ source-highlighter=highlight
+
+- The AsciiDoc 'encoding' attribute is passed to Highlighter using the
+ `--encoding` command-line option.
+
+=== Pygments
+The http://pygments.org/[Pygments] syntax highlighter can be used for
+'xhtml11' and 'html5' outputs (set the 'source-highlighter' attribute
+to 'pygments').
+
+- The 'pygmentize' command must reside in the shell search 'PATH'.
+- You can customize Pygments CSS styles by editing
+ `./stylesheets/pygments.css`.
+- To make Pygments your default highlighter put the following line
+ your `~/.asciidoc/asciidoc.conf` file:
+
+ source-highlighter=pygments
+
+- The AsciiDoc 'encoding' attribute is passed to Pygments using the
+ `-O` command-line option.
+
+
+Block attributes
+----------------
+The following attributes can be included in source code block
+attribute lists.
+
+- 'style' and 'language' are mandatory.
+- 'style', 'language' and 'src_numbered' are the first three
+ positional attributes in that order.
+- The 'args' attribute allows the inclusion of arbitrary (highlighter
+ dependent) command options.
+
+//
+
+style::
+ Set to 'source'.
+language::
+ The source code language name.
++
+NOTE: The language names vary between highlighters -- consult the
+selected highlighter manual.
+
+src_numbered::
+ Set to 'numbered' to include line numbers.
+src_tab::
+ Set tab size (GNU source-highlight only).
+args::
+ Include this attribute value in the highlighter command-line (HTML
+ outputs) or in the `programlisting` element (DocBook).
+
+
+Testing
+-------
+Test the filter by converting the test file to HTML with AsciiDoc:
+
+ $ asciidoc -v ./filters/source/source-highlight-filter-test.txt
+ $ firefox ./filters/source/source-highlight-filter-test.html &
+
+
+Examples
+--------
+
+Source code paragraphs
+~~~~~~~~~~~~~~~~~~~~~~
+The `source` paragraph style will highlight a paragraph of source
+code. These three code paragraphs:
+
+---------------------------------------------------------------------
+[source,python]
+if n < 0: print 'Hello World!'
+
+:language: python
+
+[source]
+if n < 0: print 'Hello World!'
+
+[source,ruby,numbered]
+[true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
+ puts "#{a.inspect} => #{b.inspect}"
+---------------------------------------------------------------------
+
+Render this highlighted source code:
+
+[source,python]
+if n < 0: print 'Hello World!'
+
+:language: python
+
+[source]
+if n < 0: print 'Hello World!'
+
+[source,ruby,numbered]
+[true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
+ puts "#{a.inspect} => #{b.inspect}"
+
+
+Unnumbered source code listing
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+This source-highlight filtered block:
+
+---------------------------------------------------------------------
+ [source,python]
+ ---------------------------------------------------------------------
+ ''' A multi-line
+ comment.'''
+ def sub_word(mo):
+ ''' Single line comment.'''
+ word = mo.group('word') # Inline comment
+ if word in keywords[language]:
+ return quote + word + quote
+ else:
+ return word
+ ---------------------------------------------------------------------
+---------------------------------------------------------------------
+
+Renders this highlighted source code:
+
+[source,python]
+---------------------------------------------------------------------
+''' A multi-line
+ comment.'''
+def sub_word(mo):
+ ''' Single line comment.'''
+ word = mo.group('word') # Inline comment
+ if word in keywords[language]:
+ return quote + word + quote
+ else:
+ return word
+---------------------------------------------------------------------
+
+Numbered source code listing with callouts
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+This source-highlight filtered block:
+
+---------------------------------------------------------------------
+ [source,ruby,numbered]
+ ---------------------------------------------------------------------
+ #
+ # Useful Ruby base class extensions.
+ #
+
+ class Array
+
+ # Execute a block passing it corresponding items in
+ # +self+ and +other_array+.
+ # If self has less items than other_array it is repeated.
+
+ def cycle(other_array) # :yields: item, other_item
+ other_array.each_with_index do |item, index|
+ yield(self[index % self.length], item)
+ end
+ end
+
+ end
+
+ if $0 == __FILE__ # \<1>
+ # Array#cycle test
+ # true => 0
+ # false => 1
+ # true => 2
+ # false => 3
+ # true => 4
+ puts 'Array#cycle test' # \<2>
+ [true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
+ puts "#{a.inspect} => #{b.inspect}"
+ end
+ end
+ ---------------------------------------------------------------------
+
+ \<1> First callout.
+ \<2> Second callout.
+
+---------------------------------------------------------------------
+
+Renders this highlighted source code:
+
+[source,ruby,numbered]
+---------------------------------------------------------------------
+#
+# Useful Ruby base class extensions.
+#
+
+class Array
+
+ # Execute a block passing it corresponding items in
+ # +self+ and +other_array+.
+ # If self has less items than other_array it is repeated.
+
+ def cycle(other_array) # :yields: item, other_item
+ other_array.each_with_index do |item, index|
+ yield(self[index % self.length], item)
+ end
+ end
+
+end
+
+if $0 == __FILE__ # <1>
+ # Array#cycle test
+ # true => 0
+ # false => 1
+ # true => 2
+ # false => 3
+ # true => 4
+ puts 'Array#cycle test' # <2>
+ [true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
+ puts "#{a.inspect} => #{b.inspect}"
+ end
+end
+---------------------------------------------------------------------
+
+<1> First callout.
+<2> Second callout.
+
+[TIP]
+=====
+- If the source 'language' attribute has been set (using an
+ 'AttributeEntry' or from the command-line) you don't have to specify
+ it in each source code block.
+- You should place callout markers inside source code comments to
+ ensure they are not misinterpreted and mangled by the highlighter.
+=====