// Site Mapper // // Douglas Thrift // // $Id$ #include "SiteMapper.hpp" #include "Matcher.hpp" #include "Page.hpp" string program; bool debug = false; int main(int argc, char* argv[]) { program = argv[0]; string siteIndex, siteMap; for (int index = 1; index < argc; index++) { string arg(argv[index]); Matcher matcher; if (arg == matcher("^-index=(.*)$")) { siteIndex = matcher[1]; } else if (arg == matcher("^-map=(.*)$")) { siteMap = matcher[1]; } else if (arg == "-D") { if (!debug) debug = true; } } if (siteIndex != "" && siteMap != "") { XMLPlatformUtils::Initialize(); XPathEvaluator::initialize(); SiteMapper mapper(siteIndex, siteMap); XPathEvaluator::terminate(); XMLPlatformUtils::Terminate(); } else { cout << "Usage: " << program << " -index=index -map=map [-D]\n"; } return 0; } SiteMapper::SiteMapper(const string& siteIndex, const string& siteMap) { oldMap(siteMap); index(siteIndex); newMap(siteMap); } void SiteMapper::oldMap(const string& siteMap) { XalanSourceTreeInit init; XalanSourceTreeDOMSupport support; XalanSourceTreeParserLiaison liaison(support); support.setParserLiaison(&liaison); XalanDOMString file(siteMap.c_str()); LocalFileInputSource source(file.c_str()); XalanDocument* document = liaison.parseXMLStream(source); if (document == 0) return; XPathEvaluator evaluator; XalanNode* list = evaluator.selectSingleNode(support, document, XalanDOMString("/page/section/list").c_str()); if (list == 0) return; oldMap(pages, evaluator, support, list); } void SiteMapper::oldMap(vector& pages, XPathEvaluator& evaluator, XalanSourceTreeDOMSupport& support, XalanNode* list) { NodeRefList nodes = evaluator.selectNodeList(support, list, XalanDOMString("item").c_str()); for (int index = 0; index < nodes.getLength(); index++) { XalanNode* node = nodes.item(index); cerr << "node=" << node << '\n'; ostringstream url, title; { XObjectPtr address = evaluator.evaluate(support, node, XalanDOMString("link/@address").c_str()); if (!address.null()) { url << address->str(); cerr << "url=" << url.str() << '\n'; } } { XObjectPtr link = evaluator.evaluate(support, node, XalanDOMString("link").c_str()); if (!link.null()) { title << link->str(); cerr << "title=" << title.str() << '\n'; } } Page page(url.str(), title.str()); if (title.str() == "Contact") cerr << node << '\n'; XalanNode* list = evaluator.selectSingleNode(support, node, XalanDOMString("list").c_str()); cerr << "list=" << list << '\n'; if (list != 0) oldMap(page.getChildren(), evaluator, support, list); pages.push_back(page); } } void SiteMapper::index(const string& siteIndex) { // } void SiteMapper::newMap(const string& siteMap) { // for (int index = 0; index < pages.size(); index++) { cout << pages[index] << '\n'; } }