GeSHi - unterschiedliche Sprachen in einem Syntaxhighlighting

  • Themenstarter Themenstarter Maik
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

Maik

Hi,

ich habe mir heute Früh GeSHi auf dem lokalen Webserver eingerichtet, und schlage mich seither mit dem Code herum, um einen (durchgängigen) Seitenquelltext mit drei unterschiedlichen Sprachen (html4strict, css, javascript) auszuzeichnen.

Mein derzeitiger Status Quo funktioniert zwar in der Ausgabe, dummerweise wird aber bei jedem Sprachenwechsel ein sichtbarer Absatz in der Darstellung erzeugt, da GeSHi jede Sprache in ein eigenes pre-Element packt.

Nachfolgend poste ich euch den derzeitigen Quellcode, bei dem ich mittlerweile das dumpfe Gefühl habe, dass ich mich mit dieser Technik auf dem Holzweg befinde:

PHP:
<?php
include_once('geshi.php');

$source1 = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>...</title>

<script type="text/javascript">';
$language1 = 'html4strict';
$source2 = 'function foobar(){

 ...

}';
$language2 = 'javascript';
$source3 = '</script>

<style type="text/css">';
$language3 = 'html4strict';
$source4 = '#layer1, #layer2, #layer3, #layer4 {
...
}';
$language4 = 'css';
$source5 = '</style>

</head>
<body>
...
</body>
</html>';
$language5 = 'html4strict';

$geshi1 = new GeSHi($source1, $language1);
echo $geshi1->parse_code();
$geshi2 = new GeSHi($source2, $language2);
echo $geshi2->parse_code();
$geshi3 = new GeSHi($source3, $language3);
echo $geshi3->parse_code();
$geshi4 = new GeSHi($source4, $language4);
echo $geshi4->parse_code();
$geshi5 = new GeSHi($source5, $language5);
echo $geshi5->parse_code();
?>
Die Dokumentation nennt da zwar diverse Möglichkeiten, so richtig schlau werd ich aber daraus ehrlich gesagt auch nicht. :(

Im voraus schon mal großen Dank für sachdienliche Hinweise ;)

mfg Maik
 
PHP:
$geshi = new GeSHi($source1, $language1);
$output[] = $geshi->parse_code();
$geshi->set_source($source2);
$geshi->set_language($language2);
$output[] = $geshi->parse_code();
# usw.

echo implode('', $ouput);

Damit es schonmal schöner wird... Dann brauchst du nicht mehr X-Objekte ;)

Als Quick'n'Dirty Methode:

PHP:
$geshi = new GeSHi($source1, $language1);
$output[] = $geshi->parse_code();
$geshi->set_source($source2);
$geshi->set_language($language2);
$output[] = $geshi->parse_code();
# usw.

$output = str_replace(array('<pre>', '</pre>'), '', $output);
echo '<pre>'.implode('', $output).'</pre>';

Ob das einfach so klappt, weiß ich aber nicht aufgrund der CSS Klassen von GeSHi.
 
Was spuckt denn die parse_code()-Methode aus?
Sprichst du vom ausgegebenen Quellcode?

Et voilà:
Code:
<pre class="html4strict"><span style="color: #00bbdd;">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot;</span>
<span style="color: #00bbdd;">  &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;</span>

<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;content-type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=ISO-8859-1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title&gt;</span></span>...<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title&gt;</span></span>

&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
function foobar(){
...
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">&lt;/script&gt;</span></span>

&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;style</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
#layer1, #layer2, #layer3, #layer4 {
...
}
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/style&gt;</span></span>
&nbsp;

<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/head&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body&gt;</span></span>
&nbsp;
...
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html&gt;</span></span></pre>
Die einzelnen Abschnitte werden soweit mit dem richtigen Style angezeigt, nur halt jeder für sich in einem eigenem pre-Element, was logischerweise an deren "Nahtstellen" zu sichtbaren Abständen in der Darstellung führt.

PHP:
$geshi = new GeSHi($source1, $language1);
$output[] = $geshi->parse_code();
$geshi->set_source($source2);
$geshi->set_language($language2);
$output[] = $geshi->parse_code();
# usw.

echo implode('', $ouput);
Nur damit ich das richtig versteh: dieser Code wird ja zum Schluß nach dem Quellcode aufgerufen, der gehighlightet werden soll?

Und was geschieht mit meinen Variablen (§source1-§source3 und §language1-§language3), die ich dazwischen eingefügt habe bzw. wo lege ich nun die einzelnen Sprachen fest?

Auf jeden Fall erhalte ich damit diese Fehlermeldung:

