詫間電波工業高等専門学校研究紀要 第 36 号 (2008)

SmartDoc を中心とした文書フォーマット変換
白石 啓一∗

桐山 和彦†

原 元司‡
山本 喜一§
岡田 正∗∗

本間 啓道¶

白濱 成希kDocument Format Translation Centering on SmartDoc
Keiichi SHIRAISHI

Kazuhiko KIRIYAMA

Yoshimichi HONMA

Motoshi HARA

Naruki SHIRAHAMA

Kiichi YAMAMOTO

Tadashi OKADA

Synopsis
We discuss about document format translation centering on SmartDoc to extend c-Learning
system – the system to collect and process documents. MediaWiki format to SmartDoc format
translation and SmartDoc to WebClass importation are discussed. The translator is implemented with programming language AWK. The translator can process headings, bullet lists andnumbered lists.
1

はじめに能，バージョン管理機能，文書共有機能を実現してコンピュータやネットワークを利用した教育であいる．しかし，SmartDoc 文書は，HTML や LaTeX

る e ラーニングが普及してきており，筆者等も講義と同様にタグにより文書構造が書かれているので，に利用している．e ラーニングを利用すると，教員自ワードプロセッサのように簡単に文書作成できない．

らが解説や問題などのコンテンツを作成することもつまり，広く普及させるには難があり，共有機能は多い．これらのコンテンツは，個人的にあるいは組あっても，広く使われないことになる．一方，イン織内で再利用されるが，組織を超えて再利用される

ターネット上には Wikipedia4) などのフリー百科事ものは少ない．我々は，コンテンツの再利用を，組典が登場した．フリー百科事典は，信頼性に難があ織を超えて行うためのシステムを開発している

1, 2)

．

ると言われているとは言え，そのコンテンツの利用本システムを c-Learning システムと呼んでいる．

を検討する価値がある．また，Wikipedia でコンテコンテンツの再利用を進めるには，コンテンツのンツ管理に使われている Wiki のような，簡単に使文書フォーマットの統一が必要である．筆者等は文える共同編集システムがあれば，c-Learning システ

書フォーマットだけでなく文書を扱うツールまで仕ムの広まると考えられる．つまり，Wiki のコンテン様が公開されている，文書の一部を再利用しやす

ツの c-Learning システムへの導入，c-Learning シ

くなるよう構造化されている，という条件を満たすステムのユーザインターフェースの改良という二つSmartDoc を選択した．SmartDoc は XML ベースの文書フォーマットであり，トランスレータによの意味で Wiki フォーマットから SmartDoc フォー

り HTML や LaTeX へフォーマット変換できる．

本稿では，Wiki(MediaWiki5) ) フォーマットからc-Learning システムは，SmartDoc を中心にしたSmartDoc フォーマットへのフォーマット変換を議文書フォーマット変換機能，画像フォーマット変換機論する．既に，PukiWiki 用の SmartDoc 変換プラ

3)

マットへのフォーマット変換は重要である．

グイン 6) は開発されているが，Wiki はシステムに∗ 電子制御工学科† 鳥羽商船高等専門学校‡ 松江工業高等専門学校§ OpenEdu プロジェクト¶ 奈良工業高等専門学校

k 北九州工業高等専門学校∗∗ 津山工業高等専門学校

よりフォーマットが異なっているので，Wikipediaに使われている MediaWiki 用のフォーマット変換を議論することは有用であろう．

c-Learning システムでコンテンツ再利用ができた

61

THE BULLETIN OF TAKUMA NATIONAL COLLEGE OF TECHNOLOGY No.36 (2008)¶
表 1: SmartDoc のタグ
タグ

意味<section></section><subsection></subsection><subsubsection></subsubsection><title></title>
<p>
</p>
空行

節の開始
節の終了
小節の開始小節の終了
小小節の開始
小小節の終了節などの見出しの開始
節などの見出しの終了
段落の開始段落の終了
改段落(<p>, </p>の代わりに使える)
箇条書の開始
箇条書の終了番号付き箇条書の開始
番号付き箇条書の終了
箇条書の各項目の開始
箇条書の各項目の終了
箇条書は入れ子にできる．

<ul>
</ul>
<ol>
</ol>
<li>
</li>

³

<section><title>1 節の見出し</title>
本文¶<subsection><title>1.1 節の見出し</title>
本文</subsection>µ¶<subsection><title>1.2 節の見出し</title>
本文</subsection>

µ³

´
³

