php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.02.2008, 08:44  
Benutzer
 
Registriert seit: 12.12.2007
Beiträge: 43
rezix
Standard GD-Spezialisten gesucht....wer kann helfen?

Hallo....

nachfolgend präsentiere ich euch eine GD-Lösung welches einen Text publiziert... dieser unterscheidet zwischen:
/[b] jedoch habe ich das problem.. falls der Text länger als die (200px) vom Bild ist schreibt er mir den Text drüber hinaus... Kann mir jemand bei dem Skript helfen und dies einigermassen so anpassen bzw. helfen das sobald der Text an die 200 PX antritt auf die nächste Zeile geschrieben wird also in der Art:

Das ist mein Text der gleich angrentzt| <- 200px (mache
)
nun folgt er auf der zeile 2| <- text geht hier weiter

PHP-Code:

$text 
$_GET['text'];
 
/** Ein Parser interpretiert Text.
   * Dieser Parser hier verarbeitet einen einfachen
   * HTML ähnlichen Markup Language und gibt seine
   * Daten an einen Writer weiter.
   * Der Parser bestimmt in diesem Fall das Layout 
   * (da Markup Language als Basis), wärend
   * der Writer das konkrete Design und
   * das Zielformat bestimmt.
   */
  
class SMLParser
  

    const 
TXT_MODE_IGNORE  0xff;
    const 
TXT_MODE_NORMAL  0x00;
    const 
TXT_MODE_BOLD    0x01;
    const 
TXT_MODE_ITALIC  0x02;

    private 
$tagMap=array('p'=>self::TXT_MODE_NORMAL,
                          
'b'=>self::TXT_MODE_BOLD  ,
                          
'i'=>self::TXT_MODE_ITALIC,
                          
'br'=>self::TXT_MODE_IGNORE);

    private 
$stack=array();
    private 
$currMode=self::TXT_MODE_NORMAL;
    private 
$writer=null;

    public function 
setWriter(SMLImageWriter $writer)
    {
      
$this->writer=$writer;
    }

    public function 
parse($content)
    {
      if(
is_null($this->writer))
        throw new 
Exception('Cannot parse without an output channel!');

      
// strip newline and carriage return:
      
$content=preg_replace("#[\r\n]+#",'',$content);
    
      
// find all content 
      ###TODO: Replace with propper tokenizer for longer content###
      
preg_match_all("#(<(([^>/]+)\s*|(/([^>]+)\s*)|(([^>/]+)\s*/))>|[^<>]+)#si",$content,$m);

      
// loop over content elements
      
foreach($m[2] as $k=>$data)
      {
        if(!empty(
$data))
        {
          switch(
$data)
          {
            case 
$m[3][$k]: // opening tag
              
$tag=trim($m[3][$k]);
              
array_push($this->stack,$tag);
              
$this->onOpeningTag($tag);
            continue 
2;
            case 
$m[4][$k]: // closing tag          
              
$tag=trim($m[5][$k]);
              if(
array_pop($this->stack)!=$tag)
                throw new 
Exception('Parse error! Invalid closing tag detected!');
              
$this->onClosingTag($tag);
            continue 
2;
            case 
$m[6][$k]: // empty tag
              
$tag=trim($m[7][$k]);
              
$this->onOpeningTag($tag);
              
$this->onClosingTag($tag);
            continue 
2;
          }
        }
        
// character data:
        
$this->onCharacterData($m[0][$k]);
      }
    }
    
    private function 
onOpeningTag($tag)
    {
      if(!isset(
$this->tagMap[$tag]))
        throw new 
Exception('Parse error! Unknown tag detected!');
      if(
$tag!='br')
      {
        
$bmask=$this->tagMap[$tag];
        
$this->currMode|=$bmask;
        
$this->writer->setMode($this->currMode^self::TXT_MODE_NORMAL);
      }
    }
    private function 
onClosingTag($tag)
    {
      if(!isset(
$this->tagMap[$tag]))
        throw new 
Exception('Parse error! Unknown tag detected!');
      if(
$tag!='br')
      {
        
$bmask=$this->tagMap[$tag];
        
$this->currMode^=$bmask;
        
$this->writer->setMode($this->currMode^self::TXT_MODE_NORMAL); 
      }else
        
$this->writer->lineBreak();

    }
    private function 
