diff options
author | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
---|---|---|
committer | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
commit | fc7369835258467bf97eb64f184b93691f9a9fd5 (patch) | |
tree | daabd60089d2dd76d9f5fb416b005fbe159c799d /www/wiki/extensions/SyntaxHighlight_GeSHi |
first commit
Diffstat (limited to 'www/wiki/extensions/SyntaxHighlight_GeSHi')
160 files changed, 7801 insertions, 0 deletions
diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/CODE_OF_CONDUCT.md b/www/wiki/extensions/SyntaxHighlight_GeSHi/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..d8e5d087 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct). diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/COPYING b/www/wiki/extensions/SyntaxHighlight_GeSHi/COPYING new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/Gruntfile.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/Gruntfile.js new file mode 100644 index 00000000..e176bc95 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/Gruntfile.js @@ -0,0 +1,52 @@ +/*! + * Grunt file + * + * @package SyntaxHighlight_GeSHi + */ + +/* eslint-env node, es6 */ +module.exports = function ( grunt ) { + var conf = grunt.file.readJSON( 'extension.json' ); + + grunt.loadNpmTasks( 'grunt-banana-checker' ); + grunt.loadNpmTasks( 'grunt-contrib-watch' ); + grunt.loadNpmTasks( 'grunt-eslint' ); + grunt.loadNpmTasks( 'grunt-jsonlint' ); + grunt.loadNpmTasks( 'grunt-stylelint' ); + + grunt.initConfig( { + eslint: { + all: [ + '*.js', + 'modules/**/*.js' + ] + }, + jsonlint: { + all: [ + '*.json', + 'i18n/*.json', + 'modules/**/*.json' + ] + }, + stylelint: { + all: [ + '**/*.css', + '!**/*.generated.css', + '!vendor/**', + '!node_modules/**' + ] + }, + banana: conf.MessagesDirs, + watch: { + files: [ + '<%= eslint.all %>', + '<%= jsonlint.all %>', + '<%= stylelint.all %>' + ], + tasks: 'test' + } + } ); + + grunt.registerTask( 'test', [ 'eslint', 'jsonlint', 'stylelint', 'banana' ] ); + grunt.registerTask( 'default', 'test' ); +}; diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/README b/www/wiki/extensions/SyntaxHighlight_GeSHi/README new file mode 100644 index 00000000..1384e9f4 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/README @@ -0,0 +1,55 @@ +This extension allows source code to be syntax highlighted on the wiki pages. +This README file might be out of date, have a look at the extension page +for updated informations: + + https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi + +== Requirements == + +This version of the extension has been tested with Pygments 1.6, 2.0.2 and +MediaWiki 1.25 as of 2015-06-19. To get releases of this extension compatible +with earlier versions of MediaWiki, visit: + + https://www.mediawiki.org/wiki/Special:ExtensionDistributor/SyntaxHighlight_GeSHi + +== Installation == + +Add this line to your LocalSettings.php: + + wfLoadExtension( 'SyntaxHighlight_GeSHi' ); + +By default, this extension will use a bundled copy of Pygments 2.0.2. If you +would like to use a different copy of the library, you can set +$wgPygmentizePath to point to the path to the 'pygmentize' binary. + +== Usage == + +On the wiki page, you can now use "source" elements: + +<source lang="php"> +<?php + v = "string"; // sample initialization +?> +html text +<?php + echo v; // end of php code +?> +</source> + +== Parameters == + +For details information of these parameters, see the documentation of Pygments' +HtmlFormatter at <http://pygments.org/docs/formatters/#HtmlFormatter>. + +* lang; Defines the language. +* line; Corresponds to linenos="inline" option. +* start; Corresponds to linenostart opion. +* enclose; If set to "none", corresponds to the nowrap=1 option. +* inline; Corresponds to the nowrap=1 option. +* highlight; Corresponds to hl_lines option (comma separated). + +== Note == + +Pygments is generous about creating HTML elements: highlighting large blocks of +code can easily generate enough of them to crash a browser. As a guard, syntax +highlighting is turned off for code fragments larger than 100 kB. diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderGeSHiVisualEditorModule.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderGeSHiVisualEditorModule.php new file mode 100644 index 00000000..5cf2f963 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderGeSHiVisualEditorModule.php @@ -0,0 +1,58 @@ +<?php + +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +class ResourceLoaderGeSHiVisualEditorModule extends ResourceLoaderFileModule { + + protected $targets = array( 'desktop', 'mobile' ); + + /** + * @param ResourceLoaderContext $context + * @return string JavaScript code + */ + public function getScript( ResourceLoaderContext $context ) { + $scripts = parent::getScript( $context ); + + return $scripts . Xml::encodeJsCall( + 've.dm.MWSyntaxHighlightNode.static.addLanguages', array( + $this->getLanguages() + ), + ResourceLoader::inDebugMode() + ); + } + + /** + * Don't break debug mode by only showing file URLs + */ + public function getScriptURLsForDebug( ResourceLoaderContext $context ) { + return ResourceLoaderModule::getScriptURLsForDebug( $context ); + } + + /** + * Get a full list of available langauges + * @return array + */ + private function getLanguages() { + $lexers = require __DIR__ . '/SyntaxHighlight_GeSHi.lexers.php'; + return array_merge( $lexers, array_keys( SyntaxHighlightGeSHiCompat::getGeSHiToPygmentsMap() ) ); + } + + public function enableModuleContentVersion() { + return true; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderSyntaxHighlightVisualEditorModule.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderSyntaxHighlightVisualEditorModule.php new file mode 100644 index 00000000..8fd24ca3 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderSyntaxHighlightVisualEditorModule.php @@ -0,0 +1,70 @@ +<?php + +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +class ResourceLoaderSyntaxHighlightVisualEditorModule extends ResourceLoaderFileModule { + + protected $targets = [ 'desktop', 'mobile' ]; + + /** + * @param ResourceLoaderContext $context + * @return string JavaScript code + */ + public function getScript( ResourceLoaderContext $context ) { + $scripts = parent::getScript( $context ); + + return $scripts . Xml::encodeJsCall( + 've.dm.MWSyntaxHighlightNode.static.addPygmentsLanguages', [ + $this->getPygmentsLanguages() + ], + ResourceLoader::inDebugMode() + ) . Xml::encodeJsCall( + 've.dm.MWSyntaxHighlightNode.static.addGeshiToPygmentsMap', [ + SyntaxHighlightGeSHiCompat::getGeSHiToPygmentsMap() + ], + ResourceLoader::inDebugMode() + ) . Xml::encodeJsCall( + 've.dm.MWSyntaxHighlightNode.static.addPygmentsToAceMap', [ + SyntaxHighlightAce::getPygmentsToAceMap() + ], + ResourceLoader::inDebugMode() + ); + } + + /** + * Don't break debug mode by only showing file URLs + */ + public function getScriptURLsForDebug( ResourceLoaderContext $context ) { + return ResourceLoaderModule::getScriptURLsForDebug( $context ); + } + + /** + * Get a full list of available langauges + * @return array + */ + private function getPygmentsLanguages() { + $lexers = require __DIR__ . '/SyntaxHighlight.lexers.php'; + return $lexers; + } + + public function enableModuleContentVersion() { + return true; + } +} +class_alias( ResourceLoaderSyntaxHighlightVisualEditorModule::class, + 'ResourceLoaderGeSHiVisualEditorModule' ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.compat.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.compat.php new file mode 100644 index 00000000..a6f38323 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.compat.php @@ -0,0 +1,113 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ +class SyntaxHighlightGeSHiCompat { + /** @var array A mapping of GeSHi lexer names to compatible Pygments lexers. */ + private static $compatibleLexers = [ + // Assembler + 'arm' => 'asm', + '6502acme' => 'asm', + '6502tasm' => 'asm', + '6502kickass' => 'asm', + '68000devpac' => 'asm', + 'dcpu16' => 'asm', + 'm68k' => 'asm', + 'mmix' => 'nasm', + 'mpasm' => 'asm', + 'pic16' => 'asm', + 'z80' => 'asm', + + // BASIC + 'xbasic' => 'basic', + 'thinbasic' => 'basic', + 'sdlbasic' => 'basic', + 'purebasic' => 'basic', + 'mapbasic' => 'basic', + 'locobasic' => 'basic', + 'gwbasic' => 'basic', + 'freebasic' => 'basic', + 'basic4gl' => 'basic', + 'zxbasic' => 'basic', + 'gambas' => 'basic', + 'oobas' => 'basic', + 'bascomavr' => 'basic', + + // C / C++ + 'c_loadrunner' => 'c', + 'c_mac' => 'c', + 'c_winapi' => 'c', + 'upc' => 'c', + 'cpp-qt' => 'cpp', + 'cpp-winapi' => 'cpp', + 'urbi' => 'cpp', + + // HTML + 'html4strict' => 'html', + 'html5' => 'html', + + // JavaScript + 'jquery' => 'javascript', + 'ecmascript' => 'javascript', + + // Microsoft + 'vb' => 'vbnet', + 'asp' => 'aspx-vb', + 'visualfoxpro' => 'foxpro', + 'dos' => 'bat', + 'visualprolog' => 'prolog', + 'reg' => 'registry', + + // Miscellaneous + 'cadlisp' => 'lisp', + 'java5' => 'java', + 'php-brief' => 'php', + 'povray' => 'pov', + 'pys60' => 'python', + 'rails' => 'ruby', + 'rpmspec' => 'spec', + 'rsplus' => 'splus', + 'gettext' => 'pot', + + // ML + 'ocaml-brief' => 'ocaml', + 'standardml' => 'sml', + + // Modula 2 + 'modula3' => 'modula2', + 'oberon2' => 'modula2', + + // SQL + 'dcl' => 'sql', + 'plsql' => 'sql', + 'oracle11' => 'sql', + 'oracle8' => 'sql', + + // REXX + 'oorexx' => 'rexx', + 'netrexx' => 'rexx', + + // xpp is basically Java + 'xpp' => 'java', + + // apt + 'apt_sources' => 'debsources', + ]; + + public static function getGeSHiToPygmentsMap() { + return self::$compatibleLexers; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.php new file mode 100644 index 00000000..b66ecad3 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.php @@ -0,0 +1,39 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +/** + * Stub class for maintaining backward-compatibility with extensions + * that have not been updated for version 2.0 of SyntaxHighlight_GeSHi. + */ +class GeSHi { + public function __construct( $html ) { + $this->html = $html; + } + + public function error() { + } + + public function set_language( $language ) { + } + + public function parse_code() { + global $wgOut; + $wgOut->addModuleStyles( 'ext.pygments' ); + return $this->html; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.ace.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.ace.php new file mode 100644 index 00000000..54991f32 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.ace.php @@ -0,0 +1,174 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +/** + * Class provides functionality to map Ace lexer definitions + */ +class SyntaxHighlightAce { + /** @var array This map is inverted, because it is easier to maintain this way */ + private static $aceLexers = [ + 'ABAP' => [ 'abap' ], + 'ABC' => [], + 'ActionScript' => [ 'actionscript', 'actionscript3' ], + 'ADA' => [ 'ada', 'ada2005', 'ada95' ], + 'Apache_Conf' => [ 'apache', 'apacheconf', 'aconf' ], + 'AsciiDoc' => [], + 'Assembly_x86' => [ 'nasm' ], + 'AutoHotKey' => [ 'autohotkey', 'ah' ], + 'BatchFile' => [ 'bat', 'batch', 'dosbatch', 'winbatch' ], + 'C_Cpp' => [ 'cpp', 'c++' ], + 'C9Search' => [], + 'Cirru' => [ 'cirru' ], + 'Clojure' => [ 'clojure', 'clj' ], + 'Cobol' => [ 'cobol' ], + 'coffee' => [ 'coffee', 'coffeescript', 'coffee-script' ], + 'ColdFusion' => [ 'cfm' ], + 'CSharp' => [ 'csharp', '#' ], + 'CSS' => [ 'css' ], + 'Curly' => [], + 'D' => [ 'd' ], + 'Dart' => [ 'dart' ], + 'Diff' => [ 'diff', 'udiff' ], + 'Django' => [ 'django', 'html+django', 'html+jinja', 'htmldjango' ], + 'Dockerfile' => [ 'Dockerfile', 'docker' ], + 'Dot' => [], + 'Dummy' => [], + 'DummySyntax' => [], + 'Eiffel' => [ 'eiffel' ], + 'EJS' => [], + 'Elixir' => [ 'elixer', 'ex', 'exs' ], + 'Elm' => [ 'elm' ], + 'Erlang' => [ 'erlang' ], + 'Forth' => [], + 'Fortran' => [ 'fortran' ], + 'FTL' => [], + 'Gcode' => [], + 'Gherkin' => [ 'cucumber', 'gherkin' ], + 'Gitignore' => [], + 'Glsl' => [ 'glsl' ], + 'Gobstones' => [], + 'golang' => [ 'go' ], + 'Groovy' => [ 'groovy' ], + 'HAML' => [ 'haml' ], + 'Handlebars' => [ 'html+handlebars' ], + 'Haskell' => [ 'haskell', 'hs' ], + 'haXe' => [ 'hx', 'haxe', 'hxsl' ], + 'HTML' => [ 'html' ], + 'HTML_Elixir' => [], + 'HTML_Ruby' => [ 'rhtml', 'html+erb', 'html+ruby' ], + 'INI' => [ 'ini', 'cfg', 'dosini' ], + 'Io' => [ 'io' ], + 'Jack' => [ '' ], + 'Jade' => [ 'jade' ], + 'Java' => [ 'java' ], + 'JavaScript' => [ 'Javascript', 'js' ], + 'JSON' => [ 'json' ], + 'JSONiq' => [], + 'JSP' => [ 'jsp' ], + 'JSX' => [], + 'Julia' => [ 'julia', 'jl' ], + 'LaTeX' => [ 'latex' ], + 'Lean' => [ 'lean' ], + 'LESS' => [ 'less' ], + 'Liquid' => [ 'liquid' ], + 'Lisp' => [ 'lisp', 'common-lisp', 'cl' ], + 'LiveScript' => [ 'Livescript', 'live-script' ], + 'LogiQL' => [], + 'LSL' => [ 'lsl' ], + 'Lua' => [ 'lua' ], + 'LuaPage' => [], + 'Lucene' => [], + 'Makefile' => [ 'make', 'makefile', 'mf', 'bsdmake' ], + 'Markdown' => [], + 'Mask' => [ 'mask' ], + 'MATLAB' => [ 'matlab' ], + 'Maze' => [], + 'MEL' => [], + 'MUSHCode' => [], + 'MySQL' => [ 'mysql' ], + 'Nix' => [ 'nix', 'nixos' ], + 'NSIS' => [ 'nsis', 'nsi', 'nsh' ], + 'ObjectiveC' => [ 'objectivec', 'objective-c', 'obj-c', 'objc', + 'objective-c++', 'objectivec++', 'obj-c++', 'objc++' ], + 'OCaml' => [ 'ocaml' ], + 'Pascal' => [ 'pascal', 'delphi', 'pas', 'objectpascal' ], + 'Perl' => [ 'perl', 'pl', 'perl6', 'pl6' ], + 'pgSQL' => [ 'postgresql', 'postgres' ], + 'PHP' => [ 'php', 'php3', 'php4', 'php5', 'html+php' ], + 'Powershell' => [ 'powershell', 'posh', 'ps1', 'psm1' ], + 'Praat' => [ 'praat' ], + 'Prolog' => [ 'prolog' ], + 'Properties' => [ 'properties', 'jproperties' ], + 'Protobuf' => [ 'protobuf', 'proto' ], + 'Python' => [ 'python', 'py', 'sage', 'pyton3', 'py3' ], + 'R' => [], + 'Razor' => [], + 'RDoc' => [], + 'RHTML' => [], // HTML with Rcode, not ruby + 'RST' => [ 'rst', 'rest', 'restructuredtext' ], + 'Ruby' => [ 'ruby', 'rb', 'duby' ], + 'Rust' => [ 'rust' ], + 'SASS' => [ 'sass' ], + 'SCAD' => [], + 'Scala' => [ 'scala' ], + 'Scheme' => [ 'scheme', 'scm' ], + 'SCSS' => [ 'scss' ], + 'SH' => [ 'sh', 'bash', 'ksh', 'shell' ], + 'SJS' => [], + 'Smarty' => [ 'smarty', 'html+smarty' ], + 'snippets' => [], + 'Soy_Template' => [], + 'Space' => [], + 'SQL' => [ 'sql' ], + 'SQLServer' => [], + 'Stylus' => [], + 'SVG' => [], + 'Swift' => [ 'swift' ], + 'Tcl' => [ 'tcl' ], + 'Tex' => [ 'tex' ], + 'Text' => [ 'text' ], + 'Textile' => [], + 'Toml' => [], + 'Twig' => [ 'html+twig', 'twig' ], + 'Typescript' => [ 'typescript', 'ts' ], + 'Vala' => [ 'vala', 'vapi' ], + 'VBScript' => [], + 'Velocity' => [ 'velocity', 'html+velocity' ], + 'Verilog' => [ 'verilog', 'v', 'systemverilog', 'sv' ], + 'VHDL' => [ 'vhdl' ], + 'Wollok' => [], + 'XML' => [ 'xml' ], + 'XQuery' => [ 'xquery', 'xqy', 'xq', 'xql', 'xqm' ], + 'YAML' => [ 'yaml' ], + ]; + + public static function getPygmentsToAceMap() { + $result = []; + foreach ( self::$aceLexers as $aceName => $pygmentsLexers ) { + foreach ( $pygmentsLexers as $lexer ) { + if ( strcasecmp( $lexer, $aceName ) === 0 ) { + continue; + } + if ( !array_key_exists( $lexer, $result ) ) { + $result[ $lexer ] = $aceName; + } + } + } + return $result; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.class.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.class.php new file mode 100644 index 00000000..46748213 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.class.php @@ -0,0 +1,553 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +use MediaWiki\Shell\Shell; +use Symfony\Component\Process\ProcessBuilder; + +// @codingStandardsIgnoreStart +class SyntaxHighlight { +// @codingStandardsIgnoreEnd + + /** @var int The maximum number of lines that may be selected for highlighting. **/ + const HIGHLIGHT_MAX_LINES = 1000; + + /** @var int Maximum input size for the highlighter (100 kB). **/ + const HIGHLIGHT_MAX_BYTES = 102400; + + /** @var string CSS class for syntax-highlighted code. **/ + const HIGHLIGHT_CSS_CLASS = 'mw-highlight'; + + /** @var int Cache version. Increment whenever the HTML changes. */ + const CACHE_VERSION = 2; + + /** @var array Mapping of MIME-types to lexer names. **/ + private static $mimeLexers = [ + 'text/javascript' => 'javascript', + 'application/json' => 'javascript', + 'text/xml' => 'xml', + ]; + + /** + * Get the Pygments lexer name for a particular language. + * + * @param string $lang Language name. + * @return string|null Lexer name, or null if no matching lexer. + */ + private static function getLexer( $lang ) { + static $lexers = null; + + if ( $lang === null ) { + return null; + } + + if ( !$lexers ) { + $lexers = require __DIR__ . '/SyntaxHighlight.lexers.php'; + } + + $lexer = strtolower( $lang ); + + if ( in_array( $lexer, $lexers ) ) { + return $lexer; + } + + $geshi2pygments = SyntaxHighlightGeSHiCompat::getGeSHiToPygmentsMap(); + + // Check if this is a GeSHi lexer name for which there exists + // a compatible Pygments lexer with a different name. + if ( isset( $geshi2pygments[$lexer] ) ) { + $lexer = $geshi2pygments[$lexer]; + if ( in_array( $lexer, $lexers ) ) { + return $lexer; + } + } + + return null; + } + + /** + * Register parser hook + * + * @param $parser Parser + */ + public static function onParserFirstCallInit( Parser &$parser ) { + foreach ( [ 'source', 'syntaxhighlight' ] as $tag ) { + $parser->setHook( $tag, [ 'SyntaxHighlight_GeSHi', 'parserHook' ] ); + } + } + + /** + * Parser hook + * + * @param string $text + * @param array $args + * @param Parser $parser + * @return string + * @throws MWException + */ + public static function parserHook( $text, $args = [], $parser ) { + global $wgUseTidy; + + // Replace strip markers (For e.g. {{#tag:syntaxhighlight|<nowiki>...}}) + $out = $parser->mStripState->unstripNoWiki( $text ); + + // Don't trim leading spaces away, just the linefeeds + $out = preg_replace( '/^\n+/', '', rtrim( $out ) ); + + // Convert deprecated attributes + if ( isset( $args['enclose'] ) ) { + if ( $args['enclose'] === 'none' ) { + $args['inline'] = true; + } + unset( $args['enclose'] ); + } + + $lexer = isset( $args['lang'] ) ? $args['lang'] : ''; + + $result = self::highlight( $out, $lexer, $args ); + if ( !$result->isGood() ) { + $parser->addTrackingCategory( 'syntaxhighlight-error-category' ); + } + $out = $result->getValue(); + + // HTML Tidy will convert tabs to spaces incorrectly (bug 30930). + // But the conversion from tab to space occurs while reading the input, + // before the conversion from 	 to tab, so we can armor it that way. + if ( $wgUseTidy ) { + $out = str_replace( "\t", '	', $out ); + } + + // Allow certain HTML attributes + $htmlAttribs = Sanitizer::validateAttributes( $args, [ 'style', 'class', 'id', 'dir' ] ); + if ( !isset( $htmlAttribs['class'] ) ) { + $htmlAttribs['class'] = self::HIGHLIGHT_CSS_CLASS; + } else { + $htmlAttribs['class'] .= ' ' . self::HIGHLIGHT_CSS_CLASS; + } + if ( !( isset( $htmlAttribs['dir'] ) && $htmlAttribs['dir'] === 'rtl' ) ) { + $htmlAttribs['dir'] = 'ltr'; + } + + if ( isset( $args['inline'] ) ) { + // Enforce inlineness. Stray newlines may result in unexpected list and paragraph processing + // (also known as doBlockLevels()). + $out = str_replace( "\n", ' ', $out ); + $out = Html::rawElement( 'code', $htmlAttribs, $out ); + + } else { + // Not entirely sure what benefit this provides, but it was here already + $htmlAttribs['class'] .= ' ' . 'mw-content-' . $htmlAttribs['dir']; + + // Unwrap Pygments output to provide our own wrapper. We can't just always use the 'nowrap' + // option (pass 'inline'), since it disables other useful things like line highlighting. + // Tolerate absence of quotes for Html::element() and wgWellFormedXml=false. + $m = []; + if ( preg_match( '/^<div class="?mw-highlight"?>(.*)<\/div>$/s', trim( $out ), $m ) ) { + $out = trim( $m[1] ); + } else { + throw new MWException( 'Unexpected output from Pygments encountered' ); + } + + // Use 'nowiki' strip marker to prevent list processing (also known as doBlockLevels()). + // However, leave the wrapping <div/> outside to prevent <p/>-wrapping. + $marker = $parser::MARKER_PREFIX . '-syntaxhighlightinner-' . + sprintf( '%08X', $parser->mMarkerIndex++ ) . $parser::MARKER_SUFFIX; + $parser->mStripState->addNoWiki( $marker, $out ); + + $out = Html::openElement( 'div', $htmlAttribs ) . + $marker . + Html::closeElement( 'div' ); + } + + // Register CSS + $parser->getOutput()->addModuleStyles( 'ext.pygments' ); + + return $out; + } + + /** + * @return string + */ + public static function getPygmentizePath() { + global $wgPygmentizePath; + + // If $wgPygmentizePath is unset, use the bundled copy. + if ( $wgPygmentizePath === false ) { + $wgPygmentizePath = __DIR__ . '/pygments/pygmentize'; + } + + return $wgPygmentizePath; + } + + /** + * Highlight a code-block using a particular lexer. + * + * @param string $code Code to highlight. + * @param string|null $lang Language name, or null to use plain markup. + * @param array $args Associative array of additional arguments. + * If it contains a 'line' key, the output will include line numbers. + * If it includes a 'highlight' key, the value will be parsed as a + * comma-separated list of lines and line-ranges to highlight. + * If it contains a 'start' key, the value will be used as the line at which to + * start highlighting. + * If it contains a 'inline' key, the output will not be wrapped in `<div><pre/></div>`. + * @return Status Status object, with HTML representing the highlighted + * code as its value. + */ + public static function highlight( $code, $lang = null, $args = [] ) { + $status = new Status; + + $lexer = self::getLexer( $lang ); + if ( $lexer === null && $lang !== null ) { + $status->warning( 'syntaxhighlight-error-unknown-language', $lang ); + } + + $length = strlen( $code ); + if ( strlen( $code ) > self::HIGHLIGHT_MAX_BYTES ) { + $status->warning( 'syntaxhighlight-error-exceeds-size-limit', + $length, self::HIGHLIGHT_MAX_BYTES ); + $lexer = null; + } + + if ( Shell::isDisabled() ) { + $status->warning( 'syntaxhighlight-error-pygments-invocation-failure' ); + wfWarn( + 'MediaWiki determined that it cannot invoke Pygments. ' . + 'As a result, SyntaxHighlight_GeSHi will not perform any syntax highlighting. ' . + 'See the debug log for details: ' . + 'https://www.mediawiki.org/wiki/Manual:$wgDebugLogFile' + ); + $lexer = null; + } + + $inline = isset( $args['inline'] ); + + if ( $lexer === null ) { + if ( $inline ) { + $status->value = htmlspecialchars( trim( $code ), ENT_NOQUOTES ); + } else { + $pre = Html::element( 'pre', [], $code ); + $status->value = Html::rawElement( + 'div', + [ 'class' => self::HIGHLIGHT_CSS_CLASS ], + $pre + ); + } + return $status; + } + + $options = [ + 'cssclass' => self::HIGHLIGHT_CSS_CLASS, + 'encoding' => 'utf-8', + ]; + + // Line numbers + if ( isset( $args['line'] ) ) { + $options['linenos'] = 'inline'; + } + + if ( $lexer === 'php' && strpos( $code, '<?php' ) === false ) { + $options['startinline'] = 1; + } + + // Highlight specific lines + if ( isset( $args['highlight'] ) ) { + $lines = self::parseHighlightLines( $args['highlight'] ); + if ( count( $lines ) ) { + $options['hl_lines'] = implode( ' ', $lines ); + } + } + + // Starting line number + if ( isset( $args['start'] ) && ctype_digit( $args['start'] ) ) { + $options['linenostart'] = (int)$args['start']; + } + + if ( $inline ) { + $options['nowrap'] = 1; + } + + $cache = ObjectCache::getMainWANInstance(); + $cacheKey = self::makeCacheKey( $code, $lexer, $options ); + $output = $cache->get( $cacheKey ); + + if ( $output === false ) { + $optionPairs = []; + foreach ( $options as $k => $v ) { + $optionPairs[] = "{$k}={$v}"; + } + $builder = new ProcessBuilder(); + $builder->setPrefix( self::getPygmentizePath() ); + $process = $builder + ->add( '-l' )->add( $lexer ) + ->add( '-f' )->add( 'html' ) + ->add( '-O' )->add( implode( ',', $optionPairs ) ) + ->getProcess(); + + $process->setInput( $code ); + + /* Workaround for T151523 (buggy $process->getOutput()). + If/when this issue is fixed in HHVM or Symfony, + replace this with "$process->run(); $output = $process->getOutput();" + */ + $output = ''; + $process->run( function ( $type, $capturedOutput ) use ( &$output ) { + $output .= $capturedOutput; + } ); + + if ( !$process->isSuccessful() ) { + $status->warning( 'syntaxhighlight-error-pygments-invocation-failure' ); + wfWarn( 'Failed to invoke Pygments: ' . $process->getErrorOutput() ); + $status->value = self::highlight( $code, null, $args )->getValue(); + return $status; + } + + $cache->set( $cacheKey, $output ); + } + + if ( $inline ) { + $output = trim( $output ); + } + + $status->value = $output; + return $status; + } + + /** + * Construct a cache key for the results of a Pygments invocation. + * + * @param string $code Code to be highlighted. + * @param string $lexer Lexer name. + * @param array $options Options array. + * @return string Cache key. + */ + private static function makeCacheKey( $code, $lexer, $options ) { + $optionString = FormatJson::encode( $options, false, FormatJson::ALL_OK ); + $hash = md5( "{$code}|{$lexer}|{$optionString}|" . self::CACHE_VERSION ); + if ( function_exists( 'wfGlobalCacheKey' ) ) { + return wfGlobalCacheKey( 'highlight', $hash ); + } else { + return 'highlight:' . $hash; + } + } + + /** + * Take an input specifying a list of lines to highlight, returning + * a raw list of matching line numbers. + * + * Input is comma-separated list of lines or line ranges. + * + * @param string $lineSpec + * @return int[] Line numbers. + */ + protected static function parseHighlightLines( $lineSpec ) { + $lines = []; + $values = array_map( 'trim', explode( ',', $lineSpec ) ); + foreach ( $values as $value ) { + if ( ctype_digit( $value ) ) { + $lines[] = (int)$value; + } elseif ( strpos( $value, '-' ) !== false ) { + list( $start, $end ) = array_map( 'trim', explode( '-', $value ) ); + if ( self::validHighlightRange( $start, $end ) ) { + for ( $i = intval( $start ); $i <= $end; $i++ ) { + $lines[] = $i; + } + } + } + if ( count( $lines ) > self::HIGHLIGHT_MAX_LINES ) { + $lines = array_slice( $lines, 0, self::HIGHLIGHT_MAX_LINES ); + break; + } + } + return $lines; + } + + /** + * Validate a provided input range + * @param $start + * @param $end + * @return bool + */ + protected static function validHighlightRange( $start, $end ) { + // Since we're taking this tiny range and producing a an + // array of every integer between them, it would be trivial + // to DoS the system by asking for a huge range. + // Impose an arbitrary limit on the number of lines in a + // given range to reduce the impact. + return + ctype_digit( $start ) && + ctype_digit( $end ) && + $start > 0 && + $start < $end && + $end - $start < self::HIGHLIGHT_MAX_LINES; + } + + /** + * Hook into Content::getParserOutput to provide syntax highlighting for + * script content. + * + * @return bool + * @since MW 1.21 + */ + public static function onContentGetParserOutput( Content $content, Title $title, + $revId, ParserOptions $options, $generateHtml, ParserOutput &$output + ) { + global $wgParser, $wgTextModelsToParse; + + if ( !$generateHtml ) { + // Nothing special for us to do, let MediaWiki handle this. + return true; + } + + // Determine the language + $extension = ExtensionRegistry::getInstance(); + $models = $extension->getAttribute( 'SyntaxHighlightModels' ); + $model = $content->getModel(); + if ( !isset( $models[$model] ) ) { + // We don't care about this model, carry on. + return true; + } + $lexer = $models[$model]; + + // Hope that $wgSyntaxHighlightModels does not contain silly types. + $text = ContentHandler::getContentText( $content ); + if ( !$text ) { + // Oops! Non-text content? Let MediaWiki handle this. + return true; + } + + // Parse using the standard parser to get links etc. into the database, HTML is replaced below. + // We could do this using $content->fillParserOutput(), but alas it is 'protected'. + if ( $content instanceof TextContent && in_array( $model, $wgTextModelsToParse ) ) { + $output = $wgParser->parse( $text, $title, $options, true, true, $revId ); + } + + $status = self::highlight( $text, $lexer ); + if ( !$status->isOK() ) { + return true; + } + $out = $status->getValue(); + + $output->addModuleStyles( 'ext.pygments' ); + $output->setText( '<div dir="ltr">' . $out . '</div>' ); + + // Inform MediaWiki that we have parsed this page and it shouldn't mess with it. + return false; + } + + /** + * Hook to provide syntax highlighting for API pretty-printed output + * + * @param IContextSource $context + * @param string $text + * @param string $mime + * @param string $format + * @since MW 1.24 + * @return bool + */ + public static function onApiFormatHighlight( IContextSource $context, $text, $mime, $format ) { + if ( !isset( self::$mimeLexers[$mime] ) ) { + return true; + } + + $lexer = self::$mimeLexers[$mime]; + $status = self::highlight( $text, $lexer ); + if ( !$status->isOK() ) { + return true; + } + + $out = $status->getValue(); + if ( preg_match( '/^<pre([^>]*)>/i', $out, $m ) ) { + $attrs = Sanitizer::decodeTagAttributes( $m[1] ); + $attrs['class'] .= ' api-pretty-content'; + $encodedAttrs = Sanitizer::safeEncodeTagAttributes( $attrs ); + $out = '<pre' . $encodedAttrs. '>' . substr( $out, strlen( $m[0] ) ); + } + $output = $context->getOutput(); + $output->addModuleStyles( 'ext.pygments' ); + $output->addHTML( '<div dir="ltr">' . $out . '</div>' ); + + // Inform MediaWiki that we have parsed this page and it shouldn't mess with it. + return false; + } + + /** + * Conditionally register resource loader modules that depends on the + * VisualEditor MediaWiki extension. + * + * @param ResourceLoader $resourceLoader + */ + public static function onResourceLoaderRegisterModules( &$resourceLoader ) { + if ( ! ExtensionRegistry::getInstance()->isLoaded( 'VisualEditor' ) ) { + return; + } + + $resourceLoader->register( 'ext.geshi.visualEditor', [ + 'class' => 'ResourceLoaderSyntaxHighlightVisualEditorModule', + 'localBasePath' => __DIR__ . DIRECTORY_SEPARATOR . 'modules', + 'remoteExtPath' => 'SyntaxHighlight_GeSHi/modules', + 'scripts' => [ + 've-syntaxhighlight/ve.dm.MWSyntaxHighlightNode.js', + 've-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightWindow.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightDialogTool.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightInspectorTool.js', + ], + 'styles' => [ + 've-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.css', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.css', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.css', + ], + 'dependencies' => [ + 'ext.visualEditor.mwcore', + ], + 'messages' => [ + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title', + ], + 'targets' => [ 'desktop', 'mobile' ], + ] ); + } + + /** + * Backward-compatibility shim for extensions. + * @deprecated since MW 1.25 + */ + public static function prepare( $text, $lang ) { + wfDeprecated( __METHOD__ ); + return new GeSHi( self::highlight( $text, $lang )->getValue() ); + } + + /** + * Backward-compatibility shim for extensions. + * @deprecated since MW 1.25 + * @param GeSHi $geshi + * @return string + */ + public static function buildHeadItem( $geshi ) { + wfDeprecated( __METHOD__ ); + $geshi->parse_code(); + return ''; + } +} +class_alias( SyntaxHighlight::class, 'SyntaxHighlight_GeSHi' ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.lexers.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.lexers.php new file mode 100644 index 00000000..f64672e6 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.lexers.php @@ -0,0 +1,679 @@ +<?php +// Generated by updateLexerList.php + +return [ + 'abap', + 'abl', + 'abnf', + 'aconf', + 'actionscript', + 'actionscript3', + 'ada', + 'ada2005', + 'ada95', + 'adl', + 'agda', + 'aheui', + 'ahk', + 'alloy', + 'ambienttalk', + 'ambienttalk/2', + 'ampl', + 'antlr', + 'antlr-actionscript', + 'antlr-as', + 'antlr-c#', + 'antlr-cpp', + 'antlr-csharp', + 'antlr-java', + 'antlr-objc', + 'antlr-perl', + 'antlr-python', + 'antlr-rb', + 'antlr-ruby', + 'apache', + 'apacheconf', + 'apl', + 'applescript', + 'arduino', + 'arexx', + 'as', + 'as3', + 'asm', + 'aspectj', + 'aspx-cs', + 'aspx-vb', + 'asy', + 'asymptote', + 'at', + 'autohotkey', + 'autoit', + 'awk', + 'b3d', + 'basemake', + 'bash', + 'basic', + 'bat', + 'batch', + 'bbcode', + 'bc', + 'befunge', + 'bf', + 'bib', + 'bibtex', + 'blitzbasic', + 'blitzmax', + 'bmax', + 'bnf', + 'boo', + 'boogie', + 'bplus', + 'brainfuck', + 'bro', + 'bsdmake', + 'bst', + 'bst-pybtex', + 'bugs', + 'c', + 'c#', + 'c++', + 'c++-objdumb', + 'c-objdump', + 'ca65', + 'cadl', + 'camkes', + 'capdl', + 'capnp', + 'cbmbas', + 'ceylon', + 'cf3', + 'cfc', + 'cfengine3', + 'cfg', + 'cfm', + 'cfs', + 'chai', + 'chaiscript', + 'chapel', + 'cheetah', + 'chpl', + 'cirru', + 'cl', + 'clay', + 'clean', + 'clipper', + 'clj', + 'cljs', + 'clojure', + 'clojurescript', + 'cmake', + 'cobol', + 'cobolfree', + 'coffee', + 'coffee-script', + 'coffeescript', + 'common-lisp', + 'componentpascal', + 'console', + 'control', + 'coq', + 'cp', + 'cpp', + 'cpp-objdump', + 'cpsa', + 'cr', + 'crmsh', + 'croc', + 'cry', + 'cryptol', + 'crystal', + 'csh', + 'csharp', + 'csound', + 'csound-csd', + 'csound-document', + 'csound-orc', + 'csound-sco', + 'csound-score', + 'css', + 'css+django', + 'css+erb', + 'css+genshi', + 'css+genshitext', + 'css+jinja', + 'css+lasso', + 'css+mako', + 'css+mozpreproc', + 'css+myghty', + 'css+php', + 'css+ruby', + 'css+smarty', + 'cu', + 'cucumber', + 'cuda', + 'cxx-objdump', + 'cypher', + 'cython', + 'd', + 'd-objdump', + 'dart', + 'debcontrol', + 'debsources', + 'delphi', + 'dg', + 'diff', + 'django', + 'do', + 'docker', + 'dockerfile', + 'dosbatch', + 'doscon', + 'dosini', + 'dpatch', + 'dtd', + 'duby', + 'duel', + 'dylan', + 'dylan-console', + 'dylan-lid', + 'dylan-repl', + 'earl-grey', + 'earlgrey', + 'easytrieve', + 'ebnf', + 'ec', + 'ecl', + 'eg', + 'eiffel', + 'elisp', + 'elixir', + 'elm', + 'emacs', + 'emacs-lisp', + 'erb', + 'erl', + 'erlang', + 'evoque', + 'ex', + 'exs', + 'extempore', + 'ezhil', + 'factor', + 'fan', + 'fancy', + 'felix', + 'fish', + 'fishshell', + 'flatline', + 'flx', + 'forth', + 'fortran', + 'fortranfixed', + 'foxpro', + 'fsharp', + 'fy', + 'gap', + 'gas', + 'gawk', + 'genshi', + 'genshitext', + 'gherkin', + 'glsl', + 'gnuplot', + 'go', + 'golo', + 'gooddata-cl', + 'gosu', + 'groff', + 'groovy', + 'gst', + 'haml', + 'handlebars', + 'haskell', + 'haxe', + 'haxeml', + 'hexdump', + 'hs', + 'hsa', + 'hsail', + 'html', + 'html+cheetah', + 'html+django', + 'html+erb', + 'html+evoque', + 'html+genshi', + 'html+handlebars', + 'html+jinja', + 'html+kid', + 'html+lasso', + 'html+mako', + 'html+myghty', + 'html+ng2', + 'html+php', + 'html+ruby', + 'html+smarty', + 'html+spitfire', + 'html+twig', + 'html+velocity', + 'htmlcheetah', + 'htmldjango', + 'http', + 'hx', + 'hxml', + 'hxsl', + 'hy', + 'hybris', + 'hylang', + 'i6', + 'i6t', + 'i7', + 'idl', + 'idl4', + 'idr', + 'idris', + 'iex', + 'igor', + 'igorpro', + 'ik', + 'inform6', + 'inform7', + 'ini', + 'io', + 'ioke', + 'irb', + 'irc', + 'isabelle', + 'j', + 'jade', + 'jags', + 'jasmin', + 'jasminxt', + 'java', + 'javascript', + 'javascript+cheetah', + 'javascript+django', + 'javascript+erb', + 'javascript+genshi', + 'javascript+genshitext', + 'javascript+jinja', + 'javascript+lasso', + 'javascript+mako', + 'javascript+mozpreproc', + 'javascript+myghty', + 'javascript+php', + 'javascript+ruby', + 'javascript+smarty', + 'javascript+spitfire', + 'jbst', + 'jcl', + 'jinja', + 'jl', + 'jlcon', + 'jproperties', + 'js', + 'js+cheetah', + 'js+django', + 'js+erb', + 'js+genshi', + 'js+genshitext', + 'js+jinja', + 'js+lasso', + 'js+mako', + 'js+myghty', + 'js+php', + 'js+ruby', + 'js+smarty', + 'js+spitfire', + 'jsgf', + 'json', + 'json-ld', + 'json-object', + 'jsonld', + 'jsonml+bst', + 'jsp', + 'julia', + 'juttle', + 'kal', + 'kconfig', + 'kernel-config', + 'kid', + 'koka', + 'kotlin', + 'ksh', + 'lagda', + 'lasso', + 'lassoscript', + 'latex', + 'lcry', + 'lcryptol', + 'lean', + 'less', + 'lhaskell', + 'lhs', + 'lid', + 'lidr', + 'lidris', + 'lighttpd', + 'lighty', + 'limbo', + 'linux-config', + 'liquid', + 'lisp', + 'literate-agda', + 'literate-cryptol', + 'literate-haskell', + 'literate-idris', + 'live-script', + 'livescript', + 'llvm', + 'logos', + 'logtalk', + 'lsl', + 'lua', + 'm2', + 'make', + 'makefile', + 'mako', + 'man', + 'maql', + 'mask', + 'mason', + 'mathematica', + 'matlab', + 'matlabsession', + 'mawk', + 'md', + 'menuconfig', + 'mf', + 'minid', + 'mma', + 'modelica', + 'modula2', + 'moin', + 'monkey', + 'monte', + 'moo', + 'moocode', + 'moon', + 'moonscript', + 'mozhashpreproc', + 'mozpercentpreproc', + 'mq4', + 'mq5', + 'mql', + 'mql4', + 'mql5', + 'msc', + 'mscgen', + 'mupad', + 'mxml', + 'myghty', + 'mysql', + 'nasm', + 'nawk', + 'nb', + 'ncl', + 'nemerle', + 'nesc', + 'newlisp', + 'newspeak', + 'ng2', + 'nginx', + 'nim', + 'nimrod', + 'nit', + 'nix', + 'nixos', + 'nroff', + 'nsh', + 'nsi', + 'nsis', + 'numpy', + 'nusmv', + 'obj-c', + 'obj-c++', + 'obj-j', + 'objc', + 'objc++', + 'objdump', + 'objdump-nasm', + 'objective-c', + 'objective-c++', + 'objective-j', + 'objectivec', + 'objectivec++', + 'objectivej', + 'objectpascal', + 'objj', + 'ocaml', + 'octave', + 'odin', + 'ooc', + 'opa', + 'openbugs', + 'openedge', + 'pacmanconf', + 'pan', + 'parasail', + 'pas', + 'pascal', + 'pawn', + 'pcmk', + 'perl', + 'perl6', + 'php', + 'php3', + 'php4', + 'php5', + 'pig', + 'pike', + 'pkgconfig', + 'pl', + 'pl6', + 'plpgsql', + 'po', + 'posh', + 'postgres', + 'postgres-console', + 'postgresql', + 'postgresql-console', + 'postscr', + 'postscript', + 'pot', + 'pov', + 'powershell', + 'praat', + 'progress', + 'prolog', + 'properties', + 'proto', + 'protobuf', + 'ps1', + 'ps1con', + 'psm1', + 'psql', + 'pug', + 'puppet', + 'py', + 'py3', + 'py3tb', + 'pycon', + 'pypy', + 'pypylog', + 'pyrex', + 'pytb', + 'python', + 'python3', + 'pyx', + 'qbasic', + 'qbs', + 'qml', + 'qvt', + 'qvto', + 'r', + 'racket', + 'ragel', + 'ragel-c', + 'ragel-cpp', + 'ragel-d', + 'ragel-em', + 'ragel-java', + 'ragel-objc', + 'ragel-rb', + 'ragel-ruby', + 'raw', + 'rb', + 'rbcon', + 'rconsole', + 'rd', + 'rebol', + 'red', + 'red/system', + 'redcode', + 'registry', + 'resource', + 'resourcebundle', + 'rest', + 'restructuredtext', + 'rexx', + 'rhtml', + 'rkt', + 'rnc', + 'rng-compact', + 'roboconf-graph', + 'roboconf-instances', + 'robotframework', + 'rout', + 'rql', + 'rsl', + 'rst', + 'rts', + 'ruby', + 'rust', + 's', + 'sage', + 'salt', + 'sas', + 'sass', + 'sc', + 'scala', + 'scaml', + 'scheme', + 'scilab', + 'scm', + 'scss', + 'sh', + 'shell', + 'shell-session', + 'shen', + 'silver', + 'slim', + 'sls', + 'smali', + 'smalltalk', + 'smarty', + 'sml', + 'snobol', + 'snowball', + 'sources.list', + 'sourceslist', + 'sp', + 'sparql', + 'spec', + 'spitfire', + 'splus', + 'sql', + 'sqlite3', + 'squeak', + 'squid', + 'squid.conf', + 'squidconf', + 'ssp', + 'st', + 'stan', + 'stata', + 'supercollider', + 'sv', + 'swift', + 'swig', + 'systemverilog', + 't-sql', + 'tads3', + 'tap', + 'tasm', + 'tcl', + 'tcsh', + 'tcshcon', + 'tea', + 'termcap', + 'terminfo', + 'terraform', + 'tex', + 'text', + 'tf', + 'thrift', + 'todotxt', + 'trac-wiki', + 'trafficscript', + 'treetop', + 'ts', + 'tsql', + 'turtle', + 'twig', + 'typescript', + 'typoscript', + 'typoscriptcssdata', + 'typoscripthtmldata', + 'udiff', + 'urbiscript', + 'v', + 'vala', + 'vapi', + 'vb.net', + 'vbnet', + 'vcl', + 'vclsnippet', + 'vclsnippets', + 'vctreestatus', + 'velocity', + 'verilog', + 'vfp', + 'vgl', + 'vhdl', + 'vim', + 'wdiff', + 'whiley', + 'winbatch', + 'winbugs', + 'x10', + 'xbase', + 'xml', + 'xml+cheetah', + 'xml+django', + 'xml+erb', + 'xml+evoque', + 'xml+genshi', + 'xml+jinja', + 'xml+kid', + 'xml+lasso', + 'xml+mako', + 'xml+myghty', + 'xml+php', + 'xml+ruby', + 'xml+smarty', + 'xml+spitfire', + 'xml+velocity', + 'xq', + 'xql', + 'xqm', + 'xquery', + 'xqy', + 'xslt', + 'xten', + 'xtend', + 'xul+mozpreproc', + 'yaml', + 'yaml+jinja', + 'zephir', + 'zsh', +]; diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php new file mode 100644 index 00000000..82cb6aa7 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php @@ -0,0 +1,513 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +use Symfony\Component\Process\ProcessBuilder; + +// @codingStandardsIgnoreStart +class SyntaxHighlight_GeSHi { +// @codingStandardsIgnoreEnd + + /** @var const The maximum number of lines that may be selected for highlighting. **/ + const HIGHLIGHT_MAX_LINES = 1000; + + /** @var const Maximum input size for the highlighter (100 kB). **/ + const HIGHLIGHT_MAX_BYTES = 102400; + + /** @var const CSS class for syntax-highlighted code. **/ + const HIGHLIGHT_CSS_CLASS = 'mw-highlight'; + + /** @var const Cache version. Increment whenever the HTML changes. */ + const CACHE_VERSION = 1; + + /** @var array Mapping of MIME-types to lexer names. **/ + private static $mimeLexers = array( + 'text/javascript' => 'javascript', + 'application/json' => 'javascript', + 'text/xml' => 'xml', + ); + + public static function onSetup() { + global $wgPygmentizePath; + + // If $wgPygmentizePath is unset, use the bundled copy. + if ( $wgPygmentizePath === false ) { + $wgPygmentizePath = __DIR__ . '/pygments/pygmentize'; + } + } + + /** + * Get the Pygments lexer name for a particular language. + * + * @param string $lang Language name. + * @return string|null Lexer name, or null if no matching lexer. + */ + private static function getLexer( $lang ) { + static $lexers = null; + + if ( $lang === null ) { + return null; + } + + if ( !$lexers ) { + $lexers = require __DIR__ . '/SyntaxHighlight_GeSHi.lexers.php'; + } + + $lexer = strtolower( $lang ); + + if ( in_array( $lexer, $lexers ) ) { + return $lexer; + } + + $geshi2pygments = SyntaxHighlightGeSHiCompat::getGeSHiToPygmentsMap(); + + // Check if this is a GeSHi lexer name for which there exists + // a compatible Pygments lexer with a different name. + if ( isset( $geshi2pygments[$lexer] ) ) { + $lexer = $geshi2pygments[$lexer]; + if ( in_array( $lexer, $lexers ) ) { + return $lexer; + } + } + + return null; + } + + /** + * Register parser hook + * + * @param $parser Parser + * @return bool + */ + public static function onParserFirstCallInit( Parser &$parser ) { + foreach ( array( 'source', 'syntaxhighlight' ) as $tag ) { + $parser->setHook( $tag, array( 'SyntaxHighlight_GeSHi', 'parserHook' ) ); + } + } + + /** + * Parser hook + * + * @param string $text + * @param array $args + * @param Parser $parser + * @return string + */ + public static function parserHook( $text, $args = array(), $parser ) { + global $wgUseTidy; + + // Replace strip markers (For e.g. {{#tag:syntaxhighlight|<nowiki>...}}) + $out = $parser->mStripState->unstripNoWiki( $text ); + + // Don't trim leading spaces away, just the linefeeds + $out = preg_replace( '/^\n+/', '', rtrim( $out ) ); + + // Convert deprecated attributes + if ( isset( $args['enclose'] ) ) { + if ( $args['enclose'] === 'none' ) { + $args['inline'] = true; + } + unset( $args['enclose'] ); + } + + $lexer = isset( $args['lang'] ) ? $args['lang'] : ''; + + $result = self::highlight( $out, $lexer, $args ); + if ( !$result->isGood() ) { + $parser->addTrackingCategory( 'syntaxhighlight-error-category' ); + } + $out = $result->getValue(); + + // HTML Tidy will convert tabs to spaces incorrectly (bug 30930). + // But the conversion from tab to space occurs while reading the input, + // before the conversion from 	 to tab, so we can armor it that way. + if ( $wgUseTidy ) { + $out = str_replace( "\t", '	', $out ); + } + + // Allow certain HTML attributes + $htmlAttribs = Sanitizer::validateAttributes( $args, array( 'style', 'class', 'id', 'dir' ) ); + if ( !isset( $htmlAttribs['class'] ) ) { + $htmlAttribs['class'] = self::HIGHLIGHT_CSS_CLASS; + } else { + $htmlAttribs['class'] .= ' ' . self::HIGHLIGHT_CSS_CLASS; + } + if ( !( isset( $htmlAttribs['dir'] ) && $htmlAttribs['dir'] === 'rtl' ) ) { + $htmlAttribs['dir'] = 'ltr'; + } + + if ( isset( $args['inline'] ) ) { + // Enforce inlineness. Stray newlines may result in unexpected list and paragraph processing + // (also known as doBlockLevels()). + $out = str_replace( "\n", ' ', $out ); + $out = Html::rawElement( 'code', $htmlAttribs, $out ); + + } else { + // Not entirely sure what benefit this provides, but it was here already + $htmlAttribs['class'] .= ' ' . 'mw-content-' . $htmlAttribs['dir']; + + // Unwrap Pygments output to provide our own wrapper. We can't just always use the 'nowrap' + // option (pass 'inline'), since it disables other useful things like line highlighting. + // Tolerate absence of quotes for Html::element() and wgWellFormedXml=false. + $m = array(); + if ( preg_match( '/^<div class="?mw-highlight"?>(.*)<\/div>$/s', trim( $out ), $m ) ) { + $out = trim( $m[1] ); + } else { + throw new MWException( 'Unexpected output from Pygments encountered' ); + } + + // Use 'nowiki' strip marker to prevent list processing (also known as doBlockLevels()). + // However, leave the wrapping <div/> outside to prevent <p/>-wrapping. + $marker = $parser->mUniqPrefix . '-syntaxhighlightinner-' . + sprintf( '%08X', $parser->mMarkerIndex++ ) . $parser::MARKER_SUFFIX; + $parser->mStripState->addNoWiki( $marker, $out ); + + $out = Html::openElement( 'div', $htmlAttribs ) . + $marker . + Html::closeElement( 'div' ); + } + + // Register CSS + $parser->getOutput()->addModuleStyles( 'ext.pygments' ); + + return $out; + } + + /** + * Highlight a code-block using a particular lexer. + * + * @param string $code Code to highlight. + * @param string|null $lang Language name, or null to use plain markup. + * @param array $args Associative array of additional arguments. + * If it contains a 'line' key, the output will include line numbers. + * If it includes a 'highlight' key, the value will be parsed as a + * comma-separated list of lines and line-ranges to highlight. + * If it contains a 'start' key, the value will be used as the line at which to + * start highlighting. + * If it contains a 'inline' key, the output will not be wrapped in `<div><pre/></div>`. + * @return Status Status object, with HTML representing the highlighted + * code as its value. + */ + public static function highlight( $code, $lang = null, $args = array() ) { + global $wgPygmentizePath; + + $status = new Status; + + $lexer = self::getLexer( $lang ); + if ( $lexer === null && $lang !== null ) { + $status->warning( 'syntaxhighlight-error-unknown-language', $lang ); + } + + $length = strlen( $code ); + if ( strlen( $code ) > self::HIGHLIGHT_MAX_BYTES ) { + $status->warning( 'syntaxhighlight-error-exceeds-size-limit', + $length, self::HIGHLIGHT_MAX_BYTES ); + $lexer = null; + } + + if ( wfShellExecDisabled() !== false ) { + $status->warning( 'syntaxhighlight-error-pygments-invocation-failure' ); + wfWarn( + 'MediaWiki determined that it cannot invoke Pygments. ' . + 'As a result, SyntaxHighlight_GeSHi will not perform any syntax highlighting. ' . + 'See the debug log for details: ' . + 'https://www.mediawiki.org/wiki/Manual:$wgDebugLogFile' + ); + $lexer = null; + } + + $inline = isset( $args['inline'] ); + + if ( $lexer === null ) { + if ( $inline ) { + $status->value = htmlspecialchars( trim( $code ), ENT_NOQUOTES ); + } else { + $pre = Html::element( 'pre', array(), $code ); + $status->value = Html::rawElement( 'div', array( 'class' => self::HIGHLIGHT_CSS_CLASS ), $pre ); + } + return $status; + } + + $options = array( + 'cssclass' => self::HIGHLIGHT_CSS_CLASS, + 'encoding' => 'utf-8', + ); + + // Line numbers + if ( isset( $args['line'] ) ) { + $options['linenos'] = 'inline'; + } + + if ( $lexer === 'php' && strpos( $code, '<?php' ) === false ) { + $options['startinline'] = 1; + } + + // Highlight specific lines + if ( isset( $args['highlight'] ) ) { + $lines = self::parseHighlightLines( $args['highlight'] ); + if ( count( $lines ) ) { + $options['hl_lines'] = implode( ' ', $lines ); + } + } + + // Starting line number + if ( isset( $args['start'] ) && ctype_digit( $args['start'] ) ) { + $options['linenostart'] = (int)$args['start']; + } + + if ( $inline ) { + $options['nowrap'] = 1; + } + + $cache = ObjectCache::getMainWANInstance(); + $cacheKey = self::makeCacheKey( $code, $lexer, $options ); + $output = $cache->get( $cacheKey ); + + if ( $output === false ) { + $optionPairs = array(); + foreach ( $options as $k => $v ) { + $optionPairs[] = "{$k}={$v}"; + } + $builder = new ProcessBuilder(); + $builder->setPrefix( $wgPygmentizePath ); + $process = $builder + ->add( '-l' )->add( $lexer ) + ->add( '-f' )->add( 'html' ) + ->add( '-O' )->add( implode( ',', $optionPairs ) ) + ->getProcess(); + + $process->setInput( $code ); + + /* Workaround for T151523 (buggy $process->getOutput()). + If/when this issue is fixed in HHVM or Symfony, + replace this with "$process->run(); $output = $process->getOutput();" + */ + $output = ''; + $process->run( function( $type, $capturedOutput ) use ( &$output ) { + $output .= $capturedOutput; + } ); + + if ( !$process->isSuccessful() ) { + $status->warning( 'syntaxhighlight-error-pygments-invocation-failure' ); + wfWarn( 'Failed to invoke Pygments: ' . $process->getErrorOutput() ); + $status->value = self::highlight( $code, null, $args )->getValue(); + return $status; + } + + $cache->set( $cacheKey, $output ); + } + + if ( $inline ) { + $output = trim( $output ); + } + + $status->value = $output; + return $status; + + } + + /** + * Construct a cache key for the results of a Pygments invocation. + * + * @param string $code Code to be highlighted. + * @param string $lexer Lexer name. + * @param array $options Options array. + * @return string Cache key. + */ + private static function makeCacheKey( $code, $lexer, $options ) { + $optionString = FormatJson::encode( $options, false, FormatJson::ALL_OK ); + $hash = md5( "{$code}|{$lexer}|{$optionString}|" . self::CACHE_VERSION ); + if ( function_exists( 'wfGlobalCacheKey' ) ) { + return wfGlobalCacheKey( 'highlight', $hash ); + } else { + return 'highlight:' . $hash; + } + } + + /** + * Take an input specifying a list of lines to highlight, returning + * a raw list of matching line numbers. + * + * Input is comma-separated list of lines or line ranges. + * + * @param string $lineSpec + * @return int[] Line numbers. + */ + protected static function parseHighlightLines( $lineSpec ) { + $lines = array(); + $values = array_map( 'trim', explode( ',', $lineSpec ) ); + foreach ( $values as $value ) { + if ( ctype_digit( $value ) ) { + $lines[] = (int)$value; + } elseif ( strpos( $value, '-' ) !== false ) { + list( $start, $end ) = array_map( 'trim', explode( '-', $value ) ); + if ( self::validHighlightRange( $start, $end ) ) { + for ( $i = intval( $start ); $i <= $end; $i++ ) { + $lines[] = $i; + } + } + } + if ( count( $lines ) > self::HIGHLIGHT_MAX_LINES ) { + $lines = array_slice( $lines, 0, self::HIGHLIGHT_MAX_LINES ); + break; + } + } + return $lines; + } + + /** + * Validate a provided input range + * @param $start + * @param $end + * @return bool + */ + protected static function validHighlightRange( $start, $end ) { + // Since we're taking this tiny range and producing a an + // array of every integer between them, it would be trivial + // to DoS the system by asking for a huge range. + // Impose an arbitrary limit on the number of lines in a + // given range to reduce the impact. + return + ctype_digit( $start ) && + ctype_digit( $end ) && + $start > 0 && + $start < $end && + $end - $start < self::HIGHLIGHT_MAX_LINES; + } + + /** + * Hook into Content::getParserOutput to provide syntax highlighting for + * script content. + * + * @return bool + * @since MW 1.21 + */ + public static function onContentGetParserOutput( Content $content, Title $title, + $revId, ParserOptions $options, $generateHtml, ParserOutput &$output ) { + + global $wgParser, $wgTextModelsToParse; + + if ( !$generateHtml ) { + // Nothing special for us to do, let MediaWiki handle this. + return true; + } + + // Determine the language + $extension = ExtensionRegistry::getInstance(); + $models = $extension->getAttribute( 'SyntaxHighlightModels' ); + $model = $content->getModel(); + if ( !isset( $models[$model] ) ) { + // We don't care about this model, carry on. + return true; + } + $lexer = $models[$model]; + + // Hope that $wgSyntaxHighlightModels does not contain silly types. + $text = ContentHandler::getContentText( $content ); + if ( !$text ) { + // Oops! Non-text content? Let MediaWiki handle this. + return true; + } + + // Parse using the standard parser to get links etc. into the database, HTML is replaced below. + // We could do this using $content->fillParserOutput(), but alas it is 'protected'. + if ( $content instanceof TextContent && in_array( $model, $wgTextModelsToParse ) ) { + $output = $wgParser->parse( $text, $title, $options, true, true, $revId ); + } + + $status = self::highlight( $text, $lexer ); + if ( !$status->isOK() ) { + return true; + } + $out = $status->getValue(); + + $output->addModuleStyles( 'ext.pygments' ); + $output->setText( '<div dir="ltr">' . $out . '</div>' ); + + // Inform MediaWiki that we have parsed this page and it shouldn't mess with it. + return false; + } + + /** + * Hook to provide syntax highlighting for API pretty-printed output + * + * @param IContextSource $context + * @param string $text + * @param string $mime + * @param string $format + * @since MW 1.24 + */ + public static function onApiFormatHighlight( IContextSource $context, $text, $mime, $format ) { + if ( !isset( self::$mimeLexers[$mime] ) ) { + return true; + } + + $lexer = self::$mimeLexers[$mime]; + $status = self::highlight( $text, $lexer ); + if ( !$status->isOK() ) { + return true; + } + + $out = $status->getValue(); + if ( preg_match( '/^<pre([^>]*)>/i', $out, $m ) ) { + $attrs = Sanitizer::decodeTagAttributes( $m[1] ); + $attrs['class'] .= ' api-pretty-content'; + $encodedAttrs = Sanitizer::safeEncodeTagAttributes( $attrs ); + $out = '<pre' . $encodedAttrs. '>' . substr( $out, strlen( $m[0] ) ); + } + $output = $context->getOutput(); + $output->addModuleStyles( 'ext.pygments' ); + $output->addHTML( '<div dir="ltr">' . $out . '</div>' ); + + // Inform MediaWiki that we have parsed this page and it shouldn't mess with it. + return false; + } + + /** + * Reject parser cache values that are for GeSHi since those + * ResourceLoader modules no longer exist + * + * @param ParserOutput $parserOutput + * @param WikiPage|Article $page + * @param ParserOptions $popts + * @return bool + */ + public static function onRejectParserCacheValue( + ParserOutput $parserOutput, $page, ParserOptions $popts + ) { + foreach ( $parserOutput->getModuleStyles() as $module ) { + if ( strpos( $module, 'ext.geshi.' ) === 0 ) { + $page->getTitle()->purgeSquid(); + return false; + } + } + return true; + } + + /** Backward-compatibility shim for extensions. */ + public static function prepare( $text, $lang ) { + wfDeprecated( __METHOD__ ); + return new GeSHi( self::highlight( $text, $lang )->getValue() ); + } + + /** Backward-compatibility shim for extensions. */ + public static function buildHeadItem( $geshi ) { + wfDeprecated( __METHOD__ ); + $geshi->parse_code(); + return ''; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.compat.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.compat.php new file mode 100644 index 00000000..ea4efed8 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.compat.php @@ -0,0 +1,147 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +/** + * Stub class for maintaining backward-compatibility with extensions + * that have not been updated for version 2.0 of SyntaxHighlight_GeSHi. + */ +class GeSHi { + public function __construct( $html ) { + $this->html = $html; + } + + public function error() { + } + + public function set_language( $language ) { + } + + public function parse_code() { + global $wgOut; + $wgOut->addModuleStyles( 'ext.pygments' ); + return $this->html; + } +} + +class SyntaxHighlightGeSHiCompat { + /** @var array A mapping of GeSHi lexer names to compatible Pygments lexers. */ + private static $compatibleLexers = array( + // Assembler + 'arm' => 'asm', + '6502acme' => 'asm', + '6502tasm' => 'asm', + '6502kickass'=> 'asm', + '68000devpac'=> 'asm', + 'dcpu16' => 'asm', + 'm68k' => 'asm', + 'mmix' => 'nasm', + 'mpasm' => 'asm', + 'pic16' => 'asm', + 'z80' => 'asm', + + // BASIC + 'xbasic' => 'basic', + 'thinbasic' => 'basic', + 'sdlbasic' => 'basic', + 'purebasic' => 'basic', + 'mapbasic' => 'basic', + 'locobasic' => 'basic', + 'gwbasic' => 'basic', + 'freebasic' => 'basic', + 'basic4gl' => 'basic', + 'zxbasic' => 'basic', + 'gambas' => 'basic', + 'oobas' => 'basic', + 'bascomavr' => 'basic', + + // C / C++ + 'c_loadrunner' => 'c', + 'c_mac' => 'c', + 'c_winapi' => 'c', + 'upc' => 'c', + 'cpp-qt' => 'cpp', + 'cpp-winapi' => 'cpp', + 'urbi' => 'cpp', + + // HTML + 'html4strict' => 'html', + 'html5' => 'html', + + // JavaScript + 'jquery' => 'javascript', + 'ecmascript' => 'javascript', + + // Microsoft + 'vb' => 'vbnet', + 'asp' => 'aspx-vb', + 'visualfoxpro' => 'foxpro', + 'dos' => 'bat', + 'visualprolog' => 'prolog', + 'reg' => 'registry', + + // Miscellaneous + 'cadlisp' => 'lisp', + 'java5' => 'java', + 'php-brief' => 'php', + 'povray' => 'pov', + 'pys60' => 'python', + 'rails' => 'ruby', + 'rpmspec' => 'spec', + 'rsplus' => 'splus', + 'gettext' => 'pot', + + // ML + 'ocaml-brief' => 'ocaml', + 'standardml' => 'sml', + + // Modula 2 + 'modula3' => 'modula2', + 'oberon2' => 'modula2', + + // SQL + 'dcl' => 'sql', + 'tsql' => 'sql', + 'plsql' => 'sql', + 'oracle11' => 'sql', + 'oracle8' => 'sql', + + // REXX + 'oorexx' => 'rexx', + 'netrexx' => 'rexx', + + // xpp is basically Java + 'xpp' => 'java', + + // bibtex is basically LaTeX + 'bibtex' => 'latex', + + // 'emacs-lisp' was an alias for the Emacs Lisp lexer. + // It got dropped in Pygments commit 811926b, probably by accident. + // Declare it here until it is restored upstream. + // Upstream bug: + // https://bitbucket.org/birkenfeld/pygments-main/issues/1207 + 'emacs-lisp' => 'elisp', + + // apt + 'apt_sources' => 'debsources', + ); + + public static function getGeSHiToPygmentsMap() { + return self::$compatibleLexers; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.lexers.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.lexers.php new file mode 100644 index 00000000..c1b34d4d --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.lexers.php @@ -0,0 +1,637 @@ +<?php +// Generated by updateLexerList.php + +return array( + 'abap', + 'abl', + 'abnf', + 'aconf', + 'actionscript', + 'actionscript3', + 'ada', + 'ada2005', + 'ada95', + 'adl', + 'agda', + 'ahk', + 'alloy', + 'ambienttalk', + 'ambienttalk/2', + 'antlr', + 'antlr-actionscript', + 'antlr-as', + 'antlr-c#', + 'antlr-cpp', + 'antlr-csharp', + 'antlr-java', + 'antlr-objc', + 'antlr-perl', + 'antlr-python', + 'antlr-rb', + 'antlr-ruby', + 'apache', + 'apacheconf', + 'apl', + 'applescript', + 'arduino', + 'arexx', + 'as', + 'as3', + 'asm', + 'aspectj', + 'aspx-cs', + 'aspx-vb', + 'asy', + 'asymptote', + 'at', + 'autohotkey', + 'autoit', + 'awk', + 'b3d', + 'basemake', + 'bash', + 'basic', + 'bat', + 'batch', + 'bbcode', + 'bc', + 'befunge', + 'bf', + 'blitzbasic', + 'blitzmax', + 'bmax', + 'bnf', + 'boo', + 'boogie', + 'bplus', + 'brainfuck', + 'bro', + 'bsdmake', + 'bugs', + 'c', + 'c#', + 'c++', + 'c++-objdumb', + 'c-objdump', + 'ca65', + 'cadl', + 'camkes', + 'cbmbas', + 'ceylon', + 'cf3', + 'cfc', + 'cfengine3', + 'cfg', + 'cfm', + 'cfs', + 'chai', + 'chaiscript', + 'chapel', + 'cheetah', + 'chpl', + 'cirru', + 'cl', + 'clay', + 'clipper', + 'clj', + 'cljs', + 'clojure', + 'clojurescript', + 'cmake', + 'cobol', + 'cobolfree', + 'coffee', + 'coffee-script', + 'coffeescript', + 'common-lisp', + 'componentpascal', + 'console', + 'control', + 'coq', + 'cp', + 'cpp', + 'cpp-objdump', + 'cpsa', + 'crmsh', + 'croc', + 'cry', + 'cryptol', + 'csh', + 'csharp', + 'csound', + 'csound-csd', + 'csound-document', + 'csound-orc', + 'csound-sco', + 'csound-score', + 'css', + 'css+django', + 'css+erb', + 'css+genshi', + 'css+genshitext', + 'css+jinja', + 'css+lasso', + 'css+mako', + 'css+mozpreproc', + 'css+myghty', + 'css+php', + 'css+ruby', + 'css+smarty', + 'cu', + 'cucumber', + 'cuda', + 'cxx-objdump', + 'cypher', + 'cython', + 'd', + 'd-objdump', + 'dart', + 'debcontrol', + 'debsources', + 'delphi', + 'dg', + 'diff', + 'django', + 'docker', + 'dockerfile', + 'dosbatch', + 'doscon', + 'dosini', + 'dpatch', + 'dtd', + 'duby', + 'duel', + 'dylan', + 'dylan-console', + 'dylan-lid', + 'dylan-repl', + 'earl-grey', + 'earlgrey', + 'easytrieve', + 'ebnf', + 'ec', + 'ecl', + 'eg', + 'eiffel', + 'elisp', + 'elixir', + 'elm', + 'emacs', + 'erb', + 'erl', + 'erlang', + 'evoque', + 'ex', + 'exs', + 'ezhil', + 'factor', + 'fan', + 'fancy', + 'felix', + 'fish', + 'fishshell', + 'flx', + 'fortran', + 'fortranfixed', + 'foxpro', + 'fsharp', + 'fy', + 'gap', + 'gas', + 'gawk', + 'genshi', + 'genshitext', + 'gherkin', + 'glsl', + 'gnuplot', + 'go', + 'golo', + 'gooddata-cl', + 'gosu', + 'groff', + 'groovy', + 'gst', + 'haml', + 'handlebars', + 'haskell', + 'haxe', + 'haxeml', + 'hexdump', + 'hs', + 'html', + 'html+cheetah', + 'html+django', + 'html+erb', + 'html+evoque', + 'html+genshi', + 'html+handlebars', + 'html+jinja', + 'html+kid', + 'html+lasso', + 'html+mako', + 'html+myghty', + 'html+php', + 'html+ruby', + 'html+smarty', + 'html+spitfire', + 'html+twig', + 'html+velocity', + 'htmlcheetah', + 'htmldjango', + 'http', + 'hx', + 'hxml', + 'hxsl', + 'hy', + 'hybris', + 'hylang', + 'i6', + 'i6t', + 'i7', + 'idl', + 'idl4', + 'idr', + 'idris', + 'iex', + 'igor', + 'igorpro', + 'ik', + 'inform6', + 'inform7', + 'ini', + 'io', + 'ioke', + 'ipython', + 'ipython2', + 'ipython3', + 'ipythonconsole', + 'irb', + 'irc', + 'isabelle', + 'j', + 'jade', + 'jags', + 'jasmin', + 'jasminxt', + 'java', + 'javascript', + 'javascript+cheetah', + 'javascript+django', + 'javascript+erb', + 'javascript+genshi', + 'javascript+genshitext', + 'javascript+jinja', + 'javascript+lasso', + 'javascript+mako', + 'javascript+mozpreproc', + 'javascript+myghty', + 'javascript+php', + 'javascript+ruby', + 'javascript+smarty', + 'javascript+spitfire', + 'jbst', + 'jcl', + 'jinja', + 'jl', + 'jlcon', + 'jproperties', + 'js', + 'js+cheetah', + 'js+django', + 'js+erb', + 'js+genshi', + 'js+genshitext', + 'js+jinja', + 'js+lasso', + 'js+mako', + 'js+myghty', + 'js+php', + 'js+ruby', + 'js+smarty', + 'js+spitfire', + 'json', + 'json-ld', + 'jsonld', + 'jsonml+bst', + 'jsp', + 'julia', + 'kal', + 'kconfig', + 'kernel-config', + 'kid', + 'koka', + 'kotlin', + 'ksh', + 'lagda', + 'lasso', + 'lassoscript', + 'latex', + 'lcry', + 'lcryptol', + 'lean', + 'less', + 'lhaskell', + 'lhs', + 'lid', + 'lidr', + 'lidris', + 'lighttpd', + 'lighty', + 'limbo', + 'linux-config', + 'liquid', + 'lisp', + 'literate-agda', + 'literate-cryptol', + 'literate-haskell', + 'literate-idris', + 'live-script', + 'livescript', + 'llvm', + 'logos', + 'logtalk', + 'lsl', + 'lua', + 'm2', + 'make', + 'makefile', + 'mako', + 'man', + 'maql', + 'mask', + 'mason', + 'mathematica', + 'matlab', + 'matlabsession', + 'mawk', + 'menuconfig', + 'mf', + 'minid', + 'mma', + 'modelica', + 'modula2', + 'moin', + 'monkey', + 'moo', + 'moocode', + 'moon', + 'moonscript', + 'mozhashpreproc', + 'mozpercentpreproc', + 'mq4', + 'mq5', + 'mql', + 'mql4', + 'mql5', + 'msc', + 'mscgen', + 'mupad', + 'mxml', + 'myghty', + 'mysql', + 'nasm', + 'nawk', + 'nb', + 'nemerle', + 'nesc', + 'newlisp', + 'newspeak', + 'nginx', + 'nim', + 'nimrod', + 'nit', + 'nix', + 'nixos', + 'nroff', + 'nsh', + 'nsi', + 'nsis', + 'numpy', + 'obj-c', + 'obj-c++', + 'obj-j', + 'objc', + 'objc++', + 'objdump', + 'objdump-nasm', + 'objective-c', + 'objective-c++', + 'objective-j', + 'objectivec', + 'objectivec++', + 'objectivej', + 'objectpascal', + 'objj', + 'ocaml', + 'octave', + 'odin', + 'ooc', + 'opa', + 'openbugs', + 'openedge', + 'pacmanconf', + 'pan', + 'parasail', + 'pas', + 'pascal', + 'pawn', + 'pcmk', + 'perl', + 'perl6', + 'php', + 'php3', + 'php4', + 'php5', + 'pig', + 'pike', + 'pkgconfig', + 'pl', + 'pl6', + 'plpgsql', + 'po', + 'posh', + 'postgres', + 'postgres-console', + 'postgresql', + 'postgresql-console', + 'postscr', + 'postscript', + 'pot', + 'pov', + 'powershell', + 'praat', + 'progress', + 'prolog', + 'properties', + 'proto', + 'protobuf', + 'ps1', + 'ps1con', + 'psm1', + 'psql', + 'puppet', + 'py', + 'py3', + 'py3tb', + 'pycon', + 'pypy', + 'pypylog', + 'pyrex', + 'pytb', + 'python', + 'python3', + 'pyx', + 'qbasic', + 'qbs', + 'qml', + 'qvt', + 'qvto', + 'r', + 'racket', + 'ragel', + 'ragel-c', + 'ragel-cpp', + 'ragel-d', + 'ragel-em', + 'ragel-java', + 'ragel-objc', + 'ragel-rb', + 'ragel-ruby', + 'raw', + 'rb', + 'rbcon', + 'rconsole', + 'rd', + 'rebol', + 'red', + 'red/system', + 'redcode', + 'registry', + 'resource', + 'resourcebundle', + 'rest', + 'restructuredtext', + 'rexx', + 'rhtml', + 'rkt', + 'roboconf-graph', + 'roboconf-instances', + 'robotframework', + 'rout', + 'rql', + 'rsl', + 'rst', + 'rts', + 'ruby', + 'rust', + 's', + 'sage', + 'salt', + 'sass', + 'sc', + 'scala', + 'scaml', + 'scheme', + 'scilab', + 'scm', + 'scss', + 'sh', + 'shell', + 'shell-session', + 'shen', + 'slim', + 'sls', + 'smali', + 'smalltalk', + 'smarty', + 'sml', + 'snobol', + 'sources.list', + 'sourceslist', + 'sp', + 'sparql', + 'spec', + 'spitfire', + 'splus', + 'sql', + 'sqlite3', + 'squeak', + 'squid', + 'squid.conf', + 'squidconf', + 'ssp', + 'st', + 'stan', + 'supercollider', + 'sv', + 'swift', + 'swig', + 'systemverilog', + 'tads3', + 'tap', + 'tcl', + 'tcsh', + 'tcshcon', + 'tea', + 'termcap', + 'terminfo', + 'terraform', + 'tex', + 'text', + 'tf', + 'thrift', + 'todotxt', + 'trac-wiki', + 'trafficscript', + 'treetop', + 'ts', + 'turtle', + 'twig', + 'typescript', + 'udiff', + 'urbiscript', + 'v', + 'vala', + 'vapi', + 'vb.net', + 'vbnet', + 'vctreestatus', + 'velocity', + 'verilog', + 'vfp', + 'vgl', + 'vhdl', + 'vim', + 'winbatch', + 'winbugs', + 'x10', + 'xbase', + 'xml', + 'xml+cheetah', + 'xml+django', + 'xml+erb', + 'xml+evoque', + 'xml+genshi', + 'xml+jinja', + 'xml+kid', + 'xml+lasso', + 'xml+mako', + 'xml+myghty', + 'xml+php', + 'xml+ruby', + 'xml+smarty', + 'xml+spitfire', + 'xml+velocity', + 'xq', + 'xql', + 'xqm', + 'xquery', + 'xqy', + 'xslt', + 'xten', + 'xtend', + 'xul+mozpreproc', + 'yaml', + 'yaml+jinja', + 'zephir', +); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php new file mode 100644 index 00000000..54f73d15 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php @@ -0,0 +1,14 @@ +<?php +if ( function_exists( 'wfLoadExtension' ) ) { + wfLoadExtension( 'SyntaxHighlight_GeSHi' ); + // Keep i18n globals so mergeMessageFileList.php doesn't break + $wgMessagesDirs['SyntaxHighlight_GeSHi'] = __DIR__ . '/i18n'; + /* wfWarn( + 'Deprecated PHP entry point used for SyntaxHighlight_GeSHi extension. ' + 'Please use wfLoadExtension instead, ' . + 'see https://www.mediawiki.org/wiki/Extension_registration for more details.' + ); */ + return; +} else { + die( 'This version of the SyntaxHighlight_GeSHi extension requires MediaWiki 1.25+' ); +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/composer.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/composer.json new file mode 100644 index 00000000..12557914 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/composer.json @@ -0,0 +1,47 @@ +{ + "name": "mediawiki/syntax-highlight", + "description": "Syntax highlighting extension for MediaWiki", + "require-dev": { + "jakub-onderka/php-parallel-lint": "1.0.0", + "mediawiki/mediawiki-codesniffer": "18.0.0", + "jakub-onderka/php-console-highlighter": "0.3.2", + "mediawiki/minus-x": "0.3.1", + "mediawiki/mediawiki-phan-config": "0.2.0" + }, + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Brion Vibber", + "email": "brion@wikimedia.org" + }, + { + "name": "Niklas Laxström", + "email": "nlaxstrom@wikimedia.org" + }, + { + "name": "Ori Livneh", + "email": "ori@wikimedia.org" + }, + { + "name": "Rob Church" + }, + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + } + ], + "scripts": { + "fix": [ + "phpcbf", + "minus-x fix ." + ], + "test": [ + "parallel-lint . --exclude vendor --exclude node_modules", + "phpcs -p -s", + "minus-x check ." + ] + }, + "extra": { + "phan-taint-check-plugin": "1.2.0" + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/extension.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/extension.json new file mode 100644 index 00000000..4e7d5c0e --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/extension.json @@ -0,0 +1,76 @@ +{ + "name": "SyntaxHighlight", + "version": "2.0", + "author": [ + "Brion Vibber", + "Tim Starling", + "Rob Church", + "Niklas Laxström", + "Ori Livneh", + "Ed Sanders" + ], + "url": "https://www.mediawiki.org/wiki/Extension:SyntaxHighlight", + "descriptionmsg": "syntaxhighlight-desc", + "license-name": "GPL-2.0-or-later", + "type": "parserhook", + "requires": { + "MediaWiki": ">= 1.31" + }, + "MessagesDirs": { + "SyntaxHighlight_GeSHi": [ + "i18n" + ] + }, + "AutoloadClasses": { + "SyntaxHighlight": "includes/SyntaxHighlight.php", + "SyntaxHighlight_GeSHi": "includes/SyntaxHighlight.php", + "GeSHi": "includes/GeSHi.php", + "SyntaxHighlightAce": "includes/SyntaxHighlightAce.php", + "SyntaxHighlightGeSHiCompat": "includes/SyntaxHighlightGeSHiCompat.php", + "ResourceLoaderSyntaxHighlightVisualEditorModule": "includes/ResourceLoaderSyntaxHighlightVisualEditorModule.php" + }, + "ResourceFileModulePaths": { + "localBasePath": "modules", + "remoteExtPath": "SyntaxHighlight_GeSHi/modules" + }, + "ResourceModules": { + "ext.pygments": { + "targets": [ + "desktop", + "mobile" + ], + "styles": [ + "pygments.generated.css", + "pygments.wrapper.css" + ] + } + }, + "Hooks": { + "ParserFirstCallInit": [ + "SyntaxHighlight::onParserFirstCallInit" + ], + "ContentGetParserOutput": [ + "SyntaxHighlight::onContentGetParserOutput" + ], + "ApiFormatHighlight": [ + "SyntaxHighlight::onApiFormatHighlight" + ], + "ResourceLoaderRegisterModules": [ + "SyntaxHighlight::onResourceLoaderRegisterModules" + ] + }, + "SyntaxHighlightModels": { + "css": "css", + "javascript": "javascript" + }, + "VisualEditorPluginModules": [ + "ext.geshi.visualEditor" + ], + "config": { + "PygmentizePath": false + }, + "TrackingCategories": [ + "syntaxhighlight-error-category" + ], + "manifest_version": 1 +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ady-cyrl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ady-cyrl.json new file mode 100644 index 00000000..9ec3c24d --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ady-cyrl.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "GR44 Luc", + "TheRossatron" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Код", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Бзэ" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/af.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/af.json new file mode 100644 index 00000000..ec5aca1e --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/af.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Naudefj", + "SPQRobin", + "පසිඳු කාවින්ද", + "Oesjaar", + "Fwolff" + ] + }, + "syntaxhighlight-error-category": "Bladsye met foute in sinktaksverligting", + "syntaxhighlight-error-category-desc": "Daar was 'n fout met verligting van kode wat op die bladsy ingesluit is.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kode", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Taal", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Geen)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Wys lynnommers", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kodeblok", + "syntaxhighlight-error-unknown-language": "Onbekende taal \"$1\"" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/an.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/an.json new file mode 100644 index 00000000..0cc17957 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/an.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Juanpabl" + ] + }, + "syntaxhighlight-desc": "Premite o resalte sintactico <code><syntaxhighlight></code> usando [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ar.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ar.json new file mode 100644 index 00000000..d5d34820 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ar.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Meno25", + "زكريا", + "Mr. Ibrahem", + "ديفيد" + ] + }, + "syntaxhighlight-desc": "يوفر تمييزا لتركيب <code><syntaxhighlight></code> باستخدام [http://pygments.org/ Pygments - Python syntax highlighter]", + "syntaxhighlight-error-category": "صفحات بها أخطاء في تعليم الصيغة", + "syntaxhighlight-error-category-desc": "كان هناك خطأ عند محاولة لتسليط الضوء على الكود المدرجة في الصفحة.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "الكود", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "اللغة", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(لا شيء)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "إظهار أرقام الخطوط", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "رقم سطر البدء", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "نص خام", + "syntaxhighlight-error-pygments-invocation-failure": "فشل استدعاء Pygments", + "syntaxhighlight-error-unknown-language": "لغة غير معروفة \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "يتجاوز حجم الكود البالغ $1 {{PLURAL:$1|بايت}} الحد الأقصى المسموح به وهو $2 {{PLURAL:$2|بايت}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/arz.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/arz.json new file mode 100644 index 00000000..daaf98cd --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/arz.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Meno25", + "Ramsis II" + ] + }, + "syntaxhighlight-desc": "بيوفر تظليل السينتاكس <code><syntaxhighlight></code> باستعمال [http://pygments.org/ GeSHi مظلل]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ast.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ast.json new file mode 100644 index 00000000..bec3606a --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ast.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Esbardu", + "Xuacu" + ] + }, + "syntaxhighlight-desc": "Proporciona resaltáu de sintaxis <code><syntaxhighlight></code> usando [http://pygments.org/ Pygments - Resaltador de sintaxis en Python]", + "syntaxhighlight-error-category": "Páxines con errores de resaltáu de sintaxis", + "syntaxhighlight-error-category-desc": "Hebo un error al intentar resaltar el códigu incluyíu na páxina.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Códigu", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Llingua", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(nengún)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Amosar númberos de llinia", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Númberu de llinia de principiu", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Bloque de códigu", + "syntaxhighlight-error-pygments-invocation-failure": "Fallu al llamar a Pygments", + "syntaxhighlight-error-unknown-language": "Llingua «$1» desconocida", + "syntaxhighlight-error-exceeds-size-limit": "El tamañu del códigu $1 {{PLURAL:$1|bytes}} supera'l máximu permitíu de $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/az.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/az.json new file mode 100644 index 00000000..7fef3e81 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/az.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Wertuose" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(heç biri)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kodlaşdırma fraqmenti" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ba.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ba.json new file mode 100644 index 00000000..c9154482 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ba.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Assele" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ Pygments] ярҙамында синтаксисты айырып күрһәтеү өсөн <code><syntaxhighlight></code> билдәһен ҡулланыу мөмкинлеген бирә" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bcc.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bcc.json new file mode 100644 index 00000000..adff460e --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bcc.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Mostafadaneshvar" + ] + }, + "syntaxhighlight-desc": "ساختار پررنگی آریت <code><syntaxhighlight></code> گون استفاده چه[http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be-tarask.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be-tarask.json new file mode 100644 index 00000000..408536ab --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be-tarask.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "EugeneZelenko", + "Jim-by", + "Red Winged Duck" + ] + }, + "syntaxhighlight-desc": "Дазваляе выкарыстоўваць тэг <code><syntaxhighlight></code> для падсьветкі сынтаксісу з дапамогай [http://pygments.org/ Pygments]", + "syntaxhighlight-error-category-desc": "Адбылася памылка пры спробе вылучыць код на старонцы.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Блёк коду" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be.json new file mode 100644 index 00000000..86b413fa --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Artsiom91" + ] + }, + "syntaxhighlight-error-category": "Старонкі з памылкамі падсветкі сінтаксіса", + "syntaxhighlight-error-category-desc": "Пры спробе дадаць падсветку сінтаксісу на старонцы адбылася памылка" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bg.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bg.json new file mode 100644 index 00000000..44e87ad5 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bg.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Borislav", + "DCLXVI", + "Turin", + "Лорд Бъмбъри", + "StanProg" + ] + }, + "syntaxhighlight-desc": "Осигурява синтактично осветяване на <code><syntaxhighlight></code> чрез [http://pygments.org/ Pygments]", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Език", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Блок с код", + "syntaxhighlight-error-unknown-language": "Непознат език „$1“" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bn.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bn.json new file mode 100644 index 00000000..8660096c --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bn.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Zaheen", + "Aftabuzzaman", + "Jim Carter", + "Sayma Jahan" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ Pygments - পাইথন সিনট্যাক্স হাইলাইটার] ব্যবহার করে <code><syntaxhighlight></code> সিনট্যাক্স আলোকপাতের ক্ষমতা দেয়", + "syntaxhighlight-error-category": "সিনট্যাক্স আলোকপাতকরণ ত্রুটিসহ পাতা", + "syntaxhighlight-error-category-desc": "অন্তর্ভুক্ত পাতায় কোড আলোকপাত করার চেষ্টা করার সময় একটি ত্রুটি হয়েছিল।", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "কোড", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "ভাষা", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(কিছু না)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "সারির নম্বর প্রদর্শন", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "শুরুর লাইনের নম্বর", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "কোড ব্লক", + "syntaxhighlight-error-pygments-invocation-failure": "Pygments আবাহন করতে ব্যর্থ হয়েছে", + "syntaxhighlight-error-unknown-language": "অজানা ভাষা \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "কোডের আকার $1 {{PLURAL:$1|বাইট}} যা সর্বাধিক অনুমোদিত পরিমাণ $2 {{PLURAL:$2|বাইটকে}} অতিক্রম করেছে।" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/br.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/br.json new file mode 100644 index 00000000..64137653 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/br.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Fulup" + ] + }, + "syntaxhighlight-desc": "Talvezout a ra da lakaat an ereadur war wel dre ar valizenn <code><syntaxhighlight></code> en ur ober gant [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bs.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bs.json new file mode 100644 index 00000000..9a58968c --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bs.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "CERminator", + "Semso98", + "Srdjan m" + ] + }, + "syntaxhighlight-desc": "Omogućava isticanje sintakse <code><source></code> uz pomoć [http://pygments.org/ Pygments - Python syntax highlighter]", + "syntaxhighlight-error-category": "Stranice s greškama u isticanju sintakse", + "syntaxhighlight-error-category-desc": "Došlo je do greške pri pokušaju da se istakne kôd koji je uključen na stranici.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kôd", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Jezik", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(nijedan)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Prikaži brojeve redova", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Broj početnog reda", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Računarski kôd", + "syntaxhighlight-error-pygments-invocation-failure": "Nisam uspio pozvati Pygments", + "syntaxhighlight-error-unknown-language": "Nepoznat jezik \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "Trenutna veličina kôda ($1 {{PLURAL:$1|bajt|bajta|bajtova}}) prekoračava gornju granicu od $2 {{PLURAL:$1|bajt|bajta|bajtova}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ca.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ca.json new file mode 100644 index 00000000..a195b710 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ca.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "SMP", + "Solde", + "Macofe", + "Annamerida", + "Vriullop" + ] + }, + "syntaxhighlight-desc": "Proveeix de ressaltat sintàctic amb l'etiqueta <code><syntaxhighlight></code> usant el programa [http://pygments.org/ GeSHi]", + "syntaxhighlight-error-category": "Pàgines amb errors de marcatge de sintaxi", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Codi", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Mostra els números de línia", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Bloc de codi" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ce.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ce.json new file mode 100644 index 00000000..5fcea208 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ce.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "Sasan700", + "Умар" + ] + }, + "syntaxhighlight-desc": "Таро хуьлуьйту тег <code><syntaxhighlight></code> лело [http://pygments.org/ Pygments] гӀоьнца синтаксисан бос хилийта", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Код", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Мотт", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Кодан блок", + "syntaxhighlight-error-unknown-language": "Боьвзуш боцу мотт \"$1\"" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ckb.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ckb.json new file mode 100644 index 00000000..3ce81849 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ckb.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Pirehelokan", + "Sarchia" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(ھیچ)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "ژمارەی دێڕەکان پیشان بدە", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "بلۆکی کۆد" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/cs.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/cs.json new file mode 100644 index 00000000..d06f501b --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/cs.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Li-sung", + "Matěj Grabovský", + "Mormegil", + "Matěj Suchánek" + ] + }, + "syntaxhighlight-desc": "Poskytuje zvýrazňování syntaxe <code><syntaxhighlight></code> pomocí [http://pygments.org Pygments – zvýrazňovače syntaxe v Pythonu]", + "syntaxhighlight-error-category": "Stránky s chybami ve zvýrazňování kódu", + "syntaxhighlight-error-category-desc": "Při pokusu o zvýraznění kódu na stránce došlo k chybě.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kód", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Jazyk", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(žádný)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Zobrazit čísla řádků", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Počáteční číslo řádku", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Blok kódu", + "syntaxhighlight-error-pygments-invocation-failure": "Nepodařilo se zavolat Pygments", + "syntaxhighlight-error-unknown-language": "Neznámý jazyk „$1“", + "syntaxhighlight-error-exceeds-size-limit": "Kód o velikosti $1 {{PLURAL:$1|bajt|bajty|bajtů}} přesahuje dovolené maximum $2 {{PLURAL:$2|bajt|bajty|bajtů}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/da.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/da.json new file mode 100644 index 00000000..262c4d37 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/da.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Christian List", + "Sarrus" + ] + }, + "syntaxhighlight-desc": "Giver syntaksfremhævning <code><syntaxhighlight></code> ved brug af [http://pygments.org/ GeSHi - Generic Syntax Highlighter]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/de.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/de.json new file mode 100644 index 00000000..3e437a06 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/de.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Kghbln", + "Raimond Spekking", + "Metalhead64" + ] + }, + "syntaxhighlight-desc": "Ergänzt das Tag <code><syntaxhighlight></code> zur Syntaxhervorhebung mit Hilfe des [http://pygments.org/ Python-Syntax-Highlighters „Pygments“]", + "syntaxhighlight-error-category": "Seiten mit Syntaxhervorhebungsfehlern", + "syntaxhighlight-error-category-desc": "Es gab einen Fehler bei der Syntaxhervorhebung des auf der Seite eingebetteten Codes.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Code", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Sprache", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Keine)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Zeilennummern anzeigen", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Startzeilennummer", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Codeblock", + "syntaxhighlight-error-pygments-invocation-failure": "Fehler beim Aufrufen von Pygments", + "syntaxhighlight-error-unknown-language": "Unbekannte Sprache „$1“", + "syntaxhighlight-error-exceeds-size-limit": "Die Codegröße von {{PLURAL:$1|einem Byte|$1 Bytes}} überschreitet das erlaubte Maximum von {{PLURAL:$2|einem Byte|$2 Bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/diq.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/diq.json new file mode 100644 index 00000000..c29ce696 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/diq.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Aspar", + "Mirzali", + "Kumkumuk" + ] + }, + "syntaxhighlight-desc": "pê şuxulnayişê [http://pygments.org/ Pygments] i rêza <code><syntaxhighlight></code> i işaret beno", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kod", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Zıwan", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(çıniyo)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Xeta nımreyan bıasne", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Bloğê kodi", + "syntaxhighlight-error-unknown-language": "Nêzaniyaye zıwan \"$1\"" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/dsb.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/dsb.json new file mode 100644 index 00000000..f9f1c542 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/dsb.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "syntaxhighlight-desc": "Zmóžnja syntaksowe wuzwignjenje <code><syntaxhighlight></code> z pomocu [http://pygments.org/ rěda Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/el.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/el.json new file mode 100644 index 00000000..aedf6ad0 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/el.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Badseed", + "Consta", + "Dead3y3", + "ZaDiak", + "Stam.nikos", + "Geraki" + ] + }, + "syntaxhighlight-desc": "Παρέχει επισήμανση σύνταξης <code><syntaxhighlight></code> χρησιμοποιώντας το [http://pygments.org/ Pygments - Python syntax highlighter]", + "syntaxhighlight-error-category": "Σελίδες με σφάλματα επισήμανσης σύνταξης", + "syntaxhighlight-error-category-desc": "Υπήρξε σφάλμα κατά την επισήμανση κώδικα που περιλαμβάνεται στη σελίδα.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Κώδικας", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Γλώσσα", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(καμία)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Εμφάνιση αρίθμησης γραμμών", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Κομμάτι κώδικα", + "syntaxhighlight-error-pygments-invocation-failure": "Αποτυχία κλήσης Pygments", + "syntaxhighlight-error-unknown-language": "Άγνωστη γλώσσα \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "Το μέγεθος κώδικα $1 {{PLURAL:$1|bytes}} υπερβαίνει το μέγιστο επιτρεπτό $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/en.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/en.json new file mode 100644 index 00000000..92a340e7 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/en.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Brion Vibber", + "Ed Sanders" + ] + }, + "syntaxhighlight-desc": "Provides syntax highlighting <code><syntaxhighlight></code> using [http://pygments.org/ Pygments - Python syntax highlighter]", + "syntaxhighlight-error-category": "Pages with syntax highlighting errors", + "syntaxhighlight-error-category-desc": "There was an error when attempting to highlight code included on the page.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Code", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Language", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(None)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Show line numbers", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Starting line number", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Code block", + "syntaxhighlight-error-pygments-invocation-failure": "Failed to invoke Pygments", + "syntaxhighlight-error-unknown-language": "Unknown language \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "Code size of $1 {{PLURAL:$1|bytes}} exceeds allowed maximum of $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eo.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eo.json new file mode 100644 index 00000000..908f5347 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eo.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Michawiki", + "Yekrats" + ] + }, + "syntaxhighlight-desc": "Provizas kolorigado de sintakso <code><syntaxhighlight></code> per [http://pygments.org/ GeSHi Kolorigilo de Sintakso]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/es.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/es.json new file mode 100644 index 00000000..a943d484 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/es.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Crazymadlover", + "Muro de Aguas", + "Remember the dot", + "Sanbec", + "Macofe", + "Chris TR", + "Fitoschido" + ] + }, + "syntaxhighlight-desc": "Permite resaltar el código fuente usando la etiqueta <code><syntaxhighlight></code>. Esta extensión usa [http://pygments.org/ Pygments - Resaltador de sintaxis en Python]", + "syntaxhighlight-error-category": "Páginas con errores de resaltado de sintaxis", + "syntaxhighlight-error-category-desc": "Hubo un error al intentar resaltar el código que se incluye en la página.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Código", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Lenguaje", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Ninguno)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Mostrar números de línea", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Número de renglón inicial", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Segmento de código", + "syntaxhighlight-error-pygments-invocation-failure": "Error al invocar Pygments", + "syntaxhighlight-error-unknown-language": "Lenguaje desconocido \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "El tamaño del código ($1 {{PLURAL:$1|bytes}}) supera el máximo permitido ($2 {{PLURAL:$2|bytes}})" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/et.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/et.json new file mode 100644 index 00000000..960aabb9 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/et.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Pikne", + "[[et:Kasutaja:M2s17]]" + ] + }, + "syntaxhighlight-desc": "Võimaldab [http://pygments.org/ Pygmentsi] (Pythoni-põhine süntaksi esiletõstja) ja sildi <code><syntaxhighlight></code> abil süntaksit esile tõsta.", + "syntaxhighlight-error-category": "Süntaksi esiletõstu tõrgetega leheküljed", + "syntaxhighlight-error-category-desc": "Leheküljel prooviti koodi esile tõsta, kuid esines tõrge.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kood", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Keel", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Näita reanumbreid", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Koodiplokk", + "syntaxhighlight-error-pygments-invocation-failure": "Teeki Pygments ei õnnestunud käivitada.", + "syntaxhighlight-error-unknown-language": "Tundmatu keel \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "Koodi suurus $1 {{PLURAL:$1|bait|baiti}} ületab lubatud $2 {{PLURAL:$2|baidist}} ülemmäära." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eu.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eu.json new file mode 100644 index 00000000..4fd51247 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eu.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "An13sa", + "Sator" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kodea", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Hizkuntza", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Bat ere ez)" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fa.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fa.json new file mode 100644 index 00000000..eefef832 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fa.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Ebraminio", + "Huji", + "Reza1615" + ] + }, + "syntaxhighlight-desc": "امکان رنگین کردن دستورات <code><syntaxhighlight></code> با استفاده از [http://pygments.org/ Pygments] را فراهم میآورد", + "syntaxhighlight-error-category": "صفحههای دارای خطای سینتکسهایلایت", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "کد", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "زبان", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "نشاندادن شماره خطوط" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fi.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fi.json new file mode 100644 index 00000000..a2515052 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fi.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Crt", + "Nike", + "Stryn", + "Pyscowicz" + ] + }, + "syntaxhighlight-desc": "Mahdollistaa syntaksin korostuksen [http://pygments.org/ Pygments - Python -syntaksin korostimella]", + "syntaxhighlight-error-category": "Sivut, joissa on syntaksin korostusvirhe", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Koodi", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Kieli", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Näytä rivinumerot", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Alkaen riviltä", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Koodipätkä", + "syntaxhighlight-error-unknown-language": "Tuntematon kieli: \"$1\"" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fr.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fr.json new file mode 100644 index 00000000..2ae2d46f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fr.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Grondin", + "Sherbrooke", + "Verdy p", + "Macofe", + "Mattho69", + "Dcausse", + "Orlodrim", + "Wladek92", + "Gomoko" + ] + }, + "syntaxhighlight-desc": "Fournit la mise en valeur de la syntaxe par la balise <code><syntaxhighlight></code> en utilisant [http://pygments.org/ Pygments - coloration syntaxique Python]", + "syntaxhighlight-error-category": "Pages avec des erreurs de coloration syntaxique", + "syntaxhighlight-error-category-desc": "Il y a eu une erreur lors de la tentative de mise en valeur du code inclus sur la page.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Code", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Langage", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(aucun)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Afficher les numéros de ligne", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Numéro de ligne de début", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Bloc de code", + "syntaxhighlight-error-pygments-invocation-failure": "Impossible d'appeler Pygments", + "syntaxhighlight-error-unknown-language": "Langue inconnue \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "Code de taille $1 {{PLURAL:$1|octets}} qui dépasse le maximum autorisé $2 {{PLURAL:$2|octets}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/frp.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/frp.json new file mode 100644 index 00000000..a0f5611e --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/frp.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "ChrisPtDe" + ] + }, + "syntaxhighlight-desc": "Balye la misa en èvidence de la sintaxa per la balisa <code><syntaxhighlight></code> en utilisent [http://pygments.org/ la coloracion sintaxica GeSHi]." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gl.json new file mode 100644 index 00000000..f57fefb9 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gl.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Toliño", + "Xosé", + "Elisardojm", + "Banjo" + ] + }, + "syntaxhighlight-desc": "Proporciona unha sintaxe resaltada <code><syntaxhighlight></code> usando [http://pygments.org/ Pygments - Resaltador de sintaxe en Python]", + "syntaxhighlight-error-category": "Páxinas con erros de sintaxe resaltados", + "syntaxhighlight-error-category-desc": "Houbo un erro ó intentar resaltar o código incluído na páxina.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Código", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Lingua", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(ningún)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Mostrar números de liña", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Número de liña de comezo", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Segmento de código", + "syntaxhighlight-error-pygments-invocation-failure": "Erro ó invocar Pygments", + "syntaxhighlight-error-unknown-language": "Lingua descoñecida \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "O tamaño de código $1 {{PLURAL:$1|bytes}} supera o máximo permitido de $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-deva.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-deva.json new file mode 100644 index 00000000..a48938ad --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-deva.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Vaishali Parab" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "कोड", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "भास", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "कोड ब्लॉक", + "syntaxhighlight-error-unknown-language": "अनवळखी भास \"$1\"" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-latn.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-latn.json new file mode 100644 index 00000000..ab2ab696 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-latn.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "The Discoverer" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Code", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Bhas", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Code blok", + "syntaxhighlight-error-unknown-language": "Onollkhi bhas \"$1\"" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gsw.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gsw.json new file mode 100644 index 00000000..97127fa2 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gsw.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Als-Holder" + ] + }, + "syntaxhighlight-desc": "Syntax firihebe <code><syntaxhighlight></code> mit Hilf vum [http://pygments.org/ GeSHi-Highlighter]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/he.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/he.json new file mode 100644 index 00000000..48c2782f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/he.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Guycn2", + "Rotem Liss", + "Amire80" + ] + }, + "syntaxhighlight-desc": "אפשרות לסימון קוד מקור בצבעים עם התגית <code><syntaxhighlight></code> באמצעות [http://pygments.org/ Pygments – צובע קוד בשפת Python]", + "syntaxhighlight-error-category": "דפים עם שגיאות בצביעת קוד", + "syntaxhighlight-error-category-desc": "אירעה שגיאה בעת ניסיון לצבוע קוד שכלול בדף.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "קוד", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "שפה", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(אין)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "להציג מספרי שורות", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "מספר שורה ראשונה", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "גוש קוד", + "syntaxhighlight-error-pygments-invocation-failure": "הרצת Pygments לא עבדה", + "syntaxhighlight-error-unknown-language": "השפה \"$1\" אינה ידועה", + "syntaxhighlight-error-exceeds-size-limit": "גודל קוד של {{PLURAL:$1|בית אחד|$1 בתים}} עובר את המגבלה של {{PLURAL:$2|בית אחד|$2 בתים}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hi.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hi.json new file mode 100644 index 00000000..672948f0 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hi.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Kaustubh", + "Shyam", + "Siddhartha Ghai" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ GeSHi - Generic Syntax Highlighter] प्रयोग द्वारा <code><syntaxhighlight></code> सिंटेक्स हाइलाइट करने का स्वरूपण प्रदान करता है" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hr.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hr.json new file mode 100644 index 00000000..224c38f8 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hr.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Dalibor Bosits", + "Roberta F.", + "SpeedyGonsales", + "MaGa", + "Bugoslav" + ] + }, + "syntaxhighlight-desc": "Omogućava bojanje sintakse <code><syntaxhighlight></code> korištenjem [http://pygments.org/ Pygments-a]", + "syntaxhighlight-error-category": "Stranice s pogrješkama u isticanju sintakse", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kôd", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Jezik", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Prikaži brojeve redova", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Broj početnog reda", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Računalni kôd" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hsb.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hsb.json new file mode 100644 index 00000000..b85463de --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hsb.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "syntaxhighlight-desc": "Syntaksowe wuzběhnjenje <code><syntaxhighlight></code> z pomocu rozšěrjenja [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ht.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ht.json new file mode 100644 index 00000000..26c44617 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ht.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Bfpage" + ] + }, + "syntaxhighlight-desc": "Ofri sentaks eklèrsisaj <code><syntaxhighlight></code> using [http://pygments.org/ Pygments - Python syntax highlighter]", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kòd", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Lang", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kòd blòk" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hu.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hu.json new file mode 100644 index 00000000..1e41b54b --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hu.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Dani", + "Tacsipacsi", + "Urbalazs" + ] + }, + "syntaxhighlight-desc": "Lehetőséget nyújt szintaxiskiemelésre a <code><syntaxhighlight></code> tag-gel, a [http://pygments.org/ Pygments - Python kódkiemelő] használatával", + "syntaxhighlight-error-category": "Lapok kódkiemelési hibákkal", + "syntaxhighlight-error-category-desc": "Hiba történt a lapon található kód kiemelése közben.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kód", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Nyelv", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Mutassa a sorszámozást", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Kezdő sor száma", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kódblokk", + "syntaxhighlight-error-pygments-invocation-failure": "A Pygments meghívása sikertelen", + "syntaxhighlight-error-unknown-language": "Ismeretlen „$1” nyelv", + "syntaxhighlight-error-exceeds-size-limit": "A kód mérete $1 bájt, ami meghaladja az engedélyezett maximális $2 bájtot" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hy.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hy.json new file mode 100644 index 00000000..b07d7204 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hy.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Դավիթ Սարոյան" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Կոդ", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Լեզու", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(ոչ մի)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Ցույց տալ տողերի թիվը", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Առաջին տողի թիվը", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Կոդի հատված", + "syntaxhighlight-error-unknown-language": "Անհայտ լեզու «$1»" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ia.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ia.json new file mode 100644 index 00000000..3b776dba --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ia.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "McDutchie" + ] + }, + "syntaxhighlight-desc": "Forni le coloration syntactic in <code><syntaxhighlight></code> per medio de [http://pygments.org/ Pygments - colorator syntactic pro Python]", + "syntaxhighlight-error-category": "Paginas con errores de coloration syntactic", + "syntaxhighlight-error-category-desc": "Un error occurreva durante le coloration del codice includite in le pagina." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/id.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/id.json new file mode 100644 index 00000000..1fbd4825 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/id.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "IvanLanin" + ] + }, + "syntaxhighlight-desc": "Memberikan penyorotan sintaks <code><syntaxhighlight></code> menggunakan [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ie.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ie.json new file mode 100644 index 00000000..68dd3058 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ie.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Renan" + ] + }, + "syntaxhighlight-desc": "Provide superation de sintaxe de li code fonte, che li element <code><syntaxhighlight></code>, usant li [http://pygments.org/ GeSHi - Generic Syntax Highlighter]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ilo.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ilo.json new file mode 100644 index 00000000..bac555d9 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ilo.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Lam-ang" + ] + }, + "syntaxhighlight-desc": "Mangited ti panangimaris ti eskritu <code><syntaxhighlight></code> nga agus-usar iti [http://pygments.org/ GeSHi - Generic Syntax Highlighter]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/is.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/is.json new file mode 100644 index 00000000..c660e0ad --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/is.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Snævar" + ] + }, + "syntaxhighlight-error-category-desc": "Villa átti sér stað við yfirstrikun kóða sem er innifalinn á síðunni.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kóði", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Tungumál", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(ekkert)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Sýna línu númer", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kóða reitur", + "syntaxhighlight-error-pygments-invocation-failure": "Gat ekki kallað á Pygments", + "syntaxhighlight-error-unknown-language": "Óþekkt tungumál \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "Kóðinn er $1 {{PLURAL:$1|bæti}} sem er lengra en hámarslengdin, $2 {{PLURAL:$2|bæti}}, segir til um" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/it.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/it.json new file mode 100644 index 00000000..976442ac --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/it.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "BrokenArrow", + "Macofe", + "Beta16" + ] + }, + "syntaxhighlight-desc": "Evidenzia la sintassi dei linguaggi di programmazione <code><syntaxhighlight></code> tramite [http://pygments.org/ Pygments - evidenziatore della sintassi Python]", + "syntaxhighlight-error-category": "Pagine con errori nell'evidenziazione della sintassi", + "syntaxhighlight-error-category-desc": "Si è verificato un errore durante il tentativo di evidenziare il codice incluso nella pagina.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Codice", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Linguaggio", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(nessuno)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Mostra i numeri di riga", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Numero di linea di partenza", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Blocco di codice", + "syntaxhighlight-error-pygments-invocation-failure": "Errore nell'invocazione di Pygments", + "syntaxhighlight-error-unknown-language": "Linguaggio sconosciuto \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "La dimensione del codice è $1 {{PLURAL:$1|byte}} e supera il massimo consentito che è di $2 {{PLURAL:$2|byte}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ja.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ja.json new file mode 100644 index 00000000..2629f3fd --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ja.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Aotake", + "Fryed-peach", + "JtFuruhata", + "Shirayuki", + "Sujiniku", + "Runequest77", + "Rxy" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ Pygments - Python 構文ハイライト機能] を利用したタグ <code><syntaxhighlight></code> を提供する", + "syntaxhighlight-error-category": "構文ハイライトエラーがあるページ", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "コード", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "言語", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(なし)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "行番号を表示", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "コード" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jut.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jut.json new file mode 100644 index 00000000..c9d7ad51 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jut.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Huslåke", + "Ælsån" + ] + }, + "syntaxhighlight-desc": "Gäv syntaks highlighting <code><syntaxhighlight></code> via [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jv.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jv.json new file mode 100644 index 00000000..7ba459f0 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jv.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Meursault2004" + ] + }, + "syntaxhighlight-desc": "Mènèhaké panyorotan sintaksis <code><syntaxhighlight></code> nganggo [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ka.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ka.json new file mode 100644 index 00000000..a94cbcb5 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ka.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "გიორგიმელა", + "David1010" + ] + }, + "syntaxhighlight-desc": "გაძლევთ ნებართვას ფამოიყენოთ თეგი <code><syntaxhighlight></code> სინტაქსის გასანათებლად[http://pygments.org/ Pygments-ის] მეშვეობით", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "კოდი", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "ენა", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "ხაზების ნომრების ჩვენება", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "კოდის ბლოკი" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kab.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kab.json new file mode 100644 index 00000000..774ea484 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kab.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Belkacem77" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Ulac)" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/km.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/km.json new file mode 100644 index 00000000..a9a6b325 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/km.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Chhorran", + "គីមស៊្រុន" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "កន្សោមកូដ" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kn.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kn.json new file mode 100644 index 00000000..445dd3cc --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kn.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Ananth subray" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "ಸಾಲಿನ ಸಂಖ್ಯೆಗಳನ್ನು ತೋರಿಸಿ" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ko.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ko.json new file mode 100644 index 00000000..4fe65f40 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ko.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Kwj2772", + "ToePeu", + "아라", + "Revi" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ Pygments - Python 구문 강조 기능]을 사용해 <code><syntaxhighlight></code>로 구문 강조를 제공합니다", + "syntaxhighlight-error-category": "구문 강조에 오류가 있는 문서", + "syntaxhighlight-error-category-desc": "문서에 포함된 코드를 강조하기 위해 시도하는 중에 오류가 발생했습니다.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "코드", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "언어", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "줄 번호 보이기", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "코드 상자", + "syntaxhighlight-error-pygments-invocation-failure": "Pygments 호출 실패", + "syntaxhighlight-error-unknown-language": "알 수 없는 언어 \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "$1{{PLURAL:$1|바이트}}의 코드 크기가 $2{{PLURAL:$2|바이트}}의 허용된 최대값을 초과합니다" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ksh.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ksh.json new file mode 100644 index 00000000..de7470c8 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ksh.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Purodha" + ] + }, + "syntaxhighlight-desc": "Deijt — en <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><syntaxhighlight></code>-Affschnedde — de Sünntax fon beschtemmpte Kompjuhter_Schprohche schöhn makehre. Bruch dobei dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Generic Syntax Highlighter\">[http://pygments.org/ GeSHi - Python Syntax Highlighter]</i>.", + "syntaxhighlight-error-category": "Sigge met Fähler beim bunt Mohle vun de Süntax", + "syntaxhighlight-error-category-desc": "Ene Fähler es opjetrodde beim Versohch, dä Kohd op dä Sigg bunt ze mohle.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kohd", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Schprohch", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(keijn)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Nommer för de Reihje aanzeije", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kaste met Projramm_Kohde udder ähnlesch", + "syntaxhighlight-error-pygments-invocation-failure": "Mer kunnte Pygments nit oprohfe.", + "syntaxhighlight-error-unknown-language": "Di Projrammehr_Schprohch $1 es onbikannt.", + "syntaxhighlight-error-exceeds-size-limit": "Dä Kohd es {{PLURAL:$1|eij <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Byte</i>|$1 <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>|keij <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Byte</i>}} lang un dat es mih wi {{PLURAL:$2|dat zohjelhße eijne <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Byte</i>| de zohjelohße $2 <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>|de zohjelohße Noll <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>}}." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ku-latn.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ku-latn.json new file mode 100644 index 00000000..f3c7d7ab --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ku-latn.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "George Animal" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kod", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Ziman" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lb.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lb.json new file mode 100644 index 00000000..d719aacb --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lb.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Les Meloures", + "Robby", + "Soued031" + ] + }, + "syntaxhighlight-desc": "Syntax-Ervirhiewung <code><syntaxhighlight></code> mat Hëllef vu [http://pygments.org/ 'Pygments']", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Code", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Sprooch", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Keng)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Nummere vun den Zeile weisen", + "syntaxhighlight-error-unknown-language": "Onbekannt Sprooch \"$1\"" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/li.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/li.json new file mode 100644 index 00000000..1467db63 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/li.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Ooswesthoesbes" + ] + }, + "syntaxhighlight-desc": "Guf syntaxismarkering <code><syntaxhighlight></code> gebroekende [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lij.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lij.json new file mode 100644 index 00000000..ec3a0ab8 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lij.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Giromin Cangiaxo" + ] + }, + "syntaxhighlight-error-category": "Paggine con di erroî inte l'evidençiaçion da scintasci", + "syntaxhighlight-error-category-desc": "Gh'è stæto un errô into tentativo d'evidençiâ o codiçe incluso inta paggina." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lki.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lki.json new file mode 100644 index 00000000..c24a3f11 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lki.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Hosseinblue" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "کؤت/کؤد", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "زوون", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(هؤیچ کام)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "نشاندادن شماره خطوط" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lrc.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lrc.json new file mode 100644 index 00000000..d3aa0040 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lrc.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Mogoeilor" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "رازینە", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "زوٙن" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lt.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lt.json new file mode 100644 index 00000000..43959339 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lt.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Garas", + "Homo", + "Matasg" + ] + }, + "syntaxhighlight-desc": "Teikia sintaksės paryškinimus <code><syntaxhighlight></code> naudojant [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lv.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lv.json new file mode 100644 index 00000000..3833dfb5 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lv.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Papuass" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Rādīt rindu numurus", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Koda bloks" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mk.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mk.json new file mode 100644 index 00000000..0c0fbaee --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mk.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Bjankuloski06" + ] + }, + "syntaxhighlight-desc": "Овозможува потцртување на синтакса <code><syntaxhighlight></code> со помош на [http://pygments.org/ Pygments — истакнува на Python-синтакса]", + "syntaxhighlight-error-category": "Страници со грешки при истакнување на синтаксата", + "syntaxhighlight-error-category-desc": "Се појави грешка при обидот да се подвлече кодот вклучен во страницава.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Код", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Јазик", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(ниеден)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Прикажувај броеви на редовите", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Број на почетниот ред", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Коден блок", + "syntaxhighlight-error-pygments-invocation-failure": "Не успеав да го повикам Pygments", + "syntaxhighlight-error-unknown-language": "Непознат јазик „$1“", + "syntaxhighlight-error-exceeds-size-limit": "Големината на кодот од {{PLURAL:$1|еден бајт|$1 бајти}} ја надминува горната граница од {{PLURAL:$2|еден бајт|$2 бајти}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ml.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ml.json new file mode 100644 index 00000000..b59b6862 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ml.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Praveenp", + "Shijualex" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ GeSHi പ്രമുഖമാക്കൽ ഉപകരണമുപയോഗിച്ച്] <code><syntaxhighlight></code> വിന്യാസം പ്രമുഖമാക്കിക്കാട്ടാൻ സഹായിക്കുന്നു" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mr.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mr.json new file mode 100644 index 00000000..72ac2337 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mr.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Kaustubh", + "Mahitgar", + "Shantanoo" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ GeSHi हायलायटर] वापरून सिन्टॅक्स हायलाईट करा <code><syntaxhighlight></code>" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ms.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ms.json new file mode 100644 index 00000000..af7f30f5 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ms.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Aviator" + ] + }, + "syntaxhighlight-desc": "Menyediakan tag <code><syntaxhighlight></code> untuk penonjolan sintaks menggunakan [http://pygments.org/ GeSHi]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mwl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mwl.json new file mode 100644 index 00000000..4b2ed830 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mwl.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "MokaAkashiyaPT", + "Athena in Wonderland" + ] + }, + "syntaxhighlight-error-category": "Páiginas cun erros ne l çtaque de sintaxe" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nb.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nb.json new file mode 100644 index 00000000..4a68f218 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nb.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Jeblad", + "Jon Harald Søby" + ] + }, + "syntaxhighlight-desc": "Gir syntaksframheving <code><syntaxhighlight></code> ved hjelp av [http://pygments.org/ Pygments]", + "syntaxhighlight-error-category": "Sider med feil på syntaksfremheving", + "syntaxhighlight-error-category-desc": "Det oppstod en feil under forsøk på syntaksfremheving inne på siden.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kode", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Språk", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(ingen)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Vis linjenummer", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Første linjenummer", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kodeblokk", + "syntaxhighlight-error-pygments-invocation-failure": "Kunne ikke kalle Pygments", + "syntaxhighlight-error-unknown-language": "Ukjent språk «$1»", + "syntaxhighlight-error-exceeds-size-limit": "Kodestørrelse $1 {{PLURAL:$1|bytes}} er over tillatt maksimum på $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nds.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nds.json new file mode 100644 index 00000000..60f0504f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nds.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Slomox" + ] + }, + "syntaxhighlight-desc": "Syntax-Rutheven <code><syntaxhighlight></code> mit Help vun’n [http://pygments.org/ GeSHi-Highlighter]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nl.json new file mode 100644 index 00000000..9a3bd5f9 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nl.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Siebrand", + "Tvdm", + "Romaine", + "SPQRobin", + "Mainframe98" + ] + }, + "syntaxhighlight-desc": "Voorziet in het markeren van syntaxis voor <code><syntaxhighlight></code> met [http://pygments.org/ Pygments]", + "syntaxhighlight-error-category": "Pagina's met fouten in de syntaxmarkering", + "syntaxhighlight-error-category-desc": "Er ging iets fout tijdens het markeren van de code op de pagina.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Code", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Taal", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Geen)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Toon regelnummers", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Codeblok", + "syntaxhighlight-error-unknown-language": "Onbekende taal \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "Code grootte is $1 {{PLURAL:$1|bytes}} en overschrijdt de maximale waarde van $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nn.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nn.json new file mode 100644 index 00000000..4c91c89e --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nn.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Frokor" + ] + }, + "syntaxhighlight-desc": "Gjev syntaks som framhevar <code><syntaxhighlight></code> ved hjelp av [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/oc.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/oc.json new file mode 100644 index 00000000..e8807338 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/oc.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Cedric31" + ] + }, + "syntaxhighlight-desc": "Provesís la mesa en relèu de la sintaxi per la balisa <code><syntaxhighlight></code> en utilizant [http://pygments.org/ la coloracion sintaxica GeSHi]", + "syntaxhighlight-error-category": "Paginas amb d'errors de coloracion sintaxica", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Lenga" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/olo.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/olo.json new file mode 100644 index 00000000..6e158526 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/olo.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Mashoi7" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Nimidä)" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/om.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/om.json new file mode 100644 index 00000000..9bc20cc0 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/om.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Tumsaa" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Afaan" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pam.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pam.json new file mode 100644 index 00000000..c13b7bb8 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pam.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Leeheonjin" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kodigu", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Amanu/Pamyalita" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pl.json new file mode 100644 index 00000000..0de1ef9a --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pl.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Derbeth", + "Sp5uhe", + "Chrumps", + "PiotrAntosz", + "Woytecr" + ] + }, + "syntaxhighlight-desc": "Zapewnia kolorowanie składni dla znacznika <code><syntaxhighlight></code> wykorzystując [http://pygments.org/ Pygments - Pythonowe kolorowanie składni]", + "syntaxhighlight-error-category": "Strony z błędami podświetlania składni", + "syntaxhighlight-error-category-desc": "Wystąpił błąd podczas próby podświetlenia kodu zawartego na stronie.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kod", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Język", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Brak)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Pokaż numery linii", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Blok kodu", + "syntaxhighlight-error-pygments-invocation-failure": "Nie udało się wywołać Pygments", + "syntaxhighlight-error-unknown-language": "Nierozpoznany język „$1”", + "syntaxhighlight-error-exceeds-size-limit": "Rozmiar kodu równy $1 {{PLURAL:$1|bajt|bajtów}} przekracza dozwolone maksimum $2 {{PLURAL:$2|bajt|bajtów}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pms.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pms.json new file mode 100644 index 00000000..fdf2690e --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pms.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Bèrto 'd Sèra", + "Dragonòt" + ] + }, + "syntaxhighlight-desc": "A evidensia la sintassi <code><syntaxhighlight></code>an dovrand [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ps.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ps.json new file mode 100644 index 00000000..0fccf2db --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ps.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Ahmed-Najib-Biabani-Ibrahimkhel" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "کوډ", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "ژبه", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(هېڅ)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "کوډ بلاک" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt-br.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt-br.json new file mode 100644 index 00000000..534acca1 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt-br.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Helder.wiki", + "He7d3r", + "Felipe L. Ewald" + ] + }, + "syntaxhighlight-desc": "Providencia realce de sintaxe <code><syntaxhighlight></code> usando [http://pygments.org/ Pygments - Marcador de sintaxe Python]", + "syntaxhighlight-error-category": "Páginas com erros de realce de sintaxe", + "syntaxhighlight-error-category-desc": "Ocorreu um erro ao tentar destacar o código incluído na página.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Código", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Idioma", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Nenhum)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Mostrar números de linha", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Número da linha de início", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Bloco de código", + "syntaxhighlight-error-pygments-invocation-failure": "Falha ao invocar Pygments", + "syntaxhighlight-error-unknown-language": "Linguagem \"$1\" desconhecida", + "syntaxhighlight-error-exceeds-size-limit": "O tamanho do código, $1 {{PLURAL:$1|bytes}}, excede o máximo permitido de $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt.json new file mode 100644 index 00000000..c3314168 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Hamilton Abreu", + "Malafaya", + "Vitorvicentevalente", + "He7d3r" + ] + }, + "syntaxhighlight-desc": "Permite o realce sintático de código fonte, através do elemento <code><syntaxhighlight></code>, usando o [http://pygments.org/ realçador de sintaxe Pygments - Python]", + "syntaxhighlight-error-category": "Páginas com erros no destaque de sintaxe", + "syntaxhighlight-error-category-desc": "Ocorreu um erro ao tentar realçar o código incluído na página.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Código", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Língua", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Nenhum)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Mostrar números de linha", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Número de linha inicial", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Bloco de código", + "syntaxhighlight-error-pygments-invocation-failure": "Erro na invocação do Pygments", + "syntaxhighlight-error-unknown-language": "Língua \"$1\" desconhecida", + "syntaxhighlight-error-exceeds-size-limit": "O tamanho do código, $1 {{PLURAL:$1|bytes}}, excede o máximo permitido, $2 {{PLURAL:$2|bytes}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/qqq.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/qqq.json new file mode 100644 index 00000000..e6e25248 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/qqq.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Meno25", + "Shirayuki", + "The Evil IP address", + "Legoktm", + "Umherirrender", + "Liuxinyu970226", + "Robby" + ] + }, + "syntaxhighlight-desc": "{{desc|name=Syntax Highlight GeSHi|url=https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi}}", + "syntaxhighlight-error-category": "Tracking category for pages with syntax highlighting errors", + "syntaxhighlight-error-category-desc": "Description on [[Special:TrackingCategories]] for the {{msg-mw|syntaxhighlight-error-category}} tracking category.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Label for the code input field\n{{Identical|Code}}", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Label for the language field\n{{Identical|Language}}", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "Label of the 'None' option in the language dropdown field\n{{Identical|None}}", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Label for the checkbox to show line numbers", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Label for the starting line field", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Title for the VisualEditor syntax highlighter inspector, above the text area for the code", + "syntaxhighlight-error-pygments-invocation-failure": "Error message shown when the syntax highlighting library failed with an unspecified error", + "syntaxhighlight-error-unknown-language": "Error message shown when the programming language name was not recognized by the syntax highlighting library. Parameters:\n* $1 - the language name", + "syntaxhighlight-error-exceeds-size-limit": "Error message shown when the block of code to be highlighted exceeds the size limit. Parameters:\n* $1 - the size of the code block, in bytes\n* $2 - the maximum size allowed, in bytes." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ro.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ro.json new file mode 100644 index 00000000..f22c08d8 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ro.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "AdiJapan", + "KlaudiuMihaila", + "Stelistcristi", + "Minisarm" + ] + }, + "syntaxhighlight-desc": "Produce evidențierea sintaxei prin eticheta <code><syntaxhighlight></code> folosind [http://pygments.org/ Pygments - evidențiere Python de sintaxă]", + "syntaxhighlight-error-category": "Pagini cu erori de evidențiere a sintaxei", + "syntaxhighlight-error-category-desc": "A apărut o eroare în încercarea de a evidenția codul inclus în această pagină.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Cod", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Limbă", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Arată numărul de linii", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Bloc cod sursă", + "syntaxhighlight-error-pygments-invocation-failure": "Imposibil de apelat Pygments", + "syntaxhighlight-error-unknown-language": "Limba „$1” necunoscută", + "syntaxhighlight-error-exceeds-size-limit": "Dimensiunea codului de $1 {{PLURAL:$1|octet|octeți|de octeți}} depășește maximul permis de $2 {{PLURAL:$1|octet|octeți|de octeți}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/roa-tara.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/roa-tara.json new file mode 100644 index 00000000..249c0a08 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/roa-tara.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Joetaras" + ] + }, + "syntaxhighlight-desc": "Dèje 'na sindasse evidenziate <code><syntaxhighlight></code> ausanne [http://pygments.org/ Pygments - l'Evidenziatore de sindasse de Python]", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Codece", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Lènghe", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Blocche de codece" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ru.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ru.json new file mode 100644 index 00000000..cf8cab63 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ru.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Александр Сигачёв", + "Okras", + "Kaganer", + "Esukhovnina", + "Facenapalm" + ] + }, + "syntaxhighlight-desc": "Обеспечивает подсветки синтаксиса <code><syntaxhighlight></code> с помощью [http://pygments.org/ Pygments — средства подсветки синтаксиса для Python]", + "syntaxhighlight-error-category": "Страницы с ошибками в подсветке синтаксиса", + "syntaxhighlight-error-category-desc": "Произошла ошибка при попытке подсветки кода, включённого на страницу.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Код", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Язык", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(ничего)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Показать номера строк", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "начинающий номер линии", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Фрагмент кода", + "syntaxhighlight-error-pygments-invocation-failure": "Сбой при вызове Pygments", + "syntaxhighlight-error-unknown-language": "Неизвестный язык «$1»", + "syntaxhighlight-error-exceeds-size-limit": "Размер кода ($1 {{PLURAL:$1|байт|байта|байт}}) превышает разрешённый лимит в $2 {{PLURAL:$2|байт|байта|байт}}." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/rue.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/rue.json new file mode 100644 index 00000000..afab81d1 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/rue.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Gazeb" + ] + }, + "syntaxhighlight-desc": "Додавать звыразнїна сінтаксіс <code><syntaxhighlight></code> за помочі [http://qnbz.com/higlighter звыразнёвача GeSHi]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sah.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sah.json new file mode 100644 index 00000000..5e5dae0f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sah.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "HalanTul" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ Pygments] көмөтүнэн синтаксис подсветкатын холбуурга <code><syntaxhighlight></code> тиэги туһанар кыах биэрэр." +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/shn.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/shn.json new file mode 100644 index 00000000..6f8e927f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/shn.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Saosukham" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "ၼႄပၼ် ထႅဝ် မၢႆၼပ်ႉ" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sk.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sk.json new file mode 100644 index 00000000..e935096b --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sk.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Helix84" + ] + }, + "syntaxhighlight-desc": "Poskytuje zvýazňovanie syntaxe <code><syntaxhighlight></code> pomocou [http://pygments.org/ zvýrazňovača GeSHi]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sl.json new file mode 100644 index 00000000..c8bee672 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sl.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Dbc334", + "Yerpo", + "Eleassar" + ] + }, + "syntaxhighlight-desc": "Nudi označevanje skladnje <code><syntaxhighlight></code> z uporabo [http://pygments.org/ Pygments – označevalnika skladnje Python]", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Blok kode" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-ec.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-ec.json new file mode 100644 index 00000000..ece34e83 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-ec.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Millosh", + "Rancher", + "Sasa Stefanovic", + "Сербијана", + "Obsuser", + "Prevodim" + ] + }, + "syntaxhighlight-desc": "Омогућава визуелно означавање синтаксе <code><syntaxhighlight></code> коришћењем [http://pygments.org/ Pygments хајлајтера].", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Број почетне линије", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Парче кôда" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-el.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-el.json new file mode 100644 index 00000000..bcd302c4 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-el.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "MaxSem", + "Michaello", + "Prevodim" + ] + }, + "syntaxhighlight-desc": "Omogućava vizuelno označavanje sintakse <code><syntaxhighlight></code> korišćenjem [http://pygments.org/ GeSHi hajlajtera].", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Parče kôda" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/stq.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/stq.json new file mode 100644 index 00000000..ee3ec2de --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/stq.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Pyt" + ] + }, + "syntaxhighlight-desc": "Syntax-Apljuchtenge <code><syntaxhighlight></code> mäd Hälpe fon dän [http://pygments.org/ GeSHi-Apljuchter]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/su.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/su.json new file mode 100644 index 00000000..1b6f7449 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/su.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Kandar" + ] + }, + "syntaxhighlight-desc": "Nyadiakeun sorotan rumpaka <code><syntaxhighlight></code> migunakeun [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sv.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sv.json new file mode 100644 index 00000000..0b10fdc3 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sv.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Lejonel", + "Lokal Profil", + "WikiPhoenix", + "Ainali" + ] + }, + "syntaxhighlight-desc": "Ger syntaxmarkering med [http://pygments.org/ Pygments] inuti <code><syntaxhighlight></code>-taggar", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Kod", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Språk", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Ingen)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Visa radnummer", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Inledande radnummer", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kodblock" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/te.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/te.json new file mode 100644 index 00000000..88cbd34b --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/te.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Chaduvari", + "Veeven", + "Praveen Illa" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "భాష", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "కోడ్ బ్లాక్" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-cyrl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-cyrl.json new file mode 100644 index 00000000..0e7251fe --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-cyrl.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Ibrahim" + ] + }, + "syntaxhighlight-desc": "Имкони дастуроти рангин карданро <code><syntaxhighlight></code> бо истифода аз [http://pygments.org/ Pygments]-ро фароҳам меоварад" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-latn.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-latn.json new file mode 100644 index 00000000..294a914d --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-latn.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Liangent" + ] + }, + "syntaxhighlight-desc": "Imkoni dasturoti rangin kardanro <code><syntaxhighlight></code> bo istifoda az [http://pygments.org/ Pygments]-ro faroham meovarad" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tk.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tk.json new file mode 100644 index 00000000..21a8a2f1 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tk.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Hanberke" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ Pygments] ulanyp <code><syntaxhighlight></code> sintaksis nygtamasyny üpjün edýär" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tl.json new file mode 100644 index 00000000..a036c709 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tl.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "AnakngAraw" + ] + }, + "syntaxhighlight-desc": "Nagbibigay ng pagbibigay ng liwanag sa palaugnayan <code><syntaxhighlight></code> na ginagamitan ng [http://pygments.org/ pambigay ng liwanag (''highlighter'') ng GeSHi]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tokipona.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tokipona.json new file mode 100644 index 00000000..c899f1e3 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tokipona.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Robin0van0der0vliet" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "toki" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tr.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tr.json new file mode 100644 index 00000000..6c146620 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tr.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Erkan Yilmaz", + "Joseph", + "McAang" + ] + }, + "syntaxhighlight-desc": "[http://pygments.org/ Pygments] kullanarak <code><syntaxhighlight></code> sözdizimi vurgulamasını sağlar", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Kod bloğu" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tt-cyrl.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tt-cyrl.json new file mode 100644 index 00000000..24209700 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tt-cyrl.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Ильнар" + ] + }, + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Код өлеше" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/uk.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/uk.json new file mode 100644 index 00000000..93b0b8d3 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/uk.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "Ahonc", + "Ата", + "AS", + "Dars", + "Piramidion" + ] + }, + "syntaxhighlight-desc": "Забезпечує підсвічування синтаксису <code><syntaxhighlight></code> за допомогою [http://pygments.org/ Pygments] для синтаксису Python", + "syntaxhighlight-error-category": "Сторінки, які містять помилки підсвітки синтаксису", + "syntaxhighlight-error-category-desc": "Сталася помилка при спробі підсвічення коду на сторінці.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Код", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Мова", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Немає)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Показати номери рядків", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Номер початкового рядка", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Блок коду", + "syntaxhighlight-error-pygments-invocation-failure": "Не вдалося викликати Pygments", + "syntaxhighlight-error-unknown-language": "Невідома мова «$1»", + "syntaxhighlight-error-exceeds-size-limit": "Код розміром $1 {{PLURAL:$1|байт|байти|байтів}} перевищує дозволений максимум $2 {{PLURAL:$2|байт|байти|байтів}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vec.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vec.json new file mode 100644 index 00000000..eac10d90 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vec.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Candalua" + ] + }, + "syntaxhighlight-desc": "Evidensia la sintassi dei linguagi de programazion <code><syntaxhighlight></code> tramite [http://pygments.org/ Pygments]" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vi.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vi.json new file mode 100644 index 00000000..e57b228b --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vi.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Minh Nguyen" + ] + }, + "syntaxhighlight-desc": "Tô màu cú pháp trong thẻ <code><syntaxhighlight></code> dùng [http://pygments.org/ Pygments – trình tô màu cú pháp Python]", + "syntaxhighlight-error-category": "Trang có lỗi tô màu cú pháp", + "syntaxhighlight-error-category-desc": "Đã xuất hiện lỗi khi tô màu đoạn mã trong trang.", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "Đoạn mã", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "Ngôn ngữ", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(Không có)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "Đánh số dòng", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "Số dòng đầu", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "Đoạn mã", + "syntaxhighlight-error-pygments-invocation-failure": "Thất bại khi gọi Pygments", + "syntaxhighlight-error-unknown-language": "Ngôn ngữ không rõ “$1”", + "syntaxhighlight-error-exceeds-size-limit": "Đoạn mã có $1 byte, vượt quá tối đa $2 byte" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/yue.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/yue.json new file mode 100644 index 00000000..9fdb42d2 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/yue.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Shinjiman" + ] + }, + "syntaxhighlight-desc": "用[http://pygments.org/ Pygments]以<code><syntaxhighlight></code>提供醒目提示" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hans.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hans.json new file mode 100644 index 00000000..90b3c4e6 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hans.json @@ -0,0 +1,20 @@ +{ + "@metadata": { + "authors": [ + "Shinjiman", + "Liuxinyu970226" + ] + }, + "syntaxhighlight-desc": "使用[http://pygments.org/ Pygments - Python syntax highlighter]以提供语法高亮<code><syntaxhighlight></code>", + "syntaxhighlight-error-category": "有语法高亮错误的页面", + "syntaxhighlight-error-category-desc": "尝试高亮包含在页面中的代码时出错。", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "代码", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "语言", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(无)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "显示行数", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline": "起始行数", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "代码块", + "syntaxhighlight-error-pygments-invocation-failure": "调用Pygments失败", + "syntaxhighlight-error-unknown-language": "未知的语言“$1”", + "syntaxhighlight-error-exceeds-size-limit": "$1{{PLURAL:$1|字节}}代码大小超过了最大值$2{{PLURAL:$2|字节}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hant.json b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hant.json new file mode 100644 index 00000000..8d7371a5 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hant.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "Mark85296341", + "Shinjiman", + "Cwlin0416", + "Liuxinyu970226" + ] + }, + "syntaxhighlight-desc": "使用 [http://pygments.org/ Pygments - Python syntax highlighter] 提供可強調語法顯示的 <code><syntaxhighlight></code> 標籤。", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code": "程式碼", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language": "語言", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none": "(無)", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines": "顯示行號", + "syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title": "程式碼區塊", + "syntaxhighlight-error-unknown-language": "不明語言 \"$1\"", + "syntaxhighlight-error-exceeds-size-limit": "程式碼大小 $1 {{PLURAL:$1|位元組}} 已超出允許的上限值 $2 {{PLURAL:$2|位元組}}" +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/GeSHi.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/GeSHi.php new file mode 100644 index 00000000..516de12f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/GeSHi.php @@ -0,0 +1,42 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +/** + * Stub class for maintaining backward-compatibility with extensions + * that have not been updated for version 2.0 of SyntaxHighlight_GeSHi. + */ +class GeSHi { + + private $html; + + public function __construct( $html ) { + $this->html = $html; + } + + public function error() { + } + + public function set_language( $language ) { + } + + public function parse_code() { + global $wgOut; + $wgOut->addModuleStyles( 'ext.pygments' ); + return $this->html; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/ResourceLoaderSyntaxHighlightVisualEditorModule.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/ResourceLoaderSyntaxHighlightVisualEditorModule.php new file mode 100644 index 00000000..720cfd22 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/ResourceLoaderSyntaxHighlightVisualEditorModule.php @@ -0,0 +1,70 @@ +<?php + +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +class ResourceLoaderSyntaxHighlightVisualEditorModule extends ResourceLoaderFileModule { + + protected $targets = [ 'desktop', 'mobile' ]; + + /** + * @param ResourceLoaderContext $context + * @return string JavaScript code + */ + public function getScript( ResourceLoaderContext $context ) { + $scripts = parent::getScript( $context ); + + return $scripts . Xml::encodeJsCall( + 've.dm.MWSyntaxHighlightNode.static.addPygmentsLanguages', [ + $this->getPygmentsLanguages() + ], + ResourceLoader::inDebugMode() + ) . Xml::encodeJsCall( + 've.dm.MWSyntaxHighlightNode.static.addGeshiToPygmentsMap', [ + SyntaxHighlightGeSHiCompat::getGeSHiToPygmentsMap() + ], + ResourceLoader::inDebugMode() + ) . Xml::encodeJsCall( + 've.dm.MWSyntaxHighlightNode.static.addPygmentsToAceMap', [ + SyntaxHighlightAce::getPygmentsToAceMap() + ], + ResourceLoader::inDebugMode() + ); + } + + /** + * Don't break debug mode by only showing file URLs + * @param ResourceLoaderContext $context + * @return array + */ + public function getScriptURLsForDebug( ResourceLoaderContext $context ) { + return ResourceLoaderModule::getScriptURLsForDebug( $context ); + } + + /** + * Get a full list of available languages + * @return array + */ + private function getPygmentsLanguages() { + $lexers = require __DIR__ . '/../SyntaxHighlight.lexers.php'; + return $lexers; + } + + public function enableModuleContentVersion() { + return true; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlight.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlight.php new file mode 100644 index 00000000..076efe1e --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlight.php @@ -0,0 +1,577 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +use MediaWiki\Shell\Shell; + +class SyntaxHighlight { + + /** @var int The maximum number of lines that may be selected for highlighting. **/ + const HIGHLIGHT_MAX_LINES = 1000; + + /** @var int Maximum input size for the highlighter (100 kB). **/ + const HIGHLIGHT_MAX_BYTES = 102400; + + /** @var string CSS class for syntax-highlighted code. **/ + const HIGHLIGHT_CSS_CLASS = 'mw-highlight'; + + /** @var int Cache version. Increment whenever the HTML changes. */ + const CACHE_VERSION = 2; + + /** @var array Mapping of MIME-types to lexer names. **/ + private static $mimeLexers = [ + 'text/javascript' => 'javascript', + 'application/json' => 'javascript', + 'text/xml' => 'xml', + ]; + + /** + * Get the Pygments lexer name for a particular language. + * + * @param string $lang Language name. + * @return string|null Lexer name, or null if no matching lexer. + */ + private static function getLexer( $lang ) { + static $lexers = null; + + if ( $lang === null ) { + return null; + } + + if ( !$lexers ) { + $lexers = require __DIR__ . '/../SyntaxHighlight.lexers.php'; + } + + $lexer = strtolower( $lang ); + + if ( in_array( $lexer, $lexers ) ) { + return $lexer; + } + + $geshi2pygments = SyntaxHighlightGeSHiCompat::getGeSHiToPygmentsMap(); + + // Check if this is a GeSHi lexer name for which there exists + // a compatible Pygments lexer with a different name. + if ( isset( $geshi2pygments[$lexer] ) ) { + $lexer = $geshi2pygments[$lexer]; + if ( in_array( $lexer, $lexers ) ) { + return $lexer; + } + } + + return null; + } + + /** + * Register parser hook + * + * @param Parser &$parser + */ + public static function onParserFirstCallInit( Parser &$parser ) { + foreach ( [ 'source', 'syntaxhighlight' ] as $tag ) { + $parser->setHook( $tag, [ 'SyntaxHighlight', 'parserHook' ] ); + } + } + + /** + * Parser hook + * + * @param string $text + * @param array $args + * @param Parser $parser + * @return string + * @throws MWException + */ + public static function parserHook( $text, $args, $parser ) { + global $wgUseTidy; + + // Replace strip markers (For e.g. {{#tag:syntaxhighlight|<nowiki>...}}) + $out = $parser->mStripState->unstripNoWiki( $text ); + + // Don't trim leading spaces away, just the linefeeds + $out = preg_replace( '/^\n+/', '', rtrim( $out ) ); + + // Convert deprecated attributes + if ( isset( $args['enclose'] ) ) { + if ( $args['enclose'] === 'none' ) { + $args['inline'] = true; + } + unset( $args['enclose'] ); + } + + $lexer = isset( $args['lang'] ) ? $args['lang'] : ''; + + $result = self::highlight( $out, $lexer, $args ); + if ( !$result->isGood() ) { + $parser->addTrackingCategory( 'syntaxhighlight-error-category' ); + } + $out = $result->getValue(); + + // HTML Tidy will convert tabs to spaces incorrectly (bug 30930). + // But the conversion from tab to space occurs while reading the input, + // before the conversion from 	 to tab, so we can armor it that way. + if ( $wgUseTidy ) { + $out = str_replace( "\t", '	', $out ); + } + + // Allow certain HTML attributes + $htmlAttribs = Sanitizer::validateAttributes( $args, [ 'style', 'class', 'id', 'dir' ] ); + if ( !isset( $htmlAttribs['class'] ) ) { + $htmlAttribs['class'] = self::HIGHLIGHT_CSS_CLASS; + } else { + $htmlAttribs['class'] .= ' ' . self::HIGHLIGHT_CSS_CLASS; + } + if ( !( isset( $htmlAttribs['dir'] ) && $htmlAttribs['dir'] === 'rtl' ) ) { + $htmlAttribs['dir'] = 'ltr'; + } + + if ( isset( $args['inline'] ) ) { + // Enforce inlineness. Stray newlines may result in unexpected list and paragraph processing + // (also known as doBlockLevels()). + $out = str_replace( "\n", ' ', $out ); + $out = Html::rawElement( 'code', $htmlAttribs, $out ); + + } else { + // Not entirely sure what benefit this provides, but it was here already + $htmlAttribs['class'] .= ' ' . 'mw-content-' . $htmlAttribs['dir']; + + // Unwrap Pygments output to provide our own wrapper. We can't just always use the 'nowrap' + // option (pass 'inline'), since it disables other useful things like line highlighting. + // Tolerate absence of quotes for Html::element() and wgWellFormedXml=false. + if ( $out !== '' ) { + $m = []; + if ( preg_match( '/^<div class="?mw-highlight"?>(.*)<\/div>$/s', trim( $out ), $m ) ) { + $out = trim( $m[1] ); + } else { + throw new MWException( 'Unexpected output from Pygments encountered' ); + } + } + + // Use 'nowiki' strip marker to prevent list processing (also known as doBlockLevels()). + // However, leave the wrapping <div/> outside to prevent <p/>-wrapping. + $marker = $parser::MARKER_PREFIX . '-syntaxhighlightinner-' . + sprintf( '%08X', $parser->mMarkerIndex++ ) . $parser::MARKER_SUFFIX; + $parser->mStripState->addNoWiki( $marker, $out ); + + $out = Html::openElement( 'div', $htmlAttribs ) . + $marker . + Html::closeElement( 'div' ); + } + + // Register CSS + $parser->getOutput()->addModuleStyles( 'ext.pygments' ); + + return $out; + } + + /** + * @return string + */ + public static function getPygmentizePath() { + global $wgPygmentizePath; + + // If $wgPygmentizePath is unset, use the bundled copy. + if ( $wgPygmentizePath === false ) { + $wgPygmentizePath = __DIR__ . '/../pygments/pygmentize'; + } + + return $wgPygmentizePath; + } + + /** + * @param string $code + * @param bool $inline + */ + private static function plainCodeWrap( $code, $inline ) { + if ( $inline ) { + return htmlspecialchars( $code, ENT_NOQUOTES ); + } + + return Html::rawElement( + 'div', + [ 'class' => self::HIGHLIGHT_CSS_CLASS ], + Html::element( 'pre', [], $code ) + ); + } + + /** + * Highlight a code-block using a particular lexer. + * + * @param string $code Code to highlight. + * @param string|null $lang Language name, or null to use plain markup. + * @param array $args Associative array of additional arguments. + * If it contains a 'line' key, the output will include line numbers. + * If it includes a 'highlight' key, the value will be parsed as a + * comma-separated list of lines and line-ranges to highlight. + * If it contains a 'start' key, the value will be used as the line at which to + * start highlighting. + * If it contains a 'inline' key, the output will not be wrapped in `<div><pre/></div>`. + * @return Status Status object, with HTML representing the highlighted + * code as its value. + */ + public static function highlight( $code, $lang = null, $args = [] ) { + $status = new Status; + + $lexer = self::getLexer( $lang ); + if ( $lexer === null && $lang !== null ) { + $status->warning( 'syntaxhighlight-error-unknown-language', $lang ); + } + + // For empty tag, output nothing instead of empty <pre>. + if ( $code === '' ) { + $status->value = ''; + return $status; + } + + $length = strlen( $code ); + if ( strlen( $code ) > self::HIGHLIGHT_MAX_BYTES ) { + // Disable syntax highlighting + $lexer = null; + $status->warning( + 'syntaxhighlight-error-exceeds-size-limit', + $length, + self::HIGHLIGHT_MAX_BYTES + ); + } elseif ( Shell::isDisabled() ) { + // Disable syntax highlighting + $lexer = null; + $status->warning( 'syntaxhighlight-error-pygments-invocation-failure' ); + wfWarn( + 'MediaWiki determined that it cannot invoke Pygments. ' . + 'As a result, SyntaxHighlight_GeSHi will not perform any syntax highlighting. ' . + 'See the debug log for details: ' . + 'https://www.mediawiki.org/wiki/Manual:$wgDebugLogFile' + ); + } + + $inline = isset( $args['inline'] ); + + if ( $inline ) { + $code = trim( $code ); + } + + if ( $lexer === null ) { + // When syntax highlighting is disabled.. + $status->value = self::plainCodeWrap( $code, $inline ); + return $status; + } + + $options = [ + 'cssclass' => self::HIGHLIGHT_CSS_CLASS, + 'encoding' => 'utf-8', + ]; + + // Line numbers + if ( isset( $args['line'] ) ) { + $options['linenos'] = 'inline'; + } + + if ( $lexer === 'php' && strpos( $code, '<?php' ) === false ) { + $options['startinline'] = 1; + } + + // Highlight specific lines + if ( isset( $args['highlight'] ) ) { + $lines = self::parseHighlightLines( $args['highlight'] ); + if ( count( $lines ) ) { + $options['hl_lines'] = implode( ' ', $lines ); + } + } + + // Starting line number + if ( isset( $args['start'] ) && ctype_digit( $args['start'] ) ) { + $options['linenostart'] = (int)$args['start']; + } + + if ( $inline ) { + $options['nowrap'] = 1; + } + + $cache = ObjectCache::getMainWANInstance(); + $error = null; + $output = $cache->getWithSetCallback( + $cache->makeGlobalKey( 'highlight', self::makeCacheKeyHash( $code, $lexer, $options ) ), + $cache::TTL_MONTH, + function ( $oldValue, &$ttl ) use ( $code, $lexer, $options, &$error ) { + $optionPairs = []; + foreach ( $options as $k => $v ) { + $optionPairs[] = "{$k}={$v}"; + } + $result = Shell::command( + self::getPygmentizePath(), + '-l', $lexer, + '-f', 'html', + '-O', implode( ',', $optionPairs ) + ) + ->input( $code ) + ->restrict( Shell::RESTRICT_DEFAULT | Shell::NO_NETWORK ) + ->execute(); + + if ( $result->getExitCode() != 0 ) { + $ttl = WANObjectCache::TTL_UNCACHEABLE; + $error = $result->getStderr(); + return null; + } + + return $result->getStdout(); + } + ); + + if ( $error !== null || $output === null ) { + $status->warning( 'syntaxhighlight-error-pygments-invocation-failure' ); + wfWarn( 'Failed to invoke Pygments: ' . $error ); + // Fall back to preformatted code without syntax highlighting + $output = self::plainCodeWrap( $code, $inline ); + } + + if ( $inline ) { + // We've already trimmed the input $code before highlighting, + // but pygment's standard out adds a line break afterwards, + // which would then be preserved in the paragraph that wraps this, + // and become visible as a space. Avoid that. + $output = trim( $output ); + } + + $status->value = $output; + return $status; + } + + /** + * Construct a cache key for the results of a Pygments invocation. + * + * @param string $code Code to be highlighted. + * @param string $lexer Lexer name. + * @param array $options Options array. + * @return string Cache key. + */ + private static function makeCacheKeyHash( $code, $lexer, $options ) { + $optionString = FormatJson::encode( $options, false, FormatJson::ALL_OK ); + return md5( "{$code}|{$lexer}|{$optionString}|" . self::CACHE_VERSION ); + } + + /** + * Take an input specifying a list of lines to highlight, returning + * a raw list of matching line numbers. + * + * Input is comma-separated list of lines or line ranges. + * + * @param string $lineSpec + * @return int[] Line numbers. + */ + protected static function parseHighlightLines( $lineSpec ) { + $lines = []; + $values = array_map( 'trim', explode( ',', $lineSpec ) ); + foreach ( $values as $value ) { + if ( ctype_digit( $value ) ) { + $lines[] = (int)$value; + } elseif ( strpos( $value, '-' ) !== false ) { + list( $start, $end ) = array_map( 'trim', explode( '-', $value ) ); + if ( self::validHighlightRange( $start, $end ) ) { + for ( $i = intval( $start ); $i <= $end; $i++ ) { + $lines[] = $i; + } + } + } + if ( count( $lines ) > self::HIGHLIGHT_MAX_LINES ) { + $lines = array_slice( $lines, 0, self::HIGHLIGHT_MAX_LINES ); + break; + } + } + return $lines; + } + + /** + * Validate a provided input range + * @param int $start + * @param int $end + * @return bool + */ + protected static function validHighlightRange( $start, $end ) { + // Since we're taking this tiny range and producing a an + // array of every integer between them, it would be trivial + // to DoS the system by asking for a huge range. + // Impose an arbitrary limit on the number of lines in a + // given range to reduce the impact. + return ctype_digit( $start ) && + ctype_digit( $end ) && + $start > 0 && + $start < $end && + $end - $start < self::HIGHLIGHT_MAX_LINES; + } + + /** + * Hook into Content::getParserOutput to provide syntax highlighting for + * script content. + * + * @param Content $content + * @param Title $title + * @param int $revId + * @param ParserOptions $options + * @param bool $generateHtml + * @param ParserOutput &$output + * @return bool + * @since MW 1.21 + */ + public static function onContentGetParserOutput( Content $content, Title $title, + $revId, ParserOptions $options, $generateHtml, ParserOutput &$output + ) { + global $wgParser, $wgTextModelsToParse; + + if ( !$generateHtml ) { + // Nothing special for us to do, let MediaWiki handle this. + return true; + } + + // Determine the language + $extension = ExtensionRegistry::getInstance(); + $models = $extension->getAttribute( 'SyntaxHighlightModels' ); + $model = $content->getModel(); + if ( !isset( $models[$model] ) ) { + // We don't care about this model, carry on. + return true; + } + $lexer = $models[$model]; + + // Hope that $wgSyntaxHighlightModels does not contain silly types. + $text = ContentHandler::getContentText( $content ); + if ( !$text ) { + // Oops! Non-text content? Let MediaWiki handle this. + return true; + } + + // Parse using the standard parser to get links etc. into the database, HTML is replaced below. + // We could do this using $content->fillParserOutput(), but alas it is 'protected'. + if ( $content instanceof TextContent && in_array( $model, $wgTextModelsToParse ) ) { + $output = $wgParser->parse( $text, $title, $options, true, true, $revId ); + } + + $status = self::highlight( $text, $lexer ); + if ( !$status->isOK() ) { + return true; + } + $out = $status->getValue(); + + $output->addModuleStyles( 'ext.pygments' ); + $output->setText( '<div dir="ltr">' . $out . '</div>' ); + + // Inform MediaWiki that we have parsed this page and it shouldn't mess with it. + return false; + } + + /** + * Hook to provide syntax highlighting for API pretty-printed output + * + * @param IContextSource $context + * @param string $text + * @param string $mime + * @param string $format + * @since MW 1.24 + * @return bool + */ + public static function onApiFormatHighlight( IContextSource $context, $text, $mime, $format ) { + if ( !isset( self::$mimeLexers[$mime] ) ) { + return true; + } + + $lexer = self::$mimeLexers[$mime]; + $status = self::highlight( $text, $lexer ); + if ( !$status->isOK() ) { + return true; + } + + $out = $status->getValue(); + if ( preg_match( '/^<pre([^>]*)>/i', $out, $m ) ) { + $attrs = Sanitizer::decodeTagAttributes( $m[1] ); + $attrs['class'] .= ' api-pretty-content'; + $encodedAttrs = Sanitizer::safeEncodeTagAttributes( $attrs ); + $out = '<pre' . $encodedAttrs. '>' . substr( $out, strlen( $m[0] ) ); + } + $output = $context->getOutput(); + $output->addModuleStyles( 'ext.pygments' ); + $output->addHTML( '<div dir="ltr">' . $out . '</div>' ); + + // Inform MediaWiki that we have parsed this page and it shouldn't mess with it. + return false; + } + + /** + * Conditionally register resource loader modules that depends on the + * VisualEditor MediaWiki extension. + * + * @param ResourceLoader &$resourceLoader + */ + public static function onResourceLoaderRegisterModules( &$resourceLoader ) { + if ( !ExtensionRegistry::getInstance()->isLoaded( 'VisualEditor' ) ) { + return; + } + + $resourceLoader->register( 'ext.geshi.visualEditor', [ + 'class' => ResourceLoaderSyntaxHighlightVisualEditorModule::class, + 'localBasePath' => __DIR__ . '/../modules', + 'remoteExtPath' => 'SyntaxHighlight_GeSHi/modules', + 'scripts' => [ + 've-syntaxhighlight/ve.dm.MWSyntaxHighlightNode.js', + 've-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightWindow.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightDialogTool.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.js', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightInspectorTool.js', + ], + 'styles' => [ + 've-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.css', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.css', + 've-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.css', + ], + 'dependencies' => [ + 'ext.visualEditor.mwcore', + 'oojs-ui.styles.icons-editing-advanced' + ], + 'messages' => [ + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline', + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title', + ], + 'targets' => [ 'desktop', 'mobile' ], + ] ); + } + + /** + * Backward-compatibility shim for extensions. + * @deprecated since MW 1.25 + */ + public static function prepare( $text, $lang ) { + wfDeprecated( __METHOD__ ); + return new GeSHi( self::highlight( $text, $lang )->getValue() ); + } + + /** + * Backward-compatibility shim for extensions. + * @deprecated since MW 1.25 + * @param GeSHi $geshi + * @return string + */ + public static function buildHeadItem( $geshi ) { + wfDeprecated( __METHOD__ ); + $geshi->parse_code(); + return ''; + } +} +class_alias( SyntaxHighlight::class, 'SyntaxHighlight_GeSHi' ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightAce.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightAce.php new file mode 100644 index 00000000..54991f32 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightAce.php @@ -0,0 +1,174 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +/** + * Class provides functionality to map Ace lexer definitions + */ +class SyntaxHighlightAce { + /** @var array This map is inverted, because it is easier to maintain this way */ + private static $aceLexers = [ + 'ABAP' => [ 'abap' ], + 'ABC' => [], + 'ActionScript' => [ 'actionscript', 'actionscript3' ], + 'ADA' => [ 'ada', 'ada2005', 'ada95' ], + 'Apache_Conf' => [ 'apache', 'apacheconf', 'aconf' ], + 'AsciiDoc' => [], + 'Assembly_x86' => [ 'nasm' ], + 'AutoHotKey' => [ 'autohotkey', 'ah' ], + 'BatchFile' => [ 'bat', 'batch', 'dosbatch', 'winbatch' ], + 'C_Cpp' => [ 'cpp', 'c++' ], + 'C9Search' => [], + 'Cirru' => [ 'cirru' ], + 'Clojure' => [ 'clojure', 'clj' ], + 'Cobol' => [ 'cobol' ], + 'coffee' => [ 'coffee', 'coffeescript', 'coffee-script' ], + 'ColdFusion' => [ 'cfm' ], + 'CSharp' => [ 'csharp', '#' ], + 'CSS' => [ 'css' ], + 'Curly' => [], + 'D' => [ 'd' ], + 'Dart' => [ 'dart' ], + 'Diff' => [ 'diff', 'udiff' ], + 'Django' => [ 'django', 'html+django', 'html+jinja', 'htmldjango' ], + 'Dockerfile' => [ 'Dockerfile', 'docker' ], + 'Dot' => [], + 'Dummy' => [], + 'DummySyntax' => [], + 'Eiffel' => [ 'eiffel' ], + 'EJS' => [], + 'Elixir' => [ 'elixer', 'ex', 'exs' ], + 'Elm' => [ 'elm' ], + 'Erlang' => [ 'erlang' ], + 'Forth' => [], + 'Fortran' => [ 'fortran' ], + 'FTL' => [], + 'Gcode' => [], + 'Gherkin' => [ 'cucumber', 'gherkin' ], + 'Gitignore' => [], + 'Glsl' => [ 'glsl' ], + 'Gobstones' => [], + 'golang' => [ 'go' ], + 'Groovy' => [ 'groovy' ], + 'HAML' => [ 'haml' ], + 'Handlebars' => [ 'html+handlebars' ], + 'Haskell' => [ 'haskell', 'hs' ], + 'haXe' => [ 'hx', 'haxe', 'hxsl' ], + 'HTML' => [ 'html' ], + 'HTML_Elixir' => [], + 'HTML_Ruby' => [ 'rhtml', 'html+erb', 'html+ruby' ], + 'INI' => [ 'ini', 'cfg', 'dosini' ], + 'Io' => [ 'io' ], + 'Jack' => [ '' ], + 'Jade' => [ 'jade' ], + 'Java' => [ 'java' ], + 'JavaScript' => [ 'Javascript', 'js' ], + 'JSON' => [ 'json' ], + 'JSONiq' => [], + 'JSP' => [ 'jsp' ], + 'JSX' => [], + 'Julia' => [ 'julia', 'jl' ], + 'LaTeX' => [ 'latex' ], + 'Lean' => [ 'lean' ], + 'LESS' => [ 'less' ], + 'Liquid' => [ 'liquid' ], + 'Lisp' => [ 'lisp', 'common-lisp', 'cl' ], + 'LiveScript' => [ 'Livescript', 'live-script' ], + 'LogiQL' => [], + 'LSL' => [ 'lsl' ], + 'Lua' => [ 'lua' ], + 'LuaPage' => [], + 'Lucene' => [], + 'Makefile' => [ 'make', 'makefile', 'mf', 'bsdmake' ], + 'Markdown' => [], + 'Mask' => [ 'mask' ], + 'MATLAB' => [ 'matlab' ], + 'Maze' => [], + 'MEL' => [], + 'MUSHCode' => [], + 'MySQL' => [ 'mysql' ], + 'Nix' => [ 'nix', 'nixos' ], + 'NSIS' => [ 'nsis', 'nsi', 'nsh' ], + 'ObjectiveC' => [ 'objectivec', 'objective-c', 'obj-c', 'objc', + 'objective-c++', 'objectivec++', 'obj-c++', 'objc++' ], + 'OCaml' => [ 'ocaml' ], + 'Pascal' => [ 'pascal', 'delphi', 'pas', 'objectpascal' ], + 'Perl' => [ 'perl', 'pl', 'perl6', 'pl6' ], + 'pgSQL' => [ 'postgresql', 'postgres' ], + 'PHP' => [ 'php', 'php3', 'php4', 'php5', 'html+php' ], + 'Powershell' => [ 'powershell', 'posh', 'ps1', 'psm1' ], + 'Praat' => [ 'praat' ], + 'Prolog' => [ 'prolog' ], + 'Properties' => [ 'properties', 'jproperties' ], + 'Protobuf' => [ 'protobuf', 'proto' ], + 'Python' => [ 'python', 'py', 'sage', 'pyton3', 'py3' ], + 'R' => [], + 'Razor' => [], + 'RDoc' => [], + 'RHTML' => [], // HTML with Rcode, not ruby + 'RST' => [ 'rst', 'rest', 'restructuredtext' ], + 'Ruby' => [ 'ruby', 'rb', 'duby' ], + 'Rust' => [ 'rust' ], + 'SASS' => [ 'sass' ], + 'SCAD' => [], + 'Scala' => [ 'scala' ], + 'Scheme' => [ 'scheme', 'scm' ], + 'SCSS' => [ 'scss' ], + 'SH' => [ 'sh', 'bash', 'ksh', 'shell' ], + 'SJS' => [], + 'Smarty' => [ 'smarty', 'html+smarty' ], + 'snippets' => [], + 'Soy_Template' => [], + 'Space' => [], + 'SQL' => [ 'sql' ], + 'SQLServer' => [], + 'Stylus' => [], + 'SVG' => [], + 'Swift' => [ 'swift' ], + 'Tcl' => [ 'tcl' ], + 'Tex' => [ 'tex' ], + 'Text' => [ 'text' ], + 'Textile' => [], + 'Toml' => [], + 'Twig' => [ 'html+twig', 'twig' ], + 'Typescript' => [ 'typescript', 'ts' ], + 'Vala' => [ 'vala', 'vapi' ], + 'VBScript' => [], + 'Velocity' => [ 'velocity', 'html+velocity' ], + 'Verilog' => [ 'verilog', 'v', 'systemverilog', 'sv' ], + 'VHDL' => [ 'vhdl' ], + 'Wollok' => [], + 'XML' => [ 'xml' ], + 'XQuery' => [ 'xquery', 'xqy', 'xq', 'xql', 'xqm' ], + 'YAML' => [ 'yaml' ], + ]; + + public static function getPygmentsToAceMap() { + $result = []; + foreach ( self::$aceLexers as $aceName => $pygmentsLexers ) { + foreach ( $pygmentsLexers as $lexer ) { + if ( strcasecmp( $lexer, $aceName ) === 0 ) { + continue; + } + if ( !array_key_exists( $lexer, $result ) ) { + $result[ $lexer ] = $aceName; + } + } + } + return $result; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightGeSHiCompat.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightGeSHiCompat.php new file mode 100644 index 00000000..a6f38323 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightGeSHiCompat.php @@ -0,0 +1,113 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + */ +class SyntaxHighlightGeSHiCompat { + /** @var array A mapping of GeSHi lexer names to compatible Pygments lexers. */ + private static $compatibleLexers = [ + // Assembler + 'arm' => 'asm', + '6502acme' => 'asm', + '6502tasm' => 'asm', + '6502kickass' => 'asm', + '68000devpac' => 'asm', + 'dcpu16' => 'asm', + 'm68k' => 'asm', + 'mmix' => 'nasm', + 'mpasm' => 'asm', + 'pic16' => 'asm', + 'z80' => 'asm', + + // BASIC + 'xbasic' => 'basic', + 'thinbasic' => 'basic', + 'sdlbasic' => 'basic', + 'purebasic' => 'basic', + 'mapbasic' => 'basic', + 'locobasic' => 'basic', + 'gwbasic' => 'basic', + 'freebasic' => 'basic', + 'basic4gl' => 'basic', + 'zxbasic' => 'basic', + 'gambas' => 'basic', + 'oobas' => 'basic', + 'bascomavr' => 'basic', + + // C / C++ + 'c_loadrunner' => 'c', + 'c_mac' => 'c', + 'c_winapi' => 'c', + 'upc' => 'c', + 'cpp-qt' => 'cpp', + 'cpp-winapi' => 'cpp', + 'urbi' => 'cpp', + + // HTML + 'html4strict' => 'html', + 'html5' => 'html', + + // JavaScript + 'jquery' => 'javascript', + 'ecmascript' => 'javascript', + + // Microsoft + 'vb' => 'vbnet', + 'asp' => 'aspx-vb', + 'visualfoxpro' => 'foxpro', + 'dos' => 'bat', + 'visualprolog' => 'prolog', + 'reg' => 'registry', + + // Miscellaneous + 'cadlisp' => 'lisp', + 'java5' => 'java', + 'php-brief' => 'php', + 'povray' => 'pov', + 'pys60' => 'python', + 'rails' => 'ruby', + 'rpmspec' => 'spec', + 'rsplus' => 'splus', + 'gettext' => 'pot', + + // ML + 'ocaml-brief' => 'ocaml', + 'standardml' => 'sml', + + // Modula 2 + 'modula3' => 'modula2', + 'oberon2' => 'modula2', + + // SQL + 'dcl' => 'sql', + 'plsql' => 'sql', + 'oracle11' => 'sql', + 'oracle8' => 'sql', + + // REXX + 'oorexx' => 'rexx', + 'netrexx' => 'rexx', + + // xpp is basically Java + 'xpp' => 'java', + + // apt + 'apt_sources' => 'debsources', + ]; + + public static function getGeSHiToPygmentsMap() { + return self::$compatibleLexers; + } +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateCSS.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateCSS.php new file mode 100644 index 00000000..56bf7350 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateCSS.php @@ -0,0 +1,68 @@ +<?php +/** + * Script to update Pygments CSS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @author Ori Livneh <ori@wikimedia.org> + * @ingroup Maintenance + */ + +use MediaWiki\Shell\Shell; + +$IP = getenv( 'MW_INSTALL_PATH' ) ?: __DIR__ . '/../../..'; + +require_once "$IP/maintenance/Maintenance.php"; + +class UpdateCSS extends Maintenance { + + public function __construct() { + parent::__construct(); + + $this->requireExtension( 'SyntaxHighlight' ); + $this->addDescription( 'Generate CSS code for SyntaxHighlight_GeSHi' ); + } + + public function execute() { + $target = __DIR__ . '/../modules/pygments.generated.css'; + $css = "/* Stylesheet generated by updateCSS.php */\n"; + + $result = Shell::command( + SyntaxHighlight::getPygmentizePath(), + '-f', 'html', + '-S', 'default', + '-a', '.' . SyntaxHighlight::HIGHLIGHT_CSS_CLASS + ) + ->restrict( Shell::RESTRICT_DEFAULT | Shell::NO_NETWORK ) + ->execute(); + + if ( $result->getExitCode() != 0 ) { + throw new \RuntimeException( $result->getStderr() ); + } + + $css .= $result->getStdout(); + + if ( file_put_contents( $target, $css ) === false ) { + $this->output( "Failed to write to {$target}\n" ); + } else { + $this->output( 'CSS written to ' . realpath( $target ) . "\n" ); + } + } +} + +$maintClass = "UpdateCSS"; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateLexerList.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateLexerList.php new file mode 100644 index 00000000..1937d856 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateLexerList.php @@ -0,0 +1,79 @@ +<?php +/** + * Script to update list of supported lexers. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @author Ori Livneh <ori@wikimedia.org> + * @ingroup Maintenance + */ + +use MediaWiki\Shell\Shell; + +$IP = getenv( 'MW_INSTALL_PATH' ) ?: __DIR__ . '/../../..'; + +require_once "$IP/maintenance/Maintenance.php"; + +class UpdateLexerList extends Maintenance { + public function __construct() { + parent::__construct(); + + $this->requireExtension( 'SyntaxHighlight' ); + $this->addDescription( 'Update list of lexers supported by SyntaxHighlight_GeSHi' ); + } + + public function execute() { + function lang_filter( $val ) { + return preg_match( '/^[a-zA-Z0-9\-_]+$/', $val ); + } + + $header = '// Generated by ' . basename( __FILE__ ) . "\n\n"; + + $lexers = []; + + $result = Shell::command( + SyntaxHighlight::getPygmentizePath(), + '-L', 'lexer' + ) + ->restrict( Shell::RESTRICT_DEFAULT | Shell::NO_NETWORK ) + ->execute(); + + if ( $result->getExitCode() != 0 ) { + throw new \RuntimeException( $result->getStderr() ); + } + + $output = $result->getStdout(); + foreach ( explode( "\n", $output ) as $line ) { + if ( substr( $line, 0, 1 ) === '*' ) { + $newLexers = explode( ', ', trim( $line, "* :\n" ) ); + $lexers = array_merge( $lexers, $newLexers ); + } + } + $lexers = array_unique( $lexers ); + sort( $lexers ); + + $code = "<?php\n" . $header . 'return ' . var_export( $lexers, true ) . ";\n"; + $code = preg_replace( '/(\d+ \=\>| (?=\())/i', '', $code ); + $code = preg_replace( "/^ +/m", "\t", $code ); + + file_put_contents( __DIR__ . '/../SyntaxHighlight.lexers.php', $code ); + $this->output( "Updated language list written to SyntaxHighlight.lexers.php\n" ); + } +} + +$maintClass = 'UpdateLexerList'; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.generated.css b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.generated.css new file mode 100644 index 00000000..2321fdc5 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.generated.css @@ -0,0 +1,70 @@ +/* Stylesheet generated by updateCSS.php */ +.mw-highlight .hll { background-color: #ffffcc } +.mw-highlight { background: #f8f8f8; } +.mw-highlight .c { color: #408080; font-style: italic } /* Comment */ +.mw-highlight .err { border: 1px solid #FF0000 } /* Error */ +.mw-highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.mw-highlight .o { color: #666666 } /* Operator */ +.mw-highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ +.mw-highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ +.mw-highlight .cp { color: #BC7A00 } /* Comment.Preproc */ +.mw-highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ +.mw-highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ +.mw-highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ +.mw-highlight .gd { color: #A00000 } /* Generic.Deleted */ +.mw-highlight .ge { font-style: italic } /* Generic.Emph */ +.mw-highlight .gr { color: #FF0000 } /* Generic.Error */ +.mw-highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.mw-highlight .gi { color: #00A000 } /* Generic.Inserted */ +.mw-highlight .go { color: #888888 } /* Generic.Output */ +.mw-highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.mw-highlight .gs { font-weight: bold } /* Generic.Strong */ +.mw-highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.mw-highlight .gt { color: #0044DD } /* Generic.Traceback */ +.mw-highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.mw-highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.mw-highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.mw-highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.mw-highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.mw-highlight .kt { color: #B00040 } /* Keyword.Type */ +.mw-highlight .m { color: #666666 } /* Literal.Number */ +.mw-highlight .s { color: #BA2121 } /* Literal.String */ +.mw-highlight .na { color: #7D9029 } /* Name.Attribute */ +.mw-highlight .nb { color: #008000 } /* Name.Builtin */ +.mw-highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.mw-highlight .no { color: #880000 } /* Name.Constant */ +.mw-highlight .nd { color: #AA22FF } /* Name.Decorator */ +.mw-highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.mw-highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.mw-highlight .nf { color: #0000FF } /* Name.Function */ +.mw-highlight .nl { color: #A0A000 } /* Name.Label */ +.mw-highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.mw-highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.mw-highlight .nv { color: #19177C } /* Name.Variable */ +.mw-highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.mw-highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.mw-highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.mw-highlight .mf { color: #666666 } /* Literal.Number.Float */ +.mw-highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.mw-highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.mw-highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.mw-highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.mw-highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.mw-highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.mw-highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.mw-highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.mw-highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.mw-highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.mw-highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.mw-highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.mw-highlight .sx { color: #008000 } /* Literal.String.Other */ +.mw-highlight .sr { color: #BB6688 } /* Literal.String.Regex */ +.mw-highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.mw-highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.mw-highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.mw-highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.mw-highlight .vc { color: #19177C } /* Name.Variable.Class */ +.mw-highlight .vg { color: #19177C } /* Name.Variable.Global */ +.mw-highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.mw-highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.mw-highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.wrapper.css b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.wrapper.css new file mode 100644 index 00000000..5588b415 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.wrapper.css @@ -0,0 +1,63 @@ +.mw-highlight { + /* All supported programming languages are written left-to-right */ + /* @noflip */ + direction: ltr; + unicode-bidi: embed; +} + +.mw-highlight pre { + /* Use a more commonly found tab size of 4 (e.g. as used in CodeEditor) + instead of the browser-default value of 8 */ + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; +} + +/* Avoid displaying double borders for nested 'code' elements. + Before we started using the 'code' tag for inline code snippets, + <code><syntaxhighlight enclose=none ...>...</syntaxhighlight></code> + was a common pattern. Continue supporting it in existing content. */ +code code.mw-highlight { + background-color: transparent; + border: 0; + padding: 0; +} + +/* The nested pre already has a background. T126010 */ +div.mw-hightlight { + background-color: inherit; +} + +/* + * Don't show a red border around syntax errors. This behavior may be useful + * in code editors, but it is not useful in a wiki environment, especially + * given the longstanding habit of using an existing, mostly-compatible lexer + * to highlight a language for which no lexer exists. + */ +.mw-highlight .err { + border: 0; +} + +/* Highlight background of whole lines, not just text in them */ +.mw-highlight .hll { + display: block; +} + +/* Make line numbers non copyable */ +.mw-highlight .lineno { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* To interact better with the 'display: block' above, doesn't affect other uses */ +/* @noflip */ +.mw-highlight.mw-content-ltr .lineno { + float: left; +} + +/* @noflip */ +.mw-highlight.mw-content-rtl .lineno { + float: right; +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/AUTHORS.txt b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/AUTHORS.txt new file mode 100644 index 00000000..921784f9 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/AUTHORS.txt @@ -0,0 +1,6 @@ +The following people have contributed to the writing of this module: + +Alex Monk +Ed Sanders +Florian Schmidt +Timo Tijhof diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/LICENSE.txt b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/LICENSE.txt new file mode 100644 index 00000000..919d30f4 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/LICENSE.txt @@ -0,0 +1,20 @@ +The MIT License (MIT) +Copyright (c) 2016 Visual Editor Team + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.css b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.css new file mode 100644 index 00000000..d768b232 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.css @@ -0,0 +1,11 @@ +/*! + * VisualEditor ContentEditable MWSyntaxHighlightNode styles. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +.ve-ce-mwSyntaxHighlightNode pre { + /* Prevent silly wrapping on Safari and Chrome (https://bugs.webkit.org/show_bug.cgi?id=35935) */ + word-wrap: normal; +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.js new file mode 100644 index 00000000..0d1cc57f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.js @@ -0,0 +1,92 @@ +/*! + * VisualEditor ContentEditable MWSyntaxHighlightNode class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * ContentEditable MediaWiki syntax highlight node. + * + * @class + * @abstract + * + * @constructor + */ +ve.ce.MWSyntaxHighlightNode = function VeCeMWSyntaxHighlightNode() { +}; + +/* Inheritance */ + +OO.initClass( ve.ce.MWSyntaxHighlightNode ); + +/* Static Properties */ + +ve.ce.MWSyntaxHighlightNode.static.name = 'mwSyntaxHighlight'; + +/* Methods */ + +// Inherits from ve.ce.GeneratedContentNode +ve.ce.MWSyntaxHighlightNode.prototype.generateContents = function () { + var node = this, + args = arguments; + // Parent method + return mw.loader.using( 'ext.pygments' ).then( function () { + return ve.ce.MWExtensionNode.prototype.generateContents.apply( node, args ); + } ); +}; + +// Inherits from ve.ce.BranchNode +ve.ce.MWSyntaxHighlightNode.prototype.onSetup = function () { + // Parent method + ve.ce.MWExtensionNode.prototype.onSetup.call( this ); + + // DOM changes + this.$element.addClass( 've-ce-mwSyntaxHighlightNode' ); +}; + +// Inherits from ve.ce.FocusableNode +ve.ce.MWSyntaxHighlightNode.prototype.getBoundingRect = function () { + // HACK: Because nodes can overflow due to the pre tag, just use the + // first rect (of the wrapper div) for placing the context. + return this.rects[ 0 ]; +}; + +/* Concrete subclasses */ + +ve.ce.MWBlockSyntaxHighlightNode = function VeCeMWBlockSyntaxHighlightNode() { + // Parent method + ve.ce.MWBlockExtensionNode.super.apply( this, arguments ); + + // Mixin method + ve.ce.MWSyntaxHighlightNode.call( this ); +}; + +OO.inheritClass( ve.ce.MWBlockSyntaxHighlightNode, ve.ce.MWBlockExtensionNode ); + +OO.mixinClass( ve.ce.MWBlockSyntaxHighlightNode, ve.ce.MWSyntaxHighlightNode ); + +ve.ce.MWBlockSyntaxHighlightNode.static.name = 'mwBlockSyntaxHighlight'; + +ve.ce.MWBlockSyntaxHighlightNode.static.primaryCommandName = 'syntaxhighlightDialog'; + +ve.ce.MWInlineSyntaxHighlightNode = function VeCeMWInlineSyntaxHighlightNode() { + // Parent method + ve.ce.MWInlineExtensionNode.super.apply( this, arguments ); + + // Mixin method + ve.ce.MWSyntaxHighlightNode.call( this ); +}; + +OO.inheritClass( ve.ce.MWInlineSyntaxHighlightNode, ve.ce.MWInlineExtensionNode ); + +OO.mixinClass( ve.ce.MWInlineSyntaxHighlightNode, ve.ce.MWSyntaxHighlightNode ); + +ve.ce.MWInlineSyntaxHighlightNode.static.name = 'mwInlineSyntaxHighlight'; + +ve.ce.MWInlineSyntaxHighlightNode.static.primaryCommandName = 'syntaxhighlightInspector'; + +/* Registration */ + +ve.ce.nodeFactory.register( ve.ce.MWBlockSyntaxHighlightNode ); +ve.ce.nodeFactory.register( ve.ce.MWInlineSyntaxHighlightNode ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.dm.MWSyntaxHighlightNode.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.dm.MWSyntaxHighlightNode.js new file mode 100644 index 00000000..d05ec01d --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.dm.MWSyntaxHighlightNode.js @@ -0,0 +1,166 @@ +/*! + * VisualEditor DataModel MWSyntaxHighlightNode class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * DataModel MediaWiki syntax highlight node. + * + * @class + * @abstract + * + * @constructor + */ +ve.dm.MWSyntaxHighlightNode = function VeDmMWSyntaxHighlightNode() { +}; + +/* Inheritance */ + +OO.initClass( ve.dm.MWSyntaxHighlightNode ); + +/* Static members */ + +ve.dm.MWSyntaxHighlightNode.static.name = 'mwSyntaxHighlight'; + +ve.dm.MWSyntaxHighlightNode.static.extensionName = 'syntaxhighlight'; + +ve.dm.MWSyntaxHighlightNode.static.getMatchRdfaTypes = function () { + return [ 'mw:Extension/syntaxhighlight', 'mw:Extension/source' ]; +}; + +/* Static methods */ + +/** + * @inheritdoc + */ +ve.dm.MWSyntaxHighlightNode.static.toDataElement = function ( domElements, converter ) { + // Parent method + var isInline = this.isHybridInline( domElements, converter ), + type = isInline ? 'mwInlineSyntaxHighlight' : 'mwBlockSyntaxHighlight', + dataElement = ve.dm.MWExtensionNode.static.toDataElement.call( this, domElements, converter, type ); + + return dataElement; +}; + +( function () { + var supportedLanguages = [ undefined ], + geshiToPygmentsMap, + pygmentsToAceMap; + + /** + * Register supported Pygments languages. + * + * @param {Array} languages + */ + ve.dm.MWSyntaxHighlightNode.static.addPygmentsLanguages = function ( languages ) { + ve.batchPush( supportedLanguages, languages ); + }; + + /** + * Register map from Geshi to pygments lexer names. + * + * @param {Array} map + */ + ve.dm.MWSyntaxHighlightNode.static.addGeshiToPygmentsMap = function ( map ) { + geshiToPygmentsMap = map; + ve.batchPush( supportedLanguages, Object.keys( geshiToPygmentsMap ) ); + }; + + /** + * Register a map from pygments to Ace lexer names. + * + * @param {Array} map + */ + ve.dm.MWSyntaxHighlightNode.static.addPygmentsToAceMap = function ( map ) { + pygmentsToAceMap = map; + }; + + /** + * Converts a (valid) language as recognized by the SyntaxHighlight wikicode + * to a compatible Ace lexer name (to be used by CodeEditor) + * + * @param {string} language Language name + * @return {string} The name of the ace lexer + */ + ve.dm.MWSyntaxHighlightNode.static.convertLanguageToAce = function ( language ) { + language = geshiToPygmentsMap[ language ] || language; + return ( pygmentsToAceMap[ language ] || language ).toLowerCase(); + }; + + /** + * Check if a language is supported + * + * @param {string} language Language name + * @return {boolean} The language is supported + */ + ve.dm.MWSyntaxHighlightNode.static.isLanguageSupported = function ( language ) { + return supportedLanguages.indexOf( language || undefined ) !== -1; + }; + + /** + * Get an array of all languages (both Pygments and former GeSHi names) + * + * @return {Array} All currently supported languages + */ + ve.dm.MWSyntaxHighlightNode.static.getLanguages = function () { + return supportedLanguages.slice(); + }; +}() ); + +/* Methods */ + +/** + * Check if the node's current language is supported + * + * @return {boolean} The language is supported + */ +ve.dm.MWSyntaxHighlightNode.prototype.isLanguageSupported = function () { + return this.constructor.static.isLanguageSupported( this.getLanguage() ); +}; + +ve.dm.MWSyntaxHighlightNode.prototype.getLanguage = function () { + return this.getAttribute( 'mw' ).attrs.lang; +}; + +/* Concrete subclasses */ + +ve.dm.MWBlockSyntaxHighlightNode = function VeDmMWBlockSyntaxHighlightNode() { + // Parent method + ve.dm.MWBlockExtensionNode.super.apply( this, arguments ); + + // Mixin method + ve.dm.MWSyntaxHighlightNode.call( this ); +}; + +OO.inheritClass( ve.dm.MWBlockSyntaxHighlightNode, ve.dm.MWBlockExtensionNode ); + +OO.mixinClass( ve.dm.MWBlockSyntaxHighlightNode, ve.dm.MWSyntaxHighlightNode ); + +ve.dm.MWBlockSyntaxHighlightNode.static.name = 'mwBlockSyntaxHighlight'; + +ve.dm.MWBlockSyntaxHighlightNode.static.tagName = 'div'; + +ve.dm.MWInlineSyntaxHighlightNode = function VeDmMWInlineSyntaxHighlightNode() { + // Parent method + ve.dm.MWInlineExtensionNode.super.apply( this, arguments ); + + // Mixin method + ve.dm.MWSyntaxHighlightNode.call( this ); +}; + +OO.inheritClass( ve.dm.MWInlineSyntaxHighlightNode, ve.dm.MWInlineExtensionNode ); + +OO.mixinClass( ve.dm.MWInlineSyntaxHighlightNode, ve.dm.MWSyntaxHighlightNode ); + +ve.dm.MWInlineSyntaxHighlightNode.static.name = 'mwInlineSyntaxHighlight'; + +ve.dm.MWInlineSyntaxHighlightNode.static.tagName = 'code'; + +ve.dm.MWInlineSyntaxHighlightNode.static.isContent = true; + +/* Registration */ + +ve.dm.modelRegistry.register( ve.dm.MWBlockSyntaxHighlightNode ); +ve.dm.modelRegistry.register( ve.dm.MWInlineSyntaxHighlightNode ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.css b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.css new file mode 100644 index 00000000..de51edd5 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.css @@ -0,0 +1,20 @@ +/*! + * VisualEditor UserInterface MWSyntaxHighlightDialog styles. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +.ve-ui-mwSyntaxHighlightDialog-content .ve-ui-mwExtensionWindow-input { + max-width: none; +} + +.ve-ui-mwSyntaxHighlightDialog-content .ve-ui-mwExtensionWindow-input textarea { + /* T176636 */ + font-family: monospace, monospace; +} + +.ve-ui-mwSyntaxHighlightDialog-content .ve-ui-mwSyntaxHighlightWindow-languageField, +.ve-ui-mwSyntaxHighlightDialog-content .ve-ui-mwSyntaxHighlightWindow-startLineField { + max-width: 30em; +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.js new file mode 100644 index 00000000..76ed7a25 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.js @@ -0,0 +1,150 @@ +/*! + * VisualEditor UserInterface MWSyntaxHighlightDialog class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * MediaWiki syntax highlight dialog. + * + * @class + * @extends ve.ui.MWExtensionDialog + * @mixins ve.ui.MWSyntaxHighlightWindow + * + * @constructor + * @param {Object} [config] Configuration options + */ +ve.ui.MWSyntaxHighlightDialog = function VeUiMWSyntaxHighlightDialog() { + // Parent constructor + ve.ui.MWSyntaxHighlightDialog.super.apply( this, arguments ); + + // Mixin constructor + ve.ui.MWSyntaxHighlightWindow.call( this ); +}; + +/* Inheritance */ + +OO.inheritClass( ve.ui.MWSyntaxHighlightDialog, ve.ui.MWExtensionDialog ); + +OO.mixinClass( ve.ui.MWSyntaxHighlightDialog, ve.ui.MWSyntaxHighlightWindow ); + +/* Static properties */ + +ve.ui.MWSyntaxHighlightDialog.static.name = 'syntaxhighlightDialog'; + +ve.ui.MWSyntaxHighlightDialog.static.size = 'larger'; + +ve.ui.MWSyntaxHighlightDialog.static.modelClasses = [ ve.dm.MWBlockSyntaxHighlightNode ]; + +/* Methods */ + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightDialog.prototype.initialize = function () { + // Parent method + ve.ui.MWSyntaxHighlightDialog.super.prototype.initialize.call( this ); + + this.input = new ve.ui.MWAceEditorWidget( { + limit: 1, + rows: 10, + maxRows: 25, + autosize: true, + autocomplete: 'live', + classes: [ 've-ui-mwExtensionWindow-input' ] + } ); + + this.input.connect( this, { resize: 'updateSize' } ); + + // Mixin method + ve.ui.MWSyntaxHighlightWindow.prototype.initialize.call( this ); + + this.languageField.setAlignment( 'left' ); + + this.contentLayout = new OO.ui.PanelLayout( { + scrollable: true, + padded: true, + expanded: false, + content: [ + this.languageField, + this.codeField, + this.showLinesField, + this.startLineField + ] + } ); + + // Initialization + this.$content.addClass( 've-ui-mwSyntaxHighlightDialog-content' ); + this.$body.append( this.contentLayout.$element ); +}; + +/** + * @inheritdoc MWSyntaxHighlightWindow + */ +ve.ui.MWSyntaxHighlightDialog.prototype.onLanguageInputChange = function () { + var validity, dialog = this; + + // Mixin method + ve.ui.MWSyntaxHighlightWindow.prototype.onLanguageInputChange.call( this ); + + validity = this.language.getValidity(); + validity.always( function () { + var language = ve.dm.MWSyntaxHighlightNode.static.convertLanguageToAce( dialog.language.getValue() ); + dialog.input.setLanguage( validity.state() === 'resolved' ? language : 'text' ); + } ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightDialog.prototype.getReadyProcess = function ( data ) { + // Parent process + var process = ve.ui.MWSyntaxHighlightDialog.super.prototype.getReadyProcess.call( this, data ); + // Mixin process + return ve.ui.MWSyntaxHighlightWindow.prototype.getReadyProcess.call( this, data, process ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightDialog.prototype.getSetupProcess = function ( data ) { + // Parent process + var process = ve.ui.MWSyntaxHighlightDialog.super.prototype.getSetupProcess.call( this, data ); + // Mixin process + return ve.ui.MWSyntaxHighlightWindow.prototype.getSetupProcess.call( this, data, process ) + .first( function () { + this.input.setup(); + }, this ) + .next( function () { + this.onShowLinesCheckboxChange(); + this.input.clearUndoStack(); + }, this ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightDialog.prototype.getTeardownProcess = function ( data ) { + // Parent process + var process = ve.ui.MWSyntaxHighlightDialog.super.prototype.getTeardownProcess.call( this, data ); + // Mixin process + return ve.ui.MWSyntaxHighlightWindow.prototype.getTeardownProcess.call( this, data, process ).first( function () { + this.language.setValue( '' ); + this.input.teardown(); + }, this ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightDialog.prototype.updateMwData = function () { + // Parent method + ve.ui.MWSyntaxHighlightDialog.super.prototype.updateMwData.apply( this, arguments ); + // Mixin method + ve.ui.MWSyntaxHighlightWindow.prototype.updateMwData.apply( this, arguments ); +}; + +/* Registration */ + +ve.ui.windowFactory.register( ve.ui.MWSyntaxHighlightDialog ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialogTool.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialogTool.js new file mode 100644 index 00000000..e91e35f4 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialogTool.js @@ -0,0 +1,49 @@ +/*! + * VisualEditor UserInterface MWSyntaxHighlightDialogTool class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * MediaWiki UserInterface syntax highlight tool. + * + * @class + * @extends ve.ui.FragmentWindowTool + * @constructor + * @param {OO.ui.ToolGroup} toolGroup + * @param {Object} [config] Configuration options + */ +ve.ui.MWSyntaxHighlightDialogTool = function VeUiMWSyntaxHighlightDialogTool() { + ve.ui.MWSyntaxHighlightDialogTool.super.apply( this, arguments ); +}; +OO.inheritClass( ve.ui.MWSyntaxHighlightDialogTool, ve.ui.FragmentWindowTool ); +ve.ui.MWSyntaxHighlightDialogTool.static.name = 'syntaxhighlightDialog'; +ve.ui.MWSyntaxHighlightDialogTool.static.group = 'object'; +ve.ui.MWSyntaxHighlightDialogTool.static.icon = 'markup'; +ve.ui.MWSyntaxHighlightDialogTool.static.title = OO.ui.deferMsg( + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title' ); +ve.ui.MWSyntaxHighlightDialogTool.static.modelClasses = [ ve.dm.MWBlockSyntaxHighlightNode ]; +ve.ui.MWSyntaxHighlightDialogTool.static.commandName = 'syntaxhighlightDialog'; +ve.ui.toolFactory.register( ve.ui.MWSyntaxHighlightDialogTool ); + +ve.ui.commandRegistry.register( + new ve.ui.Command( + 'syntaxhighlightDialog', 'window', 'open', + { args: [ 'syntaxhighlightDialog' ], supportedSelections: [ 'linear' ] } + ) +); + +ve.ui.sequenceRegistry.register( + // Don't wait for the user to type out the full <syntaxhighlight> tag + new ve.ui.Sequence( 'wikitextSyntax', 'syntaxhighlightDialog', '<syntax', 7 ) +); + +ve.ui.sequenceRegistry.register( + new ve.ui.Sequence( 'wikitextSource', 'syntaxhighlightDialog', '<source', 7 ) +); + +ve.ui.commandHelpRegistry.register( 'insert', 'syntax', { + sequences: [ 'wikitextSyntax', 'wikitextSource' ], + label: OO.ui.deferMsg( 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title' ) +} ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.css b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.css new file mode 100644 index 00000000..32ff1c0b --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.css @@ -0,0 +1,15 @@ +/*! + * VisualEditor UserInterface MWSyntaxHighlightInspector styles. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +.ve-ui-mwSyntaxHighlightInspector-content .ve-ui-mwExtensionWindow-input textarea { + /* T176636 */ + font-family: monospace, monospace; +} + +.ve-ui-mwSyntaxHighlightInspector-content .oo-ui-numberInputWidget { + width: 10em; +} diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.js new file mode 100644 index 00000000..fe12327b --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.js @@ -0,0 +1,104 @@ +/*! + * VisualEditor UserInterface MWSyntaxHighlightInspector class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * MediaWiki syntax highlight inspector. + * + * @class + * @extends ve.ui.MWLiveExtensionInspector + * @mixins ve.ui.MWSyntaxHighlightWindow + * + * @constructor + * @param {Object} [config] Configuration options + */ +ve.ui.MWSyntaxHighlightInspector = function VeUiMWSyntaxHighlightInspector() { + // Parent constructor + ve.ui.MWSyntaxHighlightInspector.super.apply( this, arguments ); + + // Mixin constructor + ve.ui.MWSyntaxHighlightWindow.call( this ); +}; + +/* Inheritance */ + +OO.inheritClass( ve.ui.MWSyntaxHighlightInspector, ve.ui.MWLiveExtensionInspector ); + +OO.mixinClass( ve.ui.MWSyntaxHighlightInspector, ve.ui.MWSyntaxHighlightWindow ); + +/* Static properties */ + +ve.ui.MWSyntaxHighlightInspector.static.name = 'syntaxhighlightInspector'; + +ve.ui.MWSyntaxHighlightInspector.static.modelClasses = [ ve.dm.MWInlineSyntaxHighlightNode ]; + +/* Methods */ + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightInspector.prototype.initialize = function () { + // Parent method + ve.ui.MWSyntaxHighlightInspector.super.prototype.initialize.call( this ); + + // Mixin method + ve.ui.MWSyntaxHighlightWindow.prototype.initialize.call( this ); + + // Initialization + this.$content.addClass( 've-ui-mwSyntaxHighlightInspector-content' ); + this.form.$element.prepend( + this.languageField.$element, + this.codeField.$element + ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightInspector.prototype.getReadyProcess = function ( data ) { + // Parent process + var process = ve.ui.MWSyntaxHighlightInspector.super.prototype.getReadyProcess.call( this, data ); + // Mixin process + return ve.ui.MWSyntaxHighlightWindow.prototype.getReadyProcess.call( this, data, process ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightInspector.prototype.getSetupProcess = function ( data ) { + // Parent process + var process = ve.ui.MWSyntaxHighlightInspector.super.prototype.getSetupProcess.call( this, data ); + // Mixin process + return ve.ui.MWSyntaxHighlightWindow.prototype.getSetupProcess.call( this, data, process ).next( function () { + this.language.on( 'change', this.onChangeHandler ); + }, this ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightInspector.prototype.getTeardownProcess = function ( data ) { + // Parent process + var process = ve.ui.MWSyntaxHighlightInspector.super.prototype.getTeardownProcess.call( this, data ); + // Mixin process + return ve.ui.MWSyntaxHighlightWindow.prototype.getTeardownProcess.call( this, data, process ).first( function () { + this.language.off( 'change', this.onChangeHandler ); + }, this ); +}; + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightInspector.prototype.updateMwData = function () { + // Parent method + ve.ui.MWSyntaxHighlightInspector.super.prototype.updateMwData.apply( this, arguments ); + // Mixin method + ve.ui.MWSyntaxHighlightWindow.prototype.updateMwData.apply( this, arguments ); +}; + +/* Registration */ + +ve.ui.windowFactory.register( ve.ui.MWSyntaxHighlightInspector ); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspectorTool.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspectorTool.js new file mode 100644 index 00000000..47e26f16 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspectorTool.js @@ -0,0 +1,36 @@ +/*! + * VisualEditor UserInterface MWSyntaxHighlightInspectorTool class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * MediaWiki UserInterface syntax highlight tool. + * + * @class + * @extends ve.ui.FragmentInspectorTool + * @constructor + * @param {OO.ui.ToolGroup} toolGroup + * @param {Object} [config] Configuration options + */ +ve.ui.MWSyntaxHighlightInspectorTool = function VeUiMWSyntaxHighlightInspectorTool() { + ve.ui.MWSyntaxHighlightInspectorTool.super.apply( this, arguments ); +}; +OO.inheritClass( ve.ui.MWSyntaxHighlightInspectorTool, ve.ui.FragmentInspectorTool ); +ve.ui.MWSyntaxHighlightInspectorTool.static.name = 'syntaxhighlightInspector'; +ve.ui.MWSyntaxHighlightInspectorTool.static.group = 'object'; +ve.ui.MWSyntaxHighlightInspectorTool.static.icon = 'markup'; +ve.ui.MWSyntaxHighlightInspectorTool.static.title = OO.ui.deferMsg( + 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title' ); +ve.ui.MWSyntaxHighlightInspectorTool.static.modelClasses = [ ve.dm.MWInlineSyntaxHighlightNode ]; +ve.ui.MWSyntaxHighlightInspectorTool.static.commandName = 'syntaxhighlightInspector'; +ve.ui.MWSyntaxHighlightInspectorTool.static.autoAddToCatchall = false; +ve.ui.toolFactory.register( ve.ui.MWSyntaxHighlightInspectorTool ); + +ve.ui.commandRegistry.register( + new ve.ui.Command( + 'syntaxhighlightInspector', 'window', 'open', + { args: [ 'syntaxhighlightInspector' ], supportedSelections: [ 'linear' ] } + ) +); diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightWindow.js b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightWindow.js new file mode 100644 index 00000000..beaf1f35 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightWindow.js @@ -0,0 +1,170 @@ +/*! + * VisualEditor UserInterface MWSyntaxHighlightWindow class. + * + * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/** + * MediaWiki syntax highlight window. + * + * @class + * @abstract + * + * @constructor + */ +ve.ui.MWSyntaxHighlightWindow = function VeUiMWSyntaxHighlightWindow() { +}; + +/* Inheritance */ + +OO.initClass( ve.ui.MWSyntaxHighlightWindow ); + +/* Static properties */ + +ve.ui.MWSyntaxHighlightWindow.static.icon = 'alienextension'; + +ve.ui.MWSyntaxHighlightWindow.static.title = OO.ui.deferMsg( 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-title' ); + +ve.ui.MWSyntaxHighlightWindow.static.dir = 'ltr'; + +/* Methods */ + +/** + * @inheritdoc + */ +ve.ui.MWSyntaxHighlightWindow.prototype.initialize = function () { + var noneMsg = ve.msg( 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-none' ); + + this.language = new OO.ui.ComboBoxInputWidget( { + $overlay: this.$overlay, + menu: { + filterFromInput: true, + items: $.map( ve.dm.MWSyntaxHighlightNode.static.getLanguages(), function ( lang ) { + return new OO.ui.MenuOptionWidget( { data: lang, label: lang || noneMsg } ); + } ) + }, + validate: function ( input ) { + return ve.dm.MWSyntaxHighlightNode.static.isLanguageSupported( input ); + } + } ); + + this.showLinesCheckbox = new OO.ui.CheckboxInputWidget(); + + this.startLineNumber = new OO.ui.NumberInputWidget( { + min: 0, + isInteger: true + } ); + + // Events + this.language.connect( this, { change: 'onLanguageInputChange' } ); + this.showLinesCheckbox.connect( this, { change: 'onShowLinesCheckboxChange' } ); + this.startLineNumber.connect( this, { change: 'onStartLineNumberChange' } ); + + this.languageField = new OO.ui.FieldLayout( this.language, { + classes: [ 've-ui-mwSyntaxHighlightWindow-languageField' ], + align: 'top', + label: ve.msg( 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-language' ) + } ); + this.codeField = new OO.ui.FieldLayout( this.input, { + align: 'top', + label: ve.msg( 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-code' ) + } ); + this.showLinesField = new OO.ui.FieldLayout( this.showLinesCheckbox, { + align: 'inline', + label: ve.msg( 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-showlines' ) + } ); + this.startLineField = new OO.ui.FieldLayout( this.startLineNumber, { + classes: [ 've-ui-mwSyntaxHighlightWindow-startLineField' ], + align: 'left', + label: ve.msg( 'syntaxhighlight-visualeditor-mwsyntaxhighlightinspector-startingline' ) + } ); +}; + +/** + * Handle input change events + * + * @param {string} value New value + */ +ve.ui.MWSyntaxHighlightWindow.prototype.onLanguageInputChange = function () { + var validity, inspector = this; + validity = this.language.getValidity(); + validity.always( function () { + inspector.getActions().setAbilities( { done: validity.state() === 'resolved' } ); + } ); +}; + +/** + * Handle change events from the show lines chechbox + * + * @param {boolean} value Widget value + */ +ve.ui.MWSyntaxHighlightWindow.prototype.onShowLinesCheckboxChange = function () { + var showLines = this.showLinesCheckbox.isSelected(); + this.input.toggleLineNumbers( showLines ); + this.startLineNumber.setDisabled( !showLines ); +}; + +/** + * Handle change events from the start line input + * + * @param {string} value Widget value + */ +ve.ui.MWSyntaxHighlightWindow.prototype.onStartLineNumberChange = function ( value ) { + var input = this.input; + + input.loadingPromise.done( function () { + input.editor.setOption( 'firstLineNumber', value !== '' ? +value : 1 ); + } ); +}; + +/** + * @inheritdoc OO.ui.Window + */ +ve.ui.MWSyntaxHighlightWindow.prototype.getReadyProcess = function ( data, process ) { + return process.next( function () { + this.language.getMenu().toggle( false ); + if ( !this.language.getValue() ) { + this.language.focus(); + } else { + this.input.focus(); + } + }, this ); +}; + +/** + * @inheritdoc OO.ui.Window + */ +ve.ui.MWSyntaxHighlightWindow.prototype.getSetupProcess = function ( data, process ) { + return process.next( function () { + var attrs = this.selectedNode ? this.selectedNode.getAttribute( 'mw' ).attrs : {}, + language = attrs.lang || '', + showLines = attrs.line !== undefined, + startLine = attrs.start; + + this.language.setValue( language ); + + this.showLinesCheckbox.setSelected( showLines ); + this.startLineNumber.setValue( startLine ); + }, this ); +}; + +/** + * @inheritdoc OO.ui.Window + */ +ve.ui.MWSyntaxHighlightWindow.prototype.getTeardownProcess = function ( data, process ) { + return process; +}; + +/** + * @inheritdoc ve.ui.MWExtensionWindow + */ +ve.ui.MWSyntaxHighlightWindow.prototype.updateMwData = function ( mwData ) { + var language = this.language.getValue(), + showLines = this.showLinesCheckbox.isSelected(), + startLine = this.startLineNumber.getValue(); + + mwData.attrs.lang = language || undefined; + mwData.attrs.line = showLines ? '1' : undefined; + mwData.attrs.start = startLine !== '' ? startLine : undefined; +}; diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/phpcs.xml b/www/wiki/extensions/SyntaxHighlight_GeSHi/phpcs.xml new file mode 100644 index 00000000..c6aa2655 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/phpcs.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<ruleset> + <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki"> + <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" /> + <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamComment" /> + <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamName" /> + <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" /> + <exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" /> + <exclude name="MediaWiki.Commenting.FunctionComment.ParamNameNoMatch" /> + <exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" /> + <exclude name="MediaWiki.Files.ClassMatchesFilename.WrongCase" /> + <exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName"/> + <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment"/> + </rule> + <file>.</file> + <arg name="extensions" value="php,php5,inc"/> + <arg name="encoding" value="UTF-8"/> + <exclude-pattern>vendor</exclude-pattern> + <exclude-pattern>node_modules</exclude-pattern> +</ruleset> diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/AUTHORS b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/AUTHORS new file mode 100644 index 00000000..9318d438 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/AUTHORS @@ -0,0 +1,202 @@ +Pygments is written and maintained by Georg Brandl <georg@python.org>. + +Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher +<armin.ronacher@active-4.com>. + +Other contributors, listed alphabetically, are: + +* Sam Aaron -- Ioke lexer +* Ali Afshar -- image formatter +* Thomas Aglassinger -- Easytrieve, JCL and Rexx lexers +* Muthiah Annamalai -- Ezhil lexer +* Kumar Appaiah -- Debian control lexer +* Andreas Amann -- AppleScript lexer +* Timothy Armstrong -- Dart lexer fixes +* Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers +* Jeremy Ashkenas -- CoffeeScript lexer +* José Joaquín Atria -- Praat lexer +* Stefan Matthias Aust -- Smalltalk lexer +* Lucas Bajolet -- Nit lexer +* Ben Bangert -- Mako lexers +* Max Battcher -- Darcs patch lexer +* Thomas Baruchel -- APL lexer +* Tim Baumann -- (Literate) Agda lexer +* Paul Baumgart, 280 North, Inc. -- Objective-J lexer +* Michael Bayer -- Myghty lexers +* Thomas Beale -- Archetype lexers +* John Benediktsson -- Factor lexer +* Trevor Bergeron -- mIRC formatter +* Vincent Bernat -- LessCSS lexer +* Christopher Bertels -- Fancy lexer +* Sébastien Bigaret -- QVT Operational lexer +* Jarrett Billingsley -- MiniD lexer +* Adam Blinkinsop -- Haskell, Redcode lexers +* Frits van Bommel -- assembler lexers +* Pierre Bourdon -- bugfixes +* chebee7i -- Python traceback lexer improvements +* Hiram Chirino -- Scaml and Jade lexers +* Ian Cooper -- VGL lexer +* David Corbett -- Inform, Jasmin, and TADS 3 lexers +* Leaf Corcoran -- MoonScript lexer +* Christopher Creutzig -- MuPAD lexer +* Daniël W. Crompton -- Pike lexer +* Pete Curry -- bugfixes +* Bryan Davis -- EBNF lexer +* Bruno Deferrari -- Shen lexer +* Giedrius Dubinskas -- HTML formatter improvements +* Owen Durni -- Haxe lexer +* Alexander Dutton, Oxford University Computing Services -- SPARQL lexer +* James Edwards -- Terraform lexer +* Nick Efford -- Python 3 lexer +* Sven Efftinge -- Xtend lexer +* Artem Egorkine -- terminal256 formatter +* Matthew Fernandez -- CAmkES lexer +* Michael Ficarra -- CPSA lexer +* James H. Fisher -- PostScript lexer +* William S. Fulton -- SWIG lexer +* Carlos Galdino -- Elixir and Elixir Console lexers +* Michael Galloy -- IDL lexer +* Naveen Garg -- Autohotkey lexer +* Laurent Gautier -- R/S lexer +* Alex Gaynor -- PyPy log lexer +* Richard Gerkin -- Igor Pro lexer +* Alain Gilbert -- TypeScript lexer +* Alex Gilding -- BlitzBasic lexer +* Bertrand Goetzmann -- Groovy lexer +* Krzysiek Goj -- Scala lexer +* Matt Good -- Genshi, Cheetah lexers +* Michał Górny -- vim modeline support +* Alex Gosse -- TrafficScript lexer +* Patrick Gotthardt -- PHP namespaces support +* Olivier Guibe -- Asymptote lexer +* Jordi Gutiérrez Hermoso -- Octave lexer +* Florian Hahn -- Boogie lexer +* Martin Harriman -- SNOBOL lexer +* Matthew Harrison -- SVG formatter +* Steven Hazel -- Tcl lexer +* Dan Michael Heggø -- Turtle lexer +* Aslak Hellesøy -- Gherkin lexer +* Greg Hendershott -- Racket lexer +* Justin Hendrick -- ParaSail lexer +* David Hess, Fish Software, Inc. -- Objective-J lexer +* Varun Hiremath -- Debian control lexer +* Rob Hoelz -- Perl 6 lexer +* Doug Hogan -- Mscgen lexer +* Ben Hollis -- Mason lexer +* Max Horn -- GAP lexer +* Alastair Houghton -- Lexer inheritance facility +* Tim Howard -- BlitzMax lexer +* Dustin Howett -- Logos lexer +* Ivan Inozemtsev -- Fantom lexer +* Hiroaki Itoh -- Shell console rewrite, Lexers for PowerShell session, MSDOS session, BC +* Brian R. Jackson -- Tea lexer +* Christian Jann -- ShellSession lexer +* Dennis Kaarsemaker -- sources.list lexer +* Dmitri Kabak -- Inferno Limbo lexer +* Igor Kalnitsky -- vhdl lexer +* Alexander Kit -- MaskJS lexer +* Pekka Klärck -- Robot Framework lexer +* Gerwin Klein -- Isabelle lexer +* Eric Knibbe -- Lasso lexer +* Stepan Koltsov -- Clay lexer +* Adam Koprowski -- Opa lexer +* Benjamin Kowarsch -- Modula-2 lexer +* Domen Kožar -- Nix lexer +* Oleh Krekel -- Emacs Lisp lexer +* Alexander Kriegisch -- Kconfig and AspectJ lexers +* Marek Kubica -- Scheme lexer +* Jochen Kupperschmidt -- Markdown processor +* Gerd Kurzbach -- Modelica lexer +* Jon Larimer, Google Inc. -- Smali lexer +* Olov Lassus -- Dart lexer +* Matt Layman -- TAP lexer +* Sylvestre Ledru -- Scilab lexer +* Mark Lee -- Vala lexer +* Valentin Lorentz -- C++ lexer improvements +* Ben Mabey -- Gherkin lexer +* Angus MacArthur -- QML lexer +* Louis Mandel -- X10 lexer +* Louis Marchand -- Eiffel lexer +* Simone Margaritelli -- Hybris lexer +* Kirk McDonald -- D lexer +* Gordon McGregor -- SystemVerilog lexer +* Stephen McKamey -- Duel/JBST lexer +* Brian McKenna -- F# lexer +* Charles McLaughlin -- Puppet lexer +* Lukas Meuser -- BBCode formatter, Lua lexer +* Cat Miller -- Pig lexer +* Paul Miller -- LiveScript lexer +* Hong Minhee -- HTTP lexer +* Michael Mior -- Awk lexer +* Bruce Mitchener -- Dylan lexer rewrite +* Reuben Morais -- SourcePawn lexer +* Jon Morton -- Rust lexer +* Paulo Moura -- Logtalk lexer +* Mher Movsisyan -- DTD lexer +* Dejan Muhamedagic -- Crmsh lexer +* Ana Nelson -- Ragel, ANTLR, R console lexers +* Nam T. Nguyen -- Monokai style +* Jesper Noehr -- HTML formatter "anchorlinenos" +* Mike Nolta -- Julia lexer +* Jonas Obrist -- BBCode lexer +* Edward O'Callaghan -- Cryptol lexer +* David Oliva -- Rebol lexer +* Pat Pannuto -- nesC lexer +* Jon Parise -- Protocol buffers and Thrift lexers +* Benjamin Peterson -- Test suite refactoring +* Ronny Pfannschmidt -- BBCode lexer +* Dominik Picheta -- Nimrod lexer +* Andrew Pinkham -- RTF Formatter Refactoring +* Clément Prévost -- UrbiScript lexer +* Elias Rabel -- Fortran fixed form lexer +* raichoo -- Idris lexer +* Kashif Rasul -- CUDA lexer +* Justin Reidy -- MXML lexer +* Norman Richards -- JSON lexer +* Corey Richardson -- Rust lexer updates +* Lubomir Rintel -- GoodData MAQL and CL lexers +* Andre Roberge -- Tango style +* Konrad Rudolph -- LaTeX formatter enhancements +* Mario Ruggier -- Evoque lexers +* Miikka Salminen -- Lovelace style, Hexdump lexer, lexer enhancements +* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers +* Matteo Sasso -- Common Lisp lexer +* Joe Schafer -- Ada lexer +* Ken Schutte -- Matlab lexers +* Tassilo Schweyer -- Io, MOOCode lexers +* Ted Shaw -- AutoIt lexer +* Joerg Sieker -- ABAP lexer +* Robert Simmons -- Standard ML lexer +* Kirill Simonov -- YAML lexer +* Alexander Smishlajev -- Visual FoxPro lexer +* Steve Spigarelli -- XQuery lexer +* Jerome St-Louis -- eC lexer +* James Strachan -- Kotlin lexer +* Tom Stuart -- Treetop lexer +* Colin Sullivan -- SuperCollider lexer +* Edoardo Tenani -- Arduino lexer +* Tiberius Teng -- default style overhaul +* Jeremy Thurgood -- Erlang, Squid config lexers +* Brian Tiffin -- OpenCOBOL lexer +* Bob Tolbert -- Hy lexer +* Erick Tryzelaar -- Felix lexer +* Alexander Udalov -- Kotlin lexer improvements +* Thomas Van Doren -- Chapel lexer +* Daniele Varrazzo -- PostgreSQL lexers +* Abe Voelker -- OpenEdge ABL lexer +* Pepijn de Vos -- HTML formatter CTags support +* Matthias Vallentin -- Bro lexer +* Linh Vu Hong -- RSL lexer +* Nathan Weizenbaum -- Haml and Sass lexers +* Nathan Whetsell -- Csound lexers +* Dietmar Winkler -- Modelica lexer +* Nils Winter -- Smalltalk lexer +* Davy Wybiral -- Clojure lexer +* Whitney Young -- ObjectiveC lexer +* Diego Zamboni -- CFengine3 lexer +* Enrique Zamudio -- Ceylon lexer +* Alex Zimin -- Nemerle lexer +* Rob Zimmerman -- Kal lexer +* Vincent Zurczak -- Roboconf lexer + +Many thanks for all contributions! diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/PYGMENTS_LICENSE b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/PYGMENTS_LICENSE new file mode 100644 index 00000000..f24578fd --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/PYGMENTS_LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2006-2015 by the respective authors (see AUTHORS file). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/VERSION b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/VERSION new file mode 100644 index 00000000..ccbccc3d --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/VERSION @@ -0,0 +1 @@ +2.2.0 diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/create_pygmentize_bundle b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/create_pygmentize_bundle new file mode 100755 index 00000000..d69fa690 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/create_pygmentize_bundle @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" + Create a standalone, executable 'pygmentize' bundle. + Author: Ori Livneh + +""" +import hashlib +import io +import os +import stat +import textwrap +import urllib.request +import xmlrpc.client +import zipfile + + +PYGMENTIZE_LAUNCHER = textwrap.dedent('''\ + #!/usr/bin/env python3 + + import sys + import pygments.cmdline + try: + sys.exit(pygments.cmdline.main(sys.argv)) + except KeyboardInterrupt: + sys.exit(1) +''') + + +print('Querying PyPI for the latest Pygments release...') +pypi = xmlrpc.client.ServerProxy('https://pypi.python.org/pypi') +latest_version = pypi.package_releases('Pygments')[0] +for release in pypi.release_urls('Pygments', latest_version): + if (release['packagetype'] == 'bdist_wheel' and + release['python_version'].startswith('py2')): + url = release['url'] + md5_digest = release['md5_digest'] + break + else: + raise RuntimeError('No suitable package found.') + +print('Retrieving version %s (%s)...' % (latest_version, url)) +req = urllib.request.urlopen(url) +buf = io.BytesIO(req.read()) + +print('Verifying...') +if hashlib.md5(buf.getvalue()).hexdigest() != md5_digest: + raise RuntimeError('MD5 checksum mismatch.') + +print('Creating executable ZIP bundle...') +with zipfile.ZipFile(buf, 'a') as zf: + zf.writestr('__main__.py', PYGMENTIZE_LAUNCHER) + +data = buf.getvalue() +script_dir = os.path.dirname(os.path.abspath(__file__)) +file_path = os.path.join(script_dir, 'pygmentize') +with open(file_path, 'wb') as f: + f.write(b'#!/usr/bin/env python3\n') + f.write(data) + +file_st = os.stat(file_path) +os.chmod(file_path, file_st.st_mode | stat.S_IEXEC) + +with open(os.path.join(script_dir, 'VERSION'), 'w') as f: + f.write(latest_version + '\n') + +print('Done. Wrote %s bytes to %s' % (len(data), file_path)) diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize Binary files differnew file mode 100755 index 00000000..b02e4c7f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parser/parserTests.txt b/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parser/parserTests.txt new file mode 100644 index 00000000..8326964f --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parser/parserTests.txt @@ -0,0 +1,168 @@ +!! hooks +source +!! endhooks + +!! test +Non-existent language +!!input +<source lang="doesnotexist"> +foobar +</source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>foobar</pre></div> + +!! end + +!! test +No language specified +!! wikitext +<source> +foo +</source> +!! html +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>foo</pre></div> + +!! end + +!! test +No language specified (no wellformed xml) +!! config +!! wikitext +<source> +bar +</source> +!! html +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>bar</pre></div> + +!! end + +!! test +XSS is escaped +!!input +<source lang="doesnotexist"> +<script>alert("pwnd")</script> +<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> +<IMG +SRC=javascript:alert( +'XSS') +\";alert('XSS');// +</script><script>alert('XSS');</script> +%253cscript%253ealert(document.cookie)%253c/script%253e +</source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><script>alert("pwnd")</script> +<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> +<IMG +SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40; +&#39;&#88;&#83;&#83;&#39;&#41; +\";alert('XSS');// +</script><script>alert('XSS');</script> +%253cscript%253ealert(document.cookie)%253c/script%253e</pre></div> + +!! end + +!! test +XSS is escaped (inline) +!!input +<source lang="doesnotexist" inline> +<script>alert("pwnd")</script> +<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> +<IMG +SRC=javascript:alert( +'XSS') +\";alert('XSS');// +</script><script>alert('XSS');</script> +%253cscript%253ealert(document.cookie)%253c/script%253e +</source> +!! result +<p><code class="mw-highlight" dir="ltr"><script>alert("pwnd")</script> <IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> <IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40; &#39;&#88;&#83;&#83;&#39;&#41; \";alert('XSS');// </script><script>alert('XSS');</script> %253cscript%253ealert(document.cookie)%253c/script%253e</code> +</p> +!! end + +!! test +Default behaviour (inner is pre) +!!input +<source lang="javascript"> +var a; +</source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span> +</pre></div> + +!! end + +!! test +Multiline <source/> in lists +!!input +* <source>a +b</source> + +* foo <source>a +b</source> +!! html +<ul><li><div class="mw-highlight mw-content-ltr" dir="ltr"><pre>a +b</pre></div></li></ul> +<ul><li>foo <div class="mw-highlight mw-content-ltr" dir="ltr"><pre>a +b</pre></div></li></ul> + +!! html+tidy +<ul><li><div class="mw-highlight mw-content-ltr" dir="ltr"><pre>a +b</pre></div></li></ul> +<ul><li>foo <div class="mw-highlight mw-content-ltr" dir="ltr"><pre>a +b</pre></div></li></ul> +!! end + +!! test +Custom attributes +!!input +<source lang="javascript" id="foo" class="bar" dir="rtl" style="font-size: larger;">var a;</source> +!! result +<div id="foo" class="bar mw-highlight mw-content-rtl" dir="rtl" style="font-size: larger;"><pre><span></span><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span> +</pre></div> + +!! end + +!! test +Inline attribute (inline code) +!!input +Text <source lang="javascript" inline>var a;</source>. +!! result +<p>Text <code class="mw-highlight" dir="ltr"><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span></code>. +</p> +!! end + +!! test +Enclose none (inline code) +!!input +Text <source lang="javascript" enclose="none">var a;</source>. +!! result +<p>Text <code class="mw-highlight" dir="ltr"><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span></code>. +</p> +!! end + +!! test +Enclose with nowiki +!! input +{{#tag:syntaxhighlight|<nowiki>foo</nowiki>|lang="text"|inline=none}} +!! result +<p><code class="mw-highlight" dir="ltr">foo</code> +</p> +!! end + +!! test +No code +!! input +<source lang="CSharp"></source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"></div> + +!! end + +!! test +Just whitespace +!! input +<source lang="CSharp"> </source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"></div> + +!! end diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parserTests.txt b/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parserTests.txt new file mode 100644 index 00000000..8864c2d6 --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parserTests.txt @@ -0,0 +1,164 @@ +!! hooks +source +!! endhooks + +!! test +Non-existent language +!!input +<source lang="doesnotexist"> +foobar +</source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>foobar</pre></div> + +!! end + +!! test +No language specified +!! wikitext +<source> +foo +</source> +!! html +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>foo</pre></div> + +!! end + +!! test +No language specified (no wellformed xml) +!! config +!! wikitext +<source> +bar +</source> +!! html +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>bar</pre></div> + +!! end + +!! test +XSS is escaped +!!input +<source lang="doesnotexist"> +<script>alert("pwnd")</script> +<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> +<IMG +SRC=javascript:alert( +'XSS') +\";alert('XSS');// +</script><script>alert('XSS');</script> +%253cscript%253ealert(document.cookie)%253c/script%253e +</source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><script>alert("pwnd")</script> +<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> +<IMG +SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40; +&#39;&#88;&#83;&#83;&#39;&#41; +\";alert('XSS');// +</script><script>alert('XSS');</script> +%253cscript%253ealert(document.cookie)%253c/script%253e</pre></div> + +!! end + +!! test +XSS is escaped (inline) +!!input +<source lang="doesnotexist" inline> +<script>alert("pwnd")</script> +<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> +<IMG +SRC=javascript:alert( +'XSS') +\";alert('XSS');// +</script><script>alert('XSS');</script> +%253cscript%253ealert(document.cookie)%253c/script%253e +</source> +!! result +<p><code class="mw-highlight" dir="ltr"><script>alert("pwnd")</script> <IMG SRC=`javascript:alert("RSnake says, 'XSS'")`> <IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40; &#39;&#88;&#83;&#83;&#39;&#41; \";alert('XSS');// </script><script>alert('XSS');</script> %253cscript%253ealert(document.cookie)%253c/script%253e</code> +</p> +!! end + +!! test +Default behaviour (inner is pre) +!!input +<source lang="javascript"> +var a; +</source> +!! result +<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span> +</pre></div> + +!! end + +!! test +Multiline <source/> in lists +!!input +* <source>a +b</source> + +* foo <source>a +b</source> +!! html +<ul><li> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre>a +b</pre></div></li></ul> +<ul><li> foo <div class="mw-highlight mw-content-ltr" dir="ltr"><pre>a +b</pre></div></li></ul> + +!! html+tidy +<ul> +<li> +<div class="mw-highlight mw-content-ltr" dir="ltr"> +<pre> +a +b +</pre></div> +</li> +</ul> +<ul> +<li>foo +<div class="mw-highlight mw-content-ltr" dir="ltr"> +<pre> +a +b +</pre></div> +</li> +</ul> +!! end + +!! test +Custom attributes +!!input +<source lang="javascript" id="foo" class="bar" dir="rtl" style="font-size: larger;">var a;</source> +!! result +<div id="foo" class="bar mw-highlight mw-content-rtl" dir="rtl" style="font-size: larger;"><pre><span></span><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span> +</pre></div> + +!! end + +!! test +Inline attribute (inline code) +!!input +Text <source lang="javascript" inline>var a;</source>. +!! result +<p>Text <code class="mw-highlight" dir="ltr"><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span></code>. +</p> +!! end + +!! test +Enclose none (inline code) +!!input +Text <source lang="javascript" enclose="none">var a;</source>. +!! result +<p>Text <code class="mw-highlight" dir="ltr"><span class="kd">var</span> <span class="nx">a</span><span class="p">;</span></code>. +</p> +!! end + +!! test +Enclose with nowiki +!! input +{{#tag:syntaxhighlight|<nowiki>foo</nowiki>|lang="text"|inline=none}} +!! result +<p><code class="mw-highlight" dir="ltr">foo</code> +</p> +!! end diff --git a/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/phan/config.php b/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/phan/config.php new file mode 100644 index 00000000..6b93adce --- /dev/null +++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/tests/phan/config.php @@ -0,0 +1,6 @@ +<?php + +$cfg = require __DIR__ . '/../../vendor/mediawiki/mediawiki-phan-config/src/config.php'; +$cfg['suppress_issue_types'][] = 'PhanDeprecatedClass'; + +return $cfg; |