Location: PHPKode > scripts > PTAG > ptag/TagLibs.php
<?
/*========================================================================================
*  Autor: Reiner Entzminger            Telefon  (0 63 41) 8 43 69
*         Südring 10                   Telefax  (0 63 41) 8 43 69
*         D-76829 Landau               Mobil +49(0)170 7 34 62 72
*
*  http://www.team-entzminger.de       Mail hide@address.com
*=======================================================================================*/

/**
* @const TAGLIB_HOME Basis-Verzeichnis der TagLib-Klassen
*/
define( "TAGLIB_HOME", "./" );

/**
* @const TAGLIB_EXT Standard-Erweiterung der TagLib-Klassen
*/
define( "TAGLIB_EXT", ".php" );

/**
* @const OBJ_TAGLIBS Beschreibt die Instanz des Objekts TagLibs (The authority
* of the object TagLibs describes)
*/
define( "OBJ_TAGLIBS", "taglibs" );


   /**
   * Liest ein Template ein, wertet es aus und führt die darin enthaltenen TagLibs aus.
   * A Template reads one, it evaluates and exports the TagLibs contained in this.
   *
   * @access  public
   * @author  Reiner Entzminger <hide@address.com>
   * @version 1.00.0001 03/20/2002 23:30
   *
   * @package TagLibs
   */
   class TagLibs {
      /**
      * @var string $template Speichert das Template (The Template saves)
      */
      var $template        = '';


      /**
      * TagLibs Konstruktor der Klasse (Constructor of the class)
      *
      * @param  string $filename
      * Dateiname des Templates (File name of the Templates)
      *
      * @access  public
      */
      function TagLibs( $filename ) {
         $GLOBALS['error']    = 0;

         if ( file_exists( $filename ) && is_file( $filename ) ) {
         // Prüfen, ob die angebene Datei existiert und tatsächlich eine Datei ist
         // Checking whether the angebene file exists and a file actually is
         //
            $hdl                 = fopen( $filename, 'r' );
            $this->template      = fread( $hdl, filesize( $filename ) );

            fclose( $hdl );

            if ( ! empty( $this->template ) ) {
            // Prüfen, ob das Template auch eingelesen werden konnte und auch etwas drin steht
            // Checking whether the Template also could be fed and is also a little in this
            //
               array_walk( $GLOBALS['tags'], "includes" );
               array_walk( $GLOBALS['tags'], "registere" );

               $this->parse();
            } else {
            // Template konnte nicht eingelesen werden oder ist leer
            // Template couldn't be fed or is empty
            //
               $GLOBALS['error']    = 98;
            }  // if ( ! empty( $this->template ) )
         } else {
         // Datei wurde nicht gefunden oder ist keine Datei
         // File wasn't found or isn't a file
         //
            $GLOBALS['error']    = 99;
         }  // if ( file_exists( $filename ) && is_file( $filename ) )
      }  // function TagLibs()


      /**
      * parse Diese Methode parst das Template und merkt sich die Taglibs
      * (This method parst of the Template and remembers the Taglibs)
      */
      function parse() {
         while( strpos( $this->template, "<ptag:" ) > 0 ) {
            $result              = $this->splitTag();

            $result['tag']       = $this->analyzeTag( $result['tag'] );

            $this->template      = join( "", $result );
         }  // while( strpos( $this->template, "<ptag:" ) > 0 )
      }  // function parse()


      /**
      * splitTag Durchsucht das Template nach TagLibs und gibt das zuletzt gefundene
      * Taglib sowie den Text davor und danach in einer Tabelle zurück.
      * (The Template searches for TagLibs and this gives found Taglib as well as the
      * text back in front of this and after which in a table last.)
      *
      * @return array
      * Das gefundene TagLib sowie den Text davor und danach
      * (The found TagLib as well as the text in front of this and after this.)
      */
      function splitTag() {
         $result                 = array();

         $apos = $this->strlpos( $this->template, "<ptag:" );

         if ( $apos > -1 ) {
            $result['start']        = substr( $this->template, 0, $apos );
            $epos                   = strpos( $this->template, " />", $apos + 1 );

            if ( $epos > 0 ) {
               $result['tag']          = substr( $this->template, $apos, $epos + 3 - $apos );
               $result['end']          = substr( $this->template, $epos + 3 );
            } else {
               $epos                   = strpos( $this->template, "</ptag:", $apos + 1 );

               if ( $epos > 0 ) {
                  $epos                   = strpos( $this->template, ">", ++$epos );

                  if ( $epos > 0 ) {
                     $result['tag']          = substr( $this->template, $apos, $epos + 1 - $apos );
                     $result['end']          = substr( $this->template, $epos + 1 );
                  } else {
                     $GLOBALS['error']       = 101;
                  }  // if ( $epos > 0 )
               } else {
                  $GLOBALS['error']       = 101;
               }  // if ( $epos > 0 )
            } // if ( $epos > 0 )
         }  // if ( $position > -1 )

         return $result;
      }  // function splitTag()


      /**
      * strlpos Ermittelt die Position des letzten Vorkommens von needle in dem String haystack
      * (The item of the last occurrence of needle determines haystack in the string)
      *
      * @param  string $haystack
      * Der String, der zu durchsuchen ist (The string which has to be searched)
      *
      * @param  string $needle
      * Der zu suchende String (The string to be looked)
      *
      * @return integer
      * Position des letzten Vorkommens des zu suchenden Strings (Item of the last occurrence for
      * the string to be looked)
      */
      function strlpos( $haystack, $needle ) {
         $position               = -1;

         do {
            $result                 = $position;
            $position               = strpos( $haystack, $needle, ++$position );
         } while( $position > 0 );

         return $result;
      }  // function strlpos()


      /**
      * analyzeTag Analysiert das übergebene Tag, ermittelt die Parameter und ruft in
      * der Tag-Klasse die "seter", sowie die "doStartTag" und "doEndeTag" Methoden auf.
      * (This analyzes, submitted day as well as the "doStartTag" and "doEndeTag" methods
      * determines the parameters and "set he" calls this one in the day class.)
      *
      * @param  string $tag
      * Der zu analysierende Tag (The Tag to be analyzed)
      *
      * @return string
      * Der durch eine Tag-Klasse geänderte Tag ohne Anfang- und Ende-Tag (The tag without
      * beginning changed by a tag class and end tag)
      */
      function analyzeTag( $tag ) {
         $result                 = $tag;

         if ( strpos( $tag, " />" ) > 0 ) {
            $speicher               = explode( " ", substr( $tag, 6, strlen( $tag ) - 9 ) );
            $tagname                = $speicher[0];

            if ( isset( $GLOBALS[$tagname] ) ) {
               for( $i=1; $i< count( $speicher ); $i++ ) {
                  $sets                   = explode( "=", $speicher[$i] );

               // Version zum Aufruf von Set-Methoden je Parameter (Version to the call of set methods per parameters)
// deprecatet?    call_user_method( 'set'.$sets[0], $GLOBALS[$tagname], substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );
               // call_user_func( array( $GLOBALS[$tagname], 'set'.$sets[0] ), substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );
                  call_user_method( 'setParameter', $GLOBALS[$tagname], strtolower( $sets[0] ), substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );
               // call_user_func( array( $GLOBALS[$tagname], 'setParameter' ), strtolower( $sets[0] ), substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );
               }  // for( $i=1; $i< count( $speicher ); $i++ )

               $result = call_user_method( 'doStartTag', $GLOBALS[$tagname] );
            // $result = call_user_func( array( $GLOBALS[$tagname], 'doStartTag' ) );

               call_user_method( 'Release', $GLOBALS[$tagname] );
            // call_user_func( array( $GLOBALS[$tagname], 'Release' ) );
            } else {
               $result     = "<br>Warning! TagLib <b>\"" . $tagname . "\"</b> not found!<br>\n";

               return $result;
            }  // if ( isset( $GLOBALS[$tagname] ) )
         } else {
            $epos                   = strpos( $tag, ">" );

            if ( $epos > 0 ) {
               $tmp['atag']            = substr( $tag, 1, $epos - 1 );
               $tmp['text']            = substr( $tag, $epos + 1, strpos( $tag, "</ptag:" ) - $epos - 1 );
               $tmp['etag']            = substr( $tag, strpos( $tag, "</ptag:" ) );

               $speicher               = explode( " ", substr( $tmp['atag'], 5, strlen( $tmp['atag'] ) - 5 ) );
               $tagname                = $speicher[0];

               if ( isset( $GLOBALS[$tagname] ) ) {
                  if ( strpos( $tmp['etag'], $tagname ) > 0 ) {
                     for( $i=1; $i< count( $speicher ); $i++ ) {
                        $sets                   = explode( "=", $speicher[$i] );

                     // Version zum Aufruf von Set-Methoden je Parameter (Version to the call of set methods per parameters)
// deprecatet?          call_user_method( 'set'.$sets[0], $GLOBALS[$tagname], substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );
                     // call_user_func( array( $GLOBALS[$tagname], 'set'.$sets[0] ), substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );

                     // Version zum Aufruf von der Methode "setParameter" für jeden Parameter (Version to the call of the method "setParameter" for every parameter)
                        call_user_method( 'setParameter', $GLOBALS[$tagname], strtolower( $sets[0] ), substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );
                     // call_user_func( array( $GLOBALS[$tagname], 'setParameter' ), strtolower( $sets[0] ), substr( $sets[1], 1, strlen( $sets[1] ) - 2 ) );
                     }  // for( $i=1; $i< count( $speicher ); $i++ )

                     $result = call_user_method( 'doStartTag', $GLOBALS[$tagname], $tmp['text'] );
                  // $result = call_user_func( array( $GLOBALS[$tagname], 'doStartTag' ), $tmp['text'] );
                     $result = call_user_method( 'doEndeTag' , $GLOBALS[$tagname], $result      );
                  // $result = call_user_func( array( $GLOBALS[$tagname], 'doEndeTag' ), $result );

                     call_user_method( 'Release', $GLOBALS[$tagname] );
                  // call_user_func( array( $GLOBALS[$tagname], 'Release' ) );
                  } else {
                     $GLOBALS['error']       = 102;
                  }  // if ( strpos( $tmp['etag'], $tagname ) > 0 )
               } else {
                  $result     = "<br>Warning! TagLib <b>\"" . $tagname . "\"</b> not found!<br>\n";

                  return $result;
               }  // if ( isset( $GLOBALS[$tagname] ) )
            }  // if ( $epos > 0 )
         }  // if ( strpos( $tag, " />" ) > 0 )

         return $result;
      }  // function analyzeTag()

   }  // class TagLibs


   /**
   * includes Schließt die notwendigen Tag-Klassen in das Projekt ein.
   * (includes the necessary tag classes in the project.)
   *
   * @param  string $class
   * Name der Tag-Klassen (Name of the tag classes)
   */
   function includes( $class ) {
      $tagfile                = TAGLIB_HOME;
      $tagfile               .= $class . "Tag";
      $tagfile               .= TAGLIB_EXT;

      include_once( $tagfile );
   }  // function includes()


   /**
   * registere Registriert die notwendigen Tag-Klassen
   * (Register the necessary tag classes)
   *
   * @param  string $class
   * Name der Tag-Klassen (Name of the tag classes)
   */
   function registere( $class ) {
      $clazz                  = $class . "Tag";
      $GLOBALS[$class]        = new $clazz;
   }  // registere
?>
Return current item: PTAG