Um den Code hübsch auf der Homepage präsentieren zu können, verwende ich auf dieser Seite das geshi plugin für Joomla welches bei der Grundinstallation auch gleich dabei war. Es hat mich leider nur ein wenig gestört, dass der Editor für die Eingabe der Inhalte leider nicht mit dem manuellen Eingabe für html zurecht kommt. Aus diesem Grund habe ich das geshi plugin etwas umgeschrieben um weiterhin den Editor für die Eingabe zu verwenden.
Bei meiner Lösung muss nur noch der { geshi xml:lang="php"}//Test{/geshi} (jedoch ohne das Leerzeichen nach der ersten geschweiften klammer) eingegeben werden um den php Code richtig zu formatieren. 
Als erstes habe ich die Zeile
if ( JString::strpos( $row->text, 'pre>' ) === false ) { mit dieser hier ersetzt
if ( JString::strpos( $row->text, 'geshi}' ) === false ) { Somit beendet die Funktion sich schon früher wenn kein geshi} im Text vorkommt. Danach musste noch der Regex-Interpreter angepasst werden. Dazu habe ich diese Zeile
$regex = "#
<pre xml:\s*(.*?)="xml:s*(.*?)">(.*?)</pre>
#s"; mit dieser ersetzt:
$regex = "#{ geshi xml:\s*(.*?)}(.*?){/ geshi}#s";
Zusätzlich wollte ich gerne bei größeren Sourcecode nur noch eine Datei übergeben die das Plugin dann selbstständig einließt und ausgeben soll. Dafür musst ich dem Plugin nur noch das kommando "file" beibringen was ich durch die folgende Zeile erreicht habe:
$file = JArrayHelper::getValue( $args, 'file', 'false' ); Nun kann das Plugin auch mit dem file Argument etwas anfangen und der folgende Code ließt die Datei aus:
// Read the file
if ($file !== "false")
{
// Check if exists
if (file_exists("./images/code/".$file) === false)
return "File $file not exists!";
$text .= file_get_contents("./images/code/".$file);
} Die Datei die ausgelesen werden soll muss in dem Ordner "/images/code/" vorhanden sein. Ich habe diesen Ordner gewählt um die Dateien auch über das Joomla Backend zu laden und nicht immer das ftp-Programm starten zu müssen.
Und hier nochmal der gesamte Code:
<?php
/**
* @version $Id: geshi.php 10381 2008-06-01 03:35:53Z pasamio $
* @package Joomla
* @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
$mainframe->registerEvent( 'onPrepareContent', 'plgContentGeshi' );
/**
* Code Highlighting Plugin
*
* Replaces {geshi}...{/geshi} tags with highlighted text
*/
function plgContentGeshi( &$row, &$params, $page=0 )
{
// simple performance check to determine whether bot should process further
// if ( JString::strpos( $row->text, 'pre>' ) === false ) {
if ( JString::strpos( $row->text, 'geshi}' ) === false ) {
return true;
}
// Get Plugin info
$plugin =& JPluginHelper::getPlugin('content', 'geshi');
// define the regular expression for the bot
// $regex = "#<pre xml:\s*(.*?)>(.*?)</pre>#s";
$regex = "#{geshi xml:\s*(.*?)}(.*?){/geshi}#s";
$GLOBALS['_MAMBOT_GESHI_PARAMS'] =& $params;
// perform the replacement
$row->text = preg_replace_callback( $regex, 'plgContentGeshi_replacer', $row->text );
return true;
}
/**
* Replaces the matched tags an image
* @param array An array of matches (see preg_match_all)
* @return string
*/
function plgContentGeshi_replacer( &$matches )
{
$params =& $GLOBALS['_MAMBOT_GESHI_PARAMS'];
jimport('geshi.geshi');
jimport('domit.xml_saxy_shared');
$args = SAXY_Parser_Base::parseAttributes( $matches[1] );
$text = $matches[2];
$lang = JArrayHelper::getValue( $args, 'lang', 'php' );
$lines = JArrayHelper::getValue( $args, 'lines', 'false' );
$file = JArrayHelper::getValue( $args, 'file', 'false' );
// Read the file
if ($file !== "false")
{
// Check if exists
if (file_exists("./images/code/".$file) === false)
return "File $file not exists!";
$text .= file_get_contents("./images/code/".$file);
}
$html_entities_match = array( "|\<br \/\>|", "#<#", "#>#", "|'|", '#"#', '# #' );
$html_entities_replace = array( "\n", '<', '>', "'", '"', ' ' );
$text = preg_replace( $html_entities_match, $html_entities_replace, $text );
$text = str_replace('<', '<', $text);
$text = str_replace('>', '>', $text);
/*
// Replace 2 spaces with " " so non-tabbed code indents without making huge long lines.
$text = str_replace(" ", " ", $text);
// now Replace 2 spaces with " " to catch odd #s of spaces.
$text = str_replace(" ", " ", $text);
*/
// Replace tabs with " " so tabbed code indents sorta right without making huge long lines.
//$text = str_replace("\t", " ", $text);
$text = str_replace( "\t", ' ', $text );
$geshi = new GeSHi( $text, $lang );
if ($lines == 'true') {
$geshi->enable_line_numbers( GESHI_NORMAL_LINE_NUMBERS );
}
$text = $geshi->parse_code();
return $text;
}
|
Kommentare
Nur hat sich bei Dir ein Flüchtigkeits-Fehler eingeschlichen.
{ geshi xml:lang="php"}//Test{/geshi}
Dein Script erfordert aber:
{ geshi xml:php}//Test{/geschi}
Man beachte die Schreibweise des schließenden Tags.
da hast du recht. zitiere Harald:
Hab den Fehler in meinem Script schon behoben nur auf der Seite ist mir das nicht aufgefallen.
Vielen Dank für den Hinweis. Hab das auf der Website nun auch richtig geändert.