Glossar-Mod v0.2 - Viel Spass...

Started by Christian Land, August 07, 2005, 06:55:41 AM

Previous topic - Next topic

Christian Land

Glossar-Mod v0.2

Dieses Mod fügt SMF eine einfache Glossar-Funktion hinzu, mit der man für bestimmte Begriffe Erklärungen definieren kann. Tauchen diese Begriffe dann in einem Posting auf, erzeugt das Mod an der entsprechenden Stelle einen Tooltip mit der Erklärung zu diesem Begriff.



Code

Folgende Änderungen am Code müssen vorgenommen werden:


1. Subs.php

Am Ende der Subs.php Datei muss man vor der Zeile

?>

die folgende Funktion einfügen:

function do_gloss($message)
{

global $glosswords,$trreplace,$db_prefix,$modSettings;

if ($modSettings['gloss_enabled'] == 1)
{

// load glossary

if (is_null($glosswords))
{

// Optionen für das PopUp definieren
// Mehr Infos dazu findet man unter: http://www.bosrup.com/web/overlib/?Command_Reference
// Das folgende Beispiel sorgt für ein 350 Pixel breites, um 20 Pixel nach rechts verschobenes
// PopUp, dass dunkelblaue Schrift auf weissem Grund enthält.

$tooltip = array( 'WIDTH' => 350,
'OFFSETX' => 20,
'BGCOLOR' => '#000000',
'FGCOLOR' => '#FFFFFF',
'TEXTCOLOR' => '#006090'  );

foreach ($tooltip as $key=>$value)
{
if (is_integer($value))
$tt[] = $key.','.$value;
elseif (is_string($value))
$tt[] = $key.',\''.$value.'\'';
}

$options = join(',',$tt); if ($options!='') $options = ','.$options;

// und weiter gehts...

$result = db_query('SELECT gloss_id, gloss_word, gloss_desc, gloss_match FROM '.$db_prefix.'glossary', __FILE__, __LINE__);
$glosswords = array();
$trreplace = array();

while ($row = mysql_fetch_assoc($result))
{

$glosswords[] = array('id' => $row['gloss_id'],
'search' => preg_quote($row['gloss_word']),
'icase' => $row['gloss_match']);

$trreplace['%%GLOSS:'.$row['gloss_id'].'%%'] = '<a href="javascript:void(0);" onmouseover="return overlib(\''.str_replace('"','&quot;',str_replace("\r",'',str_replace("\n",'',addslashes(nl2br($row['gloss_desc']))))).'\''.$options.');" onmouseout="return nd();">';


}

mysql_free_result($result);

}

// s&r

if (count($glosswords)>0)
{

foreach ($glosswords as $gloss)
{
$r = '%%GLOSS:'.$gloss['id'].'%%';
$s = $gloss['search'];
$message = preg_replace("/((<[^>]*)|\b$s\b)/".(((int)$gloss['icase'] == 0) ? 'i' : '')."e", '"\2"=="\1"? "\1":"{$r}\1</a>"', $message);
}

$message = strtr($message,$trreplace);

}


}

return $message;

}



2. Display.php

Hinter den Zeilen

// Run BBC interpreter on the message.
$message['body'] = parse_bbc($message['body'], $message['smileysEnabled'], $message['ID_MSG'])

   
müssen folgende Zeilen eingefügt werden
   
// add glossary
$message['body'] = do_gloss($message['body']);



3. ModSettings.php

Hinter den Zeilen

array('rule'),
// Who's online.
array('check', 'who_enabled'),


muss der folgende Block eingefügt werden

array('rule'),
// Glossary-Mod.
array('check', 'gloss_enabled'),




Templates & Sprachfiles

Damit das Mod funktioniert müssen einige Kleinigkeiten in den Sprachfiles und Templates angepasst werden.

In die Datei Modifications.english.php (bzw. anstatt von "english" halt auch german / etc.) muss die Zeile

$txt['gloss_enabled'] = 'Glossary-Mod';

