.. include:: ../Includes.txt .. highlight:: rst .. _writing-rest-codeblocks-with-syntax-highlighting: =================================== Codeblocks with Syntax Highlighting =================================== .. _codeblock-quick-reference: Quick Reference =============== * To insert a snippet as code with syntax highlighting, use the `code-block` directive or the shorthand `::`. * You can explicitly set the language in the `code-block`, you cannot in the shorthand. * If you do not explicitly set the language, the default language (as set with the :ref:`codeblocks-highlight-directive`) is used. If no highlight directive was used, the default set in :ref:`Includes.txt ` is used. * It is recommended to use the short form (`::`), and not code-block explicitly. * Always use :ref:`syntactically correct code ` in a code block. The following examples all do the same thing: .. rst-class:: bignums 1. Use the shorthand `::` (recommended):: See following example:: $a = 'b'; How this looks: See following example: .. code-block:: php $a = 'b'; You can use this, if the default language is already set to PHP with the :ref:`highlight directive ` in the current file (or in :ref:`Includes.txt `). 2. Set the language (PHP) in the `code-block`:: See following example: .. code-block:: php $a = 'b'; 3. Use `code-block` without setting the language:: See following example: .. code-block:: $a = 'b'; You can use this, if you already set the language PHP with the :ref:`highlight directive ` in the current file (or in :ref:`Includes.txt `). .. _codeblock-shorthand: Using the '::' Notation (Recommended) ===================================== It's nice to use this notation and the preferred way to create a code block in case the highlighting is preset as desired (with the :ref:`codeblocks-highlight-directive`) and you don't need the special options of the :ref:`codeblock-directive`. However, the behavior of the '::' notation is "sort of intelligent". So let's explain it here. *Background:* "Sphinx" is based on "Docutils". Docutils handles the basic *parse*, *transform* and *create output* process for single files. Sphinx builds on this and adds the ability to handle multi file documentation projects. The '::' notation is already part of Docutil's `reST specification for creating "literal blocks" `__. Quoting the important part of the specification: The paragraph containing only "::" will be completely removed from the output; no empty paragraph will remain. As a convenience, the "::" is recognized at the end of any paragraph. If immediately preceded by whitespace, both colons will be removed from the output (this is the "partially minimized" form). When text immediately precedes the "::", one colon will be removed from the output, leaving only one colon visible (i.e., "::" will be replaced by ":"; this is the "fully minimized" form). Example of Form 1: Expanded --------------------------- Source:: Paragraph ... :: Literal Block Result: Paragraph ... :: Literal Block In words: The paragraph will appear as written. The code block just follows. *Both colons* and one empty line will be removed and not lead to any special output. Example of Form 2: Partially Minimized -------------------------------------- Source:: Paragraph ... :: Literal Block Result: Paragraph ... :: Literal Block In words: The paragraph will appear as written after *both colons* together with the preceding whitespace (!) have been removed from the end of the line. The code block then just follows. Example of Form 3: Fully Minimized ---------------------------------- Source:: Paragraph:: Literal Block Result: Paragraph:: Literal Block In words: The source of the paragraph has TWO colons at the end which are NOT preceded by whitespace. In the output just one of the colons will be removed. The code block then follows normally. .. _codeblock-directive: Codeblock Directive =================== Use codeblock with language PHP:: .. code-block:: php $a = 'b'; Use codeblock without specifying language:: .. code-block:: $a = 'b'; This uses whatever language has last been set with the :ref:`codeblocks-highlight-directive` in the current file or in Includes.txt. .. _writing-rest-codeblocks-syntactically-correct: .. _codeblocks-syntactically-correct: Use Syntactically Correct Code ============================== .. attention:: **Please: No syntax errors!** Syntax highlighting only works if the lexer can parse the code without errors. In other words: If there's a syntax error in the code the highlighting will not work. **Wrong:** :: .. code-block:: php $a = array( 'one' => 1, ... ); **Correct:** :: .. code-block:: php $a = array( 'one' => 1, // ... ); `Sphinx `__ uses `Pygments `__ for highlighting. On a machine that has Pygments installed the command `pygmentize -L` will list all available lexers. .. _writing-rest-codeblocks-highlight-directive: .. _codeblocks-highlight-directive: Highlight Directive =================== You can set the default language with the `highlight` directive. All following codeblocks will use the language as specified in the `highlight` directive for syntax highlighting. If all of your codeblocks in one file have the same language, it is easier to just set this once at the beginning of the file. This way, you don't need to set the language for each code-block (`.. code-block:: LANG`) explicitly and can use the :ref:`shorthand notation `. Use reStructuredText highlighting:: .. highlight:: rst Use PHP highlighting:: .. highlight:: php For TYPO3 we have adopted the convention that each reStructuredText source file imports the :file:`Documentation/Includes.txt` file at the top. And in the included file - in general - we set PHP as default language for highlighting. Exception: In the TypoScript manuals we are using `typoscript` as default. You can use the `..highlight:: LANG` directive as often as you want. Each one remains valid up to the next or up to the end of the *single file* it is used in. Highlight Language 'guess' -------------------------- Note that there is a - pseudo - language 'guess' as well. This should use the highlighter for the first language that Pygments finds to have no syntax error. Highlight Language 'none' ------------------------- The pseudo language 'none' is recognized as well. In this case no highlighting will occur. .. _writing-rest-codeblocks-some-more-examples: Some More Examples ================== Add Line Numbers to Code Snippet -------------------------------- Source ~~~~~~ :: .. code-block:: php :linenos: $GLOBALS['TYPO3_CONF_VARS']['FE']['addRootLineFields'] .= ',tx_realurl_pathsegment'; // Adjust to your needs $domain = 'www.example.com'; $rootPageUid = 123; $rssFeedPageType = 9818; // pageType of your RSS feed page Result ~~~~~~ .. code-block:: php :linenos: `__.