[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Sourcecode-Highlighter, kleines Problem - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

Sourcecode-Highlighter, kleines Problem

8. Nov 2005, 13:08

Hi,

ich wollte mir ein eigenes Modul schreiben, und zwar einen Syntax-Highlighter für verschiedene Sourcecodes. Nun habe ich für das highlighting auf eine vorhandene Lösung gebaut: geshi.

Klappt auch alles ganz prima, nur wenn ich Sonderzeichen, Zeilenumbrüche o.ä. drin habe werden die Tags nachher im Klartext angezeigt (ich nehme an das ist Standardverhalten bei textarea?), da wohl vorher eine Ersetzung stattfindet. Was kann ich da machen?

Mein Modul:

Name: Sourcecode

Eingabe:

Code: Alles auswählen

Code: <select name="VALUE[2]" >
<?php
foreach (array("ada", "asm", "c", "cpp","csharp", "css", "html4strict", "java", "matlab", "php", "xml") as $value)
{
  echo '<option value="'.$value.'" ';

  if ("REX_VALUE[2]"=="$value")
    echo 'selected="selected" ';

  echo '>'.$value.'</option>';
}
?>
</select>
<br />
<textarea name="VALUE[1]" rows="17" cols="80">REX_VALUE[1]</textarea>
Ausgabe:

Code: Alles auswählen

<?
include_once('include/geshi.php');
$geshi =& new GeSHi('REX_VALUE[1]', 'REX_VALUE[2]');
echo $geshi->parse_code();
?>

Zuletzt geändert von Walli am 11. Nov 2005, 20:14, insgesamt 3-mal geändert.

make
Beiträge: 3
Registriert: 4. Nov 2005, 16:15

11. Nov 2005, 15:40

Hi Walli

da sich sonst noch niemand versucht hat…

An einer anderen Stelle konnte ich mir damit behelfen:

Code: Alles auswählen

$Output = html_entity_decode("REX_VALUE[1]");

Ob das was für dich ist kann ich nicht genau sagen, versuch's halt mal.

Gruß
Zuletzt geändert von make am 11. Nov 2005, 16:05, insgesamt 1-mal geändert.
_/_/_/ make _/_/_/

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

11. Nov 2005, 15:46

Hi,

anstatt REX_VALUE[x] versuche REX_HTML_VALUE[x]

Gruß,
Markus

Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

11. Nov 2005, 18:15

Fantastisch, danke! Jetzt habe ich den ultimativen Sourcecode-Highlighter :D !

Benutzeravatar
Jan.Kristinus
Admin
Beiträge: 2166
Registriert: 24. Aug 2004, 22:11
Wohnort: Frankfurt
Kontaktdaten: ICQ Website

11. Nov 2005, 18:22

hi,

dann mit erklaerung ab damit in den modulbereich.. :)

lg

jan
Yakamara Media GmbH & Co. KG | Kaiserstrasse 69 | 60329 Frankfurt
Tel.: 069-900.20.60.30
http://www.yakamara.de/

Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

11. Nov 2005, 18:44

[x] done :wink:

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

11. Nov 2005, 18:52

Hi
Walli hat geschrieben:[x] done :wink:
http://www.redaxo.de/165-Moduldetails.html?module_id=49

ich vermute, dass du den Fehler von oben mit übernommen hast oder?

Gruß,
Markus

Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

11. Nov 2005, 18:57

kills hat geschrieben:ich vermute, dass du den Fehler von oben mit übernommen hast oder?
Ach Mist, hab vergessen das hier auch zu ändern! Ist geändert. Habs diesmal direkt aus meinem redaxo rauskopiert. Sorry.

Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

11. Nov 2005, 19:16

Einen Haken hat die Sache noch. Dadurch, dass REX_HTML_VALUE im Code eingefügt wird habe ich natürlich ein Problem wenn im eingegebenen Code Backslashes auftauchen. Das Problem tritt aber auch bei anderen Modulen wie z.B. Headline auf. Gibt es da bereits eine funktionierende Lösung?

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

11. Nov 2005, 19:50

Hi,

ich schau mal rein, ob das ein Problem ist, oder ob das an deiner Umgebung oder ähnliches liegt.

Notfalls mit stripslashes arbeiten.

Ausserdem vermute ich, dass es zu problemen kommt, wenn der eingegebene Text ' oder " enthält... besser die Werte so abfragen:

Code: Alles auswählen

$value1 =<<< EOD
REX_HTML_VALUE[1]
EOD;

