From e8e5496450274af9706b22ae1cacdb8190d8f014 Mon Sep 17 00:00:00 2001 From: milde Date: Wed, 9 May 2012 13:42:58 +0000 Subject: [PATCH] Clean up code-block-directive sandbox project. git-svn-id: https://docutils.svn.sourceforge.net/svnroot/docutils/trunk@7430 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- sandbox/code-block-directive/README.txt | 74 +-- .../code-block-directive/data/pygments-default.css | 99 ---- .../code-block-directive/data/pygments-default.sty | 100 ---- .../data/pygments-docutilsroles.sty | 146 ----- .../code-block-directive/data/pygments-long.css | 119 ---- .../code-block-directive/data/rst2html-pygments | 60 -- .../code-block-directive/docs/myfunction.py.pdf | Bin 32175 -> 35605 bytes .../docs/myfunction.py.pseudoxml | 97 +++- .../code-block-directive/docs/myfunction.py.tex | 14 +- .../code-block-directive/docs/myfunction.py.txt | 8 +- .../code-block-directive/docs/syntax-highlight.txt | 625 +++++---------------- .../pygments_code_block_directive.py | 248 -------- sandbox/code-block-directive/rst2html-highlight.py | 53 -- .../code-block-directive/rst2latex-highlight.py | 53 -- sandbox/code-block-directive/tools/makesty.py | 62 -- .../tools/pygments-docutilsroles.sty | 122 ---- .../tools/pygments-enhanced-front-ends/README.txt | 69 --- .../pygments-enhanced-front-ends/for-else-test.py | 92 --- .../for-else-test.py.htm | 185 ------ .../for-else-test.py.pdf | Bin 77532 -> 0 bytes .../for-else-test.py.tex | 170 ------ .../for-else-test.py.txt | 92 --- .../pygments-enhanced-front-ends/rst2html-pygments | 60 -- .../rst2latex-pygments | 60 -- .../tools/test_pygments_code_block_directive.py | 64 --- 25 files changed, 273 insertions(+), 2399 deletions(-) rewrite sandbox/code-block-directive/README.txt (77%) delete mode 100644 sandbox/code-block-directive/data/pygments-default.css delete mode 100644 sandbox/code-block-directive/data/pygments-default.sty delete mode 100644 sandbox/code-block-directive/data/pygments-docutilsroles.sty delete mode 100644 sandbox/code-block-directive/data/pygments-long.css delete mode 100755 sandbox/code-block-directive/data/rst2html-pygments rewrite sandbox/code-block-directive/docs/myfunction.py.pdf (78%) rewrite sandbox/code-block-directive/docs/syntax-highlight.txt (80%) delete mode 100755 sandbox/code-block-directive/pygments_code_block_directive.py delete mode 100755 sandbox/code-block-directive/rst2html-highlight.py delete mode 100755 sandbox/code-block-directive/rst2latex-highlight.py delete mode 100644 sandbox/code-block-directive/tools/makesty.py delete mode 100644 sandbox/code-block-directive/tools/pygments-docutilsroles.sty delete mode 100644 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/README.txt delete mode 100644 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py delete mode 100644 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.htm delete mode 100644 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.pdf delete mode 100644 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.tex delete mode 100644 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.txt delete mode 100755 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2html-pygments delete mode 100755 sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2latex-pygments delete mode 100755 sandbox/code-block-directive/tools/test_pygments_code_block_directive.py diff --git a/sandbox/code-block-directive/README.txt b/sandbox/code-block-directive/README.txt dissimilarity index 77% index 689a387c6..799940171 100644 --- a/sandbox/code-block-directive/README.txt +++ b/sandbox/code-block-directive/README.txt @@ -1,48 +1,26 @@ -.. -*- rst-mode -*- - -=============================================== -Proposal for a code-block directive in docutils -=============================================== - -:Author: Günter Milde -:Contact: milde@users.berlios.de -:Date: $Date$ -:Copyright: © 2007, 2009 G. Milde, - Released without warranties or conditions of any kind - under the terms of the Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0 - -This sandbox project contains experimental code and documentation related to -the proposal for syntax highlight of source code in docutils using a -"code-block" directive. - -See ``_ for a full description. - -``_ - front end for reStructuredText -> HTML conversion supporting the - "code-block" directive. - -``_ - front end for reStructuredText -> LaTeX conversion supporting the - "code-block" directive. - -``_ - Style sheets. - -``_ - Documentation, concepts, discussion, examples... - -``_ - Working example: defines and registers a - code-block directive using the Pygments_ syntax highlighter. - -``_ - Script for interactive testing. - -``_ - Legacy front ends, - - -.. References - -.. _pygments: http://pygments.org/ +.. -*- rst-mode -*- + +=============================================== +Proposal for a code-block directive in docutils +=============================================== + +:Author: Günter Milde +:Contact: milde@users.berlios.de +:Date: $Date$ + +This sandbox project contained experimental code and documentation related to +the proposal for syntax highlight of source code in Docutils. + +Since version 0.9, Docutils supports this via the `code` directive and role +and the `code` option of the `include` directive. Most of this project is +moved to the attic. + +The documentation in ``_ is kept as it +contains ideas for further improvement. + +Sample stylesheets are now available in the `<../stylesheets>`_ repository. + + +.. References + +.. _pygments: http://pygments.org/ diff --git a/sandbox/code-block-directive/data/pygments-default.css b/sandbox/code-block-directive/data/pygments-default.css deleted file mode 100644 index b4dbdae19..000000000 --- a/sandbox/code-block-directive/data/pygments-default.css +++ /dev/null @@ -1,99 +0,0 @@ -/* Stylesheet for pygments enhanced reStructured Text */ -/* ================================================== */ - -/* :Author: Guenter Milde */ -/* :Copyright: 2007 G. Milde */ -/* This stylesheet is released under the GPL v. 2 or later */ - -/* This stylesheet provides syntax highlight for documents generated with a */ -/* pygments_ enhanced reStructured Text -> html converter. */ - -/* Import the default docutils style sheet */ -/* --------------------------------------- */ -/* :: */ - -@import url("/stylesheets/html4css1.css"); - -/* Indent the code block */ -/* --------------------- */ - -/* Content copied from the `html4css1.css` rule for literal blocks. */ -/* Selector adapted to the output of Pygments_. :: */ - -pre.code { - margin-left: 2em ; - margin-right: 2em ; - background-color: #eeeeee - } - -pre.code .ln { /* line numbers */ -/* color: grey; */ - font-size: small; -} - -/* Colour code blocks */ -/* ------------------ */ - -/* Pygments_ has an option to generate stylesheets for html and latex. */ -/* The following code is generated with the command */ -/* `pygmentize -S default -f html > pygments-default.css`:: */ - -.c { color: #008800; font-style: italic } /* Comment */ -.err { border: 1px solid #FF0000 } /* Error */ -.k { color: #AA22FF; font-weight: bold } /* Keyword */ -.o { color: #666666 } /* Operator */ -.cm { color: #008800; font-style: italic } /* Comment.Multiline */ -.cp { color: #008800 } /* Comment.Preproc */ -.c1 { color: #008800; font-style: italic } /* Comment.Single */ -.gd { color: #A00000 } /* Generic.Deleted */ -.ge { font-style: italic } /* Generic.Emph */ -.gr { color: #FF0000 } /* Generic.Error */ -.gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.gi { color: #00A000 } /* Generic.Inserted */ -.go { color: #808080 } /* Generic.Output */ -.gp { color: #000080; font-weight: bold } /* Generic.Prompt */ -.gs { font-weight: bold } /* Generic.Strong */ -.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.gt { color: #0040D0 } /* Generic.Traceback */ -.kc { color: #AA22FF; font-weight: bold } /* Keyword.Constant */ -.kd { color: #AA22FF; font-weight: bold } /* Keyword.Declaration */ -.kp { color: #AA22FF } /* Keyword.Pseudo */ -.kr { color: #AA22FF; font-weight: bold } /* Keyword.Reserved */ -.kt { color: #AA22FF; font-weight: bold } /* Keyword.Type */ -.m { color: #666666 } /* Literal.Number */ -.s { color: #BB4444 } /* Literal.String */ -.na { color: #BB4444 } /* Name.Attribute */ -.nb { color: #AA22FF } /* Name.Builtin */ -.nc { color: #0000FF } /* Name.Class */ -.no { color: #880000 } /* Name.Constant */ -.nd { color: #AA22FF } /* Name.Decorator */ -.ni { color: #999999; font-weight: bold } /* Name.Entity */ -.ne { color: #D2413A; font-weight: bold } /* Name.Exception */ -.nf { color: #00A000 } /* Name.Function */ -.nl { color: #A0A000 } /* Name.Label */ -.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ -.nt { color: #008000; font-weight: bold } /* Name.Tag */ -.nv { color: #B8860B } /* Name.Variable */ -.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ -.mf { color: #666666 } /* Literal.Number.Float */ -.mh { color: #666666 } /* Literal.Number.Hex */ -.mi { color: #666666 } /* Literal.Number.Integer */ -.mo { color: #666666 } /* Literal.Number.Oct */ -.sb { color: #BB4444 } /* Literal.String.Backtick */ -.sc { color: #BB4444 } /* Literal.String.Char */ -.sd { color: #BB4444; font-style: italic } /* Literal.String.Doc */ -.s2 { color: #BB4444 } /* Literal.String.Double */ -.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ -.sh { color: #BB4444 } /* Literal.String.Heredoc */ -.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ -.sx { color: #008000 } /* Literal.String.Other */ -.sr { color: #BB6688 } /* Literal.String.Regex */ -.s1 { color: #BB4444 } /* Literal.String.Single */ -.ss { color: #B8860B } /* Literal.String.Symbol */ -.bp { color: #AA22FF } /* Name.Builtin.Pseudo */ -.vc { color: #B8860B } /* Name.Variable.Class */ -.vg { color: #B8860B } /* Name.Variable.Global */ -.vi { color: #B8860B } /* Name.Variable.Instance */ -.il { color: #666666 } /* Literal.Number.Integer.Long */ - -/* .. _pygments: http://pygments.org/ */ diff --git a/sandbox/code-block-directive/data/pygments-default.sty b/sandbox/code-block-directive/data/pygments-default.sty deleted file mode 100644 index 45cc0363e..000000000 --- a/sandbox/code-block-directive/data/pygments-default.sty +++ /dev/null @@ -1,100 +0,0 @@ -% pygments-default.sty -% ******************** -% -% Stylesheet for pygments enhanced reStructured Text -% ================================================== -% -% :Author: Günter Milde -% :Contact: milde@users.berlios.de -% :Revision: $Revision: 5534 $ -% :Date: $Date: 2005-06-28$ -% :Copyright: © 2007, 2009 G. Milde, -% Released without warranties or conditions of any kind -% under the terms of the Apache License, Version 2.0 -% http://www.apache.org/licenses/LICENSE-2.0 -% -% This example style sheet provides syntax highlight for documents generated -% with the legacy front end `rst2latex-pygments`.. -% -% (For the recommended front end `rst2latex-highlight` use -% ``pygments-docutilesroles.sty``.) -% -% Separate paragraphs by vertical space -% ------------------------------------- -% -% This is not needed for syntax highlight, but usually a good idea for -% documents with lots of source code. -% :: - -\usepackage{parskip} - -% Colour code blocks -% ------------------ -% -% Pygments has an option to generate stylesheets for html and latex. -% The following code is based on the output of the command -% `pygmentize -S default -f latex`:: - -\usepackage{fancyvrb} -\usepackage{color} - -\newcommand\at{@} -\newcommand\lb{[} -\newcommand\rb{]} -\newcommand\PYba[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} -\newcommand\PYaz[1]{\textcolor[rgb]{0.00,0.25,0.82}{#1}} -\newcommand\PYay[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} -\newcommand\PYax[1]{\textcolor[rgb]{0.00,0.63,0.00}{#1}} -\newcommand\PYbc[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand\PYas[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand\PYar[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} -\newcommand\PYaq[1]{\textcolor[rgb]{0.73,0.27,0.27}{\textit{#1}}} -\newcommand\PYap[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} -\newcommand\PYaw[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} -\newcommand\PYav[1]{\textcolor[rgb]{0.60,0.60,0.60}{\textbf{#1}}} -\newcommand\PYau[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand\PYat[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} -\newcommand\PYak[1]{\textbf{#1}} -\newcommand\PYaj[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}} -\newcommand\PYai[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} -\newcommand\PYah[1]{\textcolor[rgb]{0.63,0.63,0.00}{#1}} -\newcommand\PYao[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}} -\newcommand\PYan[1]{\textcolor[rgb]{0.00,0.50,0.00}{#1}} -\newcommand\PYam[1]{\textcolor[rgb]{0.73,0.40,0.13}{\textbf{#1}}} -\newcommand\PYal[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} -\newcommand\PYac[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} -\newcommand\PYab[1]{\textit{#1}} -\newcommand\PYaa[1]{\textcolor[rgb]{0.50,0.50,0.50}{#1}} -\newcommand\PYag[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand\PYaf[1]{\textcolor[rgb]{0.00,0.53,0.00}{\textit{#1}}} -\newcommand\PYae[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand\PYad[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} -\newcommand\PYbb[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} -\newcommand\PYaZ[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand\PYaY[1]{\textcolor[rgb]{0.00,0.00,0.50}{\textbf{#1}}} -\newcommand\PYaX[1]{\textcolor[rgb]{0.00,0.50,0.00}{\textbf{#1}}} -\newcommand\PYbd[1]{\textcolor[rgb]{0.73,0.40,0.53}{\textbf{#1}}} -\newcommand\PYbe[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} -\newcommand\PYaS[1]{\textcolor[rgb]{0.82,0.25,0.23}{\textbf{#1}}} -\newcommand\PYaR[1]{\textcolor[rgb]{0.50,0.00,0.50}{\textbf{#1}}} -\newcommand\PYaQ[1]{\textcolor[rgb]{0.00,0.53,0.00}{\textit{#1}}} -\newcommand\PYaP[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} -\newcommand\PYaW[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} -\newcommand\PYaV[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} -\newcommand\PYaU[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} -\newcommand\PYaT[1]{\textcolor[rgb]{0.00,0.00,1.00}{\textbf{#1}}} -\newcommand\PYaK[1]{\textcolor[rgb]{0.00,0.53,0.00}{#1}} -\newcommand\PYaJ[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} -\newcommand\PYaI[1]{\textcolor[rgb]{0.00,0.63,0.00}{#1}} -\newcommand\PYaH[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} -\newcommand\PYaO[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand\PYaN[1]{\textcolor[rgb]{0.73,0.27,0.27}{#1}} -\newcommand\PYaM[1]{\textcolor[rgb]{0.00,0.00,0.50}{\textbf{#1}}} -\newcommand\PYaL[1]{\textcolor[rgb]{0.00,0.00,1.00}{#1}} -\newcommand\PYaC[1]{\textcolor[rgb]{0.63,0.00,0.00}{#1}} -\newcommand\PYaB[1]{\textcolor[rgb]{0.00,0.53,0.00}{\textit{#1}}} -\newcommand\PYaA[1]{\textcolor[rgb]{0.67,0.13,1.00}{#1}} -\newcommand\PYaG[1]{\textcolor[rgb]{0.67,0.13,1.00}{\textbf{#1}}} -\newcommand\PYaF[1]{\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{#1}} -\newcommand\PYaE[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} -\newcommand\PYaD[1]{\textcolor[rgb]{1.00,0.00,0.00}{#1}} diff --git a/sandbox/code-block-directive/data/pygments-docutilsroles.sty b/sandbox/code-block-directive/data/pygments-docutilsroles.sty deleted file mode 100644 index 55c4f8c11..000000000 --- a/sandbox/code-block-directive/data/pygments-docutilsroles.sty +++ /dev/null @@ -1,146 +0,0 @@ -% Stylesheet for pygments enhanced reStructured Text -% ================================================== -% -% :Author: Günter Milde -% :Contact: milde@users.berlios.de -% :Revision: $Revision: 5534 $ -% :Date: $Date: 2005-06-28$ -% :Copyright: © 2007, 2009 G. Milde, -% Released without warranties or conditions of any kind -% under the terms of the Apache License, Version 2.0 -% http://www.apache.org/licenses/LICENSE-2.0 -% -% This example style sheet provides syntax highlight for documents generated -% with the `rst2latex-highlight` pygments-enhanced Docutils front end. -% -% -% Separate paragraphs by vertical space -% ------------------------------------- -% -% This is not required for syntax highlight, but usually a good idea for -% documents with lots of source code. -% :: - -\usepackage{parskip} - -% Highlight code blocks -% --------------------- -% -% Pygments_ has an option to generate stylesheets for HTML and LaTeX. -% However, the "kryptic" codes used for HTML and LaTeX differ, so that -% the output of the command -% `pygmentize -S default -f latex -O commandprefix=docutilsrole` -% fails to work with rst2latex-highlight. -% :: - -% Colours with LaTeX -\usepackage{color} - -% Standard Postscript fonts -\usepackage[sc]{mathpazo} -\RequirePackage[scaled=.95]{helvet} % scaled to fit Palatino - -% Courier monotype fonts with bold and italic variants -% \usepackage{courier} -% TXfonts monotype -\renewcommand{\ttdefault}{txtt} - -% keyword -\newcommand\DUrolek[1]{\textbf{\textbf{#1}}} -% new function -\newcommand\DUrolenf[1]{\textcolor[rgb]{0.00,0.25,0.82}{#1}} -% punktuation -% \newcommand\DUrolep[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} -% string -\newcommand\DUroles[1]{\textcolor[rgb]{0.40,0.40,0.40}{\textit{#1}}} -% number -% \newcommand\DUrolemf[1]{\textcolor[rgb]{0.00,0.53,0.00}{#1}} -% operator -\newcommand\DUrolear[1]{\textcolor[rgb]{0.72,0.53,0.04}{#1}} - -% Incomplete! - -% All STANDARD_TYPES below may appear in the output. (But only the ones -% you like to style need to be defined :-) - -% STANDARD_TYPES = { -% Token: '', -% -% Text: '', -% Whitespace: 'w', -% Error: 'err', -% Other: 'x', -% -% Keyword: 'k', -% Keyword.Constant: 'kc', -% Keyword.Declaration: 'kd', -% Keyword.Pseudo: 'kp', -% Keyword.Reserved: 'kr', -% Keyword.Type: 'kt', -% -% Name: 'n', -% Name.Attribute: 'na', -% Name.Builtin: 'nb', -% Name.Builtin.Pseudo: 'bp', -% Name.Class: 'nc', -% Name.Constant: 'no', -% Name.Decorator: 'nd', -% Name.Entity: 'ni', -% Name.Exception: 'ne', -% Name.Function: 'nf', -% Name.Property: 'py', -% Name.Label: 'nl', -% Name.Namespace: 'nn', -% Name.Other: 'nx', -% Name.Tag: 'nt', -% Name.Variable: 'nv', -% Name.Variable.Class: 'vc', -% Name.Variable.Global: 'vg', -% Name.Variable.Instance: 'vi', -% -% Literal: 'l', -% Literal.Date: 'ld', -% -% String: 's', -% String.Backtick: 'sb', -% String.Char: 'sc', -% String.Doc: 'sd', -% String.Double: 's2', -% String.Escape: 'se', -% String.Heredoc: 'sh', -% String.Interpol: 'si', -% String.Other: 'sx', -% String.Regex: 'sr', -% String.Single: 's1', -% String.Symbol: 'ss', -% -% Number: 'm', -% Number.Float: 'mf', -% Number.Hex: 'mh', -% Number.Integer: 'mi', -% Number.Integer.Long: 'il', -% Number.Oct: 'mo', -% -% Operator: 'o', -% Operator.Word: 'ow', -% -% Punctuation: 'p', -% -% Comment: 'c', -% Comment.Multiline: 'cm', -% Comment.Preproc: 'cp', -% Comment.Single: 'c1', -% Comment.Special: 'cs', -% -% Generic: 'g', -% Generic.Deleted: 'gd', -% Generic.Emph: 'ge', -% Generic.Error: 'gr', -% Generic.Heading: 'gh', -% Generic.Inserted: 'gi', -% Generic.Output: 'go', -% Generic.Prompt: 'gp', -% Generic.Strong: 'gs', -% Generic.Subheading: 'gu', -% Generic.Traceback: 'gt', -% } diff --git a/sandbox/code-block-directive/data/pygments-long.css b/sandbox/code-block-directive/data/pygments-long.css deleted file mode 100644 index f05d26d30..000000000 --- a/sandbox/code-block-directive/data/pygments-long.css +++ /dev/null @@ -1,119 +0,0 @@ -/* Stylesheet for pygments enhanced reStructured Text */ -/* ================================================== */ - -/* :Author: Guenter Milde */ -/* :Copyright: 2007 G. Milde */ -/* This stylesheet is released under the GPL v. 2 or later */ - -/* This stylesheet provides syntax highlight for documents generated with a */ -/* pygments_ enhanced reStructured Text -> html converter. */ - -/* Import the default docutils style sheet */ -/* --------------------------------------- */ -/* :: */ - -@import url("/stylesheets/html4css1.css"); - -/* Indent the code block */ -/* --------------------- */ - -/* Content copied from the `html4css1.css` rule for literal blocks. */ -/* Selector adapted to the output of Pygments_. :: */ - -div.highlight { - margin-left: 2em ; - margin-right: 2em ; - background-color: #eeeeee - } - - -/* Layout for code block tokens */ -/* ---------------------------- */ - -.comment { color: #008800; font-style: italic } -.error { border: 1px solid #FF0000 } -.keyword { color: #AA22FF; font-weight: bold } -.operator { color: #666666 } -.comment.multiline { color: #008800; font-style: italic } -.comment.preproc { color: #008800 } -.comment.single { color: #008800; font-style: italic } -.generic.deleted { color: #A00000 } -.generic.emph { font-style: italic } -.generic.error { color: #FF0000 } -.generic.heading { color: #000080; font-weight: bold } -.generic.inserted { color: #00A000 } -.generic.output { color: #808080 } -.generic.prompt { color: #000080; font-weight: bold } -.generic.strong { font-weight: bold } -.generic.subheading { color: #800080; font-weight: bold } -.generic.traceback { color: #0040D0 } -.keyword.constant { color: #AA22FF; font-weight: bold } -.keyword.declaration { color: #AA22FF; font-weight: bold } -.keyword.pseudo { color: #AA22FF } -.keyword.reserved { color: #AA22FF; font-weight: bold } -.keyword.type { color: #AA22FF; font-weight: bold } -.literal.number { color: #666666 } -.literal.string { color: #BB4444 } -.name.attribute { color: #BB4444 } -.name.builtin { color: #AA22FF } -.name.class { color: #0000FF } -.name.constant { color: #880000 } -.name.decorator { color: #AA22FF } -.name.entity { color: #999999; font-weight: bold } -.name.exception { color: #D2413A; font-weight: bold } -.name.function { color: #00A000 } -.name.label { color: #A0A000 } -.name.namespace { color: #0000FF; font-weight: bold } -.name.tag { color: #008000; font-weight: bold } -.name.variable { color: #B8860B } -.operator.word { color: #AA22FF; font-weight: bold } -.literal.number.float { color: #666666 } -.literal.number.hex { color: #666666 } -.literal.number.integer { color: #666666 } -.literal.number.oct { color: #666666 } -.literal.string.backtick { color: #BB4444 } -.literal.string.char { color: #BB4444 } -.literal.string.doc { color: #BB4444; font-style: italic } -.literal.string.double { color: #BB4444 } -.literal.string.escape { color: #BB6622; font-weight: bold } -.literal.string.heredoc { color: #BB4444 } -.literal.string.interpol { color: #BB6688; font-weight: bold } -.literal.string.other { color: #008000 } -.literal.string.regex { color: #BB6688 } -.literal.string.single { color: #BB4444 } -.literal.string.symbol { color: #B8860B } -.name.builtin.pseudo { color: #AA22FF } -.name.variable.class { color: #B8860B } -.name.variable.global { color: #B8860B } -.name.variable.instance { color: #B8860B } -.literal.number.integer.long { color: #666666 } - -/* .. _pygments: http://pygments.org/ */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sandbox/code-block-directive/data/rst2html-pygments b/sandbox/code-block-directive/data/rst2html-pygments deleted file mode 100755 index c227bbf2e..000000000 --- a/sandbox/code-block-directive/data/rst2html-pygments +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/python - -# :Author: David Goodger, a Pygments author|contributor, Guenter Milde -# :Date: $Date: $ -# :Copyright: This module has been placed in the public domain. - -# This is a merge of the docutils_ `rst2html` front end with an extension -# suggestion taken from the pygments_ documentation. - -""" -A front end to docutils, producing HTML with syntax colouring using pygments -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - -description = ('Generates (X)HTML documents from standalone reStructuredText ' - 'sources. Uses `pygments` to colorize the content of' - '"code-block" directives. Needs an adapted stylesheet' - + default_description) - -# Define a new directive `code-block` that uses the `pygments` source -# highlighter to render code in color. -# -# Code from the `pygments`_ documentation for `Using Pygments in ReST -# documents`_. - -from docutils import nodes -from docutils.parsers.rst import directives -from pygments import highlight -from pygments.lexers import get_lexer_by_name -from pygments.formatters import HtmlFormatter - -pygments_formatter = HtmlFormatter() - -def pygments_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - try: - lexer = get_lexer_by_name(arguments[0]) - except ValueError: - # no lexer found - use the text one instead of an exception - lexer = get_lexer_by_name('text') - parsed = highlight(u'\n'.join(content), lexer, pygments_formatter) - return [nodes.raw('', parsed, format='html')] -pygments_directive.arguments = (1, 0, 1) -pygments_directive.content = 1 -directives.register_directive('code-block', pygments_directive) - -# Call the docutils publisher to render the input as html:: - -publish_cmdline(writer_name='html', description=description) - -# .. _doctutile: http://docutils.sf.net/ -# .. _pygments: http://pygments.org/ -# .. _Using Pygments in ReST documents: http://pygments.org/docs/rstdirective/ diff --git a/sandbox/code-block-directive/docs/myfunction.py.pdf b/sandbox/code-block-directive/docs/myfunction.py.pdf dissimilarity index 78% index fccaeee8eb4c6aa522ea68bb37e2d59265b656d6..6fa42f72a6d048680b5a373b870eff8e2eb78c05 100644 GIT binary patch delta 28096 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 delta 24832 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 diff --git a/sandbox/code-block-directive/docs/myfunction.py.pseudoxml b/sandbox/code-block-directive/docs/myfunction.py.pseudoxml index 04bd2cb05..cf21d2eab 100644 --- a/sandbox/code-block-directive/docs/myfunction.py.pseudoxml +++ b/sandbox/code-block-directive/docs/myfunction.py.pseudoxml @@ -2,22 +2,91 @@ This is a test of the new "code" directive: - Translate this document to HTML with a pygments enhanced frontend, e.g. + Translate this document with a pygments enhanced frontend, e.g. - ../rst2html-highlight.py --stylesheet=../data/pygments-default.css + ../rst2html-highlight.py --stylesheet=../data/pygments-default.css + ../rst2latex-highlight.py --stylesheet=../data/pygments-docutilsroles.sty - ../rst2latex-highlight.py --stylesheet=../data/pygments-docutilsroles.sty + or via the test case in - ../rst2pseudoxml-highlight.py + ../pygments_code_block_directive.py --traceback The example from Docutils TODO list: - - print 'This is Python code.' - for i in range(10): - print i + + + print + + + 'This is Python code.' + + + for + + + i + + + in + + + range + + ( + + 10 + + ): + + + + print + + + i + + Numbered lines: + + + 1 + + # This is Python code, + + + 2 + + # that prints the integers from 0 to 9 + + + 3 + + for + + + i + + + in + + + range + + ( + + 10 + + ): + + + 4 + + + print + + + i Another example: - + 7 @@ -36,23 +105,19 @@ 9 - + """ + 10 - - just a test""" 11 - - - 12 # and now for something completely different - 13 + 12 print diff --git a/sandbox/code-block-directive/docs/myfunction.py.tex b/sandbox/code-block-directive/docs/myfunction.py.tex index 5a7721295..70f96df3a 100644 --- a/sandbox/code-block-directive/docs/myfunction.py.tex +++ b/sandbox/code-block-directive/docs/myfunction.py.tex @@ -14,8 +14,11 @@ \setlength{\DUlineblockindent}{1em} %%% User specified packages and stylesheets -\usepackage{../data/pygments-docutilsroles} +\usepackage{palatino-optima-txtt} +\usepackage{microtype} +\usepackage{bookmark} +\usepackage{../data/pygments-docutilsroles} %%% Fallback definitions for Docutils-specific commands % inline markup (custom roles) @@ -65,7 +68,7 @@ The example from Docutils TODO list: Numbered lines: % \begin{quote}{\ttfamily \raggedright \noindent -\DUrole{ln}{1~}\DUrole{c}{\#~This~is~Python~code,}~\\ +\DUrole{l}{\DUrole{n}{1~}}\DUrole{c}{\#~This~is~Python~code,}~\\ \DUrole{ln}{2~}\DUrole{c}{\#~that~prints~the~integers~from~0~to~9}~\\ \DUrole{ln}{3~}\DUrole{k}{for}~\DUrole{n}{i}~\DUrole{ow}{in}~\DUrole{nb}{range}\DUrole{p}{(}\DUrole{mi}{10}\DUrole{p}{):}~\\ \DUrole{ln}{4~}~~~~\DUrole{k}{print}~\DUrole{n}{i} @@ -75,7 +78,7 @@ Numbered lines: Another example: % \begin{quote}{\ttfamily \raggedright \noindent -\DUrole{ln}{~7~}\DUrole{k}{def}~\DUrole{nf}{my\_function}\DUrole{p}{():}~\\ +\DUrole{l}{\DUrole{n}{~7~}}\DUrole{k}{def}~\DUrole{nf}{my\_function}\DUrole{p}{():}~\\ \DUrole{ln}{~8~}~~~~\DUrole{sd}{"{}"{}"Test~the~lexer.\\ }\DUrole{ln}{~9~}\DUrole{sd}{~~~~"{}"{}"}~\\ \DUrole{ln}{10~}~\\ @@ -84,6 +87,9 @@ Another example: } \end{quote} -The end. +Inline code \texttt{\DUrole{code}{\$\textbackslash{}alpha = +\textbackslash{}int\_0\textasciicircum{}\textbackslash{}infty f(x) dx\$}}. + +Python code \texttt{\DUrole{code}{\DUrole{python}{\DUrole{testclass}{\DUrole{k}{print}\DUrole{p}{(}\DUrole{s}{"The end."}\DUrole{p}{)}}}}} \end{document} diff --git a/sandbox/code-block-directive/docs/myfunction.py.txt b/sandbox/code-block-directive/docs/myfunction.py.txt index cce27ea52..7d632a7d5 100644 --- a/sandbox/code-block-directive/docs/myfunction.py.txt +++ b/sandbox/code-block-directive/docs/myfunction.py.txt @@ -42,4 +42,10 @@ Another example: # and now for something completely different print 8/2 -The end. +Inline code :code:`$\alpha = \int_0^\infty f(x) dx$`. + +.. role:: python(code) + :language: python + :class: testclass + +Python code :python:`print("The end.")` diff --git a/sandbox/code-block-directive/docs/syntax-highlight.txt b/sandbox/code-block-directive/docs/syntax-highlight.txt dissimilarity index 80% index d87967995..85c320494 100644 --- a/sandbox/code-block-directive/docs/syntax-highlight.txt +++ b/sandbox/code-block-directive/docs/syntax-highlight.txt @@ -1,476 +1,149 @@ -.. -*- rst-mode -*- - -Syntax Highlight -================ - -:Author: Günter Milde -:Contact: milde@users.berlios.de -:Date: $Date$ -:Copyright: © 2007, 2009 G. Milde, - Released without warranties or conditions of any kind - under the terms of the Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0 -:Abstract: Proposal to add syntax highlight of code blocks to the - capabilities of Docutils_. - -.. sectnum:: -.. contents:: - -Syntax highlighting significantly enhances the readability of code. However, -in the current version, docutils does not highlight literal blocks. - -This sandbox project aims to add syntax highlight of code blocks to the -capabilities of docutils. To find its way into the docutils core, it should -meet the requirements laid out in a mail on `Questions about writing -programming manuals and scientific documents`__, by docutils main developer -David Goodger: - - I'd be happy to include Python source colouring support, and other - languages would be welcome too. A multi-language solution would be - useful, of course. My issue is providing support for all output formats - -- HTML and LaTeX and XML and anything in the future -- simultaneously. - Just HTML isn't good enough. Until there is a generic-output solution, - this will be something users will have to put together themselves. - -__ http://sourceforge.net/mailarchive/message.php?msg_id=12921194 - -Some older ideas are gathered in Docutils TODO_ document. - -.. _TODO: ../../../docutils/docs/dev/todo.html#colorize-python - -State of the art ----------------- - -There are already docutils extensions providing syntax colouring, e.g: - -`listings`_, - Since Docutils 0.5, the "latex2e" writer supports syntax highlight of - literal blocks via the `listings` package with the - ``--literal-block-env=lstlistings`` option. You need to provide a custom - style sheet. The stylesheets_ repository provides two LaTeX style sheets - for highlighting literal-blocks with "listings". - -Odtwriter_, experimental writer for Docutils OpenOffice export supports syntax - colours using Pygments_. See also the (outdated) section `Odtwriter syntax`_. - -Pygments_ - is a generic syntax highlighter written completely in Python. - - * Usable as a command-line tool and as a Python package. - * Supports about 200 `languages and markup formats`_ (version 1.4). - * Already used by the odtwriter_ and Sphinx. - * Support for new languages, formats, and styles is added easily (modular - structure, Python code, existing documentation). - * Well documented and actively maintained. - * The web site provides a recipe for `using Pygments in ReST documents`_ - (used in the legacy `Pygments enhanced docutils front-ends`_). - -rest2web_, - the "site builder" provides the `colorize`__ macro (using the - `Moin-Moin Python colorizer`_) - -__ http://www.voidspace.org.uk/python/rest2web/macros.html#colorize - -SilverCity_, - a C++ library and Python extension that can provide lexical - analysis for over 20 different programming languages. A recipe__ for a - "code-block" directive provides syntax highlight by SilverCity. - -__ http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252170 - -Sphinx_ - features automatic highlighting using the Pygments_ highlighter. - It introduces the custom directives - - :code-block: similar to the proposal below, - :sourcecode: an alias to "code-block", and - :highlight: configre highlight of "literal blocks". - - (see http://sphinx.pocoo.org/markup/code.html). - -Trac_ - has `reStructuredText support`__ and offers syntax highlighting with - a "code-block" directive using GNU Enscript_, SilverCity_, or Pygments_. - -__ http://trac.edgewall.org/wiki/WikiRestructuredText - - -Summary -""""""" - -On 2009-02-20, David Goodger wrote in docutils-devel - - I'd like to see the extensions implemented in Bruce and Sphinx etc. - folded back into core Docutils eventually. Otherwise we'll end up with - incompatible systems. - -Pygments_ seems to be the most promising Docutils highlighter. - -For printed output and PDFs via LaTeX, the listings_ package is a viable -alternative. - - -Pygments enhanced docutils front-ends -------------------------------------- - -Syntax highlight can be achieved by `front-end scripts`_ combining docutils and -pygments. - - "something users [will have to] put together themselves" - -Advantages: - + Easy implementation with no changes to the stock docutils_. - + Separation of code blocks and ordinary literal blocks. - -Disadvantages: - 1. "code-block" content is formatted by `pygments`_ and inserted in the - document tree as a "raw" node making the approach writer-dependant. - 2. documents are incompatible with the standard docutils because of the - locally defined directive. - 3. more "invasive" markup distracting from content - (no "minimal" code block marker -- three additional lines per code block) - - -Point 1 and 2 lead to the `code-block directive proposal`_. - -Point 3 becomes an issue in software documentation and literate programming -where a code block is the most used block markup. It is addressed in the -proposal for a `configurable literal block directive`_). - - -`code-block` directive proposal -------------------------------- - -Syntax -"""""" - -.. note:: This is the first draft for a reStructuredText definition, - analogue to other directives in ``directives.txt``. - -:Directive Type: "code" -:Doctree Element: literal_block -:Directive Arguments: One (`language`), optional. -:Directive Options: name, class, number-lines. -:Directive Content: Becomes the body of the literal block. - -The "code-block" directive constructs a literal block where the content is -parsed as source code and syntax highlight rules for `language` are applied. -If syntax rules for `language` are not known to Docutils, a warning is -issued and the content is rendered as ordinary literal block with -additional class arguments: "code" and the value of `language`. - - :number-lines: let pygments include line-numbers - - -The following options are recognized: - -``number-lines`` : [start line number] - Precede every code line with a line number. - The optional argument is the number of the first line (defaut 1). - -and the common options `:class:`_ and `:name:`_. - -Example:: - The content of the following directive :: - - .. code:: python - - def my_function(): - "just a test" - print 8/2 - - is parsed and marked up as Python source code. The actual rendering - depends on the style-sheet. - - -Remarks -""""""" - -* Without language argument, the parsing step is skipped. Use cases: - - * Mark a literal block as pseudo-code. - - * Suppress warnings about a missing Pygments_ module or unknown languages. - - * Do the parsing in the writer or output processor (e.g. LaTeX with - the listings_ package). - - The language's name can be given as `class` option. - - Alternative: - make the `language` argument compulsory and add a "no-highlight" option. - -* TODO: Pygments_ provides filters like VisibleWhitespaceFilter - add options to use them? - - - -Include directive option -"""""""""""""""""""""""" - -The include directive should get a matching new option: - -code: language - The entire included text is inserted into the document as if it were the - content of a code-block directive (useful for program listings). - -Code Role -""""""""" - -For inline code snippets, a `code` role should be implemented. Roles for -specific languages might be defined via the `role` directive based on the -generic `code` role. - -Implementation -"""""""""""""" - -Reading -''''''' - -Felix Wiemann provided a `proof of concept`_ script that utilizes the -pygments_ parser to parse a source code string and store the result in -the document tree. - -This concept is used in a `pygments_code_block_directive`_ (Source: -`pygments_code_block_directive.py`_), to define and register a "code-block" -directive. - -* The ``DocutilsInterface`` class uses pygments to parse the content of the - directive and classify the tokens using short CSS class names identical to - pygments HTML output. If pygments is not available, the unparsed code is - returned. TODO: issue a warning. - -* The ``code_block_directive`` function inserts the tokens in a "rich" - element with "classified" nodes. - -Writing -''''''' - -The writers can use the class information in the elements to render -the tokens. They should ignore the class information if they are unable to -use it or to pass it on. - -Running the test script `<../tools/test_pygments_code_block_directive.py>`_ -produces example output for a set of writers. - -HTML - The "html" writer works out of the box. - - * The rst2html-highlight_ front end registers the "code-block" directive and - converts an input file to html. - - * Styling is done with the adapted CSS style sheet `pygments-default.css`_ - based on docutils' default stylesheet and the output of - ``pygmentize -S default -f html``. - - The conversion of ``_ looks like - ``_. - - The "s5" and "pep" writers are not tested yet. - -XML - "xml" and "pseudoxml" work out of the box. - - The conversion of `myfunction.py.txt`_ looks like - ``_ respective ``_ - -LaTeX - "latex2e" (SVN version) works out of the box. - - * A style file, e.g. ``_, is required to actually - highlight the code in the output. (As with HTML, the pygments-produced - style file will not work with docutils' output.) - - * Alternatively, the latex writer could reconstruct the original - content and pass it to a ``lstlistings`` environment. - - TODO: This should be the default behaviour with - ``--literal-block-env=lstlistings``. - - The LaTeX output of `myfunction.py.txt`_ looks like ``_ - and corresponding PDF like ``_. - -OpenOffice - The `odtwriter` provides syntax highlight with pygments but uses a - different syntax and implementation. - - -TODO -"""" - -1. Minimal implementation: - - * move the code from `pygments_code_block_directive.py`_ to "the right - place". - - * add the CSS rules to the default style-sheet (see pygments-default.css_) - - * provide a LaTeX style. - -2. Write functional test case and sample. - -3. Think about an interface for pygments' options (like "encoding" or - "linenumbers"). - - -Configurable literal block directive ------------------------------------- - -Goal -"""" - -A clean and simple syntax for highlighted code blocks -- preserving the -space saving feature of the "minimised" literal block marker (``::`` at the -end of a text paragraph). This is especially desirable in documents with -many code blocks like tutorials or literate programs. - -Inline analogon -""""""""""""""" - -The *role* of inline `interpreted text` can be customised with the -"default-role" directive. This allows the use of the concise "backtick" -syntax for the most often used role, e.g. in a chemical paper, one could -use:: - - .. default-role:: subscript - - The triple point of H\ `2`\O is at 0°C. - -.. default-role:: subscript - -to produce - - The triple point of H\ `2`\O is at 0°C. - -This customisation is currently not possible for block markup. - -Proposal -"""""""" - -* Define a new "literal-block" directive syntax for an ordinary literal - block. This would simply insert the block content into the document - tree as "literal-block" element. - -* Define a "default-literal-block" setting that controls which - directive is called on a block following ``::``. Default would be the - "literal-block" directive (backwards compatible). - -Motivation -"""""""""" - -Analogue to customising the default role of "interpreted text" with the -"default-role" directive, the concise ``::`` literal-block markup could be -used for e.g. - -* a "code-block" directive for syntax highight - -* the "line-block" directive for poems or addresses - -* the "parsed-literal" directive - -Example:: - - ordinary literal block:: - - some text typeset in monospace - - .. default-literal-block:: code-block python - - this is colourful Python code:: - - def hello(): - print "hello world" - - -In the same line, a "default-block-quote" setting or directive could be -considered to configure the role of a block quote. - -Odtwriter syntax ----------------- - -.. attention:: - The content of this section relates to an old version of the - `odtwriter`. Things changed with the inclusion of the `odtwriter` into - standard Docutils. - - This is only kept for historical reasons. - -Dave Kuhlman's odtwriter_ extension can add syntax highlighting -to ordinary literal blocks. - -The ``--add-syntax-highlighting`` command line flag activates syntax -highlighting in literal blocks. By default, the "python" lexer is used. - -You can change this within your reST document with the `sourcecode` -directive:: - - .. sourcecode:: off - - ordinary literal block:: - - content set in teletype - - .. sourcecode:: on - .. sourcecode:: python - - colourful Python code:: - - def hello(): - print "hello world" - - -The "sourcecode" directive defined by the odtwriter is principally -different from the "code-block" directive of ``rst2html-pygments``: - -* The odtwriter directive does not have content. It is a switch. - -* The syntax highlighting state and language/lexer set by this directive - remain in effect until the next sourcecode directive is encountered in the - reST document. - - ``.. sourcecode:: `` - make highlighting active or inactive. - is either ``on`` or ``off``. - - ``.. sourcecode:: `` - change the lexer parsing literal code blocks. - should be one of aliases listed at pygment's `languages and - markup formats`_. - -I.e. the odtwriter implements a `configurable literal block directive`_ -(but with a slightly different syntax than the proposal above). - - -.. External links -.. _rest2web: http://www.voidspace.org.uk/python/rest2web/ -.. _Enscript: http://www.gnu.org/software/enscript/enscript.html -.. _SilverCity: http://silvercity.sourceforge.net/ -.. _Trac: http://trac.edgewall.org/ -.. _Moin-Moin Python colorizer: - http://www.standards-schmandards.com/2005/fangs-093/ -.. _odtwriter: http://www.rexx.com/~dkuhlman/odtwriter.html -.. _Sphinx: http://sphinx.pocoo.org -.. _listings: - http://www.ctan.org/tex-archive/help/Catalogue/entries/listings.html -.. _PyLit: http://pylit.berlios.de -.. _PyLit Examples: http://pylit.berlios.de/examples/index.html#latex-packages - -.. _Pygments: http://pygments.org/ -.. _languages and markup formats: http://pygments.org/languages -.. _Using Pygments in ReST documents: http://pygments.org/docs/rstdirective/ - -.. _Docutils: http://docutils.sourceforge.net/ -.. _Docutils Document Tree: - http://docutils.sf.net/docs/ref/doctree.html#classes -.. _latex-variants: http://docutils.sourceforge.net/sandbox/latex-variants/ -.. _proof of concept: - http://article.gmane.org/gmane.text.docutils.user/3689 - -.. Internal links -.. _front-end scripts: ../tools/pygments-enhanced-front-ends -.. _pygments-default.css: ../data/pygments-default.css -.. _pygments_code_block_directive.py: ../pygments_code_block_directive.py -.. _pygments_code_block_directive: pygments_code_block_directive-bunt.py.htm -.. _rst2html-highlight: ../rst2html-highlight -.. _pygments-long.css: ../data/pygments-long.css -.. _stylesheets: ../../stylesheets/ +.. -*- rst-mode -*- + +Syntax Highlight +================ + +:Author: Günter Milde +:Contact: milde@users.berlios.de +:Date: $Date$ +:Copyright: © 2007, 2009, 2012 G. Milde, +:License: Released under the terms of the `2-Clause BSD license`_, in short: + + Copying and distribution of this file, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. + This file is offered as-is, without any warranty. + +.. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause + +:Abstract: Proposal to add syntax highlight of code blocks to the + capabilities of Docutils_. + +.. sectnum:: +.. contents:: + +Syntax highlighting significantly enhances the readability of code. +Since version 0.9, docutils supports this with a `code` directive and role +as well as a `code` option to the `include` directive using the Pygments_ +syntax highlighter. + +Example:: + The content of the following directive :: + + .. code:: python + + def my_function(): + "just a test" + print 8/2 + + is parsed and marked up as Python source code. The actual rendering + depends on the style-sheet. + +TODO +==== + +* TODO: Pygments_ provides filters like VisibleWhitespaceFilter + add options to use them? + + +* Use syntax-highlight=long as default and add basic highlight rules + (keyword, comment, string?) to the default CSS stylesheet to get syntax + highlight out-of-the-box? + + Let the latex2e writer write basic rules in the document preamble if + "code" is used in the document? + +* The latex writer should pass the original content and options to a + ``lstlistings`` environment. with ``--literal-block-env=lstlistings``. + +* Check the `odtwriter`, use common syntax and implementation. + +* Provide more sample stylesheets in an official stylesheet library. + + +Configurable literal block directive +------------------------------------ + +Goal +"""" + +A clean and simple syntax for highlighted code blocks -- preserving the +space saving feature of the "minimised" literal block marker (``::`` at the +end of a text paragraph). This is especially desirable in documents with +many code blocks like tutorials or literate programs. + +Inline analogon +""""""""""""""" + +The *role* of inline `interpreted text` can be customised with the +"default-role" directive. This allows the use of the concise "backtick" +syntax for the most often used role, e.g. in a chemical paper, one could +use:: + + .. default-role:: subscript + + The triple point of H\ `2`\O is at 0°C. + +.. default-role:: subscript + +to produce + + The triple point of H\ `2`\O is at 0°C. + +This customisation is currently not possible for block markup. + +Proposal +"""""""" + +* Define a new "literal-block" directive syntax for an ordinary literal + block. This would simply insert the block content into the document + tree as "literal-block" element. + +* Define a "default-literal-block" setting that controls which + directive is called on a block following ``::``. Default would be the + "literal-block" directive (backwards compatible). + +Motivation +"""""""""" + +Analogue to customising the default role of "interpreted text" with the +"default-role" directive, the concise ``::`` literal-block markup could be +used for e.g. + +* a "code-block" directive for syntax highight + +* the "line-block" directive for poems or addresses + +* the "parsed-literal" directive + +Example:: + + ordinary literal block:: + + some text typeset in monospace + + .. default-literal-block:: code-block python + + this is colourful Python code:: + + def hello(): + print "hello world" + + +In the same line, a "default-block-quote" setting or directive could be +considered to configure the role of a block quote. + + + +.. External links +.. _odtwriter: http://www.rexx.com/~dkuhlman/odtwriter.html +.. _Sphinx: http://sphinx.pocoo.org +.. _listings: + http://www.ctan.org/tex-archive/help/Catalogue/entries/listings.html +.. _Pygments: http://pygments.org/ +.. _Docutils: http://docutils.sourceforge.net/ +.. _Docutils Document Tree: + http://docutils.sf.net/docs/ref/doctree.html#classes + +.. Internal links +.. _stylesheets: ../../stylesheets/ diff --git a/sandbox/code-block-directive/pygments_code_block_directive.py b/sandbox/code-block-directive/pygments_code_block_directive.py deleted file mode 100755 index 23b8f6a3d..000000000 --- a/sandbox/code-block-directive/pygments_code_block_directive.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/python -# coding: utf-8 - -# :Author: Georg Brandl; Felix Wiemann; Günter Milde -# :Date: $Date$ -# :Copyright: This module has been placed in the public domain. -# -# This is a merge of `Using Pygments in ReST documents`_ from the pygments_ -# documentation, and a `proof of concept`_ by Felix Wiemann. -# -# .. class:: borderless -# -# ========== ============================================================= -# 2007-06-01 Removed redundancy from class values. -# 2007-06-04 Merge of successive tokens of same type -# (code taken from pygments.formatters.others). -# 2007-06-05 Separate docutils formatter script -# Use pygments' CSS class names (like the html formatter) -# allowing the use of pygments-produced style sheets. -# 2007-06-07 Merge in the formatting of the parsed tokens -# (misnamed as docutils_formatter) as class DocutilsInterface -# 2007-06-08 Failsave implementation (fallback to a standard literal block -# if pygments not found) -# 2010-11-27 Rename directive from "code-block" to "code". -# Fix fallback if pygments not found. -# Use class-based interface. -# Add "number-lines" option. -# ========== ============================================================= -# -# :: - -"""Define and register a code directive using pygments""" - -# Requirements -# ------------ -# :: - -from docutils import nodes -from docutils.parsers.rst import directives, Directive -from docutils.parsers.rst.roles import set_classes -try: - import pygments - from pygments.lexers import get_lexer_by_name - from pygments.formatters.html import _get_ttype_class - with_pygments = True -except ImportError: - with_pygments = False - -# Customisation -# ------------- -# -# Do not insert inline nodes for the following tokens. -# (You could add e.g. Token.Punctuation like ``['', 'p']``.) :: - -unstyled_tokens = [''] # Token.Text - -# Lexer -# --------- -# -# This interface class combines code from -# pygments.formatters.html and pygments.formatters.others. - -class Lexer(object): - """Parse `code` lines and yield "classified" tokens. - - Arguments - - code -- list of source code lines to parse - language -- formal language the code is written in. - - Merge subsequent tokens of the same token-type. - - Iterating over an instance yields the tokens as ``(ttype_class, value)`` - tuples, where `ttype_class` is taken from pygments.token.STANDARD_TYPES - and corresponds to the class argument used in pygments html output. - """ - - def __init__(self, code, language): - """ - Set up a lexical analyzer for `code` in `language`. - """ - self.code = code - self.language = language - self.lexer = None - # get lexical analyzer for `language`: - if language in ('', 'text'): - return - if not with_pygments: - raise ApplicationError('Cannot highlight code. ' - 'Pygments package not found.') - try: - self.lexer = get_lexer_by_name(self.language) - except pygments.util.ClassNotFound: - raise ApplicationError('Cannot highlight code. ' - 'No Pygments lexer found for "%s".' % language) - - # Since version 1.2. (released Jan 01, 2010) Pygments has a - # TokenMergeFilter. ``self.merge(tokens)`` in __iter__ can be - # replaced by ``self.lexer.add_filter('tokenmerge')`` in __init__. - - def merge(self, tokens): - """Merge subsequent tokens of same token-type. - - Also strip the final '\n' (added by pygments). - """ - tokens = iter(tokens) - (lasttype, lastval) = tokens.next() - for ttype, value in tokens: - if ttype is lasttype: - lastval += value - else: - yield(lasttype, lastval) - (lasttype, lastval) = (ttype, value) - if lastval != '\n': - yield(lasttype, lastval) - - def __iter__(self): - """Parse self.code and yield "classified" tokens - """ - codestring = u'\n'.join(self.code) - if self.lexer is None: - yield [('', codestring)] - return - tokens = pygments.lex(codestring, self.lexer) - for ttype, value in self.merge(tokens): - # yield (ttype, value) # token type objects - yield (_get_ttype_class(ttype), value) # short name strings - - -class NumberLines(object): - """Insert linenumber-tokens in front of every newline. - - Arguments - - tokens -- iterable of ``(ttype_class, value)`` tuples - startline -- first line number - endline -- last line number - - Iterating over an instance yields the tokens preceded by - a ``('ln', '')`` token for every line. - Multi-line tokens from pygments are splitted. """ - - def __init__(self, tokens, startline, endline): - self.tokens = tokens - self.startline = startline - # pad linenumbers, e.g. endline == 100 -> fmt_str = '%3d ' - self.fmt_str = '%%%dd ' % len(str(endline)) - - def __iter__(self): - lineno = self.startline - yield ('ln', self.fmt_str % lineno) - for ttype, value in self.tokens: - lines = value.split('\n') - for line in lines[:-1]: - yield (ttype, line + '\n') - lineno += 1 - yield ('ln', self.fmt_str % lineno) - yield (ttype, lines[-1]) - - -# CodeBlock directive -# -------------------- -# :: - -class CodeBlock(Directive): - """Parse and mark up content of a code block. - """ - optional_arguments = 1 - option_spec = {'class': directives.class_option, - 'name': directives.unchanged, - 'number-lines': directives.unchanged # integer or None - } - has_content = True - - def run(self): - self.assert_has_content() - if self.arguments: - language = self.arguments[0] - else: - language = '' - set_classes(self.options) - classes = ['code', language] - if 'classes' in self.options: - classes.extend(self.options['classes']) - - # TODO: config setting to skip lexical analysis: - ## if document.settings.no_highlight: - ## language = '' - - # set up lexical analyzer - tokens = Lexer(self.content, language) - - if 'number-lines' in self.options: - # optional argument `startline`, defaults to 1 - try: - startline = int(self.options['number-lines'] or 1) - except ValueError: - raise self.error(':number-lines: with non-integer start value') - endline = startline + len(self.content) - # add linenumber filter: - tokens = NumberLines(tokens, startline, endline) - - node = nodes.literal_block('\n'.join(self.content), classes=classes) - self.add_name(node) - - # analyze content and add nodes for every token - for cls, value in tokens: - # print (cls, value) - if cls in unstyled_tokens: - # insert as Text to decrease the verbosity of the output. - node += nodes.Text(value, value) - else: - node += nodes.inline(value, value, classes=[cls]) - - return [node] - - -# Register Directive -# ------------------ -# :: - -directives.register_directive('code', CodeBlock) - -# .. _doctutils: http://docutils.sf.net/ -# .. _pygments: http://pygments.org/ -# .. _Using Pygments in ReST documents: http://pygments.org/docs/rstdirective/ -# .. _proof of concept: -# http://article.gmane.org/gmane.text.docutils.user/3689 -# -# Test output -# ----------- -# -# If called from the command line, call the docutils publisher to render the -# input:: - -if __name__ == '__main__': - from docutils.core import publish_cmdline, default_description - description = 'code-block directive test output' + default_description - try: - import locale - locale.setlocale(locale.LC_ALL, '') - except: - pass - # Uncomment the desired output format: - # publish_cmdline(writer_name='pseudoxml', description=description) - # publish_cmdline(writer_name='xml', description=description) - # publish_cmdline(writer_name='html', description=description) - publish_cmdline(writer_name='latex', description=description) diff --git a/sandbox/code-block-directive/rst2html-highlight.py b/sandbox/code-block-directive/rst2html-highlight.py deleted file mode 100755 index 5924da7cf..000000000 --- a/sandbox/code-block-directive/rst2html-highlight.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/python -# coding: utf-8 - -# rst2html-highlight -# ================== -# -# Docutils front-end with syntax highlight. -# -# :Author: David Goodger, Georg Brandl, Günter Milde -# :Date: $Date: 2008-05-22 08:42:52 +0200 (Do, 22. Mai 2008) $ -# :Copyright: This module has been placed in the public domain. -# -# This is a merge of the docutils_ `rst2html` front end with an extension -# suggestion by Felix Wiemann. -# -# :: - -""" -A front end to docutils, producing HTML with syntax colouring using pygments - -Generates (X)HTML documents from standalone reStructuredText sources. Uses -`pygments` to parse and mark up the content of ``.. code::` directives. -Needs an adapted stylesheet -""" - -# Requirements -# ------------ -# -# :: - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - -# The `pygments_code_block_directive`_ module defines and registers a new -# directive `code` that uses the `pygments`_ source highlighter to -# render code in color:: - -import pygments_code_block_directive - -# Call the docutils publisher to render the input as html:: - -description = __doc__ + default_description -publish_cmdline(writer_name='html', description=description) - -# .. _docutils: http://docutils.sf.net/ -# .. _pygments_code_block_directive: pygments_code_block_directive.py -# .. _pygments: http://pygments.org/ -# .. _Using Pygments in ReST documents: http://pygments.org/docs/rstdirective/ diff --git a/sandbox/code-block-directive/rst2latex-highlight.py b/sandbox/code-block-directive/rst2latex-highlight.py deleted file mode 100755 index 616ac3ce5..000000000 --- a/sandbox/code-block-directive/rst2latex-highlight.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/python - -# rst2latex-highlight -# =================== -# -# Docutils front-end with syntax highlight. -# -# :Author: David Goodger, a Pygments author|contributor, Guenter Milde -# :Date: $Date: 2008-05-22 08:42:52 +0200 (Do, 22. Mai 2008) $ -# :Copyright: This module has been placed in the public domain. -# -# This is a merge of the docutils_ `rst2latex` front end with an extension -# suggestion taken from the Pygments_ documentation. -# -# :: - -""" -A front end to docutils, producing LaTeX with syntax colouring using pygments - -Generates LaTeX documents from standalone reStructuredText sources. Uses the -`Pygments` syntax highlighter to parse and mark up the content of ``.. -code::` directives. Needs an adapted stylesheet. -""" - -# Requirements -# ------------ -# -# :: - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - -# ``_ defines and registers a new -# directive `code` that uses the `Pygments`_ syntax highlighter to -# render code in color:: - -import pygments_code_block_directive - -# Call the docutils publisher to render the input as latex:: - -description = __doc__ + default_description -publish_cmdline(writer_name='latex2e', description=description) - - -# .. References: -# .. _docutils: http://docutils.sf.net/ -# .. _pygments: http://pygments.org/ -# .. _Using Pygments in ReST documents: http://pygments.org/docs/rstdirective/ diff --git a/sandbox/code-block-directive/tools/makesty.py b/sandbox/code-block-directive/tools/makesty.py deleted file mode 100644 index 27e17bb09..000000000 --- a/sandbox/code-block-directive/tools/makesty.py +++ /dev/null @@ -1,62 +0,0 @@ -#! /usr/bin/env python -# coding: utf8 -# Copyright: Raphael 'kena' Poss -# this file is placed in the public domain. -# -# Convert a CSS stylesheet into one for Docutils' LaTeX output. -# -# Usage example:: -# -# pygmentize -S default -f html | python makesty.py >pygments-default.sty -# -# Versions: -# -# 2012-05-09: Günter Milde : -# Bugfix: do not fail at lines without comment. -# Support for digits in role names. -# ``\providecommand`` instead of ``\newcommand``. - -import sys -import re - -print '% Stylesheet for syntax highlight with Docutils' -print '% Generated by makesty.py from a Pygments CSS style' -print '% (output of `pygmentize -S - - -
-

