Julius: wozu blog software ?

Beitrag lesen

Hallo mermshaus,

Besser wird es bis Version 0.4.0 nicht mehr. ~75 % des Speicherplatzbedarfs (6.3 MB von 8.0 MB) gehen übrigens für GeSHi drauf. Mit GeSHi bin ich auch aus anderen Gründen nicht so ganz glücklich. Der Code ist sehr „zerwachsen“. Ich plane, auf highlight.js umzustellen.

Ich stricke mir gerade etwas Eigenes für HTML (im Prinzip über alle (Unicode-)Zeichen iterieren und nach < bzw. > suchen), CSS und JavaScript (mit etwas Trickserei lässt sich das auch durch highlight_string jagen) – wenn PHP-Code auftaucht, wird der an den in PHP integrierten Syntax-Highlighter weitergereicht. Eventuell ergänze ich noch Python und SQL; C und Konsorten sollten sich ebenfalls mit highlight_string verwursten lassen. Bestimmt kann man das besser bzw. übersichtlicher lösen (OOP?!), aber ich im Moment nicht.

$char = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
$count = count($char);
$pos = 0;
$element=false;
$attribute=false;
$attr_value=false;
$doctype=false;
$content=false;
$output='';

while($pos < $count)
{
 if($char[$pos].$char[$pos+1]=='<!' and $char[$pos+2].$char[$pos+3]!='--')
 {
  $doctype=true;
  $output.='<span style="color:gray;">&lt;!';
  $element=false;
  $pos++;
 }
 elseif($char[$pos].$char[$pos+1]=='<!' and $char[$pos+2].$char[$pos+3]=='--')
 {
  $comment=true;
  $doctype=false;
  $output.='<span style="color:darkgreen;">&lt;!--';
  $element=false;
  $pos+=3;
 }
 elseif($char[$pos].$char[$pos+1]=='<?')
 {
  if($highlight_php)
  {
   $php='';
   while($pos<$count)
   {
    $php.=$char[$pos];
    if($char[$pos-1]=='?' and $char[$pos]=='>')
    {
     break;
    }
    $pos++;
   }
   $php = str_replace(array('<code><span style="color: #000000">
', '</span>
</span>
</code>'), array('<span style="color:black;">', '</span>'), highlight_string($php,true));;
   $output.=$php;
  }
  else
  {
   $output.='<span style="color:orange;">&lt;?';
   $pos++;
  }
 }
 elseif($char[$pos]=='<')
 {
  $output.='<span style="color:blue;">&lt;';
  $element=true;
  $doctype=false;
 }
 elseif($char[$pos]=='>')
 {
  if($attribute)
  {
   $attribute=false;
   $output.='</span>';
  }
  $output.='&gt;</span>';
  $element=false;
  $comment=false;
 }
 elseif($char[$pos]=="\n")
 {
  $output.="<br>\n";
 }
 elseif($char[$pos]==' ' and !$element)
 {
  $output.='&nbsp;';
 }
 elseif(($char[$pos]=='"' or $char[$pos]=="'") and !$attr_value)
 {
  $attr_marker=$char[$pos];
  $attribute=false;
  $attr_value=true;
  $output.='<span style="color:purple;">'.$attr_marker;
 }
 elseif($attr_value and ($char[$pos]==$attr_marker or $char[$pos]==$attr_marker or $attr_marker=='none'))
 {
  if($attr_marker=='"')
  {
   $output.='"</span>';
  }
  elseif($attr_marker=="'")
  {
   $output.='\'</span>';
  }
  elseif($attr_marker=='none' and $char[$pos+1]==' ' and $char[$pos+1]=='>' and $char[$pos+1]=='/')
  {
   $output.='</span>';
  }
  $attr_value=false;
  $attr_marker='';
 }
 elseif($char[$pos-1]==' ' and !$attribute and $element and !$comment and !$doctype and !$attr_value and $char[$pos]!='=' and $char[$pos]!='"' and $char[$pos]!="'")
 {
  $attribute=true;
  $output.='<span style="color:red;">'.$char[$pos];
 }
 elseif($char[$pos]=='=' and $attribute)
 {
  $output.='</span>=';
  $attribute=false;
  if($char[$pos+1]!='"' and $char[$pos+1]!="'" and $char[$pos+1]!=' ' and $char[$pos+1]!='>' and $char[$pos+1]!='/')
  {
   $output.='<span style="color:purple;">'.htmlspecialchars($char[$pos+1]);
   $attr_value=true;
   $attr_marker='none';
  }
  elseif($char[$pos+1]!='"' and $char[$pos+1]!="'" and $char[$pos+2]!='"' and $char[$pos+2]!="'" and $char[$pos+2]!=' ' and $char[$pos+2]!='>' and $char[$pos+2]!='/')
  {
   $output.=htmlspecialchars($char[$pos+1]).'<span style="color:purple;">';
   $attr_value=true;
   $attr_marker='none';
   $pos++;
  }
 }
 elseif($char[$pos]=='&' and ($attr_value or !$element))
 {
  if($char[$pos+1]!=' ' and $char[$pos+2]!=' ')
  {
   $output.='<span style="color:purple; font-style:italic;">&amp;';
   $pos_start=$pos;
   while(($pos_start+11)>=$pos)
   {
    $pos++;
    $output.=htmlspecialchars($char[$pos]);
    if($char[$pos]==';')
    {
     break;
    }
   }
   $output.='</span>';
  }
  else
  {
   $output.='&amp;';
  }
 }
 else
 {
  $output.=htmlspecialchars($char[$pos]);
 }
 $pos++;
}
echo $output;

Ich hatte lange Zeit bei dem Projekt eine „No JS“-Policy, aber auch etwa das Rendern von mathematischen Formeln kann man ohne MathJax im Grunde vergessen.

Auch das habe ich mittlerweile ohne JavaScript lösen können: Auf dem Server läuft $$\LaTeX$$ und dvisvgm, das SVGs erzeugt, die ich dann in die Dokumente einbinde. Es ist zwar leider keine reine PHP-Lösung, aber immerhin eine für den Fall, dass man die Software auf dem Server selbst installieren kann oder einen netten Hoster hat, den man darum bitten kann.

Ich bin der Meinung, dass Syntax-Highlighting und das Rendern von Formeln nach Möglichkeit auf dem Server laufen sollten[1]: Wenn ich ein Notebook bestelle, baut man bei mir ja auch nicht zuerst eine Fabrik im Wohnzimmer auf und danach wieder ab, sondern liefert mir direkt das Endprodukt!

Ich nehme mal stark an, dass solche Dinge tendenziell eher mit JavaScript geregelt werden, weil fast alle Browser JavaScript beherrschen, während man eine Server-seitige Lösung für PHP, Ruby, Python, Perl und Java bereithalten müsste, um eine gute Abdeckung zu erreichen.

Gruß
Julius



  1. Klar, für statische Seiten ohne jeglichen Generator dahinter und für Live-Vorschau ist eine JavaScript-Lösung eventuell zweckmäßig. ↩︎

0 52

wozu blog software ?

Pinie
  • blog
  1. 0
    Matthias Scharwies
    • blog
    • webdesign
  2. 0
    Auge
    • grafik
  3. 0
    pl
  4. 2
    mermshaus
    1. 1
      Pinie
      1. 1
        Auge
        1. 1
          mermshaus
          • blog
          • software
          1. 0

            Anmerkung für mermshaus

            Auge
            • zur info
            1. 0
              mermshaus
              1. 0
                Christian Kruse
              2. 0
                Auge
                1. 0
                  mermshaus
                  1. 0
                    Auge
                    1. 0
                      Christian Kruse
                      1. 0
                        Auge
                        • zu diesem forum
                        • zur info
                        1. 0
                          Christian Kruse
                      2. 0
                        mermshaus
    2. 1
      Pinie
  5. 0
    marctrix
  6. 0
    Pinie
    1. 0
      mermshaus
      1. 0
        Pinie
        1. 0
          mermshaus
          1. 0
            Julius
            • blog
            • markdown
            • php
            1. 0
              mermshaus
              1. 0
                Julius
                • html
                • markdown
                • php
      2. 0
        Pinie
        1. 0
          mermshaus
        2. 0
          mermshaus
          1. 0
            Pinie
            1. 1
              mermshaus
              1. 2
                Pinie
                1. 0
                  mermshaus
                2. 0
                  mermshaus
                  1. 1
                    Pinie
                    1. 0
                      mermshaus
            2. 0
              mermshaus
              1. 0
                Pinie
                1. 0
                  Auge
                  • zu diesem forum
              2. 0
                Julius
                • blog
                • javascript
                • php
                1. 0
                  mermshaus
                  1. 0
                    mermshaus
                    1. 0
                      Julius
                      • javascript
                      • php
                      • unicode
                      1. 0
                        mermshaus
                        1. 0
                          Julius
                          1. 0
                            mermshaus
                            • php
                            • unicode
                  2. 0
                    Julius
                    1. 0
                      mermshaus
                      • php
                      1. 0
                        Julius
                2. 0
                  mermshaus
                  1. 0
                    Julius