<?php
/**
* LexiWord - Plugin für phpCMS
*
* @author: Martin Jahn <hide@address.com>
* @license: GPL
* @version: $Id: lexiword.php,v 1.2 2004/07/27 13:14:54 mjahn Exp $
* @package lexiword
*
* Das Plugin erkennt in einer Contentdatei alle vorkommenden Begriffe aus einer Glossardatei.
* Diese Begriffe werden dann markiert und werden im Broswer mit Kurzbeschreibungen angezeigt
* werden. Die Glossardatei kann darueber hinaus auch als normale Contentdatei verwendet werden.
* Damit ist es auch moeglich die Begriffe mit Links zur Glossardatei zu versehen.
*
* Dieses Plugin/Skript veroeffentliche ich so wie es ist und gebe deshalb auch keinerlei Garantie,
* dass es richtig funktioniert. Ausserdem uebernehme ich keinerlei Haftung fuer eventuelle durch
* die Anwendung des Plugins/Skriptes entstehenden Schaeden.
*
* Falls du Verbesserungsvorschlaege oder Wuensche bezueglich des Skriptes hast melde dich bei
* Martin Jahn <hide@address.com>
*
* Viel Spass
*
* Dieses Script ist kostenlos für private und kommerzielle Nuzung.
* Es wird unter den Bedingungen der GNU General Public License, wie von der Free
* Software Foundation herausgegeben, verteilt. Eine Kopie der GPL sollte im Zip-File
* enthalten sein. Das Script darf (im Rahmen der GPL) nach belieben genutzt, weiter-
* gegeben und modifiziert werden. Dieser Copyright-Hinweis muss jedoch in jedem Fall
* unverändert im Script belassen werden.
*
* Ich übernehme keinerlei Verantwortung für Schäden, die durch die Nutzung dieses
* Scripts entstehen. Bei Fehlern würde ich jedoch gerne informiert werden, damit
* ich diese ausbügeln kann. Auch für den Fall, dass Ihr Verbesserungen vornehmt,
* Verbesserungsvorschläge oder -wünsche habt, wäre ich dankbar für eine Benachrichtigung.
*
*
* Anleitung:
*
* 1. Das Plugin wird in einer Templatedatei statisch eingebunden
* {PLUGIN FILE="$plugindir/lexiword.php" TYPE="STATIC"}
*
* 2. Der Pfad zur Glossardatei wird relativ zum Document-Root angepasst
*
* 3. In das Array $fields alle Contentfelder eintragen, die durchsucht werden sollen
*
* 4. Eventuell noch weitere Einstellungen tunen
*
* 5. Fertig ;-) Gucken ob es funktioniert :-)
**/
/*
* $Log: lexiword.php,v $
* Revision 1.2 2004/07/27 13:14:54 mjahn
* fixed some little bugs
*
*/
/**
* 2004-07-27
* Bugfix:
* Links werden nun richtig ersetzt
* Suchbegriffe können nun auch Leerzeichen beinhalten.
*
* 2004-04-19
* Bugfix:
* Die Begriffe wurden bisher mit der Schreibweise ersetzt,
* wie sie in der Glossardatei steht. Ab sofort wird die Schreibweise
* so beibehalten, wie sie vorgefunden wird
**/
/**
* Pfad zur Contentdatei mit den Glossareinträgen
*
* Diese Datei muß _keine_ Contentdatei sein, kann aber so auch gleich
* als Glossar mit angezeigt werden.
*
* !!!! ACHTUNG !!!! Pfadangabe relativ zum __Document-Root__ !!!
**/
$lexifile = '/hilfe/glossar.htm';
/**
* true = nur ganze Wörter ersetzen
* false = Begriffe auch in zusammengesetzten Wörtern ersetzen
**/
$match_only_whole_words = true;
/**
* Contentfelder, die durchsucht werden sollen
**/
$fields = array('KOLUMNE', 'CONTENT1', 'CONTENT2', 'CONTENT', 'FOOTER');
/**
* dieser Ausdruck wird an Stelle des gefundenen Begriffes eingesetzt
*
* folgende Platzhalter können darin verwendet werden:
* %name - der ursprüngliche Text, der ersetzt wird
* %desc - der beschreibende Text aus dem Glossar
**/
//$format = '<a href="#" class="info">%name<span>%desc</span></a>';
$format = '<acronym title="%desc">%name</acronym>';
/**
* dieser Ausdruck wird an Stelle des gefundenen Begriffes eingesetzt,
* wenn auch ein korrespondierender Link gefunden wird
*
* folgende Platzhalter können darin verwendet werden:
* %name - der ursprüngliche Text, der ersetzt wird
* %link - der ursprüngliche Text, der ersetzt wird
* %desc - der beschreibende Text aus dem Glossar
**/
//$formatlink = '<a href="%link" class="info">%name<span>%desc</span></a>';
$formatlink = '<a href="%link" title="%desc">%name</a>';
/**
* Mit dieser Variaben werden HTML-Tags ausgeschlossen, in denen nicht ersetzt werden soll.
* Sinnvoll ist dies zum Beispiel beim a-Tag, wenn dort ein Link ersetzt werden würde, oder
* der code-Tag, damit in Code-Ausdrücken keine acronym's rumflattern.
*
* Die Namen der Tags müssen mit | getrennt werden.
**/
$ignoreTags = 'a|link|q|code|h2';
/*
##############################################
## Ab hier ist nichts mehr konfigurierbar ##
##############################################
*/
if (isset($DEFAULTS->EDIT)) {
/**
* do nothing in EDIT-mode
*/
return;
}
if (isset($PageContent->NO_GLOSSAR)) {
return;
}
/**
* Glossardatei einlesen und ein assoziatives Array erstellen
*/
if (file_exists($_SERVER['DOCUMENT_ROOT'].$lexifile)) {
$lexikon = join('',file($_SERVER['DOCUMENT_ROOT'].$lexifile));
$lexikon = str_replace("\n",'',$lexikon);
/**
* Extrahieren der Glossareinträge
*
* eventuell an eigene Formatierungen in der Glossardatei anpassen
*/
preg_match_all('$<dt>(.*?)</dt>\s*?<dd>(.*?)</dd>(\s*?<dd>.*?([http://|mailto:|ftp://]+://[^\s<>"]+).*?</dd>)*$sm',$lexikon,$entries);
echo '<!--';
print_r($entries);
echo '-->';
/**
* $entries ist ein Array
*
* - Element 0 beinhaltet die kompletten Glossareinträge
* - Element 1 beinhaltet die Glossarbegriffe
* - Element 2 beinhaltet die Glossarbeschreibungen
* - Element 3 beinhaltet das fakultative 2. Element mit dem Link
* - Element 4 beinhaltet die URI des Links
*/
$replace = array(); // beinhaltet die Beschreibungen
$search = array();
$max = count($entries[1]);
/**
* erstelle die Arrays für Suchen und Ersetzen
*/
for ($i = 0; $i<$max; $i++) {
$search[] = trim($entries[1][$i]);
if (isset($entries[4][$i]) && trim($entries[4][$i])!='') {
$item = str_replace(array('%desc', '%link'), array (trim ($entries [2] [$i]), trim ($entries [4] [$i])), $formatlink);
} else {
$item = str_replace(array('%desc'),array(trim($entries[2][$i]),trim($entries[1][$i])) ,$format);
}
$replace[] = $item;
}
foreach ($fields as $field) {
if (isset($PageContent->{$field})) {
$content = join('',$PageContent->{$field});
// Ersetze die phpcms-Variablen, so daß sie in der RegEx wegen /e nicht mit ausgewertet werden
$phpcms_vars = array('$home'=>'%%home%%', '$self'=>'%%self%%', '$plugindir'=>'%%plugindir%%');
reset($phpcms_vars);
foreach ($phpcms_vars as $id=>$wert) {
$content = str_replace($id, $wert, $content);
}
if (trim($content)!='') {
$max = count($search);
for ($i=0; $i<$max; $i++) {
$s = str_replace (' ', '\s', $search[$i]);
$r = $replace[$i];
/* Auslesen des Textes aus dem Contentfeld */
if ($match_only_whole_words) {
// $content = preg_replace("/((<[^>]*)|\b$s\b)/ex", '"\2"=="\1"? "\1":$r', $content);
$content = preg_replace("§((<(".$ignoreTags.")[^>]*>.*?($s).*?</\\3>)|(<[^>]*)|(\b$s\b))§iex", '("\4"!="\1") && "\6"=="\1" ? str_replace("%name", "\1", $r) : "\1"', $content);
} else {
// $content = preg_replace("/((<[^>]*)|$s)/ex", '"\2"=="\1"? "\1":$r', $content);
$content = preg_replace("§((<(".$ignoreTags.")[^>]*>.*?($s).*?</\\3>)|(<[^>]*)|($s))§iex", '("\4"!="\1") && "\6"=="\1" ? str_replace("%name", "\1", $r) : "\1"', $content);
}
$content = stripslashes($content);
}
}
// Mache die Variablenersetzung rückgängig
reset($phpcms_vars);
foreach ($phpcms_vars as $id=>$wert) {
$content = str_replace($wert, $id, $content);
}
$PageContent->{$field} = array($content);
}
}
}
/**
* clean the var-scope
**/
unset ($content, $entries, $field, $fields, $format, $formatlink, $i, $id, $item, $lexifile, $lexikon, $match_only_whole_words, $max, $phpcms_vars, $r, $replace, $s, $search, $wert);
/**
* TODO
*
* Worterkennung
* Luxus wäre ja eine "Endungserkennung", die sieht, ob der Rest des Wortes eine Endung oder mehr ist *g*
* klar singular/plural-Erkennung... ;-)
* plus: Bindestriche gelten als Trenner zwischen zwei Worten...
* Quotes und Klammern dito...
**/
?>