Rev 1372 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php
// A library of common functions and definitions for
// the smileys mod. This library is only loaded when
// initializing or saving module settings.
if(!defined("PHORUM") && !defined("PHORUM_ADMIN")) return;
// A match for filtering files that are accepted as smiley images.
define('MOD_SMILEYS_IMAGE_MATCH', '/^.+\.(gif|png|jpg|jpeg)$/i');
// A match for matching absolute file paths. Paths that I could think of:
// UNIX path /...
// URL proto://...
// Windows path X:\... or X:/...
// Windows net path \\...
define('MOD_SMILEYS_ABSPATH_MATCH', '!^/|^\w+://|^\w:[/\\\\]|^\\\\\\\\!i');
// The default smiley prefix path.
global $MOD_SMILEY_DEFAULT_PREFIX;
$MOD_SMILEY_DEFAULT_PREFIX = './mods/smileys/images/';
// The default list of smileys to install upon initial setup.
global $MOD_SMILEY_DEFAULT_SMILEYS;
$MOD_SMILEY_DEFAULT_SMILEYS = array(
"(:P)" => "smiley25.gif spinning smiley sticking its tongue out",
"(td)" => "smiley23.gif thumbs up",
"(tu)" => "smiley24.gif thumbs down",
":)-D" => "smiley15.gif smileys with beer",
">:D<" => "smiley14.gif the finger smiley",
"(:D" => "smiley12.gif smiling bouncing smiley",
"8-)" => "smilie8.gif eye rolling smiley",
":)o" => "smiley16.gif drinking smiley",
"::o" => "smilie10.gif eye popping smiley",
"B)-" => "smilie7.gif smoking smiley",
":(" => "smilie2.gif sad smiley",
":)" => "smilie1.gif smiling smiley",
":?" => "smiley17.gif moody smiley",
":D" => "smilie5.gif grinning smiley",
":P" => "smilie6.gif tongue sticking out smiley",
":S" => "smilie11.gif confused smiley",
":X" => "smilie9.gif angry smiley",
":o" => "smilie4.gif yawning smiley",
";)" => "smilie3.gif winking smiley",
"B)" => "cool.gif cool smiley",
"X(" => "hot.gif hot smiley",
);
/**
* Sets up initial settings for the smileys mod or upgrades
* the settings from old versions.
* @return modinfo - Updated module information.
*/
function phorum_mod_smileys_initsettings()
{
$PHORUM = $GLOBALS["PHORUM"];
global $MOD_SMILEY_DEFAULT_PREFIX;
global $MOD_SMILEY_DEFAULT_SMILEYS;
$modinfo = isset($PHORUM["mod_smileys"]) ? $PHORUM["mod_smileys"] : array();
// Keep track if we need to store settings in the database.
$do_db_update = false;
// Set default for the image prefix path.
if(! isset($modinfo['prefix'])) {
$modinfo['prefix'] = $MOD_SMILEY_DEFAULT_PREFIX;
// So phorum_mod_smileys_available() sees it right away.
$GLOBALS["PHORUM"]["mod_smileys"]["prefix"] = $MOD_SMILEY_DEFAULT_PREFIX;
$do_db_update = true;
}
// Set a default list of smileys or upgrade from existing smiley mod.
if (! isset($modinfo['smileys']))
{
$modinfo['smileys'] = array();
// Check if we have smileys from the previous version of the
// smiley mod. These were stored at the same level as the
// settings.
$upgrade_list = array();
if (isset($PHORUM["mod_smileys"])) {
foreach ($PHORUM["mod_smileys"] as $id => $smiley) {
if (is_numeric($id)) {
$upgrade_list[$id] = $smiley;
}
}
}
// We have an existing list of smileys to upgrade. Move the
// smileys to their new location.
if (count($upgrade_list)) {
foreach ($upgrade_list as $id => $smiley) {
unset($modinfo[$id]);
$modinfo["smileys"][$id] = $smiley;
}
$do_db_update = true;
}
// Set an initial list of smileys.
else {
foreach ($MOD_SMILEY_DEFAULT_SMILEYS as $search => $data) {
list($smiley, $alt) = preg_split('/\s+/', $data, 2);
$modinfo["smileys"][] = array(
"search" => $search,
"alt" => $alt,
"smiley" => $smiley,
"uses" => 2,
);
}
$do_db_update = true;
}
}
// Store the changed settings in the database. Errors are
// silently ignored here, to keep them away from end-users.
if ($do_db_update) {
list($modinfo, $message) = phorum_mod_smileys_store($modinfo);
$GLOBALS["PHORUM"]["mod_smileys"] = $modinfo;
return $modinfo;
}
}
/**
* Reads in the list of available smiley images.
* @return smileys - An array of smiley image filenames.
*/
function phorum_mod_smileys_available()
{
$PHORUM = $GLOBALS["PHORUM"];
$available_smileys = array();
if(file_exists($PHORUM['mod_smileys']['prefix'])){
$d = dir($PHORUM['mod_smileys']['prefix']);
while($entry=$d->read()) {
if(preg_match(MOD_SMILEYS_IMAGE_MATCH, $entry)) {
$available_smileys[$entry]=$entry;
}
}
}
asort($available_smileys);
return $available_smileys;
}
/**
* Compiles replacement arrays for the smileys mod and stores the
* data for the module in the database.
* @param modinfo - The configuration array for mod_smileys.
* @return result - An array containing two elements:
* updated module info or NULL on failure and
* a message that can be displayed to the user.
*/
function phorum_mod_smileys_store($modinfo)
{
// Get the current list of available smiley images.
$available_smileys = phorum_mod_smileys_available();
// Sort the smileys by length. We need to do this to replace the
// longest smileys matching strings first. Else for example the
// smiley ":)-D" could end up as (smileyimage)-D, because ":)"
// was replaced first.
uasort($modinfo["smileys"],'phorum_mod_smileys_sortbylength');
// Create and fill replacement arrays for subject and body.
$smiley_subject_key = array();
$smiley_subject_val = array();
$smiley_body_key = array();
$smiley_body_val = array();
$seen_images = array();
foreach ($modinfo["smileys"] as $id => $smiley)
{
// Check if the smiley image is available. Skip and keep track
// of missing smiley images.
$active = isset($available_smileys[$smiley["smiley"]]) ? true : false;
$modinfo["smileys"][$id]['active'] = $active;
if (! $active) continue;
// Check if the smiley image has been seen before. If is has, mark
// the current smiley as being an alias. This is used in the editor
// smiley help, to show only one version of a smiley image.
$is_alias = isset($seen_images[$smiley["smiley"]]) ? true : false;
$seen_images[$smiley["smiley"]] = 1;
$modinfo["smileys"][$id]["is_alias"] = $is_alias;
// Create HTML image code for the smiley.
$prefix = $modinfo["prefix"];
$src = htmlspecialchars("$prefix{$smiley['smiley']}");
$alttxt = empty($smiley['alt']) ? $smiley["search"] : $smiley["alt"];
$alt = htmlspecialchars($alttxt);
$img = "<img class=\"mod_smileys_img\" src=\"$src\" alt=\"$alt\" title=\"$alt\"/>";
// Below we use htmlspecialchars() on the search string.
// This is done, because the smiley mod is run after formatting
// by Phorum, so characters like < and > are HTML escaped.
// Body only replace (0) or subject and body replace (2).
if ($smiley['uses'] == 0 || $smiley['uses'] == 2) {
$smiley_body_key[] = htmlspecialchars($smiley['search']);
$smiley_body_val[] = $img;
}
// Subject only replace (1) or subject and body replace (2).
if ($smiley['uses'] == 1 || $smiley['uses'] == 2) {
$smiley_subject_key[] = htmlspecialchars($smiley['search']);
$smiley_subject_val[] = $img;
}
}
// Store replacement arrays in the module settings.
$modinfo["replacements"] = array(
"subject" => count($smiley_subject_key)
? array($smiley_subject_key, $smiley_subject_val)
: NULL,
"body" => count($smiley_body_key)
? array($smiley_body_key, $smiley_body_val)
: NULL
);
// For quickly determining if the smiley replacements must be run.
$modinfo["do_smileys"] = $modinfo["replacements"]["subject"] != NULL ||
$modinfo["replacements"]["body"] != NULL;
// Store the module settings in the database.
if (! phorum_db_update_settings(array("mod_smileys" => $modinfo))) {
return array(NULL, "Saving the smiley settings to the database failed.");
} else {
return array($modinfo, "The smiley settings were successfully saved.");
}
}
/**
* A callback function for sorting smileys by their search string length.
* usage: uasort($array_of_smileys, 'phorum_mod_smileys_sortbylength');
*/
function phorum_mod_smileys_sortbylength($a, $b) {
if (isset($a["search"]) && isset($b["search"])) {
if (strlen($a["search"]) == strlen($b["search"])) {
return strcmp($a["search"], $b["search"]);
} else {
return strlen($a["search"]) < strlen($b["search"]);
}
} else {
return 0;
}
}
?>