ものがたり(旧)

atsushieno.hatenablog.com に続く

November Steps

Mono関係

  • MonoDevelop 1.0 beta2 (0.17)がリリースされました。ASP.NETプロジェクトのサポートが目立つかな。プロジェクト/ソリューションのプロパティは、そこそこ変わったと思います。多分。いつもtrunk使ってるから分かんねー
  • Mono 1.2.6のブランチが切られたみたい。上手くリリースまで漕ぎ着けるといいのだけど、どう出ますかな。出るのは多分12月頭です。

MIAU関係

  • 水曜に、ようやくMIAU協力会員を募集できる段取りができました。早速数十名の方が登録して下さっています…すぎょい。ちなみにメルマガの登録は2000人を超えています
  • MIAU開発プロジェクトでケータイ版パブコメジェネレータが開発されています。ほどなく公開していただけると思います。素晴らしいぃ〜 → 公開されましたmixiとかに書いて広めていただけると、移動中の暇な時間とかにやってもらえるかもしれません。そうなると嬉しいなー
  • パブコメジェネレータ、Javascript版もいろいろ手を加えています。相変わらずHTML1枚ですがw そして相変わらず内容が足りない!

XmlWriter.WriteCData()はボミョー

小ネタに便乗するにょ。

http://d.hatena.ne.jp/ladybug/20071109#p2

僕ならWriteString()をオーバーライドしてWriteStateがAttributeでない時だけWriteCData()を呼び出す、特別なXmlWriterを作るかな。

ただ、WriteCData()とWriteString()の動作は等価ではない。僕が書いたXmlTextWriter.WriteCData()のコードはこんな感じだ:

public override void WriteCData (string text)
{
	if (text == null)
		text = String.Empty;
	ShiftStateContent ("CData", false);
	if (StringUtil.IndexOf (text, "]]>") >= 0)
		throw ArgumentError ("CDATA section must not contain ']]>'.");
	writer.Write ("<![CDATA[");
	WriteCheckedString (text);
	writer.Write ("]]>");
}

何がポイントかというと、WriteCData()の引数には "]]>" が含まれていてはいけない、ということ。そんなの文字参照でも使ってエスケープしろ、とか思うわけだが、たぶんエスケープするお決まりの方法が無く、WriteCharEntity()なんてマニアックなメソッドは正しく実装されない可能性もあるから、エラーで弾くなんて仕様になったんだろうな。

いずれにしても、そんな面倒があるので、WriteString()からWriteCData()に処理をたらい回す時は、"]]>"があるごとに、WriteCData()の呼び出しを別途行わなければならない。しかも

WriteCData ("foo");
WriteCData ("]]>bar");

としたら意味がないので、

WriteCData ("foo]]");
WriteCData (">bar");

みたいな感じになる。めんどくさいな、これ。そこまでしてCDATAセクションにこだわる必要は、まあ無いだろうから、WriteString ("]]>")って書いても良いだろうと思う。