1 |
// Feeping Creaturism |
2 |
// |
3 |
// Douglas Thrift |
4 |
// |
5 |
// $Id$ |
6 |
|
7 |
#include "Jargon.hpp" |
8 |
|
9 |
Jargon::Jargon(const ext::String& path, bool include) : include(include) |
10 |
{ |
11 |
std::vector<std::string> args(1, FeepingCreaturism::program); |
12 |
|
13 |
args.push_back(path); |
14 |
args.push_back("jargon.xsl"); |
15 |
|
16 |
redi::pstreambuf pin("/usr/local/bin/Xalan", args, std::ios_base::in); |
17 |
ios::FromStreamBuf adaptor(pin); |
18 |
|
19 |
ext::Handle<xml::Document> document(xml::Parse(adaptor)); |
20 |
ext::Handle<xml::Node> jargon(*document/"jargon"); |
21 |
|
22 |
word = *jargon/"word"; |
23 |
pronunciation = *jargon/"pronunciation"; |
24 |
grammar = *jargon/"grammar"; |
25 |
definition = *jargon/"definition"/"p"; |
26 |
} |
27 |
|
28 |
void Jargon::display(ios::PrintWriter& pout, xml::TextWriter& xhtml) const |
29 |
{ |
30 |
{ |
31 |
xml::ScopeElement p(xhtml, "p"); |
32 |
|
33 |
xhtml.OpenElement("strong"); |
34 |
xhtml.OutputText(word + ":"); |
35 |
xhtml.CloseElement(); |
36 |
|
37 |
if (!pronunciation.IsEmpty()) xhtml.OutputText(" " + pronunciation); |
38 |
if (!pronunciation.IsEmpty() && !grammar.IsEmpty()) xhtml.OutputText(","); |
39 |
if (!grammar.IsEmpty()) xhtml.OutputText(" " + grammar); |
40 |
} |
41 |
|
42 |
for (xml::NodeSet::ConstIterator node(definition.Begin()); |
43 |
node != definition.End(); ++node) |
44 |
{ |
45 |
xml::ScopeElement p(xhtml, "p"); |
46 |
|
47 |
xhtml.OutputText(**node); |
48 |
} |
49 |
} |
50 |
|
51 |
struct Section |
52 |
{ |
53 |
Section(const ext::String& name, const ext::String& path, |
54 |
const ext::String& subdomain = "www") : name(name), url("http://" |
55 |
+ subdomain + ".douglasthrift.net" + path) {} |
56 |
ext::String name, url; |
57 |
}; |
58 |
|
59 |
ios::PrintWriter& operator<<(ios::PrintWriter& pout, const Jargon& jargon) |
60 |
{ |
61 |
if (jargon.include) |
62 |
{ |
63 |
xml::TextWriter xhtml(pout); |
64 |
|
65 |
jargon.display(pout, xhtml); |
66 |
|
67 |
return pout; |
68 |
} |
69 |
|
70 |
pout << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" |
71 |
<< "\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"; |
72 |
|
73 |
xml::TextWriter xhtml(pout); |
74 |
xml::ScopeElement html(xhtml, "html"); |
75 |
|
76 |
xhtml.SetAttribute("xmlns", "http://www.w3.org/1999/xhtml"); |
77 |
|
78 |
{ |
79 |
xml::ScopeElement head(xhtml, "head"); |
80 |
|
81 |
xhtml.OpenElement("title"); |
82 |
xhtml.OutputText("Douglas Thrift"); |
83 |
|
84 |
pout << "'"; |
85 |
|
86 |
xhtml.OutputText("s Computers Website | Jargon: " + jargon.word); |
87 |
xhtml.CloseElement(); |
88 |
xhtml.OpenElement("link"); |
89 |
xhtml.SetAttribute("rel", "stylesheet"); |
90 |
xhtml.SetAttribute("href", "../../stylesheets/regular.css"); |
91 |
xhtml.SetAttribute("type", "text/css"); |
92 |
xhtml.CloseElement(); |
93 |
xhtml.OpenElement("link"); |
94 |
xhtml.SetAttribute("rel", "Icon"); |
95 |
xhtml.SetAttribute("href", "../../favicon.ico"); |
96 |
xhtml.SetAttribute("type", "image/ico"); |
97 |
xhtml.CloseElement(); |
98 |
xhtml.OpenElement("script"); |
99 |
xhtml.SetAttribute("src", "../../nav/functions.js"); |
100 |
xhtml.SetAttribute("type", "text/javascript"); |
101 |
xhtml.OutputText(""); |
102 |
xhtml.CloseElement(); |
103 |
} |
104 |
|
105 |
{ |
106 |
xml::ScopeElement body(xhtml, "body"); |
107 |
|
108 |
{ |
109 |
xml::ScopeElement div(xhtml, "div"); |
110 |
|
111 |
xhtml.OpenElement("p"); |
112 |
xhtml.SetAttribute("class", "center"); |
113 |
xhtml.OpenElement("a"); |
114 |
xhtml.SetAttribute("href", Section("", "/", "computers").url); |
115 |
xhtml.OpenElement("img"); |
116 |
xhtml.SetAttribute("src", "../../masthead.png"); |
117 |
xhtml.SetAttribute("alt", "Douglas Thrift's Computers Website"); |
118 |
xhtml.SetAttribute("title", "Douglas Thrift's Computers Website"); |
119 |
xhtml.CloseElement(); |
120 |
xhtml.CloseElement(); |
121 |
xhtml.CloseElement(); |
122 |
xhtml.OpenElement("p"); |
123 |
xhtml.SetAttribute("class", "center nav"); |
124 |
|
125 |
std::vector<Section> sections; |
126 |
|
127 |
sections.push_back(Section("Home", "/")); |
128 |
sections.push_back(Section("Blog", "/blog/")); |
129 |
sections.push_back(Section("Computers", "/", "computers")); |
130 |
sections.push_back(Section("Movies", "/", "movies")); |
131 |
sections.push_back(Section("Music", "/", "music")); |
132 |
sections.push_back(Section("TV Shows", "/", "tvshows")); |
133 |
sections.push_back(Section("Sitemap", "/sitemap.xml")); |
134 |
sections.push_back(Section("Contact", "/contact.php")); |
135 |
sections.push_back(Section("Linking", "/linking.xml")); |
136 |
sections.push_back(Section("Search", "/search.cgi")); |
137 |
|
138 |
for (std::vector<Section>::size_type index(0); |
139 |
index < sections.size(); ++index) |
140 |
{ |
141 |
if (index > 0) xhtml.OutputText(" | "); |
142 |
|
143 |
xhtml.OpenElement("a"); |
144 |
xhtml.SetAttribute("href", sections[index].url); |
145 |
|
146 |
if (index != 2) |
147 |
{ |
148 |
xhtml.SetAttribute("onmouseout", "deselect(" |
149 |
+ lexical_cast<ext::String>(index + 1) + ")"); |
150 |
xhtml.SetAttribute("onmouseover", "select(" |
151 |
+ lexical_cast<ext::String>(index + 1) + ")"); |
152 |
xhtml.SetAttribute("class", "nav"); |
153 |
} |
154 |
else xhtml.SetAttribute("class", "nav select"); |
155 |
|
156 |
xhtml.OutputText(sections[index].name); |
157 |
xhtml.CloseElement(); |
158 |
} |
159 |
|
160 |
xhtml.CloseElement(); |
161 |
} |
162 |
|
163 |
{ |
164 |
xml::ScopeElement div(xhtml, "div"); |
165 |
|
166 |
xhtml.SetAttribute("class", "hr"); |
167 |
xhtml.OpenElement("h1"); |
168 |
xhtml.SetAttribute("id", "title"); |
169 |
xhtml.SetAttribute("class", "center"); |
170 |
xhtml.OutputText("Jargon: " + jargon.word); |
171 |
xhtml.CloseElement(); |
172 |
} |
173 |
|
174 |
{ |
175 |
xml::ScopeElement div(xhtml, "div"); |
176 |
|
177 |
xhtml.SetAttribute("class", "hr"); |
178 |
jargon.display(pout, xhtml); |
179 |
} |
180 |
|
181 |
{ |
182 |
xml::ScopeElement div(xhtml, "div"); |
183 |
|
184 |
xhtml.SetAttribute("class", "hr"); |
185 |
xhtml.OpenElement("p"); |
186 |
xhtml.SetAttribute("class", "center"); |
187 |
xhtml.OutputText("Copyright "); pout << "©"; // XXX hmm? |
188 |
xhtml.OutputText(" 2002-2004, "); |
189 |
xhtml.OpenElement("a"); |
190 |
xhtml.SetAttribute("href", Section("", "/contact.php").url); |
191 |
xhtml.OutputText("Douglas Thrift"); |
192 |
xhtml.CloseElement(); |
193 |
xhtml.OutputText(". All Rights Reserved."); |
194 |
xhtml.CloseElement(); |
195 |
xhtml.OpenElement("p"); |
196 |
xhtml.SetAttribute("class", "center"); |
197 |
xhtml.OutputText(""); |
198 |
|
199 |
pout << "<a href=\"http://validator.w3.org/check/referer\">"; |
200 |
|
201 |
{ |
202 |
xml::ScopeElement img(xhtml, "img"); |
203 |
|
204 |
xhtml.SetAttribute("src", "../../w3c_images/vxh10.png"); |
205 |
xhtml.SetAttribute("alt", "Valid XHTML 1.0!"); |
206 |
xhtml.SetAttribute("title", "Valid XHTML 1.0!"); |
207 |
} |
208 |
|
209 |
pout << "</a> <a href=\"http://jigsaw.w3.org/css-validator/check" |
210 |
<< "/referer\">"; |
211 |
|
212 |
{ |
213 |
xml::ScopeElement img(xhtml, "img"); |
214 |
|
215 |
xhtml.SetAttribute("src", "../../w3c_images/vcss.png"); |
216 |
xhtml.SetAttribute("alt", "Valid CSS!"); |
217 |
xhtml.SetAttribute("title", "Valid CSS!"); |
218 |
} |
219 |
|
220 |
pout << "</a>"; |
221 |
|
222 |
xhtml.CloseElement(); |
223 |
} |
224 |
} |
225 |
|
226 |
return pout; |
227 |
} |