Warning: implode() [function.implode]: Bad arguments. in D:\xampp\htdocs\testfiles\geshi\test.php on line 117
Und mit deinem zweiten Vorschlag werden es zum Seitenende hin sogar noch mehr pre-Elemente :eek::suspekt:

pre_salat.jpg


mfg Maik
 
Ein wenig verrannt und falsch angegangen... Bei mir klappt das hier:

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Geshi TEst</title>
</head>
<body>

<?php
include_once('./geshi/geshi.php');

$source1 = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>...</title>

<script type="text/javascript">';
$language1 = 'html4strict';
$source2 = 'function foobar(){

 ...

}';
$language2 = 'javascript';
$source3 = '</script>

<style type="text/css">';
$language3 = 'html4strict';
$source4 = '#layer1, #layer2, #layer3, #layer4 {
	font-famiy: Verdana, sans-serif;
}';
$language4 = 'css';
$source5 = '</style>


</head>
<body>
...
</body>
</html>';
$language5 = 'html4strict';

$geshi = new GeSHi($source1, $language1);
$output[] = $geshi->parse_code();
$geshi->set_language($language2);
$geshi->set_source($source2);
$output[] = $geshi->parse_code();
$geshi->set_language($language3);
$geshi->set_source($source3);
$output[] = $geshi->parse_code();
$geshi->set_language($language4);
$geshi->set_source($source4);
$output[] = $geshi->parse_code();
$geshi->set_language($language5);
$geshi->set_source($source5);
$output[] = $geshi->parse_code();

$output = str_replace(array('<pre', '</pre>'), array('<div', '</div>'), $output);
echo nl2br(implode('', $output));  
?> 
</body>
</html>
So annehmbar?
 
Zumindest rücken die Abschnitte nun enger zusammen. Dank dir, Felix :)

Aber was hat es hier mit den fehlenden >-Klammern bei dem öffnenden <pre>- u. <div>-Tag auf sich?

PHP:
$output = str_replace(array('<pre', '</pre>'), array('<div', '</div>'), $output);
Absicht oder Versehen?

Letztlich war meine Herangehensweise heute Morgen dann doch nicht so verkehrt ;-)

mfg Maik
 
Die Sache war, dass GeSHi die <pre> Tags aus zwei Gründen benutzt...

Einmal um die Highlighting Klasse reinzutun... <pre class="html4strict"> und einmal damit sie keine <br> setzen müssen und die \n stehen lassen können.

Ich hab die Tags offen gelassen, damit eben nur der Anfang ersetzt wird und nicht die class selbst mit. Natürlich könnte man noch einen regulären Ausdruck basteln, der das besser (evtl. sogar sicherer) kann, aber war eben eine schnelle Lösung ;)
 
Hi,
Mein derzeitiger Status Quo funktioniert zwar in der Ausgabe, dummerweise wird aber bei jedem Sprachenwechsel ein sichtbarer Absatz in der Darstellung erzeugt, da GeSHi jede Sprache in ein eigenes pre-Element packt.
den Auslöser für diese Absätze konnte ich heute im (damals "frei übernommenen") Stylesheet lokalisieren :suspekt:

Code:
div#log pre {
margin:10px 5px 0 5px;
}
Da der ID-Selektor eine höhere Spezifität als der Klassenselektor besitzt, wird diese margin-Deklaration von meiner im Stylesheet später notierten Regel logischerweise auch nicht überschrieben:

Code:
div.geshibox pre {
margin:0;
...
}

Naja, wie auch immer, mit PHP hat das nicht wirklich viel am Hut, denn mit diesem angewandten PHP-Code:

PHP:
include_once('../../../inc/geshi/geshi.php');
$source1 = ' ... ';
$source2 = ' ... ';
$source3 = ' ... ';
$source4 = ' ... ';
$source5 = ' ... ';

$geshi1 = new GeSHi($source1, 'html4strict');
echo $geshi1->parse_code();
$geshi2 = new GeSHi($source2, 'javascript');
echo $geshi2->parse_code();
$geshi3 = new GeSHi($source3, 'html4strict');
echo $geshi3->parse_code();
$geshi4 = new GeSHi($source4, 'css');
echo $geshi4->parse_code();
$geshi5 = new GeSHi($source5, 'html4strict');
echo $geshi5->parse_code();

und der korrekt interpretierten CSS-Formatierung sitzt die Anordnung der einzelnen pre-Boxen im Textfluss wie angegossen :)

Ich zieh mich dann mal mit meinem Thema ins CSS-Board zurück :p :-)

mfg Maik
 
Status
Nicht offen für weitere Antworten.
Zurück