Das Doena Journal | Tagebuch eines TV-Junkies

Apr/10

20

C# CodeDom Inline Compiling


Mir war grad etwas langweilig, und da der WYSIWYG-Editor von Wordpress 2.9.2 nicht ganz so optimal funktioniert, wie ich mir das wünschen würde, habe ich beschlossen, die Umsetzung von Forenbeiträgen mit BB-Code auf HTML lieber selbst in ein Programm zu gießen.

Natürlich könnte ich die ganzen Ersetzungsfunktionen alle in Code gießen, aber dann müsste ich ja jedesmal den Code anpassen, wenn ich mal ein neues Tag finde.

Also habe ich gedacht, es wäre mal an der Zeit, etwas mit dem Inline-Compiler von C# rumzuspielen. Und wenn man es richtig macht, ist es sogar relativ einfach.

Hier mal mein erstes Inline Compiling Code Snippet (da ist noch keine Fehlerbehandlung und nichts drin, aber man bekommt eine Idee, wie es funktioniert):

using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Xml.Serialization;
using System.IO;
using System.Text;

namespace DoenaSoft.InlineCompiling
{
  public static class Program
  {
    static void Main()
    {
      ParamList pl;

      //to create a sample XML file:
      pl = new ParamList();
      pl.Params = new Param[1];
      pl.Params[0] = new Param();
      pl.Params[0].Name = "Kursiver Text";
      pl.Params[0].Regex
        = "\\\\[i\\\\](?'Text'.+?)\\\\[/i\\\\]";
      pl.Params[0].RegexOptions = "RegexOptions.Compiled"
        + "| RegexOptions.Singleline "
        + "| RegexOptions.IgnoreCase";
      pl.Params[0].Code = "\"\""
        + " + match.Groups[\"Text\"].Value + \"\"";
      using(FileStream fs = new FileStream("params.xml"
        , FileMode.Create, FileAccess.Write
        , FileShare.None))
      {
        XmlSerializer xmls
          = new XmlSerializer(typeof(ParamList));

        xmls.Serialize(fs, pl);
      }
      //end creating sample XML file

      using(FileStream fs = new FileStream("params.xml"
        , FileMode.Open, FileAccess.Read
        , FileShare.Read))
      {
        XmlSerializer xmls
          = new XmlSerializer(typeof(ParamList));

        pl = (ParamList)(xmls.Deserialize(fs));
      }

      String text = "[i]some text[/i]";

      foreach(Param param in pl.Params)
      {
        CSharpCodeProvider scp;
        CompilerParameters cp;
        CompilerResults cr;
        Object replacer;
        StringBuilder sb;

        sb =  new StringBuilder();
        sb.AppendLine("using System;");
        sb.AppendLine("using System.Text."
          + "RegularExpressions;");
        sb.AppendLine();
        sb.AppendLine("public class RegexReplacer");
        sb.AppendLine("{");
        sb.AppendLine("  private static readonly Regex "
          + "s_Regex = new Regex(\"" + param.Regex
          + "\", " + param.RegexOptions + ");");
        sb.AppendLine();
        sb.AppendLine("  private String Replace(Match "
          + "match)");
        sb.AppendLine("  {");
        sb.AppendLine("    return (" + param.Code
          + ");");
        sb.AppendLine("  }");
        sb.AppendLine();
        sb.AppendLine("  public String Replace(String "
          + "text)");
        sb.AppendLine("  {");
        sb.AppendLine("    return (s_Regex.Replace(text"
          + ", new MatchEvaluator(this.Replace)));");
        sb.AppendLine("  }");
        sb.AppendLine("}");

        scp = new CSharpCodeProvider();
        cp = new CompilerParameters();
        cp.ReferencedAssemblies.Add("System.dll");
        cr = scp.CompileAssemblyFromSource(cp
          , sb.ToString());
        replacer = cr.CompiledAssembly
          .CreateInstance("RegexReplacer");
        text = replacer.GetType().GetMethod("Replace")
          .Invoke(replacer, new Object[] { text })
          .ToString();
      }
    }
  }

  [Serializable()]
  public class ParamList
  {
    [XmlArrayItem("Param")]
    public Param[] Params;
  }

  [Serializable()]
  public class Param
  {
    public String Name;
    public String Regex;
    public String RegexOptions;
    public String Code;
  }
}

Verwandte Postings:

Keine verwandten Postings.

Diesen Beitrag drucken Diesen Beitrag drucken

Kategorien: Software, Vermischtes
Tags: No tags

Bisher keine Kommentare.

Einen Kommentar hinterlassen

<<

>>

Theme Design by devolux.nh2.me
modified by DJ Doena

Valentinstag (20.05.12) Freunde mit gewissen Vorzügen (20.05.12) Alarmstufe: Rot (19.05.12) Superman: Doomsday (19.05.12) Lethal Weapon: Zwei stahlharte Profis (04.05.12) Burn Notice: Season 3: Disc 3 (01.05.12) Captain America: The First Avenger (29.04.12) HOP (29.04.12) Independence Day (28.04.12) Transformers (28.04.12) Der unglaubliche Hulk (27.04.12) Türkisch für Anfänger: Season 3: Disc 3 (22.04.12) Türkisch für Anfänger: Season 3: Disc 2 (22.04.12) Sweet Home Alabama: Liebe auf Umwegen (22.04.12) Zuletzt angesehen
Smallville: Season 4 Transformers 3 Tango & Cash The Specialist Lethal Weapon 1 - 4 Kunsträuber küsst man nicht From Dusk Till Dawn Valentinstag Thor Supernatural: Season 6 Suits: Season 1 Sherlock: Season 2 Gossip Girl: Season 4 Freunde mit gewissen Vorzügen Zuletzt angesehen