´</section>µ´

図 1: SmartDoc 文書構造 (例)表 2: MediaWiki のマークアップ

としても，学習管理システムへのコンテンツ登録がマークアップ意味

容易でなければ価値が減少する．近年の学習管理シ部で編集した HTML 文書や PDF 文書，オフィスソ== 見出し ===== 見出し ======= 見出し ====
空行***

フトウェア文書を取り込む機能がある．本稿では，c-***

レベル 2 見出し
レベル 3 見出し
レベル 4 見出し
改段落
箇条書
(1 レベルインデントした)箇条書(2 レベルインデントした)
箇条書
番号付き箇条書(1 レベルインデントした)
番号付き箇条書(2 レベルインデントした)
番号付き箇条書*, #は*#*のように混在できる．

ステムには，HTML 文書や広く普及しているオフィスソフトウェアの文書を取り込む機能を持つものが多い．筆者等が利用している WebClass7) にも，外Learning システム (SmartDoc) で生成した HTML文書を WebClass へ登録する方法を述べる．
2

文書フォーマットと学習管理システム######

本節では，本稿で扱う文書フォーマットと学習管理システムの特徴を述べる．

2.1

SmartDoc

語は，SmartDoc より簡単である．マークアップは，文書構造を SmartDoc タグにより指定できる．XMLル 2(節) の見出し，===はレベル 3(小節) の見出しなので，開始タグと終了タグがある (表 1)．節見出を示すマークアップである．SmartDoc と違い，終し・本文・小節が節に属し，小節見出し・本文が小了を示すマークアップがないので，次に同じレベル節に属するなどの階層構造を持つ (図 1)．の見出しが出て来るまでが一つのまとまりであると

2.2

MediaWikiMediaWiki は，Wikipedia のために書かれた Wikiシステムである．Wiki は，WWW ベースのコンテンツ管理システムであり，誰でもそのコンテンツを閲覧・編集できる．文書構造を簡単なマークアップ

62

言語により指定できる (表 2)．このマークアップ言

SmartDoc は，XML をベースとした文書フォーマットである．トランスレータにより，HTML, LaTeX,プレインテキストなどのフォーマットへ変換できる．

基本的に行指向であり，各行の先頭にある記号 (マークアップ) により書式が決まる．例えば，==はレベ言える (図 2)．

2.3

WebClass

WebClass は，(株) ウェブクラスが開発した学習管理システムであり，教材の提示，問題の提示，回答の収集，半自動採点，採点結果の集計などの機能詫間電波工業高等専門学校研究紀要 第 36 号 (2008)¶³¶==1 節の見出し==
本文¶===1.1 節の見出し===本文µ¶===1.2 節の見出し===
本文

µµ

³

<section><title>見出し</title>³

本文</section>´³ µ´

図 4: SmartDoc 文書例 1´´(b) line から行頭の==と行末の==を除く(c) <title> line </title>を出力する(d) 4 へ図 2: MediaWiki 文書構造 (例)¶³ 3. line を出力する== 見出し ==本文µ4. MediaWiki 文書の最終行ならば</section>を´

図 3: MediaWiki 文書例 1を持つ．教材については，WebClass 上で編集することも，外部で編集したものを取り込むこともできる．複数ファイルからなる場合，zip や lzh などの形式でアーカイブすることにより取り込むことができる．

3

MediaWiki-SmartDoc 変換
本節では，MediaWiki フォーマットから Smart-Doc フォーマットへのフォーマット変換について述べる．以下，MediaWiki フォーマットの文書を出力して終了，そうでなければ 1 へという手順で変換できる．これを手順 A と呼ぶ．
次に，図 5 を考える．図 5 は図 6 へ変換されるべきだが，手順 A では適切な位置で終了タグを出力しないために，図 6 は出力されない．==が現れたことを記録しておき，2 度目の==が現れた時点で，終了タグを開始タグと共に出力する必要がある．つまり，

1. SectionFlag=0
2. MediaWiki 文書から 1 行読み，line へ保存する
3. line 行頭に==があれば，以下を実行する(a) SectionFlag=1 ならば，</section>を出MediaWiki 文書，SmartDoc フォーマットの文書を力する

SmartDoc 文書と呼ぶ．
MediaWiki フォーマットは基本的に行指向なので，MediaWiki 文書を 1 行ずつ読み，適切な SmartDoc(b) SectionFlag=1

タグを出力すれば，MediaWiki 文書を SmartDoc 文(d) line から行頭の==と行末の==を除く書へ変換できる．

