Deprecated: Assigning the return value of new by reference is deprecated in /www/htdocs/w00ab105/wp-settings.php on line 512

Deprecated: Assigning the return value of new by reference is deprecated in /www/htdocs/w00ab105/wp-settings.php on line 527

Deprecated: Assigning the return value of new by reference is deprecated in /www/htdocs/w00ab105/wp-settings.php on line 534

Deprecated: Assigning the return value of new by reference is deprecated in /www/htdocs/w00ab105/wp-settings.php on line 570

Strict Standards: Declaration of Walker_Page::start_lvl() should be compatible with Walker::start_lvl(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_Page::end_lvl() should be compatible with Walker::end_lvl(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_Page::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_Page::end_el() should be compatible with Walker::end_el(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1199

Strict Standards: Declaration of Walker_PageDropdown::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1244

Strict Standards: Declaration of Walker_Category::start_lvl() should be compatible with Walker::start_lvl(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1394

Strict Standards: Declaration of Walker_Category::end_lvl() should be compatible with Walker::end_lvl(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1394

Strict Standards: Declaration of Walker_Category::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1394

Strict Standards: Declaration of Walker_Category::end_el() should be compatible with Walker::end_el(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1394

Strict Standards: Declaration of Walker_CategoryDropdown::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/w00ab105/wp-includes/classes.php on line 1445

Strict Standards: Redefining already defined constructor for class wpdb in /www/htdocs/w00ab105/wp-includes/wp-db.php on line 306

Deprecated: Assigning the return value of new by reference is deprecated in /www/htdocs/w00ab105/wp-includes/cache.php on line 103

Strict Standards: Redefining already defined constructor for class WP_Object_Cache in /www/htdocs/w00ab105/wp-includes/cache.php on line 431

Deprecated: Assigning the return value of new by reference is deprecated in /www/htdocs/w00ab105/wp-includes/query.php on line 61

Deprecated: Assigning the return value of new by reference is deprecated in /www/htdocs/w00ab105/wp-includes/theme.php on line 1109

Strict Standards: Declaration of Walker_Comment::start_lvl() should be compatible with Walker::start_lvl(&$output) in /www/htdocs/w00ab105/wp-includes/comment-template.php on line 1266

Strict Standards: Declaration of Walker_Comment::end_lvl() should be compatible with Walker::end_lvl(&$output) in /www/htdocs/w00ab105/wp-includes/comment-template.php on line 1266

Strict Standards: Declaration of Walker_Comment::start_el() should be compatible with Walker::start_el(&$output) in /www/htdocs/w00ab105/wp-includes/comment-template.php on line 1266

Strict Standards: Declaration of Walker_Comment::end_el() should be compatible with Walker::end_el(&$output) in /www/htdocs/w00ab105/wp-includes/comment-template.php on line 1266

Strict Standards: Redefining already defined constructor for class WP_Dependencies in /www/htdocs/w00ab105/wp-includes/class.wp-dependencies.php on line 31

Strict Standards: Redefining already defined constructor for class WP_Http in /www/htdocs/w00ab105/wp-includes/http.php on line 61
blog.murb.com » Source Code in WordPress: C#, XAML, Java
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1002

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1003

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1002

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1003

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1002

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1003

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1002

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /www/htdocs/w00ab105/wp-includes/kses.php on line 1003

Source Code in WordPress: C#, XAML, Java

04.12.2008 von Richard

Endlich hat man es geschafft, den Blog zum Laufen zu bringen, schon steht man vor dem nächsten Problem: Wie bekomme ich eine anständige Codeumgebung mit sprachenspezifischem Syntax-Highlighting in einen Artikel?
Da ich es auf vielen Blogs bereits gesehen hatte, nahm ich an, es sei standardmäßig in WordPress integriert. Dem ist leider nicht so.

Es ist also mal wieder Tüfteln angesagt. Mittels zusätzlicher Programme und Plugins habe ich mir meine eigenen angepassten Umgebungen gebastelt.

Da ich mich in letzter Zeit viel mit der Programmierung und Gestaltung von WPF-Anwendungen beschäftigt habe, gilt mein Interesse v.a. dem C# sowie XAML Source Code.

Für den C# Source Code bietet sich ein Plugin für Visual Studio 2008 an: CopySourceAsHtml
Das Plugin einfach installieren, Visual Studio starten und schon steht einem der Export in HTML per Mausklick zur Verfügung. Gewünschten Code markieren, Rechtsklick und “Copy As HTML…” wählen.

 

Das Ergebnis kann sich sehen lassen (C#-Code Beispiel):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void HandleRequestNavigate(object sender, RoutedEventArgs e)
{
    try
    {
        string navigateUri = "about:blank";
        if (sender.Equals(this.email))
        {
            navigateUri = email.NavigateUri.ToString();
        }
        else
        {
            navigateUri = website.NavigateUri.ToString();
        }
 
        // if the URI somehow came from an untrusted source, make sure to
        // validate it before calling Process.Start(), e.g. check to see
        // the scheme is HTTP, etc.
        Process.Start(new ProcessStartInfo(navigateUri));
        e.Handled = true;
    }
    catch (Exception urlError)
    {
        Functions.logError(urlError.ToString());
    }
}

Die richtige Kolorierung und Formatierung des Codes hat das Plugin übernommen. Jedoch fehlte dem Ganzen eine Umgebung, die den Code vom restlichen Text hervorhebt. Hierfür habe ich mir selbst eine Box gebaut, in der ich den konvertieren Code hineinkopiere.
Aber Achtung: Würde man den Output von CopySourceAsHtml direkt verwenden, so würde man beim Kopieren aus dem Artikel erstens die Zeilennummern mitkopieren und zudem zwischen jeder Zeile eine Leerzeile haben. Dies musste ich ebenfalls per Hand anpassen: Zeilennummern in eine extra Spalte packen und pre-Tags entfernen.

Kommen wir nun zu XAML. Hier arbeite ich normalerweise mit Expression Blend und hatte mir natürlich auch ein solches Plugin wie für Visual Studio gewünscht. Leider konnte ich auf die Schnelle nichts finden und musste mich mit einem zusätzlichen Programm begnügen: CarlosAg.CodeColorizer
Nachdem man den Codeausschnitt eingefügt und als Sprache “Markup Code” ausgewählt hat, spuckt einem das Programm mit “Colorize” das Ergebnis aus.
Noch ein paar kleine Anpassungen der Ausgabe (Anführungszeichen anpassen) und schon kann ich es problemlos in meiner zuvor gebastelten Box einfügen. Et voilà, c’est ça:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21

<Grid x:Name="LayoutRoot">
    
<TextBlock x:Name="attentionHeader"
        Margin
="60,10,8,41" TextWrapping="Wrap"
        HorizontalAlignment
="Left" Foreground="#FF3B5A82"
        VerticalAlignment
="Top" Text="Hinweis" FontWeight="Bold"/>
 
    <
TextBlock x:Name="attentionText"
      Margin
="60,28,0,35" TextWrapping="Wrap"
        HorizontalAlignment
="Left" Foreground="#FF3B5A82" Width="276"
        Text
="Es wurden keine Zeichen gewählt. Bitte eine Auswahl treffen!"/>
 
    <
Button Click="closeMsgBox"
        Margin
="0,0,0,8" Content="Alles klar!"
        HorizontalAlignment
="Center" VerticalAlignment="Bottom"
        Height
="21" Width="80"/>
 
    <
Image HorizontalAlignment="Left"
        Margin
="5,5,0,0" Width="48"
        Source
="..\Images\warning.gif" Stretch="Fill"
        VerticalAlignment
="Top" Height="48"/>
</
Grid>

Nachdem das Bisherige so gut funktioniert hatte, dachte ich mir, wie wäre es mit ein wenig Java Code zum Abschluss. Zum Programmieren mit Java bin ich die Entwicklungsumgebung Eclipse gewohnt, für die es unzählige Plugins gibt. Als ich allerdings nach wenigen Minuten über ein entsprechendes Programm, genannt Java2Html Converter gestolpert bin, habe ich die Suche nach einem Plugin vorerst eingestellt.

Der Output des Programms liefert mir genau das, was ich haben wollte - zumindest auf den ersten Blick. Ganz so einfach war es dann leider doch nicht, da mir der FireFox einen Strich durch die Rechnung machte: Die Höhe von Zeilen mit fett gedruckten Wörtern wich bei Schriftgröße 12px von denen ohne fett gedruckter Wörter ab. Die Lösung war eine schrittweise Vergrößerung der Schrift. Mit 12.5px fand ich schließlich ein passendes Maß.
Damit war es leider noch immer nicht getan. So besitzt der FF im Gegensatz zum IE bei der Schriftart “Courier New” einen höheren (horizontalen) Zeichenabstand. Dies lies sich mit CSS leider nicht korrigieren (wenn doch, bitte melden!). Wie im folgenden Codeausschnitt zu sehen, musste ich die erste Zeile umbrechen, da sie im FF nicht in eine Zeile passen würde. Im IE dagegen schon.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public static String replace(String source, String pattern,
        String replace) {

    if (source != null) {
        final int len = pattern.length();
        StringBuffer sb = new StringBuffer();
        int found = -1;
        int start = 0;

        while((found = source.indexOf(pattern, start)) != -1) {
            sb.append(source.substring(start, found));
            sb.append(replace);
            start = found + len;
        }

        sb.append(source.substring(start));

        return sb.toString();
    }
    else return "";
}

Das war’s soweit. Vielleicht nehme ich mir noch weitere Sprachen vor… naja, spätestens dann, wenn ich sie hier brauche. ;-)
Für die Automatisierung der Ergebnislieferung der oben aufgeführten Sprachen, wie ich es möchte, liese sich bestimmt ein kleines Tool schreiben. Mal sehen…

Geschrieben in Allgemeines |

Kommentare sind geschlossen.