pygments.rb-jruby 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/CHANGELOG.md +71 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE +17 -0
  6. data/README.md +118 -0
  7. data/Rakefile +66 -0
  8. data/bench.rb +22 -0
  9. data/cache-lexers.rb +8 -0
  10. data/lexers +0 -0
  11. data/lib/pygments.rb +8 -0
  12. data/lib/pygments/lexer.rb +148 -0
  13. data/lib/pygments/mentos.py +351 -0
  14. data/lib/pygments/popen.rb +404 -0
  15. data/lib/pygments/version.rb +3 -0
  16. data/pygments.rb.gemspec +24 -0
  17. data/test/test_data.c +2581 -0
  18. data/test/test_data.py +514 -0
  19. data/test/test_data_generated +2582 -0
  20. data/test/test_pygments.rb +287 -0
  21. data/vendor/custom_lexers/github.py +565 -0
  22. data/vendor/pygments-main/AUTHORS +153 -0
  23. data/vendor/pygments-main/CHANGES +889 -0
  24. data/vendor/pygments-main/LICENSE +25 -0
  25. data/vendor/pygments-main/MANIFEST.in +6 -0
  26. data/vendor/pygments-main/Makefile +59 -0
  27. data/vendor/pygments-main/REVISION +1 -0
  28. data/vendor/pygments-main/TODO +15 -0
  29. data/vendor/pygments-main/docs/generate.py +472 -0
  30. data/vendor/pygments-main/docs/pygmentize.1 +94 -0
  31. data/vendor/pygments-main/docs/src/api.txt +270 -0
  32. data/vendor/pygments-main/docs/src/authors.txt +5 -0
  33. data/vendor/pygments-main/docs/src/changelog.txt +5 -0
  34. data/vendor/pygments-main/docs/src/cmdline.txt +147 -0
  35. data/vendor/pygments-main/docs/src/filterdevelopment.txt +70 -0
  36. data/vendor/pygments-main/docs/src/filters.txt +42 -0
  37. data/vendor/pygments-main/docs/src/formatterdevelopment.txt +169 -0
  38. data/vendor/pygments-main/docs/src/formatters.txt +48 -0
  39. data/vendor/pygments-main/docs/src/index.txt +69 -0
  40. data/vendor/pygments-main/docs/src/installation.txt +71 -0
  41. data/vendor/pygments-main/docs/src/integrate.txt +48 -0
  42. data/vendor/pygments-main/docs/src/java.txt +70 -0
  43. data/vendor/pygments-main/docs/src/lexerdevelopment.txt +603 -0
  44. data/vendor/pygments-main/docs/src/lexers.txt +67 -0
  45. data/vendor/pygments-main/docs/src/moinmoin.txt +39 -0
  46. data/vendor/pygments-main/docs/src/plugins.txt +93 -0
  47. data/vendor/pygments-main/docs/src/quickstart.txt +202 -0
  48. data/vendor/pygments-main/docs/src/rstdirective.txt +22 -0
  49. data/vendor/pygments-main/docs/src/styles.txt +143 -0
  50. data/vendor/pygments-main/docs/src/tokens.txt +349 -0
  51. data/vendor/pygments-main/docs/src/unicode.txt +49 -0
  52. data/vendor/pygments-main/external/autopygmentize +64 -0
  53. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +144 -0
  54. data/vendor/pygments-main/external/markdown-processor.py +67 -0
  55. data/vendor/pygments-main/external/moin-parser.py +112 -0
  56. data/vendor/pygments-main/external/pygments.bashcomp +38 -0
  57. data/vendor/pygments-main/external/rst-directive-old.py +77 -0
  58. data/vendor/pygments-main/external/rst-directive.py +83 -0
  59. data/vendor/pygments-main/ez_setup.py +276 -0
  60. data/vendor/pygments-main/pygmentize +7 -0
  61. data/vendor/pygments-main/pygments/__init__.py +91 -0
  62. data/vendor/pygments-main/pygments/cmdline.py +441 -0
  63. data/vendor/pygments-main/pygments/console.py +74 -0
  64. data/vendor/pygments-main/pygments/filter.py +74 -0
  65. data/vendor/pygments-main/pygments/filters/__init__.py +356 -0
  66. data/vendor/pygments-main/pygments/formatter.py +95 -0
  67. data/vendor/pygments-main/pygments/formatters/__init__.py +68 -0
  68. data/vendor/pygments-main/pygments/formatters/_mapping.py +92 -0
  69. data/vendor/pygments-main/pygments/formatters/bbcode.py +109 -0
  70. data/vendor/pygments-main/pygments/formatters/html.py +821 -0
  71. data/vendor/pygments-main/pygments/formatters/img.py +553 -0
  72. data/vendor/pygments-main/pygments/formatters/latex.py +378 -0
  73. data/vendor/pygments-main/pygments/formatters/other.py +115 -0
  74. data/vendor/pygments-main/pygments/formatters/rtf.py +136 -0
  75. data/vendor/pygments-main/pygments/formatters/svg.py +154 -0
  76. data/vendor/pygments-main/pygments/formatters/terminal.py +112 -0
  77. data/vendor/pygments-main/pygments/formatters/terminal256.py +222 -0
  78. data/vendor/pygments-main/pygments/lexer.py +765 -0
  79. data/vendor/pygments-main/pygments/lexers/__init__.py +240 -0
  80. data/vendor/pygments-main/pygments/lexers/_asybuiltins.py +1645 -0
  81. data/vendor/pygments-main/pygments/lexers/_clbuiltins.py +232 -0
  82. data/vendor/pygments-main/pygments/lexers/_lassobuiltins.py +5172 -0
  83. data/vendor/pygments-main/pygments/lexers/_luabuiltins.py +249 -0
  84. data/vendor/pygments-main/pygments/lexers/_mapping.py +354 -0
  85. data/vendor/pygments-main/pygments/lexers/_openedgebuiltins.py +562 -0
  86. data/vendor/pygments-main/pygments/lexers/_phpbuiltins.py +3787 -0
  87. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +233 -0
  88. data/vendor/pygments-main/pygments/lexers/_robotframeworklexer.py +557 -0
  89. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +40 -0
  90. data/vendor/pygments-main/pygments/lexers/_sourcemodbuiltins.py +1072 -0
  91. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +360 -0
  92. data/vendor/pygments-main/pygments/lexers/_vimbuiltins.py +13 -0
  93. data/vendor/pygments-main/pygments/lexers/agile.py +2290 -0
  94. data/vendor/pygments-main/pygments/lexers/asm.py +398 -0
  95. data/vendor/pygments-main/pygments/lexers/compiled.py +3723 -0
  96. data/vendor/pygments-main/pygments/lexers/dalvik.py +104 -0
  97. data/vendor/pygments-main/pygments/lexers/dotnet.py +671 -0
  98. data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
  99. data/vendor/pygments-main/pygments/lexers/functional.py +2731 -0
  100. data/vendor/pygments-main/pygments/lexers/github.py +565 -0
  101. data/vendor/pygments-main/pygments/lexers/hdl.py +356 -0
  102. data/vendor/pygments-main/pygments/lexers/jvm.py +1112 -0
  103. data/vendor/pygments-main/pygments/lexers/math.py +1918 -0
  104. data/vendor/pygments-main/pygments/lexers/other.py +3778 -0
  105. data/vendor/pygments-main/pygments/lexers/parsers.py +778 -0
  106. data/vendor/pygments-main/pygments/lexers/shell.py +424 -0
  107. data/vendor/pygments-main/pygments/lexers/special.py +100 -0
  108. data/vendor/pygments-main/pygments/lexers/sql.py +559 -0
  109. data/vendor/pygments-main/pygments/lexers/templates.py +1742 -0
  110. data/vendor/pygments-main/pygments/lexers/text.py +1893 -0
  111. data/vendor/pygments-main/pygments/lexers/web.py +4045 -0
  112. data/vendor/pygments-main/pygments/modeline.py +40 -0
  113. data/vendor/pygments-main/pygments/plugin.py +74 -0
  114. data/vendor/pygments-main/pygments/scanner.py +104 -0
  115. data/vendor/pygments-main/pygments/style.py +117 -0
  116. data/vendor/pygments-main/pygments/styles/__init__.py +70 -0
  117. data/vendor/pygments-main/pygments/styles/autumn.py +65 -0
  118. data/vendor/pygments-main/pygments/styles/borland.py +51 -0
  119. data/vendor/pygments-main/pygments/styles/bw.py +49 -0
  120. data/vendor/pygments-main/pygments/styles/colorful.py +81 -0
  121. data/vendor/pygments-main/pygments/styles/default.py +73 -0
  122. data/vendor/pygments-main/pygments/styles/emacs.py +72 -0
  123. data/vendor/pygments-main/pygments/styles/friendly.py +72 -0
  124. data/vendor/pygments-main/pygments/styles/fruity.py +42 -0
  125. data/vendor/pygments-main/pygments/styles/manni.py +75 -0
  126. data/vendor/pygments-main/pygments/styles/monokai.py +106 -0
  127. data/vendor/pygments-main/pygments/styles/murphy.py +80 -0
  128. data/vendor/pygments-main/pygments/styles/native.py +65 -0
  129. data/vendor/pygments-main/pygments/styles/pastie.py +75 -0
  130. data/vendor/pygments-main/pygments/styles/perldoc.py +69 -0
  131. data/vendor/pygments-main/pygments/styles/rrt.py +33 -0
  132. data/vendor/pygments-main/pygments/styles/tango.py +141 -0
  133. data/vendor/pygments-main/pygments/styles/trac.py +63 -0
  134. data/vendor/pygments-main/pygments/styles/vim.py +63 -0
  135. data/vendor/pygments-main/pygments/styles/vs.py +38 -0
  136. data/vendor/pygments-main/pygments/token.py +195 -0
  137. data/vendor/pygments-main/pygments/unistring.py +140 -0
  138. data/vendor/pygments-main/pygments/util.py +277 -0
  139. data/vendor/pygments-main/scripts/check_sources.py +242 -0
  140. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +32 -0
  141. data/vendor/pygments-main/scripts/epydoc.css +280 -0
  142. data/vendor/pygments-main/scripts/find_codetags.py +205 -0
  143. data/vendor/pygments-main/scripts/find_error.py +170 -0
  144. data/vendor/pygments-main/scripts/get_vimkw.py +43 -0
  145. data/vendor/pygments-main/scripts/pylintrc +301 -0
  146. data/vendor/pygments-main/scripts/reindent.py +291 -0
  147. data/vendor/pygments-main/scripts/vim2pygments.py +933 -0
  148. data/vendor/pygments-main/setup.cfg +7 -0
  149. data/vendor/pygments-main/setup.py +90 -0
  150. data/vendor/pygments-main/tests/dtds/HTML4-f.dtd +37 -0
  151. data/vendor/pygments-main/tests/dtds/HTML4-s.dtd +869 -0
  152. data/vendor/pygments-main/tests/dtds/HTML4.dcl +88 -0
  153. data/vendor/pygments-main/tests/dtds/HTML4.dtd +1092 -0
  154. data/vendor/pygments-main/tests/dtds/HTML4.soc +9 -0
  155. data/vendor/pygments-main/tests/dtds/HTMLlat1.ent +195 -0
  156. data/vendor/pygments-main/tests/dtds/HTMLspec.ent +77 -0
  157. data/vendor/pygments-main/tests/dtds/HTMLsym.ent +241 -0
  158. data/vendor/pygments-main/tests/examplefiles/ANTLRv3.g +608 -0
  159. data/vendor/pygments-main/tests/examplefiles/AcidStateAdvanced.hs +209 -0
  160. data/vendor/pygments-main/tests/examplefiles/AlternatingGroup.mu +102 -0
  161. data/vendor/pygments-main/tests/examplefiles/BOM.js +1 -0
  162. data/vendor/pygments-main/tests/examplefiles/CPDictionary.j +611 -0
  163. data/vendor/pygments-main/tests/examplefiles/Config.in.cache +1973 -0
  164. data/vendor/pygments-main/tests/examplefiles/Constants.mo +158 -0
  165. data/vendor/pygments-main/tests/examplefiles/DancingSudoku.lhs +411 -0
  166. data/vendor/pygments-main/tests/examplefiles/Deflate.fs +578 -0
  167. data/vendor/pygments-main/tests/examplefiles/Errors.scala +18 -0
  168. data/vendor/pygments-main/tests/examplefiles/File.hy +174 -0
  169. data/vendor/pygments-main/tests/examplefiles/Get-CommandDefinitionHtml.ps1 +66 -0
  170. data/vendor/pygments-main/tests/examplefiles/IPDispatchC.nc +104 -0
  171. data/vendor/pygments-main/tests/examplefiles/IPDispatchP.nc +671 -0
  172. data/vendor/pygments-main/tests/examplefiles/Intro.java +1660 -0
  173. data/vendor/pygments-main/tests/examplefiles/Makefile +1131 -0
  174. data/vendor/pygments-main/tests/examplefiles/Object.st +4394 -0
  175. data/vendor/pygments-main/tests/examplefiles/OrderedMap.hx +584 -0
  176. data/vendor/pygments-main/tests/examplefiles/RoleQ.pm6 +23 -0
  177. data/vendor/pygments-main/tests/examplefiles/SmallCheck.hs +378 -0
  178. data/vendor/pygments-main/tests/examplefiles/Sorting.mod +470 -0
  179. data/vendor/pygments-main/tests/examplefiles/Sudoku.lhs +382 -0
  180. data/vendor/pygments-main/tests/examplefiles/addressbook.proto +30 -0
  181. data/vendor/pygments-main/tests/examplefiles/antlr_throws +1 -0
  182. data/vendor/pygments-main/tests/examplefiles/apache2.conf +393 -0
  183. data/vendor/pygments-main/tests/examplefiles/as3_test.as +143 -0
  184. data/vendor/pygments-main/tests/examplefiles/as3_test2.as +46 -0
  185. data/vendor/pygments-main/tests/examplefiles/as3_test3.as +3 -0
  186. data/vendor/pygments-main/tests/examplefiles/aspx-cs_example +27 -0
  187. data/vendor/pygments-main/tests/examplefiles/autoit_submit.au3 +25 -0
  188. data/vendor/pygments-main/tests/examplefiles/badcase.java +2 -0
  189. data/vendor/pygments-main/tests/examplefiles/batchfile.bat +49 -0
  190. data/vendor/pygments-main/tests/examplefiles/bigtest.nsi +308 -0
  191. data/vendor/pygments-main/tests/examplefiles/boot-9.scm +1557 -0
  192. data/vendor/pygments-main/tests/examplefiles/ca65_example +284 -0
  193. data/vendor/pygments-main/tests/examplefiles/cbmbas_example +9 -0
  194. data/vendor/pygments-main/tests/examplefiles/cells.ps +515 -0
  195. data/vendor/pygments-main/tests/examplefiles/ceval.c +2604 -0
  196. data/vendor/pygments-main/tests/examplefiles/cheetah_example.html +13 -0
  197. data/vendor/pygments-main/tests/examplefiles/classes.dylan +125 -0
  198. data/vendor/pygments-main/tests/examplefiles/condensed_ruby.rb +10 -0
  199. data/vendor/pygments-main/tests/examplefiles/coq_RelationClasses +447 -0
  200. data/vendor/pygments-main/tests/examplefiles/database.pytb +20 -0
  201. data/vendor/pygments-main/tests/examplefiles/de.MoinMoin.po +2461 -0
  202. data/vendor/pygments-main/tests/examplefiles/demo.ahk +181 -0
  203. data/vendor/pygments-main/tests/examplefiles/demo.cfm +38 -0
  204. data/vendor/pygments-main/tests/examplefiles/django_sample.html+django +68 -0
  205. data/vendor/pygments-main/tests/examplefiles/dwarf.cw +17 -0
  206. data/vendor/pygments-main/tests/examplefiles/erl_session +10 -0
  207. data/vendor/pygments-main/tests/examplefiles/escape_semicolon.clj +1 -0
  208. data/vendor/pygments-main/tests/examplefiles/evil_regex.js +48 -0
  209. data/vendor/pygments-main/tests/examplefiles/example.Rd +78 -0
  210. data/vendor/pygments-main/tests/examplefiles/example.bug +54 -0
  211. data/vendor/pygments-main/tests/examplefiles/example.c +2080 -0
  212. data/vendor/pygments-main/tests/examplefiles/example.ceylon +52 -0
  213. data/vendor/pygments-main/tests/examplefiles/example.clay +33 -0
  214. data/vendor/pygments-main/tests/examplefiles/example.cls +15 -0
  215. data/vendor/pygments-main/tests/examplefiles/example.cob +3556 -0
  216. data/vendor/pygments-main/tests/examplefiles/example.cpp +2363 -0
  217. data/vendor/pygments-main/tests/examplefiles/example.gs +106 -0
  218. data/vendor/pygments-main/tests/examplefiles/example.gst +7 -0
  219. data/vendor/pygments-main/tests/examplefiles/example.hx +142 -0
  220. data/vendor/pygments-main/tests/examplefiles/example.jag +48 -0
  221. data/vendor/pygments-main/tests/examplefiles/example.kt +47 -0
  222. data/vendor/pygments-main/tests/examplefiles/example.lagda +19 -0
  223. data/vendor/pygments-main/tests/examplefiles/example.lua +250 -0
  224. data/vendor/pygments-main/tests/examplefiles/example.monkey +152 -0
  225. data/vendor/pygments-main/tests/examplefiles/example.moo +26 -0
  226. data/vendor/pygments-main/tests/examplefiles/example.moon +629 -0
  227. data/vendor/pygments-main/tests/examplefiles/example.msc +43 -0
  228. data/vendor/pygments-main/tests/examplefiles/example.nim +1010 -0
  229. data/vendor/pygments-main/tests/examplefiles/example.ns2 +69 -0
  230. data/vendor/pygments-main/tests/examplefiles/example.p +34 -0
  231. data/vendor/pygments-main/tests/examplefiles/example.pas +2708 -0
  232. data/vendor/pygments-main/tests/examplefiles/example.prg +161 -0
  233. data/vendor/pygments-main/tests/examplefiles/example.rb +1852 -0
  234. data/vendor/pygments-main/tests/examplefiles/example.reg +19 -0
  235. data/vendor/pygments-main/tests/examplefiles/example.rexx +50 -0
  236. data/vendor/pygments-main/tests/examplefiles/example.rhtml +561 -0
  237. data/vendor/pygments-main/tests/examplefiles/example.rkt +95 -0
  238. data/vendor/pygments-main/tests/examplefiles/example.rpf +4 -0
  239. data/vendor/pygments-main/tests/examplefiles/example.sh-session +19 -0
  240. data/vendor/pygments-main/tests/examplefiles/example.shell-session +45 -0
  241. data/vendor/pygments-main/tests/examplefiles/example.sml +156 -0
  242. data/vendor/pygments-main/tests/examplefiles/example.snobol +15 -0
  243. data/vendor/pygments-main/tests/examplefiles/example.stan +108 -0
  244. data/vendor/pygments-main/tests/examplefiles/example.tea +34 -0
  245. data/vendor/pygments-main/tests/examplefiles/example.ts +28 -0
  246. data/vendor/pygments-main/tests/examplefiles/example.u +548 -0
  247. data/vendor/pygments-main/tests/examplefiles/example.weechatlog +9 -0
  248. data/vendor/pygments-main/tests/examplefiles/example.xhtml +376 -0
  249. data/vendor/pygments-main/tests/examplefiles/example.xtend +34 -0
  250. data/vendor/pygments-main/tests/examplefiles/example.yaml +302 -0
  251. data/vendor/pygments-main/tests/examplefiles/example2.aspx +29 -0
  252. data/vendor/pygments-main/tests/examplefiles/example2.msc +79 -0
  253. data/vendor/pygments-main/tests/examplefiles/example_elixir.ex +363 -0
  254. data/vendor/pygments-main/tests/examplefiles/example_file.fy +128 -0
  255. data/vendor/pygments-main/tests/examplefiles/firefox.mak +586 -0
  256. data/vendor/pygments-main/tests/examplefiles/flipflop.sv +19 -0
  257. data/vendor/pygments-main/tests/examplefiles/foo.sce +6 -0
  258. data/vendor/pygments-main/tests/examplefiles/format.ml +1213 -0
  259. data/vendor/pygments-main/tests/examplefiles/fucked_up.rb +77 -0
  260. data/vendor/pygments-main/tests/examplefiles/function.mu +1 -0
  261. data/vendor/pygments-main/tests/examplefiles/functional.rst +1472 -0
  262. data/vendor/pygments-main/tests/examplefiles/garcia-wachs.kk +133 -0
  263. data/vendor/pygments-main/tests/examplefiles/genclass.clj +510 -0
  264. data/vendor/pygments-main/tests/examplefiles/genshi_example.xml+genshi +193 -0
  265. data/vendor/pygments-main/tests/examplefiles/genshitext_example.genshitext +33 -0
  266. data/vendor/pygments-main/tests/examplefiles/glsl.frag +7 -0
  267. data/vendor/pygments-main/tests/examplefiles/glsl.vert +13 -0
  268. data/vendor/pygments-main/tests/examplefiles/grammar-test.p6 +22 -0
  269. data/vendor/pygments-main/tests/examplefiles/hello.smali +40 -0
  270. data/vendor/pygments-main/tests/examplefiles/hello.sp +9 -0
  271. data/vendor/pygments-main/tests/examplefiles/html+php_faulty.php +1 -0
  272. data/vendor/pygments-main/tests/examplefiles/http_request_example +15 -0
  273. data/vendor/pygments-main/tests/examplefiles/http_response_example +29 -0
  274. data/vendor/pygments-main/tests/examplefiles/import.hs +4 -0
  275. data/vendor/pygments-main/tests/examplefiles/inet_pton6.dg +71 -0
  276. data/vendor/pygments-main/tests/examplefiles/intro.ik +24 -0
  277. data/vendor/pygments-main/tests/examplefiles/ints.php +10 -0
  278. data/vendor/pygments-main/tests/examplefiles/intsyn.fun +675 -0
  279. data/vendor/pygments-main/tests/examplefiles/intsyn.sig +286 -0
  280. data/vendor/pygments-main/tests/examplefiles/irb_heredoc +8 -0
  281. data/vendor/pygments-main/tests/examplefiles/irc.lsp +214 -0
  282. data/vendor/pygments-main/tests/examplefiles/java.properties +16 -0
  283. data/vendor/pygments-main/tests/examplefiles/jbst_example1.jbst +28 -0
  284. data/vendor/pygments-main/tests/examplefiles/jbst_example2.jbst +45 -0
  285. data/vendor/pygments-main/tests/examplefiles/jinjadesignerdoc.rst +713 -0
  286. data/vendor/pygments-main/tests/examplefiles/json.lasso +301 -0
  287. data/vendor/pygments-main/tests/examplefiles/json.lasso9 +213 -0
  288. data/vendor/pygments-main/tests/examplefiles/lighttpd_config.conf +13 -0
  289. data/vendor/pygments-main/tests/examplefiles/linecontinuation.py +47 -0
  290. data/vendor/pygments-main/tests/examplefiles/livescript-demo.ls +41 -0
  291. data/vendor/pygments-main/tests/examplefiles/logos_example.xm +28 -0
  292. data/vendor/pygments-main/tests/examplefiles/ltmain.sh +2849 -0
  293. data/vendor/pygments-main/tests/examplefiles/main.cmake +42 -0
  294. data/vendor/pygments-main/tests/examplefiles/markdown.lsp +679 -0
  295. data/vendor/pygments-main/tests/examplefiles/matlab_noreturn +3 -0
  296. data/vendor/pygments-main/tests/examplefiles/matlab_sample +30 -0
  297. data/vendor/pygments-main/tests/examplefiles/matlabsession_sample.txt +37 -0
  298. data/vendor/pygments-main/tests/examplefiles/metagrammar.treetop +455 -0
  299. data/vendor/pygments-main/tests/examplefiles/mg_sample.pro +73 -0
  300. data/vendor/pygments-main/tests/examplefiles/minehunt.qml +112 -0
  301. data/vendor/pygments-main/tests/examplefiles/minimal.ns2 +4 -0
  302. data/vendor/pygments-main/tests/examplefiles/moin_SyntaxReference.txt +340 -0
  303. data/vendor/pygments-main/tests/examplefiles/multiline_regexes.rb +38 -0
  304. data/vendor/pygments-main/tests/examplefiles/nanomsg.intr +95 -0
  305. data/vendor/pygments-main/tests/examplefiles/nasm_aoutso.asm +96 -0
  306. data/vendor/pygments-main/tests/examplefiles/nasm_objexe.asm +30 -0
  307. data/vendor/pygments-main/tests/examplefiles/nemerle_sample.n +87 -0
  308. data/vendor/pygments-main/tests/examplefiles/nginx_nginx.conf +118 -0
  309. data/vendor/pygments-main/tests/examplefiles/numbers.c +12 -0
  310. data/vendor/pygments-main/tests/examplefiles/objc_example.m +32 -0
  311. data/vendor/pygments-main/tests/examplefiles/objc_example2.m +24 -0
  312. data/vendor/pygments-main/tests/examplefiles/perl_misc +62 -0
  313. data/vendor/pygments-main/tests/examplefiles/perl_perl5db +998 -0
  314. data/vendor/pygments-main/tests/examplefiles/perl_regex-delims +120 -0
  315. data/vendor/pygments-main/tests/examplefiles/perlfunc.1 +856 -0
  316. data/vendor/pygments-main/tests/examplefiles/phpMyAdmin.spec +163 -0
  317. data/vendor/pygments-main/tests/examplefiles/phpcomplete.vim +567 -0
  318. data/vendor/pygments-main/tests/examplefiles/pleac.in.rb +1223 -0
  319. data/vendor/pygments-main/tests/examplefiles/postgresql_test.txt +47 -0
  320. data/vendor/pygments-main/tests/examplefiles/pppoe.applescript +10 -0
  321. data/vendor/pygments-main/tests/examplefiles/psql_session.txt +122 -0
  322. data/vendor/pygments-main/tests/examplefiles/py3_test.txt +2 -0
  323. data/vendor/pygments-main/tests/examplefiles/py3tb_test.py3tb +4 -0
  324. data/vendor/pygments-main/tests/examplefiles/pycon_test.pycon +14 -0
  325. data/vendor/pygments-main/tests/examplefiles/pytb_test2.pytb +2 -0
  326. data/vendor/pygments-main/tests/examplefiles/pytb_test3.pytb +4 -0
  327. data/vendor/pygments-main/tests/examplefiles/python25-bsd.mak +234 -0
  328. data/vendor/pygments-main/tests/examplefiles/qsort.prolog +13 -0
  329. data/vendor/pygments-main/tests/examplefiles/r-console-transcript.Rout +38 -0
  330. data/vendor/pygments-main/tests/examplefiles/ragel-cpp_rlscan +280 -0
  331. data/vendor/pygments-main/tests/examplefiles/ragel-cpp_snippet +2 -0
  332. data/vendor/pygments-main/tests/examplefiles/regex.js +22 -0
  333. data/vendor/pygments-main/tests/examplefiles/reversi.lsp +427 -0
  334. data/vendor/pygments-main/tests/examplefiles/robotframework.txt +39 -0
  335. data/vendor/pygments-main/tests/examplefiles/ruby_func_def.rb +11 -0
  336. data/vendor/pygments-main/tests/examplefiles/rust_example.rs +233 -0
  337. data/vendor/pygments-main/tests/examplefiles/scilab.sci +30 -0
  338. data/vendor/pygments-main/tests/examplefiles/session.dylan-console +9 -0
  339. data/vendor/pygments-main/tests/examplefiles/sibling.prolog +19 -0
  340. data/vendor/pygments-main/tests/examplefiles/simple.md +747 -0
  341. data/vendor/pygments-main/tests/examplefiles/smarty_example.html +209 -0
  342. data/vendor/pygments-main/tests/examplefiles/source.lgt +343 -0
  343. data/vendor/pygments-main/tests/examplefiles/sources.list +62 -0
  344. data/vendor/pygments-main/tests/examplefiles/sphere.pov +18 -0
  345. data/vendor/pygments-main/tests/examplefiles/sqlite3.sqlite3-console +27 -0
  346. data/vendor/pygments-main/tests/examplefiles/squid.conf +30 -0
  347. data/vendor/pygments-main/tests/examplefiles/string.jl +1031 -0
  348. data/vendor/pygments-main/tests/examplefiles/string_delimiters.d +21 -0
  349. data/vendor/pygments-main/tests/examplefiles/stripheredoc.sh +3 -0
  350. data/vendor/pygments-main/tests/examplefiles/swig_java.swg +1329 -0
  351. data/vendor/pygments-main/tests/examplefiles/swig_std_vector.i +225 -0
  352. data/vendor/pygments-main/tests/examplefiles/test.R +153 -0
  353. data/vendor/pygments-main/tests/examplefiles/test.adb +211 -0
  354. data/vendor/pygments-main/tests/examplefiles/test.agda +102 -0
  355. data/vendor/pygments-main/tests/examplefiles/test.asy +131 -0
  356. data/vendor/pygments-main/tests/examplefiles/test.awk +121 -0
  357. data/vendor/pygments-main/tests/examplefiles/test.bas +29 -0
  358. data/vendor/pygments-main/tests/examplefiles/test.bb +95 -0
  359. data/vendor/pygments-main/tests/examplefiles/test.bmx +145 -0
  360. data/vendor/pygments-main/tests/examplefiles/test.boo +39 -0
  361. data/vendor/pygments-main/tests/examplefiles/test.bro +250 -0
  362. data/vendor/pygments-main/tests/examplefiles/test.cs +374 -0
  363. data/vendor/pygments-main/tests/examplefiles/test.css +54 -0
  364. data/vendor/pygments-main/tests/examplefiles/test.cu +36 -0
  365. data/vendor/pygments-main/tests/examplefiles/test.d +135 -0
  366. data/vendor/pygments-main/tests/examplefiles/test.dart +23 -0
  367. data/vendor/pygments-main/tests/examplefiles/test.dtd +89 -0
  368. data/vendor/pygments-main/tests/examplefiles/test.ebnf +31 -0
  369. data/vendor/pygments-main/tests/examplefiles/test.ec +605 -0
  370. data/vendor/pygments-main/tests/examplefiles/test.ecl +58 -0
  371. data/vendor/pygments-main/tests/examplefiles/test.eh +315 -0
  372. data/vendor/pygments-main/tests/examplefiles/test.erl +169 -0
  373. data/vendor/pygments-main/tests/examplefiles/test.evoque +33 -0
  374. data/vendor/pygments-main/tests/examplefiles/test.fan +818 -0
  375. data/vendor/pygments-main/tests/examplefiles/test.flx +57 -0
  376. data/vendor/pygments-main/tests/examplefiles/test.gdc +13 -0
  377. data/vendor/pygments-main/tests/examplefiles/test.groovy +97 -0
  378. data/vendor/pygments-main/tests/examplefiles/test.html +339 -0
  379. data/vendor/pygments-main/tests/examplefiles/test.ini +10 -0
  380. data/vendor/pygments-main/tests/examplefiles/test.java +653 -0
  381. data/vendor/pygments-main/tests/examplefiles/test.jsp +24 -0
  382. data/vendor/pygments-main/tests/examplefiles/test.maql +45 -0
  383. data/vendor/pygments-main/tests/examplefiles/test.mod +374 -0
  384. data/vendor/pygments-main/tests/examplefiles/test.moo +51 -0
  385. data/vendor/pygments-main/tests/examplefiles/test.myt +166 -0
  386. data/vendor/pygments-main/tests/examplefiles/test.nim +93 -0
  387. data/vendor/pygments-main/tests/examplefiles/test.opa +10 -0
  388. data/vendor/pygments-main/tests/examplefiles/test.p6 +252 -0
  389. data/vendor/pygments-main/tests/examplefiles/test.pas +743 -0
  390. data/vendor/pygments-main/tests/examplefiles/test.php +505 -0
  391. data/vendor/pygments-main/tests/examplefiles/test.plot +333 -0
  392. data/vendor/pygments-main/tests/examplefiles/test.ps1 +108 -0
  393. data/vendor/pygments-main/tests/examplefiles/test.pypylog +1839 -0
  394. data/vendor/pygments-main/tests/examplefiles/test.r3 +94 -0
  395. data/vendor/pygments-main/tests/examplefiles/test.rb +177 -0
  396. data/vendor/pygments-main/tests/examplefiles/test.rhtml +43 -0
  397. data/vendor/pygments-main/tests/examplefiles/test.scaml +8 -0
  398. data/vendor/pygments-main/tests/examplefiles/test.ssp +12 -0
  399. data/vendor/pygments-main/tests/examplefiles/test.tcsh +830 -0
  400. data/vendor/pygments-main/tests/examplefiles/test.vb +407 -0
  401. data/vendor/pygments-main/tests/examplefiles/test.vhdl +161 -0
  402. data/vendor/pygments-main/tests/examplefiles/test.xqy +138 -0
  403. data/vendor/pygments-main/tests/examplefiles/test.xsl +23 -0
  404. data/vendor/pygments-main/tests/examplefiles/test2.pypylog +120 -0
  405. data/vendor/pygments-main/tests/examplefiles/truncated.pytb +15 -0
  406. data/vendor/pygments-main/tests/examplefiles/type.lisp +1218 -0
  407. data/vendor/pygments-main/tests/examplefiles/underscore.coffee +603 -0
  408. data/vendor/pygments-main/tests/examplefiles/unicode.applescript +5 -0
  409. data/vendor/pygments-main/tests/examplefiles/unicodedoc.py +11 -0
  410. data/vendor/pygments-main/tests/examplefiles/unix-io.lid +37 -0
  411. data/vendor/pygments-main/tests/examplefiles/webkit-transition.css +3 -0
  412. data/vendor/pygments-main/tests/examplefiles/while.pov +13 -0
  413. data/vendor/pygments-main/tests/examplefiles/wiki.factor +384 -0
  414. data/vendor/pygments-main/tests/examplefiles/xml_example +1897 -0
  415. data/vendor/pygments-main/tests/examplefiles/zmlrpc.f90 +798 -0
  416. data/vendor/pygments-main/tests/old_run.py +138 -0
  417. data/vendor/pygments-main/tests/run.py +49 -0
  418. data/vendor/pygments-main/tests/support.py +15 -0
  419. data/vendor/pygments-main/tests/support/tags +36 -0
  420. data/vendor/pygments-main/tests/test_basic_api.py +295 -0
  421. data/vendor/pygments-main/tests/test_clexer.py +31 -0
  422. data/vendor/pygments-main/tests/test_cmdline.py +105 -0
  423. data/vendor/pygments-main/tests/test_examplefiles.py +99 -0
  424. data/vendor/pygments-main/tests/test_html_formatter.py +178 -0
  425. data/vendor/pygments-main/tests/test_latex_formatter.py +55 -0
  426. data/vendor/pygments-main/tests/test_lexers_other.py +68 -0
  427. data/vendor/pygments-main/tests/test_perllexer.py +137 -0
  428. data/vendor/pygments-main/tests/test_regexlexer.py +47 -0
  429. data/vendor/pygments-main/tests/test_token.py +46 -0
  430. data/vendor/pygments-main/tests/test_using_api.py +40 -0
  431. data/vendor/pygments-main/tests/test_util.py +135 -0
  432. data/vendor/simplejson/.gitignore +10 -0
  433. data/vendor/simplejson/.travis.yml +5 -0
  434. data/vendor/simplejson/CHANGES.txt +291 -0
  435. data/vendor/simplejson/LICENSE.txt +19 -0
  436. data/vendor/simplejson/MANIFEST.in +5 -0
  437. data/vendor/simplejson/README.rst +19 -0
  438. data/vendor/simplejson/conf.py +179 -0
  439. data/vendor/simplejson/index.rst +628 -0
  440. data/vendor/simplejson/scripts/make_docs.py +18 -0
  441. data/vendor/simplejson/setup.py +104 -0
  442. data/vendor/simplejson/simplejson/__init__.py +510 -0
  443. data/vendor/simplejson/simplejson/_speedups.c +2745 -0
  444. data/vendor/simplejson/simplejson/decoder.py +425 -0
  445. data/vendor/simplejson/simplejson/encoder.py +567 -0
  446. data/vendor/simplejson/simplejson/ordered_dict.py +119 -0
  447. data/vendor/simplejson/simplejson/scanner.py +77 -0
  448. data/vendor/simplejson/simplejson/tests/__init__.py +67 -0
  449. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +55 -0
  450. data/vendor/simplejson/simplejson/tests/test_check_circular.py +30 -0
  451. data/vendor/simplejson/simplejson/tests/test_decimal.py +66 -0
  452. data/vendor/simplejson/simplejson/tests/test_decode.py +83 -0
  453. data/vendor/simplejson/simplejson/tests/test_default.py +9 -0
  454. data/vendor/simplejson/simplejson/tests/test_dump.py +67 -0
  455. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +46 -0
  456. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +32 -0
  457. data/vendor/simplejson/simplejson/tests/test_errors.py +34 -0
  458. data/vendor/simplejson/simplejson/tests/test_fail.py +91 -0
  459. data/vendor/simplejson/simplejson/tests/test_float.py +19 -0
  460. data/vendor/simplejson/simplejson/tests/test_indent.py +86 -0
  461. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +20 -0
  462. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +121 -0
  463. data/vendor/simplejson/simplejson/tests/test_pass1.py +76 -0
  464. data/vendor/simplejson/simplejson/tests/test_pass2.py +14 -0
  465. data/vendor/simplejson/simplejson/tests/test_pass3.py +20 -0
  466. data/vendor/simplejson/simplejson/tests/test_recursion.py +67 -0
  467. data/vendor/simplejson/simplejson/tests/test_scanstring.py +117 -0
  468. data/vendor/simplejson/simplejson/tests/test_separators.py +42 -0
  469. data/vendor/simplejson/simplejson/tests/test_speedups.py +20 -0
  470. data/vendor/simplejson/simplejson/tests/test_tuple.py +49 -0
  471. data/vendor/simplejson/simplejson/tests/test_unicode.py +109 -0
  472. data/vendor/simplejson/simplejson/tool.py +39 -0
  473. metadata +557 -0
