From 7935db78092dd7eb1c37a994959f59304fbff05d Mon Sep 17 00:00:00 2001 From: JinWang An Date: Tue, 5 Jan 2021 12:15:41 +0900 Subject: [PATCH] Imported Upstream version 2.0rc1 --- AUTHORS | 37 +- CHANGES | 157 +- LICENSE | 2 +- MANIFEST.in | 2 +- Makefile | 19 +- PKG-INFO | 21 +- Pygments.egg-info/PKG-INFO | 21 +- Pygments.egg-info/SOURCES.txt | 317 +- README.rst | 39 + doc/Makefile | 153 + doc/_static/favicon.ico | Bin 0 -> 16958 bytes doc/_static/logo_new.png | Bin 0 -> 40944 bytes doc/_static/logo_only.png | Bin 0 -> 16424 bytes doc/_templates/docssidebar.html | 3 + doc/_templates/indexsidebar.html | 25 + doc/_themes/pygments14/layout.html | 98 + doc/_themes/pygments14/static/bodybg.png | Bin 0 -> 51903 bytes doc/_themes/pygments14/static/docbg.png | Bin 0 -> 61296 bytes doc/_themes/pygments14/static/listitem.png | Bin 0 -> 207 bytes doc/_themes/pygments14/static/logo.png | Bin 0 -> 26933 bytes doc/_themes/pygments14/static/pocoo.png | Bin 0 -> 2154 bytes .../pygments14/static/pygments14.css_t | 401 ++ doc/_themes/pygments14/theme.conf | 15 + doc/conf.py | 249 + doc/docs/api.rst | 316 + doc/docs/authors.rst | 4 + doc/docs/changelog.rst | 1 + docs/src/cmdline.txt => doc/docs/cmdline.rst | 20 +- .../docs/filterdevelopment.rst | 2 +- docs/src/filters.txt => doc/docs/filters.rst | 9 +- .../docs/formatterdevelopment.rst | 2 +- .../formatters.txt => doc/docs/formatters.rst | 12 +- doc/docs/index.rst | 66 + .../integrate.txt => doc/docs/integrate.rst | 10 +- docs/src/java.txt => doc/docs/java.rst | 0 doc/docs/lexerdevelopment.rst | 682 ++ docs/src/lexers.txt => doc/docs/lexers.rst | 12 +- .../src/moinmoin.txt => doc/docs/moinmoin.rst | 0 docs/src/plugins.txt => doc/docs/plugins.rst | 0 .../quickstart.txt => doc/docs/quickstart.rst | 41 +- .../docs/rstdirective.rst | 0 docs/src/styles.txt => doc/docs/styles.rst | 6 +- docs/src/tokens.txt => doc/docs/tokens.rst | 17 +- docs/src/unicode.txt => doc/docs/unicode.rst | 15 +- doc/download.rst | 41 + doc/faq.rst | 143 + doc/index.rst | 54 + doc/languages.rst | 151 + doc/make.bat | 190 + {docs => doc}/pygmentize.1 | 0 docs/build/api.html | 458 -- docs/build/authors.html | 355 - docs/build/changelog.html | 930 --- docs/build/cmdline.html | 353 - docs/build/filterdevelopment.html | 282 - docs/build/filters.html | 412 -- docs/build/formatterdevelopment.html | 374 - docs/build/formatters.html | 927 --- docs/build/index.html | 261 - docs/build/installation.html | 281 - docs/build/integrate.html | 268 - docs/build/java.html | 271 - docs/build/lexerdevelopment.html | 691 -- docs/build/lexers.html | 5359 --------------- docs/build/moinmoin.html | 245 - docs/build/plugins.html | 294 - docs/build/quickstart.html | 390 -- docs/build/rstdirective.html | 229 - docs/build/styles.html | 341 - docs/build/tokens.html | 541 -- docs/build/unicode.html | 249 - docs/generate.py | 472 -- docs/src/api.txt | 270 - docs/src/authors.txt | 5 - docs/src/changelog.txt | 5 - docs/src/index.txt | 69 - docs/src/installation.txt | 71 - docs/src/lexerdevelopment.txt | 551 -- external/autopygmentize | 113 +- external/lasso-builtins-generator-9.lasso | 111 +- external/markdown-processor.py | 30 +- external/moin-parser.py | 2 +- external/rst-directive-old.py | 77 - external/rst-directive.py | 5 +- ez_setup.py | 574 +- pygmentize | 5 +- pygments/__init__.py | 8 +- pygments/cmdline.py | 289 +- pygments/console.py | 2 +- pygments/filter.py | 2 +- pygments/filters/__init__.py | 76 +- pygments/formatter.py | 11 +- pygments/formatters/__init__.py | 128 +- pygments/formatters/_mapping.py | 104 +- pygments/formatters/bbcode.py | 2 +- pygments/formatters/html.py | 78 +- pygments/formatters/img.py | 53 +- pygments/formatters/latex.py | 128 +- pygments/formatters/other.py | 62 +- pygments/formatters/rtf.py | 89 +- pygments/formatters/svg.py | 5 +- pygments/formatters/terminal.py | 43 +- pygments/formatters/terminal256.py | 51 +- pygments/lexer.py | 212 +- pygments/lexers/__init__.py | 132 +- .../{_asybuiltins.py => _asy_builtins.py} | 14 +- .../{_clbuiltins.py => _cl_builtins.py} | 34 +- pygments/lexers/_cocoa_builtins.py | 73 + .../{_lassobuiltins.py => _lasso_builtins.py} | 6034 ++++++++--------- .../{_luabuiltins.py => _lua_builtins.py} | 79 +- pygments/lexers/_mapping.py | 479 +- pygments/lexers/_openedge_builtins.py | 2554 +++++++ pygments/lexers/_openedgebuiltins.py | 562 -- .../{_phpbuiltins.py => _php_builtins.py} | 1734 +++-- pygments/lexers/_postgres_builtins.py | 633 +- pygments/lexers/_scilab_builtins.py | 3117 ++++++++- pygments/lexers/_sourcemod_builtins.py | 1161 ++++ pygments/lexers/_sourcemodbuiltins.py | 1072 --- pygments/lexers/_stan_builtins.py | 358 +- pygments/lexers/_vim_builtins.py | 1939 ++++++ pygments/lexers/_vimbuiltins.py | 13 - pygments/lexers/actionscript.py | 240 + pygments/lexers/agile.py | 1921 +----- pygments/lexers/algebra.py | 187 + pygments/lexers/ambient.py | 76 + pygments/lexers/apl.py | 101 + pygments/lexers/asm.py | 117 +- pygments/lexers/automation.py | 373 + pygments/lexers/basic.py | 500 ++ pygments/lexers/business.py | 592 ++ pygments/lexers/c_cpp.py | 231 + pygments/lexers/c_like.py | 841 +++ pygments/lexers/chapel.py | 98 + pygments/lexers/compiled.py | 3509 +--------- pygments/lexers/configs.py | 546 ++ pygments/lexers/console.py | 114 + pygments/lexers/css.py | 496 ++ pygments/lexers/d.py | 251 + pygments/lexers/dalvik.py | 33 +- pygments/lexers/data.py | 530 ++ pygments/lexers/diff.py | 106 + pygments/lexers/dotnet.py | 259 +- pygments/lexers/dsls.py | 510 ++ pygments/lexers/dylan.py | 289 + pygments/lexers/ecl.py | 125 + pygments/lexers/eiffel.py | 65 + pygments/lexers/erlang.py | 511 ++ pygments/lexers/esoteric.py | 114 + pygments/lexers/factor.py | 344 + pygments/lexers/fantom.py | 250 + pygments/lexers/felix.py | 273 + pygments/lexers/fortran.py | 160 + pygments/lexers/foxpro.py | 6 +- pygments/lexers/functional.py | 2599 +------ pygments/lexers/go.py | 101 + pygments/lexers/graph.py | 79 + pygments/lexers/graphics.py | 553 ++ pygments/lexers/haskell.py | 840 +++ pygments/lexers/haxe.py | 936 +++ pygments/lexers/hdl.py | 59 +- pygments/lexers/html.py | 589 ++ pygments/lexers/idl.py | 262 + pygments/lexers/igor.py | 280 + pygments/lexers/inferno.py | 96 + pygments/lexers/installers.py | 322 + pygments/lexers/int_fiction.py | 1342 ++++ pygments/lexers/iolang.py | 63 + pygments/lexers/javascript.py | 1198 ++++ pygments/lexers/julia.py | 194 + pygments/lexers/jvm.py | 1001 ++- pygments/lexers/lisp.py | 1480 ++++ pygments/lexers/make.py | 201 + pygments/lexers/markup.py | 502 ++ pygments/lexers/math.py | 1653 +---- pygments/lexers/matlab.py | 663 ++ pygments/lexers/ml.py | 768 +++ pygments/lexers/modeling.py | 356 + pygments/lexers/nimrod.py | 159 + pygments/lexers/nit.py | 64 + pygments/lexers/nix.py | 140 + pygments/lexers/objective.py | 323 + pygments/lexers/ooc.py | 85 + pygments/lexers/other.py | 3685 +--------- pygments/lexers/parsers.py | 309 +- pygments/lexers/pascal.py | 833 +++ pygments/lexers/pawn.py | 199 + pygments/lexers/perl.py | 614 ++ pygments/lexers/php.py | 246 + pygments/lexers/prolog.py | 306 + pygments/lexers/python.py | 833 +++ pygments/lexers/r.py | 453 ++ pygments/lexers/rdf.py | 99 + pygments/lexers/rebol.py | 433 ++ pygments/lexers/resource.py | 79 + ...botframeworklexer.py => robotframework.py} | 17 +- pygments/lexers/ruby.py | 516 ++ pygments/lexers/rust.py | 165 + pygments/lexers/scripting.py | 922 +++ pygments/lexers/shell.py | 123 +- pygments/lexers/smalltalk.py | 195 + pygments/lexers/snobol.py | 83 + pygments/lexers/special.py | 15 +- pygments/lexers/sql.py | 275 +- pygments/lexers/tcl.py | 145 + pygments/lexers/templates.py | 638 +- pygments/lexers/testing.py | 131 + pygments/lexers/text.py | 1848 +---- pygments/lexers/textedit.py | 169 + pygments/lexers/textfmts.py | 288 + pygments/lexers/theorem.py | 466 ++ pygments/lexers/urbi.py | 133 + pygments/lexers/web.py | 3425 +--------- pygments/lexers/webmisc.py | 922 +++ pygments/modeline.py | 40 + pygments/plugin.py | 2 +- pygments/regexopt.py | 92 + pygments/scanner.py | 2 +- pygments/sphinxext.py | 153 + pygments/style.py | 5 +- pygments/styles/__init__.py | 6 +- pygments/styles/autumn.py | 2 +- pygments/styles/borland.py | 2 +- pygments/styles/bw.py | 2 +- pygments/styles/colorful.py | 2 +- pygments/styles/default.py | 2 +- pygments/styles/emacs.py | 2 +- pygments/styles/friendly.py | 2 +- pygments/styles/fruity.py | 2 +- pygments/styles/igor.py | 29 + pygments/styles/manni.py | 2 +- pygments/styles/monokai.py | 8 +- pygments/styles/murphy.py | 2 +- pygments/styles/native.py | 2 +- pygments/styles/paraiso_dark.py | 125 + pygments/styles/paraiso_light.py | 125 + pygments/styles/pastie.py | 2 +- pygments/styles/perldoc.py | 2 +- pygments/styles/rrt.py | 2 +- pygments/styles/tango.py | 2 +- pygments/styles/trac.py | 2 +- pygments/styles/vim.py | 2 +- pygments/styles/vs.py | 2 +- pygments/styles/xcode.py | 51 + pygments/token.py | 5 +- pygments/unistring.py | 205 +- pygments/util.py | 161 +- scripts/check_sources.py | 123 +- scripts/debug_lexer.py | 233 + scripts/detect_missing_analyse_text.py | 9 +- scripts/find_codetags.py | 58 +- scripts/find_error.py | 171 +- scripts/get_vimkw.py | 43 +- scripts/reindent.py | 291 - scripts/vim2pygments.py | 16 +- setup.cfg | 1 + setup.py | 55 +- tests/examplefiles/99_bottles_of_beer.chpl | 161 + tests/examplefiles/Deflate.fs | 578 ++ tests/examplefiles/Error.pmod | 38 + tests/examplefiles/Errors.scala | 5 + tests/examplefiles/FakeFile.pike | 360 + .../Get-CommandDefinitionHtml.ps1 | 66 + tests/examplefiles/IPDispatchC.nc | 104 + tests/examplefiles/IPDispatchP.nc | 671 ++ tests/examplefiles/RoleQ.pm6 | 23 + tests/examplefiles/all.nit | 1986 ++++++ .../{ANTLRv3.g => antlr_ANTLRv3.g} | 0 tests/examplefiles/automake.mk | 7 + tests/examplefiles/clojure-weird-keywords.clj | 5 + tests/examplefiles/core.cljs | 52 + tests/examplefiles/demo.cfm | 14 +- tests/examplefiles/demo.css.in | 6 + tests/examplefiles/demo.hbs | 12 + tests/examplefiles/demo.js.in | 6 + tests/examplefiles/demo.xul.in | 7 + tests/examplefiles/docker.docker | 5 + tests/examplefiles/ember.handlebars | 33 + tests/examplefiles/example.als | 217 + tests/examplefiles/example.c | 2 +- tests/examplefiles/example.ceylon | 39 +- tests/examplefiles/example.chai | 6 + tests/examplefiles/example.clay | 33 + tests/examplefiles/example.cob | 936 --- tests/examplefiles/example.coffee | 27 + tests/examplefiles/example.e | 124 + tests/examplefiles/example.f90 | 8 + tests/examplefiles/example.feature | 16 + tests/examplefiles/example.gd | 23 + tests/examplefiles/example.gi | 64 + tests/examplefiles/example.golo | 113 + tests/examplefiles/example.groovy | 2 + tests/examplefiles/example.hs | 31 + tests/examplefiles/example.hx | 192 + tests/examplefiles/example.i6t | 32 + tests/examplefiles/example.i7x | 45 + tests/examplefiles/example.inf | 374 + tests/examplefiles/example.j | 564 ++ tests/examplefiles/example.java | 16 + tests/examplefiles/example.jsonld | 27 + tests/examplefiles/example.kal | 75 + tests/examplefiles/example.lagda | 19 + tests/examplefiles/example.liquid | 42 + tests/examplefiles/example.ma | 8 + tests/examplefiles/example.mq4 | 187 + tests/examplefiles/example.mqh | 123 + tests/examplefiles/example.ni | 57 + tests/examplefiles/example.nix | 80 + tests/examplefiles/example.pp | 8 + tests/examplefiles/example.red | 257 + tests/examplefiles/example.reds | 150 + tests/examplefiles/example.rexx | 50 + tests/examplefiles/example.rkt | 706 +- tests/examplefiles/example.sh | 22 + tests/examplefiles/example.slim | 31 + tests/examplefiles/example.sls | 51 + tests/examplefiles/example.stan | 174 +- tests/examplefiles/example.thy | 751 ++ tests/examplefiles/example.todotxt | 9 + tests/examplefiles/example.weechatlog | 4 +- tests/examplefiles/exampleScript.cfc | 241 + tests/examplefiles/exampleTag.cfc | 18 + tests/examplefiles/example_coq.v | 4 + tests/examplefiles/example_elixir.ex | 570 +- tests/examplefiles/garcia-wachs.kk | 70 +- tests/examplefiles/grammar-test.p6 | 22 + tests/examplefiles/hash_syntax.rb | 5 + tests/examplefiles/hello.at | 6 + tests/examplefiles/hello.golo | 5 + tests/examplefiles/hello.lsl | 12 + .../examplefiles/{File.hy => hybris_File.hy} | 0 .../{mg_sample.pro => idl_sample.pro} | 0 tests/examplefiles/iex_example | 23 + tests/examplefiles/import.hs | 4 - tests/examplefiles/inet_pton6.dg | 48 +- tests/examplefiles/interp.scala | 10 + tests/examplefiles/language.hy | 165 + tests/examplefiles/limbo.b | 456 ++ tests/examplefiles/livescript-demo.ls | 4 +- tests/examplefiles/main.cmake | 2 + tests/examplefiles/matlab_sample | 4 + tests/examplefiles/objc_example.m | 176 +- tests/examplefiles/objc_example2.m | 24 - .../{example.p => openedge_example} | 0 tests/examplefiles/pawn_example | 25 + tests/examplefiles/py3tb_test.py3tb | 4 + tests/examplefiles/pycon_test.pycon | 5 +- tests/examplefiles/qbasic_example | 2 + tests/examplefiles/r6rs-comments.scm | 23 + tests/examplefiles/resourcebundle_demo | 9 + ...tframework.txt => robotframework_test.txt} | 0 tests/examplefiles/rql-queries.rql | 34 + tests/examplefiles/rust_example.rs | 4 +- tests/examplefiles/scope.cirru | 43 + tests/examplefiles/{simple.md => simple.croc} | 0 tests/examplefiles/sparql.rq | 23 + tests/examplefiles/swig_java.swg | 1329 ++++ tests/examplefiles/swig_std_vector.i | 225 + tests/examplefiles/tads3_example.t | 1248 ++++ tests/examplefiles/test.R | 42 +- tests/examplefiles/test.agda | 109 + tests/examplefiles/test.apl | 26 + tests/examplefiles/test.bb | 95 + tests/examplefiles/test.cyp | 123 + tests/examplefiles/test.ebnf | 31 + tests/examplefiles/test.idr | 101 + tests/examplefiles/test.lean | 217 + tests/examplefiles/test.mask | 41 + tests/examplefiles/test.p6 | 252 + tests/examplefiles/test.pan | 54 + tests/examplefiles/test.php | 12 +- tests/examplefiles/test.pig | 148 + tests/examplefiles/test.pwn | 253 + tests/examplefiles/test.pypylog | 839 --- tests/examplefiles/test.r3 | 34 +- tests/examplefiles/test.rsl | 111 + tests/examplefiles/test.swift | 65 + tests/examplefiles/test.zep | 33 + tests/examplefiles/twig_test | 4612 +++++++++++++ tests/examplefiles/type.lisp | 16 + tests/examplefiles/unicode.go | 10 + tests/examplefiles/unicode.js | 5 + .../examplefiles/{test.bas => vbnet_test.bas} | 0 tests/examplefiles/vctreestatus_hg | 4 + tests/examplefiles/vimrc | 21 + tests/examplefiles/vpath.mk | 16 + tests/old_run.py | 138 - tests/run.py | 38 +- tests/string_asserts.py | 22 + tests/support.py | 2 + tests/test_basic_api.py | 147 +- tests/test_cfm.py | 46 + tests/test_clexer.py | 211 +- tests/test_cmdline.py | 32 +- tests/test_examplefiles.py | 111 +- tests/test_html_formatter.py | 31 +- tests/test_java.py | 42 + tests/test_latex_formatter.py | 11 +- tests/test_lexers_other.py | 65 + tests/test_objectiveclexer.py | 81 + tests/test_perllexer.py | 4 +- tests/test_qbasiclexer.py | 43 + tests/test_regexlexer.py | 9 +- tests/test_regexopt.py | 68 + tests/test_rtf_formatter.py | 109 + tests/test_ruby.py | 145 + tests/test_shell.py | 63 + tests/test_smarty.py | 40 + tests/test_string_asserts.py | 35 + tests/test_textfmts.py | 41 + tests/test_token.py | 6 +- tests/test_unistring.py | 48 + tests/test_using_api.py | 2 +- tests/test_util.py | 14 +- 413 files changed, 70927 insertions(+), 44465 deletions(-) create mode 100644 README.rst create mode 100644 doc/Makefile create mode 100644 doc/_static/favicon.ico create mode 100644 doc/_static/logo_new.png create mode 100644 doc/_static/logo_only.png create mode 100644 doc/_templates/docssidebar.html create mode 100644 doc/_templates/indexsidebar.html create mode 100644 doc/_themes/pygments14/layout.html create mode 100644 doc/_themes/pygments14/static/bodybg.png create mode 100644 doc/_themes/pygments14/static/docbg.png create mode 100644 doc/_themes/pygments14/static/listitem.png create mode 100644 doc/_themes/pygments14/static/logo.png create mode 100644 doc/_themes/pygments14/static/pocoo.png create mode 100644 doc/_themes/pygments14/static/pygments14.css_t create mode 100644 doc/_themes/pygments14/theme.conf create mode 100644 doc/conf.py create mode 100644 doc/docs/api.rst create mode 100644 doc/docs/authors.rst create mode 100644 doc/docs/changelog.rst rename docs/src/cmdline.txt => doc/docs/cmdline.rst (91%) rename docs/src/filterdevelopment.txt => doc/docs/filterdevelopment.rst (98%) rename docs/src/filters.txt => doc/docs/filters.rst (85%) rename docs/src/formatterdevelopment.txt => doc/docs/formatterdevelopment.rst (98%) rename docs/src/formatters.txt => doc/docs/formatters.rst (90%) create mode 100644 doc/docs/index.rst rename docs/src/integrate.txt => doc/docs/integrate.rst (85%) rename docs/src/java.txt => doc/docs/java.rst (100%) create mode 100644 doc/docs/lexerdevelopment.rst rename docs/src/lexers.txt => doc/docs/lexers.rst (95%) rename docs/src/moinmoin.txt => doc/docs/moinmoin.rst (100%) rename docs/src/plugins.txt => doc/docs/plugins.rst (100%) rename docs/src/quickstart.txt => doc/docs/quickstart.rst (80%) rename docs/src/rstdirective.txt => doc/docs/rstdirective.rst (100%) rename docs/src/styles.txt => doc/docs/styles.rst (95%) rename docs/src/tokens.txt => doc/docs/tokens.rst (96%) rename docs/src/unicode.txt => doc/docs/unicode.rst (78%) create mode 100644 doc/download.rst create mode 100644 doc/faq.rst create mode 100644 doc/index.rst create mode 100644 doc/languages.rst create mode 100644 doc/make.bat rename {docs => doc}/pygmentize.1 (100%) delete mode 100644 docs/build/api.html delete mode 100644 docs/build/authors.html delete mode 100644 docs/build/changelog.html delete mode 100644 docs/build/cmdline.html delete mode 100644 docs/build/filterdevelopment.html delete mode 100644 docs/build/filters.html delete mode 100644 docs/build/formatterdevelopment.html delete mode 100644 docs/build/formatters.html delete mode 100644 docs/build/index.html delete mode 100644 docs/build/installation.html delete mode 100644 docs/build/integrate.html delete mode 100644 docs/build/java.html delete mode 100644 docs/build/lexerdevelopment.html delete mode 100644 docs/build/lexers.html delete mode 100644 docs/build/moinmoin.html delete mode 100644 docs/build/plugins.html delete mode 100644 docs/build/quickstart.html delete mode 100644 docs/build/rstdirective.html delete mode 100644 docs/build/styles.html delete mode 100644 docs/build/tokens.html delete mode 100644 docs/build/unicode.html delete mode 100755 docs/generate.py delete mode 100644 docs/src/api.txt delete mode 100644 docs/src/authors.txt delete mode 100644 docs/src/changelog.txt delete mode 100644 docs/src/index.txt delete mode 100644 docs/src/installation.txt delete mode 100644 docs/src/lexerdevelopment.txt delete mode 100644 external/rst-directive-old.py mode change 100755 => 100644 ez_setup.py rename pygments/lexers/{_asybuiltins.py => _asy_builtins.py} (99%) rename pygments/lexers/{_clbuiltins.py => _cl_builtins.py} (97%) create mode 100644 pygments/lexers/_cocoa_builtins.py rename pygments/lexers/{_lassobuiltins.py => _lasso_builtins.py} (94%) rename pygments/lexers/{_luabuiltins.py => _lua_builtins.py} (81%) create mode 100644 pygments/lexers/_openedge_builtins.py delete mode 100644 pygments/lexers/_openedgebuiltins.py rename pygments/lexers/{_phpbuiltins.py => _php_builtins.py} (70%) create mode 100644 pygments/lexers/_sourcemod_builtins.py delete mode 100644 pygments/lexers/_sourcemodbuiltins.py create mode 100644 pygments/lexers/_vim_builtins.py delete mode 100644 pygments/lexers/_vimbuiltins.py create mode 100644 pygments/lexers/actionscript.py create mode 100644 pygments/lexers/algebra.py create mode 100644 pygments/lexers/ambient.py create mode 100644 pygments/lexers/apl.py create mode 100644 pygments/lexers/automation.py create mode 100644 pygments/lexers/basic.py create mode 100644 pygments/lexers/business.py create mode 100644 pygments/lexers/c_cpp.py create mode 100644 pygments/lexers/c_like.py create mode 100644 pygments/lexers/chapel.py create mode 100644 pygments/lexers/configs.py create mode 100644 pygments/lexers/console.py create mode 100644 pygments/lexers/css.py create mode 100644 pygments/lexers/d.py create mode 100644 pygments/lexers/data.py create mode 100644 pygments/lexers/diff.py create mode 100644 pygments/lexers/dsls.py create mode 100644 pygments/lexers/dylan.py create mode 100644 pygments/lexers/ecl.py create mode 100644 pygments/lexers/eiffel.py create mode 100644 pygments/lexers/erlang.py create mode 100644 pygments/lexers/esoteric.py create mode 100644 pygments/lexers/factor.py create mode 100644 pygments/lexers/fantom.py create mode 100644 pygments/lexers/felix.py create mode 100644 pygments/lexers/fortran.py create mode 100644 pygments/lexers/go.py create mode 100644 pygments/lexers/graph.py create mode 100644 pygments/lexers/graphics.py create mode 100644 pygments/lexers/haskell.py create mode 100644 pygments/lexers/haxe.py create mode 100644 pygments/lexers/html.py create mode 100644 pygments/lexers/idl.py create mode 100644 pygments/lexers/igor.py create mode 100644 pygments/lexers/inferno.py create mode 100644 pygments/lexers/installers.py create mode 100644 pygments/lexers/int_fiction.py create mode 100644 pygments/lexers/iolang.py create mode 100644 pygments/lexers/javascript.py create mode 100644 pygments/lexers/julia.py create mode 100644 pygments/lexers/lisp.py create mode 100644 pygments/lexers/make.py create mode 100644 pygments/lexers/markup.py create mode 100644 pygments/lexers/matlab.py create mode 100644 pygments/lexers/ml.py create mode 100644 pygments/lexers/modeling.py create mode 100644 pygments/lexers/nimrod.py create mode 100644 pygments/lexers/nit.py create mode 100644 pygments/lexers/nix.py create mode 100644 pygments/lexers/objective.py create mode 100644 pygments/lexers/ooc.py create mode 100644 pygments/lexers/pascal.py create mode 100644 pygments/lexers/pawn.py create mode 100644 pygments/lexers/perl.py create mode 100644 pygments/lexers/php.py create mode 100644 pygments/lexers/prolog.py create mode 100644 pygments/lexers/python.py create mode 100644 pygments/lexers/r.py create mode 100644 pygments/lexers/rdf.py create mode 100644 pygments/lexers/rebol.py create mode 100644 pygments/lexers/resource.py rename pygments/lexers/{_robotframeworklexer.py => robotframework.py} (98%) create mode 100644 pygments/lexers/ruby.py create mode 100644 pygments/lexers/rust.py create mode 100644 pygments/lexers/scripting.py create mode 100644 pygments/lexers/smalltalk.py create mode 100644 pygments/lexers/snobol.py create mode 100644 pygments/lexers/tcl.py create mode 100644 pygments/lexers/testing.py create mode 100644 pygments/lexers/textedit.py create mode 100644 pygments/lexers/textfmts.py create mode 100644 pygments/lexers/theorem.py create mode 100644 pygments/lexers/urbi.py create mode 100644 pygments/lexers/webmisc.py create mode 100644 pygments/modeline.py create mode 100644 pygments/regexopt.py create mode 100644 pygments/sphinxext.py create mode 100644 pygments/styles/igor.py create mode 100644 pygments/styles/paraiso_dark.py create mode 100644 pygments/styles/paraiso_light.py create mode 100644 pygments/styles/xcode.py create mode 100755 scripts/debug_lexer.py mode change 100755 => 120000 scripts/find_error.py delete mode 100755 scripts/reindent.py mode change 100644 => 100755 scripts/vim2pygments.py create mode 100644 tests/examplefiles/99_bottles_of_beer.chpl create mode 100755 tests/examplefiles/Deflate.fs create mode 100644 tests/examplefiles/Error.pmod create mode 100644 tests/examplefiles/FakeFile.pike create mode 100644 tests/examplefiles/Get-CommandDefinitionHtml.ps1 create mode 100644 tests/examplefiles/IPDispatchC.nc create mode 100644 tests/examplefiles/IPDispatchP.nc create mode 100644 tests/examplefiles/RoleQ.pm6 create mode 100644 tests/examplefiles/all.nit rename tests/examplefiles/{ANTLRv3.g => antlr_ANTLRv3.g} (100%) create mode 100644 tests/examplefiles/automake.mk create mode 100644 tests/examplefiles/clojure-weird-keywords.clj create mode 100644 tests/examplefiles/core.cljs create mode 100644 tests/examplefiles/demo.css.in create mode 100644 tests/examplefiles/demo.hbs create mode 100644 tests/examplefiles/demo.js.in create mode 100644 tests/examplefiles/demo.xul.in create mode 100644 tests/examplefiles/docker.docker create mode 100644 tests/examplefiles/ember.handlebars create mode 100644 tests/examplefiles/example.als create mode 100644 tests/examplefiles/example.chai create mode 100644 tests/examplefiles/example.clay create mode 100644 tests/examplefiles/example.coffee create mode 100644 tests/examplefiles/example.e create mode 100644 tests/examplefiles/example.f90 create mode 100644 tests/examplefiles/example.feature create mode 100644 tests/examplefiles/example.gd create mode 100644 tests/examplefiles/example.gi create mode 100644 tests/examplefiles/example.golo create mode 100755 tests/examplefiles/example.groovy create mode 100644 tests/examplefiles/example.hs create mode 100644 tests/examplefiles/example.hx create mode 100644 tests/examplefiles/example.i6t create mode 100644 tests/examplefiles/example.i7x create mode 100644 tests/examplefiles/example.inf create mode 100644 tests/examplefiles/example.j create mode 100644 tests/examplefiles/example.java create mode 100644 tests/examplefiles/example.jsonld create mode 100644 tests/examplefiles/example.kal create mode 100644 tests/examplefiles/example.lagda create mode 100644 tests/examplefiles/example.liquid create mode 100644 tests/examplefiles/example.ma create mode 100644 tests/examplefiles/example.mq4 create mode 100644 tests/examplefiles/example.mqh create mode 100644 tests/examplefiles/example.ni create mode 100644 tests/examplefiles/example.nix create mode 100644 tests/examplefiles/example.pp create mode 100644 tests/examplefiles/example.red create mode 100644 tests/examplefiles/example.reds create mode 100644 tests/examplefiles/example.rexx create mode 100644 tests/examplefiles/example.sh create mode 100644 tests/examplefiles/example.slim create mode 100644 tests/examplefiles/example.sls create mode 100644 tests/examplefiles/example.thy create mode 100644 tests/examplefiles/example.todotxt create mode 100644 tests/examplefiles/exampleScript.cfc create mode 100644 tests/examplefiles/exampleTag.cfc create mode 100644 tests/examplefiles/example_coq.v create mode 100644 tests/examplefiles/grammar-test.p6 create mode 100644 tests/examplefiles/hash_syntax.rb create mode 100644 tests/examplefiles/hello.at create mode 100644 tests/examplefiles/hello.golo create mode 100644 tests/examplefiles/hello.lsl rename tests/examplefiles/{File.hy => hybris_File.hy} (100%) rename tests/examplefiles/{mg_sample.pro => idl_sample.pro} (100%) create mode 100644 tests/examplefiles/iex_example delete mode 100644 tests/examplefiles/import.hs create mode 100644 tests/examplefiles/interp.scala create mode 100644 tests/examplefiles/language.hy create mode 100644 tests/examplefiles/limbo.b delete mode 100644 tests/examplefiles/objc_example2.m rename tests/examplefiles/{example.p => openedge_example} (100%) create mode 100644 tests/examplefiles/pawn_example create mode 100644 tests/examplefiles/py3tb_test.py3tb create mode 100644 tests/examplefiles/qbasic_example create mode 100644 tests/examplefiles/r6rs-comments.scm create mode 100644 tests/examplefiles/resourcebundle_demo rename tests/examplefiles/{robotframework.txt => robotframework_test.txt} (100%) create mode 100644 tests/examplefiles/rql-queries.rql create mode 100644 tests/examplefiles/scope.cirru rename tests/examplefiles/{simple.md => simple.croc} (100%) create mode 100644 tests/examplefiles/sparql.rq create mode 100644 tests/examplefiles/swig_java.swg create mode 100644 tests/examplefiles/swig_std_vector.i create mode 100644 tests/examplefiles/tads3_example.t create mode 100644 tests/examplefiles/test.agda create mode 100644 tests/examplefiles/test.apl create mode 100644 tests/examplefiles/test.bb create mode 100644 tests/examplefiles/test.cyp create mode 100644 tests/examplefiles/test.ebnf create mode 100644 tests/examplefiles/test.idr create mode 100644 tests/examplefiles/test.lean create mode 100644 tests/examplefiles/test.mask create mode 100644 tests/examplefiles/test.p6 create mode 100644 tests/examplefiles/test.pan create mode 100644 tests/examplefiles/test.pig create mode 100644 tests/examplefiles/test.pwn create mode 100644 tests/examplefiles/test.rsl create mode 100644 tests/examplefiles/test.swift create mode 100644 tests/examplefiles/test.zep create mode 100644 tests/examplefiles/twig_test create mode 100644 tests/examplefiles/unicode.go create mode 100644 tests/examplefiles/unicode.js rename tests/examplefiles/{test.bas => vbnet_test.bas} (100%) create mode 100644 tests/examplefiles/vctreestatus_hg create mode 100644 tests/examplefiles/vimrc create mode 100644 tests/examplefiles/vpath.mk delete mode 100644 tests/old_run.py create mode 100644 tests/string_asserts.py create mode 100644 tests/test_cfm.py create mode 100644 tests/test_java.py create mode 100644 tests/test_lexers_other.py create mode 100644 tests/test_objectiveclexer.py create mode 100644 tests/test_qbasiclexer.py create mode 100644 tests/test_regexopt.py create mode 100644 tests/test_rtf_formatter.py create mode 100644 tests/test_ruby.py create mode 100644 tests/test_shell.py create mode 100644 tests/test_smarty.py create mode 100644 tests/test_string_asserts.py create mode 100644 tests/test_textfmts.py create mode 100644 tests/test_unistring.py diff --git a/AUTHORS b/AUTHORS index 9447bd0..0611923 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,15 +6,19 @@ Major developers are Tim Hatch and Armin Ronacher Other contributors, listed alphabetically, are: * Sam Aaron -- Ioke lexer -* Kumar Appaiah -- Debian control lexer * Ali Afshar -- image formatter +* Thomas Aglassinger -- Rexx lexer +* Kumar Appaiah -- Debian control lexer * Andreas Amann -- AppleScript lexer * Timothy Armstrong -- Dart lexer fixes * Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers * Jeremy Ashkenas -- CoffeeScript lexer * Stefan Matthias Aust -- Smalltalk lexer +* Lucas Bajolet -- Nit lexer * Ben Bangert -- Mako lexers * Max Battcher -- Darcs patch lexer +* Thomas Baruchel -- APL lexer +* Tim Baumann -- (Literate) Agda lexer * Paul Baumgart, 280 North, Inc. -- Objective-J lexer * Michael Bayer -- Myghty lexers * John Benediktsson -- Factor lexer @@ -25,24 +29,31 @@ Other contributors, listed alphabetically, are: * Pierre Bourdon -- bugfixes * Hiram Chirino -- Scaml and Jade lexers * Ian Cooper -- VGL lexer +* David Corbett -- Inform, Jasmin, and TADS 3 lexers * Leaf Corcoran -- MoonScript lexer -* Christian Jann -- ShellSession lexer * Christopher Creutzig -- MuPAD lexer +* Daniël W. Crompton - Pike lexer * Pete Curry -- bugfixes -* Owen Durni -- haXe lexer +* Bryan Davis -- EBNF lexer +* Owen Durni -- Haxe lexer +* Alexander Dutton, Oxford University Computing Services -- SPARQL lexer * Nick Efford -- Python 3 lexer * Sven Efftinge -- Xtend lexer * Artem Egorkine -- terminal256 formatter * James H. Fisher -- PostScript lexer +* William S. Fulton -- SWIG lexer * Carlos Galdino -- Elixir and Elixir Console lexers * Michael Galloy -- IDL lexer * Naveen Garg -- Autohotkey lexer * Laurent Gautier -- R/S lexer * Alex Gaynor -- PyPy log lexer +* Richard Gerkin -- Igor Pro lexer * Alain Gilbert -- TypeScript lexer +* Alex Gilding -- BlitzBasic lexer * Bertrand Goetzmann -- Groovy lexer * Krzysiek Goj -- Scala lexer * Matt Good -- Genshi, Cheetah lexers +* Michał Górny -- vim modeline support * Patrick Gotthardt -- PHP namespaces support * Olivier Guibe -- Asymptote lexer * Jordi Gutiérrez Hermoso -- Octave lexer @@ -53,19 +64,27 @@ Other contributors, listed alphabetically, are: * Greg Hendershott -- Racket lexer * David Hess, Fish Software, Inc. -- Objective-J lexer * Varun Hiremath -- Debian control lexer +* Rob Hoelz -- Perl 6 lexer * Doug Hogan -- Mscgen lexer * Ben Hollis -- Mason lexer +* Max Horn -- GAP lexer * Dustin Howett -- Logos lexer * Alastair Houghton -- Lexer inheritance facility * Tim Howard -- BlitzMax lexer * Ivan Inozemtsev -- Fantom lexer * Brian R. Jackson -- Tea lexer +* Christian Jann -- ShellSession lexer * Dennis Kaarsemaker -- sources.list lexer +* Dmitri Kabak - Inferno Limbo lexer * Igor Kalnitsky -- vhdl lexer +* Alexander Kit -- MaskJS lexer * Pekka Klärck -- Robot Framework lexer +* Gerwin Klein -- Isabelle lexer * Eric Knibbe -- Lasso lexer +* Stepan Koltsov -- Clay lexer * Adam Koprowski -- Opa lexer * Benjamin Kowarsch -- Modula-2 lexer +* Domen Kožar -- Nix lexer * Alexander Kriegisch -- Kconfig and AspectJ lexers * Marek Kubica -- Scheme lexer * Jochen Kupperschmidt -- Markdown processor @@ -76,6 +95,7 @@ Other contributors, listed alphabetically, are: * Mark Lee -- Vala lexer * Ben Mabey -- Gherkin lexer * Angus MacArthur -- QML lexer +* Louis Marchand -- Eiffel lexer * Simone Margaritelli -- Hybris lexer * Kirk McDonald -- D lexer * Gordon McGregor -- SystemVerilog lexer @@ -83,6 +103,7 @@ Other contributors, listed alphabetically, are: * Brian McKenna -- F# lexer * Charles McLaughlin -- Puppet lexer * Lukas Meuser -- BBCode formatter, Lua lexer +* Cat Miller -- Pig lexer * Paul Miller -- LiveScript lexer * Hong Minhee -- HTTP lexer * Michael Mior -- Awk lexer @@ -96,15 +117,20 @@ Other contributors, listed alphabetically, are: * Jesper Noehr -- HTML formatter "anchorlinenos" * Mike Nolta -- Julia lexer * Jonas Obrist -- BBCode lexer +* Edward O'Callaghan -- Cryptol lexer * David Oliva -- Rebol lexer +* Pat Pannuto -- nesC lexer * Jon Parise -- Protocol buffers lexer * Ronny Pfannschmidt -- BBCode lexer * Benjamin Peterson -- Test suite refactoring * Dominik Picheta -- Nimrod lexer +* Andrew Pinkham -- RTF Formatter Refactoring * Clément Prévost -- UrbiScript lexer +* raichoo -- Idris lexer * Kashif Rasul -- CUDA lexer * Justin Reidy -- MXML lexer * Norman Richards -- JSON lexer +* Corey Richardson -- Rust lexer updates * Lubomir Rintel -- GoodData MAQL and CL lexers * Andre Roberge -- Tango style * Konrad Rudolph -- LaTeX formatter enhancements @@ -126,12 +152,16 @@ Other contributors, listed alphabetically, are: * Tiberius Teng -- default style overhaul * Jeremy Thurgood -- Erlang, Squid config lexers * Brian Tiffin -- OpenCOBOL lexer +* Bob Tolbert -- Hy lexer * Erick Tryzelaar -- Felix lexer +* Alexander Udalov -- Kotlin lexer improvements +* Thomas Van Doren -- Chapel lexer * Daniele Varrazzo -- PostgreSQL lexers * Abe Voelker -- OpenEdge ABL lexer * Pepijn de Vos -- HTML formatter CTags support * Whitney Young -- ObjectiveC lexer * Matthias Vallentin -- Bro lexer +* Linh Vu Hong -- RSL lexer * Nathan Weizenbaum -- Haml and Sass lexers * Dietmar Winkler -- Modelica lexer * Nils Winter -- Smalltalk lexer @@ -139,5 +169,6 @@ Other contributors, listed alphabetically, are: * Diego Zamboni -- CFengine3 lexer * Enrique Zamudio -- Ceylon lexer * Alex Zimin -- Nemerle lexer +* Rob Zimmerman -- Kal lexer Many thanks for all contributions! diff --git a/CHANGES b/CHANGES index c2a3528..95f975a 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,159 @@ Issue numbers refer to the tracker at pull request numbers to the requests at . +Version 2.0rc1 +-------------- +(released Oct 16, 2014) + +- Dropped Python 2.4 and 2.5 compatibility. This is in favor of single-source + compatibility between Python 2.6, 2.7 and 3.3+. + +- New website and documentation based on Sphinx (finally!) + +- Lexers added: + + * APL (#969) + * Agda and Literate Agda (PR#203) + * Alloy (PR#355) + * AmbientTalk + * BlitzBasic (PR#197) + * ChaiScript (PR#24) + * Chapel (PR#256) + * Cirru (PR#275) + * Clay (PR#184) + * ColdFusion CFC (PR#283) + * Cryptol and Literate Cryptol (PR#344) + * Cypher (PR#257) + * Docker config files + * EBNF (PR#193) + * Eiffel (PR#273) + * GAP (PR#311) + * Golo (PR#309) + * Handlebars (PR#186) + * Hy (PR#238) + * Idris and Literate Idris (PR#210) + * Igor Pro (PR#172) + * Inform 6/7 (PR#281) + * Intel objdump (PR#279) + * Isabelle (PR#386) + * Jasmin (PR#349) + * JSON-LD (PR#289) + * Kal (PR#233) + * Lean (PR#399) + * LSL (PR#296) + * Limbo (PR#291) + * Liquid (#977) + * MQL (PR#285) + * MaskJS (PR#280) + * Mozilla preprocessors + * Mathematica (PR#245) + * NesC (PR#166) + * Nit (PR#375) + * Nix (PR#267) + * Pan + * Pawn (PR#211) + * Perl 6 (PR#181) + * Pig (PR#304) + * Pike (PR#237) + * QBasic (PR#182) + * Red (PR#341) + * ResourceBundle (#1038) + * Rexx (PR#199) + * Rql (PR#251) + * Rsl + * SPARQL (PR#78) + * Slim (PR#366) + * Swift (PR#371) + * Swig (PR#168) + * TADS 3 (PR#407) + * Todo.txt todo lists + * Twig (PR#404) + +- Added a helper to "optimize" regular expressions that match one of many + literal words; this can save 20% and more lexing time with lexers that + highlight many keywords or builtins. + +- New styles: "xcode" and "igor", similar to the default highlighting of + the respective IDEs. + +- The command-line "pygmentize" tool now tries a little harder to find the + correct encoding for files and the terminal (#979). + +- Added "inencoding" option for lexers to override "encoding" analogous + to "outencoding" (#800). + +- Added line-by-line "streaming" mode for pygmentize with the "-s" option. + (PR#165) Only fully works for lexers that have no constructs spanning + lines! + +- Added an "envname" option to the LaTeX formatter to select a replacement + verbatim environment (PR#235). + +- Updated the Makefile lexer to yield a little more useful highlighting. + +- Lexer aliases passed to ``get_lexer_by_name()`` are now case-insensitive. + +- File name matching in lexers and formatters will now use a regex cache + for speed (PR#205). + +- Pygments will now recognize "vim" modelines when guessing the lexer for + a file based on content (PR#118). + +- The NameHighlightFilter now works with any Name.* token type (#790). + +- Python 3 lexer: add new exceptions from PEP 3151. + +- Opa lexer: add new keywords (PR#170). + +- Julia lexer: add keywords and underscore-separated number + literals (PR#176). + +- Lasso lexer: fix method highlighting, update builtins. Fix + guessing so that plain XML isn't always taken as Lasso (PR#163). + +- Objective C/C++ lexers: allow "@" prefixing any expression (#871). + +- Ruby lexer: fix lexing of Name::Space tokens (#860) and of symbols + in hashes (#873). + +- Stan lexer: update for version 2.4.0 of the language (PR#162, PR#255, PR#377). + +- JavaScript lexer: add the "yield" keyword (PR#196). + +- HTTP lexer: support for PATCH method (PR#190). + +- Koka lexer: update to newest language spec (PR#201). + +- Haxe lexer: rewrite and support for Haxe 3 (PR#174). + +- Prolog lexer: add different kinds of numeric literals (#864). + +- F# lexer: rewrite with newest spec for F# 3.0 (#842), fix a bug with + dotted chains (#948). + +- Kotlin lexer: general update (PR#271). + +- Rebol lexer: fix comment detection and analyse_text (PR#261). + +- LLVM lexer: update keywords to v3.4 (PR#258). + +- PHP lexer: add new keywords and binary literals (PR#222). + +- external/markdown-processor.py updated to newest python-markdown (PR#221). + +- CSS lexer: some highlighting order fixes (PR#231). + +- Ceylon lexer: fix parsing of nested multiline comments (#915). + +- C family lexers: fix parsing of indented preprocessor directives (#944). + +- Rust lexer: update to 0.9 language version (PR#270, PR#388). + +- Elixir lexer: update to 0.15 language version (PR#392). + +- Fix swallowing incomplete tracebacks in Python console lexer (#874). + + Version 1.6 ----------- (released Feb 3, 2013) @@ -259,7 +412,7 @@ Version 1.3 * Ada * Coldfusion * Modula-2 - * haXe + * Haxe * R console * Objective-J * Haml and Sass @@ -318,7 +471,7 @@ Version 1.2 * CMake * Ooc * Coldfusion - * haXe + * Haxe * R console - Added options for rendering LaTeX in source code comments in the diff --git a/LICENSE b/LICENSE index 1e09119..641c8e8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2006-2013 by the respective authors (see AUTHORS file). +Copyright (c) 2006-2014 by the respective authors (see AUTHORS file). All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/MANIFEST.in b/MANIFEST.in index 312c150..cfec4e9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,5 +2,5 @@ include pygmentize include external/* include Makefile CHANGES LICENSE AUTHORS TODO ez_setup.py recursive-include tests * -recursive-include docs * +recursive-include doc * recursive-include scripts * diff --git a/Makefile b/Makefile index f24dd08..020f6ac 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # # Combines scripts for common tasks. # -# :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. +# :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. # :license: BSD, see LICENSE for details. # @@ -19,9 +19,9 @@ all: clean-pyc check test check: @$(PYTHON) scripts/detect_missing_analyse_text.py || true + @pyflakes pygments | grep -v 'but unused' || true @$(PYTHON) scripts/check_sources.py -i build -i dist -i pygments/lexers/_mapping.py \ - -i docs/build -i pygments/formatters/_mapping.py -i pygments/unistring.py \ - -i pygments/lexers/_vimbuiltins.py + -i docs/build -i pygments/formatters/_mapping.py -i pygments/unistring.py clean: clean-pyc -rm -rf build @@ -36,15 +36,12 @@ codetags: @$(PYTHON) scripts/find_codetags.py -i tests/examplefiles -i scripts/pylintrc \ -i scripts/find_codetags.py -o codetags.html . -docs: docs/build - -docs/build: docs/src/*.txt - $(PYTHON) docs/generate.py html docs/build $? - touch docs/build +docs: + make -C doc html mapfiles: - (cd pygments/lexers; $(PYTHON) _mapping.py) (cd pygments/formatters; $(PYTHON) _mapping.py) + (cd pygments/lexers; $(PYTHON) _mapping.py) pylint: @pylint --rcfile scripts/pylintrc pygments @@ -53,7 +50,7 @@ reindent: @$(PYTHON) scripts/reindent.py -r -B . test: - @$(PYTHON) tests/run.py $(TESTS) + @$(PYTHON) tests/run.py $(TEST) test-coverage: - @$(PYTHON) tests/run.py -C $(TESTS) + @$(PYTHON) tests/run.py -C $(TEST) diff --git a/PKG-INFO b/PKG-INFO index 6e9739d..5575d60 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,34 +1,27 @@ Metadata-Version: 1.1 Name: Pygments -Version: 1.6 +Version: 2.0rc1 Summary: Pygments is a syntax highlighting package written in Python. Home-page: http://pygments.org/ Author: Georg Brandl Author-email: georg@python.org License: BSD License -Description: - Pygments +Description: Pygments ~~~~~~~~ Pygments is a syntax highlighting package written in Python. - It is a generic syntax highlighter for general use in all kinds of software - such as forum systems, wikis or other applications that need to prettify - source code. Highlights are: + It is a generic syntax highlighter suitable for use in code hosting, forums, + wikis or other applications that need to prettify source code. Highlights + are: - * a wide range of common languages and markup formats is supported + * a wide range of over 300 languages and other text formats is supported * special attention is paid to details, increasing quality by a fair amount * support for new languages and formats are added easily * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image formats that PIL supports and ANSI sequences * it is usable as a command-line tool and as a library - * ... and it highlights even Brainfuck! - The `Pygments tip`_ is installable with ``easy_install Pygments==dev``. - - .. _Pygments tip: - http://bitbucket.org/birkenfeld/pygments-main/get/default.zip#egg=Pygments-dev - - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. Keywords: syntax highlighting diff --git a/Pygments.egg-info/PKG-INFO b/Pygments.egg-info/PKG-INFO index 6e9739d..5575d60 100644 --- a/Pygments.egg-info/PKG-INFO +++ b/Pygments.egg-info/PKG-INFO @@ -1,34 +1,27 @@ Metadata-Version: 1.1 Name: Pygments -Version: 1.6 +Version: 2.0rc1 Summary: Pygments is a syntax highlighting package written in Python. Home-page: http://pygments.org/ Author: Georg Brandl Author-email: georg@python.org License: BSD License -Description: - Pygments +Description: Pygments ~~~~~~~~ Pygments is a syntax highlighting package written in Python. - It is a generic syntax highlighter for general use in all kinds of software - such as forum systems, wikis or other applications that need to prettify - source code. Highlights are: + It is a generic syntax highlighter suitable for use in code hosting, forums, + wikis or other applications that need to prettify source code. Highlights + are: - * a wide range of common languages and markup formats is supported + * a wide range of over 300 languages and other text formats is supported * special attention is paid to details, increasing quality by a fair amount * support for new languages and formats are added easily * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image formats that PIL supports and ANSI sequences * it is usable as a command-line tool and as a library - * ... and it highlights even Brainfuck! - The `Pygments tip`_ is installable with ``easy_install Pygments==dev``. - - .. _Pygments tip: - http://bitbucket.org/birkenfeld/pygments-main/get/default.zip#egg=Pygments-dev - - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. Keywords: syntax highlighting diff --git a/Pygments.egg-info/SOURCES.txt b/Pygments.egg-info/SOURCES.txt index dd49c40..e1a295e 100644 --- a/Pygments.egg-info/SOURCES.txt +++ b/Pygments.egg-info/SOURCES.txt @@ -3,6 +3,7 @@ CHANGES LICENSE MANIFEST.in Makefile +README.rst TODO ez_setup.py pygmentize @@ -14,56 +15,52 @@ Pygments.egg-info/dependency_links.txt Pygments.egg-info/entry_points.txt Pygments.egg-info/not-zip-safe Pygments.egg-info/top_level.txt -docs/generate.py -docs/pygmentize.1 -docs/build/api.html -docs/build/authors.html -docs/build/changelog.html -docs/build/cmdline.html -docs/build/filterdevelopment.html -docs/build/filters.html -docs/build/formatterdevelopment.html -docs/build/formatters.html -docs/build/index.html -docs/build/installation.html -docs/build/integrate.html -docs/build/java.html -docs/build/lexerdevelopment.html -docs/build/lexers.html -docs/build/moinmoin.html -docs/build/plugins.html -docs/build/quickstart.html -docs/build/rstdirective.html -docs/build/styles.html -docs/build/tokens.html -docs/build/unicode.html -docs/src/api.txt -docs/src/authors.txt -docs/src/changelog.txt -docs/src/cmdline.txt -docs/src/filterdevelopment.txt -docs/src/filters.txt -docs/src/formatterdevelopment.txt -docs/src/formatters.txt -docs/src/index.txt -docs/src/installation.txt -docs/src/integrate.txt -docs/src/java.txt -docs/src/lexerdevelopment.txt -docs/src/lexers.txt -docs/src/moinmoin.txt -docs/src/plugins.txt -docs/src/quickstart.txt -docs/src/rstdirective.txt -docs/src/styles.txt -docs/src/tokens.txt -docs/src/unicode.txt +doc/Makefile +doc/conf.py +doc/download.rst +doc/faq.rst +doc/index.rst +doc/languages.rst +doc/make.bat +doc/pygmentize.1 +doc/_static/favicon.ico +doc/_static/logo_new.png +doc/_static/logo_only.png +doc/_templates/docssidebar.html +doc/_templates/indexsidebar.html +doc/_themes/pygments14/layout.html +doc/_themes/pygments14/theme.conf +doc/_themes/pygments14/static/bodybg.png +doc/_themes/pygments14/static/docbg.png +doc/_themes/pygments14/static/listitem.png +doc/_themes/pygments14/static/logo.png +doc/_themes/pygments14/static/pocoo.png +doc/_themes/pygments14/static/pygments14.css_t +doc/docs/api.rst +doc/docs/authors.rst +doc/docs/changelog.rst +doc/docs/cmdline.rst +doc/docs/filterdevelopment.rst +doc/docs/filters.rst +doc/docs/formatterdevelopment.rst +doc/docs/formatters.rst +doc/docs/index.rst +doc/docs/integrate.rst +doc/docs/java.rst +doc/docs/lexerdevelopment.rst +doc/docs/lexers.rst +doc/docs/moinmoin.rst +doc/docs/plugins.rst +doc/docs/quickstart.rst +doc/docs/rstdirective.rst +doc/docs/styles.rst +doc/docs/tokens.rst +doc/docs/unicode.rst external/autopygmentize external/lasso-builtins-generator-9.lasso external/markdown-processor.py external/moin-parser.py external/pygments.bashcomp -external/rst-directive-old.py external/rst-directive.py pygments/__init__.py pygments/cmdline.py @@ -71,8 +68,11 @@ pygments/console.py pygments/filter.py pygments/formatter.py pygments/lexer.py +pygments/modeline.py pygments/plugin.py +pygments/regexopt.py pygments/scanner.py +pygments/sphinxext.py pygments/style.py pygments/token.py pygments/unistring.py @@ -90,37 +90,111 @@ pygments/formatters/svg.py pygments/formatters/terminal.py pygments/formatters/terminal256.py pygments/lexers/__init__.py -pygments/lexers/_asybuiltins.py -pygments/lexers/_clbuiltins.py -pygments/lexers/_lassobuiltins.py -pygments/lexers/_luabuiltins.py +pygments/lexers/_asy_builtins.py +pygments/lexers/_cl_builtins.py +pygments/lexers/_cocoa_builtins.py +pygments/lexers/_lasso_builtins.py +pygments/lexers/_lua_builtins.py pygments/lexers/_mapping.py -pygments/lexers/_openedgebuiltins.py -pygments/lexers/_phpbuiltins.py +pygments/lexers/_openedge_builtins.py +pygments/lexers/_php_builtins.py pygments/lexers/_postgres_builtins.py -pygments/lexers/_robotframeworklexer.py pygments/lexers/_scilab_builtins.py -pygments/lexers/_sourcemodbuiltins.py +pygments/lexers/_sourcemod_builtins.py pygments/lexers/_stan_builtins.py -pygments/lexers/_vimbuiltins.py +pygments/lexers/_vim_builtins.py +pygments/lexers/actionscript.py pygments/lexers/agile.py +pygments/lexers/algebra.py +pygments/lexers/ambient.py +pygments/lexers/apl.py pygments/lexers/asm.py +pygments/lexers/automation.py +pygments/lexers/basic.py +pygments/lexers/business.py +pygments/lexers/c_cpp.py +pygments/lexers/c_like.py +pygments/lexers/chapel.py pygments/lexers/compiled.py +pygments/lexers/configs.py +pygments/lexers/console.py +pygments/lexers/css.py +pygments/lexers/d.py pygments/lexers/dalvik.py +pygments/lexers/data.py +pygments/lexers/diff.py pygments/lexers/dotnet.py +pygments/lexers/dsls.py +pygments/lexers/dylan.py +pygments/lexers/ecl.py +pygments/lexers/eiffel.py +pygments/lexers/erlang.py +pygments/lexers/esoteric.py +pygments/lexers/factor.py +pygments/lexers/fantom.py +pygments/lexers/felix.py +pygments/lexers/fortran.py pygments/lexers/foxpro.py pygments/lexers/functional.py +pygments/lexers/go.py +pygments/lexers/graph.py +pygments/lexers/graphics.py +pygments/lexers/haskell.py +pygments/lexers/haxe.py pygments/lexers/hdl.py +pygments/lexers/html.py +pygments/lexers/idl.py +pygments/lexers/igor.py +pygments/lexers/inferno.py +pygments/lexers/installers.py +pygments/lexers/int_fiction.py +pygments/lexers/iolang.py +pygments/lexers/javascript.py +pygments/lexers/julia.py pygments/lexers/jvm.py +pygments/lexers/lisp.py +pygments/lexers/make.py +pygments/lexers/markup.py pygments/lexers/math.py +pygments/lexers/matlab.py +pygments/lexers/ml.py +pygments/lexers/modeling.py +pygments/lexers/nimrod.py +pygments/lexers/nit.py +pygments/lexers/nix.py +pygments/lexers/objective.py +pygments/lexers/ooc.py pygments/lexers/other.py pygments/lexers/parsers.py +pygments/lexers/pascal.py +pygments/lexers/pawn.py +pygments/lexers/perl.py +pygments/lexers/php.py +pygments/lexers/prolog.py +pygments/lexers/python.py +pygments/lexers/r.py +pygments/lexers/rdf.py +pygments/lexers/rebol.py +pygments/lexers/resource.py +pygments/lexers/robotframework.py +pygments/lexers/ruby.py +pygments/lexers/rust.py +pygments/lexers/scripting.py pygments/lexers/shell.py +pygments/lexers/smalltalk.py +pygments/lexers/snobol.py pygments/lexers/special.py pygments/lexers/sql.py +pygments/lexers/tcl.py pygments/lexers/templates.py +pygments/lexers/testing.py pygments/lexers/text.py +pygments/lexers/textedit.py +pygments/lexers/textfmts.py +pygments/lexers/theorem.py +pygments/lexers/urbi.py pygments/lexers/web.py +pygments/lexers/webmisc.py pygments/styles/__init__.py pygments/styles/autumn.py pygments/styles/borland.py @@ -130,10 +204,13 @@ pygments/styles/default.py pygments/styles/emacs.py pygments/styles/friendly.py pygments/styles/fruity.py +pygments/styles/igor.py pygments/styles/manni.py pygments/styles/monokai.py pygments/styles/murphy.py pygments/styles/native.py +pygments/styles/paraiso_dark.py +pygments/styles/paraiso_light.py pygments/styles/pastie.py pygments/styles/perldoc.py pygments/styles/rrt.py @@ -141,27 +218,41 @@ pygments/styles/tango.py pygments/styles/trac.py pygments/styles/vim.py pygments/styles/vs.py +pygments/styles/xcode.py scripts/check_sources.py +scripts/debug_lexer.py scripts/detect_missing_analyse_text.py scripts/epydoc.css scripts/find_codetags.py scripts/find_error.py scripts/get_vimkw.py scripts/pylintrc -scripts/reindent.py scripts/vim2pygments.py -tests/old_run.py tests/run.py +tests/string_asserts.py tests/support.py tests/test_basic_api.py +tests/test_cfm.py tests/test_clexer.py tests/test_cmdline.py tests/test_examplefiles.py tests/test_html_formatter.py +tests/test_java.py tests/test_latex_formatter.py +tests/test_lexers_other.py +tests/test_objectiveclexer.py tests/test_perllexer.py +tests/test_qbasiclexer.py tests/test_regexlexer.py +tests/test_regexopt.py +tests/test_rtf_formatter.py +tests/test_ruby.py +tests/test_shell.py +tests/test_smarty.py +tests/test_string_asserts.py +tests/test_textfmts.py tests/test_token.py +tests/test_unistring.py tests/test_using_api.py tests/test_util.py tests/dtds/HTML4-f.dtd @@ -172,7 +263,7 @@ tests/dtds/HTML4.soc tests/dtds/HTMLlat1.ent tests/dtds/HTMLspec.ent tests/dtds/HTMLsym.ent -tests/examplefiles/ANTLRv3.g +tests/examplefiles/99_bottles_of_beer.chpl tests/examplefiles/AcidStateAdvanced.hs tests/examplefiles/AlternatingGroup.mu tests/examplefiles/BOM.js @@ -180,16 +271,24 @@ tests/examplefiles/CPDictionary.j tests/examplefiles/Config.in.cache tests/examplefiles/Constants.mo tests/examplefiles/DancingSudoku.lhs +tests/examplefiles/Deflate.fs +tests/examplefiles/Error.pmod tests/examplefiles/Errors.scala -tests/examplefiles/File.hy +tests/examplefiles/FakeFile.pike +tests/examplefiles/Get-CommandDefinitionHtml.ps1 +tests/examplefiles/IPDispatchC.nc +tests/examplefiles/IPDispatchP.nc tests/examplefiles/Intro.java tests/examplefiles/Makefile tests/examplefiles/Object.st tests/examplefiles/OrderedMap.hx +tests/examplefiles/RoleQ.pm6 tests/examplefiles/SmallCheck.hs tests/examplefiles/Sorting.mod tests/examplefiles/Sudoku.lhs tests/examplefiles/addressbook.proto +tests/examplefiles/all.nit +tests/examplefiles/antlr_ANTLRv3.g tests/examplefiles/antlr_throws tests/examplefiles/apache2.conf tests/examplefiles/as3_test.as @@ -197,6 +296,7 @@ tests/examplefiles/as3_test2.as tests/examplefiles/as3_test3.as tests/examplefiles/aspx-cs_example tests/examplefiles/autoit_submit.au3 +tests/examplefiles/automake.mk tests/examplefiles/badcase.java tests/examplefiles/batchfile.bat tests/examplefiles/bigtest.nsi @@ -207,49 +307,92 @@ tests/examplefiles/cells.ps tests/examplefiles/ceval.c tests/examplefiles/cheetah_example.html tests/examplefiles/classes.dylan +tests/examplefiles/clojure-weird-keywords.clj tests/examplefiles/condensed_ruby.rb tests/examplefiles/coq_RelationClasses +tests/examplefiles/core.cljs tests/examplefiles/database.pytb tests/examplefiles/de.MoinMoin.po tests/examplefiles/demo.ahk tests/examplefiles/demo.cfm +tests/examplefiles/demo.css.in +tests/examplefiles/demo.hbs +tests/examplefiles/demo.js.in +tests/examplefiles/demo.xul.in tests/examplefiles/django_sample.html+django +tests/examplefiles/docker.docker tests/examplefiles/dwarf.cw +tests/examplefiles/ember.handlebars tests/examplefiles/erl_session tests/examplefiles/escape_semicolon.clj tests/examplefiles/evil_regex.js tests/examplefiles/example.Rd +tests/examplefiles/example.als tests/examplefiles/example.bug tests/examplefiles/example.c tests/examplefiles/example.ceylon +tests/examplefiles/example.chai +tests/examplefiles/example.clay tests/examplefiles/example.cls tests/examplefiles/example.cob +tests/examplefiles/example.coffee tests/examplefiles/example.cpp +tests/examplefiles/example.e +tests/examplefiles/example.f90 +tests/examplefiles/example.feature +tests/examplefiles/example.gd +tests/examplefiles/example.gi +tests/examplefiles/example.golo +tests/examplefiles/example.groovy tests/examplefiles/example.gs tests/examplefiles/example.gst +tests/examplefiles/example.hs +tests/examplefiles/example.hx +tests/examplefiles/example.i6t +tests/examplefiles/example.i7x +tests/examplefiles/example.inf +tests/examplefiles/example.j tests/examplefiles/example.jag +tests/examplefiles/example.java +tests/examplefiles/example.jsonld +tests/examplefiles/example.kal tests/examplefiles/example.kt +tests/examplefiles/example.lagda +tests/examplefiles/example.liquid tests/examplefiles/example.lua +tests/examplefiles/example.ma tests/examplefiles/example.monkey tests/examplefiles/example.moo tests/examplefiles/example.moon +tests/examplefiles/example.mq4 +tests/examplefiles/example.mqh tests/examplefiles/example.msc +tests/examplefiles/example.ni tests/examplefiles/example.nim +tests/examplefiles/example.nix tests/examplefiles/example.ns2 -tests/examplefiles/example.p tests/examplefiles/example.pas +tests/examplefiles/example.pp tests/examplefiles/example.prg tests/examplefiles/example.rb +tests/examplefiles/example.red +tests/examplefiles/example.reds tests/examplefiles/example.reg +tests/examplefiles/example.rexx tests/examplefiles/example.rhtml tests/examplefiles/example.rkt tests/examplefiles/example.rpf +tests/examplefiles/example.sh tests/examplefiles/example.sh-session tests/examplefiles/example.shell-session +tests/examplefiles/example.slim +tests/examplefiles/example.sls tests/examplefiles/example.sml tests/examplefiles/example.snobol tests/examplefiles/example.stan tests/examplefiles/example.tea +tests/examplefiles/example.thy +tests/examplefiles/example.todotxt tests/examplefiles/example.ts tests/examplefiles/example.u tests/examplefiles/example.weechatlog @@ -258,6 +401,9 @@ tests/examplefiles/example.xtend tests/examplefiles/example.yaml tests/examplefiles/example2.aspx tests/examplefiles/example2.msc +tests/examplefiles/exampleScript.cfc +tests/examplefiles/exampleTag.cfc +tests/examplefiles/example_coq.v tests/examplefiles/example_elixir.ex tests/examplefiles/example_file.fy tests/examplefiles/firefox.mak @@ -273,13 +419,21 @@ tests/examplefiles/genshi_example.xml+genshi tests/examplefiles/genshitext_example.genshitext tests/examplefiles/glsl.frag tests/examplefiles/glsl.vert +tests/examplefiles/grammar-test.p6 +tests/examplefiles/hash_syntax.rb +tests/examplefiles/hello.at +tests/examplefiles/hello.golo +tests/examplefiles/hello.lsl tests/examplefiles/hello.smali tests/examplefiles/hello.sp tests/examplefiles/html+php_faulty.php tests/examplefiles/http_request_example tests/examplefiles/http_response_example -tests/examplefiles/import.hs +tests/examplefiles/hybris_File.hy +tests/examplefiles/idl_sample.pro +tests/examplefiles/iex_example tests/examplefiles/inet_pton6.dg +tests/examplefiles/interp.scala tests/examplefiles/intro.ik tests/examplefiles/ints.php tests/examplefiles/intsyn.fun @@ -292,7 +446,9 @@ tests/examplefiles/jbst_example2.jbst tests/examplefiles/jinjadesignerdoc.rst tests/examplefiles/json.lasso tests/examplefiles/json.lasso9 +tests/examplefiles/language.hy tests/examplefiles/lighttpd_config.conf +tests/examplefiles/limbo.b tests/examplefiles/linecontinuation.py tests/examplefiles/livescript-demo.ls tests/examplefiles/logos_example.xm @@ -303,7 +459,6 @@ tests/examplefiles/matlab_noreturn tests/examplefiles/matlab_sample tests/examplefiles/matlabsession_sample.txt tests/examplefiles/metagrammar.treetop -tests/examplefiles/mg_sample.pro tests/examplefiles/minehunt.qml tests/examplefiles/minimal.ns2 tests/examplefiles/moin_SyntaxReference.txt @@ -315,7 +470,8 @@ tests/examplefiles/nemerle_sample.n tests/examplefiles/nginx_nginx.conf tests/examplefiles/numbers.c tests/examplefiles/objc_example.m -tests/examplefiles/objc_example2.m +tests/examplefiles/openedge_example +tests/examplefiles/pawn_example tests/examplefiles/perl_misc tests/examplefiles/perl_perl5db tests/examplefiles/perl_regex-delims @@ -327,46 +483,60 @@ tests/examplefiles/postgresql_test.txt tests/examplefiles/pppoe.applescript tests/examplefiles/psql_session.txt tests/examplefiles/py3_test.txt +tests/examplefiles/py3tb_test.py3tb tests/examplefiles/pycon_test.pycon tests/examplefiles/pytb_test2.pytb tests/examplefiles/pytb_test3.pytb tests/examplefiles/python25-bsd.mak +tests/examplefiles/qbasic_example tests/examplefiles/qsort.prolog tests/examplefiles/r-console-transcript.Rout +tests/examplefiles/r6rs-comments.scm tests/examplefiles/ragel-cpp_rlscan tests/examplefiles/ragel-cpp_snippet tests/examplefiles/regex.js +tests/examplefiles/resourcebundle_demo tests/examplefiles/reversi.lsp -tests/examplefiles/robotframework.txt +tests/examplefiles/robotframework_test.txt +tests/examplefiles/rql-queries.rql tests/examplefiles/ruby_func_def.rb tests/examplefiles/rust_example.rs tests/examplefiles/scilab.sci +tests/examplefiles/scope.cirru tests/examplefiles/session.dylan-console tests/examplefiles/sibling.prolog -tests/examplefiles/simple.md +tests/examplefiles/simple.croc tests/examplefiles/smarty_example.html tests/examplefiles/source.lgt tests/examplefiles/sources.list +tests/examplefiles/sparql.rq tests/examplefiles/sphere.pov tests/examplefiles/sqlite3.sqlite3-console tests/examplefiles/squid.conf tests/examplefiles/string.jl tests/examplefiles/string_delimiters.d tests/examplefiles/stripheredoc.sh +tests/examplefiles/swig_java.swg +tests/examplefiles/swig_std_vector.i +tests/examplefiles/tads3_example.t tests/examplefiles/test.R tests/examplefiles/test.adb +tests/examplefiles/test.agda +tests/examplefiles/test.apl tests/examplefiles/test.asy tests/examplefiles/test.awk -tests/examplefiles/test.bas +tests/examplefiles/test.bb tests/examplefiles/test.bmx tests/examplefiles/test.boo tests/examplefiles/test.bro tests/examplefiles/test.cs tests/examplefiles/test.css tests/examplefiles/test.cu +tests/examplefiles/test.cyp tests/examplefiles/test.d tests/examplefiles/test.dart tests/examplefiles/test.dtd +tests/examplefiles/test.ebnf tests/examplefiles/test.ec tests/examplefiles/test.ecl tests/examplefiles/test.eh @@ -377,37 +547,54 @@ tests/examplefiles/test.flx tests/examplefiles/test.gdc tests/examplefiles/test.groovy tests/examplefiles/test.html +tests/examplefiles/test.idr tests/examplefiles/test.ini tests/examplefiles/test.java tests/examplefiles/test.jsp +tests/examplefiles/test.lean tests/examplefiles/test.maql +tests/examplefiles/test.mask tests/examplefiles/test.mod tests/examplefiles/test.moo tests/examplefiles/test.myt tests/examplefiles/test.nim tests/examplefiles/test.opa +tests/examplefiles/test.p6 +tests/examplefiles/test.pan tests/examplefiles/test.pas tests/examplefiles/test.php +tests/examplefiles/test.pig tests/examplefiles/test.plot tests/examplefiles/test.ps1 +tests/examplefiles/test.pwn tests/examplefiles/test.pypylog tests/examplefiles/test.r3 tests/examplefiles/test.rb tests/examplefiles/test.rhtml +tests/examplefiles/test.rsl tests/examplefiles/test.scaml tests/examplefiles/test.ssp +tests/examplefiles/test.swift tests/examplefiles/test.tcsh tests/examplefiles/test.vb tests/examplefiles/test.vhdl tests/examplefiles/test.xqy tests/examplefiles/test.xsl +tests/examplefiles/test.zep tests/examplefiles/test2.pypylog tests/examplefiles/truncated.pytb +tests/examplefiles/twig_test tests/examplefiles/type.lisp tests/examplefiles/underscore.coffee tests/examplefiles/unicode.applescript +tests/examplefiles/unicode.go +tests/examplefiles/unicode.js tests/examplefiles/unicodedoc.py tests/examplefiles/unix-io.lid +tests/examplefiles/vbnet_test.bas +tests/examplefiles/vctreestatus_hg +tests/examplefiles/vimrc +tests/examplefiles/vpath.mk tests/examplefiles/webkit-transition.css tests/examplefiles/while.pov tests/examplefiles/wiki.factor diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..e6c0392 --- /dev/null +++ b/README.rst @@ -0,0 +1,39 @@ +README for Pygments +=================== + +This is the source of Pygments. It is a generic syntax highlighter that +supports over 300 languages and text formats, for use in code hosting, forums, +wikis or other applications that need to prettify source code. + +Installing +---------- + +... works as usual, use ``python setup.py install``. + +Documentation +------------- + +... can be found online at http://pygments.org/ or created by :: + + cd doc + make html + +Development +----------- + +... takes place on `Bitbucket +`_, where the Mercurial +repository, tickets and pull requests can be viewed. + +Continuous testing runs on drone.io: + +.. image:: https://drone.io/bitbucket.org/birkenfeld/pygments-main/status.png + :target: https://drone.io/bitbucket.org/birkenfeld/pygments-main/ + +The authors +----------- + +Pygments is maintained by **Georg Brandl**, e-mail address *georg*\ *@*\ *python.org*. + +Many lexers and fixes have been contributed by **Armin Ronacher**, the rest of +the `Pocoo `_ team and **Tim Hatch**. diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..7fb7541 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = PYTHONPATH=.. sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Pygments.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Pygments.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Pygments" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Pygments" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/_static/favicon.ico b/doc/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..777f617dd904043a7ae5ae7469fc2b2afd18cee3 GIT binary patch literal 16958 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 XNySl69UDkT$>)lCmA+Hn{ipu}r=-;_ literal 0 HcmV?d00001 diff --git a/doc/_static/logo_new.png b/doc/_static/logo_new.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae4b2095814ac2c57901369af7d0c880d4a185a GIT binary patch literal 40944 zcmd3N1zVI|*ES-864D{vASvCT(k)0x4N5oCT`EeCfPl0P(lOFCghAJ`V^$_f~_cV9o6@)Ln~9=%sF^1#5rBfa~+hmn>+1-yylsj8`nGk=eSi1Y!U zkdG(^1|x>5!V5j$>7Ay43>w>@{o9~rFJ=i8N$Cn!r)q{uz54UesbAG#TyNA%k6!9D z-Fq_58c$1u{Og>IH_lVdTpH)hLkN6Le%RI?a2usiFsrHX@P(QEo_Xx8?#(FHQ?K^u zo;C@`yxVv=o0NCf;TPdyJK+WyYE_|W_~kLWkK5knSEj9vcUEmPWv2uOFvb7ALIWi5 z8vpxn_tWQoB+manhxUcF-~Zpo*0tx$_x|^B(VY=6(f_>OOMLbHp9c(#I$9O!|MO`2 zn3ewjJo4d?5dNRXl>a}5-Tcc3OlqjFph&I9%H5SKX?pc|fsG2Egjk1@%p$lYn^hI^ ziu2QpJDAPP965>i!&-|jB$Yx)xp2qM;`|mwY7|YkYC$iBevd+$^Ik)4mkmqJ z1?kNz{AJD!%i6RsvslvyhIe*&;8ub%w~Z85^PO*>`7)A3zCHNYxEn7RQK3X|SZhSDcVCh z(cq!`@arp-GFUpW!{X%pD*VSY-5Bw;FL9K#Jo)ChIV< z?`dhvX?eVj3p2<=9afSjcwhdK68ZnLOpK$)UwwbP1NrZX%bXpPgquVM2g7p`;{E;FvlZy=llbfyNc4X^=?S1_4h}WxaG#fI|Ya)3)`VG-d z&omnwn}e=W>;zUF9tz6@)_1o5j<`rX*v5xpkYFCL5!b{p)2H3!8HL{aOnC!;{Y{!2 zo^->JzFFya{y~T<0HiLf9jSeTBjR_9W zY>CaOzej|4*^ATV_}KR`2*0YZ`byI?4A@joKKXa7yG-=TYN;k0oxhGo=kn5H!EMh5GnAA;H$5bwlxbL*S@49owj9YMg**qG(f?x z{IqnG@5aNK{v%c>&X91djjb)}!QCMWy!d_*Hoo;kqt)|O>W`JLIygKn`b(C@iQ%<$ z*5M41qyh%ILNVfQ7VQxc9$e<*SUI|%c`ft2qSVO@_;Rl5l}}{`Cc-BKW8QdWf&9}z z-OWP>X#MSl)Q~dja9d}acc4M86E$#4=5&WgzPbOzXY~ayF(v%E)ESq?((MTvvk7}Q zxAL<$Bf`BlmEW}T>+|ft^{q``+@xxJUPhhS@ld3<68~%F(16f(lh3fL;infp5ljcY zinIb;Tn&Quw!{H8_9>Je=Sc+RUEl5L1S6%Qk1TWZdo9{yy0qtti4p0~>_o&5imyZD ztuM zuckIj?5T4{>~-~%9Mi^=;XjJDe8p+AA{3aZi2gOADJJW@;L2Kx7UBjxct|;-tcl6% zI$CG6N)Fjq3-jw>bI#556{b&mu#n{Zku+2KMzHB%HQMvf8nkUue`zz#SLJFsS ztw1gQAMrj?W=TfD1kPS;a6shvO7i4 zNc3=MXozTcwm#8$sv`V6P`0Zkvv17~o+T4dp7QT5y~l}YH(}?IX;#6Jyp`Jq`>5OKs zZhArwD^n@Ooeh2j0q`IS@-0d25wMZ5N=Cxe9gi^;i6U$9-}nc{-yE_WULBPu=6R|y zdwkMUG@Rzr@rm(>J}bZ3c`i&3MGM(cRa$Welr7uxk%b$cNG3t{)GErPV{1H1P|F^K z(ueXFy-gu)fKRuD-diLBP)CjPOpOFZv;;*`iVEv{wtvuv-Tf)2lJ(@%}+M$3}L@4RM4t2CY&8YnQ_O>@01w(LZx|Po$_*kku*# zBqB1!KU(*{`Zo3c+|TDXIx~L|*2UeJNG(^%HNd@jIw-nGGb5vCnO7jovj5uC+?<*D-7-&jdf0t@)Oh9XqUTv|*XA~nABK3` zYi8{UFE#eW$)EoO$K#)zxUNX_53#WJ?H5)1GH#0Q%N*Ls2cR1XM{4KXNk{2Y(UuJR zAQvNZMr!zxD7oP8+ctfwQEJoS5c>{~aV4^GqyprC>$OdBJ|aPrx^&KC-E#&B@{e(8 zIlaC*PzPJSy7wN4Q%;KLYTC(?A}+}>%)61rpG#)unet7HO4ggk4Q~p2&kN#^K)Z&T zPut0RTBdL7BnGOz_$L94vlgst3t5VpHl`@nY9t8xoo} z)e9z#+bHWM`TOK?O4|sQj+0GCSv!r`)oW5a?;^X8W_9(Z>ODg9FlU^HZZZ`XSjG|U4=9O8mv9HO6TWF3{ zt2LvoBO~})P$E>5lCY&Q*Gb!8CrUp<{qgvw$x0>klvw3&^_<+7o@Tp}z9qiz570-T z&dt$HOV6&L5bSuI(7#So6>HBKiR|oYR0<#bGxm>w=gY?r;en@-2Y**Sw^piJ^S&DY z+D0N_Yt8^R`DC`D$)}Km>NgeT{8_6=$G6+^jqkwx?eyl@h*giE_ZZ}$H@jG)xHL)0 z1p1hsJ8#@QU909Csg)(Ggu1-pkh>bTqqU8AjK- zjo7NrkTB;_>l@@XO#;eH{`S?K0l&Gn4P@6T zpk0N4lOIj{m`Z%saf#9AHbflg?^kK`bB|aSTJ$@ug2rqp27Vz7Qv63-J#y`uu2#;K zWizGEc6{bP#bf{QvNB@NhI7Dz*%PNin;!nNJ-2gs%SqToWhLA!GR)-z0p+b&ga3d?vSfJDX5|=U zJ0?t6c}O5SgL}con#<|D#zCZl(>3M~PoF@=uUSDYIsc=Pt-o+~Mna7Dp(?D*S8P2$ z<-eR*68;l;7(;%5ExIkUZwQ0Wq|OI3V_vT?gL~7p-;B7Xvh|IL#wI&>K}*dXp$I!z zv6#71${gpr9}gx`o#5YqDdOLdfnw8qtB37+Nd9y=fhr>;8uzNa`{LQ=PP)Ls4!2F( z1FO%5F{+frX({*&zxG)DzW-0A!`Q(5>Px?TRQ~$gRpLJK0liqHgbT6Fm;y*-$!25& zVsHc+s4`Yp<3p`OPyi_kyoe?2+fd=|E=nri7^m^600!5m^brBPJ??%dulwK;b&`6m zgV#ZU8prfB9EDEv%gc@w=e@GH$Y=rwlh6s?vkOyU9Ui`DD6{1F&(hxkOK$^C7tUjj zg%$oHxZbZek|c$!b2r|2!>1=jVhx+7#44|pK5C9~xhNKsU##wCyG|MI zj+IJnVMLcmRWaj&jUc-`y6`lvJ|6cnrzgdumZAiF-`Ot8b|j)(xoJPyCOIc=#3T3e zg1~VvSMLpB{(1Y#cdnyDap(EJK_H3GnuQ}Cv_nRBwRn1lQjYufOPQ1zPEBA~x`|b6 z!~ixN?c#2>-F$abPp!#UV&)l3K7j?#PrupXE%=BeN;!h&o48(K9a8E#I(ny7|ALd~ zt4VoKJ8vEvdmZfLptsazApV$e-xlTU#`GHkAosm{`Sa^R3j4+@y#Mh@4~cwmCgjWQ zS>uB+<-C&4PDOg5NLcSf8AmcYXaU$Zu8!MzM7Fdh4MW(q_^j@C<{gJ`5qT7b6u#rc z@iaS8qla(s>lSaIHtE!O-5Z0q#tIO+HkqC)VQ%ge~BgM zbwPzq8_NEKimFxXUrV&gKVPo@F4U!k_{(s{C-+Wa(TI7&nB1?uSQxs<{^W08xXJm7 zBoLvOud9`)6z&64aJ>y-I+*V0xZd8(5sO(%Hye#<|5`ap^i6B^5}U z7`-uE)R_vP-bbBz_#k{3uH=Kaj!5pt2QY2hwnJJCWx&6W5N|qlS&xRQ+0u`Vn#-T~;2`E;o|}yay%mAsG~4IgN#o0}22W zq&-h)Zw$4qoYI{9_^&-YDO98>-IwE8j=C9wzSuHI=n{F@{OQ~l{%vQl8n0T0>OI~X z?GjQ(PXVw%w0=?HCvVC~XFLt#fnAVnmsCMk>b*S%!RDgwjgct7h{) zs=2yd|2A>;av(|?f@UWppR+0!Y2bt@+tU@P6pOgRr&pP)*4(F`x!-RX^7e0QMw?y? zE#^-G+r#aV)x)(>zym3R(Kt7Ko7yt7eL_x1!W7oki?57|bN`Xo%_M}}M}4hqZ6VDi2nZX=?lVCSvbsnM>=yfMM_D&x+` z4<>v$<}KuyP?IymEcFo4vnSrDtv>Dscv{YMQ7(c4EY``LbLfyamcT|}ps}b!9%dVy z-LZnRsdYRMh&p?LFOK1La2`1M=wB=NVyQ@{d<|NC;2${SbCzn!!L4iBhn24BY1%Yc zIqnq=j!aR!5KxyNj*6?+Ymx=A*jNAg*|#}ybEWhU#~q&9=IHYV{!Bj|_|;D4TI& z8TTFIl&OfEt~771@CI2|Mqi;`Yc7h6OhQUzK}>@CYa{%_;Dr4($^W%E{SU&%AB{Zo z$K6sP=aE4^Zp;A5t%Mydw?_&n!5BNlSHh7`1eDtSZjLP;Np(hgtW>`gdo>uL(dRB0 zS=-idzDwPwU#1+BRQmUjL73rQH?CHk$8z{C`2+`7;Csj)@Ip5q4X(v+GZh~6yUvKi zY2=wzU-lP~>)=QN|IJ z?PCZNvVz3;U3_HFgXX)lJ}LE+Elfjb`VT3R_YQ^y*^IjI_{tckX-WL7{GA>)^m@g> z-@Nym41GI=N+UmlnhKZh;-x${i0spp((-lzp(ouqzAJ$> z9?;TWakc{zt=IPWJNNlKH}(9HU-r|V<-a`MrKA%&^d-Q@|H`Ubmi;?_#D2xc_1yRP zJdjnD1b92<0cKd_D^9FG6RZHO0u19Rso78l=Hugws}*Gb^Y*us^vj<_-W4B_F?sgs zo@VBv6L>>6mVIY!{Fz!FkoD%!$JmGT7IO_=H21?=@2z}CUx-kVKuyGy|1s3HT)@7d zx;RMXe*fj~g!d~k$ebhJrwx7dL(d2YYJ569t>e$ideEDLj_A%~&kp(L8N<`(WnK|i?#O1-l#_QN>Z-wOTU03ralg;3d!s=s3gRU0 zxiJ*H0yshoKS`uhvh@_{O1fGuXQmc7Z)DRA(PMh&D{Y#A<>3a5L_c0}3RB>Qv$rk1 z*Ty9QR2CPPGK*}rggeeG;pPNrn?*$~D(s1unbcy9C@ziR)9{x+2jW$JZIc-M!Af28@*!R)nj#%p3UDa4WAc#HYgF7 z{Mh4Y2HYN8?Xgd%kn8kDKEVxQu}DWg?5GZ}+=2?d-ib#E3AsW8=aw(auizOm8O`Rnq}%fAx`S7a|}U zi$=+X90w%?JOw|I+_x>LUNeRkCtd{*bOEEkzyIO2TjOrcOtR*#7GN}YcU?QV2OnQd zms{eHK1rXNGRo>(b22|Y53KUqHdudPH1?PzvK?Dd=fp6;43K3yEc#;;sr2>fvWFr` z9)CGiWR4$bVm{K-&y@){(UWnFSpXCQXNvP6eSNk&<)-474y!7&QF1Cz9~}+9{7cWn z(;6w8lZ9Bc^qG3LMN2@ot+}5fuu~lG?53eZq*S@q=y?RBVN8;hv_lkWvf=4h; zt*xX=qkcoEufAd}TrtZ&)1Mhke4Obc>U=fByQ6Q&Slv-Pn?Has!;$Ms{ra1f)Hi8> zKPG3P%m8Hl&CG~b+N9hTrhIezhdZy6&x9tu)$Wx2tMBfDb_EZ(!(t#)9*`GCNA=|Q zefoH7f2*)ol*G-{*Gr^jXG0r90%aNI{I^T{2@)v*BfonWMy9wl*MKUkg)+x?PXZFt zCqowLbP3nAr0t@jVL&<9&wEzhSfh}Gi1gMJ1jLi4QOjGFqSUb!Kn2YSatOH9z`%f; z*tlJi^_0*A*c-$RgaTmlI+vKXrGsYRQ&YT85kS%acB=pohFxS0FvBni2nl_zW!3fd z0U_=EnA=*?ox!v~rnjfybA+p$h7C%|iZa}m+)t1FG73^!2lJw_VM2cGu5>DP_k)lZ z!+#Ql;Dk-!Nu#gsHAs2U$obh6GPZ&2H5R87Mj{_dH$JW!8+Is;mKnJ%Ihyp{>zxSv z3JRIBMF>1`FN#@XMUg2IUtoWauQ`+_)70ZJ*+bBIvX!Fp^KH&CktO+UpIZaUu0$*V6^rNpI3;IT%$Jp^ z@rxP~kGq|leJ*&t6A4~4!T;@q@Cy34(J-LJrLUiB!%hk09X)+BQA+_aF|p}>G@u4I zcpXZKi76*0CeEs3Lf_-ZX=`br6`0F^#>dsU#M2Ha_3-lW9Qdz@iHNLS^t@(I{8?D| zRJpS+;*}aJNmklhI2?Z1)1z9(sRq5?{kgemFDoSUw`rJZt}eKLV1PH>QBg4UsK0u? zXFHq|Ls zeN$FMDP*Q*%Z-o88#yeH zHfn2(>Ef?ga28;zYJ1NY6y>(R%5_sCia8F7yr9+2d4IUlo%GbRc@+quH2h%n(>(M2lAb^rlwo`H3GM&D8Udaka>~*c2?eZ7q7ML zEUt04`5p;$K>9L8Zdu(&)|5iVRv1;Kv__sYAHk#JmscQJ8OY6N{?&OF-Ec0z4<2_k zSk>vMIqW+%mv}A~{0?us#U110+((%IG5HaWYlcO05_0^TYkP0bLX1koG$xpu)VD+p z%e;Ej)KbcO-)NSdJa?5p`xg6J`kE<1`ge(4)rPwWHg;O$IzJzuXwZm_XUvWljL5Bk zGl~OJn?}si=(E3GSy>s-M3RJTU+pPgZl{7OFeCJi-b>S~)nIJ>w-Tpd6n19aiHxDGPU-7J1aV>Skv4^iI+3?qd;4-=U;Fa+d z9FrM56#={9#`OG4`GxVoKO@?}{6$FMU%86t!Nv~-QLRFsGBaDHij}bFMGk1E^2U-~ zCxWH)^snM`v*z!tFn2l0fKJhFiMWT;_d$<~4ORw6Zog3$*VjKixp-42u{@*_L|mG= z5q9`C(Qw$`nEbH}Nk?^vzkk|9`g1_AO3Tcg+wO<}E3wCe5|x28zPkF$md(AoJfdqw zGum1#alocW{psMb3M+{;Js9k5x8RIMHv=ft2^mBS$njbAUtZ~Z1=`r;ZHK&OLQS`F zt8;7`w%j@g2g;hUw?y!4mW=x9f#f%B;5OR2{X=%;X{9SUAxkEs-ws$`c^mm59_vNe?3ukYALgnjvP-e=2* ze!kC=Fz>*qyXf=w?OP4KilYyK1p<%T7D8(qCz}L*Zi^6Ga8Tvt=SyV;j}@xcPvDkL zuq5^j0dlxzycm!SUKft$fn;n}P<6HnAi>m~dds002-`JQSBkG6F;~7RCP^}!%nBNb=Gv_G z_CnX?zIag0hc*D59DVCYv;DEv#Ng~=Fz2*sNqq-$SXMyf%F1|9z@uMNao;&-v+@`a z#$FClhZ{P5|07N(g(A8}{_%Of8kVJ0g`NI_lgy!k+X1LT5e2n`hlgj;;VJ5TVj*CO zf5`6nIKFQU|J~H=xv7r3ZovD$^wJ7&`Q^W1jm&+2}z#ggwEYzMA0=01K4~nBkIp`Q` zryO)$kRH8GA;7f#d8bBuSQ-`XB-767_aD+XbMQ==}rDS zY6+`n-^tXdk6^803Lr5-rHf~oZl4X4wGvL|T~UdjTP;5;b@%ZPiW3W1d~@A%=*H11 z;T#h03jf~|JknzIgv+^r%HCNL&`3FKQ%NeAWJS~0(lP*i;eiF+W z;@m;ahAk^x4Hm1|`waP(6P9xWYTAY-(z%1`qc3nacKf>CDFA`Qz_kjzf4_UOchA^;O0{ z71+_i$QRP|$OP7Mm&hj^0K_!r)nLHKeoBTbpqkLVe=6oVPeb4lb33x>X|nBDSR~1( zI;X2>ynoMAg1YjlbKQk#D0Pp~mxX({^XN(&AGQI=aLg;Ip z?0lr$2_S_n;&s?bxG2<=Cv*!%OIkiLcvvfBMQba4>)*4mmYdFmEMQ&2fAXEut#jM& zk!^(Z;YrB{zFRqNQojzk6|o=mW|w<&OZ!IbGXfi1ej+eRpz|CMp1IQAyvi(S=(QnJ zIKhOcIjEB(d=&JEgKU%Bt#4P<{O=M#r&&#XhQ(cQFD*VquzQ;21DqQ8Xq*~u&Y!mK?g;KOuu`mQ zel5*IEKY!RezQIgO}yJGx>!hL*NQaJ!)FNoM#%v>pV>bqPZ9yQd-?N~I-rwd;GV_9uD3~7E2WT5B}YBl3fwaCi;3spp?9*PsQs$3 zvdpffinuN^Vw#KjcB5=Lh2)e+Ya!V#btjijA_`fyD)}SALP9J@T>u|+*`9JV6HU+U z>FG&!d1hHo<*3LAoOL>gs?1C&p9+^>OI05M?+1Vdg``rg(^T8%&!1^;HFi}(60QAs zsAILNUVkQs4AN%qJi+`ivQT1@nx5_vC}<@n0hIEAf7j&*HUyBEi_4(?oV!#LA+Qnk z_4PU&uc>Cd%UMBVMN~v+C@ z11-A1tgP6e#1{7*)+ECQZqrkpF`*UQr9r>Us`n~qnJ0Wl5I*D;gM7H))Gd8u zh55zm)90&xfYulQgy?C_a5(~bh#1V2GD-VhB`Aup^ISPNI0yq#MFVcVl-}jttpQNP zi88Y|MWXHsX;Gl;k5JuA8?dnt4i5g9_%vxwc70k#0IZZl1DM_Y2Mt75hb%2UecNGF zEq^U@&d;Zd&PQA{e&>XeE>fYb{18erLB!D|pS)K7hDQ{^J%I}e#61K!R3pjHi~$=} z9Wv!$WsW^->T_6Z_s&aacwR{U($c#nx8Hf0Qr7_?=)~+*ki;!;5-IA?Mw1YJ`Fklz z9{a`9_{BdKj1EflV8Mibl}x`a)N6?ovPrja1eJZaFwyuaGS-lztLEfaDy?KqBRV!v zoCI<#P3)5Ba~;vWjf+4`FBNa#K9nB9ppj>=q|ERc%L@rOA`OU4+FH>c?+w?U;Wjj;@_7i^{m0T@Ae^I7tt`w@3e1+J^GBawGT~xj zzI@tr7yMtoe37{o1FF9ynXJ7P(&KUI(^7kNe~D9>RY^K5%F8s+SHW@sC1!|F%IPnR ztOJnG-=*KSx+`g^?JhGlrNu3VK#EskZIjgbSUz3e0JJ-lsX+nnlJeep3($0+2gFzw zXTNUcF_4Yo%1l`@i&QxQ-3}nxYm=Vt(s$rVugaLCj8a}+o`-sO{u;WlpAYoa0h8s; zFIjh&&?O6>eo{YeM~5&NBo(7KDHSE$JX*+msjwWzYf|%!qZvyhe1A1UnniWgHku1GlSpjztLbgMcLkjl7*eHA+@dVhw7z78!UoAN0)4N2(f zd?T2nzrU?n`#PS3g@wfo%3`b0p2;;%2kxrZp>3i3${Go9{7qbeCl9ggE>Ctf0Eg6S zhPstBu*sMwTi*#zj@2Ws0E_jMoI}CQRhT?kFY*#M?T$Nh#vG0KJ&{SkU)Y&M=!e<* zTswF<0h&+Yc7q8Z>A{l9n~uj#8r^Sb%rR^H2}gRm-Bn;Vx38`bB0U~=HTRhNp{#U1 z#6SJOvCl!B;@5Am{sfx-3zMJny;X#mV5Brxq`07Kbov6E=Mgs>gPYb*c(dOj;GU1) zR=ub+^+HJP`yJ|s9P?e~Q9!?WRaA$>6?s-ys}EGi2UFB{?W}^x{glbkgWrlAqp+mU zRR_ww;+|sgOzPOQKWTmYzjw8JO&rY-3YUP<(3MbnX({pK>xNc=RFZ4Ns?J zs^s`Xz)z}zE>Ds>RG8-SILdHb3Jz_>`~U@nv{ZP&-hixr_l-zjf&m!FoXS$yQ<)nI z_NMZ)?oQN5HEvS>oXUm?D5ZC0t*R(D&}j>3&~JFgkNFLNb2UDm zc!~d>)cH9RDsAzsgbnC^}^_rnHvpT>RTSmxMXgnc^$uR zS?3})vArynqm@c)MzYaQN%+NYk_RZAnj9FEXd>Ll6!#l0ODBRN&o2x{jE>t)s*y#H zV8#faykjnwL#}ko$=u!K_5db}p*%c37A-=#bB=ObCUj_@YW~QoUcNA5quxPm5dZ}= zisQVVREIm?3yQd|G@XU1y`&{UI^U98BwVVeRHYt;zl@8B2SrQ+b(}I%-{ciLk4Eb- zlLuLTm{VJ*BA`!=BmJ{DB67GCNP1R?+1U(^7GL+AgW5Pv9ty`z)6H=H2XhMCr#5p% z)o)g^Qe5iSlJmgOSDd5e1%S_BOWZ(v2sdkQ7V)eoY}YBsDN+riYI1N@m2HR(%W0Ex zN5{3x*)9vDJ$m`X9^s}R8Cy2>buGA)V$r|jU}U0t2A7qA$8g%+HtarW5#Gz%~RAWK;<8E=cfuWS_x87wua ztzq3s?6K;S-JhMEwc|IJHZZWA{&KL4OI;iVn&bVF3(_4)lUjCvF` zQKUjzvkw(D_15G96<~sHJXk>U+qf+^-Swn)jIn|g!z>HO;8Np%7_7pm&%8uc@G`Gh zsULFe^leqxYy6A=-lpB^+y22l6KC!%YOQSRu@MV(cW_bOd~*Ka_*b9N?=T_gZFgb_ zZNO0v;c~k4A~kT_1IOK-LJ;$aX5$MxEj9Sl%65qJ+y?uR`$Vb&sex|D=Uur@loP*M0*j_&1FoKMQ1I02MmGl|Q`*kL%+e_HD&5Hrl?wzBf8 z<%ZPYield^Cu>F#ozt>Bm}P8V<1##EV~XWg0W5pmMdbIR*a{FC($jOy8oecklPXCQ zLl88zK-w(S>-Df4Rl|D69Ur~>{SEfV7u59hCwjZHDy%O{g&PkX2-pC03t)a!{~H1V z0tt{ICv~j9k{T5ZDYH*3YXFF%TE9kXNWv)r<-I=F=w;3XAp)BR#C4yk5B+^Ya;pZd zXepUFuiZ-gm`;+lihnK`_JrVjQI7@iXKQEO)w^20hPD^~DL1>U58gh#{j8Dsc3^<3 zcgxwx3Z%0k!E^`|?Mx?Ab4@*T{DJ`WcWCe3ddoT{zNp<>^PuZz5_bi0bSCAL&_4UZPjSq zu*63kSj{S(+6;sm&l_gT~DUJ;}a5UR}FpZIksj5*b#6RYx_Ez0xc2m zg+ckB#0uhOsPiY6PA~1d;^_MA{NG(gcUU+f2Qzs{B0aB!UM%Y`ZImt`yS%U4M{@<` zP-6LwY1Z^Q_0KDD!}6@NG!yY1qnxWdDXobEtQe9eCJ4iDB)jU7rW!3z;wr;DppMTj z2HC@tQGr1+4!;~rNzrjm<4lRLoQl)1?)#Z9M}&bBALx!e1H?%~GV2hj>FF+u@*3?M z#T=BU8D&|^FoAC2x8K5v)>EjSGCOBk%YGQen3YVK;>58r0UH#T$0)f6=wt5)$@`l+@vSCDeDnTiM*M?HGtPbM zzzG2E4!U`p%Q-*3<;MHYj2?s-_F~N%c~KjVYG<;gPiP`@f53!%3Pt*)wyT#8@ESLp zKe{gG!)ZH0@4v%;VSSYjxc}Yu1EL!^HWmd4)mcD8yp(m@!NId_g(!LMO`M`4|GYop zcB^k0i5T-+md3oy>O{?fx*h2{xV z03RP6gtJp8QR8D5(&%t&5yvWpV|nnUY}@^fw?P#hh%Kl`MBQqze{AqIgLU2$xcH6N zD*khPEVzMDo$c}2dTW4Jjn4Wg1)!XG>#CSGaRG+9$( zrQ?>dX^#{dxuj+WKXL7jth^ExhpXd)uCBtxdikF>JB|-I-dvOt`TpQ8+1bw5oCu1( zzWlSW#80oCjFq8Z^F%IvkVXonqz~eU=}8i5_NAs2nl=Y!I`k#eC!RYzkBQLA@C{7> z->`#CuPw)Gmjm$|y3QuMWNUVEo?08xZ;uYZ7WO%elDia!D*$}SKu@3bzVR18+}buJ zcR9~ydlf3^G_@K4Xg2i8j_WNT(8@_m_e;C;F&u1B^;AeB)JCu%fm{uSYs8P2*-s2iHVor}} zL2opXa_r@g=CnjcNH0o!_`?VQ_c$#<2%_NN((fnYIXCggUCwVj)Abdva*8?P4h^!>-P2ljtB_x6gf269V_FaG|4Ys2#X z<7e17pLtFT6;~cW*4qCeox0pyv`h!EkSzd_fu8El22?ZTsiljn@Q@nH2iWS2xEQ80su+lBSvxX|5)e=~R*!hQFI=x>yjc1`%cxx1O|g(ngo=&lNwx%Bs0Yv_PJlE)WC3k zY{SaYkRNVLx}V`V0W1g2=S=~?nGm4JbQRihIWrP%L~_Cmy4qvgAe5h4 z++re?_Fu9}xNAL}>jLy3ot>t2qj3^2|C$|YJ!C2WH9Yx|U}7SRiG*Rz*C0=jQ4ue{ zb~RfxhMm#6j#nzO@dUGB)jSvnldvvX>{E01OXw7cX?3t@xC)X6V=*wBoXVd{a2A_! z_cP=>>VuncMM~N5-%t@}N*|NSTurhEV=@!geFGqf07bM{b&V;vVxhkN-1d0Tj2i0H zTR|zJHy>2MyS}=rKO#KgleY8V-Ei+dqw4S*C~bZM>!U|gKzCpl__fXy;$uAQr6mOD z1Oc6!nfjM4=9Q^O%(DRM^jV|$b zQ#wRXF;SPUpWH>&4-Uu>Ha52L6b@;Vdq$K}Obv_Xvs4Y-Ac3W|xGL`m-1V2F4-66N z%Z@9ySnY@mfeO(?7YtVxU4VT*FaV5*iF_68L*% zvu(5>IHKUz2bzO-Yx5A3(D!rnMDzY%DB;a@N~tDqx4}Fr4IMYtE9G)Yt#hqJ9;+~y zWOm=Fj1Yj**60r|O~(f7d68p_i$4w;012RMrVB#+K{gx8TUcB=YPl6YZK0(tIhzqY z78mymbSdMnsu4k-zx#C{RYS>+$A9g6)eYTl`;8+<(>HI>+2vE}>L?m{oH#Z_Ow?T; zIdD&`o&AkB$-d{7gfZ;gG5H~Ecy&f=BT^YD67Qfs*aI6AGgo$WrFmKGv?wuNdVMVy zWOi^HST9&wBjIPeV4uum@!LNqDyq8)8?yJkbQ1V<1W3Z;8-1`7=>&NG+Jwq^s8rPr zxCeJ9F}S4bRSyg3RjoKQ4tZtj7LKyV1KG=)eY#MP3SXB$ZzHN&)`V{vuP7C8s6jV}D`kqch)?LB# z4KsgRvVL@;n4!w%Przd9Yz85tuXqnL|-5AZTXZT~7kQvG!a6Awi^KqOIT)L$Z7Wef=|! z2qk7w@q1tJ-40GklOP!GZN(A7)*DIe+*-?d{%K$5TJ5cjT&9$N=@x1NZ3fb*8Wvv+ zej?dG)>t49g!e#H^TlROtRix(EZw$STB|*BJn+VuLH2ZRiGTS$c9Rll^?HaET_jTc zJLP>fWRKcjSEqO|v!JdLz5058;b?ZLrNfG-Dv*U9xQpQeOf(h@t^`ELrLm1K@5Omc zZ&mL^qnj%TaTt(TN{P9dNn9l~TA8S32U=TOsZKsfoqSZGE?`x?^!L&rLTwEOFb$aj zM?Z^*v`0Pd?tD|awzjs1m{`IVMNrdKU*^>xmTUfCPk40T=C3t!msF4#+V~JIG;#=# z;SW#LsndQ|5p?3g1x7qN-7`|?E3c#oclZHY8ym|9x5`bZ|)rTq*UQ2r)A;b}}!FSAPj5Ld=!QVe1-V{DMe9MdhG_~9+PpYnsvu1IX}xg(T5k?&iH?r4wk zk>iQ}avX-aHgieT^B^Nz$(&iPz20P71!W4`NP*>)QpNfQbpP!I_|m=2UOVSabJBtb z2&6a)Q8Y+EvD8m$7=y_RlMMYMO}NY;fjT&uF?1r`n1~oCYaGq)e^Pz?o*H3;-{c#7 zOcG&wfA@K^HErIg~EM{wVNQ*%@*o<0A54nDb}eN7y46F%4Rx<|HS z+&@^qMQ{|7By1Fa97mg)yAyeNu5Y+&$!(AUeu2}M0LT(y&!2DPY3O`I+|?3#;M~;r zsPM6gOEEDvREIY`weeclSP3xfC{z>d0D|oVu)XNuo~aE#aXC3S5{XnzU zBgL?nWWJgU-(TsHyLHtEIV)664b&-)uXrW9nr^rOxB5#A&p8iDPb-p^qTefGghrIX zc8X(&QAlwAbcR_bxlgH@l$4g$etsAI3|2f&vIx-T$wm^HxAsObmG+JnZRi!f;zoo( zh`(sgFUCd9hXNMmOCc>fm5`GIlQ3cMSW2>?`%f)_`XC3%BcPZHLD*@J!?zQ z&rtCFoZit%C5L4cc2;eG+0nUwUmC~R`Djb!MG)E9_$A{3#_#tX*5=lfWm7ikd?vws z64_iP#WiLuGp?&L`0-yxjenaGJHGU?!zo9;D-}&Y!|1#R45XAk%vMb3R>98w z(?sADW8NMd81Q1n1a3v@3Z{}JSY<}E{d0S2gFS&2(cS%U+kmd;4hGH={oS^|$w~$e zFQ4qqR0GJtRudmd?nKN+abOvLAQQpt`DF1BD^nIxR9I z`URI6t~O#{p{Xz<@pRY0ZM|Q|f2aKa5%tw^RdzwQ2T4IB1?f^zQl(p3P(mqb73q|2 zFlYf$0qGKHkd{VJ8V=oEhwjch=l#BWFMs(v!g=9}` z^J5v7i#OWz4i1$Tk-cT2Da+A26eV{y0a2(p>@dZTQcR;24y?d> z<$rbqukvZs%_hn%F#?TIZg>l)Kbw56&ZqAU8aiZYEbiXc^qkzCgN$%hat{wLYl_d##~2C+FpoZwGSCc0=dvU*Hj=dhs_e06 zC4tyO8NbdG%iywK)03UZw=s9eP(>?_dFPtUU+tXUuB^vms|ShxEtu_SfpV&VV|KQ% zcUYj@QIH(DGj&fGx?N3M#D4+2e+4~)kQCn!%3+l}4~mnF(b?#++mC^-Ns5o3Uq5>O z0!!;jHBVhX!Ie#_I4vO|ElL%~7`eeb&ix${*Ui7ObiVwBZ9Zat1vTLbt97*%*GuR1 zI7Ks7W;Dj=(Ju{ny8jw;q@p#c^`lqvaE@)vn5dr(oAW9)Vn81SPGU&0p(VC&-h8a6 zpbLxs6w! z+U9LhL=|(juUcgcdTduBPmOGS>oJotl+3Ou48J1J@`IDY8K_Hf}fE+L^JG_O7iTQC= z4ABLGdUP)KCOy4L>zgkC7R3`b^s=4E^3`$phSeWx; z7P2|psa^9%PYzZORL;A;OC0!LjSoXO`rlyh;tsCX6s{6}D=?ZbGKwO)^%FDv>MziF_-{vi9n?{MCleyB!=H9C&$@cv$ySuo13c0_#-Xi2Yc=M2srk zB257g`#@a03o=v`cYw}s@k(vkw}$=ek~ZU)a|<0sW1^n0KGw@GP2)Gn3FTHSfS9LS zUo%%QDZl1Gyv(GttOzys3>T^JsyWs*Tozt>?5hGbE$#T-qK$?IsdkiKcDB@*9W%b_ zHwbt3CYK$lacL30w-iP>iW1{0g{~mn8Kjrc!NtGV4=5nTP`Z15En;YSs*jI!v;Uo= z%4-7A}*ghu@K-CwmewH&lsb)O5CE8{FW{|9fczNmi&hxVpbw*x5J zF_~A5A5vMQ|3N=~_0&@w1VJ|i(Ir{F{E)d+fLt)JU?ype)>Rhj7O`>(HqJBnLD8W( zX(yXq>Ou8nkxqGXn?mK+RwV*XGHm?oG3$+U4Shste#y+om}@!Gr5(s`kdV~4?%60x zlwAdF9qs=|e|S@7L2^6bf*)`@-*GHT<3`kvk-gTFMj#Aoydj1{8%MNR1`$ig@}Vkl z^dO5I-t2dR0dRlf3LSr7;G>|tPUgHHMQP{{{5YnI_h*>*Y30F!x&(dK8F@NNiv&`q z{YmcVnxuyirQw2qkph0Up~1VS)$Gn!l9OCOzxp+}#CiY9fBz1|Bt$&=a%+bA3Svt% zMK$xg&1y*p#OZW7;X@ih(Uh*+@9XDo-C4Oddhh7(JpJk+IC`IklZJvnRG7XY+HlsY z9M9LK_{fBBuiOj@`NJVYza$COCqX~t=Iw=2a41trJV7Zq8rjfe!>cqF!a|5(49;Io z8;0`GauPf&+Gw}R{I98Z>5k9zzq+R5Rm))|yvv+lb!_8g9o)=#CnACO4%b)y=8Ix$ z2fm1*piJSx#lr_OlUZsiuYO4)8L2}v?t<$rgvX>N^(e@&Kq6!6W7;(YqdQ>_uQja) z5n@{NT1>gusk6Mr;=SPB2(#+^$JJzp$Ke_5YG%5je_8Cs7or3zJYPLDAa^D0x`q(_ z$h0%cv@*)MOwANmlSJ=xL?{|p1DvA!740Zl)~FxmI*si)*@_i<%1ev)NrPOSFZqkZ z5r~>lB&v}Q3(@@*yc{(ZmAMcbcXazRwn&Rp)cWtgy41%w5(imT+~x+|B&7ligE1vz zwOf|>_ex;nx<q(4$e;y{ftGmC@@rh{IXklo$P8T;H@>4yq=$lD7nS4l z1HM{igK2Bi+^KLD24DL6&ALP>K=fYhU7O!CEj7CMFk!#kfNHbghnBnxDKUX!JfM?1 zKKB+_XJs0RQO@WYzk=SMbi~@+F;DH+#1OvGfaS=+8U*D}ZQ#v^p&fV*HY*A%L2b;^ zYNGa+45rHl+EX-dofc#yE6ErXJ3jy4=iuPt`YES?&MQ{n2GkgQY5k%4%DD&c55ID~ ztgQ_CQH-91t#2Oo2T5%LcDPme!m9W&rz$hEQXfAAMy2|*#&d^ZCUX+$i$8R7O4o&> z-xIvUePla#2)^3Dg8?jWfoo@;eOH)8QfFpFKz?a`JNQaP|UdKeMuqbj?r;Ff*TD zeV+&UN7mI*7NYY9Q~-XB>qkrt<^BLPs=IX8Y7x4#RX}0dMVp?{w<%Rgu*I7ypp%`g zsT7?@nT6UjH5W+jk)(EPZ_Is`cM>*rQ77|$Ari%+9W^10L0S1R@FzJY!aYRwZi)7rnx}XA4*r{5UI^vx7E9dn;v&_o~*&l7S>h>|o4IjkT55H{UTDm#pP;1bh!;^K17xFti;c~7k{Sd8$)qEfoKT`P zOE=|&bVbeUp>8q4{%?MFJ zXY1uxPT-~B!0R24ynqfCbTx5Z@j}5EI0iL6q_Hno zDh&p!C3#nXq1Yr#n05|^_6p>A-&^0fb6F@o`&KrThmkx4y^v^Rhh%x_5%rd6HG$3P z)Aa~f3D2#6T`lD%X6p`nDmAu12OwTHU5#iS-72^Nk5Ft5o2;QsBdBfz>6F=rklDAk zp&gd!WWvb$DJxpSn$JGE)EH_O>wi}i@i*TAS7r!83EF#Wh!PxT9g!zhBAvnA6hYBd zC`sJ%rm?dE@pH90iN){7nn2!)WQkyu?U1^Mu> zM_lD$%nwl03yX<$W@KczF-Ht{KPjr6P-2s@)0<6DJ`XA+@DV1Pvr%bLtz zQ0p3;=hd0vzIZ6)yk~QbZHogs2BFV?Zw<(w+L(7@C3&y>q6yq!NcAKXDp096H8mAt zra};BMB<27=J%bQo#Cv>BL3PvaW@5O48nz4z^eHm@BxL`(>v0^scT6wF*E-awRqQk z?lkdhvni>f@}EOPljfw2NgHQP{KVaZAyV{sNVq&ZGe#(XGe$YNk|<8wj~DaJ#C@gs68A*ZQ-{;#ieWUKexHVG<_CL`s*n4wG^^k$t3=o5=Cf!LVKzJf5Lp2}V=BtzI?K>qnicf$k^ z=L4M^Lk2p;xQ635gj}#s{0`j}v>`km^_|+ZJ#Hs0(38)Fs-!CC_3YCMkZ-HpBF((S z&1P2U{odl9O7dDc*<7culm3iSg3p9k)Y*Z78%rLJBNNUZ=TNj^ow~lT468wmL*P z>dh|nsn&3BE7Q5=ex`;#h=j@}#fN?E8HpAabc?+{Xz~vOTkOFfD~;y^Qc=dps-u~i znIO$o9jd8(R?;BCiA40opbw(U=45A_(jf*SP$3Yl;t8^bN(nSoInlqsm!RC&-%k#! z&@e=<)ORrZ7{j@Qv@{*vAuK3tNdMcd)(E`ui7FQ~GcXjtDMuEjDKab%;llbwZrGFR z;*)bRl7^;e&)|}dinCl9~Te%B;^dK2aH8_bd=Ec#C4jyRl1^K zzCa)e#Tiu*i7Wll-@!(@*1E7igr-`sh0|b5b0)1OWPcrpQ;wXp8%X~~WSaBdW$`y_ z?T*n-&G~*mWi1x^@F*DoJ90SOQ{@3x5SLK+Q8=RlDHK;*?8j-u(F_-AswwL6zDs`d zumXAYSmQUJ2F0D9Q||^=V13=+{ z@Uu$B{}k}dpv+eKN8~4U^qO4V*v{_rA`0a*r*4EL*f9U+xdRCFRgFx zer?^7iun>+#K8c)?Z)mxVoP1asbpItr_`V3-`k)e%G!@F>gt|kWp?39)jGyg*j|V- z{N6=U$$%}T=BAICIPKt`tjp5ZT37bjpV>7Gchu>&6lmf2+A8SIhL)K;IR*B^+L?Lw zZ#~Cud@Yl}ol&Td=T6-~*x^Pz{#XXNK^P=m%^>wx4-liFg`Xe(Ok=Rh`sJ@eQ^YZM zv2FWx^=@zAOX2GVgP-;~B{;+O0?8soX?GN!kBR(1XOxtbm4#2RWAj&k+->ugebxeY z9NNTwy=Bf!j{hv@khrNLQ8`1tZ+Y)`AE7C_GTM35;X|#nRsW%GL59_tZ?j6q*;G<> z%PB3qA2;I;0&(N!m4bxLp5+2tr2aX@HIAiw(A)|tt3Rs=#3uX}+TfMD)w#FlsB7B- zwL9VpU-$zc*tmJq?C!cuA1@?BZYlLahXRL;G&T%G*L~>O2Mrra(^wq2qS+0e1n!ty zqCxvzh2D3M7*!A5zW}i5E1A87ju8XA)@oHE&1kM_BanI83s{ez^? z`QG|n?o!sN@8 z9z<;tTl5pcWDHRiiOvn~M2Q(wdAnE)1aqp-#XR43l7x`H!&J^cx0{XP$rRk5l~$QR zo@7}R`dg1n*nRIVkFc;#6hW?t%SJa)8ZTeHlKe(Q_l2v&L7QZdYW*C6pn;kn66RF< z@*FFon(#Gm<%v2Ui48i*fx_oqb@C(A?yiuj9o{_LgwHRri^W}pK8U7oMp$2#S)9(; zeJ^~?C8{7T`jksgWVic^n2Hoj_?Zc9(Uz5Mg6$A`j8Yy2hVcOPky z=UtJ1awI)GMCgR0)UvvQ z;tGz z61r;6AD(g^7uvbIpTx(Uw)=l(IX&DgSZ2U*$p5OWk)0>-%>gy0e8}^(og$$C=&ghU zsuW!HSvare<#$Q{HM zkIQ{IJ=($|@S1xI;zdqDL3kLg(DPk^{q^4@yNRuDme1yf~-KUFy-yANYRm zEl~si^VGw`qjNA~YI91r^;c~!lYttFYt&iTGuxg?k84-r1Mz7ftV4e-?yA7uPTaqx z9j*h{LNuP7oLO%?+bC30Ni9mDx4G*ipj|h0saF%JWogL{#OQ;8$v7ObHwd;27^rf* z;2%e4XZzBF2~Z51!x%bX+G5;KB5>PsMg!8y%gTDuALzuzN>@f@{v{sOQ(ExG>UXI$t} zxCpMrop?Jz+DdLgL@*r#9UYz1>G|o&3A(}QQw|EU^nsadzmga7rTcgL`*eQ|x{IV- zv&f)*5taV#-8&QoCFMPekf5BL91TNm?>e8&TCYc)l?|BokCTH!N5t(qMt~mj7FOr%@ZftZ^kt;f+1cwk1=txLf?SYbt z%BqE?cU|3vPp(6S9@?39banNP6q{Q6kfFDlmzUS4sm+46ok22c7e~i_brsfclIxKl z`q>L~x>&H^2dTktus9!Y6Rp3QJM0yH+TSJ7y}!TzOkN&WEo^!$+sM~gdu4T%rEbbF z@|6Ls;QCZuQlUHc=A_q3>={vq^~bS#gpoog=c*}F%l)?h`y+kT!s}8 zo0;|R?p#TtX`?zCc^?qww+3))v?!jy68SN=HRE9IZ3F;=Zw`0PO+lbBfMMKraBk17)_NKUXi zGXR92U2r)%HrBdPQz9ZPY-VN_2)}iQ$74a;>)O1(+w-b&hrlVAMtJM8cvR7!HUUej zbFN~T@>3HgxC96m#GumVQnb0X0ktxp3|?e8f{ zX{SlV^d_FP>oFrGE=3oMvM{0R0;?0fO2#kZ_d7~QL1e7o8v}^OUgzfw4r-3Vn>)<@ zz4{XlphZd->;MfUE1dts!P(EY-z2T0rCnSE(B}i_(x)yihxe)och}G+>S*iLSdvz^ zGX2WZl4?z*B^cQK!$YlqrN79169nJBhbc{(aa&|_yY`FY2}GUfGes+8|JQlFwz&A~ z*U@TypL%1No|9L(Qfp~n!E`*ZN_u_2{93HA3z_>ohI&R-gRG(tEipsxROT0+urQj5 zGD`CRj}k6_94PrJTPld^#VU1PVJ0%JJRrt$Ki?m6BAgL?JBuY{5NTZf>(`^*-CgwA zz|_1J4F!&9@DLAMp0;N!%n;-vof!)U2hQNUGH;`Lz!|XdQO>}@`CeOF8!J|(inFhA zJtQQgVV++YR-JLxQmHr>4TC0(4bOW&Nt8CPF_1&!7|LSr`HE+YRP zmTRQolc-g(x}CpOdQS*BU#B#!tgv+=k?8n4?X|IX)L5}8(qUkynfg;)LPGir4wKbi zKPfN+AbqW)qa$2VQo?K1B}|WWk8~B_% z={ppFi^kcViSbA)EGpVrY7!lSV%NkPXbd8MJz!4V(sDJhWMaln75DBjI3{U;Ik+c{2C%2Wo+4RP>Opq_oCQDLEnEWo0N#) z7KsqT@0NLvq)ZKP&}!3T49TF#Yl?h;F+J1ime;k4gJ}D~Z@6h)m(t7dvak5^J?*x{ z>+cj%_?$PNxutF(?_j$fQsyTQU<`k@+ZE;Xq9y*fPxEt1NYj0rV7Z2PTCxU~c%U>{ z7S5f!&VV3ajSD&oUQ7LRouNUTKyry_HF$%MX8vm7r88*&t*_U3$EPISS%HK4Vm8NO z=4nf_ab-g}UtA{}C#OiLb#+pjfJ%#JzUVJ`Nkiy-%s7bc#vI9>%YNWJJIbj;bJFvR zI8N>}?n_Joo;g&$p*K_V!LjB+CJ)Ph-?fn;hy(9lRd-rd*SBA}v9Y1{V(-VnGM#dJ z5l28TTDFkGH@w{VSTa#)w^^I2|Aq%LbkN@$ZEqWFOq!6K@Qp9!Zkq0^YV*w`l22Qk zB*_^|>yu%<1MlN>zP-7zK`(iAP`swmT%U{5n-Sf@w4HBw9n+j(CwD_bYo%sD@-wcg z&~snbDI1fUT0w4GKMu`gd~vs0Ag4J|;UK@es>eln=V<}ilP6D5s`&8ts+`noM=9T< zIExqyo=ei*aPu*OA&FM=?-`K7J`P!n@Fr>3{%cj^w>4f`G%&Te5n) z)x2>=TS!Wf=iqqwCo9P`#{73!M!qR+IFtbP(h#flD=XO%LffjoFus=+I3hm310*LO zn7|fEz2;G#?P9onPEcqLd(XJc^B8-(xWn~A$iI!pbMV_PLl)5?f3Zqm{?wTVj8tgv zpuqzTBvbcR8i59cB4>o}eUblXgWj?+^l_xA@kZ!ZoCLG_s~tS#QFA~FiZg%c%X5k+9XXY5w-IZ@O1`2{wr zaMp}22G+^zRlppu8R)m9mT-i(yw92DW7jrb6FZTka#>4{<93NE2&Ocg=+1F@NC zx81`ph7lK`nm?X1R3?bqvLNY;oBReCjE(V%wAE5@T~{LfirWGtm6=m*OK?DJ$SyH?W~ktCNcPt{Olg3mD&Rq?mxZ_?#OK1hk=xs!0O zObFMknQW8U459i9APE3CCij`;TXmC50@a>E3cf~xG>7SSgb-0h7 z=%;FYKCaf1iFDFcv!}#EHY_cesxyC12rDn%K04F;eRTIe`+zW20%yhZ6#6TozOxYM zY)G{2PZHR^eH+o#+$`&7@aY{a-CKAy$a#I&d9lYr5t7h1ru#Jz4NuLi;3=vP2nQ~( zhkyCVxS3fCQB>bIN*X<2!gjlGvS5Jy5iH_yz`@DM zx$JITbJ(D(qm$|~=_b!XVFjP{=-SrYUg0#VLZ6@-W=@i4rlza`10m=I|3Yms^W@j7 z%fQ{nSN`U&TF*2rI`OXTZ_LeD{w>ulA*Ckq8|GG?{fvFofNGG{xe#O&e^K{r&rL^~ zzj*O)AG-@fczI1AT%!>PzIvk3EU25n*3(l@V+8C-z@+!-dN$!sR8*8Bw>$Ip={Yjx zA3XHYZNC0CO7oR*rLd!`{^ldE?Nm(mr+FyGTMb$BCw`WuT=K%^olZgeg*b}QOfRoH z$s4SeYrHe4kglOqsc!db74kJ;Kw#e_Gy%Z6 ze2hveSmg&U+DCcS5_X_;T3Xud+M1OgU zYd$a%tqj5;F+ZO3y=&qzeM7D5k;FV@{iC-gSUdpRvJQ_su_U|2B=jHMklaDfx1Tg9* z*h~QcN=-+{w=eaps_OLH)F#8*3cV;VB1vL1=u!wnW{;)11vXyTejcx}h~ql?s)=8I zu|(T}C0K6G*EfPCq6sf4tf5iFo!l;hm)w3=MDy}8^!I&=Dp8u3y<6pPhYO-|_NiMMVrm2k#6t9>P+KY*riT zsAm6#QOV0U8$`D|rIeON?p;&Shee8vys>;l%&lLkK4^b6pz#_-F^maOl@&*zishE~bdpz|ibswxS$0|UiRi|a^j z&qoYnTs`tpPK*97G;HO@>_W2zj4dCsx6LD%N-T8VO=#uF`r_`JfYG0HLnQ?3n=#h+ zDHCIzOn)F!?t;@e)OXlai0`hUev8KqN&4Y0zr8*BB11Bm>D2lWUBw*4j0#P>v~7LQ*9Cj z&_^Ef&%)W&8r%fbU?(*O|AT?5auUxPXA$kRiAf}Czm>Y^9<|OON_yQ`^F5c!N*aG_ zgMhMqayS1ufu5*8f@tOY0Fwc5e;}T}k7wNBbg-rk?e_AA8*Z6cT3e@|pC0l6yCJ!N zMuQsWQY4~({V#`r(Tpolz8+#(PB=Lk%|qHvX&Pu*Zf3nCab4mpA8#jl#~u^r>Sqf{ z$2Y+fsvCKYxhONY4NVk6DA6@q(i-!d7CLI)-+$m;$Kdx22T;Ra2M_W-RB7d{RP4ZX zwQe4wjWF>Z`nh~kDxxu`1kvWVd6~tp?PQy4=Z z)0|qvlk^xbT;Ho7;G8<0a!xDzvvY7;?+4IUslUC`=1DlB3XQ*|-Bv7PtjAkT}Y&l`tl>lKcWeuFcNr1rUKq}@Ll?O4O`b}0!jK8gNYwQ z99d|lBUyeGOMeGQ%Q)5BOA3`Rs~dT@{T?PHBv5v*<_oWQzzG2BgyiJn!fC6y36w80 zSfK2*G@~ED3lfi`r;JlNP-{ibYn?yuqyIlxkF0730H6YiJ4RN&qjlu!!lyCX?g-SY zIh1J5DVFAeyS8?M9yy~pEg2?D#^B^j%gVkq&Ik^Sjtcko^hk0=6ErgBj6=wumz&!? zJIf4M1T|tgl=d*JkQ7-5vLP;~o#eB(?qkTz18=xYV`ahMWgY4%FTN=Q$> zT7Aw~D4T3UQLWaM9G733x}OD1nSPJT%e1>cfD%CVjizq~5|R6NQ%l(Im$UKcnyr#; z+Uo+khA)D5qT)-&Q#8^k`^<8I4@T!>o33|pKvysh1NV7lmBi_038}jV@J%TVe|TLU z&Y{E?7!K-<0v~5pnWn6(zp09CR&?Uj*rnw|O8cUh7=AP#sfZE=AGY)fA9Z~~#Z0Iu z{P@{b5W#Z6x)g!yKhgOqsmkrx&$o=F`z%f0I;5|U4T7fs{?b>2cy<{G<*>VdFAPJ= zFLV;wqqetux39hzy}x2(ayD){f>7!Ax}`Jru%xVa9sJvWKlM_0+m1Rk?jo!$JnR&A zQEerosS!>3)+OhxJ{`PH-h`2avGX{ti}aCA3_No}grQ@t$K=hTaEn13&i{NvJL6xT zWXI2@0b9yQBcgI(DOyPwATrLrnpAxUKPjF+?@&M8W1%(ae?lVoBQ|WNM9DVE#1Uz$ zb`j6AVP`D2ah5X_M1^ z!p*jX{?T*qf3I9ehvQch$TzvqSlDRrzu>ycjB3U66_IjMc~b=-q0Exs(ZQ|QpO!e#TvoSJ(2@)0jdk1#QrcoYETs7g5lamimKB!q8Rgm=a z&sRD@Txq~xPo^X|yI0%vsW~#SulsibEgB&}PBq|b>%1TdbV{ee^OGXGdjnBlL5yn9 z;m``3yBqO1PzK%W5N@@~B%@tLM1d{(`fFw~BC01Xqa&R78-2MrG=PGbc=r|4!S2^g z>(4OPGHqg`!TZ&HeY!}q0#Qz}Lwcj6pL8APT-`bvixE@B{1Qt?qBcrvx{uA)~zfz=nZFc+ztWJWhTj)V>8++x{wuR}+#O)p)S;nn{21&6hUM$`QeRmiin4BD&nP?$gS^i~hxZAPyCP7ecGN^; z8whGTY{LJ(I7%{5>yA=_$`_UkiwH*Krw%vIUDSwDZ zsJuoos;tl5l+x906DyG>#)2L3T9jVm6B_ru6o4uP!7!Gvxy;E$Yv~#=f{k{g_7pb! zExK0|DE^h|j^vqe+N7Y~?p~>u7bq%BB8#|N_Nlfdxydq`d|E+l3%}FD^dGTKjl)c& zd%V+i)poMYSwS47A~NA{d1exvMoSDt{dL#G3^U%?Dg>r1eB@A-YJf;SVfxGNf?@ih zTE*}zeD>VWFw51CZn2KNMBgor_*6*jXfNvMh{#a=!N;4~ot1VGHvdDY(Ue8=w6O0} zGaEU~v@*#1YB9jX+utHJ@7tl4B!<*58FIG@M1VKa4Lkdmc|rZqn4)TSB^_d=$fn&h zu5@eqa1@&&?*0|T0AZs!=N5pGQ1cbfqL$+RYvHAazN{6e#kcZ4D$nl;e$@HJrT1fu z0axY=w(CFjMm^VxaF+THuYraPZ_>JLhcKSK)$+w2jXOv-oyjBFw)(UAL`x*=F@kvij2>&{MnlM{w7enfV^#d715 z!r%Hq@2c1;TZ;4pJ5&OiJMthI@^GrKxqPiYzYQAOYNk7+SKmSp`FX+Xkp!yg0(oZb zj40=-(*Y~Yeu6GP!~iZ+qTkMkYQ=oz9OtSsFJNCjG8W*7e#UkU4||n9SJ}O7)9cI^ zzU*erb49fK-WU(}=J1T0x4dvde(>h!r*{N6F8;iwrMPz`Q_8G8`4%yrDkJf5XAwss z#}g=Xc3~ub^e5TCjteUj<2xDh_4CgzbBCAe)h@46T6oqU3M7uAybISa8g93(oxb~h z&UzVUzG5Yxt`)N%hf?^xN7pHBmiMARbvPp1xF;kEBIwuzOk_&gpB6t?wn%0-vuMS1 z=ZcAq?6@%;_O&bhI52%!AO7U{{q#lr&+8G0ZL|5Bk0|D;Wl-_!Ek#GK=#ER-oUcgq zC@y^m8i$mvI@mLjO2Q?sU=rZ3{}6LMW-$=mclVpB-hcVe3HjPT3e=JW5-5{+Uc<+i z)f(tCrj{J$B-1A3M8(sObIs z|NqB9Q9YYHoM}@Mk(ZCtwK6zM^l#-QIa!-I-jqzN89$xpdqzL4!S;*2c}x4}TanU> z#VMZu>qL`BUpeW}ylQ+0wibwu`)77fN^xC}#|Hf;slAW%4?~li*jG0eDF2?uy#3dF z^I@IJ&)D;5omZOuzf|D6#4f;eIgu96*@-s7+k15fIH-B-51}eAk8uA^5&z~$m$mlyRYMl9QC!A0M1>yfv zdfm4~xxG|$qeFX)Hb+Y>;XBNXjTh|he0BR87-&4=U{hX|WUOspHBlL+R8^Ybo{5y2 z(#@KfA1rL1>zS}AY7Wa*OfE%-PhWCRv$n z$e$pxym{_HX{T|)Gevr}5eHrpl4H->qVvv=ZPJ0JJcd|qm)^g(iue3IA_=#CSX)Zl z5<&>TtXq4y4j!QGF2(eXG(OKhvbGqKd8T^IoZQ^pwa>N=g0yawnxJSV$9e~uTWDzb zovsAzjy`R(J`?kfdrcu+MY4|)PlUTQVxAgsA5^6EEIA$Xhd1|`%uC&ehSA5nC?eLc zt=r5qzTe64RJF8*9@*M%e$-})-8)AuE>42fXofk-C_a$hOBtqAOib*lmR9t}CPR2L zgO^JZQUD~och)rd~sV5Gp&L#^QtW-w4c}L-8kEv67wN_`fpaX+7 z*8yrB=xiTpu^OB-wYsnTjps*J({3i!{(IrVi%Nf#8cB*^@@0 zbAr$nnwjL;{hM#Dyz_mn&7P1Z6qYvE9L|HcV?o9e%&hpw|Ko7QSHry)HL~9^RQ=`? z`L;AP7t#F>Pi$}Ymz914x*Nr*N4)vCGAG{F3O#Zct{;>g@f$-Mex7wvPQ1M~ z_JVo3VB6Z`J1lj9^KKVC|BSPeA0e@KV|YyYJ;PvC9#bwW8mGvDL8H5dQ;^MRx?BS- zZ=pkdVN0h^>mec56|GP`-=BTvFkqTCLw1-xz(w2cHL+73R#sNhBOoGwXj48$VQjSb zJ*0WAvOUsR8;rD@z%50AmyuQ?&N)c?GUMY4&WOk4HCMU+tvjpTC4YXSvUaD9ou;kJ zObj{)P}9(i{Ze6JikhqwiWH@!5HToyoc{dV<6AN;1pIC_lf&;YaZmQ+3)VFA|A~id zpr>|2&un2zgwH1_j85cWsX1_*AsPP}{zWqXOJ&ix*Nw=~66N!&fGzl#27j3%MQ6Ar zew3z2NC#V`cwoCvkG!oF$;&~K!hW?>Xk3{W$Y2Yy(+^8rpQz1YoH-9}r z4SEl)0WzrMo(~EX469<^Z|G%-dHNiRBto%Vd;Ru6{CG3GnaI*Dp%>NV&vJvCCT-yX zKfg()UhzV5#nU_+cz+f4(IWDPH?MB}I0p&sgGfbl8}=-9wvM;)8;4=db3+TK)gVjR zRG;0HNgwq{nbTM`g_1q;(6S13wj17ap#m~#%>@$|O-o{jR9Te$L8U`{S?bxZeKx;Q zDClZyGXZU8W%ZQf#&lNA9lw>2GbQ|G%Ohg*ftOc{N!?}1hs4>p*X#?VbQ4ob8w|Z4 z%iKzpH*kXhdTA1Zq*VcA^m$D#wGO*ab&yxAPU7rMFl=nJ91$X)SWxfHAJulwZI>)u zFZ|4Pt@Frs@-E#TzPC_Af*t3e8ZZuywlw4LA``!;(m;e-q0ln|$T{r7w0ny(uheS7|hS;Qd9 zILSdi1r^QKr&vyBGSYGzfnZQlkdaic8ZfOGv)|Y4r|td$w`L*PYMf^P5J36N4r7i z@uyA0Drcn!W|Ua(puvM#)8``{!SGb&H7_o854xFcSLYl~Tb_KTz(Dj{Xpy~!UU@%9 z7iqBeiDyS@-V4`75$-4lK@=1EDn3!!CRO3|S;XFBADN3CY4=|TF-J#Bb+5ihai{bu z-2s$b#en-4w?S6_UCg9!C~s}k`2WrKqHsLp6qW%4`U?BCf*@JOQ>=l&Ta3#~y*^80$L(_*b7c$Hd zF3*w_(;Hgf6dA75>MlE0PWzQ3QSAJiT^h_5kcNcYd*9MVQ<|W`SwQ216akrR$B~a9c9v4eM8h z=lCH%UcHlDBwJ-o^-e?u&Hb*PdyXFpYJI{^l^5%%XZ=AnNWWgEkG&N#Y_@lQ7@852r(Zt)?!*P`hXt!|7ue5gYaek+n zf1%^}^!(oY>W4V4?%IXPev{{DF9jD(gEpBwl8Y^JQK{YFCE>h*?-R+0o;d%Qn3!s0 z&)Aqq%HGHu%1}44_>M#YFk5|pKHzFh-4skvhSGUeA5r?tf}Oa?T@*3|di}hyW5LEz zJQa7{O3t3d83}QOZu(DosXJ+Gev}8Ornfg;6Gfs3aq<16Zc{$^943*3Y__9~9x_Vn z#!q!N`_D+0F1&ddLzxPo68Ac-Djx&fJMsgrmzvpkXN3!E1U|m|FD79>sklxr+R}n5 z1Pl!u=6cR@1vB3JS+|k7Z4NDWBBRW%)LvjUU*J?IyTSQ z7Y!CJJgm5X>LOmyToL6aUhLEtRdwI*i!D8(t@%2^6}dg`}?d0k!CAr)It)T zA?7P*Ize_yn?^b(>OnY(tZYwB4z}D5FJDDydLM?XU!%j(NU!t$uyF%#Yp+W>V}Z|o z@eg~c#IX_HR=q{NK74R;R@0{T(dE^Y!TS?Vj55y&reVP9MtEdmT*X-5q>GI105 z-I}5n%>2FTwtIFxUC6j+LzUGz^DC^x(3~EdZQc+GNM;KJk{R)S znB=S8Fm8gQhvn*o&t!1Je0)GI?C3twM{f$3e>GV z`y%nolVBPYv($rO6{on#rvU^myq1)4K58mDOC4#M?+1B*zzweMu{Bi#Xdu_!O`E=% zvWPQxcD(E6^9hFgqiQIg{7nn@m(YIw^tPsJJDY3!?or&LEeXl3UZ4G~TY%`97iTAm`Imj7tLOo;~M z1r@`N@QO)=?@byW$-6nKaST2%uNp;JtolV)onJICPk64=6)xoYg#6=jJP{T9;c>k> zwV6S?*i1GHSvDf{NOwF9Z|l)lN8uV4>QIZ7KP-3+Vb28;ZOU~uY>A+?i$K2-bf3|> zf3rFp)nFig&nIQ3I`ZY-Y%lno_97a0hAmMaF=9M&4wO1uB;`YxRpT^=R|*c(EdhU* z@~RZSh0+1pG2n1GT(RD-=vBn=1e${wxhAp#R+MYxE*KJFVmP_IUiG)reDch-_x>?l z{v|h4ZIk1+m3@4q8q3;icAq8kohJ$0?s9_yE5&g0ttL0xDwR5YQO?-SXF<p zWsqlXCG2+S*#6p+O-p>SvR0UoBv(oddb2xt?|I+I?E6?;5iP9?WLFYRczUN`>6lBg z(bC=B-DV7pFFucC|7GiWnR`W)@DY z_G&I)iJe=jmqqF5)JZ0R2qwa%`n%iOvTH}~@%9e{5g(y5bO>+;_Cu*Iuw855+nwbh zMRV_aRoC+DswU1&)|!_cYjYPCrRcK@IV^RMf7fbX?-1DKQO-oN(GDr!~lJMnCo~tN_%$^WhHd%RusLYlgtyCX;oQ%BCHo;c#}U+=`?(&xK# zSzcb-2ClshA1_fH)?UkpnLX#m>W*2@4eBIUhkRaaz2!mGL!Z%_aBJu5-4s}^FNxcW z+{C2S4dQFp0Js&At<{`-=uWy*VJKf+jd?p^o}=F&oZkH6@UFFu2gyE>iQXeldFF^< zqGIsQ=R1+)rY0uWVQ+k)G##P8JGT?!E;8|ZaD}j>apqA9X%Ad&Jqoz+Zru!22San5 ze=^LH;z_pUL#s6wi-fGB%Eq=f*pl6%B_IGMbECQLC-uow!!8~9u61(V=Q?(OP(mw8 zG4eugcukn%2DZ#c;)0(gpDujCeFc{L>`A^eRe$}CfUaii&DiEyC$@#;e$*Z#&vxd~ zUj9k;KA-zR#=?1-=r&h*tI!s$1*HXC1j3ZjS23eC47JSLFYgOJTe+fde*JzGhuO2` z&yroaGh+V^qLnkISW_?D*({@s?~w-GSCmY2WcmAc{6^T^k4c9r4|n(c*k=r8B7+L) z&v^v|4#knXuhQdm*==<`{9#Nh@s-_pU>@zZWwA^fT#s;izPUgbD)%6dY?yTMZ_a}; zB(-ibCfMxp)9+YFX;Cn4$_P$J@668olh6zKX~W8j;|Y@&dv)gmP%cHta5>vD*Yc z4SqCm{erxFwSC>9>=&*8GD+=pT#-XDW&Z)>!B;CQD|h_=eT)4e5vh1jsjZGC{c0pB z9@f%uq0y(hOVHo}mq9qAC3U|I@qvCRS!<%`YEy>-KPQ^$beHnp&|4O5| zB{|K-A|6T4X!o$)KmVSUjnT+U@g!E1YSur+waEhhr&wt&-*Yr}$8UIiLT8%o!c4SR zR#vE664KcJBV(~`AEP;pXxr80<%;0mkBauf3D9r-&ig;pf8i!ZsO=2=x2XJeu`4bn zCglSz(L)^%mgMzs(01jAl(c5LEO1MQL#0pm;C4MDMaH{$SI`lA_cj_3LTS*`qw5Hb zKdbvq@Bc7%X(!W2RqNC${GX<-JRHjQZI2}_mSk%z+3K|=OLp1HR@ufb$zEBq#>606 zcq3acV+oUaEg?%q_Mx{hq(b&>WZ%PJgz#Nczdyd`IOdNznCF?fpZmG*^E%J-x~|U* z!AcH$U9YRr29$zpA3cqp3zQ+F=KdSHUC`VEE-o$_ zvaPyQJJ^TfYjPbe8%9CHvGq%v-JUiSDgQV(n*m^~(FU0Y;7pyr<8l9@?oHYVcc>rn z2-o1Kk2Jo%c(NDnsq#b_a%y zAg}%B6hozCBe&)AM-tep(^S1-L0?=WmxDH4{S3-I+`Ec55cPck+9k;=E4T7pK*xfz zQ-_TjKK4+HjMeW#7vK9G_)+VrLkWI<~PlHrWr^ zJRW2xmlYRhqXJ1!7=XMbCJ0#D9XWl$f-Ey+JUtX$Z=F*?>z8-(DR6>Kes-j0XE6@v zdV3$keRWdEihA*xLUVlLDU|3Y6JC6P^HRO)nr>nhlwPZ_-{Lq*FdHn>W0-DMTAq3%9hEULg|Jxo3t?3{xjiINsg+6*kY?aOg6#c$Gg$QtAzC_ zrI(SIF3>h-L?A19xila`^aw3<-l?~L4ja_W`u5!W2XuSnjx^>yRH3R^Ry(U>w($a? z-rCBFCCBxBJnKa7Gq88^@v1TsuF2Yw zkVmc7p}BJpunKOsT7C<8=gjedAl&hcn(#bS=eTe7_rMV`$U<$2%`mSxWgfp+58?zd zSywX%*RL+XPxPysdhumG;2V__%BxlL{jNpwgL&UH;)3XbSc2nH*Ouw|f+UQDPvqhg zzhtHXGD$!eR|RM43&OH^!{rq{C{nI!Uvy zRm13d`1%Uyv#jD#$J$)UdzmQbk8!@#SUfMJZQxn|;%L^c&qY>_S?%uAb!E)>?BQh* z$#_SSY?)}2_V63&)9O)Xg&eS^={Bfy9P^rMp5MfXvmRMW(eweGqUp8vvKqgMq1ADx z6X96*2x{^(^9f^TFb%<6_tla!On__}SBcqD|Ib`>a<{eq1c!6ek&( zu;s{cl>4`qaD11I8#Z-Es8A6z6IgNoHncjU^qql zS70@?H6gk|w!ea+q6h?jH}n!X<*ZM>f@ zypMwdmz)ys=?S&Uc_K?<8kr@czIpHHos8-(>YS787NIU@*V|-SWMeI z^FT51fG!p1&Jr|$>+ZVV_)rif&(q7v0vv!6eJ$#;=mE>svjR{O@B|}G!ONcV-pgTZ z>P$~#anehrnPbd>&U=Az-!e;XWf~~Q=UCeZ>#E(IVft#|h=ip;^ic4fpAIQ&M*au* zu%P9>li|nDwiR{`P@MmZFfvV}*lp`7TnwC|+-rnX+FhJ(G2+I*D$ zqHa0dY!#L5hHq29fJ-XD#T#vZu~*H?S0V*z_sGp=a~%1U;FX8}2Yu&4ukU10-nrZD z_pcRxaU-R|phs7Ko$GoWA2H&i)$3}F zF8==HFuA`~tv&#E!)dJ%r0oKSpOAI9Zy4%q`yLNYib7tCH>kq)T!c6an;YV z3AtfjyyYYOjFmc63bV~1CaneiS_Ph7XFK6RmCsm98v_$Ku_AJB20RfGHhmK2Mlv>_ zd^r1yCx6R#()GtM(}g1}g^U1~S9L9u+SKZds$7?xIT8jz2{n*aqX zN4%9F$Q}je6nkUU!FnM$)m)R#_EMy6tqK$jh&4MNzf}L|-+=OYU*#!6Et+HT5Im$t z^MBo@j$Dox@KcH4wMgu6Nd+kjmO(Ib1BiJ`oE&7OfD?#sCiuSHJi{QM7W#`pr8Xh| z7#bN(kGhus=ELUtdC+{yz7gq}nIkAJ$m$-MTr=$1@pGJ5(*bW|F!2#b<*g2UFi~4I z>;3^mv!Lt#2U0@`lMqz5HH2ObzOj(QZK`^Jom>%FXc}7NNg(C~oqD#bWTGlvJNlz+ z*4}{1C}bJ0h;gMzFdrQ54CqJ@j&{dZB+ovnh35|AvA6idi9^*J zdl2_<#_jTf^(3&aws3ekAGDaJ$+d^tNq~l-5&S8St+uz4r__QHWnJFco*j-KP3ua5 zH`@(3U$I$*7_!Tlnz+hGrH`@%CN2Ut{kzn@RjlV{lwqe;WQzci{OC3_rsn0*f+$MqW*`_IAU~hmV-XMySF{dN zPV;VFyXBXJ=cF(VoHT@?Bwa|le_o(DHFz&$IW$uP?(1;C^2|g>{S*jnw zsKBU}6G~XEBwzxZhF|HQKybSc9D1mh6KT7!2`;O`n!QGPr8<4naFprb_&-2Zecbo> zxilYu`TLTxY2_9pn2jQ(%nZ&c3rgQkAeP^;5W>dNU zOF8GZTk>doiz7-KK;!L=&&TK1f?y)BvPbI-ef}Y2{k77ZdDA`j+-%=65bsFPJ+r47 zY-=wvGd!}sTe;be>&~|*t(l%f*8u{tQ@~70AHN1ILA}o&%vkLFOe`Ccl)im#<=nf# zbIZLzAp<`%1H-?kN6TMVd12n?>9;XX$Sxb`49ua*ZZmdiyJ4rFUA}&Xtt<4DP>EC~ zfhE1u#vzz^Ri*3@zE#+-u}(MQAjC_~MwN z&wd}NPAoWSVTDvSx8A&RC+&2Z#nb-Xpvg-6p{6`WssC!*I3Oc><%PXvpZ_Eem zq}nc8V#40=cKTyq^?EgV6ZKUzOwbav&6PjUb&WrKl}ou)!yA5)+yA{(&||f{OiehP z{&z<1`Cb@Gv@esfH}hoq&4H9XO>SnT_G@2JqpTATB(|h-=lZT6R0XYEim}-I(2bn% z+V8U;q70el0}aE0<{mkiQt;c`L0(y(O6Q)E&A{ctn%yq%y{LPU4hh<>l4S9FSQ9kw zXZ{z-ix^_jQt0MI(k##;6hD06%Knspn@}--P5LgJ-us~0;VH-;_|+r@`k;))cd3=3 zTNgg(`vl+<+Xp)vcX+x7D8eNU2jfvP9Zy=8$MT72CgFNInJbk_-BIHaU_PfiB82Ef zBZ>%dp8!Ob<+!3m5!sU@eqDs^WhY!Ug?n^+aI7J8%V(crvU20{vud>Yo<>8LZpLoI z+JV>pGJ$`izMQ4II_r4@Ty3Mb-)*nO;o$4eOHCuS>R?<`NaLq)sp+j27oIBfkCpZw zp}&Gl{dTKfbeH=wAUM#}aE$CljX%Y>5f!H*Jn}0N5kLU}v}Z?jvIz0deSq0C5dLn( zh~lsu0_iz>3uW%WK-O+m-Hkad%RB0@pVM-~0qk-=mhf=m1J6l{kER{tPg2?C`rWf^ zD|-tgk3t%c-6@zgGV%YMFZ#lB;MWh{q9LhY>O3!5Y$T zN}jUxT3Lu5K#z_waQb}e%V=!X+47sj$2%B~PWApL6NmyR)V0t9eZ4%w?E=Em zh?O4v&Ah2T`i_rPX%Jzo6X0L5V1+pcQeDk36+Ggxd^B*OY&*8-CMj??QH7?URY4c| zfpKN;RKX*>m7s(pXNsvVJq>0tut-OIYIQvi$SqxonFhl~lf8_vIfuP^g6L3n z2N#(NcZ^om^FLOczoFK58Gca~!8zZzd9|ysiZZ`Sxt-;0{B1_Po7q+cU zjMoun5=mju8m1{o1^@vT63HIY8UBRZDqCX!{>3Pv73Muh5ovTn{NUtG2X}`VPwhiS zcbFxJI_OTd0TFXF8J~%%8TAIe&Fv*j7#SKXs#{4c35&(v$iq!;VqAbpnj^|+Q9pG7 z2xuxV;Ck|+*dSdoD^O?9aThkoPGeJ1gd@vF6Qq5LvEydNdEzAY@tYWe?2C^6gtlB7 zctDn}{=T(2phyyWRt>M9@sAbhb*a}BxCB1fi1QP{IABFisQ)@NG9SS9;qdR-?3MaZ zaH{0F1arF%FAS_!un_ece~#BR3><&lP4GT~@c;j!@_Wes{F~z6tkg`!-^crz-xKQ3 qn*l!Rh5vVCXjAX^pTqI)fhOg9UQFyEJQOKGAg<^d>y%z{eE5H0T@U{N literal 0 HcmV?d00001 diff --git a/doc/_static/logo_only.png b/doc/_static/logo_only.png new file mode 100644 index 0000000000000000000000000000000000000000..fdebcc474a87ef939de63bed9371f6beb099bc4e GIT binary patch literal 16424 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 ZLT|PoRWU`_@&7beSJqLgQ+yrqe*mK>u#Nx# literal 0 HcmV?d00001 diff --git a/doc/_templates/docssidebar.html b/doc/_templates/docssidebar.html new file mode 100644 index 0000000..913acaa --- /dev/null +++ b/doc/_templates/docssidebar.html @@ -0,0 +1,3 @@ +{% if pagename != 'docs/index' %} +« Back to docs index +{% endif %} diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html new file mode 100644 index 0000000..2995455 --- /dev/null +++ b/doc/_templates/indexsidebar.html @@ -0,0 +1,25 @@ +

Download

+{% if version.endswith('(hg)') %} +

This documentation is for version {{ version }}, which is + not released yet.

+

You can use it from the + Mercurial repo or look for + released versions in the Python + Package Index.

+{% else %} +

Current version: {{ version }}

+

Get Pygments from the Python Package +Index, or install it with:

+
pip install Pygments
+{% endif %} + +

Questions? Suggestions?

+ +

Clone at Bitbucket +or come to the #pocoo channel on FreeNode.

+

You can also open an issue at the + tracker.

+ + + diff --git a/doc/_themes/pygments14/layout.html b/doc/_themes/pygments14/layout.html new file mode 100644 index 0000000..93a3119 --- /dev/null +++ b/doc/_themes/pygments14/layout.html @@ -0,0 +1,98 @@ +{# + sphinxdoc/layout.html + ~~~~~~~~~~~~~~~~~~~~~ + + Sphinx layout template for the sphinxdoc theme. + + :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{%- extends "basic/layout.html" %} + +{# put the sidebar before the body #} +{% block sidebar1 %}{{ sidebar() }}{% endblock %} +{% block sidebar2 %}{% endblock %} + +{% block relbar1 %}{% endblock %} +{% block relbar2 %}{% endblock %} + +{% block extrahead %} + +{{ super() }} +{%- if not embedded %} + + +{%- endif %} +{% endblock %} + +{% block header %} +
+ +{% endblock %} + +{% block footer %} + +
{# closes "outerwrapper" div #} +{% endblock %} + +{% block sidebarrel %} +{% endblock %} + +{% block sidebarsourcelink %} +{% endblock %} diff --git a/doc/_themes/pygments14/static/bodybg.png b/doc/_themes/pygments14/static/bodybg.png new file mode 100644 index 0000000000000000000000000000000000000000..46892b801ac1088cdb7091f230bcb0eec1bfbe85 GIT binary patch literal 51903 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 literal 0 HcmV?d00001 diff --git a/doc/_themes/pygments14/static/listitem.png b/doc/_themes/pygments14/static/listitem.png new file mode 100644 index 0000000000000000000000000000000000000000..e45715f914df0b9ce5650cd81f826565d794bc6f GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRO!3HEZ#7tid5-9M9ECz~A24Tjhjus6-LG}_) zUsv|KjDqY+yxD&zFaw41JY5_^BrYc>NGv&UGh(5%v^3ic2_Tqf;9+ScrKuZn^uU2H zQyfn*9&-yU`CQ%jRM<_jbEVs=+4%-On`#az=vrO%C^ha<()jUzeq*EHImaYp10cwd vh@M+!5EQwitFh7Z?ulO_J-(9;uViOPP?5c=x_{|>pv?@Pu6{1-oD!M<&SgTz literal 0 HcmV?d00001 diff --git a/doc/_themes/pygments14/static/logo.png b/doc/_themes/pygments14/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1a24dc7dc7e8d989ff3c98eee2c233074e3c0e GIT binary patch literal 26933 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
    iqU(V_fBwX^d}2|D=Bk$roABOZOF$hQ9i8_E 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 literal 0 HcmV?d00001 diff --git a/doc/_themes/pygments14/static/pygments14.css_t b/doc/_themes/pygments14/static/pygments14.css_t new file mode 100644 index 0000000..838782b --- /dev/null +++ b/doc/_themes/pygments14/static/pygments14.css_t @@ -0,0 +1,401 @@ +/* + * pygments14.css + * ~~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- pygments14 theme. Heavily copied from sphinx13. + * + * :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: {{ theme_font }}, 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; + font-size: 14px; + text-align: center; + background-image: url(bodybg.png); + background-color: {{ theme_background }}; + color: black; + padding: 0; + /* + border-right: 1px solid {{ theme_border }}; + border-left: 1px solid {{ theme_border }}; + */ + + margin: 0 auto; + min-width: 780px; + max-width: 1080px; +} + +.outerwrapper { + background-image: url(docbg.png); + background-attachment: fixed; +} + +.pageheader { + text-align: left; + padding: 10px 15px; +} + +.pageheader ul { + float: right; + color: white; + list-style-type: none; + padding-left: 0; + margin-top: 40px; + margin-right: 10px; +} + +.pageheader li { + float: left; + margin: 0 0 0 10px; +} + +.pageheader li a { + border-radius: 3px; + padding: 8px 12px; + color: {{ theme_darkgray }}; + text-shadow: 0 0 5px rgba(0, 0, 0, 0.2); +} + +.pageheader li a:hover { + background-color: {{ theme_yellow }}; + color: black; + text-shadow: none; +} + +div.document { + text-align: left; + /*border-left: 1em solid {{ theme_lightyellow }};*/ +} + +div.bodywrapper { + margin: 0 12px 0 240px; + background-color: white; +/* border-right: 1px solid {{ theme_border }}; */ +} + +div.body { + margin: 0; + padding: 0.5em 20px 20px 20px; +} + +div.related { + font-size: 1em; + color: {{ theme_darkgray }}; +} + +div.related ul { + background-image: url(relbg.png); + background-repeat: repeat-y; + background-color: {{ theme_yellow }}; + height: 1.9em; + /* + border-top: 1px solid {{ theme_border }}; + border-bottom: 1px solid {{ theme_border }}; + */ +} + +div.related ul li { + margin: 0 5px 0 0; + padding: 0; + float: left; +} + +div.related ul li.right { + float: right; + margin-right: 5px; +} + +div.related ul li a { + margin: 0; + padding: 0 5px 0 5px; + line-height: 1.75em; + color: {{ theme_darkgray }}; + /*text-shadow: 0px 0px 1px rgba(0, 0, 0, 0.5);*/ +} + +div.related ul li a:hover { + text-decoration: underline; + text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5); +} + +div.sphinxsidebarwrapper { + position: relative; + top: 0px; + padding: 0; +} + +div.sphinxsidebar { + margin: 0; + padding: 0 0px 15px 15px; + width: 210px; + float: left; + font-size: 1em; + text-align: left; +} + +div.sphinxsidebar .logo { + font-size: 1.8em; + color: #666; + font-weight: 300; + text-align: center; +} + +div.sphinxsidebar .logo img { + vertical-align: middle; +} + +div.sphinxsidebar input { + border: 1px solid #aaa; + font-family: {{ theme_font }}, 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; + font-size: 1em; +} + +div.sphinxsidebar h3 { + font-size: 1.5em; + /* border-top: 1px solid {{ theme_border }}; */ + margin-top: 1em; + margin-bottom: 0.5em; + padding-top: 0.5em; +} + +div.sphinxsidebar h4 { + font-size: 1.2em; + margin-bottom: 0; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4 { + margin-right: -15px; + margin-left: -15px; + padding-right: 14px; + padding-left: 14px; + color: #333; + font-weight: 300; + /*text-shadow: 0px 0px 0.5px rgba(0, 0, 0, 0.4);*/ +} + +div.sphinxsidebarwrapper > h3:first-child { + margin-top: 0.5em; + border: none; +} + +div.sphinxsidebar h3 a { + color: #333; +} + +div.sphinxsidebar ul { + color: #444; + margin-top: 7px; + padding: 0; + line-height: 130%; +} + +div.sphinxsidebar ul ul { + margin-left: 20px; + list-style-image: url(listitem.png); +} + +div.footer { + color: {{ theme_darkgray }}; + text-shadow: 0 0 .2px rgba(255, 255, 255, 0.8); + padding: 2em; + text-align: center; + clear: both; + font-size: 0.8em; +} + +/* -- body styles ----------------------------------------------------------- */ + +p { + margin: 0.8em 0 0.5em 0; +} + +a { + color: {{ theme_darkgreen }}; + text-decoration: none; +} + +a:hover { + color: {{ theme_darkyellow }}; +} + +div.body a { + text-decoration: underline; +} + +h1 { + margin: 10px 0 0 0; + font-size: 2.4em; + color: {{ theme_darkgray }}; + font-weight: 300; +} + +h2 { + margin: 1.em 0 0.2em 0; + font-size: 1.5em; + font-weight: 300; + padding: 0; + color: {{ theme_darkgreen }}; +} + +h3 { + margin: 1em 0 -0.3em 0; + font-size: 1.3em; + font-weight: 300; +} + +div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { + text-decoration: none; +} + +div.body h1 a tt, div.body h2 a tt, div.body h3 a tt, div.body h4 a tt, div.body h5 a tt, div.body h6 a tt { + color: {{ theme_darkgreen }} !important; + font-size: inherit !important; +} + +a.headerlink { + color: {{ theme_green }} !important; + font-size: 12px; + margin-left: 6px; + padding: 0 4px 0 4px; + text-decoration: none !important; + float: right; +} + +a.headerlink:hover { + background-color: #ccc; + color: white!important; +} + +cite, code, tt { + font-family: 'Consolas', 'DejaVu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; + letter-spacing: -0.02em; +} + +tt { + background-color: #f2f2f2; + border: 1px solid #ddd; + border-radius: 2px; + color: #333; + padding: 1px; +} + +tt.descname, tt.descclassname, tt.xref { + border: 0; +} + +hr { + border: 1px solid #abc; + margin: 2em; +} + +a tt { + border: 0; + color: {{ theme_darkgreen }}; +} + +a tt:hover { + color: {{ theme_darkyellow }}; +} + +pre { + font-family: 'Consolas', 'DejaVu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 13px; + letter-spacing: 0.015em; + line-height: 120%; + padding: 0.5em; + border: 1px solid #ccc; + border-radius: 2px; + background-color: #f8f8f8; +} + +pre a { + color: inherit; + text-decoration: underline; +} + +td.linenos pre { + padding: 0.5em 0; +} + +div.quotebar { + background-color: #f8f8f8; + max-width: 250px; + float: right; + padding: 0px 7px; + border: 1px solid #ccc; + margin-left: 1em; +} + +div.topic { + background-color: #f8f8f8; +} + +table { + border-collapse: collapse; + margin: 0 -0.5em 0 -0.5em; +} + +table td, table th { + padding: 0.2em 0.5em 0.2em 0.5em; +} + +div.admonition, div.warning { + font-size: 0.9em; + margin: 1em 0 1em 0; + border: 1px solid #86989B; + border-radius: 2px; + background-color: #f7f7f7; + padding: 0; +} + +div.admonition p, div.warning p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} + +div.admonition pre, div.warning pre { + margin: 0.4em 1em 0.4em 1em; +} + +div.admonition p.admonition-title, +div.warning p.admonition-title { + margin-top: 1em; + padding-top: 0.5em; + font-weight: bold; +} + +div.warning { + border: 1px solid #940000; +/* background-color: #FFCCCF;*/ +} + +div.warning p.admonition-title { +} + +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + +.viewcode-back { + font-family: {{ theme_font }}, 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} diff --git a/doc/_themes/pygments14/theme.conf b/doc/_themes/pygments14/theme.conf new file mode 100644 index 0000000..fffe66d --- /dev/null +++ b/doc/_themes/pygments14/theme.conf @@ -0,0 +1,15 @@ +[theme] +inherit = basic +stylesheet = pygments14.css +pygments_style = friendly + +[options] +green = #66b55e +darkgreen = #36852e +darkgray = #666666 +border = #66b55e +yellow = #f4cd00 +darkyellow = #d4ad00 +lightyellow = #fffbe3 +background = #f9f9f9 +font = PT Sans diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..4ac487f --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- +# +# Pygments documentation build configuration file, created by +# sphinx-quickstart on Sat Jan 18 17:07:37 2014. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath('..')) + +import pygments + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'pygments.sphinxext'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Pygments' +copyright = u'2014, Georg Brandl' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = pygments.__version__ +# The full version, including alpha/beta/rc tags. +release = version + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +#pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'pygments14' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = ['_themes'] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +html_favicon = '_static/favicon.ico' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +html_sidebars = {'index': 'indexsidebar.html', + 'docs/*': 'docssidebar.html'} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Pygmentsdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'Pygments.tex', u'Pygments Documentation', + u'Georg Brandl', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'pygments', u'Pygments Documentation', + [u'Georg Brandl'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'Pygments', u'Pygments Documentation', + u'Georg Brandl', 'Pygments', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +# Example configuration for intersphinx: refer to the Python standard library. +#intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/doc/docs/api.rst b/doc/docs/api.rst new file mode 100644 index 0000000..123a464 --- /dev/null +++ b/doc/docs/api.rst @@ -0,0 +1,316 @@ +.. -*- mode: rst -*- + +===================== +The full Pygments API +===================== + +This page describes the Pygments API. + +High-level API +============== + +.. module:: pygments + +Functions from the :mod:`pygments` module: + +.. function:: lex(code, lexer) + + Lex `code` with the `lexer` (must be a `Lexer` instance) + and return an iterable of tokens. Currently, this only calls + `lexer.get_tokens()`. + +.. function:: format(tokens, formatter, outfile=None) + + Format a token stream (iterable of tokens) `tokens` with the + `formatter` (must be a `Formatter` instance). The result is + written to `outfile`, or if that is ``None``, returned as a + string. + +.. function:: highlight(code, lexer, formatter, outfile=None) + + This is the most high-level highlighting function. + It combines `lex` and `format` in one function. + + +.. module:: pygments.lexers + +Functions from :mod:`pygments.lexers`: + +.. function:: get_lexer_by_name(alias, **options) + + Return an instance of a `Lexer` subclass that has `alias` in its + aliases list. The lexer is given the `options` at its + instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is + found. + +.. function:: get_lexer_for_filename(fn, **options) + + Return a `Lexer` subclass instance that has a filename pattern + matching `fn`. The lexer is given the `options` at its + instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no lexer for that filename + is found. + +.. function:: get_lexer_for_mimetype(mime, **options) + + Return a `Lexer` subclass instance that has `mime` in its mimetype + list. The lexer is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if not lexer for that mimetype + is found. + +.. function:: guess_lexer(text, **options) + + Return a `Lexer` subclass instance that's guessed from the text in + `text`. For that, the :meth:`.analyse_text()` method of every known lexer + class is called with the text as argument, and the lexer which returned the + highest value will be instantiated and returned. + + :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can + handle the content. + +.. function:: guess_lexer_for_filename(filename, text, **options) + + As :func:`guess_lexer()`, but only lexers which have a pattern in `filenames` + or `alias_filenames` that matches `filename` are taken into consideration. + + :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can + handle the content. + +.. function:: get_all_lexers() + + Return an iterable over all registered lexers, yielding tuples in the + format:: + + (longname, tuple of aliases, tuple of filename patterns, tuple of mimetypes) + + .. versionadded:: 0.6 + + +.. module:: pygments.formatters + +Functions from :mod:`pygments.formatters`: + +.. function:: get_formatter_by_name(alias, **options) + + Return an instance of a :class:`.Formatter` subclass that has `alias` in its + aliases list. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that + alias is found. + +.. function:: get_formatter_for_filename(fn, **options) + + Return a :class:`.Formatter` subclass instance that has a filename pattern + matching `fn`. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename + is found. + + +.. module:: pygments.styles + +Functions from :mod:`pygments.styles`: + +.. function:: get_style_by_name(name) + + Return a style class by its short name. The names of the builtin styles + are listed in :data:`pygments.styles.STYLE_MAP`. + + Will raise :exc:`pygments.util.ClassNotFound` if no style of that name is + found. + +.. function:: get_all_styles() + + Return an iterable over all registered styles, yielding their names. + + .. versionadded:: 0.6 + + +.. module:: pygments.lexer + +Lexers +====== + +The base lexer class from which all lexers are derived is: + +.. class:: Lexer(**options) + + The constructor takes a \*\*keywords dictionary of options. + Every subclass must first process its own options and then call + the `Lexer` constructor, since it processes the `stripnl`, + `stripall` and `tabsize` options. + + An example looks like this: + + .. sourcecode:: python + + def __init__(self, **options): + self.compress = options.get('compress', '') + Lexer.__init__(self, **options) + + As these options must all be specifiable as strings (due to the + command line usage), there are various utility functions + available to help with that, see `Option processing`_. + + .. method:: get_tokens(text) + + This method is the basic interface of a lexer. It is called by + the `highlight()` function. It must process the text and return an + iterable of ``(tokentype, value)`` pairs from `text`. + + Normally, you don't need to override this method. The default + implementation processes the `stripnl`, `stripall` and `tabsize` + options and then yields all tokens from `get_tokens_unprocessed()`, + with the ``index`` dropped. + + .. method:: get_tokens_unprocessed(text) + + This method should process the text and return an iterable of + ``(index, tokentype, value)`` tuples where ``index`` is the starting + position of the token within the input text. + + This method must be overridden by subclasses. + + .. staticmethod:: analyse_text(text) + + A static method which is called for lexer guessing. It should analyse + the text and return a float in the range from ``0.0`` to ``1.0``. + If it returns ``0.0``, the lexer will not be selected as the most + probable one, if it returns ``1.0``, it will be selected immediately. + + .. note:: You don't have to add ``@staticmethod`` to the definition of + this method, this will be taken care of by the Lexer's metaclass. + + For a list of known tokens have a look at the :doc:`tokens` page. + + A lexer also can have the following attributes (in fact, they are mandatory + except `alias_filenames`) that are used by the builtin lookup mechanism. + + .. attribute:: name + + Full name for the lexer, in human-readable form. + + .. attribute:: aliases + + A list of short, unique identifiers that can be used to lookup + the lexer from a list, e.g. using `get_lexer_by_name()`. + + .. attribute:: filenames + + A list of `fnmatch` patterns that match filenames which contain + content for this lexer. The patterns in this list should be unique among + all lexers. + + .. attribute:: alias_filenames + + A list of `fnmatch` patterns that match filenames which may or may not + contain content for this lexer. This list is used by the + :func:`.guess_lexer_for_filename()` function, to determine which lexers + are then included in guessing the correct one. That means that + e.g. every lexer for HTML and a template language should include + ``\*.html`` in this list. + + .. attribute:: mimetypes + + A list of MIME types for content that can be lexed with this + lexer. + + +.. module:: pygments.formatter + +Formatters +========== + +A formatter is derived from this class: + + +.. class:: Formatter(**options) + + As with lexers, this constructor processes options and then must call the + base class :meth:`__init__`. + + The :class:`Formatter` class recognizes the options `style`, `full` and + `title`. It is up to the formatter class whether it uses them. + + .. method:: get_style_defs(arg='') + + This method must return statements or declarations suitable to define + the current style for subsequent highlighted text (e.g. CSS classes + in the `HTMLFormatter`). + + The optional argument `arg` can be used to modify the generation and + is formatter dependent (it is standardized because it can be given on + the command line). + + This method is called by the ``-S`` :doc:`command-line option `, + the `arg` is then given by the ``-a`` option. + + .. method:: format(tokensource, outfile) + + This method must format the tokens from the `tokensource` iterable and + write the formatted version to the file object `outfile`. + + Formatter options can control how exactly the tokens are converted. + + .. versionadded:: 0.7 + A formatter must have the following attributes that are used by the + builtin lookup mechanism. + + .. attribute:: name + + Full name for the formatter, in human-readable form. + + .. attribute:: aliases + + A list of short, unique identifiers that can be used to lookup + the formatter from a list, e.g. using :func:`.get_formatter_by_name()`. + + .. attribute:: filenames + + A list of :mod:`fnmatch` patterns that match filenames for which this + formatter can produce output. The patterns in this list should be unique + among all formatters. + + +.. module:: pygments.util + +Option processing +================= + +The :mod:`pygments.util` module has some utility functions usable for option +processing: + +.. exception:: OptionError + + This exception will be raised by all option processing functions if + the type or value of the argument is not correct. + +.. function:: get_bool_opt(options, optname, default=None) + + Interpret the key `optname` from the dictionary `options` as a boolean and + return it. Return `default` if `optname` is not in `options`. + + The valid string values for ``True`` are ``1``, ``yes``, ``true`` and + ``on``, the ones for ``False`` are ``0``, ``no``, ``false`` and ``off`` + (matched case-insensitively). + +.. function:: get_int_opt(options, optname, default=None) + + As :func:`get_bool_opt`, but interpret the value as an integer. + +.. function:: get_list_opt(options, optname, default=None) + + If the key `optname` from the dictionary `options` is a string, + split it at whitespace and return it. If it is already a list + or a tuple, it is returned as a list. + +.. function:: get_choice_opt(options, optname, allowed, default=None) + + If the key `optname` from the dictionary is not in the sequence + `allowed`, raise an error, otherwise return it. + + .. versionadded:: 0.8 diff --git a/doc/docs/authors.rst b/doc/docs/authors.rst new file mode 100644 index 0000000..f8373f0 --- /dev/null +++ b/doc/docs/authors.rst @@ -0,0 +1,4 @@ +Full contributor list +===================== + +.. include:: ../../AUTHORS diff --git a/doc/docs/changelog.rst b/doc/docs/changelog.rst new file mode 100644 index 0000000..f264cab --- /dev/null +++ b/doc/docs/changelog.rst @@ -0,0 +1 @@ +.. include:: ../../CHANGES diff --git a/docs/src/cmdline.txt b/doc/docs/cmdline.rst similarity index 91% rename from docs/src/cmdline.txt rename to doc/docs/cmdline.rst index a48a5c2..bf0177a 100644 --- a/docs/src/cmdline.txt +++ b/doc/docs/cmdline.rst @@ -4,8 +4,8 @@ Command Line Interface ====================== -You can use Pygments from the shell, provided you installed the `pygmentize` -script:: +You can use Pygments from the shell, provided you installed the +:program:`pygmentize` script:: $ pygmentize test.py print "Hello World" @@ -28,7 +28,7 @@ written to stdout. The ``-f`` option selects a formatter (as with ``-l``, it can also be omitted if an output file name is given and has a supported extension). If no output file name is given and ``-f`` is omitted, the -`TerminalFormatter` is used. +:class:`.TerminalFormatter` is used. The above command could therefore also be given as:: @@ -82,14 +82,15 @@ Usage is as follows:: generates a CSS style sheet (because you selected the HTML formatter) for the "colorful" style prepending a ".syntax" selector to all style rules. -For an explanation what ``-a`` means for `a particular formatter`_, look for -the `arg` argument for the formatter's `get_style_defs()` method. +For an explanation what ``-a`` means for :doc:`a particular formatter +`, look for the `arg` argument for the formatter's +:meth:`.get_style_defs()` method. Getting lexer names ------------------- -*New in Pygments 1.0.* +.. versionadded:: 1.0 The ``-N`` option guesses a lexer name for a given filename, so that :: @@ -125,7 +126,7 @@ will print the help for the Python lexer, etc. A note on encodings ------------------- -*New in Pygments 0.9.* +.. versionadded:: 0.9 Pygments tries to be smart regarding encodings in the formatting process: @@ -141,7 +142,4 @@ Pygments tries to be smart regarding encodings in the formatting process: * If you don't give an encoding and haven't given an output file (that means output is written to the console), the default encoding for lexer and - formatter is the terminal encoding (`sys.stdout.encoding`). - - -.. _a particular formatter: formatters.txt + formatter is the terminal encoding (``sys.stdout.encoding``). diff --git a/docs/src/filterdevelopment.txt b/doc/docs/filterdevelopment.rst similarity index 98% rename from docs/src/filterdevelopment.txt rename to doc/docs/filterdevelopment.rst index c60e1e8..bc399a6 100644 --- a/docs/src/filterdevelopment.txt +++ b/doc/docs/filterdevelopment.rst @@ -4,7 +4,7 @@ Write your own filter ===================== -*New in Pygments 0.7.* +.. versionadded:: 0.7 Writing own filters is very easy. All you have to do is to subclass the `Filter` class and override the `filter` method. Additionally a diff --git a/docs/src/filters.txt b/doc/docs/filters.rst similarity index 85% rename from docs/src/filters.txt rename to doc/docs/filters.rst index 522f633..ff2519a 100644 --- a/docs/src/filters.txt +++ b/doc/docs/filters.rst @@ -4,7 +4,7 @@ Filters ======= -*New in Pygments 0.7.* +.. versionadded:: 0.7 You can filter token streams coming from lexers to improve or annotate the output. For example, you can highlight special words in comments, convert @@ -31,12 +31,11 @@ To get a list of all registered filters by name, you can use the `get_all_filters()` function from the `pygments.filters` module that returns an iterable for all known filters. -If you want to write your own filter, have a look at `Write your own filter`_. - -.. _Write your own filter: filterdevelopment.txt +If you want to write your own filter, have a look at :doc:`Write your own filter +`. Builtin Filters =============== -[builtin_filter_docs] +.. pygmentsdoc:: filters diff --git a/docs/src/formatterdevelopment.txt b/doc/docs/formatterdevelopment.rst similarity index 98% rename from docs/src/formatterdevelopment.txt rename to doc/docs/formatterdevelopment.rst index 83a13b6..2bfac05 100644 --- a/docs/src/formatterdevelopment.txt +++ b/doc/docs/formatterdevelopment.rst @@ -4,7 +4,7 @@ Write your own formatter ======================== -As well as creating `your own lexer `_, writing a new +As well as creating :doc:`your own lexer `, writing a new formatter for Pygments is easy and straightforward. A formatter is a class that is initialized with some keyword arguments (the diff --git a/docs/src/formatters.txt b/doc/docs/formatters.rst similarity index 90% rename from docs/src/formatters.txt rename to doc/docs/formatters.rst index 7a59064..9e7074e 100644 --- a/docs/src/formatters.txt +++ b/doc/docs/formatters.rst @@ -12,8 +12,6 @@ Common options All formatters support these options: `encoding` - *New in Pygments 0.6.* - If given, must be an encoding name (such as ``"utf-8"``). This will be used to convert the token strings (which are Unicode strings) to byte strings in the output (default: ``None``). @@ -30,19 +28,21 @@ All formatters support these options: supports Unicode arguments to `write()`. Using a regular file object wouldn't work. -`outencoding` - *New in Pygments 0.7.* + .. versionadded:: 0.6 +`outencoding` When using Pygments from the command line, any `encoding` option given is passed to the lexer and the formatter. This is sometimes not desirable, for example if you want to set the input encoding to ``"guess"``. Therefore, `outencoding` has been introduced which overrides `encoding` for the formatter if given. + .. versionadded:: 0.7 + Formatter classes ================= -All these classes are importable from `pygments.formatters`. +All these classes are importable from :mod:`pygments.formatters`. -[builtin_formatter_docs] +.. pygmentsdoc:: formatters diff --git a/doc/docs/index.rst b/doc/docs/index.rst new file mode 100644 index 0000000..30d5c08 --- /dev/null +++ b/doc/docs/index.rst @@ -0,0 +1,66 @@ +Pygments documentation +====================== + +**Starting with Pygments** + +.. toctree:: + :maxdepth: 1 + + ../download + quickstart + cmdline + +**Builtin components** + +.. toctree:: + :maxdepth: 1 + + lexers + filters + formatters + styles + +**Reference** + +.. toctree:: + :maxdepth: 1 + + unicode + tokens + api + +**Hacking for Pygments** + +.. toctree:: + :maxdepth: 1 + + lexerdevelopment + formatterdevelopment + filterdevelopment + plugins + +**Hints and tricks** + +.. toctree:: + :maxdepth: 1 + + rstdirective + moinmoin + java + integrate + +**About Pygments** + +.. toctree:: + :maxdepth: 1 + + changelog + authors + + +If you find bugs or have suggestions for the documentation, please look +:ref:`here ` for info on how to contact the team. + +.. XXX You can download an offline version of this documentation from the + :doc:`download page `. + diff --git a/docs/src/integrate.txt b/doc/docs/integrate.rst similarity index 85% rename from docs/src/integrate.txt rename to doc/docs/integrate.rst index 6f8c125..03fc268 100644 --- a/docs/src/integrate.txt +++ b/doc/docs/integrate.rst @@ -23,8 +23,9 @@ Markdown -------- Since Pygments 0.9, the distribution ships Markdown_ preprocessor sample code -that uses Pygments to render source code in `external/markdown-processor.py`. -You can copy and adapt it to your liking. +that uses Pygments to render source code in +:file:`external/markdown-processor.py`. You can copy and adapt it to your +liking. .. _Markdown: http://www.freewisdom.org/projects/python-markdown/ @@ -41,8 +42,3 @@ Bash completion The source distribution contains a file ``external/pygments.bashcomp`` that sets up completion for the ``pygmentize`` command in bash. - -Java ----- - -See the `Java quickstart `_ document. diff --git a/docs/src/java.txt b/doc/docs/java.rst similarity index 100% rename from docs/src/java.txt rename to doc/docs/java.rst diff --git a/doc/docs/lexerdevelopment.rst b/doc/docs/lexerdevelopment.rst new file mode 100644 index 0000000..23bcb4f --- /dev/null +++ b/doc/docs/lexerdevelopment.rst @@ -0,0 +1,682 @@ +.. -*- mode: rst -*- + +.. highlight:: python + +==================== +Write your own lexer +==================== + +If a lexer for your favorite language is missing in the Pygments package, you +can easily write your own and extend Pygments. + +All you need can be found inside the :mod:`pygments.lexer` module. As you can +read in the :doc:`API documentation `, a lexer is a class that is +initialized with some keyword arguments (the lexer options) and that provides a +:meth:`.get_tokens_unprocessed()` method which is given a string or unicode +object with the data to lex. + +The :meth:`.get_tokens_unprocessed()` method must return an iterator or iterable +containing tuples in the form ``(index, token, value)``. Normally you don't +need to do this since there are base lexers that do most of the work and that +you can subclass. + + +RegexLexer +========== + +The lexer base class used by almost all of Pygments' lexers is the +:class:`RegexLexer`. This class allows you to define lexing rules in terms of +*regular expressions* for different *states*. + +States are groups of regular expressions that are matched against the input +string at the *current position*. If one of these expressions matches, a +corresponding action is performed (such as yielding a token with a specific +type, or changing state), the current position is set to where the last match +ended and the matching process continues with the first regex of the current +state. + +Lexer states are kept on a stack: each time a new state is entered, the new +state is pushed onto the stack. The most basic lexers (like the `DiffLexer`) +just need one state. + +Each state is defined as a list of tuples in the form (`regex`, `action`, +`new_state`) where the last item is optional. In the most basic form, `action` +is a token type (like `Name.Builtin`). That means: When `regex` matches, emit a +token with the match text and type `tokentype` and push `new_state` on the state +stack. If the new state is ``'#pop'``, the topmost state is popped from the +stack instead. To pop more than one state, use ``'#pop:2'`` and so on. +``'#push'`` is a synonym for pushing the current state on the stack. + +The following example shows the `DiffLexer` from the builtin lexers. Note that +it contains some additional attributes `name`, `aliases` and `filenames` which +aren't required for a lexer. They are used by the builtin lexer lookup +functions. :: + + from pygments.lexer import RegexLexer + from pygments.token import * + + class DiffLexer(RegexLexer): + name = 'Diff' + aliases = ['diff'] + filenames = ['*.diff'] + + tokens = { + 'root': [ + (r' .*\n', Text), + (r'\+.*\n', Generic.Inserted), + (r'-.*\n', Generic.Deleted), + (r'@.*\n', Generic.Subheading), + (r'Index.*\n', Generic.Heading), + (r'=.*\n', Generic.Heading), + (r'.*\n', Text), + ] + } + +As you can see this lexer only uses one state. When the lexer starts scanning +the text, it first checks if the current character is a space. If this is true +it scans everything until newline and returns the data as a `Text` token (which +is the "no special highlighting" token). + +If this rule doesn't match, it checks if the current char is a plus sign. And +so on. + +If no rule matches at the current position, the current char is emitted as an +`Error` token that indicates a lexing error, and the position is increased by +one. + + +Adding and testing a new lexer +============================== + +To make pygments aware of your new lexer, you have to perform the following +steps: + +First, change to the current directory containing the pygments source code: + +.. code-block:: console + + $ cd .../pygments-main + +Select a matching module under ``pygments/lexers``, or create a new module for +your lexer class. + +Next, make sure the lexer is known from outside of the module. All modules in +the ``pygments.lexers`` specify ``__all__``. For example, ``esoteric.py`` sets:: + + __all__ = ['BrainfuckLexer', 'BefungeLexer', ...] + +Simply add the name of your lexer class to this list. + +Finally the lexer can be made publicly known by rebuilding the lexer mapping: + +.. code-block:: console + + $ make mapfiles + +To test the new lexer, store an example file with the proper extension in +``tests/examplefiles``. For example, to test your ``DiffLexer``, add a +``tests/examplefiles/example.diff`` containing a sample diff output. + +Now you can use pygmentize to render your example to HTML: + +.. code-block:: console + + $ ./pygmentize -O full -f html -o /tmp/example.html tests/examplefiles/example.diff + +Note that this explicitely calls the ``pygmentize`` in the current directory +by preceding it with ``./``. This ensures your modifications are used. +Otherwise a possibly already installed, unmodified version without your new +lexer would have been called from the system search path (``$PATH``). + +To view the result, open ``/tmp/example.html`` in your browser. + +Once the example renders as expected, you should run the complete test suite: + +.. code-block:: console + + $ make test + +It also tests that your lexer fulfills the lexer API and certain invariants, +such as that the concatenation of all token text is the same as the input text. + + +Regex Flags +=========== + +You can either define regex flags locally in the regex (``r'(?x)foo bar'``) or +globally by adding a `flags` attribute to your lexer class. If no attribute is +defined, it defaults to `re.MULTILINE`. For more informations about regular +expression flags see the page about `regular expressions`_ in the Python +documentation. + +.. _regular expressions: http://docs.python.org/library/re.html#regular-expression-syntax + + +Scanning multiple tokens at once +================================ + +So far, the `action` element in the rule tuple of regex, action and state has +been a single token type. Now we look at the first of several other possible +values. + +Here is a more complex lexer that highlights INI files. INI files consist of +sections, comments and ``key = value`` pairs:: + + from pygments.lexer import RegexLexer, bygroups + from pygments.token import * + + class IniLexer(RegexLexer): + name = 'INI' + aliases = ['ini', 'cfg'] + filenames = ['*.ini', '*.cfg'] + + tokens = { + 'root': [ + (r'\s+', Text), + (r';.*?$', Comment), + (r'\[.*?\]$', Keyword), + (r'(.*?)(\s*)(=)(\s*)(.*?)$', + bygroups(Name.Attribute, Text, Operator, Text, String)) + ] + } + +The lexer first looks for whitespace, comments and section names. Later it +looks for a line that looks like a key, value pair, separated by an ``'='`` +sign, and optional whitespace. + +The `bygroups` helper yields each capturing group in the regex with a different +token type. First the `Name.Attribute` token, then a `Text` token for the +optional whitespace, after that a `Operator` token for the equals sign. Then a +`Text` token for the whitespace again. The rest of the line is returned as +`String`. + +Note that for this to work, every part of the match must be inside a capturing +group (a ``(...)``), and there must not be any nested capturing groups. If you +nevertheless need a group, use a non-capturing group defined using this syntax: +``(?:some|words|here)`` (note the ``?:`` after the beginning parenthesis). + +If you find yourself needing a capturing group inside the regex which shouldn't +be part of the output but is used in the regular expressions for backreferencing +(eg: ``r'(<(foo|bar)>)(.*?)()'``), you can pass `None` to the bygroups +function and that group will be skipped in the output. + + +Changing states +=============== + +Many lexers need multiple states to work as expected. For example, some +languages allow multiline comments to be nested. Since this is a recursive +pattern it's impossible to lex just using regular expressions. + +Here is a lexer that recognizes C++ style comments (multi-line with ``/* */`` +and single-line with ``//`` until end of line):: + + from pygments.lexer import RegexLexer + from pygments.token import * + + class CppCommentLexer(RegexLexer): + name = 'Example Lexer with states' + + tokens = { + 'root': [ + (r'[^/]+', Text), + (r'/\*', Comment.Multiline, 'comment'), + (r'//.*?$', Comment.Singleline), + (r'/', Text) + ], + 'comment': [ + (r'[^*/]', Comment.Multiline), + (r'/\*', Comment.Multiline, '#push'), + (r'\*/', Comment.Multiline, '#pop'), + (r'[*/]', Comment.Multiline) + ] + } + +This lexer starts lexing in the ``'root'`` state. It tries to match as much as +possible until it finds a slash (``'/'``). If the next character after the slash +is an asterisk (``'*'``) the `RegexLexer` sends those two characters to the +output stream marked as `Comment.Multiline` and continues lexing with the rules +defined in the ``'comment'`` state. + +If there wasn't an asterisk after the slash, the `RegexLexer` checks if it's a +singleline comment (i.e. followed by a second slash). If this also wasn't the +case it must be a single slash, which is not a comment starter (the separate +regex for a single slash must also be given, else the slash would be marked as +an error token). + +Inside the ``'comment'`` state, we do the same thing again. Scan until the +lexer finds a star or slash. If it's the opening of a multiline comment, push +the ``'comment'`` state on the stack and continue scanning, again in the +``'comment'`` state. Else, check if it's the end of the multiline comment. If +yes, pop one state from the stack. + +Note: If you pop from an empty stack you'll get an `IndexError`. (There is an +easy way to prevent this from happening: don't ``'#pop'`` in the root state). + +If the `RegexLexer` encounters a newline that is flagged as an error token, the +stack is emptied and the lexer continues scanning in the ``'root'`` state. This +can help producing error-tolerant highlighting for erroneous input, e.g. when a +single-line string is not closed. + + +Advanced state tricks +===================== + +There are a few more things you can do with states: + +- You can push multiple states onto the stack if you give a tuple instead of a + simple string as the third item in a rule tuple. For example, if you want to + match a comment containing a directive, something like: + + .. code-block:: text + + /* rest of comment */ + + you can use this rule:: + + tokens = { + 'root': [ + (r'/\* <', Comment, ('comment', 'directive')), + ... + ], + 'directive': [ + (r'[^>]*', Comment.Directive), + (r'>', Comment, '#pop'), + ], + 'comment': [ + (r'[^*]+', Comment), + (r'\*/', Comment, '#pop'), + (r'\*', Comment), + ] + } + + When this encounters the above sample, first ``'comment'`` and ``'directive'`` + are pushed onto the stack, then the lexer continues in the directive state + until it finds the closing ``>``, then it continues in the comment state until + the closing ``*/``. Then, both states are popped from the stack again and + lexing continues in the root state. + + .. versionadded:: 0.9 + The tuple can contain the special ``'#push'`` and ``'#pop'`` (but not + ``'#pop:n'``) directives. + + +- You can include the rules of a state in the definition of another. This is + done by using `include` from `pygments.lexer`:: + + from pygments.lexer import RegexLexer, bygroups, include + from pygments.token import * + + class ExampleLexer(RegexLexer): + tokens = { + 'comments': [ + (r'/\*.*?\*/', Comment), + (r'//.*?\n', Comment), + ], + 'root': [ + include('comments'), + (r'(function )(\w+)( {)', + bygroups(Keyword, Name, Keyword), 'function'), + (r'.', Text), + ], + 'function': [ + (r'[^}/]+', Text), + include('comments'), + (r'/', Text), + (r'\}', Keyword, '#pop'), + ] + } + + This is a hypothetical lexer for a language that consist of functions and + comments. Because comments can occur at toplevel and in functions, we need + rules for comments in both states. As you can see, the `include` helper saves + repeating rules that occur more than once (in this example, the state + ``'comment'`` will never be entered by the lexer, as it's only there to be + included in ``'root'`` and ``'function'``). + +- Sometimes, you may want to "combine" a state from existing ones. This is + possible with the `combined` helper from `pygments.lexer`. + + If you, instead of a new state, write ``combined('state1', 'state2')`` as the + third item of a rule tuple, a new anonymous state will be formed from state1 + and state2 and if the rule matches, the lexer will enter this state. + + This is not used very often, but can be helpful in some cases, such as the + `PythonLexer`'s string literal processing. + +- If you want your lexer to start lexing in a different state you can modify the + stack by overloading the `get_tokens_unprocessed()` method:: + + from pygments.lexer import RegexLexer + + class ExampleLexer(RegexLexer): + tokens = {...} + + def get_tokens_unprocessed(self, text): + stack = ['root', 'otherstate'] + for item in RegexLexer.get_tokens_unprocessed(text, stack): + yield item + + Some lexers like the `PhpLexer` use this to make the leading ``', Name.Tag), + ], + 'script-content': [ + (r'(.+?)(<\s*/\s*script\s*>)', + bygroups(using(JavascriptLexer), Name.Tag), + '#pop'), + ] + } + +Here the content of a ```` end tag is processed by the `JavascriptLexer`, +while the end tag is yielded as a normal token with the `Name.Tag` type. + +Also note the ``(r'<\s*script\s*', Name.Tag, ('script-content', 'tag'))`` rule. +Here, two states are pushed onto the state stack, ``'script-content'`` and +``'tag'``. That means that first ``'tag'`` is processed, which will lex +attributes and the closing ``>``, then the ``'tag'`` state is popped and the +next state on top of the stack will be ``'script-content'``. + +Since you cannot refer to the class currently being defined, use `this` +(imported from `pygments.lexer`) to refer to the current lexer class, i.e. +``using(this)``. This construct may seem unnecessary, but this is often the +most obvious way of lexing arbitrary syntax between fixed delimiters without +introducing deeply nested states. + +The `using()` helper has a special keyword argument, `state`, which works as +follows: if given, the lexer to use initially is not in the ``"root"`` state, +but in the state given by this argument. This does not work with advanced +`RegexLexer` subclasses such as `ExtendedRegexLexer` (see below). + +Any other keywords arguments passed to `using()` are added to the keyword +arguments used to create the lexer. + + +Delegating Lexer +================ + +Another approach for nested lexers is the `DelegatingLexer` which is for example +used for the template engine lexers. It takes two lexers as arguments on +initialisation: a `root_lexer` and a `language_lexer`. + +The input is processed as follows: First, the whole text is lexed with the +`language_lexer`. All tokens yielded with the special type of ``Other`` are +then concatenated and given to the `root_lexer`. The language tokens of the +`language_lexer` are then inserted into the `root_lexer`'s token stream at the +appropriate positions. :: + + from pygments.lexer import DelegatingLexer + from pygments.lexers.web import HtmlLexer, PhpLexer + + class HtmlPhpLexer(DelegatingLexer): + def __init__(self, **options): + super(HtmlPhpLexer, self).__init__(HtmlLexer, PhpLexer, **options) + +This procedure ensures that e.g. HTML with template tags in it is highlighted +correctly even if the template tags are put into HTML tags or attributes. + +If you want to change the needle token ``Other`` to something else, you can give +the lexer another token type as the third parameter:: + + DelegatingLexer.__init__(MyLexer, OtherLexer, Text, **options) + + +Callbacks +========= + +Sometimes the grammar of a language is so complex that a lexer would be unable +to process it just by using regular expressions and stacks. + +For this, the `RegexLexer` allows callbacks to be given in rule tuples, instead +of token types (`bygroups` and `using` are nothing else but preimplemented +callbacks). The callback must be a function taking two arguments: + +* the lexer itself +* the match object for the last matched rule + +The callback must then return an iterable of (or simply yield) ``(index, +tokentype, value)`` tuples, which are then just passed through by +`get_tokens_unprocessed()`. The ``index`` here is the position of the token in +the input string, ``tokentype`` is the normal token type (like `Name.Builtin`), +and ``value`` the associated part of the input string. + +You can see an example here:: + + from pygments.lexer import RegexLexer + from pygments.token import Generic + + class HypotheticLexer(RegexLexer): + + def headline_callback(lexer, match): + equal_signs = match.group(1) + text = match.group(2) + yield match.start(), Generic.Headline, equal_signs + text + equal_signs + + tokens = { + 'root': [ + (r'(=+)(.*?)(\1)', headline_callback) + ] + } + +If the regex for the `headline_callback` matches, the function is called with +the match object. Note that after the callback is done, processing continues +normally, that is, after the end of the previous match. The callback has no +possibility to influence the position. + +There are not really any simple examples for lexer callbacks, but you can see +them in action e.g. in the `SMLLexer` class in `ml.py`_. + +.. _ml.py: http://bitbucket.org/birkenfeld/pygments-main/src/tip/pygments/lexers/ml.py + + +The ExtendedRegexLexer class +============================ + +The `RegexLexer`, even with callbacks, unfortunately isn't powerful enough for +the funky syntax rules of languages such as Ruby. + +But fear not; even then you don't have to abandon the regular expression +approach: Pygments has a subclass of `RegexLexer`, the `ExtendedRegexLexer`. +All features known from RegexLexers are available here too, and the tokens are +specified in exactly the same way, *except* for one detail: + +The `get_tokens_unprocessed()` method holds its internal state data not as local +variables, but in an instance of the `pygments.lexer.LexerContext` class, and +that instance is passed to callbacks as a third argument. This means that you +can modify the lexer state in callbacks. + +The `LexerContext` class has the following members: + +* `text` -- the input text +* `pos` -- the current starting position that is used for matching regexes +* `stack` -- a list containing the state stack +* `end` -- the maximum position to which regexes are matched, this defaults to + the length of `text` + +Additionally, the `get_tokens_unprocessed()` method can be given a +`LexerContext` instead of a string and will then process this context instead of +creating a new one for the string argument. + +Note that because you can set the current position to anything in the callback, +it won't be automatically be set by the caller after the callback is finished. +For example, this is how the hypothetical lexer above would be written with the +`ExtendedRegexLexer`:: + + from pygments.lexer import ExtendedRegexLexer + from pygments.token import Generic + + class ExHypotheticLexer(ExtendedRegexLexer): + + def headline_callback(lexer, match, ctx): + equal_signs = match.group(1) + text = match.group(2) + yield match.start(), Generic.Headline, equal_signs + text + equal_signs + ctx.pos = match.end() + + tokens = { + 'root': [ + (r'(=+)(.*?)(\1)', headline_callback) + ] + } + +This might sound confusing (and it can really be). But it is needed, and for an +example look at the Ruby lexer in `ruby.py`_. + +.. _ruby.py: https://bitbucket.org/birkenfeld/pygments-main/src/tip/pygments/lexers/ruby.py + + +Handling Lists of Keywords +========================== + +For a relatively short list (hundreds) you can construct an optimized regular +expression directly using ``words()`` (longer lists, see next section). This +function handles a few things for you automatically, including escaping +metacharacters and Python's first-match rather than longest-match in +alternations. Feel free to put the lists themselves in +``pygments/lexers/_$lang_builtins.py`` (see examples there), and generated by +code if possible. + +An example of using ``words()`` is something like:: + + from pygments.lexer import RegexLexer, words, Name + + class MyLexer(RegexLexer): + + tokens = { + 'root': [ + (words(('else', 'elseif'), suffix=r'\b'), Name.Builtin), + (r'\w+', Name), + ], + } + +As you can see, you can add ``prefix`` and ``suffix`` parts to the constructed +regex. + + +Modifying Token Streams +======================= + +Some languages ship a lot of builtin functions (for example PHP). The total +amount of those functions differs from system to system because not everybody +has every extension installed. In the case of PHP there are over 3000 builtin +functions. That's an incredibly huge amount of functions, much more than you +want to put into a regular expression. + +But because only `Name` tokens can be function names this is solvable by +overriding the ``get_tokens_unprocessed()`` method. The following lexer +subclasses the `PythonLexer` so that it highlights some additional names as +pseudo keywords:: + + from pygments.lexers.python import PythonLexer + from pygments.token import Name, Keyword + + class MyPythonLexer(PythonLexer): + EXTRA_KEYWORDS = set(('foo', 'bar', 'foobar', 'barfoo', 'spam', 'eggs')) + + def get_tokens_unprocessed(self, text): + for index, token, value in PythonLexer.get_tokens_unprocessed(self, text): + if token is Name and value in self.EXTRA_KEYWORDS: + yield index, Keyword.Pseudo, value + else: + yield index, token, value + +The `PhpLexer` and `LuaLexer` use this method to resolve builtin functions. diff --git a/docs/src/lexers.txt b/doc/docs/lexers.rst similarity index 95% rename from docs/src/lexers.txt rename to doc/docs/lexers.rst index 016de6c..914b53e 100644 --- a/docs/src/lexers.txt +++ b/doc/docs/lexers.rst @@ -18,14 +18,13 @@ Currently, **all lexers** support these options: `ensurenl` Make sure that the input ends with a newline (default: ``True``). This is required for some lexers that consume input linewise. - *New in Pygments 1.3.* + + .. versionadded:: 1.3 `tabsize` If given and greater than 0, expand tabs in the input (default: ``0``). `encoding` - *New in Pygments 0.6.* - If given, must be an encoding name (such as ``"utf-8"``). This encoding will be used to convert the input string to Unicode (if it is not already a Unicode string). The default is ``"latin1"``. @@ -35,18 +34,21 @@ Currently, **all lexers** support these options: `chardet library `__ is used to guess the encoding of the input. + .. versionadded:: 0.6 + The "Short Names" field lists the identifiers that can be used with the `get_lexer_by_name()` function. These lexers are builtin and can be imported from `pygments.lexers`: -[builtin_lexer_docs] +.. pygmentsdoc:: lexers + Iterating over all lexers ------------------------- -*New in Pygments 0.6.* +.. versionadded:: 0.6 To get all lexers (both the builtin and the plugin ones), you can use the `get_all_lexers()` function from the `pygments.lexers` diff --git a/docs/src/moinmoin.txt b/doc/docs/moinmoin.rst similarity index 100% rename from docs/src/moinmoin.txt rename to doc/docs/moinmoin.rst diff --git a/docs/src/plugins.txt b/doc/docs/plugins.rst similarity index 100% rename from docs/src/plugins.txt rename to doc/docs/plugins.rst diff --git a/docs/src/quickstart.txt b/doc/docs/quickstart.rst similarity index 80% rename from docs/src/quickstart.txt rename to doc/docs/quickstart.rst index 4040910..dba7698 100644 --- a/docs/src/quickstart.txt +++ b/doc/docs/quickstart.rst @@ -58,8 +58,8 @@ can be produced by: print HtmlFormatter().get_style_defs('.highlight') -The argument to `get_style_defs` is used as an additional CSS selector: the output -may look like this: +The argument to :func:`get_style_defs` is used as an additional CSS selector: +the output may look like this: .. sourcecode:: css @@ -71,9 +71,9 @@ may look like this: Options ======= -The `highlight()` function supports a fourth argument called `outfile`, it must be -a file object if given. The formatted output will then be written to this file -instead of being returned as a string. +The :func:`highlight()` function supports a fourth argument called *outfile*, it +must be a file object if given. The formatted output will then be written to +this file instead of being returned as a string. Lexers and formatters both support options. They are given to them as keyword arguments either to the class or to the lookup method: @@ -103,9 +103,9 @@ Important options include: For an overview of builtin lexers and formatters and their options, visit the -`lexer `_ and `formatters `_ lists. +:doc:`lexer ` and :doc:`formatters ` lists. -For a documentation on filters, see `this page `_. +For a documentation on filters, see :doc:`this page `. Lexer and formatter lookup @@ -131,9 +131,9 @@ one of the following methods: All these functions accept keyword arguments; they will be passed to the lexer as options. -A similar API is available for formatters: use `get_formatter_by_name()` and -`get_formatter_for_filename()` from the `pygments.formatters` module -for this purpose. +A similar API is available for formatters: use :func:`.get_formatter_by_name()` +and :func:`.get_formatter_for_filename()` from the :mod:`pygments.formatters` +module for this purpose. Guessing lexers @@ -153,16 +153,17 @@ or some template tags), use these functions: >>> guess_lexer_for_filename('test.py', 'print "Hello World!"') -`guess_lexer()` passes the given content to the lexer classes' `analyse_text()` -method and returns the one for which it returns the highest number. +:func:`.guess_lexer()` passes the given content to the lexer classes' +:meth:`analyse_text()` method and returns the one for which it returns the +highest number. All lexers have two different filename pattern lists: the primary and the -secondary one. The `get_lexer_for_filename()` function only uses the primary -list, whose entries are supposed to be unique among all lexers. -`guess_lexer_for_filename()`, however, will first loop through all lexers and -look at the primary and secondary filename patterns if the filename matches. +secondary one. The :func:`.get_lexer_for_filename()` function only uses the +primary list, whose entries are supposed to be unique among all lexers. +:func:`.guess_lexer_for_filename()`, however, will first loop through all lexers +and look at the primary and secondary filename patterns if the filename matches. If only one lexer matches, it is returned, else the guessing mechanism of -`guess_lexer()` is used with the matching lexers. +:func:`.guess_lexer()` is used with the matching lexers. As usual, keyword arguments to these functions are given to the created lexer as options. @@ -171,7 +172,8 @@ as options. Command line usage ================== -You can use Pygments from the command line, using the `pygmentize` script:: +You can use Pygments from the command line, using the :program:`pygmentize` +script:: $ pygmentize test.py @@ -199,4 +201,5 @@ it can be created with:: where ``default`` is the style name. -More options and tricks and be found in the `command line reference `_. +More options and tricks and be found in the :doc:`command line reference +`. diff --git a/docs/src/rstdirective.txt b/doc/docs/rstdirective.rst similarity index 100% rename from docs/src/rstdirective.txt rename to doc/docs/rstdirective.rst diff --git a/docs/src/styles.txt b/doc/docs/styles.rst similarity index 95% rename from docs/src/styles.txt rename to doc/docs/styles.rst index e3e9cfb..d56db0d 100644 --- a/docs/src/styles.txt +++ b/doc/docs/styles.rst @@ -21,6 +21,7 @@ option in form of a string: .. sourcecode:: pycon >>> from pygments.styles import get_style_by_name + >>> from pygments.formatters import HtmlFormatter >>> HtmlFormatter(style='colorful').style @@ -30,6 +31,7 @@ Or you can also import your own style (which must be a subclass of .. sourcecode:: pycon >>> from yourapp.yourmodule import YourStyle + >>> from pygments.formatters import HtmlFormatter >>> HtmlFormatter(style=YourStyle).style @@ -68,7 +70,7 @@ they can be used for a variety of formatters.) To make the style usable for Pygments, you must -* either register it as a plugin (see `the plugin docs `_) +* either register it as a plugin (see :doc:`the plugin docs `) * or drop it into the `styles` subpackage of your Pygments distribution one style class per style, where the file name is the style name and the class name is `StylenameClass`. For example, if your style should be called @@ -132,7 +134,7 @@ To get a list of known styles you can use this snippet: Getting a list of available styles ================================== -*New in Pygments 0.6.* +.. versionadded:: 0.6 Because it could be that a plugin registered a style, there is a way to iterate over all styles: diff --git a/docs/src/tokens.txt b/doc/docs/tokens.rst similarity index 96% rename from docs/src/tokens.txt rename to doc/docs/tokens.rst index 4900a9a..9193d5f 100644 --- a/docs/src/tokens.txt +++ b/doc/docs/tokens.rst @@ -4,7 +4,9 @@ Builtin Tokens ============== -Inside the `pygments.token` module, there is a special object called `Token` +.. module:: pygments.token + +In the :mod:`pygments.token` module, there is a special object called `Token` that is used to create token types. You can create a new token type by accessing an attribute of `Token`: @@ -30,8 +32,8 @@ As of Pygments 0.7 you can also use the ``in`` operator to perform set tests: >>> Comment in Comment.Multi False -This can be useful in `filters`_ and if you write lexers on your own without -using the base lexers. +This can be useful in :doc:`filters ` and if you write lexers on your +own without using the base lexers. You can also split a token type into a hierarchy, and get the parent of it: @@ -55,7 +57,7 @@ For some tokens aliases are already defined: >>> String Token.Literal.String -Inside the `pygments.token` module the following aliases are defined: +Inside the :mod:`pygments.token` module the following aliases are defined: ============= ============================ ==================================== `Text` `Token.Text` for any type of text data @@ -251,6 +253,9 @@ Literals `Number` Token type for any number literal. +`Number.Bin` + Token type for binary literals (e.g. ``0b101010``). + `Number.Float` Token type for float literals (e.g. ``42.0``). @@ -280,7 +285,7 @@ Operators Punctuation =========== -*New in Pygments 0.7.* +.. versionadded:: 0.7 `Punctuation` For any punctuation which is not an operator (e.g. ``[``, ``(``...) @@ -345,5 +350,3 @@ highlight a programming language but a patch file. `Generic.Traceback` Marks the token value as a part of an error traceback. - -.. _filters: filters.txt diff --git a/docs/src/unicode.txt b/doc/docs/unicode.rst similarity index 78% rename from docs/src/unicode.txt rename to doc/docs/unicode.rst index dc6394a..e79b4be 100644 --- a/docs/src/unicode.txt +++ b/doc/docs/unicode.rst @@ -3,8 +3,8 @@ Unicode and Encodings ===================== Since Pygments 0.6, all lexers use unicode strings internally. Because of that -you might encounter the occasional `UnicodeDecodeError` if you pass strings with the -wrong encoding. +you might encounter the occasional :exc:`UnicodeDecodeError` if you pass strings +with the wrong encoding. Per default all lexers have their input encoding set to `latin1`. If you pass a lexer a string object (not unicode), it tries to decode the data @@ -39,11 +39,12 @@ Unicode string with this encoding before writing it. This is the case for `sys.stdout`, for example. The other formatters don't have that behavior. Another note: If you call Pygments via the command line (`pygmentize`), -encoding is handled differently, see `the command line docs `_. +encoding is handled differently, see :doc:`the command line docs `. -*New in Pygments 0.7*: the formatters now also accept an `outencoding` option -which will override the `encoding` option if given. This makes it possible to -use a single options dict with lexers and formatters, and still have different -input and output encodings. +.. versionadded:: 0.7 + The formatters now also accept an `outencoding` option which will override + the `encoding` option if given. This makes it possible to use a single + options dict with lexers and formatters, and still have different input and + output encodings. .. _chardet: http://chardet.feedparser.org/ diff --git a/doc/download.rst b/doc/download.rst new file mode 100644 index 0000000..cf32f48 --- /dev/null +++ b/doc/download.rst @@ -0,0 +1,41 @@ +Download and installation +========================= + +The current release is version |version|. + +Packaged versions +----------------- + +You can download it `from the Python Package Index +`_. For installation of packages from +PyPI, we recommend `Pip `_, which works on all +major platforms. + +Under Linux, most distributions include a package for Pygments, usually called +``pygments`` or ``python-pygments``. You can install it with the package +manager as usual. + +Development sources +------------------- + +We're using the `Mercurial `_ version control +system. You can get the development source using this command:: + + hg clone http://bitbucket.org/birkenfeld/pygments-main pygments + +Development takes place at `Bitbucket +`_, you can browse the source +online `here `_. + +The latest changes in the development source code are listed in the `changelog +`_. + +.. Documentation + ------------- + +.. XXX todo + + You can download the documentation either as + a bunch of rst files from the Mercurial repository, see above, or + as a tar.gz containing rendered HTML files:

    +

    pygmentsdocs.tar.gz

    diff --git a/doc/faq.rst b/doc/faq.rst new file mode 100644 index 0000000..f040e05 --- /dev/null +++ b/doc/faq.rst @@ -0,0 +1,143 @@ +:orphan: + +Pygments FAQ +============= + +What is Pygments? +----------------- + +Pygments is a syntax highlighting engine written in Python. That means, it will +take source code (or other markup) in a supported language and output a +processed version (in different formats) containing syntax highlighting markup. + +Its features include: + +* a wide range of common languages and markup formats is supported (look here + for a list) +* new languages and formats are added easily +* a number of output formats is available, including: + + - HTML + - ANSI sequences (console output) + - LaTeX + - RTF + +* it is usable as a command-line tool and as a library +* parsing and formatting is fast + +Pygments is licensed under the BSD license. + +Where does the name Pygments come from? +--------------------------------------- + +*Py* of course stands for Python, while *pigments* are used for coloring paint, +and in this case, source code! + +What are the system requirements? +--------------------------------- + +Pygments only needs a standard Python install, version 2.6 or higher or version +3.3 or higher for Python 3. No additional libraries are needed. + +How can I use Pygments? +----------------------- + +Pygments is usable as a command-line tool as well as a library. + +From the command-line, usage looks like this (assuming the pygmentize script is +properly installed):: + + pygmentize -f html /path/to/file.py + +This will print a HTML-highlighted version of /path/to/file.py to standard output. + +For a complete help, please run ``pygmentize -h``. + +Usage as a library is thoroughly demonstrated in the Documentation section. + +How do I make a new style? +-------------------------- + +Please see the :doc:`documentation on styles `. + +How can I report a bug or suggest a feature? +-------------------------------------------- + +Please report bugs and feature wishes in the tracker at Bitbucket. + +You can also e-mail the author or use IRC, see the contact details. + +I want this support for this language! +-------------------------------------- + +Instead of waiting for others to include language support, why not write it +yourself? All you have to know is :doc:`outlined in the docs +`. + +Can I use Pygments for programming language processing? +------------------------------------------------------- + +The Pygments lexing machinery is quite powerful can be used to build lexers for +basically all languages. However, parsing them is not possible, though some +lexers go some steps in this direction in order to e.g. highlight function names +differently. + +Also, error reporting is not the scope of Pygments. It focuses on correctly +highlighting syntactically valid documents, not finding and compensating errors. + +Who uses Pygments? +------------------ + +This is an (incomplete) list of projects and sites known to use the Pygments highlighter. + +* `Pygments API `_, a HTTP POST interface to Pygments +* `The Sphinx documentation builder `_, for embedded source examples +* `rst2pdf `_, a reStructuredText to PDF converter +* `Zine `_, a Python blogging system +* `Trac `_, the universal project management tool +* `Bruce `_, a reStructuredText presentation tool +* `AsciiDoc `_, a text-based documentation generator +* `ActiveState Code `_, the Python Cookbook successor +* `ViewVC `_, a web-based version control repository browser +* `BzrFruit `_, a Bazaar branch viewer +* `QBzr `_, a cross-platform Qt-based GUI front end for Bazaar +* `BitBucket `_, a Mercurial and Git hosting site +* `GitHub `_, a site offering secure Git hosting and collaborative development +* `Review Board `_, a collaborative code reviewing tool +* `skeletonz `_, a Python powered content management system +* `Diamanda `_, a Django powered wiki system with support for Pygments +* `Progopedia `_ (`English `_), + an encyclopedia of programming languages +* `Postmarkup `_, a BBCode to XHTML generator +* `Language Comparison `_, a site that compares different programming languages +* `BPython `_, a curses-based intelligent Python shell +* `Challenge-You! `_, a site offering programming challenges +* `PIDA `_, a universal IDE written in Python +* `PuDB `_, a console Python debugger +* `XWiki `_, a wiki-based development framework in Java, using Jython +* `roux `_, a script for running R scripts + and creating beautiful output including graphs +* `hurl `_, a web service for making HTTP requests +* `wxHTMLPygmentizer `_ is + a GUI utility, used to make code-colorization easier +* `WpPygments `_, a highlighter plugin for WordPress +* `LodgeIt `_, a pastebin with XMLRPC support and diffs +* `SpammCan `_, a pastebin (demo see + `here `_) +* `WowAce.com pastes `_, a pastebin +* `Siafoo `_, a tool for sharing and storing useful code and programming experience +* `D source `_, a community for the D programming language +* `dumpz.org `_, a pastebin +* `dpaste.com `_, another Django pastebin +* `PylonsHQ Pasties `_, a pastebin +* `Django snippets `_, a pastebin for Django code +* `Fayaa `_, a Chinese pastebin +* `Incollo.com `_, a free collaborative debugging tool +* `PasteBox `_, a pastebin focused on privacy +* `xinotes.org `_, a site to share notes, code snippets etc. +* `hilite.me `_, a site to highlight code snippets +* `patx.me `_, a pastebin + +If you have a project or web site using Pygments, drop me a line, and I'll add a +link here. + diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..2611404 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,54 @@ +Welcome! +======== + +This is the home of Pygments. It is a generic syntax highlighter suitable for +use in code hosting, forums, wikis or other applications that need to prettify +source code. Highlights are: + +* a wide range of over 300 languages and other text formats is supported +* special attention is paid to details that increase highlighting quality +* support for new languages and formats are added easily; most languages use a + simple regex-based lexing mechanism +* a number of output formats is available, among them HTML, RTF, LaTeX and ANSI + sequences +* it is usable as a command-line tool and as a library +* ... and it highlights even Perl 6! + +Read more in the :doc:`FAQ list ` or the :doc:`documentation `, +or `download the latest release `_. + +.. _contribute: + +Contribute +---------- + +Like every open-source project, we are always looking for volunteers to help us +with programming. Python knowledge is required, but don't fear: Python is a very +clear and easy to learn language. + +Development takes place on `Bitbucket +`_, where the Mercurial +repository, tickets and pull requests can be viewed. + +Our primary communication instrument is the IRC channel **#pocoo** on the +Freenode network. To join it, let your IRC client connect to +``irc.freenode.net`` and do ``/join #pocoo``. + +If you found a bug, just open a ticket in the Bitbucket tracker. Be sure to log +in to be notified when the issue is fixed -- development is not fast-paced as +the library is quite stable. You can also send an e-mail to the developers, see +below. + +The authors +----------- + +Pygments is maintained by **Georg Brandl**, e-mail address *georg*\ *@*\ *python.org*. + +Many lexers and fixes have been contributed by **Armin Ronacher**, the rest of +the `Pocoo `_ team and **Tim Hatch**. + +.. toctree:: + :maxdepth: 1 + :hidden: + + docs/index diff --git a/doc/languages.rst b/doc/languages.rst new file mode 100644 index 0000000..0f98c58 --- /dev/null +++ b/doc/languages.rst @@ -0,0 +1,151 @@ +:orphan: + +Supported languages +=================== + +Pygments supports an ever-growing range of languages. Watch this space... + +Programming languages +--------------------- + +* ActionScript +* Ada +* ANTLR +* AppleScript +* Assembly (various) +* Asymptote +* Awk +* Befunge +* Boo +* BrainFuck +* C, C++ +* C# +* Clojure +* CoffeeScript +* ColdFusion +* Common Lisp +* Coq +* Cryptol (incl. Literate Cryptol) +* `Cython `_ +* `D `_ +* Dart +* Delphi +* Dylan +* Erlang +* Factor +* Fancy +* Fortran +* F# +* GAP +* Gherkin (Cucumber) +* GL shaders +* Groovy +* `Haskell `_ (incl. Literate Haskell) +* IDL +* Io +* Java +* JavaScript +* LLVM +* Logtalk +* `Lua `_ +* Matlab +* MiniD +* Modelica +* Modula-2 +* MuPad +* Nemerle +* Nimrod +* Objective-C +* Objective-J +* Octave +* OCaml +* PHP +* `Perl `_ +* PovRay +* PostScript +* PowerShell +* Prolog +* `Python `_ 2.x and 3.x (incl. console sessions and tracebacks) +* `REBOL `_ +* `Red `_ +* Redcode +* `Ruby `_ (incl. irb sessions) +* Rust +* S, S-Plus, R +* Scala +* Scheme +* Scilab +* Smalltalk +* SNOBOL +* Tcl +* Vala +* Verilog +* VHDL +* Visual Basic.NET +* Visual FoxPro +* XQuery +* Zephir +
+ +Template languages +------------------ + +* Cheetah templates +* `Django `_ / `Jinja + `_ templates +* ERB (Ruby templating) +* `Genshi `_ (the Trac template language) +* JSP (Java Server Pages) +* `Myghty `_ (the HTML::Mason based framework) +* `Mako `_ (the Myghty successor) +* `Smarty `_ templates (PHP templating) +* Tea + +Other markup +------------ + +* Apache config files +* Bash shell scripts +* BBCode +* CMake +* CSS +* Debian control files +* Diff files +* DTD +* Gettext catalogs +* Gnuplot script +* Groff markup +* HTML +* HTTP sessions +* INI-style config files +* IRC logs (irssi style) +* Lighttpd config files +* Makefiles +* MoinMoin/Trac Wiki markup +* MySQL +* Nginx config files +* POV-Ray scenes +* Ragel +* Redcode +* ReST +* Robot Framework +* RPM spec files +* SQL, also MySQL, SQLite +* Squid configuration +* TeX +* tcsh +* Vim Script +* Windows batch files +* XML +* XSLT +* YAML + +... that's all? +--------------- + +Well, why not write your own? Contributing to Pygments is easy and fun. Look +:doc:`here ` for the docs on lexer development and +:ref:`here ` for contact details. + +Note: the languages listed here are supported in the development version. The +latest release may lack a few of them. diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..8803c98 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,190 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Pygments.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Pygments.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/docs/pygmentize.1 b/doc/pygmentize.1 similarity index 100% rename from docs/pygmentize.1 rename to doc/pygmentize.1 diff --git a/docs/build/api.html b/docs/build/api.html deleted file mode 100644 index 1225e28..0000000 --- a/docs/build/api.html +++ /dev/null @@ -1,458 +0,0 @@ - - - - The full Pygments API — Pygments - - - - -
-

Pygments

-

The full Pygments API

- - « Back To Index - - -
-

Contents

- -
- - -

This page describes the Pygments API.

-
-

High-level API

-

Functions from the pygments module:

-
-
def lex(code, lexer):
-
Lex code with the lexer (must be a Lexer instance) -and return an iterable of tokens. Currently, this only calls -lexer.get_tokens().
-
def format(tokens, formatter, outfile=None):
-
Format a token stream (iterable of tokens) tokens with the -formatter (must be a Formatter instance). The result is -written to outfile, or if that is None, returned as a -string.
-
def highlight(code, lexer, formatter, outfile=None):
-
This is the most high-level highlighting function. -It combines lex and format in one function.
-
-

Functions from pygments.lexers:

-
-
def get_lexer_by_name(alias, **options):
-

Return an instance of a Lexer subclass that has alias in its -aliases list. The lexer is given the options at its -instantiation.

-

Will raise pygments.util.ClassNotFound if no lexer with that alias is -found.

-
-
def get_lexer_for_filename(fn, **options):
-

Return a Lexer subclass instance that has a filename pattern -matching fn. The lexer is given the options at its -instantiation.

-

Will raise pygments.util.ClassNotFound if no lexer for that filename is -found.

-
-
def get_lexer_for_mimetype(mime, **options):
-

Return a Lexer subclass instance that has mime in its mimetype -list. The lexer is given the options at its instantiation.

-

Will raise pygments.util.ClassNotFound if not lexer for that mimetype is -found.

-
-
def guess_lexer(text, **options):
-

Return a Lexer subclass instance that's guessed from the text -in text. For that, the analyse_text() method of every known -lexer class is called with the text as argument, and the lexer -which returned the highest value will be instantiated and returned.

-

pygments.util.ClassNotFound is raised if no lexer thinks it can handle the -content.

-
-
def guess_lexer_for_filename(filename, text, **options):
-

As guess_lexer(), but only lexers which have a pattern in filenames -or alias_filenames that matches filename are taken into consideration.

-

pygments.util.ClassNotFound is raised if no lexer thinks it can handle the -content.

-
-
def get_all_lexers():
-

Return an iterable over all registered lexers, yielding tuples in the -format:

-
-(longname, tuple of aliases, tuple of filename patterns, tuple of mimetypes)
-
-

New in Pygments 0.6.

-
-
-

Functions from pygments.formatters:

-
-
def get_formatter_by_name(alias, **options):
-

Return an instance of a Formatter subclass that has alias in its -aliases list. The formatter is given the options at its -instantiation.

-

Will raise pygments.util.ClassNotFound if no formatter with that alias is -found.

-
-
def get_formatter_for_filename(fn, **options):
-

Return a Formatter subclass instance that has a filename pattern -matching fn. The formatter is given the options at its -instantiation.

-

Will raise pygments.util.ClassNotFound if no formatter for that filename -is found.

-
-
-

Functions from pygments.styles:

-
-
def get_style_by_name(name):
-

Return a style class by its short name. The names of the builtin styles -are listed in pygments.styles.STYLE_MAP.

-

Will raise pygments.util.ClassNotFound if no style of that name is found.

-
-
def get_all_styles():
-

Return an iterable over all registered styles, yielding their names.

-

New in Pygments 0.6.

-
-
-
-
-

Lexers

-

A lexer (derived from pygments.lexer.Lexer) has the following functions:

-
-
def __init__(self, **options):
-

The constructor. Takes a **keywords dictionary of options. -Every subclass must first process its own options and then call -the Lexer constructor, since it processes the stripnl, -stripall and tabsize options.

-

An example looks like this:

-
def __init__(self, **options):
-    self.compress = options.get('compress', '')
-    Lexer.__init__(self, **options)
-
-

As these options must all be specifiable as strings (due to the -command line usage), there are various utility functions -available to help with that, see Option processing.

-
-
def get_tokens(self, text):
-

This method is the basic interface of a lexer. It is called by -the highlight() function. It must process the text and return an -iterable of (tokentype, value) pairs from text.

-

Normally, you don't need to override this method. The default -implementation processes the stripnl, stripall and tabsize -options and then yields all tokens from get_tokens_unprocessed(), -with the index dropped.

-
-
def get_tokens_unprocessed(self, text):
-

This method should process the text and return an iterable of -(index, tokentype, value) tuples where index is the starting -position of the token within the input text.

-

This method must be overridden by subclasses.

-
-
def analyse_text(text):
-
A static method which is called for lexer guessing. It should analyse -the text and return a float in the range from 0.0 to 1.0. -If it returns 0.0, the lexer will not be selected as the most -probable one, if it returns 1.0, it will be selected immediately.
-
-

For a list of known tokens have a look at the Tokens page.

-

A lexer also can have the following attributes (in fact, they are mandatory -except alias_filenames) that are used by the builtin lookup mechanism.

-
-
name
-
Full name for the lexer, in human-readable form.
-
aliases
-
A list of short, unique identifiers that can be used to lookup -the lexer from a list, e.g. using get_lexer_by_name().
-
filenames
-
A list of fnmatch patterns that match filenames which contain -content for this lexer. The patterns in this list should be unique among -all lexers.
-
alias_filenames
-
A list of fnmatch patterns that match filenames which may or may not -contain content for this lexer. This list is used by the -guess_lexer_for_filename() function, to determine which lexers are -then included in guessing the correct one. That means that e.g. every -lexer for HTML and a template language should include \*.html in -this list.
-
mimetypes
-
A list of MIME types for content that can be lexed with this -lexer.
-
-
-
-

Formatters

-

A formatter (derived from pygments.formatter.Formatter) has the following -functions:

-
-
def __init__(self, **options):
-

As with lexers, this constructor processes options and then must call -the base class __init__.

-

The Formatter class recognizes the options style, full and -title. It is up to the formatter class whether it uses them.

-
-
def get_style_defs(self, arg=''):
-

This method must return statements or declarations suitable to define -the current style for subsequent highlighted text (e.g. CSS classes -in the HTMLFormatter).

-

The optional argument arg can be used to modify the generation and -is formatter dependent (it is standardized because it can be given on -the command line).

-

This method is called by the -S command-line option, the arg -is then given by the -a option.

-
-
def format(self, tokensource, outfile):
-

This method must format the tokens from the tokensource iterable and -write the formatted version to the file object outfile.

-

Formatter options can control how exactly the tokens are converted.

-
-
-

A formatter must have the following attributes that are used by the -builtin lookup mechanism. (New in Pygments 0.7.)

-
-
name
-
Full name for the formatter, in human-readable form.
-
aliases
-
A list of short, unique identifiers that can be used to lookup -the formatter from a list, e.g. using get_formatter_by_name().
-
filenames
-
A list of fnmatch patterns that match filenames for which this formatter -can produce output. The patterns in this list should be unique among -all formatters.
-
-
-
-

Option processing

-

The pygments.util module has some utility functions usable for option -processing:

-
-
class OptionError
-
This exception will be raised by all option processing functions if -the type or value of the argument is not correct.
-
def get_bool_opt(options, optname, default=None):
-

Interpret the key optname from the dictionary options -as a boolean and return it. Return default if optname -is not in options.

-

The valid string values for True are 1, yes, -true and on, the ones for False are 0, -no, false and off (matched case-insensitively).

-
-
def get_int_opt(options, optname, default=None):
-
As get_bool_opt, but interpret the value as an integer.
-
def get_list_opt(options, optname, default=None):
-
If the key optname from the dictionary options is a string, -split it at whitespace and return it. If it is already a list -or a tuple, it is returned as a list.
-
def get_choice_opt(options, optname, allowed, default=None):
-
If the key optname from the dictionary is not in the sequence -allowed, raise an error, otherwise return it. New in Pygments 0.8.
-
-
- -
- - - \ No newline at end of file diff --git a/docs/build/authors.html b/docs/build/authors.html deleted file mode 100644 index 98190b7..0000000 --- a/docs/build/authors.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - Authors — Pygments - - - - -
-

Pygments

-

Authors

- - « Back To Index - - -

Pygments is written and maintained by Georg Brandl <georg@python.org>.

-

Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher -<armin.ronacher@active-4.com>.

-

Other contributors, listed alphabetically, are:

-
    -
  • Sam Aaron -- Ioke lexer
  • -
  • Kumar Appaiah -- Debian control lexer
  • -
  • Ali Afshar -- image formatter
  • -
  • Andreas Amann -- AppleScript lexer
  • -
  • Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers
  • -
  • Jeremy Ashkenas -- CoffeeScript lexer
  • -
  • Stefan Matthias Aust -- Smalltalk lexer
  • -
  • Ben Bangert -- Mako lexers
  • -
  • Max Battcher -- Darcs patch lexer
  • -
  • Paul Baumgart, 280 North, Inc. -- Objective-J lexer
  • -
  • Michael Bayer -- Myghty lexers
  • -
  • John Benediktsson -- Factor lexer
  • -
  • Christopher Bertels -- Fancy lexer
  • -
  • Jarrett Billingsley -- MiniD lexer
  • -
  • Adam Blinkinsop -- Haskell, Redcode lexers
  • -
  • Frits van Bommel -- assembler lexers
  • -
  • Pierre Bourdon -- bugfixes
  • -
  • Hiram Chirino -- Scaml and Jade lexers
  • -
  • Ian Cooper -- VGL lexer
  • -
  • Leaf Corcoran -- MoonScript lexer
  • -
  • Christopher Creutzig -- MuPAD lexer
  • -
  • Pete Curry -- bugfixes
  • -
  • Owen Durni -- haXe lexer
  • -
  • Nick Efford -- Python 3 lexer
  • -
  • Sven Efftinge -- Xtend lexer
  • -
  • Artem Egorkine -- terminal256 formatter
  • -
  • James H. Fisher -- PostScript lexer
  • -
  • Carlos Galdino -- Elixir and Elixir Console lexers
  • -
  • Michael Galloy -- IDL lexer
  • -
  • Naveen Garg -- Autohotkey lexer
  • -
  • Laurent Gautier -- R/S lexer
  • -
  • Alex Gaynor -- PyPy log lexer
  • -
  • Alain Gilbert -- TypeScript lexer
  • -
  • Bertrand Goetzmann -- Groovy lexer
  • -
  • Krzysiek Goj -- Scala lexer
  • -
  • Matt Good -- Genshi, Cheetah lexers
  • -
  • Patrick Gotthardt -- PHP namespaces support
  • -
  • Olivier Guibe -- Asymptote lexer
  • -
  • Jordi Gutiérrez Hermoso -- Octave lexer
  • -
  • Martin Harriman -- SNOBOL lexer
  • -
  • Matthew Harrison -- SVG formatter
  • -
  • Steven Hazel -- Tcl lexer
  • -
  • Aslak Hellesøy -- Gherkin lexer
  • -
  • Greg Hendershott -- Racket lexer
  • -
  • David Hess, Fish Software, Inc. -- Objective-J lexer
  • -
  • Varun Hiremath -- Debian control lexer
  • -
  • Doug Hogan -- Mscgen lexer
  • -
  • Ben Hollis -- Mason lexer
  • -
  • Alastair Houghton -- Lexer inheritance facility
  • -
  • Tim Howard -- BlitzMax lexer
  • -
  • Ivan Inozemtsev -- Fantom lexer
  • -
  • Brian R. Jackson -- Tea lexer
  • -
  • Dennis Kaarsemaker -- sources.list lexer
  • -
  • Igor Kalnitsky -- vhdl lexer
  • -
  • Pekka Klärck -- Robot Framework lexer
  • -
  • Eric Knibbe -- Lasso lexer
  • -
  • Adam Koprowski -- Opa lexer
  • -
  • Benjamin Kowarsch -- Modula-2 lexer
  • -
  • Alexander Kriegisch -- Kconfig and AspectJ lexers
  • -
  • Marek Kubica -- Scheme lexer
  • -
  • Jochen Kupperschmidt -- Markdown processor
  • -
  • Gerd Kurzbach -- Modelica lexer
  • -
  • Jon Larimer, Google Inc. -- Smali lexer
  • -
  • Olov Lassus -- Dart lexer
  • -
  • Sylvestre Ledru -- Scilab lexer
  • -
  • Mark Lee -- Vala lexer
  • -
  • Ben Mabey -- Gherkin lexer
  • -
  • Angus MacArthur -- QML lexer
  • -
  • Simone Margaritelli -- Hybris lexer
  • -
  • Kirk McDonald -- D lexer
  • -
  • Gordon McGregor -- SystemVerilog lexer
  • -
  • Stephen McKamey -- Duel/JBST lexer
  • -
  • Brian McKenna -- F# lexer
  • -
  • Charles McLaughlin -- Puppet lexer
  • -
  • Lukas Meuser -- BBCode formatter, Lua lexer
  • -
  • Paul Miller -- LiveScript lexer
  • -
  • Hong Minhee -- HTTP lexer
  • -
  • Michael Mior -- Awk lexer
  • -
  • Bruce Mitchener -- Dylan lexer rewrite
  • -
  • Reuben Morais -- SourcePawn lexer
  • -
  • Jon Morton -- Rust lexer
  • -
  • Paulo Moura -- Logtalk lexer
  • -
  • Mher Movsisyan -- DTD lexer
  • -
  • Ana Nelson -- Ragel, ANTLR, R console lexers
  • -
  • Nam T. Nguyen -- Monokai style
  • -
  • Jesper Noehr -- HTML formatter "anchorlinenos"
  • -
  • Mike Nolta -- Julia lexer
  • -
  • Jonas Obrist -- BBCode lexer
  • -
  • David Oliva -- Rebol lexer
  • -
  • Jon Parise -- Protocol buffers lexer
  • -
  • Ronny Pfannschmidt -- BBCode lexer
  • -
  • Benjamin Peterson -- Test suite refactoring
  • -
  • Dominik Picheta -- Nimrod lexer
  • -
  • Clément Prévost -- UrbiScript lexer
  • -
  • Kashif Rasul -- CUDA lexer
  • -
  • Justin Reidy -- MXML lexer
  • -
  • Norman Richards -- JSON lexer
  • -
  • Lubomir Rintel -- GoodData MAQL and CL lexers
  • -
  • Andre Roberge -- Tango style
  • -
  • Konrad Rudolph -- LaTeX formatter enhancements
  • -
  • Mario Ruggier -- Evoque lexers
  • -
  • Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers
  • -
  • Matteo Sasso -- Common Lisp lexer
  • -
  • Joe Schafer -- Ada lexer
  • -
  • Ken Schutte -- Matlab lexers
  • -
  • Tassilo Schweyer -- Io, MOOCode lexers
  • -
  • Ted Shaw -- AutoIt lexer
  • -
  • Joerg Sieker -- ABAP lexer
  • -
  • Robert Simmons -- Standard ML lexer
  • -
  • Kirill Simonov -- YAML lexer
  • -
  • Alexander Smishlajev -- Visual FoxPro lexer
  • -
  • Steve Spigarelli -- XQuery lexer
  • -
  • Jerome St-Louis -- eC lexer
  • -
  • James Strachan -- Kotlin lexer
  • -
  • Tom Stuart -- Treetop lexer
  • -
  • Tiberius Teng -- default style overhaul
  • -
  • Jeremy Thurgood -- Erlang, Squid config lexers
  • -
  • Brian Tiffin -- OpenCOBOL lexer
  • -
  • Erick Tryzelaar -- Felix lexer
  • -
  • Daniele Varrazzo -- PostgreSQL lexers
  • -
  • Abe Voelker -- OpenEdge ABL lexer
  • -
  • Pepijn de Vos -- HTML formatter CTags support
  • -
  • Whitney Young -- ObjectiveC lexer
  • -
  • Matthias Vallentin -- Bro lexer
  • -
  • Nathan Weizenbaum -- Haml and Sass lexers
  • -
  • Dietmar Winkler -- Modelica lexer
  • -
  • Nils Winter -- Smalltalk lexer
  • -
  • Davy Wybiral -- Clojure lexer
  • -
  • Diego Zamboni -- CFengine3 lexer
  • -
  • Enrique Zamudio -- Ceylon lexer
  • -
  • Alex Zimin -- Nemerle lexer
  • -
-

Many thanks for all contributions!

- -
- - - \ No newline at end of file diff --git a/docs/build/changelog.html b/docs/build/changelog.html deleted file mode 100644 index 0f8f603..0000000 --- a/docs/build/changelog.html +++ /dev/null @@ -1,930 +0,0 @@ - - - - Changelog — Pygments - - - - -
-

Pygments

-

Changelog

- - « Back To Index - - - - -

Issue numbers refer to the tracker at -<http://bitbucket.org/birkenfeld/pygments-main/issues>, -pull request numbers to the requests at -<http://bitbucket.org/birkenfeld/pygments-main/pull-requests/merged>.

-
-

Version 1.6rc1

-

(released Jan 9, 2013)

-
    -
  • Lexers added:
      -
    • AspectJ (PR#90)
    • -
    • AutoIt (PR#122)
    • -
    • BUGS-like languages (PR#89)
    • -
    • Ceylon (PR#86)
    • -
    • Croc (new name for MiniD)
    • -
    • CUDA (PR#75)
    • -
    • Dg (PR#116)
    • -
    • IDL (PR#115)
    • -
    • Jags (PR#89)
    • -
    • Julia (PR#61)
    • -
    • Kconfig (#711)
    • -
    • Lasso (PR#95, PR#113)
    • -
    • LiveScript (PR#84)
    • -
    • Monkey (PR#117)
    • -
    • Mscgen (PR#80)
    • -
    • NSIS scripts (PR#136)
    • -
    • OpenCOBOL (PR#72)
    • -
    • QML (PR#123)
    • -
    • Puppet (PR#133)
    • -
    • Racket (PR#94)
    • -
    • Rdoc (PR#99)
    • -
    • Robot Framework (PR#137)
    • -
    • RPM spec files (PR#124)
    • -
    • Rust (PR#67)
    • -
    • Smali (Dalvik assembly)
    • -
    • SourcePawn (PR#39)
    • -
    • Stan (PR#89)
    • -
    • Treetop (PR#125)
    • -
    • TypeScript (PR#114)
    • -
    • VGL (PR#12)
    • -
    • Visual FoxPro (#762)
    • -
    • Windows Registry (#819)
    • -
    • Xtend (PR#68)
    • -
    -
  • -
  • The HTML formatter now supports linking to tags using CTags files, when the -python-ctags package is installed (PR#87).
  • -
  • The HTML formatter now has a "linespans" option that wraps every line in a -<span> tag with a specific id (PR#82).
  • -
  • When deriving a lexer from another lexer with token definitions, definitions -for states not in the child lexer are now inherited. If you override a state -in the child lexer, an "inherit" keyword has been added to insert the base -state at that position (PR#141).
  • -
  • The C family lexers now inherit token definitions from a common base class, -removing code duplication (PR#141).
  • -
  • Use "colorama" on Windows for console color output (PR#142).
  • -
  • Fix Template Haskell highlighting (PR#63).
  • -
  • Fix some S/R lexer errors (PR#91).
  • -
  • Fix a bug in the Prolog lexer with names that start with 'is' (#810).
  • -
  • Rewrite Dylan lexer, add Dylan LID lexer (PR#147).
  • -
  • Add a Java quickstart document (PR#146).
  • -
  • Add a "external/autopygmentize" file that can be used as .lessfilter (#802).
  • -
-
-
-

Version 1.5

-

(codename Zeitdilatation, released Mar 10, 2012)

-
    -
  • Lexers added:
      -
    • Awk (#630)
    • -
    • Fancy (#633)
    • -
    • PyPy Log
    • -
    • eC
    • -
    • Nimrod
    • -
    • Nemerle (#667)
    • -
    • F# (#353)
    • -
    • Groovy (#501)
    • -
    • PostgreSQL (#660)
    • -
    • DTD
    • -
    • Gosu (#634)
    • -
    • Octave (PR#22)
    • -
    • Standard ML (PR#14)
    • -
    • CFengine3 (#601)
    • -
    • Opa (PR#37)
    • -
    • HTTP sessions (PR#42)
    • -
    • JSON (PR#31)
    • -
    • SNOBOL (PR#30)
    • -
    • MoonScript (PR#43)
    • -
    • ECL (PR#29)
    • -
    • Urbiscript (PR#17)
    • -
    • OpenEdge ABL (PR#27)
    • -
    • SystemVerilog (PR#35)
    • -
    • Coq (#734)
    • -
    • PowerShell (#654)
    • -
    • Dart (#715)
    • -
    • Fantom (PR#36)
    • -
    • Bro (PR#5)
    • -
    • NewLISP (PR#26)
    • -
    • VHDL (PR#45)
    • -
    • Scilab (#740)
    • -
    • Elixir (PR#57)
    • -
    • Tea (PR#56)
    • -
    • Kotlin (PR#58)
    • -
    -
  • -
  • Fix Python 3 terminal highlighting with pygmentize (#691).
  • -
  • In the LaTeX formatter, escape special &, < and > chars (#648).
  • -
  • In the LaTeX formatter, fix display problems for styles with token -background colors (#670).
  • -
  • Enhancements to the Squid conf lexer (#664).
  • -
  • Several fixes to the reStructuredText lexer (#636).
  • -
  • Recognize methods in the ObjC lexer (#638).
  • -
  • Fix Lua "class" highlighting: it does not have classes (#665).
  • -
  • Fix degenerate regex in Scala lexer (#671) and highlighting bugs (#713, 708).
  • -
  • Fix number pattern order in Ocaml lexer (#647).
  • -
  • Fix generic type highlighting in ActionScript 3 (#666).
  • -
  • Fixes to the Clojure lexer (PR#9).
  • -
  • Fix degenerate regex in Nemerle lexer (#706).
  • -
  • Fix infinite looping in CoffeeScript lexer (#729).
  • -
  • Fix crashes and analysis with ObjectiveC lexer (#693, #696).
  • -
  • Add some Fortran 2003 keywords.
  • -
  • Fix Boo string regexes (#679).
  • -
  • Add "rrt" style (#727).
  • -
  • Fix infinite looping in Darcs Patch lexer.
  • -
  • Lots of misc fixes to character-eating bugs and ordering problems in many -different lexers.
  • -
-
-
-

Version 1.4

-

(codename Unschärfe, released Jan 03, 2011)

-
    -
  • Lexers added:
      -
    • Factor (#520)
    • -
    • PostScript (#486)
    • -
    • Verilog (#491)
    • -
    • BlitzMax Basic (#478)
    • -
    • Ioke (#465)
    • -
    • Java properties, split out of the INI lexer (#445)
    • -
    • Scss (#509)
    • -
    • Duel/JBST
    • -
    • XQuery (#617)
    • -
    • Mason (#615)
    • -
    • GoodData (#609)
    • -
    • SSP (#473)
    • -
    • Autohotkey (#417)
    • -
    • Google Protocol Buffers
    • -
    • Hybris (#506)
    • -
    -
  • -
  • Do not fail in analyse_text methods (#618).
  • -
  • Performance improvements in the HTML formatter (#523).
  • -
  • With the noclasses option in the HTML formatter, some styles -present in the stylesheet were not added as inline styles.
  • -
  • Four fixes to the Lua lexer (#480, #481, #482, #497).
  • -
  • More context-sensitive Gherkin lexer with support for more i18n translations.
  • -
  • Support new OO keywords in Matlab lexer (#521).
  • -
  • Small fix in the CoffeeScript lexer (#519).
  • -
  • A bugfix for backslashes in ocaml strings (#499).
  • -
  • Fix unicode/raw docstrings in the Python lexer (#489).
  • -
  • Allow PIL to work without PIL.pth (#502).
  • -
  • Allow seconds as a unit in CSS (#496).
  • -
  • Support application/javascript as a JavaScript mime type (#504).
  • -
  • Support Offload C++ Extensions as -keywords in the C++ lexer (#484).
  • -
  • Escape more characters in LaTeX output (#505).
  • -
  • Update Haml/Sass lexers to version 3 (#509).
  • -
  • Small PHP lexer string escaping fix (#515).
  • -
  • Support comments before preprocessor directives, and unsigned/ -long long literals in C/C++ (#613, #616).
  • -
  • Support line continuations in the INI lexer (#494).
  • -
  • Fix lexing of Dylan string and char literals (#628).
  • -
  • Fix class/procedure name highlighting in VB.NET lexer (#624).
  • -
-
-
-

Version 1.3.1

-

(bugfix release, released Mar 05, 2010)

-
    -
  • The pygmentize script was missing from the distribution.
  • -
-
-
-

Version 1.3

-

(codename Schneeglöckchen, released Mar 01, 2010)

-
    -
  • Added the ensurenl lexer option, which can be used to suppress the -automatic addition of a newline to the lexer input.
  • -
  • Lexers added:
      -
    • Ada
    • -
    • Coldfusion
    • -
    • Modula-2
    • -
    • haXe
    • -
    • R console
    • -
    • Objective-J
    • -
    • Haml and Sass
    • -
    • CoffeeScript
    • -
    -
  • -
  • Enhanced reStructuredText highlighting.
  • -
  • Added support for PHP 5.3 namespaces in the PHP lexer.
  • -
  • Added a bash completion script for pygmentize, to the external/ -directory (#466).
  • -
  • Fixed a bug in do_insertions() used for multi-lexer languages.
  • -
  • Fixed a Ruby regex highlighting bug (#476).
  • -
  • Fixed regex highlighting bugs in Perl lexer (#258).
  • -
  • Add small enhancements to the C lexer (#467) and Bash lexer (#469).
  • -
  • Small fixes for the Tcl, Debian control file, Nginx config, -Smalltalk, Objective-C, Clojure, Lua lexers.
  • -
  • Gherkin lexer: Fixed single apostrophe bug and added new i18n keywords.
  • -
-
-
-

Version 1.2.2

-

(bugfix release, released Jan 02, 2010)

-
    -
  • Removed a backwards incompatibility in the LaTeX formatter that caused -Sphinx to produce invalid commands when writing LaTeX output (#463).
  • -
  • Fixed a forever-backtracking regex in the BashLexer (#462).
  • -
-
-
-

Version 1.2.1

-

(bugfix release, released Jan 02, 2010)

-
    -
  • Fixed mishandling of an ellipsis in place of the frames in a Python -console traceback, resulting in clobbered output.
  • -
-
-
-

Version 1.2

-

(codename Neujahr, released Jan 01, 2010)

-
    -
  • Dropped Python 2.3 compatibility.
  • -
  • Lexers added:
      -
    • Asymptote
    • -
    • Go
    • -
    • Gherkin (Cucumber)
    • -
    • CMake
    • -
    • Ooc
    • -
    • Coldfusion
    • -
    • haXe
    • -
    • R console
    • -
    -
  • -
  • Added options for rendering LaTeX in source code comments in the -LaTeX formatter (#461).
  • -
  • Updated the Logtalk lexer.
  • -
  • Added line_number_start option to image formatter (#456).
  • -
  • Added hl_lines and hl_color options to image formatter (#457).
  • -
  • Fixed the HtmlFormatter's handling of noclasses=True to not output any -classes (#427).
  • -
  • Added the Monokai style (#453).
  • -
  • Fixed LLVM lexer identifier syntax and added new keywords (#442).
  • -
  • Fixed the PythonTracebackLexer to handle non-traceback data in header or -trailer, and support more partial tracebacks that start on line 2 (#437).
  • -
  • Fixed the CLexer to not highlight ternary statements as labels.
  • -
  • Fixed lexing of some Ruby quoting peculiarities (#460).
  • -
  • A few ASM lexer fixes (#450).
  • -
-
-
-

Version 1.1.1

-

(bugfix release, released Sep 15, 2009)

-
    -
  • Fixed the BBCode lexer (#435).
  • -
  • Added support for new Jinja2 keywords.
  • -
  • Fixed test suite failures.
  • -
  • Added Gentoo-specific suffixes to Bash lexer.
  • -
-
-
-

Version 1.1

-

(codename Brillouin, released Sep 11, 2009)

-
    -
  • Ported Pygments to Python 3. This needed a few changes in the way -encodings are handled; they may affect corner cases when used with -Python 2 as well.
  • -
  • Lexers added:
      -
    • Antlr/Ragel, thanks to Ana Nelson
    • -
    • (Ba)sh shell
    • -
    • Erlang shell
    • -
    • GLSL
    • -
    • Prolog
    • -
    • Evoque
    • -
    • Modelica
    • -
    • Rebol
    • -
    • MXML
    • -
    • Cython
    • -
    • ABAP
    • -
    • ASP.net (VB/C#)
    • -
    • Vala
    • -
    • Newspeak
    • -
    -
  • -
  • Fixed the LaTeX formatter's output so that output generated for one style -can be used with the style definitions of another (#384).
  • -
  • Added "anchorlinenos" and "noclobber_cssfile" (#396) options to HTML -formatter.
  • -
  • Support multiline strings in Lua lexer.
  • -
  • Rewrite of the JavaScript lexer by Pumbaa80 to better support regular -expression literals (#403).
  • -
  • When pygmentize is asked to highlight a file for which multiple lexers -match the filename, use the analyse_text guessing engine to determine the -winner (#355).
  • -
  • Fixed minor bugs in the JavaScript lexer (#383), the Matlab lexer (#378), -the Scala lexer (#392), the INI lexer (#391), the Clojure lexer (#387) -and the AS3 lexer (#389).
  • -
  • Fixed three Perl heredoc lexing bugs (#379, #400, #422).
  • -
  • Fixed a bug in the image formatter which misdetected lines (#380).
  • -
  • Fixed bugs lexing extended Ruby strings and regexes.
  • -
  • Fixed a bug when lexing git diffs.
  • -
  • Fixed a bug lexing the empty commit in the PHP lexer (#405).
  • -
  • Fixed a bug causing Python numbers to be mishighlighted as floats (#397).
  • -
  • Fixed a bug when backslashes are used in odd locations in Python (#395).
  • -
  • Fixed various bugs in Matlab and S-Plus lexers, thanks to Winston Chang (#410, -#411, #413, #414) and fmarc (#419).
  • -
  • Fixed a bug in Haskell single-line comment detection (#426).
  • -
  • Added new-style reStructuredText directive for docutils 0.5+ (#428).
  • -
-
-
-

Version 1.0

-

(codename Dreiundzwanzig, released Nov 23, 2008)

-
    -
  • Don't use join(splitlines()) when converting newlines to \n, -because that doesn't keep all newlines at the end when the -stripnl lexer option is False.

    -
  • -
  • Added -N option to command-line interface to get a lexer name -for a given filename.

    -
  • -
  • Added Tango style, written by Andre Roberge for the Crunchy project.

    -
  • -
  • Added Python3TracebackLexer and python3 option to -PythonConsoleLexer.

    -
  • -
  • Fixed a few bugs in the Haskell lexer.

    -
  • -
  • Fixed PythonTracebackLexer to be able to recognize SyntaxError and -KeyboardInterrupt (#360).

    -
  • -
  • Provide one formatter class per image format, so that surprises like:

    -
    -pygmentize -f gif -o foo.gif foo.py
    -
    -

    creating a PNG file are avoided.

    -
  • -
  • Actually use the font_size option of the image formatter.

    -
  • -
  • Fixed numpy lexer that it doesn't listen for *.py any longer.

    -
  • -
  • Fixed HTML formatter so that text options can be Unicode -strings (#371).

    -
  • -
  • Unified Diff lexer supports the "udiff" alias now.

    -
  • -
  • Fixed a few issues in Scala lexer (#367).

    -
  • -
  • RubyConsoleLexer now supports simple prompt mode (#363).

    -
  • -
  • JavascriptLexer is smarter about what constitutes a regex (#356).

    -
  • -
  • Add Applescript lexer, thanks to Andreas Amann (#330).

    -
  • -
  • Make the codetags more strict about matching words (#368).

    -
  • -
  • NginxConfLexer is a little more accurate on mimetypes and -variables (#370).

    -
  • -
-
-
-

Version 0.11.1

-

(released Aug 24, 2008)

-
    -
  • Fixed a Jython compatibility issue in pygments.unistring (#358).
  • -
-
-
-

Version 0.11

-

(codename Straußenei, released Aug 23, 2008)

-

Many thanks go to Tim Hatch for writing or integrating most of the bug -fixes and new features.

-
    -
  • Lexers added:
      -
    • Nasm-style assembly language, thanks to delroth
    • -
    • YAML, thanks to Kirill Simonov
    • -
    • ActionScript 3, thanks to Pierre Bourdon
    • -
    • Cheetah/Spitfire templates, thanks to Matt Good
    • -
    • Lighttpd config files
    • -
    • Nginx config files
    • -
    • Gnuplot plotting scripts
    • -
    • Clojure
    • -
    • POV-Ray scene files
    • -
    • Sqlite3 interactive console sessions
    • -
    • Scala source files, thanks to Krzysiek Goj
    • -
    -
  • -
  • Lexers improved:
      -
    • C lexer highlights standard library functions now and supports C99 -types.
    • -
    • Bash lexer now correctly highlights heredocs without preceding -whitespace.
    • -
    • Vim lexer now highlights hex colors properly and knows a couple -more keywords.
    • -
    • Irc logs lexer now handles xchat's default time format (#340) and -correctly highlights lines ending in >.
    • -
    • Support more delimiters for perl regular expressions (#258).
    • -
    • ObjectiveC lexer now supports 2.0 features.
    • -
    -
  • -
  • Added "Visual Studio" style.
  • -
  • Updated markdown processor to Markdown 1.7.
  • -
  • Support roman/sans/mono style defs and use them in the LaTeX -formatter.
  • -
  • The RawTokenFormatter is no longer registered to *.raw and it's -documented that tokenization with this lexer may raise exceptions.
  • -
  • New option hl_lines to HTML formatter, to highlight certain -lines.
  • -
  • New option prestyles to HTML formatter.
  • -
  • New option -g to pygmentize, to allow lexer guessing based on -filetext (can be slowish, so file extensions are still checked -first).
  • -
  • guess_lexer() now makes its decision much faster due to a cache -of whether data is xml-like (a check which is used in several -versions of analyse_text(). Several lexers also have more -accurate analyse_text() now.
  • -
-
-
-

Version 0.10

-

(codename Malzeug, released May 06, 2008)

-
    -
  • Lexers added:
      -
    • Io
    • -
    • Smalltalk
    • -
    • Darcs patches
    • -
    • Tcl
    • -
    • Matlab
    • -
    • Matlab sessions
    • -
    • FORTRAN
    • -
    • XSLT
    • -
    • tcsh
    • -
    • NumPy
    • -
    • Python 3
    • -
    • S, S-plus, R statistics languages
    • -
    • Logtalk
    • -
    -
  • -
  • In the LatexFormatter, the commandprefix option is now by default -'PY' instead of 'C', since the latter resulted in several collisions -with other packages. Also, the special meaning of the arg -argument to get_style_defs() was removed.
  • -
  • Added ImageFormatter, to format code as PNG, JPG, GIF or BMP. -(Needs the Python Imaging Library.)
  • -
  • Support doc comments in the PHP lexer.
  • -
  • Handle format specifications in the Perl lexer.
  • -
  • Fix comment handling in the Batch lexer.
  • -
  • Add more file name extensions for the C++, INI and XML lexers.
  • -
  • Fixes in the IRC and MuPad lexers.
  • -
  • Fix function and interface name highlighting in the Java lexer.
  • -
  • Fix at-rule handling in the CSS lexer.
  • -
  • Handle KeyboardInterrupts gracefully in pygmentize.
  • -
  • Added BlackWhiteStyle.
  • -
  • Bash lexer now correctly highlights math, does not require -whitespace after semicolons, and correctly highlights boolean -operators.
  • -
  • Makefile lexer is now capable of handling BSD and GNU make syntax.
  • -
-
-
-

Version 0.9

-

(codename Herbstzeitlose, released Oct 14, 2007)

-
    -
  • Lexers added:
      -
    • Erlang
    • -
    • ActionScript
    • -
    • Literate Haskell
    • -
    • Common Lisp
    • -
    • Various assembly languages
    • -
    • Gettext catalogs
    • -
    • Squid configuration
    • -
    • Debian control files
    • -
    • MySQL-style SQL
    • -
    • MOOCode
    • -
    -
  • -
  • Lexers improved:
      -
    • Greatly improved the Haskell and OCaml lexers.
    • -
    • Improved the Bash lexer's handling of nested constructs.
    • -
    • The C# and Java lexers exhibited abysmal performance with some -input code; this should now be fixed.
    • -
    • The IRC logs lexer is now able to colorize weechat logs too.
    • -
    • The Lua lexer now recognizes multi-line comments.
    • -
    • Fixed bugs in the D and MiniD lexer.
    • -
    -
  • -
  • The encoding handling of the command line mode (pygmentize) was -enhanced. You shouldn't get UnicodeErrors from it anymore if you -don't give an encoding option.
  • -
  • Added a -P option to the command line mode which can be used to -give options whose values contain commas or equals signs.
  • -
  • Added 256-color terminal formatter.
  • -
  • Added an experimental SVG formatter.
  • -
  • Added the lineanchors option to the HTML formatter, thanks to -Ian Charnas for the idea.
  • -
  • Gave the line numbers table a CSS class in the HTML formatter.
  • -
  • Added a Vim 7-like style.
  • -
-
-
-

Version 0.8.1

-

(released Jun 27, 2007)

-
    -
  • Fixed POD highlighting in the Ruby lexer.
  • -
  • Fixed Unicode class and namespace name highlighting in the C# lexer.
  • -
  • Fixed Unicode string prefix highlighting in the Python lexer.
  • -
  • Fixed a bug in the D and MiniD lexers.
  • -
  • Fixed the included MoinMoin parser.
  • -
-
-
-

Version 0.8

-

(codename Maikäfer, released May 30, 2007)

-
    -
  • Lexers added:
      -
    • Haskell, thanks to Adam Blinkinsop
    • -
    • Redcode, thanks to Adam Blinkinsop
    • -
    • D, thanks to Kirk McDonald
    • -
    • MuPad, thanks to Christopher Creutzig
    • -
    • MiniD, thanks to Jarrett Billingsley
    • -
    • Vim Script, by Tim Hatch
    • -
    -
  • -
  • The HTML formatter now has a second line-numbers mode in which it -will just integrate the numbers in the same <pre> tag as the -code.
  • -
  • The CSharpLexer now is Unicode-aware, which means that it has an -option that can be set so that it correctly lexes Unicode -identifiers allowed by the C# specs.
  • -
  • Added a RaiseOnErrorTokenFilter that raises an exception when the -lexer generates an error token, and a VisibleWhitespaceFilter that -converts whitespace (spaces, tabs, newlines) into visible -characters.
  • -
  • Fixed the do_insertions() helper function to yield correct -indices.
  • -
  • The ReST lexer now automatically highlights source code blocks in -".. sourcecode:: language" and ".. code:: language" directive -blocks.
  • -
  • Improved the default style (thanks to Tiberius Teng). The old -default is still available as the "emacs" style (which was an alias -before).
  • -
  • The get_style_defs method of HTML formatters now uses the -cssclass option as the default selector if it was given.
  • -
  • Improved the ReST and Bash lexers a bit.
  • -
  • Fixed a few bugs in the Makefile and Bash lexers, thanks to Tim -Hatch.
  • -
  • Fixed a bug in the command line code that disallowed -O options -when using the -S option.
  • -
  • Fixed a bug in the RawTokenFormatter.
  • -
-
-
-

Version 0.7.1

-

(released Feb 15, 2007)

-
    -
  • Fixed little highlighting bugs in the Python, Java, Scheme and -Apache Config lexers.
  • -
  • Updated the included manpage.
  • -
  • Included a built version of the documentation in the source tarball.
  • -
-
-
-

Version 0.7

-

(codename Faschingskrapfn, released Feb 14, 2007)

-
    -
  • Added a MoinMoin parser that uses Pygments. With it, you get -Pygments highlighting in Moin Wiki pages.
  • -
  • Changed the exception raised if no suitable lexer, formatter etc. is -found in one of the get_*_by_* functions to a custom exception, -pygments.util.ClassNotFound. It is, however, a subclass of -ValueError in order to retain backwards compatibility.
  • -
  • Added a -H command line option which can be used to get the -docstring of a lexer, formatter or filter.
  • -
  • Made the handling of lexers and formatters more consistent. The -aliases and filename patterns of formatters are now attributes on -them.
  • -
  • Added an OCaml lexer, thanks to Adam Blinkinsop.
  • -
  • Made the HTML formatter more flexible, and easily subclassable in -order to make it easy to implement custom wrappers, e.g. alternate -line number markup. See the documentation.
  • -
  • Added an outencoding option to all formatters, making it possible -to override the encoding (which is used by lexers and formatters) -when using the command line interface. Also, if using the terminal -formatter and the output file is a terminal and has an encoding -attribute, use it if no encoding is given.
  • -
  • Made it possible to just drop style modules into the styles -subpackage of the Pygments installation.
  • -
  • Added a "state" keyword argument to the using helper.
  • -
  • Added a commandprefix option to the LatexFormatter which allows -to control how the command names are constructed.
  • -
  • Added quite a few new lexers, thanks to Tim Hatch:
      -
    • Java Server Pages
    • -
    • Windows batch files
    • -
    • Trac Wiki markup
    • -
    • Python tracebacks
    • -
    • ReStructuredText
    • -
    • Dylan
    • -
    • and the Befunge esoteric programming language (yay!)
    • -
    -
  • -
  • Added Mako lexers by Ben Bangert.
  • -
  • Added "fruity" style, another dark background originally vim-based -theme.
  • -
  • Added sources.list lexer by Dennis Kaarsemaker.
  • -
  • Added token stream filters, and a pygmentize option to use them.
  • -
  • Changed behavior of in Operator for tokens.
  • -
  • Added mimetypes for all lexers.
  • -
  • Fixed some problems lexing Python strings.
  • -
  • Fixed tickets: #167, #178, #179, #180, #185, #201.
  • -
-
-
-

Version 0.6

-

(codename Zimtstern, released Dec 20, 2006)

-
    -
  • Added option for the HTML formatter to write the CSS to an external -file in "full document" mode.
  • -
  • Added RTF formatter.
  • -
  • Added Bash and Apache configuration lexers (thanks to Tim Hatch).
  • -
  • Improved guessing methods for various lexers.
  • -
  • Added @media support to CSS lexer (thanks to Tim Hatch).
  • -
  • Added a Groff lexer (thanks to Tim Hatch).
  • -
  • License change to BSD.
  • -
  • Added lexers for the Myghty template language.
  • -
  • Added a Scheme lexer (thanks to Marek Kubica).
  • -
  • Added some functions to iterate over existing lexers, formatters and -lexers.
  • -
  • The HtmlFormatter's get_style_defs() can now take a list as an -argument to generate CSS with multiple prefixes.
  • -
  • Support for guessing input encoding added.
  • -
  • Encoding support added: all processing is now done with Unicode -strings, input and output are converted from and optionally to byte -strings (see the encoding option of lexers and formatters).
  • -
  • Some improvements in the C(++) lexers handling comments and line -continuations.
  • -
-
-
-

Version 0.5.1

-

(released Oct 30, 2006)

-
    -
  • Fixed traceback in pygmentize -L (thanks to Piotr Ozarowski).
  • -
-
-
-

Version 0.5

-

(codename PyKleur, released Oct 30, 2006)

-
    -
  • Initial public release.
  • -
-
- -
- - - \ No newline at end of file diff --git a/docs/build/cmdline.html b/docs/build/cmdline.html deleted file mode 100644 index 51eeed5..0000000 --- a/docs/build/cmdline.html +++ /dev/null @@ -1,353 +0,0 @@ - - - - Command Line Interface — Pygments - - - - -
-

Pygments

-

Command Line Interface

- - « Back To Index - - - - - -

You can use Pygments from the shell, provided you installed the pygmentize -script:

-
-$ pygmentize test.py
-print "Hello World"
-
-

will print the file test.py to standard output, using the Python lexer -(inferred from the file name extension) and the terminal formatter (because -you didn't give an explicit formatter name).

-

If you want HTML output:

-
-$ pygmentize -f html -l python -o test.html test.py
-
-

As you can see, the -l option explicitly selects a lexer. As seen above, if you -give an input file name and it has an extension that Pygments recognizes, you can -omit this option.

-

The -o option gives an output file name. If it is not given, output is -written to stdout.

-

The -f option selects a formatter (as with -l, it can also be omitted -if an output file name is given and has a supported extension). -If no output file name is given and -f is omitted, the -TerminalFormatter is used.

-

The above command could therefore also be given as:

-
-$ pygmentize -o test.html test.py
-
-

To create a full HTML document, including line numbers and stylesheet (using the -"emacs" style), highlighting the Python file test.py to test.html:

-
-$ pygmentize -O full,style=emacs -o test.html test.py
-
-
-

Options and filters

-

Lexer and formatter options can be given using the -O option:

-
-$ pygmentize -f html -O style=colorful,linenos=1 -l python test.py
-
-

Be sure to enclose the option string in quotes if it contains any special shell -characters, such as spaces or expansion wildcards like *. If an option -expects a list value, separate the list entries with spaces (you'll have to -quote the option value in this case too, so that the shell doesn't split it).

-

Since the -O option argument is split at commas and expects the split values -to be of the form name=value, you can't give an option value that contains -commas or equals signs. Therefore, an option -P is provided (as of Pygments -0.9) that works like -O but can only pass one option per -P. Its value -can then contain all characters:

-
-$ pygmentize -P "heading=Pygments, the Python highlighter" ...
-
-

Filters are added to the token stream using the -F option:

-
-$ pygmentize -f html -l pascal -F keywordcase:case=upper main.pas
-
-

As you see, options for the filter are given after a colon. As for -O, the -filter name and options must be one shell word, so there may not be any spaces -around the colon.

-
-
-

Generating styles

-

Formatters normally don't output full style information. For example, the HTML -formatter by default only outputs <span> tags with class attributes. -Therefore, there's a special -S option for generating style definitions. -Usage is as follows:

-
-$ pygmentize -f html -S colorful -a .syntax
-
-

generates a CSS style sheet (because you selected the HTML formatter) for -the "colorful" style prepending a ".syntax" selector to all style rules.

-

For an explanation what -a means for a particular formatter, look for -the arg argument for the formatter's get_style_defs() method.

-
-
-

Getting lexer names

-

New in Pygments 1.0.

-

The -N option guesses a lexer name for a given filename, so that

-
-$ pygmentize -N setup.py
-
-

will print out python. It won't highlight anything yet. If no specific -lexer is known for that filename, text is printed.

-
-
-

Getting help

-

The -L option lists lexers, formatters, along with their short -names and supported file name extensions, styles and filters. If you want to see -only one category, give it as an argument:

-
-$ pygmentize -L filters
-
-

will list only all installed filters.

-

The -H option will give you detailed information (the same that can be found -in this documentation) about a lexer, formatter or filter. Usage is as follows:

-
-$ pygmentize -H formatter html
-
-

will print the help for the HTML formatter, while

-
-$ pygmentize -H lexer python
-
-

will print the help for the Python lexer, etc.

-
-
-

A note on encodings

-

New in Pygments 0.9.

-

Pygments tries to be smart regarding encodings in the formatting process:

-
    -
  • If you give an encoding option, it will be used as the input and -output encoding.
  • -
  • If you give an outencoding option, it will override encoding -as the output encoding.
  • -
  • If you don't give an encoding and have given an output file, the default -encoding for lexer and formatter is latin1 (which will pass through -all non-ASCII characters).
  • -
  • If you don't give an encoding and haven't given an output file (that means -output is written to the console), the default encoding for lexer and -formatter is the terminal encoding (sys.stdout.encoding).
  • -
-
- -
- - - \ No newline at end of file diff --git a/docs/build/filterdevelopment.html b/docs/build/filterdevelopment.html deleted file mode 100644 index 25ffa59..0000000 --- a/docs/build/filterdevelopment.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - Write your own filter — Pygments - - - - -
-

Pygments

-

Write your own filter

- - « Back To Index - - -
-

Contents

- -
- - -

New in Pygments 0.7.

-

Writing own filters is very easy. All you have to do is to subclass -the Filter class and override the filter method. Additionally a -filter is instanciated with some keyword arguments you can use to -adjust the behavior of your filter.

-
-

Subclassing Filters

-

As an example, we write a filter that converts all Name.Function tokens -to normal Name tokens to make the output less colorful.

-
from pygments.util import get_bool_opt
-from pygments.token import Name
-from pygments.filter import Filter
-
-class UncolorFilter(Filter):
-
-    def __init__(self, **options):
-        Filter.__init__(self, **options)
-        self.class_too = get_bool_opt(options, 'classtoo')
-
-    def filter(self, lexer, stream):
-        for ttype, value in stream:
-            if ttype is Name.Function or (self.class_too and
-                                          ttype is Name.Class):
-                ttype = Name
-            yield ttype, value
-
-

Some notes on the lexer argument: that can be quite confusing since it doesn't -need to be a lexer instance. If a filter was added by using the add_filter() -function of lexers, that lexer is registered for the filter. In that case -lexer will refer to the lexer that has registered the filter. It can be used -to access options passed to a lexer. Because it could be None you always have -to check for that case if you access it.

-
-
-

Using a decorator

-

You can also use the simplefilter decorator from the pygments.filter module:

-
from pygments.util import get_bool_opt
-from pygments.token import Name
-from pygments.filter import simplefilter
-
-
-@simplefilter
-def uncolor(lexer, stream, options):
-    class_too = get_bool_opt(options, 'classtoo')
-    for ttype, value in stream:
-        if ttype is Name.Function or (class_too and
-                                      ttype is Name.Class):
-            ttype = Name
-        yield ttype, value
-
-

The decorator automatically subclasses an internal filter class and uses the -decorated function for filtering.

-
- -
- - - \ No newline at end of file diff --git a/docs/build/filters.html b/docs/build/filters.html deleted file mode 100644 index bf1c9f5..0000000 --- a/docs/build/filters.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - Filters — Pygments - - - - -
-

Pygments

-

Filters

- - « Back To Index - - -
-

Contents

- -
- - -

New in Pygments 0.7.

-

You can filter token streams coming from lexers to improve or annotate the -output. For example, you can highlight special words in comments, convert -keywords to upper or lowercase to enforce a style guide etc.

-

To apply a filter, you can use the add_filter() method of a lexer:

-
>>> from pygments.lexers import PythonLexer
->>> l = PythonLexer()
->>> # add a filter given by a string and options
->>> l.add_filter('codetagify', case='lower')
->>> l.filters
-[<pygments.filters.CodeTagFilter object at 0xb785decc>]
->>> from pygments.filters import KeywordCaseFilter
->>> # or give an instance
->>> l.add_filter(KeywordCaseFilter(case='lower'))
-
-

The add_filter() method takes keyword arguments which are forwarded to -the constructor of the filter.

-

To get a list of all registered filters by name, you can use the -get_all_filters() function from the pygments.filters module that returns an -iterable for all known filters.

-

If you want to write your own filter, have a look at Write your own filter.

-
-

Builtin Filters

-

RaiseOnErrorTokenFilter

-
-

Raise an exception when the lexer generates an error token.

-

Options accepted:

-
-
excclass : Exception class
-
The exception class to raise. -The default is pygments.filters.ErrorToken.
-
-

New in Pygments 0.8.

- --- - - - -
Name:raiseonerror
-
-

VisibleWhitespaceFilter

-
-

Convert tabs, newlines and/or spaces to visible characters.

-

Options accepted:

-
-
spaces : string or bool
-
If this is a one-character string, spaces will be replaces by this string. -If it is another true value, spaces will be replaced by · (unicode -MIDDLE DOT). If it is a false value, spaces will not be replaced. The -default is False.
-
tabs : string or bool
-
The same as for spaces, but the default replacement character is » -(unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK). The default value -is False. Note: this will not work if the tabsize option for the -lexer is nonzero, as tabs will already have been expanded then.
-
tabsize : int
-
If tabs are to be replaced by this filter (see the tabs option), this -is the total number of characters that a tab should be expanded to. -The default is 8.
-
newlines : string or bool
-
The same as for spaces, but the default replacement character is ¶ -(unicode PILCROW SIGN). The default value is False.
-
wstokentype : bool
-
If true, give whitespace the special Whitespace token type. This allows -styling the visible whitespace differently (e.g. greyed out), but it can -disrupt background colors. The default is True.
-
-

New in Pygments 0.8.

- --- - - - -
Name:whitespace
-
-

TokenMergeFilter

-
-

Merges consecutive tokens with the same token type in the output stream of a -lexer.

-

New in Pygments 1.2.

- --- - - - -
Name:tokenmerge
-
-

NameHighlightFilter

-
-

Highlight a normal Name token with a different token type.

-

Example:

-
-filter = NameHighlightFilter(
-    names=['foo', 'bar', 'baz'],
-    tokentype=Name.Function,
-)
-
-

This would highlight the names "foo", "bar" and "baz" -as functions. Name.Function is the default token type.

-

Options accepted:

-
-
names : list of strings
-
A list of names that should be given the different token type. -There is no default.
-
tokentype : TokenType or string
-
A token type or a string containing a token type name that is -used for highlighting the strings in names. The default is -Name.Function.
-
- --- - - - -
Name:highlight
-
-

GobbleFilter

-
-

Gobbles source code lines (eats initial characters).

-

This filter drops the first n characters off every line of code. This -may be useful when the source code fed to the lexer is indented by a fixed -amount of space that isn't desired in the output.

-

Options accepted:

-
-
n : int
-
The number of characters to gobble.
-
-

New in Pygments 1.2.

- --- - - - -
Name:gobble
-
-

CodeTagFilter

-
-

Highlight special code tags in comments and docstrings.

-

Options accepted:

-
-
codetags : list of strings
-
A list of strings that are flagged as code tags. The default is to -highlight XXX, TODO, BUG and NOTE.
-
- --- - - - -
Name:codetagify
-
-

KeywordCaseFilter

-
-

Convert keywords to lowercase or uppercase or capitalize them, which -means first letter uppercase, rest lowercase.

-

This can be useful e.g. if you highlight Pascal code and want to adapt the -code to your styleguide.

-

Options accepted:

-
-
case : string
-
The casing to convert keywords to. Must be one of 'lower', -'upper' or 'capitalize'. The default is 'lower'.
-
- --- - - - -
Name:keywordcase
-
-
- -
- - - \ No newline at end of file diff --git a/docs/build/formatterdevelopment.html b/docs/build/formatterdevelopment.html deleted file mode 100644 index 1485dd1..0000000 --- a/docs/build/formatterdevelopment.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - Write your own formatter — Pygments - - - - -
-

Pygments

-

Write your own formatter

- - « Back To Index - - - - - -

As well as creating your own lexer, writing a new -formatter for Pygments is easy and straightforward.

-

A formatter is a class that is initialized with some keyword arguments (the -formatter options) and that must provides a format() method. -Additionally a formatter should provide a get_style_defs() method that -returns the style definitions from the style in a form usable for the -formatter's output format.

-
-

Quickstart

-

The most basic formatter shipped with Pygments is the NullFormatter. It just -sends the value of a token to the output stream:

-
from pygments.formatter import Formatter
-
-class NullFormatter(Formatter):
-    def format(self, tokensource, outfile):
-        for ttype, value in tokensource:
-            outfile.write(value)
-
-

As you can see, the format() method is passed two parameters: tokensource -and outfile. The first is an iterable of (token_type, value) tuples, -the latter a file like object with a write() method.

-

Because the formatter is that basic it doesn't overwrite the get_style_defs() -method.

-
-
-

Styles

-

Styles aren't instantiated but their metaclass provides some class functions -so that you can access the style definitions easily.

-

Styles are iterable and yield tuples in the form (ttype, d) where ttype -is a token and d is a dict with the following keys:

-
-
'color'
-
Hexadecimal color value (eg: 'ff0000' for red) or None if not -defined.
-
'bold'
-
True if the value should be bold
-
'italic'
-
True if the value should be italic
-
'underline'
-
True if the value should be underlined
-
'bgcolor'
-
Hexadecimal color value for the background (eg: 'eeeeeee' for light -gray) or None if not defined.
-
'border'
-
Hexadecimal color value for the border (eg: '0000aa' for a dark -blue) or None for no border.
-
-

Additional keys might appear in the future, formatters should ignore all keys -they don't support.

-
-
-

HTML 3.2 Formatter

-

For an more complex example, let's implement a HTML 3.2 Formatter. We don't -use CSS but inline markup (<u>, <font>, etc). Because this isn't good -style this formatter isn't in the standard library ;-)

-
from pygments.formatter import Formatter
-
-class OldHtmlFormatter(Formatter):
-
-    def __init__(self, **options):
-        Formatter.__init__(self, **options)
-
-        # create a dict of (start, end) tuples that wrap the
-        # value of a token so that we can use it in the format
-        # method later
-        self.styles = {}
-
-        # we iterate over the `_styles` attribute of a style item
-        # that contains the parsed style values.
-        for token, style in self.style:
-            start = end = ''
-            # a style item is a tuple in the following form:
-            # colors are readily specified in hex: 'RRGGBB'
-            if style['color']:
-                start += '<font color="#%s">' % style['color']
-                end = '</font>' + end
-            if style['bold']:
-                start += '<b>'
-                end = '</b>' + end
-            if style['italic']:
-                start += '<i>'
-                end = '</i>' + end
-            if style['underline']:
-                start += '<u>'
-                end = '</u>' + end
-            self.styles[token] = (start, end)
-
-    def format(self, tokensource, outfile):
-        # lastval is a string we use for caching
-        # because it's possible that an lexer yields a number
-        # of consecutive tokens with the same token type.
-        # to minimize the size of the generated html markup we
-        # try to join the values of same-type tokens here
-        lastval = ''
-        lasttype = None
-
-        # wrap the whole output with <pre>
-        outfile.write('<pre>')
-
-        for ttype, value in tokensource:
-            # if the token type doesn't exist in the stylemap
-            # we try it with the parent of the token type
-            # eg: parent of Token.Literal.String.Double is
-            # Token.Literal.String
-            while ttype not in self.styles:
-                ttype = ttype.parent
-            if ttype == lasttype:
-                # the current token type is the same of the last
-                # iteration. cache it
-                lastval += value
-            else:
-                # not the same token as last iteration, but we
-                # have some data in the buffer. wrap it with the
-                # defined style and write it to the output file
-                if lastval:
-                    stylebegin, styleend = self.styles[lasttype]
-                    outfile.write(stylebegin + lastval + styleend)
-                # set lastval/lasttype to current values
-                lastval = value
-                lasttype = ttype
-
-        # if something is left in the buffer, write it to the
-        # output file, then close the opened <pre> tag
-        if lastval:
-            stylebegin, styleend = self.styles[lasttype]
-            outfile.write(stylebegin + lastval + styleend)
-        outfile.write('</pre>\n')
-
-

The comments should explain it. Again, this formatter doesn't override the -get_style_defs() method. If we would have used CSS classes instead of -inline HTML markup, we would need to generate the CSS first. For that -purpose the get_style_defs() method exists:

-
-
-

Generating Style Definitions

-

Some formatters like the LatexFormatter and the HtmlFormatter don't -output inline markup but reference either macros or css classes. Because -the definitions of those are not part of the output, the get_style_defs() -method exists. It is passed one parameter (if it's used and how it's used -is up to the formatter) and has to return a string or None.

-
- -
- - - \ No newline at end of file diff --git a/docs/build/formatters.html b/docs/build/formatters.html deleted file mode 100644 index 02bfa5c..0000000 --- a/docs/build/formatters.html +++ /dev/null @@ -1,927 +0,0 @@ - - - - Available formatters — Pygments - - - - -
-

Pygments

-

Available formatters

- - « Back To Index - - -
-

Contents

- -
- - -

This page lists all builtin formatters.

-
-

Common options

-

All formatters support these options:

-
-
encoding
-

New in Pygments 0.6.

-

If given, must be an encoding name (such as "utf-8"). This will -be used to convert the token strings (which are Unicode strings) -to byte strings in the output (default: None). -It will also be written in an encoding declaration suitable for the -document format if the full option is given (e.g. a meta -content-type directive in HTML or an invocation of the inputenc -package in LaTeX).

-

If this is "" or None, Unicode strings will be written -to the output file, which most file-like objects do not support. -For example, pygments.highlight() will return a Unicode string if -called with no outfile argument and a formatter that has encoding -set to None because it uses a StringIO.StringIO object that -supports Unicode arguments to write(). Using a regular file object -wouldn't work.

-
-
outencoding
-

New in Pygments 0.7.

-

When using Pygments from the command line, any encoding option given is -passed to the lexer and the formatter. This is sometimes not desirable, -for example if you want to set the input encoding to "guess". -Therefore, outencoding has been introduced which overrides encoding -for the formatter if given.

-
-
-
-
-

Formatter classes

-

All these classes are importable from pygments.formatters.

-
-

BBCodeFormatter

-
-

Format tokens with BBcodes. These formatting codes are used by many -bulletin boards, so you can highlight your sourcecode with pygments before -posting it there.

-

This formatter has no support for background colors and borders, as there -are no common BBcode tags for that.

-

Some board systems (e.g. phpBB) don't support colors in their [code] tag, -so you can't use the highlighting together with that tag. -Text in a [code] tag usually is shown with a monospace font (which this -formatter can do with the monofont option) and no spaces (which you -need for indentation) are removed.

-

Additional options accepted:

-
-
style
-
The style to use, can be a string or a Style subclass (default: -'default').
-
codetag
-
If set to true, put the output into [code] tags (default: -false)
-
monofont
-
If set to true, add a tag to show the code with a monospace font -(default: false).
-
- --- - - - - - -
Short names:bbcode, bb
Filename patterns:None
-
-
-
-

BmpImageFormatter

-
-

Create a bitmap image from source code. This uses the Python Imaging Library to -generate a pixmap from the source code.

-

New in Pygments 1.0. (You could create bitmap images before by passing a -suitable image_format option to the ImageFormatter.)

- --- - - - - - -
Short names:bmp, bitmap
Filename patterns:*.bmp
-
-
-
-

GifImageFormatter

-
-

Create a GIF image from source code. This uses the Python Imaging Library to -generate a pixmap from the source code.

-

New in Pygments 1.0. (You could create GIF images before by passing a -suitable image_format option to the ImageFormatter.)

- --- - - - - - -
Short names:gif
Filename patterns:*.gif
-
-
-
-

HtmlFormatter

-
-

Format tokens as HTML 4 <span> tags within a <pre> tag, wrapped -in a <div> tag. The <div>'s CSS class can be set by the cssclass -option.

-

If the linenos option is set to "table", the <pre> is -additionally wrapped inside a <table> which has one row and two -cells: one containing the line numbers and one containing the code. -Example:

-
<div class="highlight" >
-<table><tr>
-  <td class="linenos" title="click to toggle"
-    onclick="with (this.firstChild.style)
-             { display = (display == '') ? 'none' : '' }">
-    <pre>1
-    2</pre>
-  </td>
-  <td class="code">
-    <pre><span class="Ke">def </span><span class="NaFu">foo</span>(bar):
-      <span class="Ke">pass</span>
-    </pre>
-  </td>
-</tr></table></div>
-
-

(whitespace added to improve clarity).

-

Wrapping can be disabled using the nowrap option.

-

A list of lines can be specified using the hl_lines option to make these -lines highlighted (as of Pygments 0.11).

-

With the full option, a complete HTML 4 document is output, including -the style definitions inside a <style> tag, or in a separate file if -the cssfile option is given.

-

When tagsfile is set to the path of a ctags index file, it is used to -generate hyperlinks from names to their definition. You must enable -anchorlines and run ctags with the -n option for this to work. The -python-ctags module from PyPI must be installed to use this feature; -otherwise a RuntimeError will be raised.

-

The get_style_defs(arg='') method of a HtmlFormatter returns a string -containing CSS rules for the CSS classes used by the formatter. The -argument arg can be used to specify additional CSS selectors that -are prepended to the classes. A call fmter.get_style_defs('td .code') -would result in the following CSS classes:

-
td .code .kw { font-weight: bold; color: #00FF00 }
-td .code .cm { color: #999999 }
-...
-
-

If you have Pygments 0.6 or higher, you can also pass a list or tuple to the -get_style_defs() method to request multiple prefixes for the tokens:

-
formatter.get_style_defs(['div.syntax pre', 'pre.syntax'])
-
-

The output would then look like this:

-
div.syntax pre .kw,
-pre.syntax .kw { font-weight: bold; color: #00FF00 }
-div.syntax pre .cm,
-pre.syntax .cm { color: #999999 }
-...
-
-

Additional options accepted:

-
-
nowrap
-
If set to True, don't wrap the tokens at all, not even inside a <pre> -tag. This disables most other options (default: False).
-
full
-
Tells the formatter to output a "full" document, i.e. a complete -self-contained document (default: False).
-
title
-
If full is true, the title that should be used to caption the -document (default: '').
-
style
-
The style to use, can be a string or a Style subclass (default: -'default'). This option has no effect if the cssfile -and noclobber_cssfile option are given and the file specified in -cssfile exists.
-
noclasses
-
If set to true, token <span> tags will not use CSS classes, but -inline styles. This is not recommended for larger pieces of code since -it increases output size by quite a bit (default: False).
-
classprefix
-
Since the token types use relatively short class names, they may clash -with some of your own class names. In this case you can use the -classprefix option to give a string to prepend to all Pygments-generated -CSS class names for token types. -Note that this option also affects the output of get_style_defs().
-
cssclass
-

CSS class for the wrapping <div> tag (default: 'highlight'). -If you set this option, the default selector for get_style_defs() -will be this class.

-

New in Pygments 0.9: If you select the 'table' line numbers, the -wrapping table will have a CSS class of this string plus 'table', -the default is accordingly 'highlighttable'.

-
-
cssstyles
-
Inline CSS styles for the wrapping <div> tag (default: '').
-
prestyles
-
Inline CSS styles for the <pre> tag (default: ''). New in -Pygments 0.11.
-
cssfile
-
If the full option is true and this option is given, it must be the -name of an external file. If the filename does not include an absolute -path, the file's path will be assumed to be relative to the main output -file's path, if the latter can be found. The stylesheet is then written -to this file instead of the HTML file. New in Pygments 0.6.
-
noclobber_cssfile
-
If cssfile is given and the specified file exists, the css file will -not be overwritten. This allows the use of the full option in -combination with a user specified css file. Default is False. -New in Pygments 1.1.
-
linenos
-

If set to 'table', output line numbers as a table with two cells, -one containing the line numbers, the other the whole code. This is -copy-and-paste-friendly, but may cause alignment problems with some -browsers or fonts. If set to 'inline', the line numbers will be -integrated in the <pre> tag that contains the code (that setting -is new in Pygments 0.8).

-

For compatibility with Pygments 0.7 and earlier, every true value -except 'inline' means the same as 'table' (in particular, that -means also True).

-

The default value is False, which means no line numbers at all.

-

Note: with the default ("table") line number mechanism, the line -numbers and code can have different line heights in Internet Explorer -unless you give the enclosing <pre> tags an explicit line-height -CSS property (you get the default line spacing with line-height: -125%).

-
-
hl_lines
-
Specify a list of lines to be highlighted. New in Pygments 0.11.
-
linenostart
-
The line number for the first line (default: 1).
-
linenostep
-
If set to a number n > 1, only every nth line number is printed.
-
linenospecial
-
If set to a number n > 0, every nth line number is given the CSS -class "special" (default: 0).
-
nobackground
-
If set to True, the formatter won't output the background color -for the wrapping element (this automatically defaults to False -when there is no wrapping element [eg: no argument for the -get_syntax_defs method given]) (default: False). New in -Pygments 0.6.
-
lineseparator
-
This string is output between lines of code. It defaults to "\n", -which is enough to break a line inside <pre> tags, but you can -e.g. set it to "<br>" to get HTML line breaks. New in Pygments -0.7.
-
lineanchors
-
If set to a nonempty string, e.g. foo, the formatter will wrap each -output line in an anchor tag with a name of foo-linenumber. -This allows easy linking to certain lines. New in Pygments 0.9.
-
linespans
-
If set to a nonempty string, e.g. foo, the formatter will wrap each -output line in a span tag with an id of foo-linenumber. -This allows easy access to lines via javascript. New in Pygments 1.6.
-
anchorlinenos
-
If set to True, will wrap line numbers in <a> tags. Used in -combination with linenos and lineanchors.
-
tagsfile
-
If set to the path of a ctags file, wrap names in anchor tags that -link to their definitions. lineanchors should be used, and the -tags file should specify line numbers (see the -n option to ctags). -New in Pygments 1.6.
-
tagurlformat
-
A string formatting pattern used to generate links to ctags definitions. -Avaliabe variable are %(path)s, %(fname)s and %(fext)s. -Defaults to an empty string, resulting in just #prefix-number links. -New in Pygments 1.6.
-
-

Subclassing the HTML formatter

-

New in Pygments 0.7.

-

The HTML formatter is now built in a way that allows easy subclassing, thus -customizing the output HTML code. The format() method calls -self._format_lines() which returns a generator that yields tuples of (1, -line), where the 1 indicates that the line is a line of the -formatted source code.

-

If the nowrap option is set, the generator is the iterated over and the -resulting HTML is output.

-

Otherwise, format() calls self.wrap(), which wraps the generator with -other generators. These may add some HTML code to the one generated by -_format_lines(), either by modifying the lines generated by the latter, -then yielding them again with (1, line), and/or by yielding other HTML -code before or after the lines, with (0, html). The distinction between -source lines and other code makes it possible to wrap the generator multiple -times.

-

The default wrap() implementation adds a <div> and a <pre> tag.

-

A custom HtmlFormatter subclass could look like this:

-
class CodeHtmlFormatter(HtmlFormatter):
-
-    def wrap(self, source, outfile):
-        return self._wrap_code(source)
-
-    def _wrap_code(self, source):
-        yield 0, '<code>'
-        for i, t in source:
-            if i == 1:
-                # it's a line of formatted code
-                t += '<br>'
-            yield i, t
-        yield 0, '</code>'
-
-

This results in wrapping the formatted lines with a <code> tag, where the -source lines are broken using <br> tags.

-

After calling wrap(), the format() method also adds the "line numbers" -and/or "full document" wrappers if the respective options are set. Then, all -HTML yielded by the wrapped generator is output.

- --- - - - - - -
Short names:html
Filename patterns:*.html, *.htm
-
-
-
-

ImageFormatter

-
-

Create a PNG image from source code. This uses the Python Imaging Library to -generate a pixmap from the source code.

-

New in Pygments 0.10.

-

Additional options accepted:

-
-
image_format
-

An image format to output to that is recognised by PIL, these include:

-
    -
  • "PNG" (default)
  • -
  • "JPEG"
  • -
  • "BMP"
  • -
  • "GIF"
  • -
-
-
line_pad
-

The extra spacing (in pixels) between each line of text.

-

Default: 2

-
-
font_name
-

The font name to be used as the base font from which others, such as -bold and italic fonts will be generated. This really should be a -monospace font to look sane.

-

Default: "Bitstream Vera Sans Mono"

-
-
font_size
-

The font size in points to be used.

-

Default: 14

-
-
image_pad
-

The padding, in pixels to be used at each edge of the resulting image.

-

Default: 10

-
-
line_numbers
-

Whether line numbers should be shown: True/False

-

Default: True

-
-
line_number_start
-

The line number of the first line.

-

Default: 1

-
-
line_number_step
-

The step used when printing line numbers.

-

Default: 1

-
-
line_number_bg
-

The background colour (in "#123456" format) of the line number bar, or -None to use the style background color.

-

Default: "#eed"

-
-
line_number_fg
-

The text color of the line numbers (in "#123456"-like format).

-

Default: "#886"

-
-
line_number_chars
-

The number of columns of line numbers allowable in the line number -margin.

-

Default: 2

-
-
line_number_bold
-

Whether line numbers will be bold: True/False

-

Default: False

-
-
line_number_italic
-

Whether line numbers will be italicized: True/False

-

Default: False

-
-
line_number_separator
-

Whether a line will be drawn between the line number area and the -source code area: True/False

-

Default: True

-
-
line_number_pad
-

The horizontal padding (in pixels) between the line number margin, and -the source code area.

-

Default: 6

-
-
hl_lines
-

Specify a list of lines to be highlighted. New in Pygments 1.2.

-

Default: empty list

-
-
hl_color
-

Specify the color for highlighting lines. New in Pygments 1.2.

-

Default: highlight color of the selected style

-
-
- --- - - - - - -
Short names:img, IMG, png
Filename patterns:*.png
-
-
-
-

JpgImageFormatter

-
-

Create a JPEG image from source code. This uses the Python Imaging Library to -generate a pixmap from the source code.

-

New in Pygments 1.0. (You could create JPEG images before by passing a -suitable image_format option to the ImageFormatter.)

- --- - - - - - -
Short names:jpg, jpeg
Filename patterns:*.jpg
-
-
-
-

LatexFormatter

-
-

Format tokens as LaTeX code. This needs the fancyvrb and color -standard packages.

-

Without the full option, code is formatted as one Verbatim -environment, like this:

-
\begin{Verbatim}[commandchars=\\{\}]
-\PY{k}{def }\PY{n+nf}{foo}(\PY{n}{bar}):
-    \PY{k}{pass}
-\end{Verbatim}
-
-

The special command used here (\PY) and all the other macros it needs -are output by the get_style_defs method.

-

With the full option, a complete LaTeX document is output, including -the command definitions in the preamble.

-

The get_style_defs() method of a LatexFormatter returns a string -containing \def commands defining the macros needed inside the -Verbatim environments.

-

Additional options accepted:

-
-
style
-
The style to use, can be a string or a Style subclass (default: -'default').
-
full
-
Tells the formatter to output a "full" document, i.e. a complete -self-contained document (default: False).
-
title
-
If full is true, the title that should be used to caption the -document (default: '').
-
docclass
-
If the full option is enabled, this is the document class to use -(default: 'article').
-
preamble
-
If the full option is enabled, this can be further preamble commands, -e.g. \usepackage (default: '').
-
linenos
-
If set to True, output line numbers (default: False).
-
linenostart
-
The line number for the first line (default: 1).
-
linenostep
-
If set to a number n > 1, only every nth line number is printed.
-
verboptions
-
Additional options given to the Verbatim environment (see the fancyvrb -docs for possible values) (default: '').
-
commandprefix
-

The LaTeX commands used to produce colored output are constructed -using this prefix and some letters (default: 'PY'). -New in Pygments 0.7.

-

New in Pygments 0.10: the default is now 'PY' instead of 'C'.

-
-
texcomments
-
If set to True, enables LaTeX comment lines. That is, LaTex markup -in comment tokens is not escaped so that LaTeX can render it (default: -False). New in Pygments 1.2.
-
mathescape
-
If set to True, enables LaTeX math mode escape in comments. That -is, '$...$' inside a comment will trigger math mode (default: -False). New in Pygments 1.2.
-
- --- - - - - - -
Short names:latex, tex
Filename patterns:*.tex
-
-
-
-

NullFormatter

-
-

Output the text unchanged without any formatting.

- --- - - - - - -
Short names:text, null
Filename patterns:*.txt
-
-
-
-

RawTokenFormatter

-
-

Format tokens as a raw representation for storing token streams.

-

The format is tokentype<TAB>repr(tokenstring)\n. The output can later -be converted to a token stream with the RawTokenLexer, described in the -lexer list.

-

Only two options are accepted:

-
-
compress
-
If set to 'gz' or 'bz2', compress the output with the given -compression algorithm after encoding (default: '').
-
error_color
-
If set to a color name, highlight error tokens using that color. If -set but with no value, defaults to 'red'. -New in Pygments 0.11.
-
- --- - - - - - -
Short names:raw, tokens
Filename patterns:*.raw
-
-
-
-

RtfFormatter

-
-

Format tokens as RTF markup. This formatter automatically outputs full RTF -documents with color information and other useful stuff. Perfect for Copy and -Paste into Microsoft® Word® documents.

-

New in Pygments 0.6.

-

Additional options accepted:

-
-
style
-
The style to use, can be a string or a Style subclass (default: -'default').
-
fontface
-
The used font famliy, for example Bitstream Vera Sans. Defaults to -some generic font which is supposed to have fixed width.
-
- --- - - - - - -
Short names:rtf
Filename patterns:*.rtf
-
-
-
-

SvgFormatter

-
-

Format tokens as an SVG graphics file. This formatter is still experimental. -Each line of code is a <text> element with explicit x and y -coordinates containing <tspan> elements with the individual token styles.

-

By default, this formatter outputs a full SVG document including doctype -declaration and the <svg> root element.

-

New in Pygments 0.9.

-

Additional options accepted:

-
-
nowrap
-
Don't wrap the SVG <text> elements in <svg><g> elements and -don't add a XML declaration and a doctype. If true, the fontfamily -and fontsize options are ignored. Defaults to False.
-
fontfamily
-
The value to give the wrapping <g> element's font-family -attribute, defaults to "monospace".
-
fontsize
-
The value to give the wrapping <g> element's font-size -attribute, defaults to "14px".
-
xoffset
-
Starting offset in X direction, defaults to 0.
-
yoffset
-
Starting offset in Y direction, defaults to the font size if it is given -in pixels, or 20 else. (This is necessary since text coordinates -refer to the text baseline, not the top edge.)
-
ystep
-
Offset to add to the Y coordinate for each subsequent line. This should -roughly be the text size plus 5. It defaults to that value if the text -size is given in pixels, or 25 else.
-
spacehack
-
Convert spaces in the source to &#160;, which are non-breaking -spaces. SVG provides the xml:space attribute to control how -whitespace inside tags is handled, in theory, the preserve value -could be used to keep all whitespace as-is. However, many current SVG -viewers don't obey that rule, so this option is provided as a workaround -and defaults to True.
-
- --- - - - - - -
Short names:svg
Filename patterns:*.svg
-
-
-
-

Terminal256Formatter

-
-

Format tokens with ANSI color sequences, for output in a 256-color -terminal or console. Like in TerminalFormatter color sequences -are terminated at newlines, so that paging the output works correctly.

-

The formatter takes colors from a style defined by the style option -and converts them to nearest ANSI 256-color escape sequences. Bold and -underline attributes from the style are preserved (and displayed).

-

New in Pygments 0.9.

-

Options accepted:

-
-
style
-
The style to use, can be a string or a Style subclass (default: -'default').
-
- --- - - - - - -
Short names:terminal256, console256, 256
Filename patterns:None
-
-
-
-

TerminalFormatter

-
-

Format tokens with ANSI color sequences, for output in a text console. -Color sequences are terminated at newlines, so that paging the output -works correctly.

-

The get_style_defs() method doesn't do anything special since there is -no support for common styles.

-

Options accepted:

-
-
bg
-
Set to "light" or "dark" depending on the terminal's background -(default: "light").
-
colorscheme
-
A dictionary mapping token types to (lightbg, darkbg) color names or -None (default: None = use builtin colorscheme).
-
- --- - - - - - -
Short names:terminal, console
Filename patterns:None
-
-
-
- -
- - - \ No newline at end of file diff --git a/docs/build/index.html b/docs/build/index.html deleted file mode 100644 index 6ab5fd9..0000000 --- a/docs/build/index.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - Overview — Pygments - - - - -
-

Pygments

-

Overview

- - - -

Welcome to the Pygments documentation.

- -
-

If you find bugs or have suggestions for the documentation, please -look here for info on how to contact the team.

-

You can download an offline version of this documentation from the -download page.

- -
- - - \ No newline at end of file diff --git a/docs/build/installation.html b/docs/build/installation.html deleted file mode 100644 index 6c32f77..0000000 --- a/docs/build/installation.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - Installation — Pygments - - - - -
-

Pygments

-

Installation

- - « Back To Index - - - - - -

Pygments requires at least Python 2.4 to work correctly. Just to clarify: -there won't ever be support for Python versions below 2.4. However, there -are no other dependencies.

-
-

Installing a released version

-
-

As a Python egg (via easy_install)

-

You can install the most recent Pygments version using easy_install:

-
-sudo easy_install Pygments
-
-

This will install a Pygments egg in your Python installation's site-packages -directory.

-
-
-

From the tarball release

-
    -
  1. Download the most recent tarball from the download page
  2. -
  3. Unpack the tarball
  4. -
  5. sudo python setup.py install
  6. -
-

Note that the last command will automatically download and install -setuptools if you don't already have it installed. This requires a working -internet connection.

-

This will install Pygments into your Python installation's site-packages directory.

-
-
-
-

Installing the development version

-
-

If you want to play around with the code

-
    -
  1. Install Mercurial
  2. -
  3. hg clone http://bitbucket.org/birkenfeld/pygments-main pygments
  4. -
  5. cd pygments
  6. -
  7. ln -s pygments /usr/lib/python2.X/site-packages
  8. -
  9. ln -s pygmentize /usr/local/bin
  10. -
-

As an alternative to steps 4 and 5 you can also do python setup.py develop -which will install the package via setuptools in development mode.

- -
-
- -
- - - \ No newline at end of file diff --git a/docs/build/integrate.html b/docs/build/integrate.html deleted file mode 100644 index 3b7ddc7..0000000 --- a/docs/build/integrate.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - Using Pygments in various scenarios — Pygments - - - - -
-

Pygments

-

Using Pygments in various scenarios

- - « Back To Index - - -
-

Contents

- -
- - -
-

PyGtk

-

Armin has written a piece of sample code that shows how to create a Gtk -TextBuffer object containing Pygments-highlighted text.

-

See the article here: http://lucumr.pocoo.org/cogitations/2007/05/30/pygments-gtk-rendering/

-
-
-

Wordpress

-

He also has a snippet that shows how to use Pygments in WordPress:

-

http://lucumr.pocoo.org/cogitations/2007/05/30/pygments-in-wordpress/

-
-
-

Markdown

-

Since Pygments 0.9, the distribution ships Markdown preprocessor sample code -that uses Pygments to render source code in external/markdown-processor.py. -You can copy and adapt it to your liking.

-
-
-

TextMate

-

Antonio Cangiano has created a Pygments bundle for TextMate that allows to -colorize code via a simple menu option. It can be found here.

-
-
-

Bash completion

-

The source distribution contains a file external/pygments.bashcomp that -sets up completion for the pygmentize command in bash.

-
-
-

Java

-

See the Java quickstart document.

-
- -
- - - \ No newline at end of file diff --git a/docs/build/java.html b/docs/build/java.html deleted file mode 100644 index af0b6e1..0000000 --- a/docs/build/java.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - Use Pygments in Java — Pygments - - - - -
-

Pygments

-

Use Pygments in Java

- - « Back To Index - - -

Thanks to Jython it is possible to use Pygments in -Java.

-

This page is a simple tutorial to get an idea of how this is working. You can -then look at the Jython documentation for more -advanced use.

-

Since version 1.5, Pygments is deployed on Maven Central as a JAR so is Jython -which makes it a lot easier to create the Java project.

-

Here is an example of a Maven pom.xml file for a -project running Pygments:

-
<?xml version="1.0" encoding="UTF-8"?>
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-                             http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>example</groupId>
-  <artifactId>example</artifactId>
-  <version>1.0-SNAPSHOT</version>
-  <dependencies>
-    <dependency>
-      <groupId>org.python</groupId>
-      <artifactId>jython-standalone</artifactId>
-      <version>2.5.3</version>
-    </dependency>
-    <dependency>
-      <groupId>org.pygments</groupId>
-      <artifactId>pygments</artifactId>
-      <version>1.5</version>
-      <scope>runtime</scope>
-    </dependency>
-  </dependencies>
-</project>
-
-

The following Java example:

-
PythonInterpreter interpreter = new PythonInterpreter();
-
-// Set a variable with the content you want to work with
-interpreter.set("code", code);
-
-// Simple use Pygments as you would in Python
-interpreter.exec("from pygments import highlight\n"
-    + "from pygments.lexers import PythonLexer\n"
-    + "from pygments.formatters import HtmlFormatter\n"
-    + "\nresult = highlight(code, PythonLexer(), HtmlFormatter())");
-
-// Get the result that has been set in a variable
-System.out.println(interpreter.get("result", String.class));
-
-

will print something like:

-
<div class="highlight">
-<pre><span class="k">print</span> <span class="s">&quot;Hello World&quot;</span></pre>
-</div>
-
- -
- - - \ No newline at end of file diff --git a/docs/build/lexerdevelopment.html b/docs/build/lexerdevelopment.html deleted file mode 100644 index 3352d48..0000000 --- a/docs/build/lexerdevelopment.html +++ /dev/null @@ -1,691 +0,0 @@ - - - - Write your own lexer — Pygments - - - - -
-

Pygments

-

Write your own lexer

- - « Back To Index - - - - - -

If a lexer for your favorite language is missing in the Pygments package, you can -easily write your own and extend Pygments.

-

All you need can be found inside the pygments.lexer module. As you can read in -the API documentation, a lexer is a class that is initialized with -some keyword arguments (the lexer options) and that provides a -get_tokens_unprocessed() method which is given a string or unicode object with -the data to parse.

-

The get_tokens_unprocessed() method must return an iterator or iterable -containing tuples in the form (index, token, value). Normally you don't need -to do this since there are numerous base lexers you can subclass.

-
-

RegexLexer

-

A very powerful (but quite easy to use) lexer is the RegexLexer. This lexer -base class allows you to define lexing rules in terms of regular expressions -for different states.

-

States are groups of regular expressions that are matched against the input -string at the current position. If one of these expressions matches, a -corresponding action is performed (normally yielding a token with a specific -type), the current position is set to where the last match ended and the -matching process continues with the first regex of the current state.

-

Lexer states are kept in a state stack: each time a new state is entered, the -new state is pushed onto the stack. The most basic lexers (like the -DiffLexer) just need one state.

-

Each state is defined as a list of tuples in the form (regex, action, -new_state) where the last item is optional. In the most basic form, action -is a token type (like Name.Builtin). That means: When regex matches, emit a -token with the match text and type tokentype and push new_state on the state -stack. If the new state is '#pop', the topmost state is popped from the -stack instead. (To pop more than one state, use '#pop:2' and so on.) -'#push' is a synonym for pushing the current state on the -stack.

-

The following example shows the DiffLexer from the builtin lexers. Note that -it contains some additional attributes name, aliases and filenames which -aren't required for a lexer. They are used by the builtin lexer lookup -functions.

-
from pygments.lexer import RegexLexer
-from pygments.token import *
-
-class DiffLexer(RegexLexer):
-    name = 'Diff'
-    aliases = ['diff']
-    filenames = ['*.diff']
-
-    tokens = {
-        'root': [
-            (r' .*\n', Text),
-            (r'\+.*\n', Generic.Inserted),
-            (r'-.*\n', Generic.Deleted),
-            (r'@.*\n', Generic.Subheading),
-            (r'Index.*\n', Generic.Heading),
-            (r'=.*\n', Generic.Heading),
-            (r'.*\n', Text),
-        ]
-    }
-
-

As you can see this lexer only uses one state. When the lexer starts scanning -the text, it first checks if the current character is a space. If this is true -it scans everything until newline and returns the parsed data as Text token.

-

If this rule doesn't match, it checks if the current char is a plus sign. And -so on.

-

If no rule matches at the current position, the current char is emitted as an -Error token that indicates a parsing error, and the position is increased by -1.

-
-
-

Regex Flags

-

You can either define regex flags in the regex (r'(?x)foo bar') or by adding -a flags attribute to your lexer class. If no attribute is defined, it defaults -to re.MULTILINE. For more informations about regular expression flags see the -regular expressions help page in the python documentation.

-
-
-

Scanning multiple tokens at once

-

Here is a more complex lexer that highlights INI files. INI files consist of -sections, comments and key = value pairs:

-
from pygments.lexer import RegexLexer, bygroups
-from pygments.token import *
-
-class IniLexer(RegexLexer):
-    name = 'INI'
-    aliases = ['ini', 'cfg']
-    filenames = ['*.ini', '*.cfg']
-
-    tokens = {
-        'root': [
-            (r'\s+', Text),
-            (r';.*?$', Comment),
-            (r'\[.*?\]$', Keyword),
-            (r'(.*?)(\s*)(=)(\s*)(.*?)$',
-             bygroups(Name.Attribute, Text, Operator, Text, String))
-        ]
-    }
-
-

The lexer first looks for whitespace, comments and section names. And later it -looks for a line that looks like a key, value pair, separated by an '=' -sign, and optional whitespace.

-

The bygroups helper makes sure that each group is yielded with a different -token type. First the Name.Attribute token, then a Text token for the -optional whitespace, after that a Operator token for the equals sign. Then a -Text token for the whitespace again. The rest of the line is returned as -String.

-

Note that for this to work, every part of the match must be inside a capturing -group (a (...)), and there must not be any nested capturing groups. If you -nevertheless need a group, use a non-capturing group defined using this syntax: -r'(?:some|words|here)' (note the ?: after the beginning parenthesis).

-

If you find yourself needing a capturing group inside the regex which -shouldn't be part of the output but is used in the regular expressions for -backreferencing (eg: r'(<(foo|bar)>)(.*?)(</\2>)'), you can pass None -to the bygroups function and it will skip that group will be skipped in the -output.

-
-
-

Changing states

-

Many lexers need multiple states to work as expected. For example, some -languages allow multiline comments to be nested. Since this is a recursive -pattern it's impossible to lex just using regular expressions.

-

Here is the solution:

-
from pygments.lexer import RegexLexer
-from pygments.token import *
-
-class ExampleLexer(RegexLexer):
-    name = 'Example Lexer with states'
-
-    tokens = {
-        'root': [
-            (r'[^/]+', Text),
-            (r'/\*', Comment.Multiline, 'comment'),
-            (r'//.*?$', Comment.Singleline),
-            (r'/', Text)
-        ],
-        'comment': [
-            (r'[^*/]', Comment.Multiline),
-            (r'/\*', Comment.Multiline, '#push'),
-            (r'\*/', Comment.Multiline, '#pop'),
-            (r'[*/]', Comment.Multiline)
-        ]
-    }
-
-

This lexer starts lexing in the 'root' state. It tries to match as much as -possible until it finds a slash ('/'). If the next character after the slash -is a star ('*') the RegexLexer sends those two characters to the output -stream marked as Comment.Multiline and continues parsing with the rules -defined in the 'comment' state.

-

If there wasn't a star after the slash, the RegexLexer checks if it's a -singleline comment (eg: followed by a second slash). If this also wasn't the -case it must be a single slash (the separate regex for a single slash must also -be given, else the slash would be marked as an error token).

-

Inside the 'comment' state, we do the same thing again. Scan until the lexer -finds a star or slash. If it's the opening of a multiline comment, push the -'comment' state on the stack and continue scanning, again in the -'comment' state. Else, check if it's the end of the multiline comment. If -yes, pop one state from the stack.

-

Note: If you pop from an empty stack you'll get an IndexError. (There is an -easy way to prevent this from happening: don't '#pop' in the root state).

-

If the RegexLexer encounters a newline that is flagged as an error token, the -stack is emptied and the lexer continues scanning in the 'root' state. This -helps producing error-tolerant highlighting for erroneous input, e.g. when a -single-line string is not closed.

-
-
-

Advanced state tricks

-

There are a few more things you can do with states:

-
    -
  • You can push multiple states onto the stack if you give a tuple instead of a -simple string as the third item in a rule tuple. For example, if you want to -match a comment containing a directive, something like:

    -
    -/* <processing directive>    rest of comment */
    -
    -

    you can use this rule:

    -
    tokens = {
    -    'root': [
    -        (r'/\* <', Comment, ('comment', 'directive')),
    -        ...
    -    ],
    -    'directive': [
    -        (r'[^>]*', Comment.Directive),
    -        (r'>', Comment, '#pop'),
    -    ],
    -    'comment': [
    -        (r'[^*]+', Comment),
    -        (r'\*/', Comment, '#pop'),
    -        (r'\*', Comment),
    -    ]
    -}
    -
    -

    When this encounters the above sample, first 'comment' and 'directive' -are pushed onto the stack, then the lexer continues in the directive state -until it finds the closing >, then it continues in the comment state until -the closing */. Then, both states are popped from the stack again and -lexing continues in the root state.

    -

    New in Pygments 0.9: The tuple can contain the special '#push' and -'#pop' (but not '#pop:n') directives.

    -
  • -
  • You can include the rules of a state in the definition of another. This is -done by using include from pygments.lexer:

    -
    from pygments.lexer import RegexLexer, bygroups, include
    -from pygments.token import *
    -
    -class ExampleLexer(RegexLexer):
    -    tokens = {
    -        'comments': [
    -            (r'/\*.*?\*/', Comment),
    -            (r'//.*?\n', Comment),
    -        ],
    -        'root': [
    -            include('comments'),
    -            (r'(function )(\w+)( {)',
    -             bygroups(Keyword, Name, Keyword), 'function'),
    -            (r'.', Text),
    -        ],
    -        'function': [
    -            (r'[^}/]+', Text),
    -            include('comments'),
    -            (r'/', Text),
    -            (r'}', Keyword, '#pop'),
    -        ]
    -    }
    -
    -

    This is a hypothetical lexer for a language that consist of functions and -comments. Because comments can occur at toplevel and in functions, we need -rules for comments in both states. As you can see, the include helper saves -repeating rules that occur more than once (in this example, the state -'comment' will never be entered by the lexer, as it's only there to be -included in 'root' and 'function').

    -
  • -
  • Sometimes, you may want to "combine" a state from existing ones. This is -possible with the combine helper from pygments.lexer.

    -

    If you, instead of a new state, write combined('state1', 'state2') as the -third item of a rule tuple, a new anonymous state will be formed from state1 -and state2 and if the rule matches, the lexer will enter this state.

    -

    This is not used very often, but can be helpful in some cases, such as the -PythonLexer's string literal processing.

    -
  • -
  • If you want your lexer to start lexing in a different state you can modify -the stack by overloading the get_tokens_unprocessed() method:

    -
    from pygments.lexer import RegexLexer
    -
    -class MyLexer(RegexLexer):
    -    tokens = {...}
    -
    -    def get_tokens_unprocessed(self, text):
    -        stack = ['root', 'otherstate']
    -        for item in RegexLexer.get_tokens_unprocessed(text, stack):
    -            yield item
    -
    -

    Some lexers like the PhpLexer use this to make the leading <?php -preprocessor comments optional. Note that you can crash the lexer easily -by putting values into the stack that don't exist in the token map. Also -removing 'root' from the stack can result in strange errors!

    -
  • -
  • An empty regex at the end of a state list, combined with '#pop', can -act as a return point from a state that doesn't have a clear end marker.

    -
  • -
-
-
-

Using multiple lexers

-

Using multiple lexers for the same input can be tricky. One of the easiest -combination techniques is shown here: You can replace the token type entry in a -rule tuple (the second item) with a lexer class. The matched text will then be -lexed with that lexer, and the resulting tokens will be yielded.

-

For example, look at this stripped-down HTML lexer:

-
from pygments.lexer import RegexLexer, bygroups, using
-from pygments.token import *
-from pygments.lexers.web import JavascriptLexer
-
-class HtmlLexer(RegexLexer):
-    name = 'HTML'
-    aliases = ['html']
-    filenames = ['*.html', '*.htm']
-
-    flags = re.IGNORECASE | re.DOTALL
-    tokens = {
-        'root': [
-            ('[^<&]+', Text),
-            ('&.*?;', Name.Entity),
-            (r'<\s*script\s*', Name.Tag, ('script-content', 'tag')),
-            (r'<\s*[a-zA-Z0-9:]+', Name.Tag, 'tag'),
-            (r'<\s*/\s*[a-zA-Z0-9:]+\s*>', Name.Tag),
-        ],
-        'script-content': [
-            (r'(.+?)(<\s*/\s*script\s*>)',
-             bygroups(using(JavascriptLexer), Name.Tag),
-             '#pop'),
-        ]
-    }
-
-

Here the content of a <script> tag is passed to a newly created instance of -a JavascriptLexer and not processed by the HtmlLexer. This is done using the -using helper that takes the other lexer class as its parameter.

-

Note the combination of bygroups and using. This makes sure that the content -up to the </script> end tag is processed by the JavascriptLexer, while the -end tag is yielded as a normal token with the Name.Tag type.

-

As an additional goodie, if the lexer class is replaced by this (imported from -pygments.lexer), the "other" lexer will be the current one (because you cannot -refer to the current class within the code that runs at class definition time).

-

Also note the (r'<\s*script\s*', Name.Tag, ('script-content', 'tag')) rule. -Here, two states are pushed onto the state stack, 'script-content' and -'tag'. That means that first 'tag' is processed, which will parse -attributes and the closing >, then the 'tag' state is popped and the -next state on top of the stack will be 'script-content'.

-

The using() helper has a special keyword argument, state, which works as -follows: if given, the lexer to use initially is not in the "root" state, -but in the state given by this argument. This only works with a RegexLexer.

-

Any other keywords arguments passed to using() are added to the keyword -arguments used to create the lexer.

-
-
-

Delegating Lexer

-

Another approach for nested lexers is the DelegatingLexer which is for -example used for the template engine lexers. It takes two lexers as -arguments on initialisation: a root_lexer and a language_lexer.

-

The input is processed as follows: First, the whole text is lexed with the -language_lexer. All tokens yielded with a type of Other are then -concatenated and given to the root_lexer. The language tokens of the -language_lexer are then inserted into the root_lexer's token stream -at the appropriate positions.

-
from pygments.lexer import DelegatingLexer
-from pygments.lexers.web import HtmlLexer, PhpLexer
-
-class HtmlPhpLexer(DelegatingLexer):
-    def __init__(self, **options):
-        super(HtmlPhpLexer, self).__init__(HtmlLexer, PhpLexer, **options)
-
-

This procedure ensures that e.g. HTML with template tags in it is highlighted -correctly even if the template tags are put into HTML tags or attributes.

-

If you want to change the needle token Other to something else, you can -give the lexer another token type as the third parameter:

-
DelegatingLexer.__init__(MyLexer, OtherLexer, Text, **options)
-
-
-
-

Callbacks

-

Sometimes the grammar of a language is so complex that a lexer would be unable -to parse it just by using regular expressions and stacks.

-

For this, the RegexLexer allows callbacks to be given in rule tuples, instead -of token types (bygroups and using are nothing else but preimplemented -callbacks). The callback must be a function taking two arguments:

-
    -
  • the lexer itself
  • -
  • the match object for the last matched rule
  • -
-

The callback must then return an iterable of (or simply yield) (index, -tokentype, value) tuples, which are then just passed through by -get_tokens_unprocessed(). The index here is the position of the token in -the input string, tokentype is the normal token type (like Name.Builtin), -and value the associated part of the input string.

-

You can see an example here:

-
from pygments.lexer import RegexLexer
-from pygments.token import Generic
-
-class HypotheticLexer(RegexLexer):
-
-    def headline_callback(lexer, match):
-        equal_signs = match.group(1)
-        text = match.group(2)
-        yield match.start(), Generic.Headline, equal_signs + text + equal_signs
-
-    tokens = {
-        'root': [
-            (r'(=+)(.*?)(\1)', headline_callback)
-        ]
-    }
-
-

If the regex for the headline_callback matches, the function is called with the -match object. Note that after the callback is done, processing continues -normally, that is, after the end of the previous match. The callback has no -possibility to influence the position.

-

There are not really any simple examples for lexer callbacks, but you can see -them in action e.g. in the compiled.py source code in the CLexer and -JavaLexer classes.

-
-
-

The ExtendedRegexLexer class

-

The RegexLexer, even with callbacks, unfortunately isn't powerful enough for -the funky syntax rules of some languages that will go unnamed, such as Ruby.

-

But fear not; even then you don't have to abandon the regular expression -approach. For Pygments has a subclass of RegexLexer, the ExtendedRegexLexer. -All features known from RegexLexers are available here too, and the tokens are -specified in exactly the same way, except for one detail:

-

The get_tokens_unprocessed() method holds its internal state data not as local -variables, but in an instance of the pygments.lexer.LexerContext class, and -that instance is passed to callbacks as a third argument. This means that you -can modify the lexer state in callbacks.

-

The LexerContext class has the following members:

-
    -
  • text -- the input text
  • -
  • pos -- the current starting position that is used for matching regexes
  • -
  • stack -- a list containing the state stack
  • -
  • end -- the maximum position to which regexes are matched, this defaults to -the length of text
  • -
-

Additionally, the get_tokens_unprocessed() method can be given a -LexerContext instead of a string and will then process this context instead of -creating a new one for the string argument.

-

Note that because you can set the current position to anything in the callback, -it won't be automatically be set by the caller after the callback is finished. -For example, this is how the hypothetical lexer above would be written with the -ExtendedRegexLexer:

-
from pygments.lexer import ExtendedRegexLexer
-from pygments.token import Generic
-
-class ExHypotheticLexer(ExtendedRegexLexer):
-
-    def headline_callback(lexer, match, ctx):
-        equal_signs = match.group(1)
-        text = match.group(2)
-        yield match.start(), Generic.Headline, equal_signs + text + equal_signs
-        ctx.pos = match.end()
-
-    tokens = {
-        'root': [
-            (r'(=+)(.*?)(\1)', headline_callback)
-        ]
-    }
-
-

This might sound confusing (and it can really be). But it is needed, and for an -example look at the Ruby lexer in agile.py.

-
-
-

Filtering Token Streams

-

Some languages ship a lot of builtin functions (for example PHP). The total -amount of those functions differs from system to system because not everybody -has every extension installed. In the case of PHP there are over 3000 builtin -functions. That's an incredible huge amount of functions, much more than you -can put into a regular expression.

-

But because only Name tokens can be function names it's solvable by overriding -the get_tokens_unprocessed() method. The following lexer subclasses the -PythonLexer so that it highlights some additional names as pseudo keywords:

-
from pygments.lexers.agile import PythonLexer
-from pygments.token import Name, Keyword
-
-class MyPythonLexer(PythonLexer):
-    EXTRA_KEYWORDS = ['foo', 'bar', 'foobar', 'barfoo', 'spam', 'eggs']
-
-    def get_tokens_unprocessed(self, text):
-        for index, token, value in PythonLexer.get_tokens_unprocessed(self, text):
-            if token is Name and value in self.EXTRA_KEYWORDS:
-                yield index, Keyword.Pseudo, value
-            else:
-                yield index, token, value
-
-

The PhpLexer and LuaLexer use this method to resolve builtin functions.

-

Note Do not confuse this with the filter system.

-
- -
- - - \ No newline at end of file diff --git a/docs/build/lexers.html b/docs/build/lexers.html deleted file mode 100644 index f8813fb..0000000 --- a/docs/build/lexers.html +++ /dev/null @@ -1,5359 +0,0 @@ - - - - Available lexers — Pygments - - - - -
-

Pygments

-

Available lexers

- - « Back To Index - - - - - -

This page lists all available builtin lexers and the options they take.

-

Currently, all lexers support these options:

-
-
stripnl
-
Strip leading and trailing newlines from the input (default: True)
-
stripall
-
Strip all leading and trailing whitespace from the input (default: -False).
-
ensurenl
-
Make sure that the input ends with a newline (default: True). This -is required for some lexers that consume input linewise. -New in Pygments 1.3.
-
tabsize
-
If given and greater than 0, expand tabs in the input (default: 0).
-
encoding
-

New in Pygments 0.6.

-

If given, must be an encoding name (such as "utf-8"). This encoding -will be used to convert the input string to Unicode (if it is not already -a Unicode string). The default is "latin1".

-

If this option is set to "guess", a simple UTF-8 vs. Latin-1 -detection is used, if it is set to "chardet", the -chardet library is used to -guess the encoding of the input.

-
-
-

The "Short Names" field lists the identifiers that can be used with the -get_lexer_by_name() function.

-

These lexers are builtin and can be imported from pygments.lexers:

-
-

Lexers for agile languages

-

CrocLexer

-
-

For Croc source.

- --- - - - - - - - -
Short names:croc
Filename patterns:*.croc
Mimetypes:text/x-crocsrc
-
-

DgLexer

-
-

Lexer for dg, -a functional and object-oriented programming language -running on the CPython 3 VM.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:dg
Filename patterns:*.dg
Mimetypes:text/x-dg
-
-

FactorLexer

-
-

Lexer for the Factor language.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:factor
Filename patterns:*.factor
Mimetypes:text/x-factor
-
-

FancyLexer

-
-

Pygments Lexer For Fancy.

-

Fancy is a self-hosted, pure object-oriented, dynamic, -class-based, concurrent general-purpose programming language -running on Rubinius, the Ruby VM.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:fancy, fy
Filename patterns:*.fy, *.fancypack
Mimetypes:text/x-fancysrc
-
-

IoLexer

-
-

For Io (a small, prototype-based -programming language) source.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:io
Filename patterns:*.io
Mimetypes:text/x-iosrc
-
-

LuaLexer

-
-

For Lua source code.

-

Additional options accepted:

-
-
func_name_highlighting
-
If given and True, highlight builtin function names -(default: True).
-
disabled_modules
-

If given, must be a list of module names whose function names -should not be highlighted. By default all modules are highlighted.

-

To get a list of allowed modules have a look into the -_luabuiltins module:

-
>>> from pygments.lexers._luabuiltins import MODULES
->>> MODULES.keys()
-['string', 'coroutine', 'modules', 'io', 'basic', ...]
-
-
-
- --- - - - - - - - -
Short names:lua
Filename patterns:*.lua, *.wlua
Mimetypes:text/x-lua, application/x-lua
-
-

MiniDLexer

-
-

For MiniD source. MiniD is now known as Croc.

- --- - - - - - - - -
Short names:minid
Filename patterns:*.md
Mimetypes:text/x-minidsrc
-
-

MoonScriptLexer

-
-

For MoonScript source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:moon, moonscript
Filename patterns:*.moon
Mimetypes:text/x-moonscript, application/x-moonscript
-
-

PerlLexer

-
-

For Perl source code.

- --- - - - - - - - -
Short names:perl, pl
Filename patterns:*.pl, *.pm
Mimetypes:text/x-perl, application/x-perl
-
-

Python3Lexer

-
-

For Python source code (version 3.0).

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:python3, py3
Filename patterns:None
Mimetypes:text/x-python3, application/x-python3
-
-

Python3TracebackLexer

-
-

For Python 3.0 tracebacks, with support for chained exceptions.

-

New in Pygments 1.0.

- --- - - - - - - - -
Short names:py3tb
Filename patterns:*.py3tb
Mimetypes:text/x-python3-traceback
-
-

PythonConsoleLexer

-
-

For Python console output or doctests, such as:

-
>>> a = 'foo'
->>> print a
-foo
->>> 1 / 0
-Traceback (most recent call last):
-  File "<stdin>", line 1, in <module>
-ZeroDivisionError: integer division or modulo by zero
-
-

Additional options:

-
-
python3
-
Use Python 3 lexer for code. Default is False. -New in Pygments 1.0.
-
- --- - - - - - - - -
Short names:pycon
Filename patterns:None
Mimetypes:text/x-python-doctest
-
-

PythonLexer

-
-

For Python source code.

- --- - - - - - - - -
Short names:python, py, sage
Filename patterns:*.py, *.pyw, *.sc, SConstruct, SConscript, *.tac, *.sage
Mimetypes:text/x-python, application/x-python
-
-

PythonTracebackLexer

-
-

For Python tracebacks.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:pytb
Filename patterns:*.pytb
Mimetypes:text/x-python-traceback
-
-

RubyConsoleLexer

-
-

For Ruby interactive console (irb) output like:

-
irb(main):001:0> a = 1
-=> 1
-irb(main):002:0> puts a
-1
-=> nil
-
- --- - - - - - - - -
Short names:rbcon, irb
Filename patterns:None
Mimetypes:text/x-ruby-shellsession
-
-

RubyLexer

-
-

For Ruby source code.

- --- - - - - - - - -
Short names:rb, ruby, duby
Filename patterns:*.rb, *.rbw, Rakefile, *.rake, *.gemspec, *.rbx, *.duby
Mimetypes:text/x-ruby, application/x-ruby
-
-

TclLexer

-
-

For Tcl source code.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:tcl
Filename patterns:*.tcl
Mimetypes:text/x-tcl, text/x-script.tcl, application/x-tcl
-
-
-
-

Lexers for assembly languages

-

CObjdumpLexer

-
-

For the output of 'objdump -Sr on compiled C files'

- --- - - - - - - - -
Short names:c-objdump
Filename patterns:*.c-objdump
Mimetypes:text/x-c-objdump
-
-

Ca65Lexer

-
-

For ca65 assembler sources.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:ca65
Filename patterns:*.s
Mimetypes:None
-
-

CppObjdumpLexer

-
-

For the output of 'objdump -Sr on compiled C++ files'

- --- - - - - - - - -
Short names:cpp-objdump, c++-objdumb, cxx-objdump
Filename patterns:*.cpp-objdump, *.c++-objdump, *.cxx-objdump
Mimetypes:text/x-cpp-objdump
-
-

DObjdumpLexer

-
-

For the output of 'objdump -Sr on compiled D files'

- --- - - - - - - - -
Short names:d-objdump
Filename patterns:*.d-objdump
Mimetypes:text/x-d-objdump
-
-

GasLexer

-
-

For Gas (AT&T) assembly code.

- --- - - - - - - - -
Short names:gas
Filename patterns:*.s, *.S
Mimetypes:text/x-gas
-
-

LlvmLexer

-
-

For LLVM assembly code.

- --- - - - - - - - -
Short names:llvm
Filename patterns:*.ll
Mimetypes:text/x-llvm
-
-

NasmLexer

-
-

For Nasm (Intel) assembly code.

- --- - - - - - - - -
Short names:nasm
Filename patterns:*.asm, *.ASM
Mimetypes:text/x-nasm
-
-

ObjdumpLexer

-
-

For the output of 'objdump -dr'

- --- - - - - - - - -
Short names:objdump
Filename patterns:*.objdump
Mimetypes:text/x-objdump
-
-
-
-

Lexers for compiled languages

-

AdaLexer

-
-

For Ada source code.

-

New in Pygments 1.3.

- --- - - - - - - - -
Short names:ada, ada95ada2005
Filename patterns:*.adb, *.ads, *.ada
Mimetypes:text/x-ada
-
-

BlitzMaxLexer

-
-

For BlitzMax source code.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:blitzmax, bmax
Filename patterns:*.bmx
Mimetypes:text/x-bmx
-
-

CLexer

-
-

For C source code with preprocessor directives.

- --- - - - - - - - -
Short names:c
Filename patterns:*.c, *.h, *.idc
Mimetypes:text/x-chdr, text/x-csrc
-
-

CobolFreeformatLexer

-
-

Lexer for Free format OpenCOBOL code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:cobolfree
Filename patterns:*.cbl, *.CBL
Mimetypes:None
-
-

CobolLexer

-
-

Lexer for OpenCOBOL code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:cobol
Filename patterns:*.cob, *.COB, *.cpy, *.CPY
Mimetypes:text/x-cobol
-
-

CppLexer

-
-

For C++ source code with preprocessor directives.

- --- - - - - - - - -
Short names:cpp, c++
Filename patterns:*.cpp, *.hpp, *.c++, *.h++, *.cc, *.hh, *.cxx, *.hxx, *.C, *.H, *.cp, *.CPP
Mimetypes:text/x-c++hdr, text/x-c++src
-
-

CudaLexer

-
-

For NVIDIA CUDA™ -source.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:cuda, cu
Filename patterns:*.cu, *.cuh
Mimetypes:text/x-cuda
-
-

CythonLexer

-
-

For Pyrex and Cython source code.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:cython, pyx
Filename patterns:*.pyx, *.pxd, *.pxi
Mimetypes:text/x-cython, application/x-cython
-
-

DLexer

-
-

For D source.

-

New in Pygments 1.2.

- --- - - - - - - - -
Short names:d
Filename patterns:*.d, *.di
Mimetypes:text/x-dsrc
-
-

DelphiLexer

-
-

For Delphi (Borland Object Pascal), -Turbo Pascal and Free Pascal source code.

-

Additional options accepted:

-
-
turbopascal
-
Highlight Turbo Pascal specific keywords (default: True).
-
delphi
-
Highlight Borland Delphi specific keywords (default: True).
-
freepascal
-
Highlight Free Pascal specific keywords (default: True).
-
units
-
A list of units that should be considered builtin, supported are -System, SysUtils, Classes and Math. -Default is to consider all of them builtin.
-
- --- - - - - - - - -
Short names:delphi, pas, pascal, objectpascal
Filename patterns:*.pas
Mimetypes:text/x-pascal
-
-

DylanLexer

-
-

For the Dylan language.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:dylan
Filename patterns:*.dylan, *.dyl, *.intr
Mimetypes:text/x-dylan
-
-

DylanLidLexer

-
-

For Dylan LID (Library Interchange Definition) files.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:dylan-lid, lid
Filename patterns:*.lid, *.hdp
Mimetypes:text/x-dylan-lid
-
-

ECLexer

-
-

For eC source code with preprocessor directives.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:ec
Filename patterns:*.ec, *.eh
Mimetypes:text/x-echdr, text/x-ecsrc
-
-

FantomLexer

-
-

For Fantom source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:fan
Filename patterns:*.fan
Mimetypes:application/x-fantom
-
-

FelixLexer

-
-

For Felix source code.

-

New in Pygments 1.2.

- --- - - - - - - - -
Short names:felix, flx
Filename patterns:*.flx, *.flxh
Mimetypes:text/x-felix
-
-

FortranLexer

-
-

Lexer for FORTRAN 90 code.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:fortran
Filename patterns:*.f, *.f90, *.F, *.F90
Mimetypes:text/x-fortran
-
-

GLShaderLexer

-
-

GLSL (OpenGL Shader) lexer.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:glsl
Filename patterns:*.vert, *.frag, *.geo
Mimetypes:text/x-glslsrc
-
-

GoLexer

-
-

For Go source.

- --- - - - - - - - -
Short names:go
Filename patterns:*.go
Mimetypes:text/x-gosrc
-
-

Modula2Lexer

-
-

For Modula-2 source code.

-

Additional options that determine which keywords are highlighted:

-
-
pim
-
Select PIM Modula-2 dialect (default: True).
-
iso
-
Select ISO Modula-2 dialect (default: False).
-
objm2
-
Select Objective Modula-2 dialect (default: False).
-
gm2ext
-
Also highlight GNU extensions (default: False).
-
-

New in Pygments 1.3.

- --- - - - - - - - -
Short names:modula2, m2
Filename patterns:*.def, *.mod
Mimetypes:text/x-modula2
-
-

MonkeyLexer

-
-

For -Monkey -source code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:monkey
Filename patterns:*.monkey
Mimetypes:text/x-monkey
-
-

NimrodLexer

-
-

For Nimrod source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:nimrod, nim
Filename patterns:*.nim, *.nimrod
Mimetypes:text/x-nimrod
-
-

ObjectiveCLexer

-
-

For Objective-C source code with preprocessor directives.

- --- - - - - - - - -
Short names:objective-c, objectivec, obj-c, objc
Filename patterns:*.m, *.h
Mimetypes:text/x-objective-c
-
-

ObjectiveCppLexer

-
-

For Objective-C++ source code with preprocessor directives.

- --- - - - - - - - -
Short names:objective-c++, objectivec++, obj-c++, objc++
Filename patterns:*.mm, *.hh
Mimetypes:text/x-objective-c++
-
-

OocLexer

-
-

For Ooc source code

-

New in Pygments 1.2.

- --- - - - - - - - -
Short names:ooc
Filename patterns:*.ooc
Mimetypes:text/x-ooc
-
-

PrologLexer

-
-

Lexer for Prolog files.

- --- - - - - - - - -
Short names:prolog
Filename patterns:*.prolog, *.pro, *.pl
Mimetypes:text/x-prolog
-
-

RustLexer

-
-

Lexer for Mozilla's Rust programming language.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:rust
Filename patterns:*.rs, *.rc
Mimetypes:text/x-rustsrc
-
-

ValaLexer

-
-

For Vala source code with preprocessor directives.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:vala, vapi
Filename patterns:*.vala, *.vapi
Mimetypes:text/x-vala
-
-
- -
-

Lexers for .net languages

-

BooLexer

-
-

For Boo source code.

- --- - - - - - - - -
Short names:boo
Filename patterns:*.boo
Mimetypes:text/x-boo
-
-

CSharpAspxLexer

-
-

Lexer for highligting C# within ASP.NET pages.

- --- - - - - - - - -
Short names:aspx-cs
Filename patterns:*.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd
Mimetypes:None
-
-

CSharpLexer

-
-

For C# -source code.

-

Additional options accepted:

-
-
unicodelevel
-

Determines which Unicode characters this lexer allows for identifiers. -The possible values are:

-
    -
  • none -- only the ASCII letters and numbers are allowed. This -is the fastest selection.
  • -
  • basic -- all Unicode characters from the specification except -category Lo are allowed.
  • -
  • full -- all Unicode characters as specified in the C# specs -are allowed. Note that this means a considerable slowdown since the -Lo category has more than 40,000 characters in it!
  • -
-

The default value is basic.

-

New in Pygments 0.8.

-
-
- --- - - - - - - - -
Short names:csharp, c#
Filename patterns:*.cs
Mimetypes:text/x-csharp
-
-

FSharpLexer

-
-

For the F# language.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:fsharp
Filename patterns:*.fs, *.fsi
Mimetypes:text/x-fsharp
-
-

NemerleLexer

-
-

For Nemerle source code.

-

Additional options accepted:

-
-
unicodelevel
-

Determines which Unicode characters this lexer allows for identifiers. -The possible values are:

-
    -
  • none -- only the ASCII letters and numbers are allowed. This -is the fastest selection.
  • -
  • basic -- all Unicode characters from the specification except -category Lo are allowed.
  • -
  • full -- all Unicode characters as specified in the C# specs -are allowed. Note that this means a considerable slowdown since the -Lo category has more than 40,000 characters in it!
  • -
-

The default value is basic.

-
-
-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:nemerle
Filename patterns:*.n
Mimetypes:text/x-nemerle
-
-

VbNetAspxLexer

-
-

Lexer for highligting Visual Basic.net within ASP.NET pages.

- --- - - - - - - - -
Short names:aspx-vb
Filename patterns:*.aspx, *.asax, *.ascx, *.ashx, *.asmx, *.axd
Mimetypes:None
-
-

VbNetLexer

-
-

For -Visual Basic.NET -source code.

- --- - - - - - - - -
Short names:vb.net, vbnet
Filename patterns:*.vb, *.bas
Mimetypes:text/x-vbnet, text/x-vba
-
-
-
-

Simple lexer for Microsoft Visual FoxPro source code

-

FoxProLexer -Lexer for Microsoft Visual FoxPro language.

-
-

FoxPro syntax allows to shorten all keywords and function names -to 4 characters. Shortened forms are not recognized by this lexer.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:Clipper, XBase
Filename patterns:*.PRG, *.prg
Mimetypes:None
-
-
-
-

Lexers for functional languages

-

CommonLispLexer

-
-

A Common Lisp lexer.

-

New in Pygments 0.9.

- --- - - - - - - - -
Short names:common-lisp, cl
Filename patterns:*.cl, *.lisp, *.el
Mimetypes:text/x-common-lisp
-
-

CoqLexer

-
-

For the Coq theorem prover.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:coq
Filename patterns:*.v
Mimetypes:text/x-coq
-
-

ElixirConsoleLexer

-
-

For Elixir interactive console (iex) output like:

-
iex> [head | tail] = [1,2,3]
-[1,2,3]
-iex> head
-1
-iex> tail
-[2,3]
-iex> [head | tail]
-[1,2,3]
-iex> length [head | tail]
-3
-
-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:iex
Filename patterns:None
Mimetypes:text/x-elixir-shellsession
-
-

ElixirLexer

-
-

For the Elixir language.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:elixir, ex, exs
Filename patterns:*.ex, *.exs
Mimetypes:text/x-elixir
-
-

ErlangLexer

-
-

For the Erlang functional programming language.

-

Blame Jeremy Thurgood (http://jerith.za.net/).

-

New in Pygments 0.9.

- --- - - - - - - - -
Short names:erlang
Filename patterns:*.erl, *.hrl, *.es, *.escript
Mimetypes:text/x-erlang
-
-

ErlangShellLexer

-
-

Shell sessions in erl (for Erlang code).

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:erl
Filename patterns:*.erl-sh
Mimetypes:text/x-erl-shellsession
-
-

HaskellLexer

-
-

A Haskell lexer based on the lexemes defined in the Haskell 98 Report.

-

New in Pygments 0.8.

- --- - - - - - - - -
Short names:haskell, hs
Filename patterns:*.hs
Mimetypes:text/x-haskell
-
-

KokaLexer

-
-

Lexer for the Koka -language.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:koka
Filename patterns:*.kk, *.kki
Mimetypes:text/x-koka
-
-

LiterateHaskellLexer

-
-

For Literate Haskell (Bird-style or LaTeX) source.

-

Additional options accepted:

-
-
litstyle
-
If given, must be "bird" or "latex". If not given, the style -is autodetected: if the first non-whitespace character in the source -is a backslash or percent character, LaTeX is assumed, else Bird.
-
-

New in Pygments 0.9.

- --- - - - - - - - -
Short names:lhs, literate-haskell
Filename patterns:*.lhs
Mimetypes:text/x-literate-haskell
-
-

NewLispLexer

-
-

For newLISP. source code (version 10.3.0).

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:newlisp
Filename patterns:*.lsp, *.nl
Mimetypes:text/x-newlisp, application/x-newlisp
-
-

OcamlLexer

-
-

For the OCaml language.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:ocaml
Filename patterns:*.ml, *.mli, *.mll, *.mly
Mimetypes:text/x-ocaml
-
-

OpaLexer

-
-

Lexer for the Opa language (http://opalang.org).

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:opa
Filename patterns:*.opa
Mimetypes:text/x-opa
-
-

RacketLexer

-
-

Lexer for Racket source code (formerly known as -PLT Scheme).

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:racket, rkt
Filename patterns:*.rkt, *.rktl
Mimetypes:text/x-racket, application/x-racket
-
-

SMLLexer

-
-

For the Standard ML language.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:sml
Filename patterns:*.sml, *.sig, *.fun
Mimetypes:text/x-standardml, application/x-standardml
-
-

SchemeLexer

-
-

A Scheme lexer, parsing a stream and outputting the tokens -needed to highlight scheme code. -This lexer could be most probably easily subclassed to parse -other LISP-Dialects like Common Lisp, Emacs Lisp or AutoLisp.

-

This parser is checked with pastes from the LISP pastebin -at http://paste.lisp.org/ to cover as much syntax as possible.

-

It supports the full Scheme syntax as defined in R5RS.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:scheme, scm
Filename patterns:*.scm, *.ss
Mimetypes:text/x-scheme, application/x-scheme
-
-
-
-

Lexers for hardware descriptor languages

-

SystemVerilogLexer

-
-

Extends verilog lexer to recognise all SystemVerilog keywords from IEEE -1800-2009 standard.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:sv
Filename patterns:*.sv, *.svh
Mimetypes:text/x-systemverilog
-
-

VerilogLexer

-
-

For verilog source code with preprocessor directives.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:v
Filename patterns:*.v
Mimetypes:text/x-verilog
-
-

VhdlLexer

-
-

For VHDL source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:vhdl
Filename patterns:*.vhdl, *.vhd
Mimetypes:text/x-vhdl
-
-
-
-

Pygments lexers for JVM languages

-

AspectJLexer

-
-

For AspectJ source code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:aspectj
Filename patterns:*.aj
Mimetypes:text/x-aspectj
-
-

CeylonLexer

-
-

For Ceylon source code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:ceylon
Filename patterns:*.ceylon
Mimetypes:text/x-ceylon
-
-

ClojureLexer

-
-

Lexer for Clojure source code.

-

New in Pygments 0.11.

- --- - - - - - - - -
Short names:clojure, clj
Filename patterns:*.clj
Mimetypes:text/x-clojure, application/x-clojure
-
-

GosuLexer

-
-

For Gosu source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:gosu
Filename patterns:*.gs, *.gsx, *.gsp, *.vark
Mimetypes:text/x-gosu
-
-

GosuTemplateLexer

-
-

For Gosu templates.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:gst
Filename patterns:*.gst
Mimetypes:text/x-gosu-template
-
-

GroovyLexer

-
-

For Groovy source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:groovy
Filename patterns:*.groovy
Mimetypes:text/x-groovy
-
-

IokeLexer

-
-

For Ioke (a strongly typed, dynamic, -prototype based programming language) source.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:ioke, ik
Filename patterns:*.ik
Mimetypes:text/x-iokesrc
-
-

JavaLexer

-
-

For Java source code.

- --- - - - - - - - -
Short names:java
Filename patterns:*.java
Mimetypes:text/x-java
-
-

KotlinLexer

-
-

For Kotlin -source code.

-

Additional options accepted:

-
-
unicodelevel
-

Determines which Unicode characters this lexer allows for identifiers. -The possible values are:

-
    -
  • none -- only the ASCII letters and numbers are allowed. This -is the fastest selection.
  • -
  • basic -- all Unicode characters from the specification except -category Lo are allowed.
  • -
  • full -- all Unicode characters as specified in the C# specs -are allowed. Note that this means a considerable slowdown since the -Lo category has more than 40,000 characters in it!
  • -
-

The default value is basic.

-
-
-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:kotlin
Filename patterns:*.kt
Mimetypes:text/x-kotlin
-
-

ScalaLexer

-
-

For Scala source code.

- --- - - - - - - - -
Short names:scala
Filename patterns:*.scala
Mimetypes:text/x-scala
-
-

XtendLexer

-
-

For Xtend source code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:xtend
Filename patterns:*.xtend
Mimetypes:text/x-xtend
-
-
-
-

Lexers for math languages

-

BugsLexer

-
-

Pygments Lexer for OpenBugs and WinBugs -models.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:bugs, winbugs, openbugs
Filename patterns:*.bug
Mimetypes:None
-
-

IDLLexer

-
-

Pygments Lexer for IDL (Interactive Data Language).

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:idl
Filename patterns:*.pro
Mimetypes:text/idl
-
-

JagsLexer

-
-

Pygments Lexer for JAGS.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:jags
Filename patterns:*.jag, *.bug
Mimetypes:None
-
-

JuliaConsoleLexer

-
-

For Julia console sessions. Modeled after MatlabSessionLexer.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:jlcon
Filename patterns:None
Mimetypes:None
-
-

JuliaLexer

-
-

For Julia source code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:julia, jl
Filename patterns:*.jl
Mimetypes:text/x-julia, application/x-julia
-
-

MatlabLexer

-
-

For Matlab source code.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:matlab
Filename patterns:*.m
Mimetypes:text/matlab
-
-

MatlabSessionLexer

-
-

For Matlab sessions. Modeled after PythonConsoleLexer. -Contributed by Ken Schutte <kschutte@csail.mit.edu>.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:matlabsession
Filename patterns:None
Mimetypes:None
-
-

MuPADLexer

-
-

A MuPAD lexer. -Contributed by Christopher Creutzig <christopher@creutzig.de>.

-

New in Pygments 0.8.

- --- - - - - - - - -
Short names:mupad
Filename patterns:*.mu
Mimetypes:None
-
-

NumPyLexer

-
-

A Python lexer recognizing Numerical Python builtins.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:numpy
Filename patterns:None
Mimetypes:None
-
-

OctaveLexer

-
-

For GNU Octave source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:octave
Filename patterns:*.m
Mimetypes:text/octave
-
-

RConsoleLexer

-
-

For R console transcripts or R CMD BATCH output files.

- --- - - - - - - - -
Short names:rconsole, rout
Filename patterns:*.Rout
Mimetypes:None
-
-

RdLexer

-
-

Pygments Lexer for R documentation (Rd) files

-

This is a very minimal implementation, highlighting little more -than the macros. A description of Rd syntax is found in Writing R -Extensions -and Parsing Rd files.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:rd
Filename patterns:*.Rd
Mimetypes:text/x-r-doc
-
-

SLexer

-
-

For S, S-plus, and R source code.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:splus, s, r
Filename patterns:*.S, *.R, .Rhistory, .Rprofile
Mimetypes:text/S-plus, text/S, text/x-r-source, text/x-r, text/x-R, text/x-r-history, text/x-r-profile
-
-

ScilabLexer

-
-

For Scilab source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:scilab
Filename patterns:*.sci, *.sce, *.tst
Mimetypes:text/scilab
-
-

StanLexer

-
-

Pygments Lexer for Stan models.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:stan
Filename patterns:*.stan
Mimetypes:None
-
-
-
-

Lexers for other languages

-

ABAPLexer

-
-

Lexer for ABAP, SAP's integrated language.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:abap
Filename patterns:*.abap
Mimetypes:text/x-abap
-
-

AppleScriptLexer

-
-

For AppleScript source code, -including AppleScript Studio. -Contributed by Andreas Amann <aamann@mac.com>.

- --- - - - - - - - -
Short names:applescript
Filename patterns:*.applescript
Mimetypes:None
-
-

AsymptoteLexer

-
-

For Asymptote source code.

-

New in Pygments 1.2.

- --- - - - - - - - -
Short names:asy, asymptote
Filename patterns:*.asy
Mimetypes:text/x-asymptote
-
-

AutoItLexer

-
-

For AutoIt files.

-

AutoIt is a freeware BASIC-like scripting language -designed for automating the Windows GUI and general scripting

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:autoit, Autoit
Filename patterns:*.au3
Mimetypes:text/x-autoit
-
-

AutohotkeyLexer

-
-

For autohotkey source code.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:ahk
Filename patterns:*.ahk, *.ahkl
Mimetypes:text/x-autohotkey
-
-

AwkLexer

-
-

For Awk scripts.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:awk, gawk, mawk, nawk
Filename patterns:*.awk
Mimetypes:application/x-awk
-
-

BefungeLexer

-
-

Lexer for the esoteric Befunge -language.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:befunge
Filename patterns:*.befunge
Mimetypes:application/x-befunge
-
-

BrainfuckLexer

-
-

Lexer for the esoteric BrainFuck -language.

- --- - - - - - - - -
Short names:brainfuck, bf
Filename patterns:*.bf, *.b
Mimetypes:application/x-brainfuck
-
-

BroLexer

-
-

For Bro scripts.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:bro
Filename patterns:*.bro
Mimetypes:None
-
-

CbmBasicV2Lexer

-
-

For CBM BASIC V2 sources.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:cbmbas
Filename patterns:*.bas
Mimetypes:None
-
-

Cfengine3Lexer

-
-

Lexer for CFEngine3 policy files.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:cfengine3, cf3
Filename patterns:*.cf
Mimetypes:None
-
-

ECLLexer

-
-

Lexer for the declarative big-data ECL -language.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:ecl
Filename patterns:*.ecl
Mimetypes:application/x-ecl
-
-

GherkinLexer

-
-

For Gherkin <http://github.com/aslakhellesoy/gherkin/> syntax.

-

New in Pygments 1.2.

- --- - - - - - - - -
Short names:Cucumber, cucumber, Gherkin, gherkin
Filename patterns:*.feature
Mimetypes:text/x-gherkin
-
-

GnuplotLexer

-
-

For Gnuplot plotting scripts.

-

New in Pygments 0.11.

- --- - - - - - - - -
Short names:gnuplot
Filename patterns:*.plot, *.plt
Mimetypes:text/x-gnuplot
-
-

GoodDataCLLexer

-
-

Lexer for GoodData-CL -script files.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:gooddata-cl
Filename patterns:*.gdc
Mimetypes:text/x-gooddata-cl
-
-

HybrisLexer

-
-

For Hybris source code.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:hybris, hy
Filename patterns:*.hy, *.hyb
Mimetypes:text/x-hybris, application/x-hybris
-
-

KconfigLexer

-
-

For Linux-style Kconfig files.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:kconfig, menuconfig, linux-config, kernel-config
Filename patterns:Kconfig, *Config.in*, external.in*, standard-modules.in
Mimetypes:text/x-kconfig
-
-

LogtalkLexer

-
-

For Logtalk source code.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:logtalk
Filename patterns:*.lgt
Mimetypes:text/x-logtalk
-
-

MOOCodeLexer

-
-

For MOOCode (the MOO scripting -language).

-

New in Pygments 0.9.

- --- - - - - - - - -
Short names:moocode
Filename patterns:*.moo
Mimetypes:text/x-moocode
-
-

MaqlLexer

-
-

Lexer for GoodData MAQL -scripts.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:maql
Filename patterns:*.maql
Mimetypes:text/x-gooddata-maql, application/x-gooddata-maql
-
-

ModelicaLexer

-
-

For Modelica source code.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:modelica
Filename patterns:*.mo
Mimetypes:text/x-modelica
-
-

MscgenLexer

-
-

For Mscgen files.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:mscgen, msc
Filename patterns:*.msc
Mimetypes:None
-
-

NSISLexer

-
-

For NSIS scripts.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:nsis, nsi, nsh
Filename patterns:*.nsi, *.nsh
Mimetypes:text/x-nsis
-
-

NewspeakLexer

-
-

For Newspeak <http://newspeaklanguage.org/> syntax.

- --- - - - - - - - -
Short names:newspeak
Filename patterns:*.ns2
Mimetypes:text/x-newspeak
-
-

OpenEdgeLexer

-
-

Lexer for OpenEdge ABL (formerly Progress) source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:openedge, abl, progress
Filename patterns:*.p, *.cls
Mimetypes:text/x-openedge, application/x-openedge
-
-

PostScriptLexer

-
-

Lexer for PostScript files.

-

The PostScript Language Reference published by Adobe at -<http://partners.adobe.com/public/developer/en/ps/PLRM.pdf> -is the authority for this.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:postscript
Filename patterns:*.ps, *.eps
Mimetypes:application/postscript
-
-

PovrayLexer

-
-

For Persistence of Vision Raytracer files.

-

New in Pygments 0.11.

- --- - - - - - - - -
Short names:pov
Filename patterns:*.pov, *.inc
Mimetypes:text/x-povray
-
-

ProtoBufLexer

-
-

Lexer for Protocol Buffer -definition files.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:protobuf
Filename patterns:*.proto
Mimetypes:None
-
-

PuppetLexer

-
-

For Puppet configuration DSL.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:puppet
Filename patterns:*.pp
Mimetypes:None
-
-

RPMSpecLexer

-
-

For RPM *.spec files

-
-

System Message: WARNING/2 (<string>, line 1687); backlink

-Inline emphasis start-string without end-string.
-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:spec
Filename patterns:*.spec
Mimetypes:text/x-rpm-spec
-
-

RebolLexer

-
-

A REBOL lexer.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:rebol
Filename patterns:*.r, *.r3
Mimetypes:text/x-rebol
-
-

RedcodeLexer

-
-

A simple Redcode lexer based on ICWS'94. -Contributed by Adam Blinkinsop <blinks@acm.org>.

-

New in Pygments 0.8.

- --- - - - - - - - -
Short names:redcode
Filename patterns:*.cw
Mimetypes:None
-
-

RobotFrameworkLexer

-
-

For Robot Framework test data.

-

Supports both space and pipe separated plain text formats.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:RobotFramework, robotframework
Filename patterns:*.txt
Mimetypes:text/x-robotframework
-
-

SmalltalkLexer

-
-

For Smalltalk syntax. -Contributed by Stefan Matthias Aust. -Rewritten by Nils Winter.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:smalltalk, squeak
Filename patterns:*.st
Mimetypes:text/x-smalltalk
-
-

SnobolLexer

-
-

Lexer for the SNOBOL4 programming language.

-

Recognizes the common ASCII equivalents of the original SNOBOL4 operators. -Does not require spaces around binary operators.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:snobol
Filename patterns:*.snobol
Mimetypes:text/x-snobol
-
-

SourcePawnLexer

-
-

For SourcePawn source code with preprocessor directives.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:sp
Filename patterns:*.sp
Mimetypes:text/x-sourcepawn
-
-

UrbiscriptLexer

-
-

For UrbiScript source code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:urbiscript
Filename patterns:*.u
Mimetypes:application/x-urbiscript
-
-

VGLLexer

-
-

For SampleManager VGL -source code.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:vgl
Filename patterns:*.rpf
Mimetypes:None
-
-
-
-

Lexers for parser generators

-

AntlrActionScriptLexer

-
-

ANTLR with ActionScript Target

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr-as, antlr-actionscript
Filename patterns:*.G, *.g
Mimetypes:None
-
-

AntlrCSharpLexer

-
-

ANTLR with C# Target

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr-csharp, antlr-c#
Filename patterns:*.G, *.g
Mimetypes:None
-
-

AntlrCppLexer

-
-

ANTLR with CPP Target

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr-cpp
Filename patterns:*.G, *.g
Mimetypes:None
-
-

AntlrJavaLexer

-
-

ANTLR with Java Target

-

New in Pygments 1.1

- --- - - - - - - - -
Short names:antlr-java
Filename patterns:*.G, *.g
Mimetypes:None
-
-

AntlrLexer

-
-

Generic ANTLR Lexer. -Should not be called directly, instead -use DelegatingLexer for your target language.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr
Filename patterns:None
Mimetypes:None
-
-

AntlrObjectiveCLexer

-
-

ANTLR with Objective-C Target

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr-objc
Filename patterns:*.G, *.g
Mimetypes:None
-
-

AntlrPerlLexer

-
-

ANTLR with Perl Target

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr-perl
Filename patterns:*.G, *.g
Mimetypes:None
-
-

AntlrPythonLexer

-
-

ANTLR with Python Target

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr-python
Filename patterns:*.G, *.g
Mimetypes:None
-
-

AntlrRubyLexer

-
-

ANTLR with Ruby Target

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:antlr-ruby, antlr-rb
Filename patterns:*.G, *.g
Mimetypes:None
-
-

RagelCLexer

-
-

A lexer for Ragel in a C host file.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel-c
Filename patterns:*.rl
Mimetypes:None
-
-

RagelCppLexer

-
-

A lexer for Ragel in a CPP host file.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel-cpp
Filename patterns:*.rl
Mimetypes:None
-
-

RagelDLexer

-
-

A lexer for Ragel in a D host file.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel-d
Filename patterns:*.rl
Mimetypes:None
-
-

RagelEmbeddedLexer

-
-

A lexer for Ragel embedded in a host language file.

-

This will only highlight Ragel statements. If you want host language -highlighting then call the language-specific Ragel lexer.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel-em
Filename patterns:*.rl
Mimetypes:None
-
-

RagelJavaLexer

-
-

A lexer for Ragel in a Java host file.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel-java
Filename patterns:*.rl
Mimetypes:None
-
-

RagelLexer

-
-

A pure Ragel lexer. Use this for -fragments of Ragel. For .rl files, use RagelEmbeddedLexer instead -(or one of the language-specific subclasses).

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel
Filename patterns:None
Mimetypes:None
-
-

RagelObjectiveCLexer

-
-

A lexer for Ragel in an Objective C host file.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel-objc
Filename patterns:*.rl
Mimetypes:None
-
-

RagelRubyLexer

-
-

A lexer for Ragel in a Ruby host file.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:ragel-ruby, ragel-rb
Filename patterns:*.rl
Mimetypes:None
-
-

TreetopLexer

-
-

A lexer for Treetop grammars.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:treetop
Filename patterns:*.treetop, *.tt
Mimetypes:None
-
-
-
-

Lexers for various shells

-

BashLexer

-
-

Lexer for (ba|k|)sh shell scripts.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:bash, sh, ksh
Filename patterns:*.sh, *.ksh, *.bash, *.ebuild, *.eclass, .bashrc, bashrc, .bash\*, bash\*
Mimetypes:application/x-sh, application/x-shellscript
-
-

BashSessionLexer

-
-

Lexer for simplistic shell sessions.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:console
Filename patterns:*.sh-session
Mimetypes:application/x-shell-session
-
-

BatchLexer

-
-

Lexer for the DOS/Windows Batch file format.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:bat
Filename patterns:*.bat, *.cmd
Mimetypes:application/x-dos-batch
-
-

PowerShellLexer

-
-

For Windows PowerShell code.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:powershell, posh, ps1
Filename patterns:*.ps1
Mimetypes:text/x-powershell
-
-

TcshLexer

-
-

Lexer for tcsh scripts.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:tcsh, csh
Filename patterns:*.tcsh, *.csh
Mimetypes:application/x-csh
-
-
-
-

Special lexers

-

RawTokenLexer

-
-

Recreate a token stream formatted with the RawTokenFormatter. This -lexer raises exceptions during parsing if the token stream in the -file is malformed.

-

Additional options accepted:

-
-
compress
-
If set to "gz" or "bz2", decompress the token stream with -the given compression algorithm before lexing (default: "").
-
- --- - - - - - - - -
Short names:raw
Filename patterns:None
Mimetypes:application/x-pygments-tokens
-
-

TextLexer

-
-

"Null" lexer, doesn't highlight anything.

- --- - - - - - - - -
Short names:text
Filename patterns:*.txt
Mimetypes:text/plain
-
-
- -
-

Lexers for various template engines' markup

-

CheetahHtmlLexer

-
-

Subclass of the CheetahLexer that highlights unlexer data -with the HtmlLexer.

- --- - - - - - - - -
Short names:html+cheetah, html+spitfire
Filename patterns:None
Mimetypes:text/html+cheetah, text/html+spitfire
-
-

CheetahJavascriptLexer

-
-

Subclass of the CheetahLexer that highlights unlexer data -with the JavascriptLexer.

- --- - - - - - - - -
Short names:js+cheetah, javascript+cheetah, js+spitfire, javascript+spitfire
Filename patterns:None
Mimetypes:application/x-javascript+cheetah, text/x-javascript+cheetah, text/javascript+cheetah, application/x-javascript+spitfire, text/x-javascript+spitfire, text/javascript+spitfire
-
-

CheetahLexer

-
-

Generic cheetah templates lexer. Code that isn't Cheetah -markup is yielded as Token.Other. This also works for -spitfire templates which use the same syntax.

- --- - - - - - - - -
Short names:cheetah, spitfire
Filename patterns:*.tmpl, *.spt
Mimetypes:application/x-cheetah, application/x-spitfire
-
-

CheetahXmlLexer

-
-

Subclass of the CheetahLexer that highlights unlexer data -with the XmlLexer.

- --- - - - - - - - -
Short names:xml+cheetah, xml+spitfire
Filename patterns:None
Mimetypes:application/xml+cheetah, application/xml+spitfire
-
-

ColdfusionHtmlLexer

-
-

Coldfusion markup in html

- --- - - - - - - - -
Short names:cfm
Filename patterns:*.cfm, *.cfml, *.cfc
Mimetypes:application/x-coldfusion
-
-

ColdfusionLexer

-
-

Coldfusion statements

- --- - - - - - - - -
Short names:cfs
Filename patterns:None
Mimetypes:None
-
-

CssDjangoLexer

-
-

Subclass of the DjangoLexer that highlights unlexed data with the -CssLexer.

- --- - - - - - - - -
Short names:css+django, css+jinja
Filename patterns:None
Mimetypes:text/css+django, text/css+jinja
-
-

CssErbLexer

-
-

Subclass of ErbLexer which highlights unlexed data with the CssLexer.

- --- - - - - - - - -
Short names:css+erb, css+ruby
Filename patterns:None
Mimetypes:text/css+ruby
-
-

CssGenshiLexer

-
-

A lexer that highlights CSS definitions in genshi text templates.

- --- - - - - - - - -
Short names:css+genshitext, css+genshi
Filename patterns:None
Mimetypes:text/css+genshi
-
-

CssPhpLexer

-
-

Subclass of PhpLexer which highlights unmatched data with the CssLexer.

- --- - - - - - - - -
Short names:css+php
Filename patterns:None
Mimetypes:text/css+php
-
-

CssSmartyLexer

-
-

Subclass of the SmartyLexer that highlights unlexed data with the -CssLexer.

- --- - - - - - - - -
Short names:css+smarty
Filename patterns:None
Mimetypes:text/css+smarty
-
-

DjangoLexer

-
-

Generic django -and jinja template lexer.

-

It just highlights django/jinja code between the preprocessor directives, -other data is left untouched by the lexer.

- --- - - - - - - - -
Short names:django, jinja
Filename patterns:None
Mimetypes:application/x-django-templating, application/x-jinja
-
-

ErbLexer

-
-

Generic ERB (Ruby Templating) -lexer.

-

Just highlights ruby code between the preprocessor directives, other data -is left untouched by the lexer.

-

All options are also forwarded to the RubyLexer.

- --- - - - - - - - -
Short names:erb
Filename patterns:None
Mimetypes:application/x-ruby-templating
-
-

EvoqueHtmlLexer

-
-

Subclass of the EvoqueLexer that highlights unlexed data with the -HtmlLexer.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:html+evoque
Filename patterns:*.html
Mimetypes:text/html+evoque
-
-

EvoqueLexer

-
-

For files using the Evoque templating system.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:evoque
Filename patterns:*.evoque
Mimetypes:application/x-evoque
-
-

EvoqueXmlLexer

-
-

Subclass of the EvoqueLexer that highlights unlexed data with the -XmlLexer.

-

New in Pygments 1.1.

- --- - - - - - - - -
Short names:xml+evoque
Filename patterns:*.xml
Mimetypes:application/xml+evoque
-
-

GenshiLexer

-
-

A lexer that highlights genshi and -kid kid XML templates.

- --- - - - - - - - -
Short names:genshi, kid, xml+genshi, xml+kid
Filename patterns:*.kid
Mimetypes:application/x-genshi, application/x-kid
-
-

GenshiTextLexer

-
-

A lexer that highlights genshi text -templates.

- --- - - - - - - - -
Short names:genshitext
Filename patterns:None
Mimetypes:application/x-genshi-text, text/x-genshi
-
-

HtmlDjangoLexer

-
-

Subclass of the DjangoLexer that highighlights unlexed data with the -HtmlLexer.

-

Nested Javascript and CSS is highlighted too.

- --- - - - - - - - -
Short names:html+django, html+jinja
Filename patterns:None
Mimetypes:text/html+django, text/html+jinja
-
-

HtmlGenshiLexer

-
-

A lexer that highlights genshi and -kid kid HTML templates.

- --- - - - - - - - -
Short names:html+genshi, html+kid
Filename patterns:None
Mimetypes:text/html+genshi
-
-

HtmlPhpLexer

-
-

Subclass of PhpLexer that highlights unhandled data with the HtmlLexer.

-

Nested Javascript and CSS is highlighted too.

- --- - - - - - - - -
Short names:html+php
Filename patterns:*.phtml
Mimetypes:application/x-php, application/x-httpd-php, application/x-httpd-php3, application/x-httpd-php4, application/x-httpd-php5
-
-

HtmlSmartyLexer

-
-

Subclass of the SmartyLexer that highighlights unlexed data with the -HtmlLexer.

-

Nested Javascript and CSS is highlighted too.

- --- - - - - - - - -
Short names:html+smarty
Filename patterns:None
Mimetypes:text/html+smarty
-
-

JavascriptDjangoLexer

-
-

Subclass of the DjangoLexer that highlights unlexed data with the -JavascriptLexer.

- --- - - - - - - - -
Short names:js+django, javascript+django, js+jinja, javascript+jinja
Filename patterns:None
Mimetypes:application/x-javascript+django, application/x-javascript+jinja, text/x-javascript+django, text/x-javascript+jinja, text/javascript+django, text/javascript+jinja
-
-

JavascriptErbLexer

-
-

Subclass of ErbLexer which highlights unlexed data with the -JavascriptLexer.

- --- - - - - - - - -
Short names:js+erb, javascript+erb, js+ruby, javascript+ruby
Filename patterns:None
Mimetypes:application/x-javascript+ruby, text/x-javascript+ruby, text/javascript+ruby
-
-

JavascriptGenshiLexer

-
-

A lexer that highlights javascript code in genshi text templates.

- --- - - - - - - - -
Short names:js+genshitext, js+genshi, javascript+genshitext, javascript+genshi
Filename patterns:None
Mimetypes:application/x-javascript+genshi, text/x-javascript+genshi, text/javascript+genshi
-
-

JavascriptPhpLexer

-
-

Subclass of PhpLexer which highlights unmatched data with the -JavascriptLexer.

- --- - - - - - - - -
Short names:js+php, javascript+php
Filename patterns:None
Mimetypes:application/x-javascript+php, text/x-javascript+php, text/javascript+php
-
-

JavascriptSmartyLexer

-
-

Subclass of the SmartyLexer that highlights unlexed data with the -JavascriptLexer.

- --- - - - - - - - -
Short names:js+smarty, javascript+smarty
Filename patterns:None
Mimetypes:application/x-javascript+smarty, text/x-javascript+smarty, text/javascript+smarty
-
-

JspLexer

-
-

Lexer for Java Server Pages.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:jsp
Filename patterns:*.jsp
Mimetypes:application/x-jsp
-
-

LassoCssLexer

-
-

Subclass of the LassoLexer which highlights unhandled data with the -CssLexer.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:css+lasso
Filename patterns:None
Mimetypes:text/css+lasso
-
-

LassoHtmlLexer

-
-

Subclass of the LassoLexer which highlights unhandled data with the -HtmlLexer.

-

Nested JavaScript and CSS is also highlighted.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:html+lasso
Filename patterns:None
Mimetypes:text/html+lasso, application/x-httpd-lasso, application/x-httpd-lasso[89]
-
-

LassoJavascriptLexer

-
-

Subclass of the LassoLexer which highlights unhandled data with the -JavascriptLexer.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:js+lasso, javascript+lasso
Filename patterns:None
Mimetypes:application/x-javascript+lasso, text/x-javascript+lasso, text/javascript+lasso
-
-

LassoXmlLexer

-
-

Subclass of the LassoLexer which highlights unhandled data with the -XmlLexer.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:xml+lasso
Filename patterns:None
Mimetypes:application/xml+lasso
-
-

MakoCssLexer

-
-

Subclass of the MakoLexer that highlights unlexer data -with the CssLexer.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:css+mako
Filename patterns:None
Mimetypes:text/css+mako
-
-

MakoHtmlLexer

-
-

Subclass of the MakoLexer that highlights unlexed data -with the HtmlLexer.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:html+mako
Filename patterns:None
Mimetypes:text/html+mako
-
-

MakoJavascriptLexer

-
-

Subclass of the MakoLexer that highlights unlexer data -with the JavascriptLexer.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:js+mako, javascript+mako
Filename patterns:None
Mimetypes:application/x-javascript+mako, text/x-javascript+mako, text/javascript+mako
-
-

MakoLexer

-
-

Generic mako templates lexer. Code that isn't Mako -markup is yielded as Token.Other.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:mako
Filename patterns:*.mao
Mimetypes:application/x-mako
-
-

MakoXmlLexer

-
-

Subclass of the MakoLexer that highlights unlexer data -with the XmlLexer.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:xml+mako
Filename patterns:None
Mimetypes:application/xml+mako
-
-

MasonLexer

-
-

Generic mason templates lexer. Stolen from Myghty lexer. Code that isn't -Mason markup is HTML.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:mason
Filename patterns:*.m, *.mhtml, *.mc, *.mi, autohandler, dhandler
Mimetypes:application/x-mason
-
-

MyghtyCssLexer

-
-

Subclass of the MyghtyLexer that highlights unlexer data -with the CssLexer.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:css+myghty
Filename patterns:None
Mimetypes:text/css+myghty
-
-

MyghtyHtmlLexer

-
-

Subclass of the MyghtyLexer that highlights unlexer data -with the HtmlLexer.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:html+myghty
Filename patterns:None
Mimetypes:text/html+myghty
-
-

MyghtyJavascriptLexer

-
-

Subclass of the MyghtyLexer that highlights unlexer data -with the JavascriptLexer.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:js+myghty, javascript+myghty
Filename patterns:None
Mimetypes:application/x-javascript+myghty, text/x-javascript+myghty, text/javascript+mygthy
-
-

MyghtyLexer

-
-

Generic myghty templates lexer. Code that isn't Myghty -markup is yielded as Token.Other.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:myghty
Filename patterns:*.myt, autodelegate
Mimetypes:application/x-myghty
-
-

MyghtyXmlLexer

-
-

Subclass of the MyghtyLexer that highlights unlexer data -with the XmlLexer.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:xml+myghty
Filename patterns:None
Mimetypes:application/xml+myghty
-
-

RhtmlLexer

-
-

Subclass of the ERB lexer that highlights the unlexed data with the -html lexer.

-

Nested Javascript and CSS is highlighted too.

- --- - - - - - - - -
Short names:rhtml, html+erb, html+ruby
Filename patterns:*.rhtml
Mimetypes:text/html+ruby
-
-

SmartyLexer

-
-

Generic Smarty template lexer.

-

Just highlights smarty code between the preprocessor directives, other -data is left untouched by the lexer.

- --- - - - - - - - -
Short names:smarty
Filename patterns:*.tpl
Mimetypes:application/x-smarty
-
-

SspLexer

-
-

Lexer for Scalate Server Pages.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:ssp
Filename patterns:*.ssp
Mimetypes:application/x-ssp
-
-

TeaTemplateLexer

-
-

Lexer for Tea Templates.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:tea
Filename patterns:*.tea
Mimetypes:text/x-tea
-
-

VelocityHtmlLexer

-
-

Subclass of the VelocityLexer that highlights unlexer data -with the HtmlLexer.

- --- - - - - - - - -
Short names:html+velocity
Filename patterns:None
Mimetypes:text/html+velocity
-
-

VelocityLexer

-
-

Generic Velocity template lexer.

-

Just highlights velocity directives and variable references, other -data is left untouched by the lexer.

- --- - - - - - - - -
Short names:velocity
Filename patterns:*.vm, *.fhtml
Mimetypes:None
-
-

VelocityXmlLexer

-
-

Subclass of the VelocityLexer that highlights unlexer data -with the XmlLexer.

- --- - - - - - - - -
Short names:xml+velocity
Filename patterns:None
Mimetypes:application/xml+velocity
-
-

XmlDjangoLexer

-
-

Subclass of the DjangoLexer that highlights unlexed data with the -XmlLexer.

- --- - - - - - - - -
Short names:xml+django, xml+jinja
Filename patterns:None
Mimetypes:application/xml+django, application/xml+jinja
-
-

XmlErbLexer

-
-

Subclass of ErbLexer which highlights data outside preprocessor -directives with the XmlLexer.

- --- - - - - - - - -
Short names:xml+erb, xml+ruby
Filename patterns:None
Mimetypes:application/xml+ruby
-
-

XmlPhpLexer

-
-

Subclass of PhpLexer that higlights unhandled data with the XmlLexer.

- --- - - - - - - - -
Short names:xml+php
Filename patterns:None
Mimetypes:application/xml+php
-
-

XmlSmartyLexer

-
-

Subclass of the SmartyLexer that highlights unlexed data with the -XmlLexer.

- --- - - - - - - - -
Short names:xml+smarty
Filename patterns:None
Mimetypes:application/xml+smarty
-
-
-
-

Lexers for non-source code file types

-

ApacheConfLexer

-
-

Lexer for configuration files following the Apache config file -format.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:apacheconf, aconf, apache
Filename patterns:.htaccess, apache.conf, apache2.conf
Mimetypes:text/x-apacheconf
-
-

BBCodeLexer

-
-

A lexer that highlights BBCode(-like) syntax.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:bbcode
Filename patterns:None
Mimetypes:text/x-bbcode
-
-

BaseMakefileLexer

-
-

Lexer for simple Makefiles (no preprocessing).

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:basemake
Filename patterns:None
Mimetypes:None
-
-

CMakeLexer

-
-

Lexer for CMake files.

-

New in Pygments 1.2.

- --- - - - - - - - -
Short names:cmake
Filename patterns:*.cmake, CMakeLists.txt
Mimetypes:text/x-cmake
-
-

DarcsPatchLexer

-
-

DarcsPatchLexer is a lexer for the various versions of the darcs patch -format. Examples of this format are derived by commands such as -darcs annotate --patch and darcs send.

-

New in Pygments 0.10.

- --- - - - - - - - -
Short names:dpatch
Filename patterns:*.dpatch, *.darcspatch
Mimetypes:None
-
-

DebianControlLexer

-
-

Lexer for Debian control files and apt-cache show <pkg> outputs.

-

New in Pygments 0.9.

- --- - - - - - - - -
Short names:control
Filename patterns:control
Mimetypes:None
-
-

DiffLexer

-
-

Lexer for unified or context-style diffs or patches.

- --- - - - - - - - -
Short names:diff, udiff
Filename patterns:*.diff, *.patch
Mimetypes:text/x-diff, text/x-patch
-
-

GettextLexer

-
-

Lexer for Gettext catalog files.

-

New in Pygments 0.9.

- --- - - - - - - - -
Short names:pot, po
Filename patterns:*.pot, *.po
Mimetypes:application/x-gettext, text/x-gettext, text/gettext
-
-

GroffLexer

-
-

Lexer for the (g)roff typesetting language, supporting groff -extensions. Mainly useful for highlighting manpage sources.

-

New in Pygments 0.6.

- --- - - - - - - - -
Short names:groff, nroff, man
Filename patterns:*.[1234567], *.man
Mimetypes:application/x-troff, text/troff
-
-

HttpLexer

-
-

Lexer for HTTP sessions.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:http
Filename patterns:None
Mimetypes:None
-
-

HxmlLexer

-
-

Lexer for haXe build files.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:haxeml, hxml
Filename patterns:*.hxml
Mimetypes:None
-
-

IniLexer

-
-

Lexer for configuration files in INI style.

- --- - - - - - - - -
Short names:ini, cfg
Filename patterns:*.ini, *.cfg
Mimetypes:text/x-ini
-
-

IrcLogsLexer

-
-

Lexer for IRC logs in irssi, xchat or weechat style.

- --- - - - - - - - -
Short names:irc
Filename patterns:*.weechatlog
Mimetypes:text/x-irclog
-
-

LighttpdConfLexer

-
-

Lexer for Lighttpd configuration files.

-

New in Pygments 0.11.

- --- - - - - - - - -
Short names:lighty, lighttpd
Filename patterns:None
Mimetypes:text/x-lighttpd-conf
-
-

MakefileLexer

-
-

Lexer for BSD and GNU make extensions (lenient enough to handle both in -the same file even).

-

Rewritten in Pygments 0.10.

- --- - - - - - - - -
Short names:make, makefile, mf, bsdmake
Filename patterns:*.mak, Makefile, makefile, Makefile.*, GNUmakefile
Mimetypes:text/x-makefile
-
-

MoinWikiLexer

-
-

For MoinMoin (and Trac) Wiki markup.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:trac-wiki, moin
Filename patterns:None
Mimetypes:text/x-trac-wiki
-
-

NginxConfLexer

-
-

Lexer for Nginx configuration files.

-

New in Pygments 0.11.

- --- - - - - - - - -
Short names:nginx
Filename patterns:None
Mimetypes:text/x-nginx-conf
-
-

PropertiesLexer

-
-

Lexer for configuration files in Java's properties format.

-

New in Pygments 1.4.

- --- - - - - - - - -
Short names:properties
Filename patterns:*.properties
Mimetypes:text/x-java-properties
-
-

PyPyLogLexer

-
-

Lexer for PyPy log files.

-

New in Pygments 1.5.

- --- - - - - - - - -
Short names:pypylog, pypy
Filename patterns:*.pypylog
Mimetypes:application/x-pypylog
-
-

RegeditLexer

-
-

Lexer for Windows Registry files produced -by regedit.

-

New in Pygments 1.6.

- --- - - - - - - - -
Short names:None
Filename patterns:*.reg
Mimetypes:text/x-windows-registry
-
-

RstLexer

-
-

For reStructuredText markup.

-

New in Pygments 0.7.

-

Additional options accepted:

-
-
handlecodeblocks
-
Highlight the contents of .. sourcecode:: langauge and -.. code:: language directives with a lexer for the given -language (default: True). New in Pygments 0.8.
-
- --- - - - - - - - -
Short names:rst, rest, restructuredtext
Filename patterns:*.rst, *.rest
Mimetypes:text/x-rst, text/prs.fallenstein.rst
-
-

SourcesListLexer

-
-

Lexer that highlights debian sources.list files.

-

New in Pygments 0.7.

- --- - - - - - - - -
Short names:sourceslist, sources.list
Filename patterns:sources.list
Mimetypes:None
-
-

SquidConfLexer

-
-

Lexer for squid configuration files.

-

New in Pygments 0.9.

- --- - - - - - - - -
Short names:squidconf, squid.conf, squid
Filename patterns:squid.conf
Mimetypes:text/x-squidconf
-
-

TexLexer

-
-

Lexer for the TeX and LaTeX typesetting languages.

- --- - - - - - - - -
Short names:tex, latex
Filename patterns:*.tex, *.aux, *.toc
Mimetypes:text/x-tex, text/x-latex
-
-

VimLexer

-
-

Lexer for VimL script files.

-

New in Pygments 0.8.

- --- - - - - - - - -
Short names:vim
Filename patterns:*.vim, .vimrc, .exrc, .gvimrc, vimrc, exrc, gvimrc, vimrc, gvimrc
Mimetypes:text/x-vim
-
-

YamlLexer

-
-

Lexer for YAML, a human-friendly data serialization -language.

-

New in Pygments 0.11.

- --- - - - - - - - -
Short names:yaml
Filename patterns:*.yaml, *.yml
Mimetypes:text/x-yaml
-
-
- -
-

Iterating over all lexers

-

New in Pygments 0.6.

-

To get all lexers (both the builtin and the plugin ones), you can -use the get_all_lexers() function from the pygments.lexers -module:

-
>>> from pygments.lexers import get_all_lexers
->>> i = get_all_lexers()
->>> i.next()
-('Diff', ('diff',), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch'))
->>> i.next()
-('Delphi', ('delphi', 'objectpascal', 'pas', 'pascal'), ('*.pas',), ('text/x-pascal',))
->>> i.next()
-('XML+Ruby', ('xml+erb', 'xml+ruby'), (), ())
-
-

As you can see, the return value is an iterator which yields tuples -in the form (name, aliases, filetypes, mimetypes).

-
- -
- - - \ No newline at end of file diff --git a/docs/build/moinmoin.html b/docs/build/moinmoin.html deleted file mode 100644 index 4851501..0000000 --- a/docs/build/moinmoin.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - Using Pygments with MoinMoin — Pygments - - - - -
-

Pygments

-

Using Pygments with MoinMoin

- - « Back To Index - - - -

From Pygments 0.7, the source distribution ships a Moin parser plugin that -can be used to get Pygments highlighting in Moin wiki pages.

-

To use it, copy the file external/moin-parser.py from the Pygments -distribution to the data/plugin/parser subdirectory of your Moin instance. -Edit the options at the top of the file (currently ATTACHMENTS and -INLINESTYLES) and rename the file to the name that the parser directive -should have. For example, if you name the file code.py, you can get a -highlighted Python code sample with this Wiki markup:

-
-{{{
-#!code python
-[...]
-}}}
-
-

where python is the Pygments name of the lexer to use.

-

Additionally, if you set the ATTACHMENTS option to True, Pygments will also -be called for all attachments for whose filenames there is no other parser -registered.

-

You are responsible for including CSS rules that will map the Pygments CSS -classes to colors. You can output a stylesheet file with pygmentize, put it -into the htdocs directory of your Moin instance and then include it in the -stylesheets configuration option in the Moin config, e.g.:

-
-stylesheets = [('screen', '/htdocs/pygments.css')]
-
-

If you do not want to do that and are willing to accept larger HTML output, you -can set the INLINESTYLES option to True.

- -
- - - \ No newline at end of file diff --git a/docs/build/plugins.html b/docs/build/plugins.html deleted file mode 100644 index 5cb2229..0000000 --- a/docs/build/plugins.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - Register Plugins — Pygments - - - - -
-

Pygments

-

Register Plugins

- - « Back To Index - - -
-

Contents

- -
- -

If you want to extend Pygments without hacking the sources, but want to -use the lexer/formatter/style/filter lookup functions (lexers.get_lexer_by_name -et al.), you can use setuptools entrypoints to add new lexers, formatters -or styles as if they were in the Pygments core.

-

That means you can use your highlighter modules with the pygmentize script, -which relies on the mentioned functions.

-
-

Entrypoints

-

Here is a list of setuptools entrypoints that Pygments understands:

-

pygments.lexers

-
-

This entrypoint is used for adding new lexers to the Pygments core. -The name of the entrypoint values doesn't really matter, Pygments extracts -required metadata from the class definition:

-
[pygments.lexers]
-yourlexer = yourmodule:YourLexer
-
-

Note that you have to define name, aliases and filename -attributes so that you can use the highlighter from the command line:

-
class YourLexer(...):
-    name = 'Name Of Your Lexer'
-    aliases = ['alias']
-    filenames = ['*.ext']
-
-
-

pygments.formatters

-
-

You can use this entrypoint to add new formatters to Pygments. The -name of an entrypoint item is the name of the formatter. If you -prefix the name with a slash it's used as a filename pattern:

-
[pygments.formatters]
-yourformatter = yourmodule:YourFormatter
-/.ext = yourmodule:YourFormatter
-
-
-

pygments.styles

-
-

To add a new style you can use this entrypoint. The name of the entrypoint -is the name of the style:

-
[pygments.styles]
-yourstyle = yourmodule:YourStyle
-
-
-

pygments.filters

-
-

Use this entrypoint to register a new filter. The name of the -entrypoint is the name of the filter:

-
[pygments.filters]
-yourfilter = yourmodule:YourFilter
-
-
-
-
-

How To Use Entrypoints

-

This documentation doesn't explain how to use those entrypoints because this is -covered in the setuptools documentation. That page should cover everything -you need to write a plugin.

-
-
-

Extending The Core

-

If you have written a Pygments plugin that is open source, please inform us -about that. There is a high chance that we'll add it to the Pygments -distribution.

-
- -
- - - \ No newline at end of file diff --git a/docs/build/quickstart.html b/docs/build/quickstart.html deleted file mode 100644 index 234aa80..0000000 --- a/docs/build/quickstart.html +++ /dev/null @@ -1,390 +0,0 @@ - - - - Introduction and Quickstart — Pygments - - - - -
-

Pygments

-

Introduction and Quickstart

- - « Back To Index - - - - - -

Welcome to Pygments! This document explains the basic concepts and terms and -gives a few examples of how to use the library.

-
-

Architecture

-

There are four types of components that work together highlighting a piece of -code:

-
    -
  • A lexer splits the source into tokens, fragments of the source that -have a token type that determines what the text represents semantically -(e.g., keyword, string, or comment). There is a lexer for every language -or markup format that Pygments supports.
  • -
  • The token stream can be piped through filters, which usually modify -the token types or text fragments, e.g. uppercasing all keywords.
  • -
  • A formatter then takes the token stream and writes it to an output -file, in a format such as HTML, LaTeX or RTF.
  • -
  • While writing the output, a style determines how to highlight all the -different token types. It maps them to attributes like "red and bold".
  • -
-
-
-

Example

-

Here is a small example for highlighting Python code:

-
from pygments import highlight
-from pygments.lexers import PythonLexer
-from pygments.formatters import HtmlFormatter
-
-code = 'print "Hello World"'
-print highlight(code, PythonLexer(), HtmlFormatter())
-
-

which prints something like this:

-
<div class="highlight">
-<pre><span class="k">print</span> <span class="s">&quot;Hello World&quot;</span></pre>
-</div>
-
-

As you can see, Pygments uses CSS classes (by default, but you can change that) -instead of inline styles in order to avoid outputting redundant style information over -and over. A CSS stylesheet that contains all CSS classes possibly used in the output -can be produced by:

-
print HtmlFormatter().get_style_defs('.highlight')
-
-

The argument to get_style_defs is used as an additional CSS selector: the output -may look like this:

-
.highlight .k { color: #AA22FF; font-weight: bold }
-.highlight .s { color: #BB4444 }
-...
-
-
-
-

Options

-

The highlight() function supports a fourth argument called outfile, it must be -a file object if given. The formatted output will then be written to this file -instead of being returned as a string.

-

Lexers and formatters both support options. They are given to them as keyword -arguments either to the class or to the lookup method:

-
from pygments import highlight
-from pygments.lexers import get_lexer_by_name
-from pygments.formatters import HtmlFormatter
-
-lexer = get_lexer_by_name("python", stripall=True)
-formatter = HtmlFormatter(linenos=True, cssclass="source")
-result = highlight(code, lexer, formatter)
-
-

This makes the lexer strip all leading and trailing whitespace from the input -(stripall option), lets the formatter output line numbers (linenos option), -and sets the wrapping <div>'s class to source (instead of -highlight).

-

Important options include:

-
-
encoding : for lexers and formatters
-
Since Pygments uses Unicode strings internally, this determines which -encoding will be used to convert to or from byte strings.
-
style : for formatters
-
The name of the style to use when writing the output.
-
-

For an overview of builtin lexers and formatters and their options, visit the -lexer and formatters lists.

-

For a documentation on filters, see this page.

-
-
-

Lexer and formatter lookup

-

If you want to lookup a built-in lexer by its alias or a filename, you can use -one of the following methods:

-
>>> from pygments.lexers import (get_lexer_by_name,
-...     get_lexer_for_filename, get_lexer_for_mimetype)
-
->>> get_lexer_by_name('python')
-<pygments.lexers.PythonLexer>
-
->>> get_lexer_for_filename('spam.rb')
-<pygments.lexers.RubyLexer>
-
->>> get_lexer_for_mimetype('text/x-perl')
-<pygments.lexers.PerlLexer>
-
-

All these functions accept keyword arguments; they will be passed to the lexer -as options.

-

A similar API is available for formatters: use get_formatter_by_name() and -get_formatter_for_filename() from the pygments.formatters module -for this purpose.

-
-
-

Guessing lexers

-

If you don't know the content of the file, or you want to highlight a file -whose extension is ambiguous, such as .html (which could contain plain HTML -or some template tags), use these functions:

-
>>> from pygments.lexers import guess_lexer, guess_lexer_for_filename
-
->>> guess_lexer('#!/usr/bin/python\nprint "Hello World!"')
-<pygments.lexers.PythonLexer>
-
->>> guess_lexer_for_filename('test.py', 'print "Hello World!"')
-<pygments.lexers.PythonLexer>
-
-

guess_lexer() passes the given content to the lexer classes' analyse_text() -method and returns the one for which it returns the highest number.

-

All lexers have two different filename pattern lists: the primary and the -secondary one. The get_lexer_for_filename() function only uses the primary -list, whose entries are supposed to be unique among all lexers. -guess_lexer_for_filename(), however, will first loop through all lexers and -look at the primary and secondary filename patterns if the filename matches. -If only one lexer matches, it is returned, else the guessing mechanism of -guess_lexer() is used with the matching lexers.

-

As usual, keyword arguments to these functions are given to the created lexer -as options.

-
-
-

Command line usage

-

You can use Pygments from the command line, using the pygmentize script:

-
-$ pygmentize test.py
-
-

will highlight the Python file test.py using ANSI escape sequences -(a.k.a. terminal colors) and print the result to standard output.

-

To output HTML, use the -f option:

-
-$ pygmentize -f html -o test.html test.py
-
-

to write an HTML-highlighted version of test.py to the file test.html. -Note that it will only be a snippet of HTML, if you want a full HTML document, -use the "full" option:

-
-$ pygmentize -f html -O full -o test.html test.py
-
-

This will produce a full HTML document with included stylesheet.

-

A style can be selected with -O style=<name>.

-

If you need a stylesheet for an existing HTML file using Pygments CSS classes, -it can be created with:

-
-$ pygmentize -S default -f html > style.css
-
-

where default is the style name.

-

More options and tricks and be found in the command line reference.

-
- -
- - - \ No newline at end of file diff --git a/docs/build/rstdirective.html b/docs/build/rstdirective.html deleted file mode 100644 index f7f54ec..0000000 --- a/docs/build/rstdirective.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - Using Pygments in ReST documents — Pygments - - - - -
-

Pygments

-

Using Pygments in ReST documents

- - « Back To Index - - - -

Many Python people use ReST for documentation their sourcecode, programs, -scripts et cetera. This also means that documentation often includes sourcecode -samples or snippets.

-

You can easily enable Pygments support for your ReST texts using a custom -directive -- this is also how this documentation displays source code.

-

From Pygments 0.9, the directive is shipped in the distribution as -external/rst-directive.py. You can copy and adapt this code to your liking.

- - -
- - - \ No newline at end of file diff --git a/docs/build/styles.html b/docs/build/styles.html deleted file mode 100644 index 0a897de..0000000 --- a/docs/build/styles.html +++ /dev/null @@ -1,341 +0,0 @@ - - - - Styles — Pygments - - - - -
-

Pygments

-

Styles

- - « Back To Index - - - - - -

Pygments comes with some builtin styles that work for both the HTML and -LaTeX formatter.

-

The builtin styles can be looked up with the get_style_by_name function:

-
>>> from pygments.styles import get_style_by_name
->>> get_style_by_name('colorful')
-<class 'pygments.styles.colorful.ColorfulStyle'>
-
-

You can pass a instance of a Style class to a formatter as the style -option in form of a string:

-
>>> from pygments.styles import get_style_by_name
->>> HtmlFormatter(style='colorful').style
-<class 'pygments.styles.colorful.ColorfulStyle'>
-
-

Or you can also import your own style (which must be a subclass of -pygments.style.Style) and pass it to the formatter:

-
>>> from yourapp.yourmodule import YourStyle
->>> HtmlFormatter(style=YourStyle).style
-<class 'yourapp.yourmodule.YourStyle'>
-
-
-

Creating Own Styles

-

So, how to create a style? All you have to do is to subclass Style and -define some styles:

-
from pygments.style import Style
-from pygments.token import Keyword, Name, Comment, String, Error, \
-     Number, Operator, Generic
-
-class YourStyle(Style):
-    default_style = ""
-    styles = {
-        Comment:                'italic #888',
-        Keyword:                'bold #005',
-        Name:                   '#f00',
-        Name.Function:          '#0f0',
-        Name.Class:             'bold #0f0',
-        String:                 'bg:#eee #111'
-    }
-
-

That's it. There are just a few rules. When you define a style for Name -the style automatically also affects Name.Function and so on. If you -defined 'bold' and you don't want boldface for a subtoken use 'nobold'.

-

(Philosophy: the styles aren't written in CSS syntax since this way -they can be used for a variety of formatters.)

-

default_style is the style inherited by all token types.

-

To make the style usable for Pygments, you must

-
    -
  • either register it as a plugin (see the plugin docs)
  • -
  • or drop it into the styles subpackage of your Pygments distribution one style -class per style, where the file name is the style name and the class name is -StylenameClass. For example, if your style should be called -"mondrian", name the class MondrianStyle, put it into the file -mondrian.py and this file into the pygments.styles subpackage -directory.
  • -
-
-
-

Style Rules

-

Here a small overview of all allowed styles:

-
-
bold
-
render text as bold
-
nobold
-
don't render text as bold (to prevent subtokens being highlighted bold)
-
italic
-
render text italic
-
noitalic
-
don't render text as italic
-
underline
-
render text underlined
-
nounderline
-
don't render text underlined
-
bg:
-
transparent background
-
bg:#000000
-
background color (black)
-
border:
-
no border
-
border:#ffffff
-
border color (white)
-
#ff0000
-
text color (red)
-
noinherit
-
don't inherit styles from supertoken
-
-

Note that there may not be a space between bg: and the color value -since the style definition string is split at whitespace. -Also, using named colors is not allowed since the supported color names -vary for different formatters.

-

Furthermore, not all lexers might support every style.

-
-
-

Builtin Styles

-

Pygments ships some builtin styles which are maintained by the Pygments team.

-

To get a list of known styles you can use this snippet:

-
>>> from pygments.styles import STYLE_MAP
->>> STYLE_MAP.keys()
-['default', 'emacs', 'friendly', 'colorful']
-
-
-
-

Getting a list of available styles

-

New in Pygments 0.6.

-

Because it could be that a plugin registered a style, there is -a way to iterate over all styles:

-
>>> from pygments.styles import get_all_styles
->>> styles = list(get_all_styles())
-
-
- -
- - - \ No newline at end of file diff --git a/docs/build/tokens.html b/docs/build/tokens.html deleted file mode 100644 index fe919ec..0000000 --- a/docs/build/tokens.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - Builtin Tokens — Pygments - - - - -
-

Pygments

-

Builtin Tokens

- - « Back To Index - - -
-

Contents

- -
- - -

Inside the pygments.token module, there is a special object called Token -that is used to create token types.

-

You can create a new token type by accessing an attribute of Token:

-
>>> from pygments.token import Token
->>> Token.String
-Token.String
->>> Token.String is Token.String
-True
-
-

Note that tokens are singletons so you can use the is operator for comparing -token types.

-

As of Pygments 0.7 you can also use the in operator to perform set tests:

-
>>> from pygments.token import Comment
->>> Comment.Single in Comment
-True
->>> Comment in Comment.Multi
-False
-
-

This can be useful in filters and if you write lexers on your own without -using the base lexers.

-

You can also split a token type into a hierarchy, and get the parent of it:

-
>>> String.split()
-[Token, Token.Literal, Token.Literal.String]
->>> String.parent
-Token.Literal
-
-

In principle, you can create an unlimited number of token types but nobody can -guarantee that a style would define style rules for a token type. Because of -that, Pygments proposes some global token types defined in the -pygments.token.STANDARD_TYPES dict.

-

For some tokens aliases are already defined:

-
>>> from pygments.token import String
->>> String
-Token.Literal.String
-
-

Inside the pygments.token module the following aliases are defined:

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TextToken.Textfor any type of text data
WhitespaceToken.Text.Whitespacefor specially highlighted whitespace
ErrorToken.Errorrepresents lexer errors
OtherToken.Otherspecial token for data not -matched by a parser (e.g. HTML -markup in PHP code)
KeywordToken.Keywordany kind of keywords
NameToken.Namevariable/function names
LiteralToken.LiteralAny literals
StringToken.Literal.Stringstring literals
NumberToken.Literal.Numbernumber literals
OperatorToken.Operatoroperators (+, not...)
PunctuationToken.Punctuationpunctuation ([, (...)
CommentToken.Commentany kind of comments
GenericToken.Genericgeneric tokens (have a look at -the explanation below)
-

The Whitespace token type is new in Pygments 0.8. It is used only by the -VisibleWhitespaceFilter currently.

-

Normally you just create token types using the already defined aliases. For each -of those token aliases, a number of subtypes exists (excluding the special tokens -Token.Text, Token.Error and Token.Other)

-

The is_token_subtype() function in the pygments.token module can be used to -test if a token type is a subtype of another (such as Name.Tag and Name). -(This is the same as Name.Tag in Name. The overloaded in operator was newly -introduced in Pygments 0.7, the function still exists for backwards -compatiblity.)

-

With Pygments 0.7, it's also possible to convert strings to token types (for example -if you want to supply a token from the command line):

-
>>> from pygments.token import String, string_to_tokentype
->>> string_to_tokentype("String")
-Token.Literal.String
->>> string_to_tokentype("Token.Literal.String")
-Token.Literal.String
->>> string_to_tokentype(String)
-Token.Literal.String
-
-
-

Keyword Tokens

-
-
Keyword
-
For any kind of keyword (especially if it doesn't match any of the -subtypes of course).
-
Keyword.Constant
-
For keywords that are constants (e.g. None in future Python versions).
-
Keyword.Declaration
-
For keywords used for variable declaration (e.g. var in some programming -languages like JavaScript).
-
Keyword.Namespace
-
For keywords used for namespace declarations (e.g. import in Python and -Java and package in Java).
-
Keyword.Pseudo
-
For keywords that aren't really keywords (e.g. None in old Python -versions).
-
Keyword.Reserved
-
For reserved keywords.
-
Keyword.Type
-
For builtin types that can't be used as identifiers (e.g. int, -char etc. in C).
-
-
-
-

Name Tokens

-
-
Name
-
For any name (variable names, function names, classes).
-
Name.Attribute
-
For all attributes (e.g. in HTML tags).
-
Name.Builtin
-
Builtin names; names that are available in the global namespace.
-
Name.Builtin.Pseudo
-
Builtin names that are implicit (e.g. self in Ruby, this in Java).
-
Name.Class
-
Class names. Because no lexer can know if a name is a class or a function -or something else this token is meant for class declarations.
-
Name.Constant
-
Token type for constants. In some languages you can recognise a token by the -way it's defined (the value after a const keyword for example). In -other languages constants are uppercase by definition (Ruby).
-
Name.Decorator
-
Token type for decorators. Decorators are synatic elements in the Python -language. Similar syntax elements exist in C# and Java.
-
Name.Entity
-
Token type for special entities. (e.g. &nbsp; in HTML).
-
Name.Exception
-
Token type for exception names (e.g. RuntimeError in Python). Some languages -define exceptions in the function signature (Java). You can highlight -the name of that exception using this token then.
-
Name.Function
-
Token type for function names.
-
Name.Label
-
Token type for label names (e.g. in languages that support goto).
-
Name.Namespace
-
Token type for namespaces. (e.g. import paths in Java/Python), names following -the module/namespace keyword in other languages.
-
Name.Other
-
Other names. Normally unused.
-
Name.Tag
-
Tag names (in HTML/XML markup or configuration files).
-
Name.Variable
-
Token type for variables. Some languages have prefixes for variable names -(PHP, Ruby, Perl). You can highlight them using this token.
-
Name.Variable.Class
-
same as Name.Variable but for class variables (also static variables).
-
Name.Variable.Global
-
same as Name.Variable but for global variables (used in Ruby, for -example).
-
Name.Variable.Instance
-
same as Name.Variable but for instance variables.
-
-
-
-

Literals

-
-
Literal
-
For any literal (if not further defined).
-
Literal.Date
-
for date literals (e.g. 42d in Boo).
-
String
-
For any string literal.
-
String.Backtick
-
Token type for strings enclosed in backticks.
-
String.Char
-
Token type for single characters (e.g. Java, C).
-
String.Doc
-
Token type for documentation strings (for example Python).
-
String.Double
-
Double quoted strings.
-
String.Escape
-
Token type for escape sequences in strings.
-
String.Heredoc
-
Token type for "heredoc" strings (e.g. in Ruby or Perl).
-
String.Interpol
-
Token type for interpolated parts in strings (e.g. #{foo} in Ruby).
-
String.Other
-
Token type for any other strings (for example %q{foo} string constructs -in Ruby).
-
String.Regex
-
Token type for regular expression literals (e.g. /foo/ in JavaScript).
-
String.Single
-
Token type for single quoted strings.
-
String.Symbol
-
Token type for symbols (e.g. :foo in LISP or Ruby).
-
Number
-
Token type for any number literal.
-
Number.Float
-
Token type for float literals (e.g. 42.0).
-
Number.Hex
-
Token type for hexadecimal number literals (e.g. 0xdeadbeef).
-
Number.Integer
-
Token type for integer literals (e.g. 42).
-
Number.Integer.Long
-
Token type for long integer literals (e.g. 42L in Python).
-
Number.Oct
-
Token type for octal literals.
-
-
-
-

Operators

-
-
Operator
-
For any punctuation operator (e.g. +, -).
-
Operator.Word
-
For any operator that is a word (e.g. not).
-
-
-
-

Punctuation

-

New in Pygments 0.7.

-
-
Punctuation
-
For any punctuation which is not an operator (e.g. [, (...)
-
-
-
-

Comments

-
-
Comment
-
Token type for any comment.
-
Comment.Multiline
-
Token type for multiline comments.
-
Comment.Preproc
-
Token type for preprocessor comments (also <?php/<% constructs).
-
Comment.Single
-
Token type for comments that end at the end of a line (e.g. # foo).
-
Comment.Special
-
Special data in comments. For example code tags, author and license -information, etc.
-
-
-
-

Generic Tokens

-

Generic tokens are for special lexers like the DiffLexer that doesn't really -highlight a programming language but a patch file.

-
-
Generic
-
A generic, unstyled token. Normally you don't use this token type.
-
Generic.Deleted
-
Marks the token value as deleted.
-
Generic.Emph
-
Marks the token value as emphasized.
-
Generic.Error
-
Marks the token value as an error message.
-
Generic.Heading
-
Marks the token value as headline.
-
Generic.Inserted
-
Marks the token value as inserted.
-
Generic.Output
-
Marks the token value as program output (e.g. for python cli lexer).
-
Generic.Prompt
-
Marks the token value as command prompt (e.g. bash lexer).
-
Generic.Strong
-
Marks the token value as bold (e.g. for rst lexer).
-
Generic.Subheading
-
Marks the token value as subheadline.
-
Generic.Traceback
-
Marks the token value as a part of an error traceback.
-
-
- -
- - - \ No newline at end of file diff --git a/docs/build/unicode.html b/docs/build/unicode.html deleted file mode 100644 index ba7784a..0000000 --- a/docs/build/unicode.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - Unicode and Encodings — Pygments - - - - -
-

Pygments

-

Unicode and Encodings

- - « Back To Index - - -

Since Pygments 0.6, all lexers use unicode strings internally. Because of that -you might encounter the occasional UnicodeDecodeError if you pass strings with the -wrong encoding.

-

Per default all lexers have their input encoding set to latin1. -If you pass a lexer a string object (not unicode), it tries to decode the data -using this encoding. -You can override the encoding using the encoding lexer option. If you have the -chardet library installed and set the encoding to chardet if will ananlyse -the text and use the encoding it thinks is the right one automatically:

-
from pygments.lexers import PythonLexer
-lexer = PythonLexer(encoding='chardet')
-
-

The best way is to pass Pygments unicode objects. In that case you can't get -unexpected output.

-

The formatters now send Unicode objects to the stream if you don't set the -output encoding. You can do so by passing the formatters an encoding option:

-
from pygments.formatters import HtmlFormatter
-f = HtmlFormatter(encoding='utf-8')
-
-

You will have to set this option if you have non-ASCII characters in the -source and the output stream does not accept Unicode written to it! -This is the case for all regular files and for terminals.

-

Note: The Terminal formatter tries to be smart: if its output stream has an -encoding attribute, and you haven't set the option, it will encode any -Unicode string with this encoding before writing it. This is the case for -sys.stdout, for example. The other formatters don't have that behavior.

-

Another note: If you call Pygments via the command line (pygmentize), -encoding is handled differently, see the command line docs.

-

New in Pygments 0.7: the formatters now also accept an outencoding option -which will override the encoding option if given. This makes it possible to -use a single options dict with lexers and formatters, and still have different -input and output encodings.

- -
- - - \ No newline at end of file diff --git a/docs/generate.py b/docs/generate.py deleted file mode 100755 index f540507..0000000 --- a/docs/generate.py +++ /dev/null @@ -1,472 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - Generate Pygments Documentation - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Generates a bunch of html files containing the documentation. - - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import os -import sys -from datetime import datetime -from cgi import escape - -from docutils import nodes -from docutils.parsers.rst import directives -from docutils.core import publish_parts -from docutils.writers import html4css1 - -from jinja2 import Template - -# try to use the right Pygments to build the docs -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) - -from pygments import highlight, __version__ -from pygments.lexers import get_lexer_by_name -from pygments.formatters import HtmlFormatter - - -LEXERDOC = ''' -`%s` -%s - :Short names: %s - :Filename patterns: %s - :Mimetypes: %s - -''' - -def generate_lexer_docs(): - from pygments.lexers import LEXERS - - out = [] - - modules = {} - moduledocstrings = {} - for classname, data in sorted(LEXERS.iteritems(), key=lambda x: x[0]): - module = data[0] - mod = __import__(module, None, None, [classname]) - cls = getattr(mod, classname) - if not cls.__doc__: - print "Warning: %s does not have a docstring." % classname - modules.setdefault(module, []).append(( - classname, - cls.__doc__, - ', '.join(data[2]) or 'None', - ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None', - ', '.join(data[4]) or 'None')) - if module not in moduledocstrings: - moduledocstrings[module] = mod.__doc__ - - for module, lexers in sorted(modules.iteritems(), key=lambda x: x[0]): - heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.') - out.append('\n' + heading + '\n' + '-'*len(heading) + '\n') - for data in lexers: - out.append(LEXERDOC % data) - return ''.join(out).decode('utf-8') - -def generate_formatter_docs(): - from pygments.formatters import FORMATTERS - - out = [] - for cls, data in sorted(FORMATTERS.iteritems(), - key=lambda x: x[0].__name__): - heading = cls.__name__ - out.append('`' + heading + '`\n' + '-'*(2+len(heading)) + '\n') - out.append(cls.__doc__) - out.append(''' - :Short names: %s - :Filename patterns: %s - - -''' % (', '.join(data[1]) or 'None', ', '.join(data[2]).replace('*', '\\*') or 'None')) - return ''.join(out).decode('utf-8') - -def generate_filter_docs(): - from pygments.filters import FILTERS - - out = [] - for name, cls in FILTERS.iteritems(): - out.append(''' -`%s` -%s - :Name: %s -''' % (cls.__name__, cls.__doc__, name)) - return ''.join(out).decode('utf-8') - -def generate_changelog(): - fn = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', - 'CHANGES')) - f = file(fn) - result = [] - in_header = False - header = True - for line in f: - if header: - if not in_header and line.strip(): - in_header = True - elif in_header and not line.strip(): - header = False - else: - result.append(line.rstrip()) - f.close() - return '\n'.join(result).decode('utf-8') - -def generate_authors(): - fn = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', - 'AUTHORS')) - f = file(fn) - r = f.read().rstrip().decode('utf-8') - f.close() - return r - -LEXERDOCS = generate_lexer_docs() -FORMATTERDOCS = generate_formatter_docs() -FILTERDOCS = generate_filter_docs() -CHANGELOG = generate_changelog() -AUTHORS = generate_authors() - - -PYGMENTS_FORMATTER = HtmlFormatter(style='pastie', cssclass='syntax') - -USAGE = '''\ -Usage: %s [ ...] - -Generate either python or html files out of the documentation. - -Mode can either be python or html.\ -''' % sys.argv[0] - -TEMPLATE = '''\ - - - - {{ title }} — Pygments - - - - -
-

Pygments

-

{{ title }}

- {% if file_id != "index" %} - « Back To Index - {% endif %} - {% if toc %} -
-

Contents

-
    - {% for key, value in toc %} -
  • {{ value }}
  • - {% endfor %} -
-
- {% endif %} - {{ body }} -
- - -\ -''' - -STYLESHEET = '''\ -body { - background-color: #f2f2f2; - margin: 0; - padding: 0; - font-family: 'Georgia', serif; - color: #111; -} - -#content { - background-color: white; - padding: 20px; - margin: 20px auto 20px auto; - max-width: 800px; - border: 4px solid #ddd; -} - -h1 { - font-weight: normal; - font-size: 40px; - color: #09839A; -} - -h2 { - font-weight: normal; - font-size: 30px; - color: #C73F00; -} - -h1.heading { - margin: 0 0 30px 0; -} - -h2.subheading { - margin: -30px 0 0 45px; -} - -h3 { - margin-top: 30px; -} - -table.docutils { - border-collapse: collapse; - border: 2px solid #aaa; - margin: 0.5em 1.5em 0.5em 1.5em; -} - -table.docutils td { - padding: 2px; - border: 1px solid #ddd; -} - -p, li, dd, dt, blockquote { - font-size: 15px; - color: #333; -} - -p { - line-height: 150%; - margin-bottom: 0; - margin-top: 10px; -} - -hr { - border-top: 1px solid #ccc; - border-bottom: 0; - border-right: 0; - border-left: 0; - margin-bottom: 10px; - margin-top: 20px; -} - -dl { - margin-left: 10px; -} - -li, dt { - margin-top: 5px; -} - -dt { - font-weight: bold; -} - -th { - text-align: left; -} - -a { - color: #990000; -} - -a:hover { - color: #c73f00; -} - -pre { - background-color: #f9f9f9; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; - padding: 5px; - font-size: 13px; - font-family: Bitstream Vera Sans Mono,monospace; -} - -tt { - font-size: 13px; - font-family: Bitstream Vera Sans Mono,monospace; - color: black; - padding: 1px 2px 1px 2px; - background-color: #f0f0f0; -} - -cite { - /* abusing , it's generated by ReST for `x` */ - font-size: 13px; - font-family: Bitstream Vera Sans Mono,monospace; - font-weight: bold; - font-style: normal; -} - -#backlink { - float: right; - font-size: 11px; - color: #888; -} - -div.toc { - margin: 0 0 10px 0; -} - -div.toc h2 { - font-size: 20px; -} -''' #' - - -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 - 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('sourcecode', pygments_directive) - - -def create_translator(link_style): - class Translator(html4css1.HTMLTranslator): - def visit_reference(self, node): - refuri = node.get('refuri') - if refuri is not None and '/' not in refuri and refuri.endswith('.txt'): - node['refuri'] = link_style(refuri[:-4]) - html4css1.HTMLTranslator.visit_reference(self, node) - return Translator - - -class DocumentationWriter(html4css1.Writer): - - def __init__(self, link_style): - html4css1.Writer.__init__(self) - self.translator_class = create_translator(link_style) - - def translate(self): - html4css1.Writer.translate(self) - # generate table of contents - contents = self.build_contents(self.document) - contents_doc = self.document.copy() - contents_doc.children = contents - contents_visitor = self.translator_class(contents_doc) - contents_doc.walkabout(contents_visitor) - self.parts['toc'] = self._generated_toc - - def build_contents(self, node, level=0): - sections = [] - i = len(node) - 1 - while i >= 0 and isinstance(node[i], nodes.section): - sections.append(node[i]) - i -= 1 - sections.reverse() - toc = [] - for section in sections: - try: - reference = nodes.reference('', '', refid=section['ids'][0], *section[0]) - except IndexError: - continue - ref_id = reference['refid'] - text = escape(reference.astext()) - toc.append((ref_id, text)) - - self._generated_toc = [('#%s' % href, caption) for href, caption in toc] - # no further processing - return [] - - -def generate_documentation(data, link_style): - writer = DocumentationWriter(link_style) - data = data.replace('[builtin_lexer_docs]', LEXERDOCS).\ - replace('[builtin_formatter_docs]', FORMATTERDOCS).\ - replace('[builtin_filter_docs]', FILTERDOCS).\ - replace('[changelog]', CHANGELOG).\ - replace('[authors]', AUTHORS) - parts = publish_parts( - data, - writer=writer, - settings_overrides={ - 'initial_header_level': 3, - 'field_name_limit': 50, - } - ) - return { - 'title': parts['title'], - 'body': parts['body'], - 'toc': parts['toc'] - } - - -def handle_python(filename, fp, dst): - now = datetime.now() - title = os.path.basename(filename)[:-4] - content = fp.read() - def urlize(href): - # create links for the pygments webpage - if href == 'index.txt': - return '/docs/' - else: - return '/docs/%s/' % href - parts = generate_documentation(content, urlize) - result = file(os.path.join(dst, title + '.py'), 'w') - result.write('# -*- coding: utf-8 -*-\n') - result.write('"""\n Pygments Documentation - %s\n' % title) - result.write(' %s\n\n' % ('~' * (24 + len(title)))) - result.write(' Generated on: %s\n"""\n\n' % now) - result.write('import datetime\n') - result.write('DATE = %r\n' % now) - result.write('TITLE = %r\n' % parts['title']) - result.write('TOC = %r\n' % parts['toc']) - result.write('BODY = %r\n' % parts['body']) - result.close() - - -def handle_html(filename, fp, dst): - now = datetime.now() - title = os.path.basename(filename)[:-4] - content = fp.read().decode('utf-8') - c = generate_documentation(content, (lambda x: './%s.html' % x)) - result = file(os.path.join(dst, title + '.html'), 'w') - c['style'] = STYLESHEET + PYGMENTS_FORMATTER.get_style_defs('.syntax') - c['generation_date'] = now - c['file_id'] = title - t = Template(TEMPLATE) - result.write(t.render(c).encode('utf-8')) - result.close() - - -def run(handle_file, dst, sources=()): - path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src')) - if not sources: - sources = [os.path.join(path, fn) for fn in os.listdir(path)] - if not os.path.isdir(dst): - os.makedirs(dst) - print 'Making docs for Pygments %s in %s' % (__version__, dst) - for fn in sources: - if not os.path.isfile(fn): - continue - print 'Processing %s' % fn - f = open(fn) - try: - handle_file(fn, f, dst) - finally: - f.close() - - -def main(mode, dst='build/', *sources): - try: - handler = { - 'html': handle_html, - 'python': handle_python - }[mode] - except KeyError: - print 'Error: unknown mode "%s"' % mode - sys.exit(1) - run(handler, os.path.realpath(dst), sources) - - -if __name__ == '__main__': - if len(sys.argv) == 1: - print USAGE - else: - main(*sys.argv[1:]) diff --git a/docs/src/api.txt b/docs/src/api.txt deleted file mode 100644 index 4276eea..0000000 --- a/docs/src/api.txt +++ /dev/null @@ -1,270 +0,0 @@ -.. -*- mode: rst -*- - -===================== -The full Pygments API -===================== - -This page describes the Pygments API. - -High-level API -============== - -Functions from the `pygments` module: - -def `lex(code, lexer):` - Lex `code` with the `lexer` (must be a `Lexer` instance) - and return an iterable of tokens. Currently, this only calls - `lexer.get_tokens()`. - -def `format(tokens, formatter, outfile=None):` - Format a token stream (iterable of tokens) `tokens` with the - `formatter` (must be a `Formatter` instance). The result is - written to `outfile`, or if that is ``None``, returned as a - string. - -def `highlight(code, lexer, formatter, outfile=None):` - This is the most high-level highlighting function. - It combines `lex` and `format` in one function. - - -Functions from `pygments.lexers`: - -def `get_lexer_by_name(alias, **options):` - Return an instance of a `Lexer` subclass that has `alias` in its - aliases list. The lexer is given the `options` at its - instantiation. - - Will raise `pygments.util.ClassNotFound` if no lexer with that alias is - found. - -def `get_lexer_for_filename(fn, **options):` - Return a `Lexer` subclass instance that has a filename pattern - matching `fn`. The lexer is given the `options` at its - instantiation. - - Will raise `pygments.util.ClassNotFound` if no lexer for that filename is - found. - -def `get_lexer_for_mimetype(mime, **options):` - Return a `Lexer` subclass instance that has `mime` in its mimetype - list. The lexer is given the `options` at its instantiation. - - Will raise `pygments.util.ClassNotFound` if not lexer for that mimetype is - found. - -def `guess_lexer(text, **options):` - Return a `Lexer` subclass instance that's guessed from the text - in `text`. For that, the `analyse_text()` method of every known - lexer class is called with the text as argument, and the lexer - which returned the highest value will be instantiated and returned. - - `pygments.util.ClassNotFound` is raised if no lexer thinks it can handle the - content. - -def `guess_lexer_for_filename(filename, text, **options):` - As `guess_lexer()`, but only lexers which have a pattern in `filenames` - or `alias_filenames` that matches `filename` are taken into consideration. - - `pygments.util.ClassNotFound` is raised if no lexer thinks it can handle the - content. - -def `get_all_lexers():` - Return an iterable over all registered lexers, yielding tuples in the - format:: - - (longname, tuple of aliases, tuple of filename patterns, tuple of mimetypes) - - *New in Pygments 0.6.* - - -Functions from `pygments.formatters`: - -def `get_formatter_by_name(alias, **options):` - Return an instance of a `Formatter` subclass that has `alias` in its - aliases list. The formatter is given the `options` at its - instantiation. - - Will raise `pygments.util.ClassNotFound` if no formatter with that alias is - found. - -def `get_formatter_for_filename(fn, **options):` - Return a `Formatter` subclass instance that has a filename pattern - matching `fn`. The formatter is given the `options` at its - instantiation. - - Will raise `pygments.util.ClassNotFound` if no formatter for that filename - is found. - - -Functions from `pygments.styles`: - -def `get_style_by_name(name):` - Return a style class by its short name. The names of the builtin styles - are listed in `pygments.styles.STYLE_MAP`. - - Will raise `pygments.util.ClassNotFound` if no style of that name is found. - -def `get_all_styles():` - Return an iterable over all registered styles, yielding their names. - - *New in Pygments 0.6.* - - -Lexers -====== - -A lexer (derived from `pygments.lexer.Lexer`) has the following functions: - -def `__init__(self, **options):` - The constructor. Takes a \*\*keywords dictionary of options. - Every subclass must first process its own options and then call - the `Lexer` constructor, since it processes the `stripnl`, - `stripall` and `tabsize` options. - - An example looks like this: - - .. sourcecode:: python - - def __init__(self, **options): - self.compress = options.get('compress', '') - Lexer.__init__(self, **options) - - As these options must all be specifiable as strings (due to the - command line usage), there are various utility functions - available to help with that, see `Option processing`_. - -def `get_tokens(self, text):` - This method is the basic interface of a lexer. It is called by - the `highlight()` function. It must process the text and return an - iterable of ``(tokentype, value)`` pairs from `text`. - - Normally, you don't need to override this method. The default - implementation processes the `stripnl`, `stripall` and `tabsize` - options and then yields all tokens from `get_tokens_unprocessed()`, - with the ``index`` dropped. - -def `get_tokens_unprocessed(self, text):` - This method should process the text and return an iterable of - ``(index, tokentype, value)`` tuples where ``index`` is the starting - position of the token within the input text. - - This method must be overridden by subclasses. - -def `analyse_text(text):` - A static method which is called for lexer guessing. It should analyse - the text and return a float in the range from ``0.0`` to ``1.0``. - If it returns ``0.0``, the lexer will not be selected as the most - probable one, if it returns ``1.0``, it will be selected immediately. - -For a list of known tokens have a look at the `Tokens`_ page. - -A lexer also can have the following attributes (in fact, they are mandatory -except `alias_filenames`) that are used by the builtin lookup mechanism. - -`name` - Full name for the lexer, in human-readable form. - -`aliases` - A list of short, unique identifiers that can be used to lookup - the lexer from a list, e.g. using `get_lexer_by_name()`. - -`filenames` - A list of `fnmatch` patterns that match filenames which contain - content for this lexer. The patterns in this list should be unique among - all lexers. - -`alias_filenames` - A list of `fnmatch` patterns that match filenames which may or may not - contain content for this lexer. This list is used by the - `guess_lexer_for_filename()` function, to determine which lexers are - then included in guessing the correct one. That means that e.g. every - lexer for HTML and a template language should include ``\*.html`` in - this list. - -`mimetypes` - A list of MIME types for content that can be lexed with this - lexer. - - -.. _Tokens: tokens.txt - - -Formatters -========== - -A formatter (derived from `pygments.formatter.Formatter`) has the following -functions: - -def `__init__(self, **options):` - As with lexers, this constructor processes options and then must call - the base class `__init__`. - - The `Formatter` class recognizes the options `style`, `full` and - `title`. It is up to the formatter class whether it uses them. - -def `get_style_defs(self, arg=''):` - This method must return statements or declarations suitable to define - the current style for subsequent highlighted text (e.g. CSS classes - in the `HTMLFormatter`). - - The optional argument `arg` can be used to modify the generation and - is formatter dependent (it is standardized because it can be given on - the command line). - - This method is called by the ``-S`` `command-line option`_, the `arg` - is then given by the ``-a`` option. - -def `format(self, tokensource, outfile):` - This method must format the tokens from the `tokensource` iterable and - write the formatted version to the file object `outfile`. - - Formatter options can control how exactly the tokens are converted. - -.. _command-line option: cmdline.txt - -A formatter must have the following attributes that are used by the -builtin lookup mechanism. (*New in Pygments 0.7.*) - -`name` - Full name for the formatter, in human-readable form. - -`aliases` - A list of short, unique identifiers that can be used to lookup - the formatter from a list, e.g. using `get_formatter_by_name()`. - -`filenames` - A list of `fnmatch` patterns that match filenames for which this formatter - can produce output. The patterns in this list should be unique among - all formatters. - - -Option processing -================= - -The `pygments.util` module has some utility functions usable for option -processing: - -class `OptionError` - This exception will be raised by all option processing functions if - the type or value of the argument is not correct. - -def `get_bool_opt(options, optname, default=None):` - Interpret the key `optname` from the dictionary `options` - as a boolean and return it. Return `default` if `optname` - is not in `options`. - - The valid string values for ``True`` are ``1``, ``yes``, - ``true`` and ``on``, the ones for ``False`` are ``0``, - ``no``, ``false`` and ``off`` (matched case-insensitively). - -def `get_int_opt(options, optname, default=None):` - As `get_bool_opt`, but interpret the value as an integer. - -def `get_list_opt(options, optname, default=None):` - If the key `optname` from the dictionary `options` is a string, - split it at whitespace and return it. If it is already a list - or a tuple, it is returned as a list. - -def `get_choice_opt(options, optname, allowed, default=None):` - If the key `optname` from the dictionary is not in the sequence - `allowed`, raise an error, otherwise return it. *New in Pygments 0.8.* diff --git a/docs/src/authors.txt b/docs/src/authors.txt deleted file mode 100644 index c8c532a..0000000 --- a/docs/src/authors.txt +++ /dev/null @@ -1,5 +0,0 @@ -======= -Authors -======= - -[authors] diff --git a/docs/src/changelog.txt b/docs/src/changelog.txt deleted file mode 100644 index 6caf0a3..0000000 --- a/docs/src/changelog.txt +++ /dev/null @@ -1,5 +0,0 @@ -========= -Changelog -========= - -[changelog] diff --git a/docs/src/index.txt b/docs/src/index.txt deleted file mode 100644 index b1e099c..0000000 --- a/docs/src/index.txt +++ /dev/null @@ -1,69 +0,0 @@ -.. -*- mode: rst -*- - -======== -Overview -======== - -Welcome to the Pygments documentation. - -- Starting with Pygments - - - `Installation `_ - - - `Introduction and Quickstart `_ - - - `Command line interface `_ - -- Builtin components - - - `Lexers `_ - - - `Formatters `_ - - - `Filters `_ - - - `Styles `_ - -- Reference - - - `Unicode and encodings `_ - - - `Builtin tokens `_ - - - `API documentation `_ - -- Hacking for Pygments - - - `Write your own lexer `_ - - - `Write your own formatter `_ - - - `Write your own filter `_ - - - `Register plugins `_ - -- Hints and Tricks - - - `Using Pygments in ReST documents `_ - - - `Using Pygments with MoinMoin `_ - - - `Using Pygments in other contexts `_ - -- About Pygments - - - `Changelog `_ - - - `Authors `_ - - --------------- - -If you find bugs or have suggestions for the documentation, please -look `here`_ for info on how to contact the team. - -You can download an offline version of this documentation from the -`download page`_. - -.. _here: http://pygments.org/contribute/ -.. _download page: http://pygments.org/download/ diff --git a/docs/src/installation.txt b/docs/src/installation.txt deleted file mode 100644 index 17a9aad..0000000 --- a/docs/src/installation.txt +++ /dev/null @@ -1,71 +0,0 @@ -.. -*- mode: rst -*- - -============ -Installation -============ - -Pygments requires at least Python 2.4 to work correctly. Just to clarify: -there *won't* ever be support for Python versions below 2.4. However, there -are no other dependencies. - - -Installing a released version -============================= - -As a Python egg (via easy_install) ----------------------------------- - -You can install the most recent Pygments version using `easy_install`_:: - - sudo easy_install Pygments - -This will install a Pygments egg in your Python installation's site-packages -directory. - - -From the tarball release -------------------------- - -1. Download the most recent tarball from the `download page`_ -2. Unpack the tarball -3. ``sudo python setup.py install`` - -Note that the last command will automatically download and install -`setuptools`_ if you don't already have it installed. This requires a working -internet connection. - -This will install Pygments into your Python installation's site-packages directory. - - -Installing the development version -================================== - -If you want to play around with the code ----------------------------------------- - -1. Install `Mercurial`_ -2. ``hg clone http://bitbucket.org/birkenfeld/pygments-main pygments`` -3. ``cd pygments`` -4. ``ln -s pygments /usr/lib/python2.X/site-packages`` -5. ``ln -s pygmentize /usr/local/bin`` - -As an alternative to steps 4 and 5 you can also do ``python setup.py develop`` -which will install the package via setuptools in development mode. - -.. - If you just want the latest features and use them - ------------------------------------------------- - - :: - - sudo easy_install Pygments==dev - - This will install a Pygments egg containing the latest Subversion trunk code - in your Python installation's site-packages directory. Every time the command - is run, the sources are updated from Subversion. - - -.. _download page: http://pygments.org/download/ -.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools -.. _easy_install: http://peak.telecommunity.com/DevCenter/EasyInstall -.. _Mercurial: http://selenic.com/mercurial/ diff --git a/docs/src/lexerdevelopment.txt b/docs/src/lexerdevelopment.txt deleted file mode 100644 index 6ffc4b7..0000000 --- a/docs/src/lexerdevelopment.txt +++ /dev/null @@ -1,551 +0,0 @@ -.. -*- mode: rst -*- - -==================== -Write your own lexer -==================== - -If a lexer for your favorite language is missing in the Pygments package, you can -easily write your own and extend Pygments. - -All you need can be found inside the `pygments.lexer` module. As you can read in -the `API documentation `_, a lexer is a class that is initialized with -some keyword arguments (the lexer options) and that provides a -`get_tokens_unprocessed()` method which is given a string or unicode object with -the data to parse. - -The `get_tokens_unprocessed()` method must return an iterator or iterable -containing tuples in the form ``(index, token, value)``. Normally you don't need -to do this since there are numerous base lexers you can subclass. - - -RegexLexer -========== - -A very powerful (but quite easy to use) lexer is the `RegexLexer`. This lexer -base class allows you to define lexing rules in terms of *regular expressions* -for different *states*. - -States are groups of regular expressions that are matched against the input -string at the *current position*. If one of these expressions matches, a -corresponding action is performed (normally yielding a token with a specific -type), the current position is set to where the last match ended and the -matching process continues with the first regex of the current state. - -Lexer states are kept in a state stack: each time a new state is entered, the -new state is pushed onto the stack. The most basic lexers (like the -`DiffLexer`) just need one state. - -Each state is defined as a list of tuples in the form (`regex`, `action`, -`new_state`) where the last item is optional. In the most basic form, `action` -is a token type (like `Name.Builtin`). That means: When `regex` matches, emit a -token with the match text and type `tokentype` and push `new_state` on the state -stack. If the new state is ``'#pop'``, the topmost state is popped from the -stack instead. (To pop more than one state, use ``'#pop:2'`` and so on.) -``'#push'`` is a synonym for pushing the current state on the -stack. - -The following example shows the `DiffLexer` from the builtin lexers. Note that -it contains some additional attributes `name`, `aliases` and `filenames` which -aren't required for a lexer. They are used by the builtin lexer lookup -functions. - -.. sourcecode:: python - - from pygments.lexer import RegexLexer - from pygments.token import * - - class DiffLexer(RegexLexer): - name = 'Diff' - aliases = ['diff'] - filenames = ['*.diff'] - - tokens = { - 'root': [ - (r' .*\n', Text), - (r'\+.*\n', Generic.Inserted), - (r'-.*\n', Generic.Deleted), - (r'@.*\n', Generic.Subheading), - (r'Index.*\n', Generic.Heading), - (r'=.*\n', Generic.Heading), - (r'.*\n', Text), - ] - } - -As you can see this lexer only uses one state. When the lexer starts scanning -the text, it first checks if the current character is a space. If this is true -it scans everything until newline and returns the parsed data as `Text` token. - -If this rule doesn't match, it checks if the current char is a plus sign. And -so on. - -If no rule matches at the current position, the current char is emitted as an -`Error` token that indicates a parsing error, and the position is increased by -1. - - -Regex Flags -=========== - -You can either define regex flags in the regex (``r'(?x)foo bar'``) or by adding -a `flags` attribute to your lexer class. If no attribute is defined, it defaults -to `re.MULTILINE`. For more informations about regular expression flags see the -`regular expressions`_ help page in the python documentation. - -.. _regular expressions: http://docs.python.org/lib/re-syntax.html - - -Scanning multiple tokens at once -================================ - -Here is a more complex lexer that highlights INI files. INI files consist of -sections, comments and key = value pairs: - -.. sourcecode:: python - - from pygments.lexer import RegexLexer, bygroups - from pygments.token import * - - class IniLexer(RegexLexer): - name = 'INI' - aliases = ['ini', 'cfg'] - filenames = ['*.ini', '*.cfg'] - - tokens = { - 'root': [ - (r'\s+', Text), - (r';.*?$', Comment), - (r'\[.*?\]$', Keyword), - (r'(.*?)(\s*)(=)(\s*)(.*?)$', - bygroups(Name.Attribute, Text, Operator, Text, String)) - ] - } - -The lexer first looks for whitespace, comments and section names. And later it -looks for a line that looks like a key, value pair, separated by an ``'='`` -sign, and optional whitespace. - -The `bygroups` helper makes sure that each group is yielded with a different -token type. First the `Name.Attribute` token, then a `Text` token for the -optional whitespace, after that a `Operator` token for the equals sign. Then a -`Text` token for the whitespace again. The rest of the line is returned as -`String`. - -Note that for this to work, every part of the match must be inside a capturing -group (a ``(...)``), and there must not be any nested capturing groups. If you -nevertheless need a group, use a non-capturing group defined using this syntax: -``r'(?:some|words|here)'`` (note the ``?:`` after the beginning parenthesis). - -If you find yourself needing a capturing group inside the regex which -shouldn't be part of the output but is used in the regular expressions for -backreferencing (eg: ``r'(<(foo|bar)>)(.*?)()'``), you can pass `None` -to the bygroups function and it will skip that group will be skipped in the -output. - - -Changing states -=============== - -Many lexers need multiple states to work as expected. For example, some -languages allow multiline comments to be nested. Since this is a recursive -pattern it's impossible to lex just using regular expressions. - -Here is the solution: - -.. sourcecode:: python - - from pygments.lexer import RegexLexer - from pygments.token import * - - class ExampleLexer(RegexLexer): - name = 'Example Lexer with states' - - tokens = { - 'root': [ - (r'[^/]+', Text), - (r'/\*', Comment.Multiline, 'comment'), - (r'//.*?$', Comment.Singleline), - (r'/', Text) - ], - 'comment': [ - (r'[^*/]', Comment.Multiline), - (r'/\*', Comment.Multiline, '#push'), - (r'\*/', Comment.Multiline, '#pop'), - (r'[*/]', Comment.Multiline) - ] - } - -This lexer starts lexing in the ``'root'`` state. It tries to match as much as -possible until it finds a slash (``'/'``). If the next character after the slash -is a star (``'*'``) the `RegexLexer` sends those two characters to the output -stream marked as `Comment.Multiline` and continues parsing with the rules -defined in the ``'comment'`` state. - -If there wasn't a star after the slash, the `RegexLexer` checks if it's a -singleline comment (eg: followed by a second slash). If this also wasn't the -case it must be a single slash (the separate regex for a single slash must also -be given, else the slash would be marked as an error token). - -Inside the ``'comment'`` state, we do the same thing again. Scan until the lexer -finds a star or slash. If it's the opening of a multiline comment, push the -``'comment'`` state on the stack and continue scanning, again in the -``'comment'`` state. Else, check if it's the end of the multiline comment. If -yes, pop one state from the stack. - -Note: If you pop from an empty stack you'll get an `IndexError`. (There is an -easy way to prevent this from happening: don't ``'#pop'`` in the root state). - -If the `RegexLexer` encounters a newline that is flagged as an error token, the -stack is emptied and the lexer continues scanning in the ``'root'`` state. This -helps producing error-tolerant highlighting for erroneous input, e.g. when a -single-line string is not closed. - - -Advanced state tricks -===================== - -There are a few more things you can do with states: - -- You can push multiple states onto the stack if you give a tuple instead of a - simple string as the third item in a rule tuple. For example, if you want to - match a comment containing a directive, something like:: - - /* rest of comment */ - - you can use this rule: - - .. sourcecode:: python - - tokens = { - 'root': [ - (r'/\* <', Comment, ('comment', 'directive')), - ... - ], - 'directive': [ - (r'[^>]*', Comment.Directive), - (r'>', Comment, '#pop'), - ], - 'comment': [ - (r'[^*]+', Comment), - (r'\*/', Comment, '#pop'), - (r'\*', Comment), - ] - } - - When this encounters the above sample, first ``'comment'`` and ``'directive'`` - are pushed onto the stack, then the lexer continues in the directive state - until it finds the closing ``>``, then it continues in the comment state until - the closing ``*/``. Then, both states are popped from the stack again and - lexing continues in the root state. - - *New in Pygments 0.9:* The tuple can contain the special ``'#push'`` and - ``'#pop'`` (but not ``'#pop:n'``) directives. - - -- You can include the rules of a state in the definition of another. This is - done by using `include` from `pygments.lexer`: - - .. sourcecode:: python - - from pygments.lexer import RegexLexer, bygroups, include - from pygments.token import * - - class ExampleLexer(RegexLexer): - tokens = { - 'comments': [ - (r'/\*.*?\*/', Comment), - (r'//.*?\n', Comment), - ], - 'root': [ - include('comments'), - (r'(function )(\w+)( {)', - bygroups(Keyword, Name, Keyword), 'function'), - (r'.', Text), - ], - 'function': [ - (r'[^}/]+', Text), - include('comments'), - (r'/', Text), - (r'}', Keyword, '#pop'), - ] - } - - This is a hypothetical lexer for a language that consist of functions and - comments. Because comments can occur at toplevel and in functions, we need - rules for comments in both states. As you can see, the `include` helper saves - repeating rules that occur more than once (in this example, the state - ``'comment'`` will never be entered by the lexer, as it's only there to be - included in ``'root'`` and ``'function'``). - - -- Sometimes, you may want to "combine" a state from existing ones. This is - possible with the `combine` helper from `pygments.lexer`. - - If you, instead of a new state, write ``combined('state1', 'state2')`` as the - third item of a rule tuple, a new anonymous state will be formed from state1 - and state2 and if the rule matches, the lexer will enter this state. - - This is not used very often, but can be helpful in some cases, such as the - `PythonLexer`'s string literal processing. - -- If you want your lexer to start lexing in a different state you can modify - the stack by overloading the `get_tokens_unprocessed()` method: - - .. sourcecode:: python - - from pygments.lexer import RegexLexer - - class MyLexer(RegexLexer): - tokens = {...} - - def get_tokens_unprocessed(self, text): - stack = ['root', 'otherstate'] - for item in RegexLexer.get_tokens_unprocessed(text, stack): - yield item - - Some lexers like the `PhpLexer` use this to make the leading ``', Name.Tag), - ], - 'script-content': [ - (r'(.+?)(<\s*/\s*script\s*>)', - bygroups(using(JavascriptLexer), Name.Tag), - '#pop'), - ] - } - -Here the content of a ```` end tag is processed by the `JavascriptLexer`, while the -end tag is yielded as a normal token with the `Name.Tag` type. - -As an additional goodie, if the lexer class is replaced by `this` (imported from -`pygments.lexer`), the "other" lexer will be the current one (because you cannot -refer to the current class within the code that runs at class definition time). - -Also note the ``(r'<\s*script\s*', Name.Tag, ('script-content', 'tag'))`` rule. -Here, two states are pushed onto the state stack, ``'script-content'`` and -``'tag'``. That means that first ``'tag'`` is processed, which will parse -attributes and the closing ``>``, then the ``'tag'`` state is popped and the -next state on top of the stack will be ``'script-content'``. - -The `using()` helper has a special keyword argument, `state`, which works as -follows: if given, the lexer to use initially is not in the ``"root"`` state, -but in the state given by this argument. This *only* works with a `RegexLexer`. - -Any other keywords arguments passed to `using()` are added to the keyword -arguments used to create the lexer. - - -Delegating Lexer -================ - -Another approach for nested lexers is the `DelegatingLexer` which is for -example used for the template engine lexers. It takes two lexers as -arguments on initialisation: a `root_lexer` and a `language_lexer`. - -The input is processed as follows: First, the whole text is lexed with the -`language_lexer`. All tokens yielded with a type of ``Other`` are then -concatenated and given to the `root_lexer`. The language tokens of the -`language_lexer` are then inserted into the `root_lexer`'s token stream -at the appropriate positions. - -.. sourcecode:: python - - from pygments.lexer import DelegatingLexer - from pygments.lexers.web import HtmlLexer, PhpLexer - - class HtmlPhpLexer(DelegatingLexer): - def __init__(self, **options): - super(HtmlPhpLexer, self).__init__(HtmlLexer, PhpLexer, **options) - -This procedure ensures that e.g. HTML with template tags in it is highlighted -correctly even if the template tags are put into HTML tags or attributes. - -If you want to change the needle token ``Other`` to something else, you can -give the lexer another token type as the third parameter: - -.. sourcecode:: python - - DelegatingLexer.__init__(MyLexer, OtherLexer, Text, **options) - - -Callbacks -========= - -Sometimes the grammar of a language is so complex that a lexer would be unable -to parse it just by using regular expressions and stacks. - -For this, the `RegexLexer` allows callbacks to be given in rule tuples, instead -of token types (`bygroups` and `using` are nothing else but preimplemented -callbacks). The callback must be a function taking two arguments: - -* the lexer itself -* the match object for the last matched rule - -The callback must then return an iterable of (or simply yield) ``(index, -tokentype, value)`` tuples, which are then just passed through by -`get_tokens_unprocessed()`. The ``index`` here is the position of the token in -the input string, ``tokentype`` is the normal token type (like `Name.Builtin`), -and ``value`` the associated part of the input string. - -You can see an example here: - -.. sourcecode:: python - - from pygments.lexer import RegexLexer - from pygments.token import Generic - - class HypotheticLexer(RegexLexer): - - def headline_callback(lexer, match): - equal_signs = match.group(1) - text = match.group(2) - yield match.start(), Generic.Headline, equal_signs + text + equal_signs - - tokens = { - 'root': [ - (r'(=+)(.*?)(\1)', headline_callback) - ] - } - -If the regex for the `headline_callback` matches, the function is called with the -match object. Note that after the callback is done, processing continues -normally, that is, after the end of the previous match. The callback has no -possibility to influence the position. - -There are not really any simple examples for lexer callbacks, but you can see -them in action e.g. in the `compiled.py`_ source code in the `CLexer` and -`JavaLexer` classes. - -.. _compiled.py: http://bitbucket.org/birkenfeld/pygments-main/src/tip/pygments/lexers/compiled.py - - -The ExtendedRegexLexer class -============================ - -The `RegexLexer`, even with callbacks, unfortunately isn't powerful enough for -the funky syntax rules of some languages that will go unnamed, such as Ruby. - -But fear not; even then you don't have to abandon the regular expression -approach. For Pygments has a subclass of `RegexLexer`, the `ExtendedRegexLexer`. -All features known from RegexLexers are available here too, and the tokens are -specified in exactly the same way, *except* for one detail: - -The `get_tokens_unprocessed()` method holds its internal state data not as local -variables, but in an instance of the `pygments.lexer.LexerContext` class, and -that instance is passed to callbacks as a third argument. This means that you -can modify the lexer state in callbacks. - -The `LexerContext` class has the following members: - -* `text` -- the input text -* `pos` -- the current starting position that is used for matching regexes -* `stack` -- a list containing the state stack -* `end` -- the maximum position to which regexes are matched, this defaults to - the length of `text` - -Additionally, the `get_tokens_unprocessed()` method can be given a -`LexerContext` instead of a string and will then process this context instead of -creating a new one for the string argument. - -Note that because you can set the current position to anything in the callback, -it won't be automatically be set by the caller after the callback is finished. -For example, this is how the hypothetical lexer above would be written with the -`ExtendedRegexLexer`: - -.. sourcecode:: python - - from pygments.lexer import ExtendedRegexLexer - from pygments.token import Generic - - class ExHypotheticLexer(ExtendedRegexLexer): - - def headline_callback(lexer, match, ctx): - equal_signs = match.group(1) - text = match.group(2) - yield match.start(), Generic.Headline, equal_signs + text + equal_signs - ctx.pos = match.end() - - tokens = { - 'root': [ - (r'(=+)(.*?)(\1)', headline_callback) - ] - } - -This might sound confusing (and it can really be). But it is needed, and for an -example look at the Ruby lexer in `agile.py`_. - -.. _agile.py: https://bitbucket.org/birkenfeld/pygments-main/src/tip/pygments/lexers/agile.py - - -Filtering Token Streams -======================= - -Some languages ship a lot of builtin functions (for example PHP). The total -amount of those functions differs from system to system because not everybody -has every extension installed. In the case of PHP there are over 3000 builtin -functions. That's an incredible huge amount of functions, much more than you -can put into a regular expression. - -But because only `Name` tokens can be function names it's solvable by overriding -the ``get_tokens_unprocessed()`` method. The following lexer subclasses the -`PythonLexer` so that it highlights some additional names as pseudo keywords: - -.. sourcecode:: python - - from pygments.lexers.agile import PythonLexer - from pygments.token import Name, Keyword - - class MyPythonLexer(PythonLexer): - EXTRA_KEYWORDS = ['foo', 'bar', 'foobar', 'barfoo', 'spam', 'eggs'] - - def get_tokens_unprocessed(self, text): - for index, token, value in PythonLexer.get_tokens_unprocessed(self, text): - if token is Name and value in self.EXTRA_KEYWORDS: - yield index, Keyword.Pseudo, value - else: - yield index, token, value - -The `PhpLexer` and `LuaLexer` use this method to resolve builtin functions. - -**Note** Do not confuse this with the `filter`_ system. - -.. _filter: filters.txt diff --git a/external/autopygmentize b/external/autopygmentize index 85c8dfd..964c138 100755 --- a/external/autopygmentize +++ b/external/autopygmentize @@ -1,64 +1,81 @@ -#!/bin/sh +#!/bin/bash # Best effort auto-pygmentization with transparent decompression # (c) Reuben Thomas 2012-2013 # This program is in the public domain. # Strategy: first see if pygmentize can find a lexer; if not, ask file; if that finds nothing, fail -# Set the environment variable PYGMENTIZE_OPTS to configure pygments. +# Set the environment variable PYGMENTIZE_OPTS or pass options before the file path to configure pygments. # This program can be used as a .lessfilter for the less pager to auto-color less's output -lexer=`pygmentize -N "$1"` -if [ "$lexer" = "text" ]; then - file_common_opts="--brief --dereference --uncompress" +file="${!#}" # last argument +options=${@:1:$(($#-1))} # handle others args as options to pass to pygmentize - unset lexer - case `file --mime-type $file_common_opts "$1"` in - application/xml|image/svg+xml) lexer=xml;; - text/html) lexer=html;; - text/troff) lexer=nroff;; - text/x-asm) lexer=nasm;; - text/x-awk) lexer=awk;; - text/x-c) lexer=c;; - text/x-c++) lexer=cpp;; - text/x-diff) lexer=diff;; - text/x-fortran) lexer=fortran;; - text/x-gawk) lexer=gawk;; - text/x-java) lexer=java;; - text/x-lisp) lexer=common-lisp;; - text/x-lua) lexer=lua;; - text/x-makefile) lexer=make;; - text/x-msdos-batch) lexer=bat;; - text/x-nawk) lexer=nawk;; - text/x-pascal) lexer=pascal;; - text/x-perl) lexer=perl;; - text/x-php) lexer=php;; - text/x-po) lexer=po;; - text/x-python) lexer=python;; - text/x-ruby) lexer=ruby;; - text/x-shellscript) lexer=sh;; - text/x-tcl) lexer=tcl;; - text/x-tex|text/x-texinfo) lexer=latex;; # FIXME: texinfo really needs its own lexer - - # Types that file outputs which pygmentize didn't support as of file 5.11, pygments 1.6rc1 - # text/calendar - # text/PGP - # text/rtf - # text/texmacs - # text/x-bcpl - # text/x-info - # text/x-m4 - # text/x-vcard - # text/x-xmcd - esac +file_common_opts="--brief --dereference" + +lexer=$(pygmentize -N "$file") +if [[ "$lexer" == text ]]; then + unset lexer + case $(file --mime-type --uncompress $file_common_opts "$file") in + application/xml|image/svg+xml) lexer=xml;; + text/html) lexer=html;; + text/troff) lexer=nroff;; + text/x-asm) lexer=nasm;; + text/x-awk) lexer=awk;; + text/x-c) lexer=c;; + text/x-c++) lexer=cpp;; + text/x-diff) lexer=diff;; + text/x-fortran) lexer=fortran;; + text/x-gawk) lexer=gawk;; + text/x-java) lexer=java;; + text/x-lisp) lexer=common-lisp;; + text/x-lua) lexer=lua;; + text/x-makefile) lexer=make;; + text/x-msdos-batch) lexer=bat;; + text/x-nawk) lexer=nawk;; + text/x-pascal) lexer=pascal;; + text/x-perl) lexer=perl;; + text/x-php) lexer=php;; + text/x-po) lexer=po;; + text/x-python) lexer=python;; + text/x-ruby) lexer=ruby;; + text/x-shellscript) lexer=sh;; + text/x-tcl) lexer=tcl;; + text/x-tex|text/x-texinfo) lexer=latex;; # FIXME: texinfo really needs its own lexer + + # Types that file outputs which pygmentize didn't support as of file 5.11, pygments 1.6rc1 + # text/calendar + # text/PGP + # text/rtf + # text/texmacs + # text/x-bcpl + # text/x-info + # text/x-m4 + # text/x-vcard + # text/x-xmcd + + text/plain) # special filenames. TODO: insert more + case $(basename "$file") in + .zshrc) lexer=sh;; + esac + ;; + esac fi -encoding=`file --brief --mime-encoding $file_common_opts "$1"` +encoding=$(file --mime-encoding --uncompress $file_common_opts "$file") +if [[ $encoding == "us-asciibinarybinary" ]]; then + encoding="us-ascii" +fi -if [ -n "$lexer" ]; then +if [[ -n "$lexer" ]]; then + concat=cat + case $(file $file_common_opts --mime-type "$file") in + application/x-gzip) concat=zcat;; + application/x-bzip2) concat=bzcat;; + application/x-xz) concat=xzcat;; + esac # FIXME: Specify input encoding rather than output encoding https://bitbucket.org/birkenfeld/pygments-main/issue/800 - zcat "$1" | pygmentize -O encoding=$encoding,outencoding=UTF-8 $PYGMENTIZE_OPTS -l $lexer - exit 0 + exec $concat "$file" | pygmentize -f terminal256 -O style=native,encoding=$encoding,outencoding=UTF-8 $PYGMENTIZE_OPTS $options -l $lexer fi exit 1 diff --git a/external/lasso-builtins-generator-9.lasso b/external/lasso-builtins-generator-9.lasso index bea8b2a..6a61910 100755 --- a/external/lasso-builtins-generator-9.lasso +++ b/external/lasso-builtins-generator-9.lasso @@ -5,13 +5,19 @@ This is the shell script that was used to extract Lasso 9's built-in keywords and generate most of the _lassobuiltins.py file. When run, it creates a file - named "lassobuiltins-9.py" containing the types, traits, and methods of the - currently-installed version of Lasso 9. + named "lassobuiltins-9.py" containing the types, traits, methods, and members + of the currently-installed version of Lasso 9. - A partial list of keywords in Lasso 8 can be generated with this code: + A list of tags in Lasso 8 can be generated with this code: insert(string_removeleading(#i, -pattern='_global_')); /iterate; @@ -30,9 +36,12 @@ local(f) = file("lassobuiltins-9.py") #f->writeString('# -*- coding: utf-8 -*- """ pygments.lexers._lassobuiltins - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Built-in Lasso types, traits, methods, and members. - Built-in Lasso types, traits, and methods. + :copyright: Copyright 2006-'+date->year+' by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. """ ') @@ -42,16 +51,16 @@ lcapi_loadModules // Load all of the libraries from builtins and lassoserver // This forces all possible available types and methods to be registered local(srcs = - tie( - dir(sys_masterHomePath + 'LassoLibraries/builtins/')->eachFilePath, - dir(sys_masterHomePath + 'LassoLibraries/lassoserver/')->eachFilePath - ) + tie( + dir(sys_masterHomePath + 'LassoLibraries/builtins/')->eachFilePath, + dir(sys_masterHomePath + 'LassoLibraries/lassoserver/')->eachFilePath + ) ) with topLevelDir in #srcs -where !#topLevelDir->lastComponent->beginsWith('.') +where not #topLevelDir->lastComponent->beginsWith('.') do protect => { - handle_error => { + handle_error => { stdoutnl('Unable to load: ' + #topLevelDir + ' ' + error_msg) } library_thread_loader->loadLibrary(#topLevelDir) @@ -61,60 +70,74 @@ do protect => { local( typesList = list(), traitsList = list(), - methodsList = list() + unboundMethodsList = list(), + memberMethodsList = list() ) -// unbound methods -with method in sys_listUnboundMethods -where !#method->methodName->asString->endsWith('=') -where #method->methodName->asString->isalpha(1) -where #methodsList !>> #method->methodName->asString -do #methodsList->insert(#method->methodName->asString) +// types +with type in sys_listTypes +where #typesList !>> #type +do { + #typesList->insert(#type) + with method in #type->getType->listMethods + let name = #method->methodName + where not #name->asString->endsWith('=') // skip setter methods + where #name->asString->isAlpha(1) // skip unpublished methods + where #memberMethodsList !>> #name + do #memberMethodsList->insert(#name) +} // traits with trait in sys_listTraits -where !#trait->asString->beginsWith('$') -where #traitsList !>> #trait->asString +where not #trait->asString->beginsWith('$') // skip combined traits +where #traitsList !>> #trait do { - #traitsList->insert(#trait->asString) - with tmethod in tie(#trait->getType->provides, #trait->getType->requires) - where !#tmethod->methodName->asString->endsWith('=') - where #tmethod->methodName->asString->isalpha(1) - where #methodsList !>> #tmethod->methodName->asString - do #methodsList->insert(#tmethod->methodName->asString) + #traitsList->insert(#trait) + with method in tie(#trait->getType->provides, #trait->getType->requires) + let name = #method->methodName + where not #name->asString->endsWith('=') // skip setter methods + where #name->asString->isAlpha(1) // skip unpublished methods + where #memberMethodsList !>> #name + do #memberMethodsList->insert(#name) } -// types -with type in sys_listTypes -where #typesList !>> #type->asString -do { - #typesList->insert(#type->asString) - with tmethod in #type->getType->listMethods - where !#tmethod->methodName->asString->endsWith('=') - where #tmethod->methodName->asString->isalpha(1) - where #methodsList !>> #tmethod->methodName->asString - do #methodsList->insert(#tmethod->methodName->asString) -} +// unbound methods +with method in sys_listUnboundMethods +let name = #method->methodName +where not #name->asString->endsWith('=') // skip setter methods +where #name->asString->isAlpha(1) // skip unpublished methods +where #typesList !>> #name +where #traitsList !>> #name +where #unboundMethodsList !>> #name +do #unboundMethodsList->insert(#name) #f->writeString("BUILTINS = { 'Types': [ ") with t in #typesList -do #f->writeString(" '"+string_lowercase(#t)+"',\n") +do !#t->asString->endsWith('$') ? #f->writeString(" '"+string_lowercase(#t->asString)+"',\n") #f->writeString(" ], 'Traits': [ ") with t in #traitsList -do #f->writeString(" '"+string_lowercase(#t)+"',\n") +do #f->writeString(" '"+string_lowercase(#t->asString)+"',\n") #f->writeString(" ], - 'Methods': [ + 'Unbound Methods': [ ") -with t in #methodsList -do #f->writeString(" '"+string_lowercase(#t)+"',\n") +with t in #unboundMethodsList +do #f->writeString(" '"+string_lowercase(#t->asString)+"',\n") -#f->writeString(" ], +#f->writeString(" ] +} +MEMBERS = { + 'Member Methods': [ +") +with t in #memberMethodsList +do #f->writeString(" '"+string_lowercase(#t->asString)+"',\n") + +#f->writeString(" ] } ") diff --git a/external/markdown-processor.py b/external/markdown-processor.py index 12e6468..2a92a40 100644 --- a/external/markdown-processor.py +++ b/external/markdown-processor.py @@ -6,14 +6,9 @@ This fragment is a Markdown_ preprocessor that renders source code to HTML via Pygments. To use it, invoke Markdown like so:: - from markdown import Markdown + import markdown - md = Markdown() - md.textPreprocessors.insert(0, CodeBlockPreprocessor()) - html = md.convert(someText) - - markdown is then a callable that can be passed to the context of - a template and used in that template, for example. + html = markdown.markdown(someText, extensions=[CodeBlockExtension()]) This uses CSS classes by default, so use ``pygmentize -S -f html > pygments.css`` @@ -25,9 +20,9 @@ some code [/sourcecode] - .. _Markdown: http://www.freewisdom.org/projects/python-markdown/ + .. _Markdown: https://pypi.python.org/pypi/Markdown - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -40,17 +35,17 @@ INLINESTYLES = False import re -from markdown import TextPreprocessor +from markdown.preprocessors import Preprocessor +from markdown.extensions import Extension from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import get_lexer_by_name, TextLexer -class CodeBlockPreprocessor(TextPreprocessor): +class CodeBlockPreprocessor(Preprocessor): - pattern = re.compile( - r'\[sourcecode:(.+?)\](.+?)\[/sourcecode\]', re.S) + pattern = re.compile(r'\[sourcecode:(.+?)\](.+?)\[/sourcecode\]', re.S) formatter = HtmlFormatter(noclasses=INLINESTYLES) @@ -63,5 +58,10 @@ class CodeBlockPreprocessor(TextPreprocessor): code = highlight(m.group(2), lexer, self.formatter) code = code.replace('\n\n', '\n \n').replace('\n', '
') return '\n\n
%s
\n\n' % code - return self.pattern.sub( - repl, lines) + joined_lines = "\n".join(lines) + joined_lines = self.pattern.sub(repl, joined_lines) + return joined_lines.split("\n") + +class CodeBlockExtension(Extension): + def extendMarkdown(self, md, md_globals): + md.preprocessors.add('CodeBlockPreprocessor', CodeBlockPreprocessor(), '_begin') diff --git a/external/moin-parser.py b/external/moin-parser.py index 6544da1..4113118 100644 --- a/external/moin-parser.py +++ b/external/moin-parser.py @@ -31,7 +31,7 @@ If you do not want to do that and are willing to accept larger HTML output, you can set the INLINESTYLES option below to True. - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/external/rst-directive-old.py b/external/rst-directive-old.py deleted file mode 100644 index a074536..0000000 --- a/external/rst-directive-old.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- -""" - The Pygments reStructuredText directive - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - This fragment is a Docutils_ 0.4 directive that renders source code - (to HTML only, currently) via Pygments. - - To use it, adjust the options below and copy the code into a module - that you import on initialization. The code then automatically - registers a ``sourcecode`` directive that you can use instead of - normal code blocks like this:: - - .. sourcecode:: python - - My code goes here. - - If you want to have different code styles, e.g. one with line numbers - and one without, add formatters with their names in the VARIANTS dict - below. You can invoke them instead of the DEFAULT one by using a - directive option:: - - .. sourcecode:: python - :linenos: - - My code goes here. - - Look at the `directive documentation`_ to get all the gory details. - - .. _Docutils: http://docutils.sf.net/ - .. _directive documentation: - http://docutils.sourceforge.net/docs/howto/rst-directives.html - - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -# Options -# ~~~~~~~ - -# Set to True if you want inline CSS styles instead of classes -INLINESTYLES = False - -from pygments.formatters import HtmlFormatter - -# The default formatter -DEFAULT = HtmlFormatter(noclasses=INLINESTYLES) - -# Add name -> formatter pairs for every variant you want to use -VARIANTS = { - # 'linenos': HtmlFormatter(noclasses=INLINESTYLES, linenos=True), -} - - -from docutils import nodes -from docutils.parsers.rst import directives - -from pygments import highlight -from pygments.lexers import get_lexer_by_name, TextLexer - -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 = TextLexer() - # take an arbitrary option if more than one is given - formatter = options and VARIANTS[options.keys()[0]] or DEFAULT - parsed = highlight(u'\n'.join(content), lexer, formatter) - return [nodes.raw('', parsed, format='html')] - -pygments_directive.arguments = (1, 0, 1) -pygments_directive.content = 1 -pygments_directive.options = dict([(key, directives.flag) for key in VARIANTS]) - -directives.register_directive('sourcecode', pygments_directive) diff --git a/external/rst-directive.py b/external/rst-directive.py index 5c04038..8ce150c 100644 --- a/external/rst-directive.py +++ b/external/rst-directive.py @@ -31,7 +31,7 @@ .. _directive documentation: http://docutils.sourceforge.net/docs/howto/rst-directives.html - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -75,9 +75,8 @@ class Pygments(Directive): # no lexer found - use the text one instead of an exception lexer = TextLexer() # take an arbitrary option if more than one is given - formatter = self.options and VARIANTS[self.options.keys()[0]] or DEFAULT + formatter = self.options and VARIANTS[list(self.options)[0]] or DEFAULT parsed = highlight(u'\n'.join(self.content), lexer, formatter) return [nodes.raw('', parsed, format='html')] directives.register_directive('sourcecode', Pygments) - diff --git a/ez_setup.py b/ez_setup.py old mode 100755 new mode 100644 index e33744b..9dc2c87 --- a/ez_setup.py +++ b/ez_setup.py @@ -13,264 +13,370 @@ the appropriate options to ``use_setuptools()``. This file can also be run as a script to install or upgrade setuptools. """ +import os +import shutil import sys -DEFAULT_VERSION = "0.6c9" -DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] - -md5_data = { - 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', - 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', - 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', - 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', - 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', - 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', - 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', - 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', - 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', - 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', - 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', - 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', - 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', - 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', - 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', - 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', - 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', - 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', - 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', - 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', - 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', - 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', - 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', - 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', - 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', - 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', - 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', - 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', - 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', - 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', - 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', - 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', - 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', - 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', -} - -import sys, os -try: from hashlib import md5 -except ImportError: from md5 import md5 - -def _validate_md5(egg_name, data): - if egg_name in md5_data: - digest = md5(data).hexdigest() - if digest != md5_data[egg_name]: - print >>sys.stderr, ( - "md5 validation of %s failed! (Possible download problem?)" - % egg_name - ) - sys.exit(2) - return data - -def use_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - download_delay=15 -): - """Automatically find/download setuptools and make it available on sys.path - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end with - a '/'). `to_dir` is the directory where setuptools will be downloaded, if - it is not already available. If `download_delay` is specified, it should - be the number of seconds that will be paused before initiating a download, - should one be required. If an older version of setuptools is installed, - this routine will print a message to ``sys.stderr`` and raise SystemExit in - an attempt to abort the calling script. - """ - was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules - def do_download(): - egg = download_setuptools(version, download_base, to_dir, download_delay) - sys.path.insert(0, egg) - import setuptools; setuptools.bootstrap_install_from = egg +import tempfile +import tarfile +import optparse +import subprocess +import platform + +from distutils import log + +try: + from site import USER_SITE +except ImportError: + USER_SITE = None + +DEFAULT_VERSION = "1.4.2" +DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/" + +def _python_cmd(*args): + args = (sys.executable,) + args + return subprocess.call(args) == 0 + +def _check_call_py24(cmd, *args, **kwargs): + res = subprocess.call(cmd, *args, **kwargs) + class CalledProcessError(Exception): + pass + if not res == 0: + msg = "Command '%s' return non-zero exit status %d" % (cmd, res) + raise CalledProcessError(msg) +vars(subprocess).setdefault('check_call', _check_call_py24) + +def _install(tarball, install_args=()): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # installing + log.warn('Installing Setuptools') + if not _python_cmd('setup.py', 'install', *install_args): + log.warn('Something went wrong during the installation.') + log.warn('See the error message above.') + # exitcode will be 2 + return 2 + finally: + os.chdir(old_wd) + shutil.rmtree(tmpdir) + + +def _build_egg(egg, tarball, to_dir): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # building an egg + log.warn('Building a Setuptools egg in %s', to_dir) + _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) + + finally: + os.chdir(old_wd) + shutil.rmtree(tmpdir) + # returning the result + log.warn(egg) + if not os.path.exists(egg): + raise IOError('Could not build the egg.') + + +def _do_download(version, download_base, to_dir, download_delay): + egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg' + % (version, sys.version_info[0], sys.version_info[1])) + if not os.path.exists(egg): + tarball = download_setuptools(version, download_base, + to_dir, download_delay) + _build_egg(egg, tarball, to_dir) + sys.path.insert(0, egg) + + # Remove previously-imported pkg_resources if present (see + # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). + if 'pkg_resources' in sys.modules: + del sys.modules['pkg_resources'] + + import setuptools + setuptools.bootstrap_install_from = egg + + +def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, download_delay=15): + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + was_imported = 'pkg_resources' in sys.modules or \ + 'setuptools' in sys.modules try: import pkg_resources except ImportError: - return do_download() + return _do_download(version, download_base, to_dir, download_delay) try: - pkg_resources.require("setuptools>="+version); return - except pkg_resources.VersionConflict, e: + pkg_resources.require("setuptools>=" + version) + return + except pkg_resources.VersionConflict: + e = sys.exc_info()[1] if was_imported: - print >>sys.stderr, ( - "The required version of setuptools (>=%s) is not available, and\n" - "can't be installed while this script is running. Please install\n" - " a more recent version first, using 'easy_install -U setuptools'." - "\n\n(Currently using %r)" - ) % (version, e.args[0]) + sys.stderr.write( + "The required version of setuptools (>=%s) is not available,\n" + "and can't be installed while this script is running. Please\n" + "install a more recent version first, using\n" + "'easy_install -U setuptools'." + "\n\n(Currently using %r)\n" % (version, e.args[0])) sys.exit(2) else: del pkg_resources, sys.modules['pkg_resources'] # reload ok - return do_download() + return _do_download(version, download_base, to_dir, + download_delay) except pkg_resources.DistributionNotFound: - return do_download() + return _do_download(version, download_base, to_dir, + download_delay) -def download_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - delay = 15 -): - """Download setuptools from a specified location and return its filename +def _clean_check(cmd, target): + """ + Run the command to download target. If the command fails, clean up before + re-raising the error. + """ + try: + subprocess.check_call(cmd) + except subprocess.CalledProcessError: + if os.access(target, os.F_OK): + os.unlink(target) + raise - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download attempt. +def download_file_powershell(url, target): """ - import urllib2, shutil - egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) - url = download_base + egg_name - saveto = os.path.join(to_dir, egg_name) - src = dst = None - if not os.path.exists(saveto): # Avoid repeated downloads + Download the file at url to target using Powershell (which will validate + trust). Raise an exception if the command cannot complete. + """ + target = os.path.abspath(target) + cmd = [ + 'powershell', + '-Command', + "(new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)" % vars(), + ] + _clean_check(cmd, target) + +def has_powershell(): + if platform.system() != 'Windows': + return False + cmd = ['powershell', '-Command', 'echo test'] + devnull = open(os.path.devnull, 'wb') + try: try: - from distutils import log - if delay: - log.warn(""" ---------------------------------------------------------------------------- -This script requires setuptools version %s to run (even to display -help). I will attempt to download it for you (from -%s), but -you may need to enable firewall access for this script first. -I will start the download in %d seconds. - -(Note: if this machine does not have network access, please obtain the file - - %s - -and place it in this directory before rerunning this script.) ----------------------------------------------------------------------------""", - version, download_base, delay, url - ); from time import sleep; sleep(delay) - log.warn("Downloading %s", url) - src = urllib2.urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = _validate_md5(egg_name, src.read()) - dst = open(saveto,"wb"); dst.write(data) - finally: - if src: src.close() - if dst: dst.close() - return os.path.realpath(saveto) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -def main(argv, version=DEFAULT_VERSION): - """Install or upgrade setuptools and EasyInstall""" + subprocess.check_call(cmd, stdout=devnull, stderr=devnull) + except: + return False + finally: + devnull.close() + return True + +download_file_powershell.viable = has_powershell + +def download_file_curl(url, target): + cmd = ['curl', url, '--silent', '--output', target] + _clean_check(cmd, target) + +def has_curl(): + cmd = ['curl', '--version'] + devnull = open(os.path.devnull, 'wb') try: - import setuptools - except ImportError: - egg = None try: - egg = download_setuptools(version, delay=0) - sys.path.insert(0,egg) - from setuptools.command.easy_install import main - return main(list(argv)+[egg]) # we're done here - finally: - if egg and os.path.exists(egg): - os.unlink(egg) - else: - if setuptools.__version__ == '0.0.1': - print >>sys.stderr, ( - "You have an obsolete version of setuptools installed. Please\n" - "remove it from your system entirely before rerunning this script." - ) - sys.exit(2) - - req = "setuptools>="+version - import pkg_resources + subprocess.check_call(cmd, stdout=devnull, stderr=devnull) + except: + return False + finally: + devnull.close() + return True + +download_file_curl.viable = has_curl + +def download_file_wget(url, target): + cmd = ['wget', url, '--quiet', '--output-document', target] + _clean_check(cmd, target) + +def has_wget(): + cmd = ['wget', '--version'] + devnull = open(os.path.devnull, 'wb') try: - pkg_resources.require(req) - except pkg_resources.VersionConflict: try: - from setuptools.command.easy_install import main - except ImportError: - from easy_install import main - main(list(argv)+[download_setuptools(delay=0)]) - sys.exit(0) # try to force an exit - else: - if argv: - from setuptools.command.easy_install import main - main(argv) - else: - print "Setuptools version",version,"or greater has been installed." - print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' + subprocess.check_call(cmd, stdout=devnull, stderr=devnull) + except: + return False + finally: + devnull.close() + return True -def update_md5(filenames): - """Update our built-in md5 registry""" +download_file_wget.viable = has_wget - import re - - for name in filenames: - base = os.path.basename(name) - f = open(name,'rb') - md5_data[base] = md5(f.read()).hexdigest() - f.close() - - data = [" %r: %r,\n" % it for it in md5_data.items()] - data.sort() - repl = "".join(data) - - import inspect - srcfile = inspect.getsourcefile(sys.modules[__name__]) - f = open(srcfile, 'rb'); src = f.read(); f.close() +def download_file_insecure(url, target): + """ + Use Python to download the file, even though it cannot authenticate the + connection. + """ + try: + from urllib.request import urlopen + except ImportError: + from urllib2 import urlopen + src = dst = None + try: + src = urlopen(url) + # Read/write all in one block, so we don't create a corrupt file + # if the download is interrupted. + data = src.read() + dst = open(target, "wb") + dst.write(data) + finally: + if src: + src.close() + if dst: + dst.close() + +download_file_insecure.viable = lambda: True + +def get_best_downloader(): + downloaders = [ + download_file_powershell, + download_file_curl, + download_file_wget, + download_file_insecure, + ] + + for dl in downloaders: + if dl.viable(): + return dl + +def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, delay=15, + downloader_factory=get_best_downloader): + """Download setuptools from a specified location and return its filename - match = re.search("\nmd5_data = {\n([^}]+)}", src) - if not match: - print >>sys.stderr, "Internal error!" - sys.exit(2) + `version` should be a valid setuptools version number that is available + as an egg for download under the `download_base` URL (which should end + with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download + attempt. - src = src[:match.start(1)] + repl + src[match.end(1):] - f = open(srcfile,'w') - f.write(src) - f.close() + ``downloader_factory`` should be a function taking no arguments and + returning a function for downloading a URL to a target. + """ + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + tgz_name = "setuptools-%s.tar.gz" % version + url = download_base + tgz_name + saveto = os.path.join(to_dir, tgz_name) + if not os.path.exists(saveto): # Avoid repeated downloads + log.warn("Downloading %s", url) + downloader = downloader_factory() + downloader(url, saveto) + return os.path.realpath(saveto) -if __name__=='__main__': - if len(sys.argv)>2 and sys.argv[1]=='--md5update': - update_md5(sys.argv[2:]) +def _extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + import copy + import operator + from tarfile import ExtractError + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 448 # decimal for oct 0700 + self.extract(tarinfo, path) + + # Reverse sort directories. + if sys.version_info < (2, 4): + def sorter(dir1, dir2): + return cmp(dir1.name, dir2.name) + directories.sort(sorter) + directories.reverse() else: - main(sys.argv[1:]) - - - - + directories.sort(key=operator.attrgetter('name'), reverse=True) + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError: + e = sys.exc_info()[1] + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + +def _build_install_args(options): + """ + Build the arguments to 'python setup.py install' on the setuptools package + """ + install_args = [] + if options.user_install: + if sys.version_info < (2, 6): + log.warn("--user requires Python 2.6 or later") + raise SystemExit(1) + install_args.append('--user') + return install_args + +def _parse_args(): + """ + Parse the command line for options + """ + parser = optparse.OptionParser() + parser.add_option( + '--user', dest='user_install', action='store_true', default=False, + help='install in user site package (requires Python 2.6 or later)') + parser.add_option( + '--download-base', dest='download_base', metavar="URL", + default=DEFAULT_URL, + help='alternative URL from where to download the setuptools package') + parser.add_option( + '--insecure', dest='downloader_factory', action='store_const', + const=lambda: download_file_insecure, default=get_best_downloader, + help='Use internal, non-validating downloader' + ) + options, args = parser.parse_args() + # positional arguments are ignored + return options + +def main(version=DEFAULT_VERSION): + """Install or upgrade setuptools and EasyInstall""" + options = _parse_args() + tarball = download_setuptools(download_base=options.download_base, + downloader_factory=options.downloader_factory) + return _install(tarball, _build_install_args(options)) +if __name__ == '__main__': + sys.exit(main()) diff --git a/pygmentize b/pygmentize index e237919..aea3872 100755 --- a/pygmentize +++ b/pygmentize @@ -1,6 +1,7 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 -import sys, pygments.cmdline +import sys +import pygments.cmdline try: sys.exit(pygments.cmdline.main(sys.argv)) except KeyboardInterrupt: diff --git a/pygments/__init__.py b/pygments/__init__.py index 2bfd8ba..2382efc 100644 --- a/pygments/__init__.py +++ b/pygments/__init__.py @@ -22,11 +22,11 @@ .. _Pygments tip: http://bitbucket.org/birkenfeld/pygments-main/get/tip.zip#egg=Pygments-dev - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ -__version__ = '1.6' +__version__ = '2.0rc1' __docformat__ = 'restructuredtext' __all__ = ['lex', 'format', 'highlight'] @@ -43,7 +43,7 @@ def lex(code, lexer): """ try: return lexer.get_tokens(code) - except TypeError, err: + except TypeError as err: if isinstance(err.args[0], str) and \ 'unbound method get_tokens' in err.args[0]: raise TypeError('lex() argument must be a lexer instance, ' @@ -67,7 +67,7 @@ def format(tokens, formatter, outfile=None): return realoutfile.getvalue() else: formatter.format(tokens, outfile) - except TypeError, err: + except TypeError as err: if isinstance(err.args[0], str) and \ 'unbound method format' in err.args[0]: raise TypeError('format() argument must be a formatter instance, ' diff --git a/pygments/cmdline.py b/pygments/cmdline.py index c25204b..7d3ef87 100644 --- a/pygments/cmdline.py +++ b/pygments/cmdline.py @@ -5,27 +5,32 @@ Command line interface. - :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ + +from __future__ import print_function + import sys import getopt from textwrap import dedent from pygments import __version__, highlight -from pygments.util import ClassNotFound, OptionError, docstring_headline -from pygments.lexers import get_all_lexers, get_lexer_by_name, get_lexer_for_filename, \ - find_lexer_class, guess_lexer, TextLexer +from pygments.util import ClassNotFound, OptionError, docstring_headline, \ + guess_decode, guess_decode_from_terminal, terminal_encoding +from pygments.lexers import get_all_lexers, get_lexer_by_name, guess_lexer, \ + get_lexer_for_filename, find_lexer_class, TextLexer +from pygments.formatters.latex import LatexEmbeddedLexer, LatexFormatter from pygments.formatters import get_all_formatters, get_formatter_by_name, \ - get_formatter_for_filename, find_formatter_class, \ - TerminalFormatter # pylint:disable-msg=E0611 + get_formatter_for_filename, find_formatter_class, \ + TerminalFormatter # pylint:disable-msg=E0611 from pygments.filters import get_all_filters, find_filter_class from pygments.styles import get_all_styles, get_style_by_name USAGE = """\ Usage: %s [-l | -g] [-F [:]] [-f ] - [-O ] [-P ] [-o ] [] + [-O ] [-P ] [-s] [-o ] [] %s -S