はてなキーワード: twとは
■TOUR OF THE UNIVERSE 2009/ヨーロッパツアー全日程
May/5月
Sun 10th テルアビブ, Ramat Gan Stadium / イスラエル
Tue 12th アテネ, Terra Vibe Park / ギリシャ
Thu 14th イスタンブール, Santral Istanbul / トルコ
Sat 16th ブカレスト, Park Izvor / ルーマニア
Mon 18th ソフィア, Vasil Levski Stadium, Tuborg Greenfest / ブルガリア
Wed 20th ベオグラード, USCE Parc, Tuborg Greenfest / セルビア
Thu 21st ザグレブ, Arena, Tuborg Greenfest / クロアチア
Sat 23rd ワルシャワ, Gwardia Stadium / ポーランド
Mon 25th リガ, Skonto Stadium / ラトビア
Wed 27th ヴィルニアス, Zalgirio Stadionas / リトアニア
Sat 30th ロンドン, O2 Arena / イギリス
Tue 2nd ハンブルグ, HSH Nordbank Arena / ドイツ
Thu 4th デュッセルドルフ, LTU Arena / ドイツ
Sun 7th LEIPZIG, Zentralstadion / ドイツ
Wed 10th ベルリン, Olympiastadion / ドイツ
Fri 12th フランクフルト, Commerzbank Arena / ドイツ
Sat 13th ミュンヘン, Olympiastadion / ドイツ
Tue 16th ローマ, Stadio Olimpico / イタリア
Thu 18th ミラノ, Stadio San Siro / イタリア
Sat 20th WERCHTER, TW Classic Festival / ベルギー
Mon 22nd ブラティスラバ, Inter Stadium / スロバキア
Tue 23rd ブダペスト, Puskas Ferenc Stadium / ハンガリー
Thu 25th プラハ, Slavia Stadium / チェコ
Tue 30th コペンハーゲン, Parken Stadium / デンマーク
July/7月
Fri 3rd アルヴィーカ, Arvika Festival / スウェーデン
Sat 11th ポルト, Superbock Super Rock Festival / ポルトガル
http://www.emimusic.jp/intl/news/?id=intl_news&no=100?rssno=941
http://anond.hatelabo.jp/20071030034313 の二番煎じ
あまりのアホさに、作ってて気が狂いかけた
方針
using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Reflection; using Microsoft.CSharp; delegate void ConvertTemplateDelegate(TextWriter tw, Dictionary<object, object> args); static class TemplateGenerator { public static ConvertTemplateDelegate Generate(string code) { CompilerParameters param = new CompilerParameters(); param.GenerateInMemory = true; param.ReferencedAssemblies.Add("System.Web.dll"); CompilerResults rs = new CSharpCodeProvider().CompileAssemblyFromSource(param, ParseTemplate(code)); if (0 < rs.Errors.Count) { StringWriter sw = new StringWriter(); sw.WriteLine("Compile Error..."); foreach (CompilerError err in rs.Errors) sw.WriteLine(err.ToString()); throw new Exception(sw.ToString()); } return (ConvertTemplateDelegate) Delegate.CreateDelegate(typeof(ConvertTemplateDelegate), rs.CompiledAssembly.GetType("Template", true).GetMethod("Convert")); } private static string ParseTemplate(string code) { using (StringWriter sw = new StringWriter()) { sw.WriteLine("using System; using System.Collections.Generic; using System.IO; using System.Web;"); sw.WriteLine("public static class Template {"); sw.WriteLine("public static void Convert(TextWriter tw, Dictionary<object, object> args) {"); int index = 0; while (0 <= index && index < code.Length) { int i = code.IndexOf("<%", index); sw.WriteLine("tw.Write(\"{0}\");", EscapeString(i < 0 ? code.Substring(index) : code.Substring(index, i - index))); if (0 <= i) { i += 2; int i2 = code.IndexOf("%>", i); if (0 <= i2) { string cc = code.Substring(i, i2 - i); if (cc.StartsWith("=")) sw.WriteLine("tw.Write(HttpUtility.HtmlEncode(\"\"+({0})));", cc.Substring(1)); else sw.WriteLine(cc); i = i2 + 2; } } index = i; } sw.WriteLine("}}"); return sw.ToString(); } } private static string EscapeString(string code) { return code.Replace("\\", "\\e").Replace("\"", "\\\"").Replace("\t", "\\t").Replace("\n", "\\n").Replace("\r", "\\r").Replace("\\e", "\\\\"); } }
サンプル C# コード。ためしにテンプレートから Xml 生成して、標準出力してみる。
class Program { static void Main(string[] args) { ConvertTemplateDelegate func = TemplateGenerator.Generate(TemplateEngine.Resource1.template); using (StringWriter sw = new StringWriter()) { Dictionary<object, object> arg = new Dictionary<object, object>(); arg["title"] = "template sample"; arg["data"] = new string[] { "foo", "fooo", "<strong>foooooooooo!</strong>" }; func(sw, arg); Console.WriteLine(sw); } } }
サンプルテンプレート
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title><%= args["title"] %></title> </head> <body> <h1><%= args["title"] %></h1> <table> <% string[] data = (string[]) args["data"]; %> <% for(int i = 0; i < data.Length; i++) { %> <tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>"> <td><%= i %></td> <td><%= data[i] %></td> </tr> <% } %> </table> </body> </html>
出力例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>template sample</title> </head> <body> <h1>template sample</h1> <table> <tr bgcolor="#FFCCCC"> <td>0</td> <td>foo</td> </tr> <tr bgcolor="#CCCCFF"> <td>1</td> <td>fooo</td> </tr> <tr bgcolor="#FFCCCC"> <td>2</td> <td><strong>foooooooooo!</strong></td> </tr> </table> </body> </html>
CodeDom 使って動的コンパイル……って、このコードのままだとセキュリティ的に大問題な気がするな。
素直に ASP.NET 使ったほうが楽だと直感した。
あと EscapeString すっごく自信ない。たぶん修正が必要だと思うw