diff --git a/SyntaxHighlight_GeSHi.class.php b/SyntaxHighlight_GeSHi.class.php index 0ba0aa0b..ddaea804 100644 --- a/SyntaxHighlight_GeSHi.class.php +++ b/SyntaxHighlight_GeSHi.class.php @@ -29,31 +29,6 @@ class SyntaxHighlight_GeSHi { */ private static $languages = null; - /** - * Executed after processing extension.json - */ - public static function registerExtension() { - global $wgVersion; - if ( version_compare( $wgVersion, '1.25', '<' ) ) { - die( 'This version of SyntaxHighlight GeSHi requires MediaWiki 1.25' ); - } - - require_once __DIR__ . '/SyntaxHighlight_GeSHi.langs.php'; - require_once __DIR__ . '/geshi/geshi.php'; - } - - /** - * Register parser hook - * - * @param $parser Parser - * @return bool - */ - public static function configureParser( &$parser ) { - $parser->setHook( 'source', array( 'SyntaxHighlight_GeSHi', 'parserHook' ) ); - $parser->setHook( 'syntaxhighlight', array( 'SyntaxHighlight_GeSHi', 'parserHook' ) ); - return true; - } - /** * Parser hook * @@ -70,7 +45,7 @@ class SyntaxHighlight_GeSHi { $text = preg_replace( '/^\n+/', '', $text ); // Validate language - if ( isset( $args['lang'] ) && $args['lang'] ) { + if( isset( $args['lang'] ) && $args['lang'] ) { $lang = $args['lang']; } else { // language is not specified. Check if default exists, if yes, use it. @@ -82,12 +57,12 @@ class SyntaxHighlight_GeSHi { } } $lang = strtolower( $lang ); - if ( !preg_match( '/^[a-z_0-9-]*$/', $lang ) ) { + if( !preg_match( '/^[a-z_0-9-]*$/', $lang ) ) { $error = self::formatLanguageError( $text ); return $error; } $geshi = self::prepare( $text, $lang ); - if ( !$geshi instanceof GeSHi ) { + if( !$geshi instanceof GeSHi ) { $error = self::formatLanguageError( $text ); return $error; } @@ -95,23 +70,23 @@ class SyntaxHighlight_GeSHi { $enclose = self::getEncloseType( $args ); // Line numbers - if ( isset( $args['line'] ) ) { + if( isset( $args['line'] ) ) { $geshi->enable_line_numbers( GESHI_FANCY_LINE_NUMBERS ); } // Highlighting specific lines - if ( isset( $args['highlight'] ) ) { + if( isset( $args['highlight'] ) ) { $lines = self::parseHighlightLines( $args['highlight'] ); if ( count( $lines ) ) { $geshi->highlight_lines_extra( $lines ); } } // Starting line number - if ( isset( $args['start'] ) ) { + if( isset( $args['start'] ) ) { $geshi->start_line_numbers_at( $args['start'] ); } $geshi->set_header_type( $enclose ); // Strict mode - if ( isset( $args['strict'] ) ) { + if( isset( $args['strict'] ) ) { $geshi->enable_strict_mode(); } // Format @@ -122,19 +97,19 @@ class SyntaxHighlight_GeSHi { return $error; } $err = $geshi->error(); - if ( $err ) { + if( $err ) { // Other unknown error! $error = self::formatError( $err ); return $error; } // Armour for Parser::doBlockLevels() - if ( $enclose === GESHI_HEADER_DIV ) { + if( $enclose === GESHI_HEADER_DIV ) { $out = str_replace( "\n", '', $out ); } // HTML Tidy will convert tabs to spaces incorrectly (bug 30930). // But the conversion from tab to space occurs while reading the input, // before the conversion from to tab, so we can armor it that way. - if ( $wgUseTidy ) { + if( $wgUseTidy ) { $out = str_replace( "\t", ' ', $out ); } // Register CSS @@ -165,7 +140,7 @@ class SyntaxHighlight_GeSHi { * @return array */ private static function addAttribute( $attribs, $name, $value ) { - if ( isset( $attribs[$name] ) ) { + if( isset( $attribs[$name] ) ) { $attribs[$name] = $value . ' ' . $attribs[$name]; } else { $attribs[$name] = $value; @@ -257,11 +232,9 @@ class SyntaxHighlight_GeSHi { global $wgSyntaxHighlightModels, $wgUseSiteCss, $wgParser, $wgTextModelsToParse; - $highlightModels = ExtensionRegistry::getInstance()->getAttribute( 'SyntaxHighlightModels' ); - // Determine the language $model = $content->getModel(); - if ( !isset( $highlightModels[$model] ) && !isset( $wgSyntaxHighlightModels[$model] ) ) { + if ( !isset( $wgSyntaxHighlightModels[$model] ) ) { // We don't care about this model, carry on. return true; } @@ -285,25 +258,19 @@ class SyntaxHighlight_GeSHi { $output = $wgParser->parse( $text, $title, $options, true, true, $revId ); } - if ( isset( $highlightModels[$model] ) ) { - $lang = $highlightModels[$model]; - } else { - // TODO: Add deprecation warning after a while? - $lang = $wgSyntaxHighlightModels[$model]; - } - + $lang = $wgSyntaxHighlightModels[$model]; // Attempt to format $geshi = self::prepare( $text, $lang ); - if ( $geshi instanceof GeSHi ) { + if( $geshi instanceof GeSHi ) { $out = $geshi->parse_code(); - if ( !$geshi->error() ) { + if( !$geshi->error() ) { // Done $output->addModuleStyles( "ext.geshi.language.$lang" ); $output->setText( "
{$out}
" ); - if ( $wgUseSiteCss ) { + if( $wgUseSiteCss ) { $output->addModuleStyles( 'ext.geshi.local' ); } @@ -342,9 +309,9 @@ class SyntaxHighlight_GeSHi { } $geshi = self::prepare( $text, $lang ); - if ( $geshi instanceof GeSHi ) { + if( $geshi instanceof GeSHi ) { $out = $geshi->parse_code(); - if ( !$geshi->error() ) { + if( !$geshi->error() ) { if ( preg_match( '/^]*)>/i', $out, $m ) ) { $attrs = Sanitizer::decodeTagAttributes( $m[1] ); $attrs['class'] .= ' api-pretty-content'; @@ -378,7 +345,7 @@ class SyntaxHighlight_GeSHi { self::initialise(); $geshi = new GeSHi( $text, $lang ); - if ( $geshi->error() == GESHI_ERROR_NO_SUCH_LANG ) { + if( $geshi->error() == GESHI_ERROR_NO_SUCH_LANG ) { return null; } $geshi->set_encoding( 'UTF-8' ); @@ -480,7 +447,7 @@ class SyntaxHighlight_GeSHi { */ private static function formatError( $error = '' ) { $html = ''; - if ( $error ) { + if( $error ) { $html .= "

{$error}

"; } $html .= '

' . wfMessage( 'syntaxhighlight-specify')->inContentLanguage()->escaped() @@ -498,8 +465,8 @@ class SyntaxHighlight_GeSHi { private static function formatLanguages() { $langs = self::getSupportedLanguages(); $list = array(); - if ( count( $langs ) > 0 ) { - foreach ( $langs as $lang ) { + if( count( $langs ) > 0 ) { + foreach( $langs as $lang ) { $list[] = '' . htmlspecialchars( $lang ) . ''; } return '

' . implode( ', ', $list ) . '


'; @@ -524,9 +491,9 @@ class SyntaxHighlight_GeSHi { * @return bool */ private static function initialise() { - if ( !self::$initialised ) { - if ( !class_exists( 'GeSHi' ) ) { - require ( dirname( __FILE__ ) . '/geshi/geshi.php' ); + if( !self::$initialised ) { + if( !class_exists( 'GeSHi' ) ) { + require( dirname( __FILE__ ) . '/geshi/geshi.php' ); } self::$initialised = true; } diff --git a/SyntaxHighlight_GeSHi.langs.php b/SyntaxHighlight_GeSHi.langs.php index 535ec02b..3793675c 100644 --- a/SyntaxHighlight_GeSHi.langs.php +++ b/SyntaxHighlight_GeSHi.langs.php @@ -1,6 +1,5 @@ + * http://www.mediawiki.org/ + * + * 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 + * @ingroup Extensions + * @author Brion Vibber + * + * This extension wraps the GeSHi highlighter: http://qbnz.com/highlighter/ + * + * A language is specified like: void main() {} + * If you forget, or give an unsupported value, the extension spits out + * some help text and a list of all supported languages. + */ + +if( !defined( 'MEDIAWIKI' ) ) { + die(); } + +if ( version_compare( $wgVersion, '1.24', '<' ) ) { + die( "This version of SyntaxHighlight GeSHi requires MediaWiki 1.24" ); +} + +require_once __DIR__ . '/SyntaxHighlight_GeSHi.langs.php'; +require_once __DIR__ . '/geshi/geshi.php'; + +$wgExtensionCredits['parserhook'][] = array( + 'path' => __FILE__, + 'name' => 'SyntaxHighlight', + 'author' => array( 'Brion Vibber', 'Tim Starling', 'Rob Church', 'Niklas Laxström' ), + 'descriptionmsg' => 'syntaxhighlight-desc', + 'url' => 'https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi', + 'version' => GESHI_VERSION, + 'license-name' => 'GPL-2.0+', +); + +// Change these in LocalSettings.php +$wgSyntaxHighlightDefaultLang = null; +$wgSyntaxHighlightKeywordLinks = false; + +$dir = __DIR__ . '/'; +$wgMessagesDirs['SyntaxHighlight_GeSHi'] = __DIR__ . '/i18n'; + +$wgAutoloadClasses['SyntaxHighlight_GeSHi'] = $dir . 'SyntaxHighlight_GeSHi.class.php'; +$wgAutoloadClasses['ResourceLoaderGeSHiModule'] = $dir . 'ResourceLoaderGeSHiModule.php'; +$wgAutoloadClasses['ResourceLoaderGeSHiLocalModule'] = $dir . 'ResourceLoaderGeSHiLocalModule.php'; + +$wgHooks['ResourceLoaderRegisterModules'][] = 'SyntaxHighlight_GeSHi::resourceLoaderRegisterModules'; +$wgHooks['ContentGetParserOutput'][] = 'SyntaxHighlight_GeSHi::renderHook'; +$wgHooks['ApiFormatHighlight'][] = 'SyntaxHighlight_GeSHi::apiFormatHighlight'; + +// Module to load MediaWiki:Geshi.css. +$wgResourceModules['ext.geshi.local'] = array( 'class' => 'ResourceLoaderGeSHiLocalModule' ); +// More modules are defined by SyntaxHighlight_GeSHi::resourceLoaderRegisterModules, +// one for each supported language. The general name template is 'ext.geshi.language.'. + +/** + * Map content models to the corresponding language names to be used with the highlighter. + * Pages with one of the given content models will automatically be highlighted. + */ +$wgSyntaxHighlightModels[CONTENT_MODEL_CSS] = 'css'; +$wgSyntaxHighlightModels[CONTENT_MODEL_JAVASCRIPT] = 'javascript'; + +/** + * Register parser hook + * + * @param $parser Parser + * @return bool + */ +$wgHooks['ParserFirstCallInit'][] = function ( &$parser ) { + $parser->setHook( 'source', array( 'SyntaxHighlight_GeSHi', 'parserHook' ) ); + $parser->setHook( 'syntaxhighlight', array( 'SyntaxHighlight_GeSHi', 'parserHook' ) ); + return true; +}; diff --git a/extension.json b/extension.json deleted file mode 100644 index 19809bf8..00000000 --- a/extension.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "SyntaxHighlight", - "version": "1.0.8.12", - "author": [ - "Brion Vibber", - "Tim Starling", - "Rob Church", - "Niklas Laxström" - ], - "url": "https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi", - "descriptionmsg": "syntaxhighlight-desc", - "license-name": "GPL-2.0+", - "type": "parserhook", - "callback": "SyntaxHighlight_GeSHi::registerExtension", - "MessagesDirs": { - "SyntaxHighlight_GeSHi": [ - "i18n" - ] - }, - "AutoloadClasses": { - "SyntaxHighlight_GeSHi": "SyntaxHighlight_GeSHi.class.php", - "ResourceLoaderGeSHiModule": "ResourceLoaderGeSHiModule.php", - "ResourceLoaderGeSHiLocalModule": "ResourceLoaderGeSHiLocalModule.php" - }, - "ResourceModules": { - "ext.geshi.local": { - "class": "ResourceLoaderGeSHiLocalModule" - } - }, - "Hooks": { - "ParserFirstCallInit": [ - "SyntaxHighlight_GeSHi::configureParser" - ], - "ResourceLoaderRegisterModules": [ - "SyntaxHighlight_GeSHi::resourceLoaderRegisterModules" - ], - "ContentGetParserOutput": [ - "SyntaxHighlight_GeSHi::renderHook" - ], - "ApiFormatHighlight": [ - "SyntaxHighlight_GeSHi::apiFormatHighlight" - ] - }, - "SyntaxHighlightModels": { - "css": "css", - "javascript": "javascript" - }, - "config": { - "SyntaxHighlightDefaultLang": null, - "SyntaxHighlightKeywordLinks": false, - "GeSHiSupportedLanguages" : null - } -} diff --git a/maintenance/updateLanguageList.php b/maintenance/updateLanguageList.php index fe122e91..d93b5766 100644 --- a/maintenance/updateLanguageList.php +++ b/maintenance/updateLanguageList.php @@ -45,10 +45,7 @@ class UpdateLanguageList extends Maintenance { $langs = array_values( array_filter( $geshi->get_supported_languages( false ), 'lang_filter' ) ); sort( $langs ); $replace = array( '[' => "array(\n\t", ']' => "\n);\n", '",' => "\",\n\t" ); - $code = "output( "Updated language list written to SyntaxHighlight_GeSHi.langs.php\n" ); }