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

# Content
1 // Site Mapper
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #ifdef _WIN32
8 #pragma warning(disable:4503)
9 #endif
10
11 #include "SiteMapper.hpp"
12 #include "Matcher.hpp"
13 #include "Page.hpp"
14
15 string program;
16 bool debug(false);
17
18 int main(int argc, char* argv[])
19 {
20 program = argv[0];
21
22 string siteIndex, siteMap;
23
24 for (int index(1); index < argc; index++)
25 {
26 string arg(argv[index]);
27 Matcher matcher;
28
29 if (arg == matcher("^-index=(.*)$"))
30 {
31 siteIndex = matcher[1];
32 }
33 else if (arg == matcher("^-map=(.*)$"))
34 {
35 siteMap = matcher[1];
36 }
37 else if (arg == "-D")
38 {
39 if (!debug) debug = true;
40 }
41 }
42
43 if (siteIndex != "" && siteMap != "")
44 {
45 SiteMapper mapper(siteIndex, siteMap);
46 }
47 else
48 {
49 cout << "Usage: " << program << " -index=index -map=map [-D]\n";
50 }
51
52 return 0;
53 }
54
55 SiteMapper::SiteMapper(const string& siteIndex, const string& siteMap)
56 {
57 oldMap(siteMap);
58 newIndex(siteIndex);
59 newMap(siteMap);
60 }
61
62 void SiteMapper::oldMap(const string& siteMap)
63 {
64 ext::Handle<xml::Document> document(xml::Parse(siteMap));
65 ext::Handle<xml::Node> list(*document/"page"/"section"/"list");
66
67 comment = *document/"comment()";
68
69 oldMap(pages, list);
70 }
71
72 void SiteMapper::oldMap(vector<Page>& pages, xml::Node* list)
73 {
74 xml::NodeSet nodes(*list/"item");
75
76 for (xml::NodeSet::Iterator node(nodes.Begin()); node != nodes.End();
77 ++node)
78 {
79 string url(**node/"link"/"@address"), title(**node/"link");
80 Page page(url, title);
81 ext::Handle<xml::Node> list(**node/"list");
82
83 if (!list.IsEmpty()) oldMap(page.getChildren(), list);
84
85 pages.push_back(page);
86 }
87 }
88
89 void SiteMapper::newIndex(const string& siteIndex)
90 {
91 ext::Handle<xml::Document> document(xml::Parse(siteIndex));
92 xml::NodeSet nodes(*document/"index"/"page");
93
94 for (xml::NodeSet::Iterator node(nodes.Begin()); node != nodes.End();
95 ++node)
96 {
97 string address(**node/"address");
98 string port(**node/"port");
99
100 if (!port.empty())
101 {
102 address += ':' + port;
103 }
104
105 string path(**node/"path"), title(**node/"title");
106 Page page(address, path, title);
107 Matcher matcher;
108
109 if (page == matcher(string("^Douglas\\sThrift's\\sWebsite\\s\\|\\sDou")
110 + "glas\\sThrift's\\sBlog:\\s(.+)$"))
111 {
112 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 page.setTitle(matcher[1]);
123
124 if (newIndex(pages, page)) continue;
125 }
126 else continue;
127
128 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 }
134 }
135
136 bool SiteMapper::newIndex(vector<Page>& pages, Page& page)
137 {
138 for (unsigned index(0); index < pages.size(); ++index)
139 {
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 void SiteMapper::newMap(const string& siteMap)
171 {
172 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 << "<!--" << comment << "-->\n"
179 << "<page>\n"
180 << "\t<title>Sitemap</title>\n"
181 << "\t<section>\n"
182 << "\t\t<list>\n";
183
184 for (unsigned index(0); index < pages.size(); ++index)
185 {
186 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 fout << pages[index](3) << '\n';
193 }
194
195 fout << "\t\t</list>\n"
196 << "\t</section>\n"
197 << "</page>\n";
198
199 fout.close();
200 }
201
202 void SiteMapper::newMap(vector<Page>& pages, const string& childOf,
203 multimap<string, Page>& newPages)
204 {
205 for (unsigned index(0); index < pages.size(); ++index)
206 {
207 newMap(pages[index].getChildren(), pages[index].getPath(), newPages);
208 }
209
210 for (multimap<string, Page>::iterator itor(newPages.lower_bound(childOf));
211 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