Path: blob/master/src/infrastructure/markup/syntax/highlighter/PhutilPygmentsSyntaxHighlighter.php
12242 views
<?php12final class PhutilPygmentsSyntaxHighlighter extends Phobject {34private $config = array();56public function setConfig($key, $value) {7$this->config[$key] = $value;8return $this;9}1011public function getHighlightFuture($source) {12$language = idx($this->config, 'language');1314if (preg_match('/\r(?!\n)/', $source)) {15// TODO: Pygments converts "\r" newlines into "\n" newlines, so we can't16// use it on files with "\r" newlines. If we have "\r" not followed by17// "\n" in the file, skip highlighting.18$language = null;19}2021if ($language) {22$language = $this->getPygmentsLexerNameFromLanguageName($language);2324// See T13224. Under Ubuntu, avoid leaving an intermedite "dash" shell25// process so we hit "pygmentize" directly if we have to SIGKILL this26// because it explodes.2728$future = new ExecFuture(29'exec pygmentize -O encoding=utf-8 -O stripnl=False -f html -l %s',30$language);3132$scrub = false;33if ($language == 'php' && strpos($source, '<?') === false) {34$source = "<?php\n".$source;35$scrub = true;36}3738// See T13224. In some cases, "pygmentize" has explosive runtime on small39// inputs. Put a hard cap on how long it is allowed to run for to limit40// the amount of damage it can do.41$future->setTimeout(15);4243$future->write($source);4445return new PhutilDefaultSyntaxHighlighterEnginePygmentsFuture(46$future,47$source,48$scrub);49}5051return id(new PhutilDefaultSyntaxHighlighter())52->getHighlightFuture($source);53}5455private function getPygmentsLexerNameFromLanguageName($language) {56static $map = array(57'adb' => 'ada',58'ads' => 'ada',59'ahkl' => 'ahk',60'as' => 'as3',61'asax' => 'aspx-vb',62'ascx' => 'aspx-vb',63'ashx' => 'aspx-vb',64'ASM' => 'nasm',65'asm' => 'nasm',66'asmx' => 'aspx-vb',67'aspx' => 'aspx-vb',68'autodelegate' => 'myghty',69'autohandler' => 'mason',70'aux' => 'tex',71'axd' => 'aspx-vb',72'b' => 'brainfuck',73'bas' => 'vb.net',74'bf' => 'brainfuck',75'bmx' => 'blitzmax',76'c++' => 'cpp',77'c++-objdump' => 'cpp-objdump',78'cc' => 'cpp',79'cfc' => 'cfm',80'cfg' => 'ini',81'cfml' => 'cfm',82'cl' => 'common-lisp',83'clj' => 'clojure',84'cmd' => 'bat',85'coffee' => 'coffee-script',86'cs' => 'csharp',87'csh' => 'tcsh',88'cw' => 'redcode',89'cxx' => 'cpp',90'cxx-objdump' => 'cpp-objdump',91'darcspatch' => 'dpatch',92'def' => 'modula2',93'dhandler' => 'mason',94'di' => 'd',95'duby' => 'rb',96'dyl' => 'dylan',97'ebuild' => 'bash',98'eclass' => 'bash',99'el' => 'common-lisp',100'eps' => 'postscript',101'erl' => 'erlang',102'erl-sh' => 'erl',103'f' => 'fortran',104'f90' => 'fortran',105'feature' => 'Cucumber',106'fhtml' => 'velocity',107'flx' => 'felix',108'flxh' => 'felix',109'frag' => 'glsl',110'g' => 'antlr-ruby',111'G' => 'antlr-ruby',112'gdc' => 'gooddata-cl',113'gemspec' => 'rb',114'geo' => 'glsl',115'GNUmakefile' => 'make',116'h' => 'c',117'h++' => 'cpp',118'hh' => 'cpp',119'hpp' => 'cpp',120'hql' => 'sql',121'hrl' => 'erlang',122'hs' => 'haskell',123'htaccess' => 'apacheconf',124'htm' => 'html',125'html' => 'html+evoque',126'hxx' => 'cpp',127'hy' => 'hybris',128'hyb' => 'hybris',129'ik' => 'ioke',130'inc' => 'pov',131'j' => 'objective-j',132'jbst' => 'duel',133'kid' => 'genshi',134'ksh' => 'bash',135'less' => 'css',136'lgt' => 'logtalk',137'lisp' => 'common-lisp',138'll' => 'llvm',139'm' => 'objective-c',140'mak' => 'make',141'Makefile' => 'make',142'makefile' => 'make',143'man' => 'groff',144'mao' => 'mako',145'mc' => 'mason',146'md' => 'minid',147'mhtml' => 'mason',148'mi' => 'mason',149'ml' => 'ocaml',150'mli' => 'ocaml',151'mll' => 'ocaml',152'mly' => 'ocaml',153'mm' => 'objective-c',154'mo' => 'modelica',155'mod' => 'modula2',156'moo' => 'moocode',157'mu' => 'mupad',158'myt' => 'myghty',159'ns2' => 'newspeak',160'pas' => 'delphi',161'patch' => 'diff',162'phtml' => 'html+php',163'pl' => 'prolog',164'plot' => 'gnuplot',165'plt' => 'gnuplot',166'pm' => 'perl',167'po' => 'pot',168'pp' => 'puppet',169'pro' => 'prolog',170'proto' => 'protobuf',171'ps' => 'postscript',172'pxd' => 'cython',173'pxi' => 'cython',174'py' => 'python',175'pyw' => 'python',176'pyx' => 'cython',177'R' => 'splus',178'r' => 'rebol',179'r3' => 'rebol',180'rake' => 'rb',181'Rakefile' => 'rb',182'rbw' => 'rb',183'rbx' => 'rb',184'rest' => 'rst',185'rl' => 'ragel-em',186'robot' => 'robotframework',187'Rout' => 'rconsole',188'rss' => 'xml',189's' => 'gas',190'S' => 'splus',191'sc' => 'python',192'scm' => 'scheme',193'SConscript' => 'python',194'SConstruct' => 'python',195'scss' => 'css',196'sh' => 'bash',197'sh-session' => 'console',198'spt' => 'cheetah',199'sqlite3-console' => 'sqlite3',200'st' => 'smalltalk',201'sv' => 'v',202'tac' => 'python',203'tmpl' => 'cheetah',204'toc' => 'tex',205'tpl' => 'smarty',206'txt' => 'text',207'vapi' => 'vala',208'vb' => 'vb.net',209'vert' => 'glsl',210'vhd' => 'vhdl',211'vimrc' => 'vim',212'vm' => 'velocity',213'weechatlog' => 'irc',214'wlua' => 'lua',215'wsdl' => 'xml',216'xhtml' => 'html',217'xml' => 'xml+evoque',218'xqy' => 'xquery',219'xsd' => 'xml',220'xsl' => 'xslt',221'xslt' => 'xml',222'yml' => 'yaml',223);224225return idx($map, $language, $language);226}227228}229230231