1 |
<%@ page import="java.io.*, java.util.*, org.openisis.*" |
2 |
session="false" |
3 |
%><%! |
4 |
// need at least Field.html |
5 |
static File _dir ; // have no reliable ServletConfig before init |
6 |
static long timestamp; |
7 |
static String[] files; |
8 |
static synchronized void refresh ( ServletContext a ) throws IOException { |
9 |
if ( null == _dir ) |
10 |
_dir = new File( a.getRealPath("doc") ); |
11 |
files = _dir.list( new FilenameFilter() { |
12 |
public boolean accept( File _dir, String name ) { |
13 |
return name.endsWith( ".txt" ); |
14 |
} |
15 |
} ); |
16 |
Arrays.sort( files ); |
17 |
timestamp = _dir.lastModified(); |
18 |
} |
19 |
|
20 |
// mini wiki-style doc |
21 |
static String mikidoc ( Writer o, BufferedReader in ) |
22 |
throws IOException |
23 |
{ |
24 |
String notes = null; |
25 |
String l; |
26 |
boolean inli = false; |
27 |
boolean br = false; // break on any line |
28 |
boolean code = false; // code mode |
29 |
while ( null != (l = in.readLine()) ) { |
30 |
int len = l.length(); |
31 |
boolean isli = false; |
32 |
char c = 0 == len ? 0 : l.charAt(0); |
33 |
int tab = 1 < len && '\t' == l.charAt(1) ? 2 : 1; |
34 |
if ( code && '$' != c ) |
35 |
l = Field.html( l ); |
36 |
else switch( c ) { |
37 |
case 0: |
38 |
l = "<br>"; |
39 |
break; |
40 |
case '$': // toggle code |
41 |
l = (code = !code) ? "<pre>" : "</pre>"; |
42 |
break; |
43 |
case '*': // head |
44 |
String bg = "#CCCCCC"; |
45 |
String anchor = ""; |
46 |
if ( 1==tab && 2 < len && ' ' != l.charAt(1) ) { /* make anchor */ |
47 |
int i = l.indexOf( '\t' ); |
48 |
if ( 1 < i ) { |
49 |
tab = i+1; |
50 |
anchor = "<a name=\""+l.substring(1,i)+"\"> </a>"; |
51 |
} |
52 |
} |
53 |
l = "</td></tr><tr><td bgcolor=\""+bg+"\"><b>" |
54 |
+anchor+l.substring(tab) |
55 |
+"</b></td></tr><tr><td align=\"justify\">"; |
56 |
break; |
57 |
case '-': |
58 |
if ( l.startsWith("---") ) { // rule |
59 |
l = "<hr>"; |
60 |
break; // rule :) |
61 |
} |
62 |
// new list item |
63 |
l = (inli ? "</li>" : "<ul>") + "<li>" + l.substring(tab); |
64 |
if ( 40 > len ) // break after short heading |
65 |
l += "<br>"; |
66 |
isli = true; |
67 |
break; |
68 |
case '\t': // indented |
69 |
isli = inli; // continue list item, if any |
70 |
if ( 1 == len ) |
71 |
l = "\t<br>"; |
72 |
break; |
73 |
case '>': // link |
74 |
isli = inli; // dont't break lists on links |
75 |
int t = l.indexOf('\t',tab); |
76 |
String ref, name; |
77 |
if ( 0 > t ) |
78 |
ref = name = l.substring(tab).trim(); |
79 |
else { |
80 |
ref = l.substring(tab,t).trim(); |
81 |
name = l.substring(t+1).trim(); |
82 |
} |
83 |
l = "<a href=\""+ref+"\">"+name+"</a>"; |
84 |
break; |
85 |
case '.': |
86 |
if ( l.startsWith("...") ) { // continued |
87 |
notes = l.substring(3).trim(); |
88 |
continue; |
89 |
} |
90 |
break; |
91 |
case '!': // pre |
92 |
br = true; |
93 |
case ';': // comment |
94 |
continue; |
95 |
} |
96 |
if ( inli && !isli ) |
97 |
o.write( "</ul>" ); |
98 |
o.write( l ); |
99 |
if ( br && ! l.endsWith( "<br>" ) ) |
100 |
o.write( "<br>\n" ); |
101 |
else |
102 |
o.write( '\n' ); |
103 |
inli = isli; |
104 |
} |
105 |
return notes; |
106 |
} |
107 |
|
108 |
static String mikidoc ( Writer o, String file ) |
109 |
throws IOException |
110 |
{ |
111 |
file = _dir+File.separator+file; |
112 |
try { |
113 |
return mikidoc( o, new BufferedReader( new InputStreamReader( |
114 |
new FileInputStream( file ) ) ) ); |
115 |
} catch (IOException e) { |
116 |
o.write( "<!-- schnurps -->" ); |
117 |
} |
118 |
return null; |
119 |
} |
120 |
|
121 |
%><% |
122 |
if ( null == _dir || timestamp != _dir.lastModified() ) |
123 |
refresh( application ); |
124 |
|
125 |
String right = null; |
126 |
String file = request.getParameter("file")+".txt"; |
127 |
boolean sides = null == request.getParameter("print"); |
128 |
String name = ""; |
129 |
int f = files.length; |
130 |
while ( 0 < f-- && !files[f].equals(file) ) |
131 |
; |
132 |
file = 0 > f ? "OverView.txt" : files[f]; |
133 |
name = file.substring( 0, file.length()-4 ); |
134 |
%><html> |
135 |
<head> |
136 |
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> |
137 |
<title>OpenIsis - <%=name%></title> |
138 |
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> |
139 |
</head> |
140 |
<body bgcolor="#FFFFFF" |
141 |
marginwidth="0" marginheight="0" topmargin="0" leftmargin="0"> |
142 |
<% if ( sides ) { %> |
143 |
<table width="100%" cellpadding="0" cellspacing="0" |
144 |
marginwidth="0" marginheight="0" topmargin="0" leftmargin="0" border="0"> |
145 |
<tr> |
146 |
<%-- left: the index --%> |
147 |
<td valign="top" width="160"> |
148 |
<table border="0" cellspacing="5" width="100%" cols="1"> |
149 |
<tr> |
150 |
<td valign="top"> |
151 |
<% mikidoc( out, ".index" ); %> |
152 |
<hr> |
153 |
<a href="<%=name%>?print=">print</a><br> |
154 |
<a href="/doc/<%=file%>">plaintext</a> |
155 |
</td> |
156 |
</tr> |
157 |
</table> |
158 |
</td> |
159 |
<%-- middle: the content --%> |
160 |
<td valign="top"> |
161 |
<% } // sides %> |
162 |
<table border="0" cellspacing="5" width="100%" cols="1"> |
163 |
<tr> |
164 |
<td valign="top" bgcolor="#000000"><font color="#FFFFFF"><b> |
165 |
<%= name %> |
166 |
</b></font></td> |
167 |
</tr> |
168 |
<tr> |
169 |
<td align="justify"> |
170 |
<% right = mikidoc( out, file ); %> |
171 |
</td> |
172 |
</tr> |
173 |
</table> |
174 |
<% if ( sides ) { %> |
175 |
<% |
176 |
if ( null != right ) { |
177 |
%> |
178 |
<%-- right: notes --%> |
179 |
</td> |
180 |
<td valign="top" width="25%"> |
181 |
<table border="0" cellspacing="5" width="100%" cols="1"> |
182 |
<tr> |
183 |
<td valign="top" bgcolor="#000000"><font color="#FFFFFF"><b> |
184 |
<%= right %> |
185 |
</b></font></td> |
186 |
</tr> |
187 |
<tr> |
188 |
<td align="justify"> |
189 |
<% mikidoc( out, right+".txt" ); %> |
190 |
</td> |
191 |
</tr> |
192 |
</table> |
193 |
<% |
194 |
} |
195 |
%> |
196 |
</td> |
197 |
</tr> |
198 |
</table> |
199 |
<% } // sides %> |
200 |
<!-- |
201 |
$Revision: 1.6 $ last changed $Date: 2003/01/06 19:54:29 $ by $Author: kripke $ |
202 |
--> |
203 |
</body> |
204 |
</html> |