(e) <title> line </title>を出力する

例えば，図 3 に示した MediaWiki 文書は，図 4(c) <section>を出力する(f) 5 へに示した SmartDoc 文書へ変換できる．SmartDoc文書において，行頭のインデントと改行は読みやすくするためにあり，なかったとしても同じ文書構造

4. line を出力する
5. MediaWiki 文書の最終行でなければ 2 へを意味する．本稿では，変換後の SmartDoc 文書の行頭のインデントと改行を考慮しないことにする．
この例から分かるように，

1. MediaWiki 文書から 1 行読み，line へ保存する
2. line 行頭に==があれば，以下を実行する(a) <section>を出力する

6. SectionFlag=1 ならば，</section>を出力して終了という手順で変換する必要がある．これを手順 B と呼ぶ．
次に図 7 を考える．図 7 は図 8 へ変換されるべきなので，手順 B に===の処理を加える必63THE BULLETIN OF TAKUMA NATIONAL COLLEGE OF TECHNOLOGY No.36 (2008)¶³== 見出し 1 ==== 見出し 2 ==µば，</subsection>を出力し，スタッ´

図 5: MediaWiki 文書例 2¶

クから 1 個取り出す(b) スタックに subsection を積む(c) <subsection>を出力する³<section>(d) line から行頭の===と行末の===を除く(e) <title> line </title>を出力する<title>見出し 1</title></section><section><title>見出し 2</title></section>µii. スタックのトップが subsection なら(f) 7 へ5. line 行頭に==があれば，以下を実行する´(a) スタックのトップが，subsubsection でもsubsection でも section でもなくなるまで，以下を実行する

図 6: SmartDoc 文書例 2i. スタックのトップが subsubsection な
らば，</subsubsection>を出力し，スタックから 1 個取り出す

要 が あ る ．ま た ，<section>,<subsection>,<subsubsection>は 入 れ 子 に な る の で ，==が<subsubsection>を閉じる必要がある．同様に，===が現れたら，<subsubsection>を 閉 じ る 必 要 が あ る ．つ ま り，ii. スタックのトップが subsection ならば，</subsection>を出力し，スタッより下位のタグを閉じる必要がある．そのために，iii. スタックのトップが section ならば，</section>を出力し，スタックから1 個取り出す

現 れ た ら ，<subsection>,クから 1 個取り出す

手順 B の SectionFlag のようなフラグを複数個使っても良いが，スタックで管理することにする．

1. スタックを空にする
2. MediaWiki 文書から 1 行読み，line へ保存する(b) スタックに section を積む(c) <section>を出力する(d) line から行頭の==と行末の==を除く

3. line 行頭に====があれば，以下を実行する(e) <title> line </title>を出力する(a) スタックのトップが subsubsection ならば，</subsubsection>を出力し，スタックから 1 個取り出す

6. line を出力する(b) subsubsection をスタックに積む

7. MediaWiki 文書の最終行でなければ 2 へ(c) <subsubsection>を出力する(d) line から行頭の====と行末の====を除く(f) 7 へ8. スタックが空になるまで以下を実行し，終了する(e) <title> line </title>を出力する(f) 7 へ4. line 行頭に===があれば，以下を実行する

64(a) スタックのトップが subsubsection ならば，</subsubsection>を出力し，スタックから 1 個取り出す(a) スタックのトップが，subsubsection でも(b) スタックのトップが subsection ならば，subsection でもなくなるまで，以下を実行する</subsection>を出力し，スタックから1 個取り出す

i. スタックのトップが subsubsection ならば，</subsubsection>を出力し，スタックから 1 個取り出す(c) ス タック の トップ が section な ら ば ，</section>を出力し，スタックから 1 個取り出す詫間電波工業高等専門学校研究紀要 第 36 号 (2008)¶³¶== 見出し 1 ===== 見出し 2 ===µ
図 7: MediaWiki 文書例 3¶<section><title>見出し 1</title>³* 箇条書 1
* 箇条書 2´ ** 箇条書 2-a** 箇条書 2-b*# 箇条書 2-1³*# 箇条書 2-2* 箇条書 3µ<subsection><title>見出し 2</title></subsection></section>µ図 8: SmartDoc 文書例 3´

図 9: MediaWiki 文書例 4¶³<ul>´ <li>箇条書 1</li><li>箇条書 2</li><ul>

これを手順 C と呼ぶ．
同様に，段落についても，MediaWiki の改行とSmartDoc の p タグを対応付け，適切に変換できる．
次に，図 9 から図 10 への変換を考える．箇条書の処理は*または#が行頭に現れたときに行う．前の行とマークアップ列が異なっていたら，終了タグや開始タグを出力する必要がある．ここでは，箇条書の処理のみ考える．

1. s, t を空文字列にする<li>箇条書 2-a</li><li>箇条書 2-b</li>
</ul>
<ol>
<li>箇条書 2-1</li><li>箇条書 2-2</li></ol><li>箇条書 3</li></ul>µ

2. MediaWiki 文書から 1 行読み，line へ保存する
3. line からマークアップ列を切り出し，s へ代入する

4. i=1, j=1´

図 10: SmartDoc 文書例 46. line 行頭から s を除く
7. <li> line </li>を出力する
8. t=s

5. 「s の i 文字目」か「t の j 文字目」が空文字でなければ以下を実行する，両方とも空文字であれば 6 へ(a) 「s の i 文字目」と「t の j 文字目」が等し
ければ，5f へ(b) t の j 文字目が*なら</ul>を出力し，#なら</ol>を出力し，空文字なら 5d へ(c) j=j+1，5b へ(d) s の i 文字目が*なら<ul>を出力し，#なら<ol>を出力し，空文字なら 6 へ(e) i=i+1，5d へ(f) i=i+1, j=j+1，5 へ

9. MediaWiki 文書の最終行でなければ 2 へ
10. t の文字列長を i とし，i>0 の間，以下を実行し，終了する(a) t の i 文字目が*なら</ul>を出力し，#なら</ol>を出力する(b) i=i-1(c) 10a へ
これを手順 D と呼ぶ．
手順 C と手順 D を組合せた変換処理をプログラ
ミング言語 AWK8) で実装した．図 11，図 12 に示
した変換例の通り，期待通りの動作をしている．

65

THE BULLETIN OF TAKUMA NATIONAL COLLEGE OF TECHNOLOGY No.36 (2008)¶³¶= 1章 =
1 章の本文== 1.1 節 ==1.1 節の本文*箇条書 1*箇条書 2=== 1.1.1 節 ===1.1.1 節の本文
#箇条書 1#箇条書 2
次の文=== 1.1.2 節 ===1.1.2 節の本文== 1.2 節 ==1.2 節の本文*箇条書 1*箇条書 2**箇条書 3**箇条書 4=== 1.2.1 節 ===1.2.1 節の本文
*箇条書 1*#箇条書 3*#箇条書 4
*箇条書 4==== 1.2.1.1 節 ====
1.2.1.1 節の本文
#箇条書 1##箇条書 2##箇条書 4
#箇条書 3==== 1.2.1.2 節 ====
1.2.1.2 節の本文=== 1.2.2 節 ===1.2.2 節の本文
(以下省略)µ

図 11: MediaWiki 文書例 5(一部)

66³<chapter><title>1 章</title><p>
1 章の本文</p><section><title>1.1 節</title><p>
1.1 節の本文<ul><li>箇条書 1</li><li>箇条書 2</li>
</ul>
</p>
<subsection><title>1.1.1 節</title><p>1.1.1 節の本文
<ol><li>箇条書 1</li><li>箇条書 2</li>
</ol>
次の文
</p>
</subsection><subsection><title>1.1.2 節</title><p>
1.1.2 節の本文</p></subsection></section><section><title>1.2 節</title><p>
1.2 節の本文
</p>
<p>
<ul>
<li>箇条書 1</li><li>箇条書 2</li><ul><li>箇条書 3</li><li>箇条書 4</li>
</ul>
</ul>
</p>
<subsection><title>1.2.1 節</title><p>
1.2.1 節の本文
</p>
<p>
<ul>
<li>箇条書 1</li><ol>(以下省略)´µ

図 12: SmartDoc 変換結果 (一部)´詫間電波工業高等専門学校研究紀要 第 36 号 (2008)

4

SmartDoc 文書の WebClass への登録

WebClass は，外部で編集した HTML 文書を取り込む機能を持つ．複数ファイルからなる場合，それらのファイルとともに(章見出し),,(ファイル名),または,(節見出し),(ファイル名),という形式の行を取り込みたいファイル数分，並べた csv ファイルをアーカイブすることで，取り込むことができる．csv ファイル名は任意であるが，本稿では，List.csv と呼ぶ．

SmartDoc 文書は，-split:section オプションを付けて変換することで，節ごとに別の HTML ファイルに分けられる．そのファイル名は，章の場合，(元のファイル名)_c(章番号).htmlになり，節の場合，(元のファイル名)_c(章番号)_s(節番号).htmlになる．SmartDoc 文書中の章見出し・節見出しは，title タグを探すと見つけられるので，List.csvの生成は自動化できる．
図 13 に示した SmartDoc 文書を HTML 文書へ変換すると，ex.html, ex_c1.html, ex_c1_s1.html,ex_c1_s2.html, ex_c2.html, ex_c2_s1.html,ex_c2_s2.html の 7 個 の ファイ ル が 得 ら れ る ．
ex.html は目次ページなので，WebClass へ取り込む必要はない．図 14 に示した List.csv とともにlzh アーカイブし，WebClass へ取り込んだ結果，図15，図 16 に示す通り，取り込むことができた．
5

おわりにSmartDoc を中心とした文書フォーマット変換について述べた．

MediaWiki フォーマットから SmartDoc フォー
マットへの変換方法を示し，AWK で実装した．本
実装により，節・段落・箇条書のフォーマット変換ができる．これにより，Wikipedia など MediaWikiを利用しているフリー百科事典の再利用性が高まる¶³<?xml version=’1.0’
encoding=’iso-2022-jp’ ?><doc xml:lang="ja"><head><title>WebClass 解説登録実験</title></head><body><chapter id="chap:about"><title>この実験について</title><p>
この実験は，SmartDoc 文書を WebClass の解説へ登録する実験である．
</p><section id="sec:a"><title>節 1</title><p>
節 1 の本文</p></section><section id="sec:i"><title>節 2</title><p>
節 2 の本文</p></section></chapter><chapter id="chap:base"><title>章 2</title><p>
章 2 の本文</p><section id="sec:u"><title>節 3</title><p>
節 3 の本文</p></section><section id="sec:e"><title>節 4</title><p>
節 4 の本文</p></section></chapter></body></doc>µ

図 13: SmartDoc 文書例 (ex.sdoc)と考えられる．Wikipedia には，本稿で述べた節・段落・箇条書以外にもマークアップがあるので，それらへの対応が課題である．

67´

THE BULLETIN OF TAKUMA NATIONAL COLLEGE OF TECHNOLOGY No.36 (2008)

また，SmartDoc 文書の WebClass への登録についても述べた．方法を示し，手作業で確認した．作¶
この実験について,,ex_c1.html,, 節 1,ex_c1_s1.html,業を自動化するためのプログラム開発が必要である．
³
MediaWiki-SmartDoc フォーマット変換プログラ
ム，WebClass 登録プログラムの開発は，c-Learningシステムをより使いやすく，有用にするためである．

, 節 2,ex_c1_s2.html,
章 2,,ex_c2.html,, 節 3,ex_c2_s1.html,c-Learning システムへこれらのプログラムを組み込むことも急務である．

, 節 4,ex_c2_s2.html,µ

研究 (C)(課題番号 19500848) の助成を受けて行わ´れた．

なお，本研究の一部は文部科学省科学研究費基盤

図 14: List.csv(ex.sdoc 用)

参考文献1) 桐山 和彦 他, 教育用オープンコンテンツの作成とその管理システムについて, 第 6 回情報科学技術フォーラム一般講演論文集 (4), pp.389–390(2007).
2) 桐山 和彦 他, 完全にコピー自由な教育用コンテンツ配信システムの構築に向けて, 情報処理学会第 70 回全国大会講演論文集 (4), pp.473–474(2008).
3) 浅海 智晴, XML SmartDoc 公式リファレン
スマニュアル, ピアソン・エデュケーション(2002).
4) Wikipedia, http://wikipedia.org/ .
5) MediaWiki, http://www.mediawiki.org/ .
図 15: WebClass 取り込み例 (第 1 章)

6) 田崎 潔志, 深見 空斗, 松永 智揮, 天野 善一,
藤田 毅, 論文作成のためのウェブコラボレーションシステム, 九州産業大学工学部研究報
告, 42, pp.97–102(2005).

7) WebClass, http://www.webclass.co.jp/ .
8) A. V. エイホ, B. W. カーニハン, P. J. ワインバーガー, 足達 高徳 (訳), プログラミング
言語 AWK, トッパン (1989).

図 16: WebClass 取り込み例 (第 1 章 第 1 節)

68