Example for syntax highlight with Pygments

-

Translate this document to HTML with a pygments enhanced frontend:

-
-rst2html-pygments --stylesheet=pygments-default.css
-
-

or to LaTeX with:

-
-rst2latex-pygments --stylesheet=pygments-default.sty
-
-

to gain syntax highlight in the output.

-

Convert between text <-> code source formats with:

-
-pylit --code-block-marker='.. code-block:: python'
-
-

Run the doctests with:

-
-pylit --doctest for-else-test.py
-
-
-

for-else-test

-

Test the flow in a for loop with else statement.

-

First define a simple for loop.

-
def loop1(iterable):
-    """simple for loop with `else` statement"""
-    for i in iterable:
-        print i
-    else:
-        print "iterable empty"
-    print "Ende"
-
-

Now test it:

-

The first test runs as I expect: iterator empty -> else clause applies:

-
>>> execfile('for-else-test.py')
->>> loop1(range(0))
-iterable empty
-Ende
-
-

However, the else clause even runs if the iterator is not empty in the first -place but after it is "spent":

-
>>> loop1(range(3))
-0
-1
-2
-iterable empty
-Ende
-
-

It seems like the else clause can only be prevented, if we break out of -the loop. Let's try

-
def loop2(iterable):
-    """for loop with `break` and `else` statement"""
-    for i in iterable:
-        print i
-        break
-    else:
-        print "iterable empty"
-    print "Ende"
-
-

