Extension talk:Emoticons
From MediaWiki.org
Contents |
[edit] Why this Extension was created
I was tasked with setting up a Wiki for a small business. They were currently using phpBB, but for training info and guidelines a forum was just too cumbersome. I knew about MediaWiki and since I was asked to set up something "like Wikipedia", it quickly came to mind. The one thing I worried about was that the smileys people were used to in the forums would not be available in the Wiki.
I started by getting MediaWiki installed since the lack of smileys was bothersome, but unlikely to prevent the Wiki from being useful. Next I put in the RandomText extension for a random "quote" on the main page.
I then searched for an emoticon extension for as long as my attention span would allow. (I think managed to search for a whole fifteen minutes: A new record for me.) After that I gave up and decided to write my own...
...This is the first extension I have attempted with MediaWiki. Any stylistic variation from standard MediaWiki extension coding practices is just the way things go. If it really bugs you, fix it. Anyone who wants to use, modify or mutilate this code beyond recognition is free to do so, just don't blame it on me. If this extension causes your server to burst into flames and run screaming through the data center, I cannot be held responsible. I check my email quite regularly, so if anyone has any questions feel free to drop me a line, but since I have two jobs, a family and more pets than I care to admit I can't promise I'll be able to respond in short order.
[edit] Does not appear to work in 1.10.1
On version 1.11 I got the following error: "Detected bug in an extension! Hook fnEmoticons failed to return a value; should return true to continue hook processing or false to abort." Mediawiki apparently now requires a return value of true for continue or false for cancel.
Adding "return true" between line 67 and line 68 (just before the last curly brace) seemed to fix the problem for me.
[edit] Can't get it to work
In most recent version it gives a 500 internal server error.
return true fix doesn't work
[edit] Return true; definitely needed in extension.
* MediaWiki: 1.11.0 * PHP: 5.2.0 (apache2handler) * MySQL: 5.0.45
under this setup, adding return true; before the last } made it work fine.
[edit] Use the Mediawiki:Emoticons page for viewing purposes also
If you look at the parsed configuration page it doesn't look very suitable for using it as a description page for the authors to see which emoticons are available.
So for our wiki I replaced the line
$emoticonList = explode( "\n", $emoticonListArticle->mContent );
by the following
// first remove/change everything from the text that was only needed // for formatting purposes to view the list in the wiki $emSearch = array('<nowiki>','</nowiki>','<tr>','</tr>', '<td>','<td align=center>','</td>','<!--','-->'); $emReplace = array(); $emoticonCleanedArticle = str_replace( $emSearch, $emReplace, $emoticonListArticle->mContent ); $emoticonList = explode( "\n", $emoticonCleanedArticle );
so that I can use some tags like nowiki or table to format the list so that it is viewable also.
The example
<table border=0> <tr><th>Emoticon</th><th> </th><th>Gives you ...</th></tr> <tr><td align=center>:)</td><td><!-- // --></td><td align=center>[[Bild:icon_smile.gif]]</td></tr> <tr><td align=center>:(</td><td><!-- // --></td><td align=center>[[Bild:icon_sad.gif]]</td></tr> </table>
would show (imagine a suitable icon image) something like this:
| Emoticon | Gives you ... | |
|---|---|---|
| :) | Bild:icon_smile.gif | |
| :( | Bild:icon_sad.gif |
and can still be parsed by the extension.
Depending on the tags you want to use in the definition lines you could add further strings to the emSearch array. Lines without the // separator (i.e. the table lines in the example above) don't need to be removed as they are ignored already by the unchanged extension. --Wolverine 16:43, 2 January 2008 (UTC)
[edit] UNIQ errors in MediaWiki 1.12.0
This extension causes UNIQ errors. As seen in the example below.
UNIQ3cb085dc58727e57-nowiki-00000000-QINU.
Someone might want to update it so that it can work in the latest version.
-Augrunt 03:18, 22 March 2008 (UTC)
[edit] MediaWiki 1.12.0 Problems
Any idea when they will be fixed so I can start using this great extension again?
- It works for my end. Try this: --74.130.36.17 23:37, 20 April 2008 (UTC)
<?php
# Emoticon MediaWiki Extension
# Created by Alex Wollangk (alex@wollangk.com)
if ( !defined( 'MEDIAWIKI' ) ) {
die( 'This file is a MediaWiki extension, it is not a valid entry point' );
}
global $wgHooks;
global $wgExtensionCredits;
$wgExtensionCredits['parserhook'][] = array(
'name' => 'Emoticons',
'status' => 'stable',
'type' => 'hook',
'author' => 'Alex Wollangk (alex@wollangk.com)',
'version' => '1.0',
'update' => '2-20-2007',
'url' => 'http://www.mediawiki.org/wiki/Extension:Emoticons',
'description' => 'Enable forum-style emoticon (smiley) replacement within MediaWiki.',
);
$wgHooks['ParserAfterStrip'][] = 'fnEmoticons';
// The callback function for replacing emoticons with image tags
function fnEmoticons( &$parser, &$text, &$strip_state ) {
global $action; // Access the global "action" variable
// Only do the replacement if the action is not edit or history
if(
$action !== 'edit'
&& $action !== 'history'
&& $action !== 'delete'
&& $action !== 'watch'
&& strpos( $parser->mTitle->mPrefixedText, 'Special:' ) === false
&& $parser->mTitle->mNamespace !== 8
)
{
// Get the list of emoticons from the "MediaWiki:Emoticons" article.
$title = Title::makeTitle( 8, 'Emoticons' );
$emoticonListArticle = new Article( $title );
$emoticonListArticle->getContent();
// If the content successfully loaded, do the replacement
if( $emoticonListArticle->mContentLoaded )
{
$emoticonList = explode( "\n", $emoticonListArticle->mContent );
foreach( $emoticonList as $index => $emoticon )
{
$currEmoticon = explode( "//", $emoticon, 2 );
if( count($currEmoticon) == 2 )
{
// start by trimming the search value
$currEmoticon[ 0 ] = trim( $currEmoticon[ 0 ] );
// if the string begins with , lop it off
if( substr( $currEmoticon[ 0 ], 0, 6 ) == ' ' )
{
$currEmoticon[ 0 ] = trim( substr( $currEmoticon[ 0 ], 6 ) );
}
// trim the replacement value
$currEmoticon[ 1 ] = trim( $currEmoticon[ 1 ] );
// and finally perform the replacement
$text = str_replace( $currEmoticon[ 0 ], $currEmoticon[ 1 ], $text );
}
}
}
}
// this extension will work on MediaWiki 1.11.0 when you remove the "//" from the next line!
return true;
}
[edit] MediaWiki 1.12 fix
Completely rewrited and optimized original code. Now it works for MW 1.12:
<?php // Emoticon MediaWiki Extension // Created by Alex Wollangk (alex@wollangk.com) if (!defined('MEDIAWIKI')) { die( 'This file is a MediaWiki extension, it is not a valid entry point' ); } $wgExtensionCredits['parserhook'][] = Array ( 'name' => 'Emoticons', 'status' => 'stable', 'type' => 'hook', 'author' => 'Alex Wollangk (alex@wollangk.com)', 'version' => '1.0', 'update' => '2-20-2007', 'url' => 'http://www.mediawiki.org/wiki/Extension:Emoticons', 'description' => 'Enable forum-style emoticon (smiley) replacement within MediaWiki.', ); $wgHooks['ParserAfterStrip'][] = 'efEmoticons_ParserAfterStrip'; /** * The callback function for replacing emoticons with image tags * * @param Parser $parser * @param string $text * @param StripState $strip_state * @return bool */ function efEmoticons_ParserAfterStrip(&$parser, &$text, &$strip_state) { global $wgTitle; /* @var $wgTitle Title */ if (in_array($wgTitle->getNamespace(), Array (NS_SPECIAL, NS_MEDIAWIKI))) { // don't replace emotions on special pages & in system messages return true; } // Get the list of emoticons from the "MediaWiki:Emoticons" article. $title = Title::makeTitle(NS_MEDIAWIKI, 'Emoticons'); if ($title->getArticleID() == 0) { // article not found return true; } $article = new Article($title, 0); $content = $article->getContent(); $emoticon_list = explode("\n", $content); foreach($emoticon_list as $index => $emoticon) { $emoticon = explode("//", str_replace(' ', '', $emoticon), 2); if (count($emoticon) != 2) { // skip badly formatted emotions continue; } array_map('trim', $emoticon); // and finally perform the replacement $text = str_replace(' ' . $emoticon[0], ' ' . $emoticon[1], $text); } return true; }
--Aik099 18:33, 22 May 2008 (UTC)