eingefügt werden. Dies ist der Text, der in der Admin-Oberfläche erscheint (im Bereich "Feature and Options", vor dem Karma-Block)

In der Datei index.template.php (in JEDEM Template!) muss im <head>-Bereich die Zeile

<script language="JavaScript" type="text/javascript" src="', $settings['default_theme_url'], '/overlib_mini.js"></script>

eingefügt werden. Ausserdem muss man von der Seite http://www.bosrup.com/web/overlib/?Download die Overlib herunterladen. In dem ZIP-File befindet sich unter Anderem die Datei overlib_mini.js. Diese Datei muss man in das Verzeichnis "Themes\default" kopieren.



Datenbank

Das Mod benötigt nur eine einzige Tabelle in der alle Wörter abgespeichert werden.

CREATE TABLE `smf_glossary` (
  `gloss_id` int(11) unsigned NOT NULL auto_increment,
  `gloss_word` varchar(60) NOT NULL default '',
  `gloss_desc` text NOT NULL,
  `gloss_match` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`gloss_id`),
  KEY `gloss_id` (`gloss_id`)
) ENGINE=MyISAM;


Felder:
  • gloss_word ist die Zeichenkette die gesucht wird
  • gloss_desc die Beschreibung die eingeblendet wird
  • gloss_match gibt an ob die Gross-Kleinschreibung beachtet wird (1) oder ob nicht (0)

In gloss_desc muss korrektes HTML benutzt werden! (also bitte keine spitzen Klammern, etc. wenn sie nicht gerade im Zusammenhang mit Tags benutzt werden... also nicht sowas wie ">> Überschrift" sondern "&gt;&gt; Überschrift" !!!)



Screenshot





Hinweise

Momentan keine ;D Ausser: Ich weiss, das das hier nicht das Mod-Brett ist, aber da ich keine Lust hab das Alles auf englisch zu erklären, gibts das Mod nur hier *g*

Christian Land

Noch als kleiner Nachtrag: Leider ist der Code noch wesentlich komplizierter geworden als er ursprünglich mal war. Dies kommt primär daher, dass es relativ komplex ist zu verhindern, dass ein Begriff der in der Beschreibung eines anderen Begriffes auftaucht nicht dazu führt, dass totaler Murks rauskommt.

Ich hab den Code jetzt so angepasst, dass ein zweistufiger Ersetzungslauf stattfindet. Im ersten Teil werden alle Begriffe durch "Dummys" ersetzt. Z.B. sowas wie %%GLOSS:999%% und erst im zweiten Schritt werden diese dann durch das PopUp ersetzt... was eleganteres ist mir leider im Moment nicht eingefallen.

mediman

ccol stuff ...

isses von der preformance her flink oder jibbet da irgendwelche slowdowns (laden des js) oder so?
weil ich würde des direkt mal für fo testen wollen, dat gedöns ...

thx medidinx
My Projects: http://ticker-oase.de 
Please do not PM me with support requests.

Christian Land

Das müsste jemand mit mehr Motivation als ich testen *g*

Theoretisch sollte es relativ wenig Einfluss haben... es wird nur einmal eine Query auf die DB abgesetzt um die Wörter zu laden und das ersetzen passiert über eine RegEx und einmal strtr pro Posting...

Allerdings wird natürlich die generierte HTML-Seite immer grösser je mehr Begriffe vorkommen... und es wird halt mehr Speicher für das Glossar verbraucht...

Man könnte noch ein Feld in die DB einfügen, dass eine Board-ID speichert... dann könnte man bestimmte Begriffe nur für bestimmte Boards aktivieren um die Datenmenge zu reduzieren...

Dudelsack

Perfekt, werde ich heute Abends mal updaten
sorry for my bad english

Dudelsack

Ja, funktioniert perfekt bis jetzt  ;D
sorry for my bad english

dieter4

super mensch!!!! da haste was tolles hemacht. mich wundert, dass nco nie vorher einer auf die idee kam ???

