summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SyntaxHighlight_GeSHi
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
committerYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
commitfc7369835258467bf97eb64f184b93691f9a9fd5 (patch)
treedaabd60089d2dd76d9f5fb416b005fbe159c799d /www/wiki/extensions/SyntaxHighlight_GeSHi
first commit
Diffstat (limited to 'www/wiki/extensions/SyntaxHighlight_GeSHi')
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/CODE_OF_CONDUCT.md1
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/COPYING339
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/Gruntfile.js52
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/README55
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderGeSHiVisualEditorModule.php58
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/ResourceLoaderSyntaxHighlightVisualEditorModule.php70
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.compat.php113
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.GeSHi.php39
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.ace.php174
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.class.php553
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight.lexers.php679
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php513
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.compat.php147
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.lexers.php637
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php14
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/composer.json47
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/extension.json76
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ady-cyrl.json10
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/af.json19
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/an.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ar.json22
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/arz.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ast.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/az.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ba.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bcc.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be-tarask.json12
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/be.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bg.json15
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bn.json22
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/br.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/bs.json21
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ca.json16
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ce.json13
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ckb.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/cs.json22
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/da.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/de.json21
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/diq.json16
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/dsb.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/el.json23
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/en.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eo.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/es.json25
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/et.json18
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/eu.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fa.json14
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fi.json18
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/fr.json27
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/frp.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gl.json22
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-deva.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gom-latn.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/gsw.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/he.json21
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hi.json10
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hr.json18
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hsb.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ht.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hu.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/hy.json14
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ia.json10
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/id.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ie.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ilo.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/is.json16
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/it.json21
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ja.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jut.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/jv.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ka.json13
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kab.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/km.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/kn.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ko.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ksh.json18
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ku-latn.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lb.json15
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/li.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lij.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lki.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lrc.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lt.json10
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/lv.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mk.json19
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ml.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mr.json10
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ms.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/mwl.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nb.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nds.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nl.json21
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/nn.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/oc.json10
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/olo.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/om.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pam.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pl.json22
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pms.json9
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ps.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt-br.json21
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/pt.json22
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/qqq.json25
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ro.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/roa-tara.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/ru.json23
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/rue.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sah.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/shn.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sk.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sl.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-ec.json15
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sr-el.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/stq.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/su.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/sv.json17
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/te.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-cyrl.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tg-latn.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tk.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tl.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tokipona.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tr.json11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/tt-cyrl.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/uk.json23
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vec.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/vi.json19
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/yue.json8
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hans.json20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/i18n/zh-hant.json18
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/includes/GeSHi.php42
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/includes/ResourceLoaderSyntaxHighlightVisualEditorModule.php70
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlight.php577
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightAce.php174
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlightGeSHiCompat.php113
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateCSS.php68
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/maintenance/updateLexerList.php79
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.generated.css70
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/pygments.wrapper.css63
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/AUTHORS.txt6
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/LICENSE.txt20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.css11
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ce.MWSyntaxHighlightNode.js92
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.dm.MWSyntaxHighlightNode.js166
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.css20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialog.js150
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightDialogTool.js49
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.css15
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspector.js104
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightInspectorTool.js36
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/modules/ve-syntaxhighlight/ve.ui.MWSyntaxHighlightWindow.js170
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/phpcs.xml20
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/AUTHORS202
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/PYGMENTS_LICENSE25
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/VERSION1
-rwxr-xr-xwww/wiki/extensions/SyntaxHighlight_GeSHi/pygments/create_pygmentize_bundle67
-rwxr-xr-xwww/wiki/extensions/SyntaxHighlight_GeSHi/pygments/pygmentizebin0 -> 842007 bytes
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parser/parserTests.txt168
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/tests/parserTests.txt164
-rw-r--r--www/wiki/extensions/SyntaxHighlight_GeSHi/tests/phan/config.php6
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 &#9; to tab, so we can armor it that way.
+ if ( $wgUseTidy ) {
+ $out = str_replace( "\t", '&#9;', $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 &#9; to tab, so we can armor it that way.
+ if ( $wgUseTidy ) {
+ $out = str_replace( "\t", '&#9;', $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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;source&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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\">&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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>&lt;syntaxhighlight&gt;</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 &#9; to tab, so we can armor it that way.
+ if ( $wgUseTidy ) {
+ $out = str_replace( "\t", '&#9;', $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
new file mode 100755
index 00000000..b02e4c7f
--- /dev/null
+++ b/www/wiki/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize
Binary files differ
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=&#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
+</source>
+!! result
+<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>&lt;script>alert("pwnd")&lt;/script>
+&lt;IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
+&lt;IMG
+SRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;
+&amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#41;
+\";alert('XSS');//
+&lt;/script>&lt;script>alert('XSS');&lt;/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=&#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
+</source>
+!! result
+<p><code class="mw-highlight" dir="ltr">&lt;script&gt;alert("pwnd")&lt;/script&gt; &lt;IMG SRC=`javascript:alert("RSnake says, 'XSS'")`&gt; &lt;IMG SRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40; &amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#41; \";alert('XSS');// &lt;/script&gt;&lt;script&gt;alert('XSS');&lt;/script&gt;&#160;%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=&#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
+</source>
+!! result
+<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>&lt;script>alert("pwnd")&lt;/script>
+&lt;IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
+&lt;IMG
+SRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;
+&amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#41;
+\";alert('XSS');//
+&lt;/script>&lt;script>alert('XSS');&lt;/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=&#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
+</source>
+!! result
+<p><code class="mw-highlight" dir="ltr">&lt;script&gt;alert("pwnd")&lt;/script&gt; &lt;IMG SRC=`javascript:alert("RSnake says, 'XSS'")`&gt; &lt;IMG SRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40; &amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#41; \";alert('XSS');// &lt;/script&gt;&lt;script&gt;alert('XSS');&lt;/script&gt;&#160;%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;