ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/SiteMapper/SiteMapper.cpp
Revision: 154
Committed: 2004-06-04T02:40:33-07:00 (21 years ago) by Douglas Thrift
File size: 4531 byte(s)
Log Message:
Goodbye Xalan and Xerces, hello Jay's hot operator overloaded XPath!

File Contents

# User Rev Content
1 Douglas Thrift 126 // Site Mapper
2     //
3     // Douglas Thrift
4     //
5     // $Id$
6    
7 Douglas Thrift 143 #ifdef _WIN32
8     #pragma warning(disable:4503)
9     #endif
10    
11 Douglas Thrift 126 #include "SiteMapper.hpp"
12     #include "Matcher.hpp"
13 Douglas Thrift 128 #include "Page.hpp"
14 Douglas Thrift 126
15 Douglas Thrift 128 string program;
16 Douglas Thrift 152 bool debug(false);
17 Douglas Thrift 128
18 Douglas Thrift 126 int main(int argc, char* argv[])
19     {
20 Douglas Thrift 128 program = argv[0];
21 Douglas Thrift 132
22 Douglas Thrift 126 string siteIndex, siteMap;
23    
24 Douglas Thrift 152 for (int index(1); index < argc; index++)
25 Douglas Thrift 126 {
26 Douglas Thrift 128 string arg(argv[index]);
27     Matcher matcher;
28 Douglas Thrift 126
29 Douglas Thrift 128 if (arg == matcher("^-index=(.*)$"))
30     {
31     siteIndex = matcher[1];
32     }
33     else if (arg == matcher("^-map=(.*)$"))
34     {
35     siteMap = matcher[1];
36     }
37 Douglas Thrift 133 else if (arg == "-D")
38     {
39     if (!debug) debug = true;
40     }
41 Douglas Thrift 126 }
42    
43 Douglas Thrift 128 if (siteIndex != "" && siteMap != "")
44 Douglas Thrift 132 {
45 Douglas Thrift 128 SiteMapper mapper(siteIndex, siteMap);
46     }
47     else
48     {
49 Douglas Thrift 133 cout << "Usage: " << program << " -index=index -map=map [-D]\n";
50 Douglas Thrift 128 }
51 Douglas Thrift 129
52 Douglas Thrift 126 return 0;
53     }
54    
55     SiteMapper::SiteMapper(const string& siteIndex, const string& siteMap)
56     {
57 Douglas Thrift 133 oldMap(siteMap);
58 Douglas Thrift 142 newIndex(siteIndex);
59 Douglas Thrift 134 newMap(siteMap);
60 Douglas Thrift 133 }
61    
62     void SiteMapper::oldMap(const string& siteMap)
63     {
64 Douglas Thrift 154 ext::Handle<xml::Document> document(xml::Parse(siteMap));
65     ext::Handle<xml::Node> list(*document/"page"/"section"/"list");
66 Douglas Thrift 133
67 Douglas Thrift 154 comment = *document/"comment()";
68 Douglas Thrift 133
69 Douglas Thrift 137 oldMap(pages, list);
70 Douglas Thrift 133 }
71    
72 Douglas Thrift 154 void SiteMapper::oldMap(vector<Page>& pages, xml::Node* list)
73 Douglas Thrift 135 {
74 Douglas Thrift 154 xml::NodeSet nodes(*list/"item");
75 Douglas Thrift 135
76 Douglas Thrift 154 for (xml::NodeSet::Iterator node(nodes.Begin()); node != nodes.End();
77     ++node)
78 Douglas Thrift 135 {
79 Douglas Thrift 154 string url(**node/"link"/"@address"), title(**node/"link");
80     Page page(url, title);
81     ext::Handle<xml::Node> list(**node/"list");
82 Douglas Thrift 141
83 Douglas Thrift 154 if (!list.IsEmpty()) oldMap(page.getChildren(), list);
84 Douglas Thrift 135
85     pages.push_back(page);
86     }
87     }
88    
89 Douglas Thrift 142 void SiteMapper::newIndex(const string& siteIndex)
90 Douglas Thrift 133 {
91 Douglas Thrift 154 ext::Handle<xml::Document> document(xml::Parse(siteIndex));
92     xml::NodeSet nodes(*document/"index"/"page");
93 Douglas Thrift 138
94 Douglas Thrift 154 for (xml::NodeSet::Iterator node(nodes.Begin()); node != nodes.End();
95     ++node)
96 Douglas Thrift 138 {
97 Douglas Thrift 154 string address(**node/"address");
98     string port(**node/"port");
99 Douglas Thrift 139
100 Douglas Thrift 154 if (!port.empty())
101 Douglas Thrift 139 {
102 Douglas Thrift 154 address += ':' + port;
103 Douglas Thrift 139 }
104    
105 Douglas Thrift 154 string path(**node/"path"), title(**node/"title");
106     Page page(address, path, title);
107 Douglas Thrift 142 Matcher matcher;
108 Douglas Thrift 140
109 Douglas Thrift 142 if (page == matcher(string("^Douglas\\sThrift's\\sWebsite\\s\\|\\sDou")
110     + "glas\\sThrift's\\sBlog:\\s(.+)$"))
111 Douglas Thrift 140 {
112 Douglas Thrift 142 if (Matcher("^\\w+\\s\\d\\d\\d\\d\\sArchives$") == matcher[1])
113     {
114     page.setTitle(matcher[1]);
115    
116     if (newIndex(pages, page)) continue;
117     }
118     else continue;
119     }
120     else if (page == matcher("^Douglas\\sThrift's.+Website\\s\\|\\s(.+)$"))
121     {
122 Douglas Thrift 140 page.setTitle(matcher[1]);
123    
124 Douglas Thrift 142 if (newIndex(pages, page)) continue;
125 Douglas Thrift 140 }
126 Douglas Thrift 142 else continue;
127    
128 Douglas Thrift 143 multimap<string, Page> items;
129    
130     newPages.insert(pair<string, multimap<string, Page>
131     >(page.getAddress(), items)).first->second.insert(pair<string,
132     Page>(page.getChildOf(), page));
133 Douglas Thrift 138 }
134 Douglas Thrift 126 }
135 Douglas Thrift 133
136 Douglas Thrift 142 bool SiteMapper::newIndex(vector<Page>& pages, Page& page)
137     {
138 Douglas Thrift 153 for (unsigned index(0); index < pages.size(); ++index)
139 Douglas Thrift 142 {
140     if (pages[index] == page.getAddress())
141     {
142     Matcher matcher;
143    
144     if (pages[index] == page)
145     {
146     page.setChildren(pages[index].getChildren());
147    
148     pages[index] = page;
149    
150     return true;
151     }
152     else if (matcher('^' + pages[index].getPath()) == page)
153     {
154     page.setChildOf(matcher[0]);
155    
156     if (matcher('^' + pages[index].getTitle() + "\\s\\|\\s(.+)$")
157     == page)
158     {
159     page.setTitle(matcher[1]);
160     }
161    
162     return newIndex(pages[index].getChildren(), page);
163     }
164     }
165     }
166    
167     return false;
168     }
169    
170 Douglas Thrift 133 void SiteMapper::newMap(const string& siteMap)
171     {
172 Douglas Thrift 144 ofstream fout(siteMap.c_str());
173    
174     fout << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
175     << "<?xml-stylesheet type=\"text/xsl\" href=\"stylesheets/sitemap.xsl"
176     << "\"?>\n"
177     << "<!DOCTYPE page SYSTEM \"stylesheets/page.dtd\">\n"
178 Douglas Thrift 154 << "<!--" << comment << "-->\n"
179 Douglas Thrift 144 << "<page>\n"
180     << "\t<title>Sitemap</title>\n"
181     << "\t<section>\n"
182     << "\t\t<list>\n";
183    
184 Douglas Thrift 153 for (unsigned index(0); index < pages.size(); ++index)
185 Douglas Thrift 140 {
186 Douglas Thrift 143 if (newPages.find(pages[index].getAddress()) != newPages.end())
187     {
188     newMap(pages[index].getChildren(), pages[index].getPath(),
189     newPages.find(pages[index].getAddress())->second);
190     }
191    
192 Douglas Thrift 144 fout << pages[index](3) << '\n';
193 Douglas Thrift 140 }
194 Douglas Thrift 144
195     fout << "\t\t</list>\n"
196     << "\t</section>\n"
197     << "</page>\n";
198    
199     fout.close();
200 Douglas Thrift 133 }
201 Douglas Thrift 143
202     void SiteMapper::newMap(vector<Page>& pages, const string& childOf,
203     multimap<string, Page>& newPages)
204     {
205 Douglas Thrift 153 for (unsigned index(0); index < pages.size(); ++index)
206 Douglas Thrift 143 {
207     newMap(pages[index].getChildren(), pages[index].getPath(), newPages);
208     }
209    
210 Douglas Thrift 153 for (multimap<string, Page>::iterator itor(newPages.lower_bound(childOf));
211 Douglas Thrift 143 itor != newPages.upper_bound(childOf); itor++)
212     {
213     pages.push_back(itor->second);
214     }
215    
216     newPages.erase(childOf);
217     }

Properties

Name Value
svn:eol-style native
svn:keywords Id