@@ -0,0 +1,16 @@
1
+ foo = bar
2
+ foo: bar
3
+ foo.oof: \
4
+ bar=baz; \
5
+ asdf
6
+
7
+ // comment
8
+ # comment
9
+ ; comment
10
+
11
+ x:a\
12
+ b
13
+ x: a \
14
+ b
15
+
16
+ x = \
@@ -0,0 +1,28 @@
1
+ <%@ Control Name="MyApp.MyJbstControl" Language="JavaScript" %>
2
+
3
+ <script type="text/javascript">
4
+
5
+ /* initialization code block, executed only once as control is loaded */
6
+ this.generateValue = function() {
7
+ return new Date().toString();
8
+ };
9
+
10
+ </script>
11
+
12
+ <%!
13
+ /* initialization code block, executed only once as control is loaded */
14
+ /* alternate syntax to script block above */
15
+ this.myInitTime = this.generateValue();
16
+ %>
17
+
18
+ <%
19
+ /* data binding code block, executed each time as control is data bound */
20
+ this.myBindTime = this.generateValue();
21
+ %>
22
+
23
+ <%-- JBST Comment --%>
24
+ <span style="color:red"><%= this.myBindTime /* data binding expression */ %></span>
25
+ <span style="color:green"><%= this.myInitTime /* data binding expression */ %></span>
26
+
27
+ <!-- HTML Comment -->
28
+ <span style="color:blue"><%$ Resources: localizationKey %><%-- JBST globalization--%></span>
@@ -0,0 +1,45 @@
1
+ <%@ Control Name="Foo.MyZebraList" Language="JavaScript" %>
2
+
3
+ <script type="text/javascript">
4
+
5
+ /* private members ------------------------------------------ */
6
+
7
+ /*int*/ function digits(/*int*/ n) {
8
+ return (n < 10) ? '0' + n : n;
9
+ }
10
+
11
+ /* public members ------------------------------------------- */
12
+
13
+ // use the item index to alternate colors and highlight
14
+ /*string*/ this.zebraStripe = function(/*bool*/ selected, /*int*/ index, /*int*/ count) {
15
+ var css = [ "item" ];
16
+ if (index % 2 === 0) {
17
+ css.push("item-alt");
18
+ }
19
+ if (selected) {
20
+ css.push("item-selected");
21
+ }
22
+ return css.join(" ");
23
+ };
24
+
25
+ /*string*/ this.formatTime = function(/*Date*/ time) {
26
+ return time.getHours() + ':' + digits(time.getMinutes()) + ':' + digits(time.getSeconds());
27
+ };
28
+
29
+ </script>
30
+
31
+ <div class="example">
32
+ <h2><%= this.data.title %> as of <%= this.formatTime(this.data.timestamp) %>!</h2>
33
+ <p><%= this.data.description %></p>
34
+ <ul class="items" jbst:visible="<%= this.data.children.length > 0 %>">
35
+
36
+ <!-- anonymous inner template -->
37
+ <jbst:control data="<%= this.data.children %>">
38
+ <!-- populate list item for each item of the parent's children property -->
39
+ <li class="<%= Foo.MyZebraList.zebraStripe(this.data.selected, this.index, this.count) %>">
40
+ <%= this.data.label %> (<%= this.index+1 %> of <%= this.count %>)
41
+ </li>
42
+ </jbst:control>
43
+
44
+ </ul>
45
+ </div>
@@ -0,0 +1,713 @@
1
+ ======================
2
+ Designer Documentation
3
+ ======================
4
+
5
+ This part of the Jinja documentaton is meant for template designers.
6
+
7
+ Basics
8
+ ======
9
+
10
+ The Jinja template language is designed to strike a balance between content
11
+ and application logic. Nevertheless you can use a python like statement
12
+ language. You don't have to know how Python works to create Jinja templates,
13
+ but if you know it you can use some additional statements you may know from
14
+ Python.
15
+
16
+ Here is a small example template:
17
+
18
+ .. sourcecode:: html+jinja
19
+
20
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
21
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
22
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
23
+ <head>
24
+ <title>My Webpage</title>
25
+ </head>
26
+ <body>
27
+ <ul id="navigation">
28
+ {% for item in navigation %}
29
+ <li><a href="{{ item.href|e }}">{{ item.caption|e }}</a></li>
30
+ {% endfor %}
31
+ </ul>
32
+
33
+ <h1>My Webpage</h1>
34
+ {{ variable }}
35
+ </body>
36
+ </html>
37
+
38
+ This covers the default settings. The application developer might have changed
39
+ the syntax from ``{% foo %}`` to ``<% foo %>`` or something similar. This
40
+ documentation just covers the default values.
41
+
42
+ A variable looks like ``{{ foobar }}`` where foobar is the variable name. Inside
43
+ of statements (``{% some content here %}``) variables are just normal names
44
+ without the braces around it. In fact ``{{ foobar }}`` is just an alias for
45
+ the statement ``{% print foobar %}``.
46
+
47
+ Variables are coming from the context provided by the application. Normally there
48
+ should be a documentation regarding the context contents but if you want to know
49
+ the content of the current context, you can add this to your template:
50
+
51
+ .. sourcecode:: html+jinja
52
+
53
+ <pre>{{ debug()|e }}</pre>
54
+
55
+ A context isn't flat which means that each variable can has subvariables, as long
56
+ as it is representable as python data structure. You can access attributes of
57
+ a variable using the dot and bracket operators. The following examples show
58
+ this:
59
+
60
+ .. sourcecode:: jinja
61
+
62
+ {{ user.username }}
63
+ is the same as
64
+ {{ user['username'] }}
65
+ you can also use a variable to access an attribute:
66
+ {{ users[current_user].username }}
67
+ If you have numerical indices you have to use the [] syntax:
68
+ {{ users[0].username }}
69
+
70
+ Filters
71
+ =======
72
+
73
+ In the examples above you might have noticed the pipe symbols. Pipe symbols tell
74
+ the engine that it has to apply a filter on the variable. Here is a small example:
75
+
76
+ .. sourcecode:: jinja
77
+
78
+ {{ variable|replace('foo', 'bar')|escape }}
79
+
80
+ If you want, you can also put whitespace between the filters.
81
+
82
+ This will look for a variable `variable`, pass it to the filter `replace`
83
+ with the arguments ``'foo'`` and ``'bar'``, and pass the result to the filter
84
+ `escape` that automatically XML-escapes the value. The `e` filter is an alias for
85
+ `escape`. Here is the complete list of supported filters:
86
+
87
+ [[list_of_filters]]
88
+
89
+ .. admonition:: note
90
+
91
+ Filters have a pretty low priority. If you want to add fitered values
92
+ you have to put them into parentheses. The same applies if you want to access
93
+ attributes:
94
+
95
+ .. sourcecode:: jinja
96
+
97
+ correct:
98
+ {{ (foo|filter) + (bar|filter) }}
99
+ wrong:
100
+ {{ foo|filter + bar|filter }}
101
+
102
+ correct:
103
+ {{ (foo|filter).attribute }}
104
+ wrong:
105
+ {{ foo|filter.attribute }}
106
+
107
+ Tests
108
+ =====
109
+
110
+ You can use the `is` operator to perform tests on a value:
111
+
112
+ .. sourcecode:: jinja
113
+
114
+ {{ 42 is numeric }} -> true
115
+ {{ "foobar" is numeric }} -> false
116
+ {{ 'FOO' is upper }} -> true
117
+
118
+ These tests are especially useful when used in `if` conditions.
119
+
120
+ [[list_of_tests]]
121
+
122
+ Global Functions
123
+ ================
124
+
125
+ Test functions and filter functions live in their own namespace. Global
126
+ functions not. They behave like normal objects in the context. Beside the
127
+ functions added by the application or framewhere there are two functions
128
+ available per default:
129
+
130
+ `range`
131
+
132
+ Works like the python `range function`_ just that it doesn't support
133
+ ranges greater than ``1000000``.
134
+
135
+ `debug`
136
+
137
+ Function that outputs the contents of the context.
138
+
139
+ Loops
140
+ =====
141
+
142
+ To iterate over a sequence, you can use the `for` loop. It basically looks like a
143
+ normal Python `for` loop and works pretty much the same:
144
+
145
+ .. sourcecode:: html+jinja
146
+
147
+ <h1>Members</h1>
148
+ <ul>
149
+ {% for user in users %}
150
+ <li>{{ loop.index }} / {{ loop.length }} - {{ user.username|escape }}</li>
151
+ {% else %}
152
+ <li><em>no users found</em></li>
153
+ {% endfor %}
154
+ </ul>
155
+
156
+ *Important* Contrary to Python is the optional ``else`` block only
157
+ executed if there was no iteration because the sequence was empty.
158
+
159
+ Inside of a `for` loop block you can access some special variables:
160
+
161
+ +----------------------+----------------------------------------+
162
+ | Variable | Description |
163
+ +======================+========================================+
164
+ | `loop.index` | The current iteration of the loop. |
165
+ +----------------------+----------------------------------------+
166
+ | `loop.index0` | The current iteration of the loop, |
167
+ | | starting counting by 0. |
168
+ +----------------------+----------------------------------------+
169
+ | `loop.revindex` | The number of iterations from the end |
170
+ | | of the loop. |
171
+ +----------------------+----------------------------------------+
172
+ | `loop.revindex0` | The number of iterations from the end |
173
+ | | of the loop, starting counting by 0. |
174
+ +----------------------+----------------------------------------+
175
+ | `loop.first` | True if first iteration. |
176
+ +----------------------+----------------------------------------+
177
+ | `loop.last` | True if last iteration. |
178
+ +----------------------+----------------------------------------+
179
+ | `loop.even` | True if current iteration is even. |
180
+ +----------------------+----------------------------------------+
181
+ | `loop.odd` | True if current iteration is odd. |
182
+ +----------------------+----------------------------------------+
183
+ | `loop.length` | Total number of items in the sequence. |
184
+ +----------------------+----------------------------------------+
185
+ | `loop.parent` | The context of the parent loop. |
186
+ +----------------------+----------------------------------------+
187
+
188
+ Loops also support recursion. Let's assume you have a sitemap where each item
189
+ might have a number of child items. A template for that could look like this:
190
+
191
+ .. sourcecode:: html+jinja
192
+
193
+ <h1>Sitemap
194
+ <ul id="sitemap">
195
+ {% for item in sitemap recursive %}
196
+ <li><a href="{{ item.url|e }}">{{ item.title|e }}</a>
197
+ {% if item.children %}<ul>{{ loop(item.children) }}</ul>{% endif %}</li>
198
+ {% endfor %}
199
+ </ul>
200
+
201
+ What happens here? Basically the first thing that is different to a normal
202
+ loop is the additional ``recursive`` modifier in the `for`-loop declaration.
203
+ It tells the template engine that we want recursion. If recursion is enabled
204
+ the special `loop` variable is callable. If you call it with a sequence it will
205
+ automatically render the loop at that position with the new sequence as argument.
206
+
207
+ Cycling
208
+ =======
209
+
210
+ Sometimes you might want to have different text snippets for each row in a list,
211
+ for example to have alternating row colors. You can easily do this by using the
212
+ ``{% cycle %}`` tag:
213
+
214
+ .. sourcecode:: html+jinja
215
+
216
+ <ul id="messages">
217
+ {% for message in messages %}
218
+ <li class="{% cycle 'row1', 'row2' %}">{{ message|e }}</li>
219
+ {% endfor %}
220
+ </ul>
221
+
222
+ Each time Jinja encounters a `cycle` tag it will cycle through the list
223
+ of given items and return the next one. If you pass it one item jinja assumes
224
+ that this item is a sequence from the context and uses this:
225
+
226
+ .. sourcecode:: html+jinja
227
+
228
+ <li style="color: {% cycle rowcolors %}">...</li>
229
+
230
+ Conditions
231
+ ==========
232
+
233
+ Jinja supports Python-like `if` / `elif` / `else` constructs:
234
+
235
+ .. sourcecode:: jinja
236
+
237
+ {% if user.active %}
238
+ user {{ user.name|e }} is active.
239
+ {% elif user.deleted %}
240
+ user {{ user.name|e }} was deleted some time ago.
241
+ {% else %}
242
+ i don't know what's wrong with {{ user.username|e }}
243
+ {% endif %}
244
+
245
+ If the user is active the first block is rendered. If not and the user was
246
+ deleted the second one, in all other cases the third one.
247
+
248
+ You can also use comparison operators:
249
+
250
+ .. sourcecode:: html+jinja
251
+
252
+ {% if amount < 0 %}
253
+ <span style="color: red">{{ amount }}</span>
254
+ {% else %}
255
+ <span style="color: black">{{ amount }}</span>
256
+ {% endif %}
257
+
258
+ .. admonition:: Note
259
+
260
+ Of course you can use `or` / `and` and parentheses to create more complex
261
+ conditions, but usually the logic is already handled in the application and
262
+ you don't have to create such complex constructs in the template code. However
263
+ in some situations it might be a good thing to have the abilities to create
264
+ them.
265
+
266
+ Operators
267
+ =========
268
+
269
+ Inside ``{{ variable }}`` blocks, `if` conditions and many other parts you can
270
+ can use expressions. In expressions you can use any of the following operators:
271
+
272
+ ======= ===================================================================
273
+ ``+`` add the right operand to the left one.
274
+ ``{{ 1 + 2 }}`` would return ``3``.
275
+ ``-`` subtract the right operand from the left one.
276
+ ``{{ 1 - 1 }}`` would return ``0``.
277
+ ``/`` divide the left operand by the right one.
278
+ ``{{ 1 / 2 }}`` would return ``0.5``.
279
+ ``*`` multiply the left operand with the right one.
280
+ ``{{ 2 * 2 }}`` would return ``4``.
281
+ ``**`` raise the left operand to the power of the right
282
+ operand. ``{{ 2**3 }}`` would return ``8``.
283
+ ``in`` perform sequence membership test. ``{{ 1 in [1,2,3] }}`` would
284
+ return true.
285
+ ``is`` perform a test on the value. See the section about
286
+ tests for more information.
287
+ ``|`` apply a filter on the value. See the section about
288
+ filters for more information.
289
+ ``and`` return true if the left and the right operand is true.
290
+ ``or`` return true if the left or the right operand is true.
291
+ ``not`` negate a statement (see below)
292
+ ``()`` call a callable: ``{{ user.get_username() }}``. Inside of the
293
+ parentheses you can use variables: ``{{ user.get(username) }}``.
294
+ ======= ===================================================================
295
+
296
+ Note that there is no support for any bit operations or something similar.
297
+
298
+ * special note regarding `not`: The `is` and `in` operators support negation
299
+ using an infix notation too: ``foo is not bar`` and ``foo not in bar``
300
+ instead of ``not foo is bar`` and ``not foo in bar``. All other expressions
301
+ require a prefix notation: ``not (foo and bar)``.
302
+
303
+ Boolean Values
304
+ ==============
305
+
306
+ In If-Conditions Jinja performs a boolean check. All empty values (eg: empty
307
+ lists ``[]``, empty dicts ``{}`` etc) evaluate to `false`. Numbers that are
308
+ equal to `0`/`0.00` are considered `false` too. The boolean value of other
309
+ objects depends on the behavior the application developer gave it. Usually
310
+ items are `true`.
311
+
312
+ Here some examples that should explain it:
313
+
314
+ .. sourcecode:: jinja
315
+
316
+ {% if [] %}
317
+ will always be false because it's an empty list
318
+
319
+ {% if {} %}
320
+ false too.
321
+
322
+ {% if ['foo'] %}
323
+ this is true. Because the list is not empty.
324
+
325
+ {% if "foobar" %}
326
+ this is also true because the string is not empty.
327
+
328
+ Slicing
329
+ =======
330
+
331
+ Some objects support slicing operations. For example lists:
332
+
333
+ .. sourcecode:: jinja
334
+
335
+ {% for item in items[:5] %}
336
+ This will only iterate over the first 5 items of the list
337
+
338
+ {% for item in items[5:10] %}
339
+ This will only iterate from item 5 to 10.
340
+
341
+ {% for item in items[:10:2] %}
342
+ This will only yield items from start to ten and only returing
343
+ even items.
344
+
345
+ For more informations about slicing have a look at the `slicing chapter`_
346
+ in the "Dive into Python" e-book.
347
+
348
+ Macros
349
+ ======
350
+
351
+ If you want to use a partial template in more than one place, you might want to
352
+ create a macro from it:
353
+
354
+ .. sourcecode:: html+jinja
355
+
356
+ {% macro show_user user %}
357
+ <h1>{{ user.name|e }}</h1>
358
+ <div class="test">
359
+ {{ user.description }}
360
+ </div>
361
+ {% endmacro %}
362
+
363
+ Now you can use it from everywhere in the code by passing it an item:
364
+
365
+ .. sourcecode:: jinja
366
+
367
+ {% for user in users %}
368
+ {{ show_user(user) }}
369
+ {% endfor %}
370
+
371
+ You can also specify more than one value:
372
+
373
+ .. sourcecode:: html+jinja
374
+
375
+ {% macro show_dialog title, text %}
376
+ <div class="dialog">
377
+ <h1>{{ title|e }}</h1>
378
+ <div class="test">{{ text|e }}</div>
379
+ </div>
380
+ {% endmacro %}
381
+
382
+ {{ show_dialog('Warning', 'something went wrong i guess') }}
383
+
384
+ Inheritance
385
+ ===========
386
+
387
+ The most powerful part of Jinja is template inheritance. Template inheritance
388
+ allows you to build a base "skeleton" template that contains all the common
389
+ elements of your site and defines **blocks** that child templates can override.
390
+
391
+ Sounds complicated but is very basic. It's easiest to understand it by starting
392
+ with an example.
393
+
394
+ Base Template
395
+ -------------
396
+
397
+ This template, which we'll call ``base.html``, defines a simple HTML skeleton
398
+ document that you might use for a simple two-column page. It's the job of
399
+ "child" templates to fill the empty blocks with content:
400
+
401
+ .. sourcecode:: html+jinja
402
+
403
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
404
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
405
+ <html xmlns="http://www.w3.org/1999/xhtml">
406
+ <head>
407
+ <link rel="stylesheet" href="style.css" />
408
+ <title>{% block title %}{% endblock %} - My Webpage</title>
409
+ {% block html_head %}{% endblock %}
410
+ </head>
411
+ <body>
412
+ <div id="content">
413
+ {% block content %}{% endblock %}
414
+ </div>
415
+
416
+ <div id="footer">
417
+ {% block footer %}
418
+ &copy; Copyright 2006 by <a href="http://mydomain.tld">myself</a>.
419
+ {% endblock %}
420
+ </div>
421
+ </body>
422
+
423
+ In this example, the ``{% block %}`` tags define four blocks that child templates
424
+ can fill in. All the `block` tag does is to tell the template engine that a
425
+ child template may override those portions of the template.
426
+
427
+ Child Template
428
+ --------------
429
+
430
+ A child template might look like this:
431
+
432
+ .. sourcecode:: html+jinja
433
+
434
+ {% extends "base.html" %}
435
+ {% block title %}Index{% endblock %}
436
+
437
+ {% block html_head %}
438
+ <style type="text/css">
439
+ .important {
440
+ color: #336699;
441
+ }
442
+ </style>
443
+ {% endblock %}
444
+
445
+ {% block content %}
446
+ <h1>Index</h1>
447
+ <p class="important">
448
+ Welcome on my awsome homepage.
449
+ </p>
450
+ {% endblock %}
451
+
452
+ The ``{% extends %}`` tag is the key here. It tells the template engine that
453
+ this template "extends" another template. When the template system evaluates
454
+ this template, first it locates the parent.
455
+
456
+ The filename of the template depends on the template loader. For example the
457
+ ``FileSystemLoader`` allows you to access other templates by giving the
458
+ filename. You can access templates in subdirectories with an slash:
459
+
460
+ .. sourcecode:: jinja
461
+
462
+ {% extends "layout/default.html" %}
463
+
464
+ But this behavior can depend on the application using Jinja.
465
+
466
+ Note that since the child template didn't define the ``footer`` block, the
467
+ value from the parent template is used instead.
468
+
469
+ .. admonition:: Note
470
+
471
+ You can't define multiple ``{% block %}`` tags with the same name in the
472
+ same template. This limitation exists because a block tag works in "both"
473
+ directions. That is, a block tag doesn't just provide a hole to fill - it
474
+ also defines the content that fills the hole in the *parent*. If there were
475
+ two similarly-named ``{% block %}`` tags in a template, that template's
476
+ parent wouldn't know which one of the blocks' content to use.
477
+
478
+ Template Inclusion
479
+ ==================
480
+
481
+ You can load another template at a given position using ``{% include %}``.
482
+ Usually it's a better idea to use inheritance but if you for example want to
483
+ load macros, `include` works better than `extends`:
484
+
485
+ .. sourcecode:: jinja
486
+
487
+ {% include "myhelpers.html" %}
488
+ {{ my_helper("foo") }}
489
+
490
+ If you define a macro called ``my_helper`` in ``myhelpers.html``, you can now
491
+ use it from the template as shown above.
492
+
493
+ Filtering Blocks
494
+ ================
495
+
496
+ Sometimes it could be a good idea to filter a complete block of text. For
497
+ example, if you want to escape some html code:
498
+
499
+ .. sourcecode:: jinja
500
+
501
+ {% filter escape %}
502
+ <html>
503
+ <code>goes here</code>
504
+ </html>
505
+ {% endfilter %}
506
+
507
+ Of course you can chain filters too:
508
+
509
+ .. sourcecode:: jinja
510
+
511
+ {% filter lower|escape %}
512
+ <B>SOME TEXT</B>
513
+ {% endfilter %}
514
+
515
+ returns ``"&lt;b&gt;some text&lt;/b&gt;"``.
516
+
517
+ Defining Variables
518
+ ==================
519
+
520
+ You can also define variables in the namespace using the ``{% set %}`` tag:
521
+
522
+ .. sourcecode:: jinja
523
+
524
+ {% set foo = 'foobar' %}
525
+ {{ foo }}
526
+
527
+ This should ouput ``foobar``.
528
+
529
+ Scopes
530
+ ======
531
+
532
+ Jinja has multiple scopes. A scope is something like a new transparent foil on
533
+ a stack of foils. You can only write to the outermost foil but read all of them
534
+ since you can look through them. If you remove the top foil all data on that
535
+ foil disappears. Some tags in Jinja add a new layer to the stack. Currently
536
+ these are `block`, `for`, `macro` and `filter`. This means that variables and
537
+ other elements defined inside a macro, loop or some of the other tags listed
538
+ above will be only available in that block. Here an example:
539
+
540
+ .. sourcecode:: jinja
541
+
542
+ {% macro angryhello name %}
543
+ {% set angryname = name|upper %}
544
+ Hello {{ name }}. Hello {{ name }}!
545
+ HELLO {{ angryname }}!!!!!!111
546
+ {% endmacro %}
547
+
548
+ The variable ``angryname`` just exists inside the macro, not outside it.
549
+
550
+ Defined macros appear on the context as variables. Because of this, they are
551
+ affected by the scoping too. A macro defined inside of a macro is just available
552
+ in those two macros (the macro itself and the macro it's defined in). For `set`
553
+ and `macro` two additional rules exist: If a macro is defined in an extended
554
+ template but outside of a visible block (thus outside of any block) will be
555
+ available in all blocks below. This allows you to use `include` statements to
556
+ load often used macros at once.
557
+
558
+ Undefined Variables
559
+ ===================
560
+
561
+ If you have already worked with python you probably know about the fact that
562
+ undefined variables raise an exception. This is different in Jinja. There is a
563
+ special value called `undefined` that represents values that do not exist.
564
+
565
+ This special variable works complete different from any variables you maybe
566
+ know. If you print it using ``{{ variable }}`` it will not appear because it's
567
+ literally empty. If you try to iterate over it, it will work. But no items
568
+ are returned. Comparing this value to any other value results in `false`.
569
+ Even if you compare it to itself:
570
+
571
+ .. sourcecode:: jinja
572
+
573
+ {{ undefined == undefined }}
574
+ will return false. Not even undefined is undefined :)
575
+ Use `is defined` / `is not defined`:
576
+
577
+ {{ undefined is not defined }}
578
+ will return true.
579
+
580
+ There are also some additional rules regarding this special value. Any
581
+ mathematical operators (``+``, ``-``, ``*``, ``/``) return the operand
582
+ as result:
583
+
584
+ .. sourcecode:: jinja
585
+
586
+ {{ undefined + "foo" }}
587
+ returns "foo"
588
+
589
+ {{ undefined - 42 }}
590
+ returns 42. Note: not -42!
591
+
592
+ In any expression `undefined` evaluates to `false`. It has no length, all
593
+ attribute calls return undefined, calling too:
594
+
595
+ .. sourcecode:: jinja
596
+
597
+ {{ undefined.attribute().attribute_too[42] }}
598
+ still returns `undefined`.
599
+
600
+ Escaping
601
+ ========
602
+
603
+ Sometimes you might want to add Jinja syntax elements into the template
604
+ without executing them. In that case you have quite a few possibilities.
605
+
606
+ For small parts this might be a good way:
607
+
608
+ .. sourcecode:: jinja
609
+
610
+ {{ "{{ foo }} is variable syntax and {% foo %} is block syntax" }}
611
+
612
+ When you have multiple elements you can use the ``raw`` block:
613
+
614
+ .. sourcecode:: jinja
615
+
616
+ {% raw %}
617
+ Filtering blocks works like this in Jinja:
618
+ {% filter escape %}
619
+ <html>
620
+ <code>goes here</code>
621
+ </html>
622
+ {% endfilter %}
623
+ {% endraw %}
624
+
625
+ Reserved Keywords
626
+ =================
627
+
628
+ Jinja has some keywords you cannot use a variable names. This limitation
629
+ exists to make look coherent. Syntax highlighters won't mess things up and
630
+ you will don't have unexpected output.
631
+
632
+ The following keywords exist and cannot be used as identifiers:
633
+
634
+ `and`, `block`, `cycle`, `elif`, `else`, `endblock`, `endfilter`,
635
+ `endfor`, `endif`, `endmacro`, `endraw`, `endtrans`, `extends`, `filter`,
636
+ `for`, `if`, `in`, `include`, `is`, `macro`, `not`, `or`, `pluralize`,
637
+ `raw`, `recursive`, `set`, `trans`
638
+
639
+ If you want to use such a name you have to prefix or suffix it or use
640
+ alternative names:
641
+
642
+ .. sourcecode:: jinja
643
+
644
+ {% for macro_ in macros %}
645
+ {{ macro_('foo') }}
646
+ {% endfor %}
647
+
648
+ If future Jinja releases add new keywords those will be "light" keywords which
649
+ means that they won't raise an error for several releases but yield warnings
650
+ on the application side. But it's very unlikely that new keywords will be
651
+ added.
652
+
653
+ Internationalization
654
+ ====================
655
+
656
+ If the application is configured for i18n, you can define translatable blocks
657
+ for translators using the `trans` tag or the special underscore function:
658
+
659
+ .. sourcecode:: jinja
660
+
661
+ {% trans %}
662
+ this is a translatable block
663
+ {% endtrans %}
664
+
665
+ {% trans "This is a translatable string" %}
666
+
667
+ {{ _("This is a translatable string") }}
668
+
669
+ The latter one is useful if you want translatable arguments for filters etc.
670
+
671
+ If you want to have plural forms too, use the `pluralize` block:
672
+
673
+ .. sourcecode:: jinja
674
+
675
+ {% trans users=users %}
676
+ One user found.
677
+ {% pluralize %}
678
+ {{ users }} users found.
679
+ {% endtrans %}
680
+
681
+ {% trans first=(users|first).username|escape, user=users|length %}
682
+ one user {{ first }} found.
683
+ {% pluralize users %}
684
+ {{ users }} users found, the first one is called {{ first }}.
685
+ {% endtrans %}
686
+
687
+ If you have multiple arguments, the first one is assumed to be the indicator (the
688
+ number that is used to determine the correct singular or plural form. If you
689
+ don't have the indicator variable on position 1 you have to tell the `pluralize`
690
+ tag the correct variable name.
691
+
692
+ Inside translatable blocks you cannot use blocks or expressions (however you can
693
+ still use the ``raw`` block which will work as expected). The variable
694
+ print syntax (``{{ variablename }}``) is the only way to insert the variables
695
+ defined in the ``trans`` header. Filters must be applied in the header.
696
+
697
+ .. admonition:: note
698
+
699
+ Please make sure that you always use pluralize blocks where required.
700
+ Many languages have more complex plural forms than the English language.
701
+
702
+ Never try to workaround that issue by using something like this:
703
+
704
+ .. sourcecode:: jinja
705
+
706
+ {% if count != 1 %}
707
+ {{ count }} users found.
708
+ {% else %}
709
+ one user found.
710
+ {% endif %}
711
+
712
+ .. _slicing chapter: http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice
713
+ .. _range function: http://docs.python.org/tut/node6.html#SECTION006300000000000000000