onCharacterData($data)
    {
      
$this->writer->write(mb_convert_encoding($data,'UTF-8','HTML-ENTITIES'));
    }
   
  }

//Dieser Parser ist eigentlich eher ein Transformator, 
//da er die Darstellungsschicht direkt ansteuert. Die Darstellungsschicht könnte dabei wie folgt aussehen:
  
abstract class SMLImageWriter
  
{
    protected 
$img      null;
    protected 
$mode     SMLParser::TXT_MODE_NORMAL;
    protected 
$currLine = array();

    private 
$fontFiles  = array();
    private 
$fontColors = array();                                                            
    private 
$fontSizes  = array();                                 
    private 
$offsetX    0;
    private 
$offsetY    0;
    private 
$lineSpacing0;
    
    public function 
setBackgroundImage($img)
    {
      
$this->img=$img;
    }
    public function 
setXY($x,$y)
    {
      
$this->offsetX=$x;
      
$this->offsetY=$y;  
    } 
    public function 
setLineSpacing($px)
    {
      
$this->lineSpacing=$px;
    }
    public function 
setFont($mode,$fontFile)
    {
      
$this->fontFiles[$mode]=$fontFile;
    }
    public function 
setColor($mode,$r,$g,$b)
    {
      
$this->fontColors[$mode]=imagecolorallocate($this->img,$r,$g,$b);
    }
    public function 
setBackgroundColor($r,$g,$b)
    {
      
imagefill($this->img,0,0,imagecolorallocate($this->img,$r,$g,$b));
      
    }
    public function 
setSize($mode,$size)
    {
      
$this->fontSizes[$mode]=$size;
    }
    public function 
initMode($mode,$fontFile,$size,$color)
    {
      
$this->setFont($mode,$fontFile);
      
$this->setSize($mode,$size);
      
$this->setColor($mode,$color[0],$color[1],$color[2]);
    }
    public function 
setMode($mode)
    {
      
$this->mode=$mode;
    }
    public function 
lineBreak()
    {
      
$this->writeLine();
      
$this->currLine=array();
    }
    public function 
write($string)
    {
      
$this->currLine[]=array($this->mode,$string);
    }
    public function 
store($filename)
    {
      
$this->writeLine();
      
$this->doStore($filename);
    }
    public function 
display()
    {
      
$this->writeLine();
      
$this->doDisplay();
    }
    