$value2 =<<< EOD
REX_VALUE[2]
EOD;
Gruß,
Markus

Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

11. Nov 2005, 20:14

Ich habs mal so gemacht, aber das gibt mir einen Fehler.

Code: Alles auswählen

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

$value1 =<<< EOD
REX_HTML_VALUE[1]
EOD;

$value2 =<<< EOD
REX_VALUE[2]
EOD; 

$geshi =& new GeSHi($value1, $value2);
echo $geshi->parse_code();
?> 
Parse error: parse error, unexpected $ in /.../cms/redaxo/include/classes/class.article.inc.php(353) : eval()'d code on line 106

Benutzeravatar
Koala
Beiträge: 1612
Registriert: 3. Okt 2005, 13:20

11. Nov 2005, 22:21

Walli hat geschrieben:
Parse error: parse error, unexpected $ in /.../cms/redaxo/include/classes/class.article.inc.php(353) : eval()'d code on line 106
Vieleicht ist das dein Problem:
http://www.php.net/manual/en/language.t ... ax.heredoc

Und da dann der Kasten "Warning".
<?php print $Footer; ?>

Sven

Ich würde ja die Welt verändern,
doch der Quellcode ist mir zu absurd!


REX 5 :: Tricks und Tipps
REX 5 :: Modulesammlung

Wiki zu Redaxo 3 und 4 (!nur noch im Webarchiv!)

Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

11. Nov 2005, 22:40

Danke, mein Problem war, dass es EOT heißen muss, nicht EOD. Kannte diese Syntax nicht, deswegen habe ich da mal blind vertraut ;) . Jetzt läuft es wie gewüscht.

Habs in der Moduldatenbank auch korrigiert.

Benutzeravatar
Koala
Beiträge: 1612
Registriert: 3. Okt 2005, 13:20

11. Nov 2005, 22:59

Walli hat geschrieben:Danke, mein Problem war, dass es EOT heißen muss, nicht EOD.
Du kannst da auch <<<FOOBAR hinschreiben. Was da als Bezeichner steht spielt keine Rolle. Wichtig sind die Bedingungen zum beenden der heredoc-Syntax. Das steht alles im PHP-Manual im Warning-Kästchen! Vieleicht hatte sich da bei dir ein Leerzeichen oder so etwas eingeschlichen.
Beachte auch die Userkommentare auf der genannten Manual-Seite.
<?php print $Footer; ?>

Sven

Ich würde ja die Welt verändern,
doch der Quellcode ist mir zu absurd!


REX 5 :: Tricks und Tipps
REX 5 :: Modulesammlung

Wiki zu Redaxo 3 und 4 (!nur noch im Webarchiv!)

Walli
Beiträge: 9
Registriert: 8. Nov 2005, 13:01
Kontaktdaten: Website

11. Nov 2005, 23:09

Danke für den Hinweis. Irgendwie ist PHP nicht ganz meine Sprache ;) .

jaehnem
Beiträge: 51
Registriert: 24. Aug 2004, 22:11

29. Nov 2005, 19:10

Hallo,

ich finde die Lösung mit dem Source-Code anzeigen recht intressant.

Nur leider bekomme ich das nicht zum laufen.

Modul Eingabe

Code: Alles auswählen

Code: <select name="VALUE[2]" >
<?php
foreach (array("ada", "asm", "c", "cpp","csharp", "css", "html4strict", "java", "matlab", "php", "xml") as $value)
{
  echo '<option value="'.$value.'" ';

  if ("REX_VALUE[2]"=="$value")
    echo 'selected="selected" ';

  echo '>'.$value.'</option>';
}
?>
</select>
<br />
<textarea name="VALUE[1]" rows="17" cols="80">REX_VALUE[1]</textarea>
Modul-Ausgabe:

Code: Alles auswählen

<?php
include_once($REX[INCLUDE_PATH].'/addons/source_view/src/geshi/geshi.php');

//include_once('include/geshi.php');

$value1=<<<EOT
REX_HTML_VALUE[1]
EOT;

$value2="REX_VALUE[2]";

$geshi =& new GeSHi($value1, $value2);
echo $geshi->parse_code();
?>
Wenn ich nun

Code: Alles auswählen

<?php

$admin="test";

?>
eingebe und dabei auf PHP stelle zeigts mir nur

Code: Alles auswählen

<?php
 
="test";
 
?>
an.

Habe ich irgendwas übersehen???

