maximaコードをhtmlentity

2 7月

e-Learning 教材開発の話です。コンテンツの中に,解答や正解を処理する maxima のコードを書き込む必要が生じました。そのコードを,XMLの中のひとつのタグに収めたいと考えています。ただこの場合コードの中には,一般的にXMLの中で使用できない文字が頻繁に現れます。これまでは下記のように,CDATA を利用していました。

<?xml version="1.0" encoding="utf-8"?>

<root>

<operation><text><![CDATA[assume(h>0,g>0);
sans:''sans;]]></text></operation>

</root>

これが,Javascript において,IE ver.9 で読み込みに失敗します。IEの場合,読み込みのコードは下記のようなものです。

// xmltextには,xmlデータがテキストデータとして入っている。
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = "false";
xml.loadXML(xmltext);

“>” に,上手く対応できていないようでした。そこで,maxima コードのHTMLエンティティー化をしました。同じ XML を,javascript と PHP で取り扱います。エンティティー化をするのはPHPで実行します。javascript 側は,それを読み取ってもとのコードに戻します。php でのエンティティー化は簡単に,下記(参考サイト)。

htmlentities($string);

これによって,maxima のコードの部分を,下記のように変更します。

<operation><text><![CDATA[assume(h&gt;0,g&gt;0);
sans:''sans;]]></text></operation>

次に読み取りですが,JQuery で,まずタグの中身を受け取ります。下記のコードの変数 xml は JQuery の XML オブジェクトです(直下のタグのみを対象とするために,”>” を使用しています。本来は再帰的なデータ構造をしているものですから,このような記述になっています)。受け取ったテキストを innerHTML で,いったん div に書き込んで,その div の中身を,textContent で読み出します。こうすれば,HTMLエンティティーされたテキストが元に戻ります(参照サイト)。

var tmpstr = $("> operation > text",xml).text();

var tmpcode = htmlentity2text(tmpstr);


function htmlentity2text(tmpentity) {

var element = document.createElement('div');

element.innerHTML = tmpentity;

return element.textContent;
}

javascript でHTMLエンティティーを元に戻すことが必要になるのは,オーサリングツールの場合だけです。maxima コードは,サーバー側で動かします。そのため,コンテンツを利用しているときには,javascript 側で,HTMLエンティティーを元に戻す必要はありません。