ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/SiteMapper/SiteMapper.cpp
Revision: 303
Committed: 2004-12-12T17:58:03-08:00 (20 years, 6 months ago) by douglas
File size: 4750 byte(s)
Log Message:
Seems to almost work.

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 #include <menes-api/exename.hpp>
12 #include <menes-app/application.hpp>
13
14 ext::String program;
15 bool debug(false);
16
17 struct SiteMapperCommand : public app::Application
18 {
19 virtual int Run(const app::ArgumentList& args)
20 {
21 program = api::GetExecutablePath().GetName();
22
23 ext::String siteIndex, siteMap;
24
25 _foreach (app::ArgumentList, arg, args)
26 {
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.IsEmpty() && !siteMap.IsEmpty())
44 {
45 SiteMapper mapper(siteIndex, siteMap);
46 }
47 else
48 {
49 api::Cout << "Usage: " << program << " -index=index -map=map [-D]\n";
50 }
51
52 return 0;
53 }
54 } mapper;
55
56 SiteMapper::SiteMapper(const ext::String& siteIndex, const ext::String& siteMap)
57 {
58 oldMap(siteMap);
59 newIndex(siteIndex);
60 newMap(siteMap);
61 }
62
63 void SiteMapper::oldMap(const ext::String& siteMap)
64 {
65 ext::Handle<xml::Document> document(xml::Parse(siteMap));
66 ext::Handle<xml::Node> list(*document/"page"/"section"/"list");
67
68 comment = *document/"comment()";
69
70 if (debug) api::Cerr << "comment = " << comment << ios::NewLine;
71
72 oldMap(pages, list);
73 }
74
75 void SiteMapper::oldMap(ext::Vector<Page>& pages, xml::Node* list)
76 {
77 xml::NodeSet nodes(*list/"item");
78
79 _foreach (xml::NodeSet, node, nodes)
80 {
81 ext::String url(**node/"link"/"@address"), title(**node/"link");
82 Page page(url, title);
83 ext::Handle<xml::Node> list(**node/"list");
84
85 if (!list.IsEmpty()) oldMap(page.getChildren(), list);
86
87 pages.InsertLast(page);
88 }
89 }
90
91 void SiteMapper::newIndex(const ext::String& siteIndex)
92 {
93 ext::Handle<xml::Document> document(xml::Parse(siteIndex));
94 xml::NodeSet nodes(*document/"index"/"page");
95
96 _foreach (xml::NodeSet, node, nodes)
97 {
98 ios::String address(**node/"address");
99 ext::String port(**node/"port");
100
101 if (!port.IsEmpty()) address << ":" << port;
102
103 ext::String path(**node/"path"), title(**node/"title");
104 Page page(address, path, title);
105 Matcher matcher;
106
107 if (page == matcher("^Douglas\\sThrift's\\sWebsite\\s\\|\\sDouglas\\sThrift's\\sBlog:\\s(.+)$"))
108 {
109 if (Matcher("^\\w+\\s\\d{4}\\sArchives$") == matcher[1])
110 {
111 page.setTitle(matcher[1]);
112
113 if (newIndex(pages, page)) continue;
114 }
115 else continue;
116 }
117 else if (page == matcher("^Douglas\\sThrift's.+Website\\s\\|\\s(.+)$"))
118 {
119 page.setTitle(matcher[1]);
120
121 if (newIndex(pages, page)) continue;
122 }
123 else continue;
124
125 std::multimap<std::string, Page> items;
126
127 newPages.insert(std::pair<std::string, std::multimap<std::string, Page> >(page.getAddress(), items)).first->second.insert(std::pair<std::string, Page>(page.getChildOf(), page));
128 }
129 }
130
131 bool SiteMapper::newIndex(ext::Vector<Page>& pages, Page& page)
132 {
133 _mforeach (ext::Vector<Page>, page_, pages)
134 {
135 if (*page_ == page.getAddress())
136 {
137 Matcher matcher;
138
139 if (*page_ == page)
140 {
141 page.setChildren(page_->getChildren());
142
143 *page_ = page;
144
145 api::Cout << "Updated: " << page.getUrl() << ios::NewLine;
146
147 return true;
148 }
149 else if (matcher("^" + page_->getPath()) == page)
150 {
151 page.setChildOf(matcher[0]);
152
153 if (matcher("^" + page_->getTitle() + "\\s\\|\\s(.+)$") == page) page.setTitle(matcher[1]);
154
155 return newIndex(page_->getChildren(), page);
156 }
157 }
158 }
159
160 return false;
161 }
162
163 void SiteMapper::newMap(const ext::String& siteMap)
164 {
165 api::FileWriter file(siteMap);
166 ios::FormatWriter fout(file);
167 xml::TextWriter xml(file);
168
169 fout << ios::NewLine << "<?xml-stylesheet type=\"text/xsl\" href=\"stylesheets/sitemap.xsl\"?>" << ios::NewLine << "<!DOCTYPE page SYSTEM \"stylesheets/page.dtd\">";
170
171 xml.OutputComment(comment);
172
173 xml::ScopeElement page(xml, "page");
174
175 xml.OpenElement("title");
176 xml.OutputText("Sitemap");
177 xml.CloseElement();
178
179 xml::ScopeElement section(xml, "section"), list(xml, "list");
180
181 _mforeach (ext::Vector<Page>, page, pages)
182 {
183 if (newPages.find(page->getAddress()) != newPages.end()) newMap(page->getChildren(), page->getPath(), newPages.find(page->getAddress())->second);
184
185 xml << *page;
186 }
187 }
188
189 void SiteMapper::newMap(ext::Vector<Page>& pages, const ext::String& childOf, std::multimap<std::string, Page>& newPages)
190 {
191 _mforeach (ext::Vector<Page>, page, pages) newMap(page->getChildren(), page->getPath(), newPages);
192
193 typedef std::multimap<std::string, Page> MultiMap;
194
195 _for (MultiMap::const_iterator, itor, newPages.lower_bound(childOf), newPages.upper_bound(childOf))
196 {
197 api::Cout << "Added: " << itor->second.getUrl() << ios::NewLine;
198
199 pages.InsertLast(itor->second);
200 }
201
202 newPages.erase(childOf);
203 }

Properties

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