レッスンへの日本語を含むPowerPointのインポート

レッスンへの日本語を含むPowerPointのインポート

- Tatsuya Shirai の投稿
返信数: 1
http://moodle.org/mod/forum/discuss.php?d=84393
から勝手ながら派生させて頂きます.

日本語Windows上で稼動しているMoodle1.8.3+(fs_moodle)上で,レッスンにPowerPointのデータをインポートしてみました.

結果は...かなり期待した出力とは異なります.
こういうものなのでしょうか?
  1. 日本語をコンテンツとして含むと表示されない.
  2. 図形や画像と文字がバラバラになってしまう(添付画像参照)
英数字のみのシンプルなPowerPointのデータならばインポートできるが...ということでしょうか?


添付 LessonSample.jpg
Tatsuya Shirai への返信

Re: レッスンへの日本語を含むPowerPointのインポート

- Tatsuya Shirai の投稿
調査に取り掛かった以上,半端は気持ちが悪いので調査を続けました.

まず,図の類がバラバラになってしまうのは致し方ないようです.
PowerPointで出力したWeb形式のデータがIE上ではPowerPointとほぼ同じレイアウトで表示されるのが特別なだけで,通常のHTMLの範囲内で画像の上に画像を載せて,さらにテキストまで配置するのは難しそうですね.

図形も画像扱い.画像はHTMLエディタの中に読み込める.
あとはページ単位でテキストボックスの中身を抜き出して出力してくれる.
単にテキストを抜き出すだけではなく,
  1. 段落番号による
  2. 箇条書き

  • 単なる
  • 箇条書き
は,それらしく番号を頭に付けたり,・を付けたりはしてくれます.これだけでも大助かり.

画像とテキストは抜き出すから,あとはHTMLエディタを用いて手作業で頑張って下さい,というのがPowerPointのインポート機能なのですね.

さて,日本語の文章を含むコンテンツをインポートするとページ内容が空白になってしまう問題は,どうやら文字コードの問題のようです.日本語Windows上のPowerPointで出力したWeb形式のデータは,UTF-8ではなくシフトJISで出力されます.これをfile_get_contents()関数で読み込んで,そのまま処理を行おうとして失敗しているようです.(Windows版PHPのfile_get_contents()関数はバイナリーモードでファイルを読み込むらしく,もしかしたらLinuxとは現れる現象が異なるかも知れません).

PowerPointの各ページはslide0001.htm, slide0002.htmといったページ単位のhtmlファイルとして出力されます.これらの.htmファイルはLessonコンテンツのブランチテーブルとして読み込まれます.その際にfile_get_contents()関数で読み込み,htmlタグでパージングしています.どうやらここでコンテンツ(テキストボックスの中身)が消えるようです.

当方の環境では,moodle/mod/lesson/importppt.php中のfunction readdata()関数,163行近辺のfile_get_contents()関数の出力をシフトJISからUTF-8に変換することで,日本語文字のテキストボックスもLessonのブランチテーブルのコンテンツとして読み込めました.もちろん,表示もOKです.

if (file_exists($outline) and is_readable($outline)) {
$outlinecontents = file_get_contents($outline);
$filenames = array();
preg_match_all("/javascript:GoToSld\('(.*)'\)/", $outlinecontents, $filenames); // this gets all of our files names

// file $pages with the contents of all of the slides
foreach ($filenames[1] as $file) {
$path = $base.'/'.$file;
if (is_readable($path)) {
// $pages[$path] = file_get_contents($path);
$pages[$path] = mb_convert_encoding(file_get_contents($path), 'UTF-8', 'SJIS-WIN');
} else {
return false;
}
}
} else {
// cannot find the outline, so grab all files that start with slide
$dh = opendir($base);
while (false !== ($file = readdir($dh))) { // read throug the directory
if ('slide' == substr($file, 0, 5)) { // check for name (may want to check extension later)
$path = $base.'/'.$file;
if (is_readable($path)) {
// $pages[$path] = file_get_contents($path);
$pages[$path] = mb_convert_encoding(file_get_contents($path), 'UTF-8', 'SJIS-WIN');
} else {
return false;
}
}
}
ksort($pages); // order them by file name
}