Location: PHPKode > projects > phpCMS-Plugin: Lexiword4phpCMS > phpcms-plugin-lexiword4phpcms/lexiword.php
<?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...
**/
?>
Return current item: phpCMS-Plugin: Lexiword4phpCMS