Bruce Eckel's Thinking in C++, 2nd Ed | Contents | Prev | Next |
//: C17:SiteMapConvert.cpp // Using strings to create a custom conversion // program that generates HTML output #include <iostream> #include <fstream> #include <string> #include <cstdlib> #include "../require.h" using namespace std; class Item { string id, url; int depth; string removeBar(string s) { if(s[0] == '|') return s.substr(1); else return s; } public: Item(string in, int& index) : depth(0) { while(in[index] == '#' && index < in.size()){ depth++; index++; } // 0 means no '#' marks were found: if(depth == 0) depth = 1; while(in[index] != '%' && index < in.size()) id += in[index++]; id = removeBar(id); index++; // Move past '%' while(in[index] != '*' && index < in.size()) url += in[index++]; url = removeBar(url); index++; // To move past '*' } string identifier() { return id; } string path() { return url; } int level() { return depth; } }; int main(int argc, char* argv[]) { requireArgs(argc, 1, "usage: SiteMapConvert inputfilename"); ifstream in(argv[1]); assure(in, argv[1]); ofstream out("plainmap.html"); string line; while(getline(in, line)) { if(line.find("<param name=\"source_file\"") != string::npos) { // Extract data of from start of sequence // until the terminating quote mark: line = line.substr(line.find("value=\"") + string("value=\"").size()); line = line.substr(0, line.find_last_of("\"")); int index = 0; while(index < line.size()) { Item item(line, index); string startLevel, endLevel; if(item.level() == 1) { startLevel = "<h1>"; endLevel = "</h1>"; } else for(int i = 0; i < item.level(); i++) for(int j = 0; j < 5; j++) out << " "; string htmlLine = "<a href=\"" + item.path() + "\">" + item.identifier() + "</a><br>"; out << startLevel << htmlLine << endLevel << endl; } break; // Out of while loop } } } ///:~