2010-12-12 23 views
23

C#でMVC用にかなりの量のASPXファイルとASCXファイルが作成されており、新しいRazor構文に変換したいと思います。Aspx to Razorシンタックスコンバータ?

この記事では、この仕事をより速くするユーティリティについて知っていますか?

答えて

26

私は変換を行う小さなコードを書いています。私はそれが他の人には役に立つかもしれないと思う。私は正規表現のbalancing goup definitionsについて多くのことを学びました。

public static class RazorConversor 
{ 
    public static void ConvertAll(string directory) 
    { 
     string[] array = Directory.GetFiles(directory, "*.aspx", SearchOption.AllDirectories).Concat(
         Directory.GetFiles(directory, "*.ascx", SearchOption.AllDirectories)).ToArray(); 

     foreach (var fileName in array) 
     { 
      string aspxCode = File.ReadAllText(fileName); 
      string razorCode = ConvertToRazor(aspxCode); 
      File.WriteAllText(fileName, razorCode); //rename manually to update .csproj & source control 
     } 
    } 

    static readonly string[] DefaultNamespaces = new string[] 
    { 
     "System.Web.Helpers", 
     "System.Web.Mvc", 
     "System.Web.Mvc.Ajax", 
     "System.Web.Mvc.Html", 
     "System.Web.Routing", 
     "System.Web.WebPages", 
    }; 

    public static string ConvertToRazor(string aspxCode) 
    { 
     return ConvertToRazor(aspxCode, DefaultNamespaces); 
    } 

    public static string ConvertToRazor(string aspxCode, string[] defaultNamespaces) 
    { 
     //namespaces 
     string text2 = Regex.Replace(aspxCode, @"<%@\s+Import Namespace=""(?<ns>.*?)""\s+%>", 
      m => defaultNamespaces.Contains(m.Groups["ns"].Value) ? null : "@using " + m.Groups["ns"].Value); 

     //headers 
     string text3 = Regex.Replace(text2, @"<%@\s(?<dir>.*?)%>", m => "@{ " + m.Groups["dir"].Value + "}"); // Preserves headers 

     //expressions 
     string text4 = Regex.Replace(text3, @"<%[=:](?<expr>.*?)%>", m => 
     { 
      string expr = m.Groups["expr"].Value.Trim(); 
      string cleanExpr = Regex.Replace(expr, @"(""(\\""|[^""])*"")|(@""([^""]|"""")*"")|(\([^\(\)]*(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*\))", m2 => ""); 
      return cleanExpr.Contains(' ') ? "@(" + expr + ")" : "@" + expr; 
     }, RegexOptions.Singleline); 

     //code blocks 
     string text5 = Regex.Replace(text4, @"<%(?<code>.*?)%>", m => 
     { 
      string code = m.Groups["code"].Value.Trim(); 

      Dictionary<string, string> stringLiterals = new Dictionary<string,string>(); 

      code = Regex.Replace(code, @"(""(\\""|[^""])*"")|(@""([^""]|"""")*"")", m2 => 
      { 
       string key = "<$" + stringLiterals.Count + "$>"; 
       stringLiterals.Add(key, m2.Value); 
       return key; 
      }); 

      string result = Regex.Replace(code, 
       @"((?<blockHeader>(else|(for|switch|foreach|using|while|if)\s*\([^\(\)]*(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*\))\s*)" + 
       @"((?<fullBlock>{[^{}]*(((?'OpenCurly'{)[^{}]*)+((?'CloseCurly-OpenCurly'})[^{}]*)+)*})|(?<openblock>{.*))|" + 
       @"(?<text>((?!({|}|\s)(for|switch|foreach|using|while|if|else)(\s|{|\()).)+))", 
       m2 => 
       { 
        if(m2.Value.Trim().Length == 0 || m2.Value.StartsWith("else")|| m2.Value.StartsWith("}")) 
         return m2.Value; 

        if(m2.Groups["text"].Success) 
         return "@{ " + m2.Value.Trim() + "}\r\n"; 

        return "@" + m2.Value; 
       }, RegexOptions.ExplicitCapture | RegexOptions.Singleline); 

      result = Regex.Replace(result, @"<\$\d+\$>", 
       m2 => stringLiterals[m2.Value]); 

      return result; 
     }, RegexOptions.Singleline); 

     return text5; 
    } 
} 
+4

もちろん、Fredrik Lundhの有名な言葉を聞いたことがあります。「問題に直面した人は、「私が知っている、私は正規表現を使用する」と思う人もいます。 ユーティリティのおかげで、それを渦巻きにするのを待つことはできません。 –

+0

私は、正規表現のシンタクスを強調するツールを世界が待っていると思います。まもなく、正規表現を使わずにこれを行うには、多くのコードが必要になると思います。 – Olmo

+0

@Olmo:私は[RegExr](http://gskinner.com/RegExr/)の経験がありました。それはあなたがホバリングしている正規表現の部分をハイライト表示し、文脈依存のヘルプを提供するのですばらしいです。試してみるといいかもしれません。デスクトップ版も提供しています(私はこれまで使っていません)。 – Oliver

1

Razorがまだベータ版ではなく、最新のSPで構文の強調表示が行われていることを考えると、あまりに早すぎるツールです。このプロジェクトは、初期の段階にとどまっているため、任意のバイナリリリースを持っていない

しかし、Googleはthis CodePlexのプロジェクトを検索します。あなたはソースコードをダウンロードするかもしれません。コンパイルするにはVS2010が必要です。

12

Telerikは、ここでは変換ユーティリティをリリースしました:https://github.com/telerik/razor-converter

+0

Telerikのソフトウェアに関する私の経験はかなり恐ろしいものでした。私は原則としてこれを避けています。 –

+2

+1 Telerik aspx2razorのために、美しく働いた。これは単なるコンソールexeで、使いやすいものです。 Telerikは何年もずっと良くなってきました。 – GONeale

+0

@BenLesh本当に? Telerikはいつも私にはとても素敵でした。 – BroVirus

1

は試してみてください。この

http://razorconverter.codeplex.com/

それは私がそれはいくつかの改良をOLMAコードを自動書いたCodePlexのプロジェクトです。 .Net 2.0が必要なexeのダウンロードもあります。あなたのビューフォルダにドロップするだけで、自動的にすべてが変換されます。

+0

これは、頻繁にクラッシュし、マスターページをサポートしていないtelerikの変換ユーティリティよりも優れていました。 –

+1

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](/レビュー/低品質の投稿/ 18785713) – rzelek

関連する問題