ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/SiteMapper/SiteMapper.cpp
Revision: 156
Committed: 2004-06-10T01:24:32-07:00 (21 years ago) by Douglas Thrift
File size: 4585 byte(s)
Log Message:
Added output.

File Contents

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

Properties

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