rouge 3.17.0
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.
- checksums.yaml +7 -0
- data/Gemfile +40 -0
- data/LICENSE +186 -0
- data/bin/rougify +18 -0
- data/lib/rouge.rb +93 -0
- data/lib/rouge/cli.rb +498 -0
- data/lib/rouge/demos/abap +6 -0
- data/lib/rouge/demos/actionscript +4 -0
- data/lib/rouge/demos/ada +26 -0
- data/lib/rouge/demos/apache +21 -0
- data/lib/rouge/demos/apex +9 -0
- data/lib/rouge/demos/apiblueprint +33 -0
- data/lib/rouge/demos/applescript +2 -0
- data/lib/rouge/demos/armasm +12 -0
- data/lib/rouge/demos/awk +4 -0
- data/lib/rouge/demos/batchfile +3 -0
- data/lib/rouge/demos/bbcbasic +6 -0
- data/lib/rouge/demos/biml +38 -0
- data/lib/rouge/demos/bpf +7 -0
- data/lib/rouge/demos/brainfuck +5 -0
- data/lib/rouge/demos/bsl +7 -0
- data/lib/rouge/demos/c +8 -0
- data/lib/rouge/demos/ceylon +7 -0
- data/lib/rouge/demos/cfscript +18 -0
- data/lib/rouge/demos/clean +6 -0
- data/lib/rouge/demos/clojure +5 -0
- data/lib/rouge/demos/cmake +7 -0
- data/lib/rouge/demos/cmhg +8 -0
- data/lib/rouge/demos/coffeescript +5 -0
- data/lib/rouge/demos/common_lisp +1 -0
- data/lib/rouge/demos/conf +4 -0
- data/lib/rouge/demos/console +6 -0
- data/lib/rouge/demos/coq +13 -0
- data/lib/rouge/demos/cpp +8 -0
- data/lib/rouge/demos/crystal +45 -0
- data/lib/rouge/demos/csharp +5 -0
- data/lib/rouge/demos/css +4 -0
- data/lib/rouge/demos/csvs +8 -0
- data/lib/rouge/demos/cuda +11 -0
- data/lib/rouge/demos/cython +6 -0
- data/lib/rouge/demos/d +16 -0
- data/lib/rouge/demos/dart +6 -0
- data/lib/rouge/demos/diff +7 -0
- data/lib/rouge/demos/digdag +19 -0
- data/lib/rouge/demos/docker +9 -0
- data/lib/rouge/demos/dot +5 -0
- data/lib/rouge/demos/ecl +18 -0
- data/lib/rouge/demos/eex +1 -0
- data/lib/rouge/demos/eiffel +30 -0
- data/lib/rouge/demos/elixir +1 -0
- data/lib/rouge/demos/elm +4 -0
- data/lib/rouge/demos/epp +4 -0
- data/lib/rouge/demos/erb +1 -0
- data/lib/rouge/demos/erlang +7 -0
- data/lib/rouge/demos/escape +3 -0
- data/lib/rouge/demos/factor +5 -0
- data/lib/rouge/demos/fortran +22 -0
- data/lib/rouge/demos/freefem +16 -0
- data/lib/rouge/demos/fsharp +12 -0
- data/lib/rouge/demos/gdscript +18 -0
- data/lib/rouge/demos/ghc-core +26 -0
- data/lib/rouge/demos/gherkin +17 -0
- data/lib/rouge/demos/glsl +14 -0
- data/lib/rouge/demos/go +7 -0
- data/lib/rouge/demos/gradle +10 -0
- data/lib/rouge/demos/graphql +17 -0
- data/lib/rouge/demos/groovy +9 -0
- data/lib/rouge/demos/hack +5 -0
- data/lib/rouge/demos/haml +5 -0
- data/lib/rouge/demos/handlebars +7 -0
- data/lib/rouge/demos/haskell +6 -0
- data/lib/rouge/demos/haxe +5 -0
- data/lib/rouge/demos/hcl +7 -0
- data/lib/rouge/demos/hocon +8 -0
- data/lib/rouge/demos/hql +5 -0
- data/lib/rouge/demos/html +8 -0
- data/lib/rouge/demos/http +14 -0
- data/lib/rouge/demos/hylang +10 -0
- data/lib/rouge/demos/idlang +8 -0
- data/lib/rouge/demos/igorpro +9 -0
- data/lib/rouge/demos/ini +4 -0
- data/lib/rouge/demos/io +11 -0
- data/lib/rouge/demos/irb +4 -0
- data/lib/rouge/demos/irb_output +2 -0
- data/lib/rouge/demos/java +5 -0
- data/lib/rouge/demos/javascript +1 -0
- data/lib/rouge/demos/jinja +9 -0
- data/lib/rouge/demos/jsl +3 -0
- data/lib/rouge/demos/json +1 -0
- data/lib/rouge/demos/json-doc +1 -0
- data/lib/rouge/demos/jsonnet +28 -0
- data/lib/rouge/demos/jsp +29 -0
- data/lib/rouge/demos/jsx +17 -0
- data/lib/rouge/demos/julia +11 -0
- data/lib/rouge/demos/kotlin +3 -0
- data/lib/rouge/demos/lasso +12 -0
- data/lib/rouge/demos/liquid +10 -0
- data/lib/rouge/demos/literate_coffeescript +3 -0
- data/lib/rouge/demos/literate_haskell +7 -0
- data/lib/rouge/demos/llvm +20 -0
- data/lib/rouge/demos/lua +12 -0
- data/lib/rouge/demos/lustre +6 -0
- data/lib/rouge/demos/lutin +18 -0
- data/lib/rouge/demos/m68k +16 -0
- data/lib/rouge/demos/magik +6 -0
- data/lib/rouge/demos/make +6 -0
- data/lib/rouge/demos/markdown +4 -0
- data/lib/rouge/demos/mason +22 -0
- data/lib/rouge/demos/mathematica +8 -0
- data/lib/rouge/demos/matlab +6 -0
- data/lib/rouge/demos/minizinc +23 -0
- data/lib/rouge/demos/moonscript +16 -0
- data/lib/rouge/demos/mosel +10 -0
- data/lib/rouge/demos/msgtrans +4 -0
- data/lib/rouge/demos/mxml +22 -0
- data/lib/rouge/demos/nasm +26 -0
- data/lib/rouge/demos/nesasm +11 -0
- data/lib/rouge/demos/nginx +5 -0
- data/lib/rouge/demos/nim +27 -0
- data/lib/rouge/demos/nix +19 -0
- data/lib/rouge/demos/objective_c +18 -0
- data/lib/rouge/demos/objective_cpp +17 -0
- data/lib/rouge/demos/ocaml +12 -0
- data/lib/rouge/demos/openedge +4 -0
- data/lib/rouge/demos/opentype_feature_file +6 -0
- data/lib/rouge/demos/pascal +14 -0
- data/lib/rouge/demos/perl +5 -0
- data/lib/rouge/demos/php +3 -0
- data/lib/rouge/demos/plaintext +1 -0
- data/lib/rouge/demos/plist +11 -0
- data/lib/rouge/demos/pony +17 -0
- data/lib/rouge/demos/powershell +13 -0
- data/lib/rouge/demos/praat +26 -0
- data/lib/rouge/demos/prolog +9 -0
- data/lib/rouge/demos/prometheus +9 -0
- data/lib/rouge/demos/properties +7 -0
- data/lib/rouge/demos/protobuf +5 -0
- data/lib/rouge/demos/puppet +6 -0
- data/lib/rouge/demos/python +6 -0
- data/lib/rouge/demos/q +8 -0
- data/lib/rouge/demos/qml +9 -0
- data/lib/rouge/demos/r +8 -0
- data/lib/rouge/demos/racket +24 -0
- data/lib/rouge/demos/reasonml +12 -0
- data/lib/rouge/demos/robot_framework +27 -0
- data/lib/rouge/demos/ruby +9 -0
- data/lib/rouge/demos/rust +12 -0
- data/lib/rouge/demos/sas +13 -0
- data/lib/rouge/demos/sass +3 -0
- data/lib/rouge/demos/scala +3 -0
- data/lib/rouge/demos/scheme +4 -0
- data/lib/rouge/demos/scss +5 -0
- data/lib/rouge/demos/sed +4 -0
- data/lib/rouge/demos/shell +2 -0
- data/lib/rouge/demos/sieve +10 -0
- data/lib/rouge/demos/slice +10 -0
- data/lib/rouge/demos/slim +17 -0
- data/lib/rouge/demos/smalltalk +6 -0
- data/lib/rouge/demos/smarty +12 -0
- data/lib/rouge/demos/sml +4 -0
- data/lib/rouge/demos/sparql +6 -0
- data/lib/rouge/demos/sqf +14 -0
- data/lib/rouge/demos/sql +1 -0
- data/lib/rouge/demos/supercollider +11 -0
- data/lib/rouge/demos/swift +5 -0
- data/lib/rouge/demos/tap +5 -0
- data/lib/rouge/demos/tcl +1 -0
- data/lib/rouge/demos/terraform +16 -0
- data/lib/rouge/demos/tex +1 -0
- data/lib/rouge/demos/toml +9 -0
- data/lib/rouge/demos/tsx +17 -0
- data/lib/rouge/demos/ttcn3 +6 -0
- data/lib/rouge/demos/tulip +13 -0
- data/lib/rouge/demos/turtle +26 -0
- data/lib/rouge/demos/twig +9 -0
- data/lib/rouge/demos/typescript +1 -0
- data/lib/rouge/demos/vala +8 -0
- data/lib/rouge/demos/vb +4 -0
- data/lib/rouge/demos/vcl +12 -0
- data/lib/rouge/demos/verilog +27 -0
- data/lib/rouge/demos/vhdl +23 -0
- data/lib/rouge/demos/viml +14 -0
- data/lib/rouge/demos/vue +11 -0
- data/lib/rouge/demos/wollok +11 -0
- data/lib/rouge/demos/xml +2 -0
- data/lib/rouge/demos/xojo +14 -0
- data/lib/rouge/demos/xpath +2 -0
- data/lib/rouge/demos/xquery +22 -0
- data/lib/rouge/demos/yaml +4 -0
- data/lib/rouge/formatter.rb +112 -0
- data/lib/rouge/formatters/html.rb +56 -0
- data/lib/rouge/formatters/html_inline.rb +31 -0
- data/lib/rouge/formatters/html_legacy.rb +45 -0
- data/lib/rouge/formatters/html_line_table.rb +53 -0
- data/lib/rouge/formatters/html_linewise.rb +23 -0
- data/lib/rouge/formatters/html_pygments.rb +18 -0
- data/lib/rouge/formatters/html_table.rb +51 -0
- data/lib/rouge/formatters/null.rb +20 -0
- data/lib/rouge/formatters/terminal256.rb +198 -0
- data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
- data/lib/rouge/formatters/tex.rb +92 -0
- data/lib/rouge/guesser.rb +57 -0
- data/lib/rouge/guessers/disambiguation.rb +136 -0
- data/lib/rouge/guessers/filename.rb +27 -0
- data/lib/rouge/guessers/glob_mapping.rb +45 -0
- data/lib/rouge/guessers/mimetype.rb +16 -0
- data/lib/rouge/guessers/modeline.rb +46 -0
- data/lib/rouge/guessers/source.rb +31 -0
- data/lib/rouge/guessers/util.rb +34 -0
- data/lib/rouge/lexer.rb +516 -0
- data/lib/rouge/lexers/abap.rb +240 -0
- data/lib/rouge/lexers/actionscript.rb +196 -0
- data/lib/rouge/lexers/ada.rb +162 -0
- data/lib/rouge/lexers/apache.rb +73 -0
- data/lib/rouge/lexers/apache/keywords.yml +764 -0
- data/lib/rouge/lexers/apex.rb +126 -0
- data/lib/rouge/lexers/apiblueprint.rb +49 -0
- data/lib/rouge/lexers/apple_script.rb +370 -0
- data/lib/rouge/lexers/armasm.rb +145 -0
- data/lib/rouge/lexers/awk.rb +162 -0
- data/lib/rouge/lexers/batchfile.rb +164 -0
- data/lib/rouge/lexers/bbcbasic.rb +112 -0
- data/lib/rouge/lexers/biml.rb +43 -0
- data/lib/rouge/lexers/bpf.rb +118 -0
- data/lib/rouge/lexers/brainfuck.rb +53 -0
- data/lib/rouge/lexers/bsl.rb +82 -0
- data/lib/rouge/lexers/c.rb +190 -0
- data/lib/rouge/lexers/ceylon.rb +96 -0
- data/lib/rouge/lexers/cfscript.rb +154 -0
- data/lib/rouge/lexers/clean.rb +156 -0
- data/lib/rouge/lexers/clojure.rb +113 -0
- data/lib/rouge/lexers/cmake.rb +207 -0
- data/lib/rouge/lexers/cmhg.rb +34 -0
- data/lib/rouge/lexers/coffeescript.rb +215 -0
- data/lib/rouge/lexers/common_lisp.rb +346 -0
- data/lib/rouge/lexers/conf.rb +25 -0
- data/lib/rouge/lexers/console.rb +174 -0
- data/lib/rouge/lexers/coq.rb +191 -0
- data/lib/rouge/lexers/cpp.rb +82 -0
- data/lib/rouge/lexers/crystal.rb +430 -0
- data/lib/rouge/lexers/csharp.rb +114 -0
- data/lib/rouge/lexers/css.rb +274 -0
- data/lib/rouge/lexers/csvs.rb +44 -0
- data/lib/rouge/lexers/cuda.rb +35 -0
- data/lib/rouge/lexers/cython.rb +151 -0
- data/lib/rouge/lexers/d.rb +177 -0
- data/lib/rouge/lexers/dart.rb +105 -0
- data/lib/rouge/lexers/diff.rb +37 -0
- data/lib/rouge/lexers/digdag.rb +70 -0
- data/lib/rouge/lexers/docker.rb +51 -0
- data/lib/rouge/lexers/dot.rb +69 -0
- data/lib/rouge/lexers/ecl.rb +175 -0
- data/lib/rouge/lexers/eex.rb +52 -0
- data/lib/rouge/lexers/eiffel.rb +66 -0
- data/lib/rouge/lexers/elixir.rb +149 -0
- data/lib/rouge/lexers/elm.rb +90 -0
- data/lib/rouge/lexers/epp.rb +51 -0
- data/lib/rouge/lexers/erb.rb +53 -0
- data/lib/rouge/lexers/erlang.rb +115 -0
- data/lib/rouge/lexers/escape.rb +58 -0
- data/lib/rouge/lexers/factor.rb +303 -0
- data/lib/rouge/lexers/fortran.rb +178 -0
- data/lib/rouge/lexers/freefem.rb +240 -0
- data/lib/rouge/lexers/fsharp.rb +119 -0
- data/lib/rouge/lexers/gdscript.rb +171 -0
- data/lib/rouge/lexers/ghc_core.rb +151 -0
- data/lib/rouge/lexers/gherkin.rb +140 -0
- data/lib/rouge/lexers/gherkin/keywords.rb +16 -0
- data/lib/rouge/lexers/glsl.rb +132 -0
- data/lib/rouge/lexers/go.rb +175 -0
- data/lib/rouge/lexers/gradle.rb +38 -0
- data/lib/rouge/lexers/graphql.rb +261 -0
- data/lib/rouge/lexers/groovy.rb +111 -0
- data/lib/rouge/lexers/hack.rb +49 -0
- data/lib/rouge/lexers/haml.rb +226 -0
- data/lib/rouge/lexers/handlebars.rb +91 -0
- data/lib/rouge/lexers/haskell.rb +199 -0
- data/lib/rouge/lexers/haxe.rb +246 -0
- data/lib/rouge/lexers/hcl.rb +163 -0
- data/lib/rouge/lexers/hocon.rb +86 -0
- data/lib/rouge/lexers/hql.rb +139 -0
- data/lib/rouge/lexers/html.rb +141 -0
- data/lib/rouge/lexers/http.rb +81 -0
- data/lib/rouge/lexers/hylang.rb +94 -0
- data/lib/rouge/lexers/idlang.rb +312 -0
- data/lib/rouge/lexers/igorpro.rb +664 -0
- data/lib/rouge/lexers/ini.rb +54 -0
- data/lib/rouge/lexers/io.rb +69 -0
- data/lib/rouge/lexers/irb.rb +67 -0
- data/lib/rouge/lexers/java.rb +91 -0
- data/lib/rouge/lexers/javascript.rb +279 -0
- data/lib/rouge/lexers/jinja.rb +154 -0
- data/lib/rouge/lexers/jsl.rb +55 -0
- data/lib/rouge/lexers/json.rb +69 -0
- data/lib/rouge/lexers/json_doc.rb +25 -0
- data/lib/rouge/lexers/jsonnet.rb +152 -0
- data/lib/rouge/lexers/jsp.rb +120 -0
- data/lib/rouge/lexers/jsx.rb +104 -0
- data/lib/rouge/lexers/julia.rb +290 -0
- data/lib/rouge/lexers/kotlin.rb +127 -0
- data/lib/rouge/lexers/lasso.rb +215 -0
- data/lib/rouge/lexers/lasso/keywords.yml +446 -0
- data/lib/rouge/lexers/liquid.rb +285 -0
- data/lib/rouge/lexers/literate_coffeescript.rb +34 -0
- data/lib/rouge/lexers/literate_haskell.rb +37 -0
- data/lib/rouge/lexers/llvm.rb +97 -0
- data/lib/rouge/lexers/lua.rb +164 -0
- data/lib/rouge/lexers/lua/builtins.rb +24 -0
- data/lib/rouge/lexers/lustre.rb +79 -0
- data/lib/rouge/lexers/lutin.rb +33 -0
- data/lib/rouge/lexers/m68k.rb +143 -0
- data/lib/rouge/lexers/magik.rb +127 -0
- data/lib/rouge/lexers/make.rb +135 -0
- data/lib/rouge/lexers/markdown.rb +182 -0
- data/lib/rouge/lexers/mason.rb +110 -0
- data/lib/rouge/lexers/mathematica.rb +96 -0
- data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
- data/lib/rouge/lexers/matlab.rb +81 -0
- data/lib/rouge/lexers/matlab/builtins.yml +3515 -0
- data/lib/rouge/lexers/minizinc.rb +87 -0
- data/lib/rouge/lexers/moonscript.rb +115 -0
- data/lib/rouge/lexers/mosel.rb +232 -0
- data/lib/rouge/lexers/msgtrans.rb +26 -0
- data/lib/rouge/lexers/mxml.rb +69 -0
- data/lib/rouge/lexers/nasm.rb +72 -0
- data/lib/rouge/lexers/nesasm.rb +78 -0
- data/lib/rouge/lexers/nginx.rb +72 -0
- data/lib/rouge/lexers/nim.rb +154 -0
- data/lib/rouge/lexers/nix.rb +211 -0
- data/lib/rouge/lexers/objective_c.rb +21 -0
- data/lib/rouge/lexers/objective_c/common.rb +184 -0
- data/lib/rouge/lexers/objective_cpp.rb +31 -0
- data/lib/rouge/lexers/ocaml.rb +65 -0
- data/lib/rouge/lexers/ocaml/common.rb +53 -0
- data/lib/rouge/lexers/openedge.rb +429 -0
- data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
- data/lib/rouge/lexers/pascal.rb +67 -0
- data/lib/rouge/lexers/perl.rb +231 -0
- data/lib/rouge/lexers/php.rb +216 -0
- data/lib/rouge/lexers/php/builtins.rb +203 -0
- data/lib/rouge/lexers/plain_text.rb +27 -0
- data/lib/rouge/lexers/plist.rb +47 -0
- data/lib/rouge/lexers/pony.rb +94 -0
- data/lib/rouge/lexers/powershell.rb +230 -0
- data/lib/rouge/lexers/praat.rb +351 -0
- data/lib/rouge/lexers/prolog.rb +67 -0
- data/lib/rouge/lexers/prometheus.rb +123 -0
- data/lib/rouge/lexers/properties.rb +52 -0
- data/lib/rouge/lexers/protobuf.rb +71 -0
- data/lib/rouge/lexers/puppet.rb +129 -0
- data/lib/rouge/lexers/python.rb +248 -0
- data/lib/rouge/lexers/q.rb +126 -0
- data/lib/rouge/lexers/qml.rb +74 -0
- data/lib/rouge/lexers/r.rb +89 -0
- data/lib/rouge/lexers/racket.rb +545 -0
- data/lib/rouge/lexers/reasonml.rb +65 -0
- data/lib/rouge/lexers/robot_framework.rb +249 -0
- data/lib/rouge/lexers/ruby.rb +444 -0
- data/lib/rouge/lexers/rust.rb +193 -0
- data/lib/rouge/lexers/sas.rb +563 -0
- data/lib/rouge/lexers/sass.rb +75 -0
- data/lib/rouge/lexers/sass/common.rb +181 -0
- data/lib/rouge/lexers/scala.rb +169 -0
- data/lib/rouge/lexers/scheme.rb +113 -0
- data/lib/rouge/lexers/scss.rb +35 -0
- data/lib/rouge/lexers/sed.rb +173 -0
- data/lib/rouge/lexers/shell.rb +201 -0
- data/lib/rouge/lexers/sieve.rb +97 -0
- data/lib/rouge/lexers/slice.rb +32 -0
- data/lib/rouge/lexers/slim.rb +229 -0
- data/lib/rouge/lexers/smalltalk.rb +117 -0
- data/lib/rouge/lexers/smarty.rb +81 -0
- data/lib/rouge/lexers/sml.rb +345 -0
- data/lib/rouge/lexers/sparql.rb +129 -0
- data/lib/rouge/lexers/sqf.rb +109 -0
- data/lib/rouge/lexers/sqf/commands.rb +15 -0
- data/lib/rouge/lexers/sql.rb +161 -0
- data/lib/rouge/lexers/supercollider.rb +116 -0
- data/lib/rouge/lexers/swift.rb +186 -0
- data/lib/rouge/lexers/tap.rb +89 -0
- data/lib/rouge/lexers/tcl.rb +193 -0
- data/lib/rouge/lexers/terraform.rb +113 -0
- data/lib/rouge/lexers/tex.rb +70 -0
- data/lib/rouge/lexers/toml.rb +106 -0
- data/lib/rouge/lexers/tsx.rb +20 -0
- data/lib/rouge/lexers/ttcn3.rb +119 -0
- data/lib/rouge/lexers/tulip.rb +108 -0
- data/lib/rouge/lexers/turtle.rb +61 -0
- data/lib/rouge/lexers/twig.rb +40 -0
- data/lib/rouge/lexers/typescript.rb +30 -0
- data/lib/rouge/lexers/typescript/common.rb +34 -0
- data/lib/rouge/lexers/vala.rb +78 -0
- data/lib/rouge/lexers/varnish.rb +168 -0
- data/lib/rouge/lexers/vb.rb +165 -0
- data/lib/rouge/lexers/verilog.rb +163 -0
- data/lib/rouge/lexers/vhdl.rb +98 -0
- data/lib/rouge/lexers/viml.rb +102 -0
- data/lib/rouge/lexers/viml/keywords.rb +14 -0
- data/lib/rouge/lexers/vue.rb +124 -0
- data/lib/rouge/lexers/wollok.rb +104 -0
- data/lib/rouge/lexers/xml.rb +54 -0
- data/lib/rouge/lexers/xojo.rb +61 -0
- data/lib/rouge/lexers/xpath.rb +332 -0
- data/lib/rouge/lexers/xquery.rb +145 -0
- data/lib/rouge/lexers/yaml.rb +376 -0
- data/lib/rouge/plugins/redcarpet.rb +37 -0
- data/lib/rouge/regex_lexer.rb +443 -0
- data/lib/rouge/template_lexer.rb +21 -0
- data/lib/rouge/tex_theme_renderer.rb +132 -0
- data/lib/rouge/text_analyzer.rb +50 -0
- data/lib/rouge/theme.rb +218 -0
- data/lib/rouge/themes/base16.rb +131 -0
- data/lib/rouge/themes/bw.rb +41 -0
- data/lib/rouge/themes/colorful.rb +68 -0
- data/lib/rouge/themes/github.rb +72 -0
- data/lib/rouge/themes/gruvbox.rb +168 -0
- data/lib/rouge/themes/igor_pro.rb +21 -0
- data/lib/rouge/themes/magritte.rb +78 -0
- data/lib/rouge/themes/molokai.rb +83 -0
- data/lib/rouge/themes/monokai.rb +93 -0
- data/lib/rouge/themes/monokai_sublime.rb +93 -0
- data/lib/rouge/themes/pastie.rb +70 -0
- data/lib/rouge/themes/thankful_eyes.rb +75 -0
- data/lib/rouge/themes/tulip.rb +70 -0
- data/lib/rouge/token.rb +191 -0
- data/lib/rouge/util.rb +102 -0
- data/lib/rouge/version.rb +8 -0
- data/rouge.gemspec +26 -0
- metadata +476 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
module Rouge
|
|
4
|
+
module Formatters
|
|
5
|
+
class TerminalTruecolor < Terminal256
|
|
6
|
+
tag 'terminal_truecolor'
|
|
7
|
+
|
|
8
|
+
class TruecolorEscapeSequence < Terminal256::EscapeSequence
|
|
9
|
+
def style_string
|
|
10
|
+
@style_string ||= begin
|
|
11
|
+
out = String.new('')
|
|
12
|
+
out << escape(['48', '2', *get_rgb(style.bg)]) if style.bg
|
|
13
|
+
out << escape(['38', '2', *get_rgb(style.fg)]) if style.fg
|
|
14
|
+
out << escape(['1']) if style[:bold] || style[:italic]
|
|
15
|
+
out
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def get_rgb(color)
|
|
20
|
+
color = $1 if color =~ /#(\h+)/
|
|
21
|
+
|
|
22
|
+
case color.size
|
|
23
|
+
when 3 then color.chars.map { |c| c.to_i(16) * 2 }
|
|
24
|
+
when 6 then color.scan(/../).map { |cc| cc.to_i(16) }
|
|
25
|
+
else
|
|
26
|
+
raise "invalid color: #{color.inspect}"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @override
|
|
32
|
+
def make_escape_sequence(style)
|
|
33
|
+
TruecolorEscapeSequence.new(style)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Rouge
|
|
5
|
+
module Formatters
|
|
6
|
+
class Tex < Formatter
|
|
7
|
+
tag 'tex'
|
|
8
|
+
|
|
9
|
+
# A map of TeX escape characters.
|
|
10
|
+
# Newlines are handled specially by using #token_lines
|
|
11
|
+
# spaces are preserved as long as they aren't at the beginning
|
|
12
|
+
# of a line. see #tag_first for our initial-space strategy
|
|
13
|
+
ESCAPE = {
|
|
14
|
+
'&' => '\&',
|
|
15
|
+
'%' => '\%',
|
|
16
|
+
'$' => '\$',
|
|
17
|
+
'#' => '\#',
|
|
18
|
+
'_' => '\_',
|
|
19
|
+
'{' => '\{',
|
|
20
|
+
'}' => '\}',
|
|
21
|
+
'~' => '{\textasciitilde}',
|
|
22
|
+
'^' => '{\textasciicircum}',
|
|
23
|
+
'|' => '{\textbar}',
|
|
24
|
+
'\\' => '{\textbackslash}',
|
|
25
|
+
'`' => '{\textasciigrave}',
|
|
26
|
+
"'" => "'{}",
|
|
27
|
+
'"' => '"{}',
|
|
28
|
+
"\t" => '{\tab}',
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
ESCAPE_REGEX = /[#{ESCAPE.keys.map(&Regexp.method(:escape)).join}]/om
|
|
32
|
+
|
|
33
|
+
def initialize(opts={})
|
|
34
|
+
@prefix = opts.fetch(:prefix) { 'RG' }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def escape_tex(str)
|
|
38
|
+
str.gsub(ESCAPE_REGEX, ESCAPE)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def stream(tokens, &b)
|
|
42
|
+
# surround the output with \begin{RG*}...\end{RG*}
|
|
43
|
+
yield "\\begin{#{@prefix}*}%\n"
|
|
44
|
+
|
|
45
|
+
# we strip the newline off the last line to avoid
|
|
46
|
+
# an extra line being rendered. we do this by yielding
|
|
47
|
+
# the \newline tag *before* every line group except
|
|
48
|
+
# the first.
|
|
49
|
+
first = true
|
|
50
|
+
|
|
51
|
+
token_lines tokens do |line|
|
|
52
|
+
if first
|
|
53
|
+
first = false
|
|
54
|
+
else
|
|
55
|
+
yield "\\newline%\n"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
render_line(line, &b)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
yield "%\n\\end{#{@prefix}*}%\n"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def render_line(line, &b)
|
|
65
|
+
line.each do |(tok, val)|
|
|
66
|
+
hphantom_tag(tok, val, &b)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Special handling for leading spaces, since they may be gobbled
|
|
71
|
+
# by a previous command. We replace all initial spaces with
|
|
72
|
+
# \hphantom{xxxx}, which renders an empty space equal to the size
|
|
73
|
+
# of the x's.
|
|
74
|
+
def hphantom_tag(tok, val)
|
|
75
|
+
leading = nil
|
|
76
|
+
val.sub!(/^[ ]+/) { leading = $&.size; '' }
|
|
77
|
+
yield "\\hphantom{#{'x' * leading}}" if leading
|
|
78
|
+
yield tag(tok, val) unless val.empty?
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def tag(tok, val)
|
|
82
|
+
if escape?(tok)
|
|
83
|
+
val
|
|
84
|
+
elsif tok == Token::Tokens::Text
|
|
85
|
+
escape_tex(val)
|
|
86
|
+
else
|
|
87
|
+
"\\#@prefix{#{tok.shortname}}{#{escape_tex(val)}}"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
class Guesser
|
|
5
|
+
class Ambiguous < StandardError
|
|
6
|
+
attr_reader :alternatives
|
|
7
|
+
def initialize(alternatives); @alternatives = alternatives; end
|
|
8
|
+
|
|
9
|
+
def message
|
|
10
|
+
"Ambiguous guess: can't decide between #{alternatives.map(&:tag).inspect}"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.guess(guessers, lexers)
|
|
15
|
+
original_size = lexers.size
|
|
16
|
+
|
|
17
|
+
guessers.each do |g|
|
|
18
|
+
new_lexers = case g
|
|
19
|
+
when Guesser then g.filter(lexers)
|
|
20
|
+
when proc { |x| x.respond_to? :call } then g.call(lexers)
|
|
21
|
+
else raise "bad guesser: #{g}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
lexers = new_lexers && new_lexers.any? ? new_lexers : lexers
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# if we haven't filtered the input at *all*,
|
|
28
|
+
# then we have no idea what language it is,
|
|
29
|
+
# so we bail and return [].
|
|
30
|
+
lexers.size < original_size ? lexers : []
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def collect_best(lexers, opts={}, &scorer)
|
|
34
|
+
best = []
|
|
35
|
+
best_score = opts[:threshold]
|
|
36
|
+
|
|
37
|
+
lexers.each do |lexer|
|
|
38
|
+
score = scorer.call(lexer)
|
|
39
|
+
|
|
40
|
+
next if score.nil?
|
|
41
|
+
|
|
42
|
+
if best_score.nil? || score > best_score
|
|
43
|
+
best_score = score
|
|
44
|
+
best = [lexer]
|
|
45
|
+
elsif score == best_score
|
|
46
|
+
best << lexer
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
best
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def filter(lexers)
|
|
54
|
+
raise 'abstract'
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Guessers
|
|
5
|
+
class Disambiguation < Guesser
|
|
6
|
+
include Util
|
|
7
|
+
include Lexers
|
|
8
|
+
|
|
9
|
+
def initialize(filename, source)
|
|
10
|
+
@filename = File.basename(filename)
|
|
11
|
+
@source = source
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def filter(lexers)
|
|
15
|
+
return lexers if lexers.size == 1
|
|
16
|
+
return lexers if lexers.size == Lexer.all.size
|
|
17
|
+
|
|
18
|
+
@analyzer = TextAnalyzer.new(get_source(@source))
|
|
19
|
+
|
|
20
|
+
self.class.disambiguators.each do |disambiguator|
|
|
21
|
+
next unless disambiguator.match?(@filename)
|
|
22
|
+
|
|
23
|
+
filtered = disambiguator.decide!(self)
|
|
24
|
+
return filtered if filtered
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
return lexers
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def contains?(text)
|
|
31
|
+
return @analyzer.include?(text)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def matches?(re)
|
|
35
|
+
return !!(@analyzer =~ re)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
@disambiguators = []
|
|
39
|
+
def self.disambiguate(*patterns, &decider)
|
|
40
|
+
@disambiguators << Disambiguator.new(patterns, &decider)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.disambiguators
|
|
44
|
+
@disambiguators
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Disambiguator
|
|
48
|
+
include Util
|
|
49
|
+
|
|
50
|
+
def initialize(patterns, &decider)
|
|
51
|
+
@patterns = patterns
|
|
52
|
+
@decider = decider
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def decide!(guesser)
|
|
56
|
+
out = guesser.instance_eval(&@decider)
|
|
57
|
+
case out
|
|
58
|
+
when Array then out
|
|
59
|
+
when nil then nil
|
|
60
|
+
else [out]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def match?(filename)
|
|
65
|
+
@patterns.any? { |p| test_glob(p, filename) }
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
disambiguate '*.pl' do
|
|
70
|
+
next Perl if contains?('my $')
|
|
71
|
+
next Prolog if contains?(':-')
|
|
72
|
+
next Prolog if matches?(/\A\w+(\(\w+\,\s*\w+\))*\./)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
disambiguate '*.h' do
|
|
76
|
+
next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
|
|
77
|
+
next ObjectiveC if contains?('@"')
|
|
78
|
+
next Cpp if matches?(/^\s*(?:catch|class|constexpr|namespace|private|
|
|
79
|
+
protected|public|template|throw|try|using)\b/x)
|
|
80
|
+
|
|
81
|
+
C
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
disambiguate '*.m' do
|
|
85
|
+
next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
|
|
86
|
+
next ObjectiveC if contains?('@"')
|
|
87
|
+
|
|
88
|
+
next Mathematica if contains?('(*')
|
|
89
|
+
next Mathematica if contains?(':=')
|
|
90
|
+
|
|
91
|
+
next Mason if matches?(/<%(def|method|text|doc|args|flags|attr|init|once|shared|perl|cleanup|filter)([^>]*)(>)/)
|
|
92
|
+
|
|
93
|
+
next Matlab if matches?(/^\s*?%/)
|
|
94
|
+
|
|
95
|
+
next Mason if matches? %r!(</?%|<&)!
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
disambiguate '*.php' do
|
|
99
|
+
# PHP always takes precedence over Hack
|
|
100
|
+
PHP
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
disambiguate '*.hh' do
|
|
104
|
+
next Cpp if matches?(/^\s*#include/)
|
|
105
|
+
next Hack if matches?(/^<\?hh/)
|
|
106
|
+
next Hack if matches?(/(\(|, ?)\$\$/)
|
|
107
|
+
|
|
108
|
+
Cpp
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
disambiguate '*.plist' do
|
|
112
|
+
next XML if matches?(/\A<\?xml\b/)
|
|
113
|
+
|
|
114
|
+
Plist
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
disambiguate '*.sc' do
|
|
118
|
+
next Python if matches?(/^#/)
|
|
119
|
+
next SuperCollider if matches?(/(?:^~|;$)/)
|
|
120
|
+
|
|
121
|
+
next Python
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
disambiguate 'Messages' do
|
|
125
|
+
next MsgTrans if matches?(/^[^\s:]+:[^\s:]+/)
|
|
126
|
+
|
|
127
|
+
next PlainText
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
disambiguate '*.cls' do
|
|
131
|
+
next TeX if matches?(/\A\s*(?:\\|%)/)
|
|
132
|
+
next Apex
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Guessers
|
|
5
|
+
class Filename < Guesser
|
|
6
|
+
attr_reader :fname
|
|
7
|
+
def initialize(filename)
|
|
8
|
+
@filename = filename
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# returns a list of lexers that match the given filename with
|
|
12
|
+
# equal specificity (i.e. number of wildcards in the pattern).
|
|
13
|
+
# This helps disambiguate between, e.g. the Nginx lexer, which
|
|
14
|
+
# matches `nginx.conf`, and the Conf lexer, which matches `*.conf`.
|
|
15
|
+
# In this case, nginx will win because the pattern has no wildcards,
|
|
16
|
+
# while `*.conf` has one.
|
|
17
|
+
def filter(lexers)
|
|
18
|
+
mapping = {}
|
|
19
|
+
lexers.each do |lexer|
|
|
20
|
+
mapping[lexer.name] = lexer.filenames || []
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
GlobMapping.new(mapping, @filename).filter(lexers)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Guessers
|
|
5
|
+
# This class allows for custom behavior
|
|
6
|
+
# with glob -> lexer name mappings
|
|
7
|
+
class GlobMapping < Guesser
|
|
8
|
+
include Util
|
|
9
|
+
|
|
10
|
+
def self.by_pairs(mapping, filename)
|
|
11
|
+
glob_map = {}
|
|
12
|
+
mapping.each do |(glob, lexer_name)|
|
|
13
|
+
lexer = Lexer.find(lexer_name)
|
|
14
|
+
|
|
15
|
+
# ignore unknown lexers
|
|
16
|
+
next unless lexer
|
|
17
|
+
|
|
18
|
+
glob_map[lexer.name] ||= []
|
|
19
|
+
glob_map[lexer.name] << glob
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
new(glob_map, filename)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
attr_reader :glob_map, :filename
|
|
26
|
+
def initialize(glob_map, filename)
|
|
27
|
+
@glob_map = glob_map
|
|
28
|
+
@filename = filename
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def filter(lexers)
|
|
32
|
+
basename = File.basename(filename)
|
|
33
|
+
|
|
34
|
+
collect_best(lexers) do |lexer|
|
|
35
|
+
(@glob_map[lexer.name] || []).map do |pattern|
|
|
36
|
+
if test_glob(pattern, basename)
|
|
37
|
+
# specificity is better the fewer wildcards there are
|
|
38
|
+
-pattern.scan(/[*?\[]/).size
|
|
39
|
+
end
|
|
40
|
+
end.compact.min
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Guessers
|
|
5
|
+
class Mimetype < Guesser
|
|
6
|
+
attr_reader :mimetype
|
|
7
|
+
def initialize(mimetype)
|
|
8
|
+
@mimetype = mimetype
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def filter(lexers)
|
|
12
|
+
lexers.select { |lexer| lexer.mimetypes.include? @mimetype }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rouge
|
|
4
|
+
module Guessers
|
|
5
|
+
class Modeline < Guesser
|
|
6
|
+
include Util
|
|
7
|
+
|
|
8
|
+
# [jneen] regexen stolen from linguist
|
|
9
|
+
EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
|
|
10
|
+
|
|
11
|
+
# First form vim modeline
|
|
12
|
+
# [text]{white}{vi:|vim:|ex:}[white]{options}
|
|
13
|
+
# ex: 'vim: syntax=ruby'
|
|
14
|
+
VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i
|
|
15
|
+
|
|
16
|
+
# Second form vim modeline (compatible with some versions of Vi)
|
|
17
|
+
# [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
|
|
18
|
+
# ex: 'vim set syntax=ruby:'
|
|
19
|
+
VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i
|
|
20
|
+
|
|
21
|
+
MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]
|
|
22
|
+
|
|
23
|
+
def initialize(source, opts={})
|
|
24
|
+
@source = source
|
|
25
|
+
@lines = opts[:lines] || 5
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def filter(lexers)
|
|
29
|
+
# don't bother reading the stream if we've already decided
|
|
30
|
+
return lexers if lexers.size == 1
|
|
31
|
+
|
|
32
|
+
source_text = get_source(@source)
|
|
33
|
+
|
|
34
|
+
lines = source_text.split(/\n/)
|
|
35
|
+
|
|
36
|
+
search_space = (lines.first(@lines) + lines.last(@lines)).join("\n")
|
|
37
|
+
|
|
38
|
+
matches = MODELINES.map { |re| re.match(search_space) }.compact
|
|
39
|
+
return lexers unless matches.any?
|
|
40
|
+
|
|
41
|
+
match_set = Set.new(matches.map { |m| m[1] })
|
|
42
|
+
lexers.select { |l| match_set.include?(l.tag) || l.aliases.any? { |a| match_set.include?(a) } }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|