Sobald ich versuche etwas komplexeren Code einzugeben gehts gar nicht mehr.

Kann mir bitte einer helfen?

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

29. Nov 2005, 20:16

Hej,

hast du die Beschreibung beachtet?

vg Thomas

jaehnem
Beiträge: 51
Registriert: 24. Aug 2004, 22:11

29. Nov 2005, 21:22

tbaddade hat geschrieben:Hej,

hast du die Beschreibung beachtet?

vg Thomas
Beschreibung hat geschrieben: Dieses Modul macht es möglich eingefärbte Quellcodes mit Hilfe von GeSHi (http://qbnz.com/highlighter/, GPL) in die eigenen Seiten einzubinden. Die Liste mit den verfügbaren Sprachen kann nach Belieben erweitert werden. Auch der Pfad in dem GeSHi liegt muss evtl. angepasst werden.
Also den Pfad hab ich angepasst. Aber das wirst du nicht meinen...... was meinst du bitte?

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

29. Nov 2005, 21:31

Hi
jaehnem hat geschrieben:Also den Pfad hab ich angepasst. Aber das wirst du nicht meinen...... was meinst du bitte?
Du hast den "GeShi" von der Seite heruntergeladen und eingebunden?

Gruß,
Markus

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

29. Nov 2005, 21:46

Hej,
jaehnem hat geschrieben: Also den Pfad hab ich angepasst. Aber das wirst du nicht meinen...... was meinst du bitte?
kills hat geschrieben:Du hast den "GeShi" von der Seite heruntergeladen und eingebunden?
Genau das meinte ich.

vg Thomas

jaehnem
Beiträge: 51
Registriert: 24. Aug 2004, 22:11

29. Nov 2005, 21:46

ja hab ich (GeSHi 1.0.7.5 Released)

am include von GeSHI liegts auch nicht. Irgendwie kommt in die Variablen blödsinn.

Kann mann im Modul irgendwie rausfinden welcher Slice_id es ist (in der Anzeige)?

jaehnem
Beiträge: 51
Registriert: 24. Aug 2004, 22:11

29. Nov 2005, 21:54

Hab nun nochmal mein Modul zum testen umgebaut.

Code: Alles auswählen

<?php
include_once($REX[INCLUDE_PATH]."/addons/source_view/src/geshi/geshi.php");

$value1="<?php\n$admin=\"test\";\n?>";

$value2="php";

$geshi =& new GeSHi($value1, $value2);
echo $geshi->parse_code();
?>
Ergebnis im Quellcode

Code: Alles auswählen

<pre class="php"><span style="color: #000000; font-weight: bold;"><?php</span>
=<span style="color: #ff0000;">"test"</span>;
<span style="color: #000000; font-weight: bold;">?></span></pre>
Also in der ausgabe fehlt irgendwie das "$admin"

------- EDIT -----

Ich glaube das hat mit dem PHP zu tun das der VariablenNamen sofort interpretiert. Gibts da nen PHP-Parameter der das abschaltet? Oder kann ich irgendwie ne Variable mit dem Quelltext direkt aus der DB erhalten?

mefiX
Beiträge: 7
Registriert: 12. Jan 2007, 11:29

6. Jan 2009, 23:53

Hi,

kleine Modifikation meinerseits, vielleicht hat jemand Interesse:

- etwas konformere Pfade
- Autom. Auslesen aller unterstützter Sprachen für das Dropdown
- Ich hatte in trotzdem noch "&gt", etc. falls sie innerhalb eines Strings auftauchen, dafür ein htmlspecialchars_decode(), um diese aus dem REX_HTML_VALUE komplett zu entfernen

Moduleingabe:

Code: Alles auswählen

<?php
$languages = array("ada", "asm", "c", "cpp","csharp", "css", "html4strict", "java", "matlab", "php", "xml");

if ($handle = opendir($REX['INCLUDE_PATH'] . '/geshi/geshi')) {
	$languages = array();
	while (false !== ($file = readdir($handle))) {
		if ($file != "." && $file != "..")
			$languages[] = basename($file, ".php");
	}
	sort($languages);
}
?>
Code: <select name="VALUE[2]" >
<?php
foreach ($languages as $value)
{
	echo '<option value="'.$value.'" ';
	if ("REX_VALUE[2]" == "$value")
		echo 'selected="selected" ';
	echo '>'.$value.'</option>';
}
?>
</select>
<br />
<textarea name="VALUE[1]" rows="17" cols="80">REX_VALUE[1]</textarea>
Modulausgabe:

Code: Alles auswählen

<?
include_once($REX['INCLUDE_PATH'] . '/geshi/geshi.php');

$value1 =<<< EOT
REX_HTML_VALUE[1]
EOT;
$value1 = htmlspecialchars_decode($value1, ENT_NOQUOTES);

$value2 =<<< EOT
REX_VALUE[2]
EOT;

$geshi =& new GeSHi($value1, $value2);
echo $geshi->parse_code();
?>

mefiX
Beiträge: 7
Registriert: 12. Jan 2007, 11:29

19. Feb 2009, 17:34

Hallo,

leider kann man auf diese Weise jegliche Programmiersprachen, die ein '$' für Variablen verwenden (also u.A. PHP) nicht korrekt hervorheben, weil die Variablen innerhlab des Codes während dem Einlesen interpretiert werden. Die meisten Variablen haben in diesem Kontext dann (noch) keine Bedeutung, also keinen Wert und fallen dann einfach aus dem Text raus.

Wer PHP Version 5.3 hat, kann sich glücklich schätzen, denn hier ist folgendes Konstrukt erlaubt:

Code: Alles auswählen

$value1 =<<<'EOT'
REX_HTML_VALUE[1]
EOT; 
Namentlich handelt es sich dabei um "Nowdoc", zu erkennen an den single-quotes um EOT (die Technik ohne quotes bezeichnet man allgemein als Heredoc). Dabei werden alle im Text enthaltenen Variablen nicht interpretiert!

An einer Lösung für Leute ohne PHP 5.3 wäre ich interessiert und äußerst dankbar.

Gruss,
mefiX

mefiX
Beiträge: 7
Registriert: 12. Jan 2007, 11:29

19. Feb 2009, 22:34

Nochmal Hi ;)