schön wär das jetzt noch als richtigen mod in einem zip archiv und dass man den dann einfach mit dem PM hoch laden kann...

aber eins muss ich noch sagen: DANKE ;D

Christian Land

*schmunzel* Da ich eigentlich gar keine Mods mehr baue, kannste froh sein, dass ich das überhaupt gebaut hab ;D Nen echtes Package müsste jemand Anderes bauen... genauso wie eine richtige Admin-Oberfläche mit der man die Begriffe erfassen/ändern kann... sorry, aber da hab ich momentan keine Lust zu ;D

mediman

Quote from: SnowCrash on August 08, 2005, 06:18:38 AM
*schmunzel* Da ich eigentlich gar keine Mods mehr baue, kannste froh sein, dass ich das überhaupt gebaut hab ;D Nen echtes Package müsste jemand Anderes bauen... genauso wie eine richtige Admin-Oberfläche mit der man die Begriffe erfassen/ändern kann... sorry, aber da hab ich momentan keine Lust zu ;D

Ich hab auch gleich keine Lust mehr ...  :P
My Projects: http://ticker-oase.de 
Please do not PM me with support requests.

Pitti

ich finds klasse. danke dir snow ;D

grüßle pitti

Dudelsack

jop, schließe mich Pittis Beitrag an:
Ich finds auch klasse, danke!

Und falls jemand einen Adminbereich braucht, der kann ja phpMyAdmin benutzen, reicht ja auch aus *gg* (zumindest für mich) ;)
sorry for my bad english

Christian Land

Kein Thema, ab und zu muss man ja mal wieder PHP programmieren damit man in Übung bleibt ;D Und so schwer war das ja nu auch nicht ;D

Christian Land

#12
Weil "buf" danach gefragt hat... (because "buf" asked for it...)

an english translation of this topic ;D

Glossary-Mod v0.2

This Mod adds a simple Glossary-function to SMF. This mod allows you to add Descriptions to certain words on your forum. When an user moves his Mousepointer over one of those words, a tooltip with the explanation of that word is shown.



Code

The following changes must be applied to SMF:


1. Subs.php

At the end of Subs.php, right before

?>

add the following function:

function do_gloss($message)
{

global $glosswords,$trreplace,$db_prefix,$modSettings;

if ($modSettings['gloss_enabled'] == 1)
{

// load glossary

if (is_null($glosswords))
{

// Define Options for the Tooltip
// More Informations regarding the params can be found here:
// http://www.bosrup.com/web/overlib/?Command_Reference

$tooltip = array( 'WIDTH' => 350,
'OFFSETX' => 20,
'BGCOLOR' => '#000000',
'FGCOLOR' => '#FFFFFF',
'TEXTCOLOR' => '#006090'  );

foreach ($tooltip as $key=>$value)
{
if (is_integer($value))
$tt[] = $key.','.$value;
elseif (is_string($value))
$tt[] = $key.',\''.$value.'\'';
}

$options = join(',',$tt); if ($options!='') $options = ','.$options;

$result = db_query('SELECT gloss_id, gloss_word, gloss_desc, gloss_match FROM '.$db_prefix.'glossary', __FILE__, __LINE__);
$glosswords = array();
$trreplace = array();

while ($row = mysql_fetch_assoc($result))
{

$glosswords[] = array('id' => $row['gloss_id'],
'search' => preg_quote($row['gloss_word']),
'icase' => $row['gloss_match']);

$trreplace['%%GLOSS:'.$row['gloss_id'].'%%'] = '<a href="javascript:void(0);" onmouseover="return overlib(\''.str_replace('"','&quot;',str_replace("\r",'',str_replace("\n",'',addslashes(nl2br($row['gloss_desc']))))).'\''.$options.');" onmouseout="return nd();">';


}

mysql_free_result($result);

}

// s&r

if (count($glosswords)>0)
{

foreach ($glosswords as $gloss)
{
$r = '%%GLOSS:'.$gloss['id'].'%%';
$s = $gloss['search'];
$message = preg_replace("/((<[^>]*)|\b$s\b)/".(((int)$gloss['icase'] == 0) ? 'i' : '')."e", '"\2"=="\1"? "\1":"{$r}\1</a>"', $message);
}

$message = strtr($message,$trreplace);

}


}

return $message;

}