      private function 
writeLine() 
    { 
      
// first calculate total line height: 
      
$lineHeight=0
      
$lineWidth=0

      foreach(
$this->currLine as $k=>$element
      { 
        
$sizeInfo=imagettfbbox($this->fontSizes[$element[0]], 
                               
0
                               
$this->fontFiles[$element[0]], 
                               
$element[1]); 

        
// Zeilenbreite inklusive des aktuellen Elements errechnen: 
        
$lineWidth+=abs($sizeInfo[6]) - abs($sizeInfo[0]); 
        
// Wenn Zeile zu lang wird, dann 
        
if($lineWidth>$this->maxLineWidth
        { 
          
// schonmal die Teile merken, die wir uns hier garnicht weiter anschauen, 
          
$rest=array_slice($this->currLine,$k+1); 
          
// dann das aktuelle Element in Teilworte zerlegen 
          
if(preg_match_all('#(^|\W+)(\w{2,})(\W+|$)',$element[1],$m)) 
          { 
            
// Wenn Element nicht weiter zerlegbar, dann 
            
if(count($m[0])==1
              
// künstliche Trennung in Wortmitte 
              
$m[0]=array(substr($m[0][0],0,intval(strlen($m[0][0])/2)), 
                          
substr($m[0][0],intval(strlen($m[0][0])/2)+1)); 
            
// Hier haben wir jetzt mindestens zwei Teilworte, 
            // die wir weiter verarbeiten müssen: 
            
$current=array(); 
            foreach(
$m[0] as $currText
              
$current[]=array($element[0],$currText); 
            
$previous=array_slice($this->currLine,0,$k); 
            
$this->currLine=array_merge($previous,$current,$rest); 
            return 
$this->writeLine(); 
          } 
          
// ansonsten ist das Wort nicht mehr weiter zerlegbar  
          // und wir können umbrechen: 
          
$this->lineBreak(); 
          
// jetzt müssen wir nur die nicht betrachteten Elemente in die nächste Zeile verschieben: 
          
$rest=array_merge(array($element),rest); 
          foreach(
$rest as $appendElement
          { 
            
$this->setMode($appendElement[0]); 
            
$this->write($appendElement[1]); 
            return; 
          } 
        } 
        
$currHeight=abs($sizeInfo[7]) - abs($sizeInfo[1]); 
        if(
$lineHeight<$currHeight
          
$lineHeight=$currHeight
      } 
       
      
// now write text: 
      
$xpos=$this->offsetX
      foreach(
$this->currLine as $element
      { 
        
$sizeInfo=imagettftext($this->img
                               
$this->fontSizes[$element[0]], 
                               
0
                               
$xpos
                               
$this->offsetY+$lineHeight
                               
$this->fontColors[$element[0]], 
                               
$this->fontFiles[$element[0]], 
                               
$element[1]); 
        
$xpos=$sizeInfo[2]; 
      
      } 

      
$this->offsetY+=$lineHeight+$this->lineSpacing;       
    } 

    
    public abstract function 
doStore($filename);
    public abstract function 
doDisplay();
  }
 
  
/** Bilder gibt's in so manchen Variationen, deshalb 
   * müssen alle ein konkretes Format betreffenden Informationen 
   * in eine andere Klasse.
   */
  
class SMLJpegWriter extends SMLImageWriter
  
{
    public function 
doStore($filename)
    {
      
imagejpeg($this->img,$filename,75);
    }
    public function 
doDisplay()
    {
      
header('Content-type: image/jpeg');
      
imagejpeg($this->img,null,75);
    }
  }
if(
$text != '')
{
 
// Zuerst mal brauchen wir unser Ziel:
  
$smlw=new SMLJpegWriter;
  
// Das Ziel konfigurieren wir uns 200x200 Pixel groß,
  
$smlw->setBackgroundImage(imagecreate(200,50));
  
// und mit einem weißen Hintergrund.
  
$smlw->setBackgroundColor(0xff,0xff,0xff);
  
// Jetzt legen wir das Aussehen für die unterschiedlichen Textteile fest:
  
$smlw->initMode(SMLParser::TXT_MODE_NORMAL,'../fonts/arial.ttf',7,array(0,0,0));
  
$smlw->initMode(SMLParser::TXT_MODE_BOLD,'../fonts/arialbd.ttf',7,array(0,0,0));
  
$smlw->initMode(SMLParser::TXT_MODE_ITALIC,'../fonts/ariali.ttf',7,array(0,0,0));
  
$smlw->initMode(SMLParser::TXT_MODE_ITALIC|SMLParser::TXT_MODE_BOLD,'../fonts/arialbi.ttf',7,array(0,0,0));
  
// uns sagen noch, wo der Text hin soll
  
$smlw->setXY(2,7);
  
// und wie viel Platz zwischen zwei Zeilen sein soll
  
$smlw->setLineSpacing(5);
  
  
// Um unser Ziel beschreiben zu können benötigen wir einen Parser:
  
$smlp=new SMLParser;
  
// der das Ziel kennen muss:
  
$smlp->setWriter($smlw);
  
  
// Außerdem brauchen wir Daten für unseren Parser:
  
$txt=<<<endTxt
$text
endTxt;
  
// und die teilen wir ihm sogar mit. Das Beschreiben unseres Ziels macht der
  // Parser dabei automatisch.
  
$smlp->parse($txt); 
  
  
// anzeigen:
   
$smlw->display();

rezix ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 20.02.2008, 10:49  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo rezix,

ich lasse mich i.d.R. nicht zu solchen Aussagen hinreissen, aber du glaubst doch nicht im Ernst, dass undokumentierter Code mit einer dürftigen Fehlerbeschreibung jemanden animiert dir zu helfen. Wenn du schon unendgeltliche Hilfe haben möchtest, dann poste das bitte ins "Gesuche"-Forum.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 20.02.2008, 11:06  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Massenhaft Ausrufezeichen, Grossbuchstaben und Bezeichnungen wie «DRINGEND» veranlassen mich jeweils einen Beitrag zu ignorieren. Hier eine kleine Hilfe um effizient Fragen zu stellen
__________________
Gruss
L
lazydog ist offline  
Alt 20.02.2008, 11:38  
Benutzer
 
Registriert seit: 12.12.2007
Beiträge: 43
rezix
Standard

Sorry es tut mir leid.. habe den Titel editiert.. wollte nicht aufdringlich sein.. jedoch bin ich seit Wochen am Problem dran darum au die Nervosität und Aufdringlichkeit... sorry!
rezix ist offline  
Alt 20.02.2008, 12:05  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Ich schlage vor, du dokumentierst den Code mal ordentlich und denkst nochmal über eine Lösung nach. Anschließend können wir nochmal drüber reden.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 20.02.2008, 12:22  
Benutzer
 
Registriert seit: 12.12.2007
Beiträge: 43
rezix
Standard

So ich habe den Code wirklich soweit es in meiner Macht steht dokumentiert....
Ich bin echt am verzweifeln..
rezix ist offline  
Alt 20.02.2008, 14:44  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

* Methoden haben keine Parameter- und Rückgabewert-Definition
* Klassen sollten eine Funktions- und Verwendungs-Dokumentation haben
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 20.02.2008, 15:01  
Benutzer
 
Registriert seit: 12.12.2007
Beiträge: 43
rezix
Standard

Den ganzen Code kann man auch kopieren und testen auf dem eigenen Server:


http://....../xy.php?text=das ist ein langer text der leider nicht abgeschnitten wird..

damit man mein problem besser versteht
rezix ist offline  
Alt 20.02.2008, 18:02  
CIX88
Gast
 
Beiträge: n/a
Standard

Also das ganze Script ist mir jetzt zu lang, um es genauer anzugucken.
Aber vielleicht bringt dich das auf eine Idee:
http://www.mediacix.de/code/lange-Te...-193-code.html
(umsetzen musste allerdings selber)
 
Alt 21.02.2008, 10:56  
Benutzer
 
Registriert seit: 12.12.2007
Beiträge: 43
rezix
Standard

Zitat:
Zitat von CIX88
Also das ganze Script ist mir jetzt zu lang, um es genauer anzugucken.
ICH danke DIR vielmals!!!

genau das brauche ich:

PHP-Code:
$font 4// Font 1-5
                        
$string_width ImageFontWidth($font);
                        
$max_bb 395// max. Breite vom Text in px
                        
$zeichen_anzahl ceil($max_bb $string_width);
                        
$text wordwrap$text$zeichen_anzahl"
"
1); 
Nur andere Frage.. da bei mir alles per TinyMCE Editor kommt zählt mir das Tool auch die HTML Tags mit und somit hat der User nicht volle 200px zum kritzeln... wie kann ich das einbinden das er mir die HTML Tags NICHT mitzählt aber trotzdem publizeirt?
rezix ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP Entwickler (m/w) in Festanstellung gesucht mypeopls Beitragsarchiv 0 26.05.2008 20:23
pimps mit hirn gesucht Beitragsarchiv 12 20.08.2005 18:42
Redakteure für sehr großes Projekt gesucht Beitragsarchiv 1 19.08.2005 01:57
PHP Programmierer und Grafiker für größeres Projekt gesucht Beitragsarchiv 9 11.08.2005 22:56
Script gesucht: Bibliothekverwaltung Beitragsarchiv 2 25.07.2005 17:42
Anwendungsentwickler für Bankprojekt gesucht Beitragsarchiv 0 12.07.2005 16:19
Freelancer gesucht Beitragsarchiv 1 17.05.2005 14:03
PHP Programmierer gesucht Beitragsarchiv 2 16.05.2005 19:17
Software / Programmierer gesucht Beitragsarchiv 12 14.04.2005 15:02
Moderator mit guten Kenntnissen in php gesucht Beitragsarchiv 0 14.12.2004 23:54
[Erledigt] Dringende Hilfe gesucht:( Datenbanken 4 28.11.2004 16:05
PHP-Programmierer gesucht! Beitragsarchiv 3 14.08.2004 22:18
einfaches PHP-Forum gesucht BITTE HELFEN PHP Tipps 2004 4 10.07.2004 22:57

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
<?php $text = \das ist ein langer text,

Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.