muss mich selbst korrigieren, es geht auch ohne Now-Code und PHP 5.3.
Man kann den REX_VALUE[..] auch diret in ticks (') stellen, dann werden Variablen nicht interpretiert, also z.B. so.

Code: Alles auswählen

$foo = str_replace("<br />", "", 'REX_VALUE[1]');
Allerdings muss der String dabei an eine Funktion übergeben werden, eine direkte Zuweisen des Strings an einen Variable schlägt fehl:

Code: Alles auswählen

$foo = 'REX_VALUE[1]';
klappt nicht.

Ich habe ein erweitertes Modul für das Textile-Addon geschrieben, in dem man durch Angabe von

Code: Alles auswählen

@@(language)Code@@
"beautified" Code einfügen kann, der vom geshi-highlighter mit der angegebenen Sprache geparst wird.

Moduleingabe (light):

Code: Alles auswählen

<strong>Text</strong>:<br />
<textarea name="VALUE[1]" cols="80" rows="30" class="inp100" style="font-family: courier new; font-size: 11pt;">REX_HTML_VALUE[1]</textarea>
<br /><br />
<?php rex_a79_help_overview(); ?>
Modulausgabe:

Code: Alles auswählen

<?php

if(OOAddon::isAvailable("textile")) {
	if(REX_IS_VALUE[1]) {

		$textile = htmlspecialchars('REX_VALUE[1]', ENT_NOQUOTES);
		$foo = str_replace("<br />", "", 'REX_VALUE[1]');
		$foo = htmlspecialchars_decode($foo, ENT_QUOTES); //<-

		// Replace extended beautified code before textile gets it...
		$pattern = '#@@\(([^\)]+)\)(.*?)@@#s';
		$found = preg_match_all($pattern, $foo, $subpattern, PREG_SET_ORDER);
		if ($found) {
			for ($i=0; $i<$found; $i++) {
				$code = $subpattern[$i][2];
				$class = $subpattern[$i][1];
				$geshi =& new GeSHi($code, $class);
				$parsed_code = $geshi->parse_code();
				$foo = preg_replace($pattern, $parsed_code, $foo, 1);
			}
		}
		echo rex_a79_textile($foo);
	}
} else {
	echo rex_warning('Dieses Modul ben&ouml;tigt das "textile" Addon!');
}

?>
Interessant ist noch: Wenn man folgende Zeile weg lässt, funktioniert es nicht mehr, obwohl die Zeile total überflüssig ist, hier freue ich mich über eine Erklärung ...

Code: Alles auswählen

$textile = htmlspecialchars('REX_VALUE[1]', ENT_NOQUOTES); 

Zurück zu „Allgemeines [R3]“