And indeed, the else clause is skipped after breaking out of the loop:

-
>>> loop2(range(3))
-0
-Ende
-
-

The empty iterator runs as expected:

-
>>> loop2(range(0))
-iterable empty
-Ende
-
-
-
- - - diff --git a/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.pdf b/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.pdf deleted file mode 100644 index fa39a596760b3828ffbd7c9237544f6983b71f94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 77532 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 -\newlength{\admonitionwidth} -\setlength{\admonitionwidth}{0.9\textwidth} -\newlength{\docinfowidth} -\setlength{\docinfowidth}{0.9\textwidth} -\newlength{\locallinewidth} -\newcommand{\optionlistlabel}[1]{\bf #1 \hfill} -\newenvironment{optionlist}[1] -{\begin{list}{} - {\setlength{\labelwidth}{#1} - \setlength{\rightmargin}{1cm} - \setlength{\leftmargin}{\rightmargin} - \addtolength{\leftmargin}{\labelwidth} - \addtolength{\leftmargin}{\labelsep} - \renewcommand{\makelabel}{\optionlistlabel}} -}{\end{list}} -\newlength{\lineblockindentation} -\setlength{\lineblockindentation}{2.5em} -\newenvironment{lineblock}[1] -{\begin{list}{} - {\setlength{\partopsep}{\parskip} - \addtolength{\partopsep}{\baselineskip} - \topsep0pt\itemsep0.15\baselineskip\parsep0pt - \leftmargin#1} - \raggedright} -{\end{list}} -% begin: floats for footnotes tweaking. -\setlength{\floatsep}{0.5em} -\setlength{\textfloatsep}{\fill} -\addtolength{\textfloatsep}{3em} -\renewcommand{\textfraction}{0.5} -\renewcommand{\topfraction}{0.5} -\renewcommand{\bottomfraction}{0.5} -\setcounter{totalnumber}{50} -\setcounter{topnumber}{50} -\setcounter{bottomnumber}{50} -% end floats for footnotes -% some commands, that could be overwritten in the style file. -\newcommand{\rubric}[1]{\subsection*{~\hfill {\it #1} \hfill ~}} -\newcommand{\titlereference}[1]{\textsl{#1}} -% end of "some commands" -% user specified packages and stylesheets: -\usepackage{../../data/pygments-default} -\ifthenelse{\isundefined{\hypersetup}}{ -\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} -}{} -\title{Example for syntax highlight with Pygments} -\author{} -\date{} -\hypersetup{ -pdftitle={Example for syntax highlight with Pygments} -} -\raggedbottom -\begin{document} -\maketitle - -\setlength{\locallinewidth}{\linewidth} - -Translate this document to HTML with a pygments enhanced frontend: -\begin{quote}\begin{verbatim} -rst2html-pygments --stylesheet=pygments-default.css -\end{verbatim} -\end{quote} - -or to LaTeX with: -\begin{quote}\begin{verbatim} -rst2latex-pygments --stylesheet=pygments-default.sty -\end{verbatim} -\end{quote} - -to gain syntax highlight in the output. - -Convert between text {\textless}-{\textgreater} code source formats with: -\begin{quote}\begin{verbatim} -pylit --code-block-marker='.. code-block:: python' -\end{verbatim} -\end{quote} - -Run the doctests with: -\begin{quote}\begin{verbatim} -pylit --doctest for-else-test.py -\end{verbatim} -\end{quote} - - -%___________________________________________________________________________ - -\hypertarget{for-else-test}{} -\pdfbookmark[0]{for-else-test}{for-else-test} -\section*{for-else-test} -\label{for-else-test} - -Test the flow in a \titlereference{for} loop with \titlereference{else} statement. - -First define a simple \titlereference{for} loop. -\begin{Verbatim}[commandchars=@\[\]] -@PYay[def] @PYaK[loop1](iterable): - @PYas["""simple for loop with `else` statement"""] - @PYay[for] i @PYan[in] iterable: - @PYay[print] i - @PYay[else]: - @PYay[print] @PYad["]@PYad[iterable empty]@PYad["] - @PYay[print] @PYad["]@PYad[Ende]@PYad["] -\end{Verbatim} - -Now test it: - -The first test runs as I expect: iterator empty -{\textgreater} else clause applies: -\begin{Verbatim}[commandchars=@\[\]] -@PYaO[>>> ]@PYaX[execfile](@PYad[']@PYad[for-else-test.py]@PYad[']) -@PYaO[>>> ]loop1(@PYaX[range](@PYaw[0])) -@PYaa[iterable empty] -@PYaa[Ende] -\end{Verbatim} - -However, the else clause even runs if the iterator is not empty in the first -place but after it is ``spent'': -\begin{Verbatim}[commandchars=@\[\]] -@PYaO[>>> ]loop1(@PYaX[range](@PYaw[3])) -@PYaa[0] -@PYaa[1] -@PYaa[2] -@PYaa[iterable empty] -@PYaa[Ende] -\end{Verbatim} - -It seems like the else clause can only be prevented, if we break out of -the loop. Let's try -\begin{Verbatim}[commandchars=@\[\]] -@PYay[def] @PYaK[loop2](iterable): - @PYas["""for loop with `break` and `else` statement"""] - @PYay[for] i @PYan[in] iterable: - @PYay[print] i - @PYay[break] - @PYay[else]: - @PYay[print] @PYad["]@PYad[iterable empty]@PYad["] - @PYay[print] @PYad["]@PYad[Ende]@PYad["] -\end{Verbatim} - -And indeed, the else clause is skipped after breaking out of the loop: -\begin{Verbatim}[commandchars=@\[\]] -@PYaO[>>> ]loop2(@PYaX[range](@PYaw[3])) -@PYaa[0] -@PYaa[Ende] -\end{Verbatim} - -The empty iterator runs as expected: -\begin{Verbatim}[commandchars=@\[\]] -@PYaO[>>> ]loop2(@PYaX[range](@PYaw[0])) -@PYaa[iterable empty] -@PYaa[Ende] -\end{Verbatim} - -\end{document} diff --git a/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.txt b/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.txt deleted file mode 100644 index d9687ecd5..000000000 --- a/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/for-else-test.py.txt +++ /dev/null @@ -1,92 +0,0 @@ -Example for syntax highlight with Pygments -========================================== - -Translate this document to HTML with a pygments enhanced frontend:: - - rst2html-pygments --stylesheet=pygments-default.css - -or to LaTeX with:: - - rst2latex-pygments --stylesheet=pygments-default.sty - -to gain syntax highlight in the output. - -Convert between text <-> code source formats with:: - - pylit --code-block-marker='.. code-block:: python' - -Run the doctests with:: - - pylit --doctest for-else-test.py - - -for-else-test -------------- - -Test the flow in a `for` loop with `else` statement. - -First define a simple `for` loop. - -.. code-block:: python - - def loop1(iterable): - """simple for loop with `else` statement""" - for i in iterable: - print i - else: - print "iterable empty" - print "Ende" - -Now test it: - -The first test runs as I expect: iterator empty -> else clause applies: - -.. code-block:: pycon - - >>> execfile('for-else-test.py') - >>> loop1(range(0)) - iterable empty - Ende - -However, the else clause even runs if the iterator is not empty in the first -place but after it is "spent": - -.. code-block:: pycon - - >>> loop1(range(3)) - 0 - 1 - 2 - iterable empty - Ende - -It seems like the else clause can only be prevented, if we break out of -the loop. Let's try - -.. code-block:: python - - def loop2(iterable): - """for loop with `break` and `else` statement""" - for i in iterable: - print i - break - else: - print "iterable empty" - print "Ende" - -And indeed, the else clause is skipped after breaking out of the loop: - -.. code-block:: pycon - - >>> loop2(range(3)) - 0 - Ende - -The empty iterator runs as expected: - -.. code-block:: pycon - - >>> loop2(range(0)) - iterable empty - Ende - diff --git a/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2html-pygments b/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2html-pygments deleted file mode 100755 index 706b25980..000000000 --- a/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2html-pygments +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/python - -# :Author: David Goodger, the Pygments team, Guenter Milde -# :Date: $Date: $ -# :Copyright: This module has been placed in the public domain. - -# This is a merge of the docutils_ `rst2html` front end with an extension -# suggestion taken from the pygments_ documentation. - -""" -A front end to docutils, producing HTML with syntax colouring using pygments -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - -description = ('Generates (X)HTML documents from standalone reStructuredText ' - 'sources. Uses `pygments` to colorize the content of' - '"code-block" directives. Needs an adapted stylesheet' - + default_description) - -# Define a new directive `code-block` that uses the `pygments` source -# highlighter to render code in color. -# -# Code from the `pygments`_ documentation for `Using Pygments in ReST -# documents`_. - -from docutils import nodes -from docutils.parsers.rst import directives -from pygments import highlight -from pygments.lexers import get_lexer_by_name -from pygments.formatters import HtmlFormatter - -pygments_formatter = HtmlFormatter() - -def pygments_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - try: - lexer = get_lexer_by_name(arguments[0]) - except ValueError: - # no lexer found - use the text one instead of an exception - lexer = get_lexer_by_name('text') - parsed = highlight(u'\n'.join(content), lexer, pygments_formatter) - return [nodes.raw('', parsed, format='html')] -pygments_directive.arguments = (1, 0, 1) -pygments_directive.content = 1 -directives.register_directive('code-block', pygments_directive) - -# Call the docutils publisher to render the input as html:: - -publish_cmdline(writer_name='html', description=description) - -# .. _doctutile: http://docutils.sf.net/ -# .. _pygments: http://pygments.org/ -# .. _Using Pygments in ReST documents: http://pygments.org/docs/rstdirective/ diff --git a/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2latex-pygments b/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2latex-pygments deleted file mode 100755 index c53c2aa74..000000000 --- a/sandbox/code-block-directive/tools/pygments-enhanced-front-ends/rst2latex-pygments +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/python - -# Author: David Goodger, the Pygments team, Günter Milde -# Date: $Date: $ -# Copyright: This module has been placed in the public domain. - -# This is a merge of the docutils_ `rst2latex` front end with an extension -# suggestion taken from the pygments_ documentation. - -""" -A front end to docutils, producing LaTeX with syntax colouring using pygments -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - -description = ('Generates LaTeX documents from standalone reStructuredText ' - 'sources. Uses `pygments` to colorize the content of' - '"code-block" directives. Needs an adapted stylesheet' - + default_description) - -# Define a new directive `code-block` that uses the `pygments` source -# highlighter to render code in color. -# -# Code from the `pygments`_ documentation for `Using Pygments in ReST -# documents`_. - -from docutils import nodes -from docutils.parsers.rst import directives -from pygments import highlight -from pygments.lexers import get_lexer_by_name -from pygments.formatters import LatexFormatter - -pygments_formatter = LatexFormatter() - -def pygments_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - try: - lexer = get_lexer_by_name(arguments[0]) - except ValueError: - # no lexer found - use the text one instead of an exception - lexer = get_lexer_by_name('text') - parsed = highlight(u'\n'.join(content), lexer, pygments_formatter) - return [nodes.raw('', parsed, format='latex')] -pygments_directive.arguments = (1, 0, 1) -pygments_directive.content = 1 -directives.register_directive('code-block', pygments_directive) - -# Call the docutils publisher to render the input as latex:: - -publish_cmdline(writer_name='latex', description=description) - -# .. _doctutile: http://docutils.sf.net/ -# .. _pygments: http://pygments.org/ -# .. _Using Pygments in ReST documents: http://pygments.org/docs/rstdirective/ diff --git a/sandbox/code-block-directive/tools/test_pygments_code_block_directive.py b/sandbox/code-block-directive/tools/test_pygments_code_block_directive.py deleted file mode 100755 index def706889..000000000 --- a/sandbox/code-block-directive/tools/test_pygments_code_block_directive.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -# -*- coding: iso-8859-1 -*- - -# Test the parsing and formatting by pygments: - -# :Author: Felix Wiemann; Günter Milde -# :Date: $Date$ -# :Copyright: This module has been placed in the public domain. - -# Requirements -# ------------ - -from docutils import nodes, utils, core - -# Prepend parent dir to the PYTHONPATH (This is a hack to get this test -# working without installing the pygments_code_block_directive module. -# Not needed if the module is installed in the PYTHONPATH) -import sys -sys.path.insert(0, '..') - -from pygments_code_block_directive import DocutilsInterface - -# Test data -# --------- - -code_sample = """\ -def my_function(): - "just a test" - print 8/2 -""" - -language = "python" - -# Do not insert inline nodes for the following tokens. -# (You could add e.g. Token.Punctuation like ``['', 'p']``.) :: -unstyled_tokens = [''] - -# Set up a document tree -# ---------------------- - -document = utils.new_document('generated') -literal_block = nodes.literal_block(classes=["code", language]) -document += literal_block - - -# Parse code and fill the -# ---------------------------------------- - -for cls, value in DocutilsInterface(code_sample, language): - if cls in unstyled_tokens: - # insert as Text to decrease the verbosity of the output. - node = nodes.Text(value, value) - else: - node = nodes.inline(value, value, classes=[cls]) - literal_block += node - -# Write -# ----- - -writer_names = ('html', 'pseudoxml', 'xml', 'latex', 'newlatex2e', 's5') -for name in writer_names[:]: - print "\nusing writer %r\n" % name - print core.publish_from_doctree(document, writer_name=name) - -- 2.11.4.GIT