2. Display.php

find the following lines (AFAIK, in 1.0.5 these lines look a little bit different but you should be able to find it ;D)

// Run BBC interpreter on the message.
$message['body'] = parse_bbc($message['body'], $message['smileysEnabled'], $message['ID_MSG'])

   
and add the following lines after them
   
// add glossary
$message['body'] = do_gloss($message['body']);



3. ModSettings.php

Find the following lines

array('rule'),
// Who's online.
array('check', 'who_enabled'),


and add the following block behind them

array('rule'),
// Glossary-Mod.
array('check', 'gloss_enabled'),




Templates & Language-Files

You have to make some minor changes to the Language-Files and Templates to get this mod to work.

Add the following line to Modifications.english.php (depending on your language, "english" must be replaced by german / etc.)

$txt['gloss_enabled'] = 'Glossary-Mod';

This is the Text that appears in the Admin-Console ("Features and Options", right before the Karma-Stuff)

In index.template.php (in EVERY Template you use!!!!) you have to add the following line to the <head>-area

<script language="JavaScript" type="text/javascript" src="', $settings['default_theme_url'], '/overlib_mini.js"></script>

After that, you must download the Overlib from http://www.bosrup.com/web/overlib/?Download. The Zip-File you downloaded there contains a file called overlib_mini.js - this must be copied to the "Themes\default" directory.



Database

This mod only needs one little table to store the words and descriptions:

CREATE TABLE `smf_glossary` (
  `gloss_id` int(11) unsigned NOT NULL auto_increment,
  `gloss_word` varchar(60) NOT NULL default '',
  `gloss_desc` text NOT NULL,
  `gloss_match` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`gloss_id`),
  KEY `gloss_id` (`gloss_id`)
) ENGINE=MyISAM;


Fields:
  • gloss_word contains the string thats searched (for example: SMF, PHP, whatever)
  • gloss_desc contains the text that should be displayed in the tooltip
  • gloss_match defines the way the gloss-mod searches for gloss_word -> 1 = case-sensitive, 0 = not case-sensitive ;D

gloss_desc MUST contain valid HTML! So don't use < or > outside of HTML-Tags! For example: ">> Headline" would be wrong - use "&gt;&gt; Headline" instead!



Screenshot








ATTENTION!!! Don't expect too much of this mod in the future - most likely, I'm not going to make any further changes to it!!!!

dieter4

obwohl das thema schon alt ist muss ich mal einen

*PUSH*

machen, damit sich vllt. einmal jemand erbarmt und eine Mod daraus bastelt.
ich würd's ja gerne selber machen, aber mein Englisch ist oberster ******* und deshalb wäre ich - und bestimmt auch viele andere wären - dankbar dafür. ;)
Vllt. macht das ja auch mal der SnowCrash :P ;D

also nochmal:

*PUSH*

Daniel D.

#14
Du weißt aber, dass die Beschreibung oben auch in deutsch ist oder verstehe ich da was falsch?

dieter4

#15
ja klar XD

ich meine, dass jemand eine mod baut, damit sich die mensche, die sich nicht allzu gut im source auskennen das einfach über den paketmanager einbauen können.

wie kannst du nur denken, dass ich sowas mache, ohne vorher alles gelesen zu haben? :o :o

ich kann's ja versuchen, wenn du mir das ins englische übersetzt :P

Christian Land

Quote from: Dark_Neakro on October 30, 2005, 11:38:49 AMVllt. macht das ja auch mal der SnowCrash :P ;D

Ne, der macht das sicher nicht....

dieter4


Advertisement: