#include <iostream>
#include <iterator>
#include <string>
#include <map>
using namespace std;
/* --- src2html のアルゴリズム ---
* 変換のための辞書を作る --------------------------- [1]
* 入力がなくなるまで ------------------------------- [2]
* 入力文字を取り出す ----------------------------- [3]
* 入力文字をkeyとして検索する -------------------- [4]
* 変換辞書に登録されていたら、-------------------- [5]
* 対応するvalue(文字列)をresultにコピーする。-- [6]
* 変換の必要がないなら、 ------------------------- [7]
* そのままresultにコピーする。 ---------------- [8]
*/
template<class InputIterator, class OutputIterator>
OutputIterator
src2html(InputIterator first, InputIterator last, OutputIterator result) {
map<char,string> conv; // [1]
conv['&'] = "&";
conv['"'] = """;
conv['<'] = "<";
conv['>'] = ">";
while ( first != last ) { // [2]
char ch = *first++; // [3]
map<char,string>::iterator i = conv.find(ch); // [4]
if ( i != conv.end() ) // [5]
result = copy(i->second.begin(), i->second.end(), result); // [6]
else // [7]
*result++ = ch; // [8]
}
return result;
}
/*
* お試し: 標準入力(cin)から文字列を読み出し、HTML変換を施して
* 標準出力(cout)に出力する。
* このソースをコンパイルし、生成された src2html.exe を使って:
* src2html < src2html.cpp > src2html.html
* すれば、このソースをHTML変換したファイルsrc2html.htmlができあがる。
* Webブラウザでブラウズしてみてほしい。
*/
int main() {
ostreambuf_iterator<char> result(cout);
string pre = "<HTML><BODY><PRE>";
copy(pre.begin(), pre.end(), result);
istreambuf_iterator<char> input(cin);
istreambuf_iterator<char> last;
src2html(input, last, result);
string post = "</PRE></BODY></HTML>";
copy(post.begin(), post.end(), result);
return 0;
}