[Gd-chatter] r10775 - in trunk/libraries: koala/sources/examples/wiki koala/www/wiki web-framework
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Sat Jun 3 02:26:52 CEST 2006
Author: hannes
Date: Sat Jun 3 02:26:49 2006
New Revision: 10775
Added:
trunk/libraries/koala/sources/examples/wiki/admin.dylan (contents, props changed)
trunk/libraries/koala/www/wiki/admin.dsp (contents, props changed)
Modified:
trunk/libraries/koala/sources/examples/wiki/classes.dylan
trunk/libraries/koala/sources/examples/wiki/library.dylan
trunk/libraries/koala/sources/examples/wiki/parser.dylan
trunk/libraries/koala/sources/examples/wiki/wiki.dylan
trunk/libraries/koala/sources/examples/wiki/wiki.lid
trunk/libraries/koala/www/wiki/index.dsp
trunk/libraries/koala/www/wiki/recent.dsp
trunk/libraries/web-framework/library.dylan
trunk/libraries/web-framework/users.dylan
Log:
Bug: 7219
*some user management stuff
*it is now not integer-based, but symbol-based
*data structure <user> changed (slot access <integer> => <list>)
Added: trunk/libraries/koala/sources/examples/wiki/admin.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/koala/sources/examples/wiki/admin.dylan Sat Jun 3 02:26:49 2006
@@ -0,0 +1,149 @@
+module: wiki
+
+define method respond-to-post
+ (page :: <admin-page>, request :: <request>, response :: <response>)
+ if (logged-in?(request))
+ let action = as(<symbol>, get-query-value("action"));
+ if (any?(method(x) action = x end, current-user().access))
+ select (action)
+ #"undo" => undo(get-query-value("title"));
+ #"rename" => rename-page(get-query-value("oldtitle"), get-query-value("title"));
+ #"remove" => remove-page(get-query-value("title"));
+ #"change-privileges" => change-privileges();
+ end;
+ end;
+ end;
+ respond-to-get(page, request, response);
+end;
+
+define method change-privileges ()
+ //this is evil and should be done better!
+ for (user in storage(<user>))
+ for (privilege in $privileges)
+ let was = any?(method(x) x = privilege end, user.access);
+ let should-be = get-query-value(concatenate(user.username, ":", as(<string>, privilege)));
+ if (should-be & ~was)
+ user.access := pair(privilege, user.access);
+ end;
+ if (~should-be & was)
+ remove!(user.access, privilege);
+ end;
+ end;
+ end;
+end;
+define method remove-page (title)
+ save(make(<wiki-page-diff>,
+ content: "",
+ comment: "removed",
+ page-version: 0,
+ wiki-page-content: storage(<wiki-page-content>)[title]));
+ remove-key!(storage(<wiki-page-content>), title);
+end;
+
+define method rename-page (old-title, new-title)
+ let page = find-page(old-title);
+ page.page-title := new-title;
+ storage(<wiki-page-content>)[new-title] := page;
+ remove-key!(storage(<wiki-page-content>), old-title);
+ //fix backlinks
+ let comment = concatenate("Page ", old-title, " has been moved to ", new-title, ".");
+ for (ele in find-backlinks(old-title))
+ let new-version = make(<wiki-page-diff>,
+ page-version: ele.revisions.size + 1,
+ content: substring-replace(latest-text(ele),
+ concatenate("[[", old-title, "]]"),
+ concatenate("[[", new-title, "]]")),
+ comment: comment,
+ wiki-page-content: ele);
+ add!(ele.revisions, new-version);
+ end;
+ save(make(<wiki-page-diff>,
+ content: "",
+ comment: comment,
+ page-version: page.revisions.size,
+ wiki-page-content: page));
+end;
+
+//undo last change
+define method undo (title)
+ let page = find-page(title);
+ if (page)
+ let previous-version = page.revisions[page.revisions.size - 2];
+ save-page(title, previous-version.content, comment: "reverted to previous version");
+ end;
+end;
+
+define body tag privilege in wiki
+ (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+ (value :: <string>)
+ let user = *user* | current-user();
+ if (user & any?(method(x) x = as(<symbol>, value) end, user.access))
+ do-body()
+ end;
+end;
+
+
+define named-method privilege? in wiki
+ (page :: <wiki-page>, request :: <request>)
+ *user* & *privilege* & any?(method(x) x = *privilege* end, *user*.access)
+end;
+
+define constant $privileges = #(#"remove", #"rename", #"undo", #"change-privileges");
+
+define thread variable *privilege* = #f;
+
+define body tag show-privileges in wiki
+ (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+ ()
+ for (privilege in $privileges)
+ dynamic-bind(*privilege* = privilege)
+ do-body()
+ end;
+ end;
+end;
+
+define thread variable *user* = #f;
+
+define tag show-privilege in wiki
+ (page :: <wiki-page>, response :: <response>)
+ ()
+ write(output-stream(response), as(<string>, *privilege*));
+end;
+
+
+define body tag show-users in wiki
+ (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+ ()
+ for (user in storage(<user>))
+ dynamic-bind(*user* = user)
+ do-body()
+ end;
+ end;
+end;
+
+define tag show-user in wiki
+ (page :: <wiki-page>, response :: <response>)
+ ()
+ write(output-stream(response), *user*.username);
+end;
+
+define body tag show-recent-changes in wiki
+ (page :: <wiki-page>, response :: <response>, do-body :: <function>)
+ (count :: <string>)
+ let count = string-to-integer(count);
+ let done = make(<list>);
+ block(ret)
+ for (change in reverse(storage(<wiki-page-diff>)))
+ if (count = size(done))
+ ret()
+ end;
+ unless (any?(method(x) x = change.wiki-page-content end, done))
+ dynamic-bind(*change* = change)
+ do-body();
+ done := pair(change.wiki-page-content, done);
+ end;
+ end;
+ end;
+ end;
+end;
+
Modified: trunk/libraries/koala/sources/examples/wiki/classes.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/classes.dylan (original)
+++ trunk/libraries/koala/sources/examples/wiki/classes.dylan Sat Jun 3 02:26:49 2006
@@ -37,25 +37,6 @@
res;
end;
-define method remove-page (title)
- remove-key!(storage(<wiki-page-content>), title);
-end;
-
-define method rename-page (old-title, new-title)
- let page = find-page(old-title);
- storage(<wiki-page-content>)[new-title] := page;
- //XXX write a changelog entry
- remove-page(old-title);
-end;
-
-//undo last change
-define method undo (title)
- let page = find-page(title);
- if (page)
- let previous-version = page.revisions[page.revisions.size - 2];
- save-page(title, previous-version, comment: "revert to previous version");
- end;
-end;
define method save-page (title, content, #key comment = "")
let page = find-page(title);
@@ -75,3 +56,7 @@
end;
end;
+begin
+ main()
+end;
+
Modified: trunk/libraries/koala/sources/examples/wiki/library.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/library.dylan (original)
+++ trunk/libraries/koala/sources/examples/wiki/library.dylan Sat Jun 3 02:26:49 2006
@@ -18,6 +18,7 @@
use web-framework;
use xml-parser;
use collection-extensions, import: { sequence-diff };
+ use string-extensions, import: { substring-search };
//use meta;
export wiki;
end;
@@ -44,6 +45,7 @@
use storage;
use simple-xml;
use sequence-diff;
+ use substring-search;
end;
Modified: trunk/libraries/koala/sources/examples/wiki/parser.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/parser.dylan (original)
+++ trunk/libraries/koala/sources/examples/wiki/parser.dylan Sat Jun 3 02:26:49 2006
@@ -86,6 +86,7 @@
// Find next line with no leading whitespace...
let (epos, #rest xs) = regexp-position(markup, "\n\\S", start: start + 1) | markup.size;
write(out, "<pre>");
+ //XXX escape <, > and & here!
write(out, markup, start: start, end: epos);
write(out, "</pre>");
epos
Modified: trunk/libraries/koala/sources/examples/wiki/wiki.dylan
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/wiki.dylan (original)
+++ trunk/libraries/koala/sources/examples/wiki/wiki.dylan Sat Jun 3 02:26:49 2006
@@ -443,9 +443,10 @@
define tag username in wiki
(page :: <wiki-page>, response :: <response>)
()
- let session = get-session(get-request(response));
- session & write(output-stream(response),
- get-attribute(session, #"username"));
+ let user = current-user();
+ if (user)
+ write(output-stream(response), user.username);
+ end;
end;
define body tag show-index in wiki
@@ -473,7 +474,7 @@
define method respond-to-get
(page :: <diff-page>, request :: <request>, response :: <response>)
dynamic-bind (*title* = get-query-value("title"),
- *version* = string-to-integer(get-query-value("version")),
+ *version* = ignore-errors(string-to-integer(get-query-value("version"))),
*other-version* = ignore-errors(string-to-integer(get-query-value("otherversion"))) | *version* - 1)
next-method();
end;
@@ -502,10 +503,11 @@
define tag show-diff in wiki
(page :: <diff-page>, response :: <response>)
()
- let page = find-page(*title*);
- let version = *version* - 1;
- let otherversion = *other-version* - 1;
- if (version < page.revisions.size & otherversion < page.revisions.size)
+ let page = *title* & find-page(*title*);
+ let version = *version* & *version* - 1;
+ let otherversion = *other-version* & *other-version* - 1;
+ //this needs to be refactored
+ if (version & otherversion & page & version < page.revisions.size & otherversion < page.revisions.size & otherversion >= -1)
let target = split(page.revisions[version].content, separator: "\n");
let source = if (otherversion = -1) #() else split(page.revisions[otherversion].content, separator: "\n") end;
print-diffs(output-stream(response), sequence-diff(source, target), source, target);
@@ -521,7 +523,7 @@
define thread variable *change* = #f;
define body tag gen-recent-changes in wiki
- (page :: <recent-changes-page>, response :: <response>, do-body :: <function>)
+ (page :: <wiki-page>, response :: <response>, do-body :: <function>)
(count)
let count = string-to-integer(get-query-value("count") | count);
for (i from 0 below count,
@@ -555,45 +557,38 @@
end;
define tag show-change-timestamp in wiki
- (page :: <recent-changes-page>, response :: <response>)
+ (page :: <wiki-page>, response :: <response>)
()
write(output-stream(response), print-date(*change*.timestamp));
end;
define tag show-change-title in wiki
- (page :: <recent-changes-page>, response :: <response>)
+ (page :: <wiki-page>, response :: <response>)
()
write(output-stream(response), *change*.wiki-page-content.page-title);
end;
define tag show-change-version in wiki
- (page :: <recent-changes-page>, response :: <response>)
+ (page :: <wiki-page>, response :: <response>)
()
write(output-stream(response), integer-to-string(*change*.page-version));
end;
define tag show-change-author in wiki
- (page :: <recent-changes-page>, response :: <response>)
+ (page :: <wiki-page>, response :: <response>)
()
write(output-stream(response), *change*.author);
end;
define tag show-change-comment in wiki
- (page :: <recent-changes-page>, response :: <response>)
+ (page :: <wiki-page>, response :: <response>)
()
write(output-stream(response), *change*.comment);
end;
-define responder worker-responder ("/worker")
- (request, response)
- if (logged-in?(request) & current-user().access <= 23)
- let action = as(<symbol>, get-query-value("action"));
- select (action)
- #"undo" => undo(get-query-value("title"));
- #"rename" => rename-page(get-query-value("oldtitle"), get-query-value("title"));
- #"remove" => remove-page(get-query-value("title"));
- end;
- end;
+define page admin-page (<wiki-page>)
+ (url: "/wiki/admin.dsp",
+ source: "wiki/admin.dsp")
end;
define function main
@@ -607,7 +602,4 @@
start-server(config-file: config-file);
end;
-begin
- main()
-end;
Modified: trunk/libraries/koala/sources/examples/wiki/wiki.lid
==============================================================================
--- trunk/libraries/koala/sources/examples/wiki/wiki.lid (original)
+++ trunk/libraries/koala/sources/examples/wiki/wiki.lid Sat Jun 3 02:26:49 2006
@@ -2,4 +2,5 @@
files: library
parser
wiki
+ admin
classes
Added: trunk/libraries/koala/www/wiki/admin.dsp
==============================================================================
--- (empty file)
+++ trunk/libraries/koala/www/wiki/admin.dsp Sat Jun 3 02:26:49 2006
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<%dsp:taglib name="wiki"/>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>Dylan Wiki: Administration</title>
+ <link rel="stylesheet" href="/wiki/wiki.css"/>
+</head>
+
+<body>
+ <%dsp:include url="header.dsp"/>
+
+ <div id="form-notes">
+ <dsp:show-form-notes/>
+ </div>
+ <div id="content">
+ <h1>Dylan Wiki Administration</h1>
+ <wiki:privilege value="remove">
+ <form action="/wiki/admin.dsp" method="post">
+ <div id="edit">
+ <select name="title" size="10">
+ <wiki:show-index>
+ <option><wiki:show-title/></option>
+ </wiki:show-index>
+ </select>
+ <input type="hidden" name="action" value="remove">
+ <input type="submit" value="Remove">
+ </div>
+ </form>
+ </wiki:privilege>
+ <wiki:privilege value="rename">
+ <form action="/wiki/admin.dsp" method="post">
+ <div id="edit">
+ <select name="oldtitle" size="10">
+ <wiki:show-index>
+ <option><wiki:show-title/></option>
+ </wiki:show-index>
+ </select>
+ <input type="hidden" name="action" value="rename">
+ rename to <input type="text" name="title">
+ <input type="submit" value="Save"/>
+ </div>
+ </form>
+ </wiki:privilege>
+ <wiki:privilege value="undo">
+ <form action="/wiki/admin.dsp" method="post">
+ <div id="edit">
+ <select name="title" size="10">
+ <wiki:show-recent-changes count="20">
+ <option><wiki:show-change-title/></option>
+ </wiki:show-recent-changes>
+ </select>
+ <input type="hidden" name="action" value="undo">
+ <input type="submit" value="revert">
+ </div>
+ </form>
+ </wiki:privilege>
+ <wiki:privilege value="change-privileges">
+ <form action="/wiki/admin.dsp" method="post">
+ <div id="edit">
+ <table>
+ <tr>
+ <th>Username</th>
+ <wiki:show-privileges>
+ <th><wiki:show-privilege/></th>
+ </wiki:show-privileges>
+ </tr>
+ <wiki:show-users>
+ <tr>
+ <td><wiki:show-user/></td>
+ <wiki:show-privileges>
+ <td><input type="checkbox"
+ name="<wiki:show-user/>:<wiki:show-privilege/>"
+ <dsp:when test="privilege?">checked="checked"</dsp:when>/>
+ </td>
+ </wiki:show-privileges>
+ </tr>
+ </wiki:show-users>
+ </table>
+ <input type="hidden" name="action" value="change-privileges">
+ <input type="submit" value="Change privileges">
+ </div>
+ </form>
+ </wiki:privilege>
+ </div>
+ <%dsp:include url="footer.dsp"/>
+
+</body>
+</html>
Modified: trunk/libraries/koala/www/wiki/index.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/index.dsp (original)
+++ trunk/libraries/koala/www/wiki/index.dsp Sat Jun 3 02:26:49 2006
@@ -13,14 +13,6 @@
<h1>Index</h1>
<wiki:show-index>
<a href="/wiki/view.dsp?title=<wiki:show-title/>"><wiki:show-title/></a>
- <dsp:when test="admin?">
- <a href="/worker?title=<wiki:show-title/>&action=remove">remove</a>
- <form action="/worker" method="get">
- <input type="hidden" name="oldtitle" value="<wiki:show-title/>">
- <input type="hidden" name="action" value="rename">
- rename to <input type="text" name="title"><input type="submit" value="Save"/>
- </form>
- </dsp:when>
<br/>
</wiki:show-index>
</div>
Modified: trunk/libraries/koala/www/wiki/recent.dsp
==============================================================================
--- trunk/libraries/koala/www/wiki/recent.dsp (original)
+++ trunk/libraries/koala/www/wiki/recent.dsp Sat Jun 3 02:26:49 2006
@@ -3,7 +3,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dylan Wiki: Recent Changes</title>
- <link rel="stylesheet" href="/wiki/wiki.css"/>
+ <link rel="stylesheet" href="/wiki/wiki.css"/>
</head>
<body>
@@ -14,11 +14,7 @@
<h3>Recent Changes</h3>
<ul>
<wiki:gen-recent-changes count="50">
- <li><wiki:show-change-timestamp/> <a href="/wiki/view.dsp?title=<wiki:show-change-title/>&v=<wiki:show-change-version/>"><wiki:show-change-title/></a> version <wiki:show-change-version/> <a href="/wiki/diff.dsp?title=<wiki:show-change-title/>&version=<wiki:show-change-version/>">diff</a> by <wiki:show-change-author/> Comment <wiki:show-change-comment/>
- <dsp:when test="admin?">
- <a href="/worker?title=<wiki:show-change-title/>&action=undo">revert</a>
- </dsp:when>
- </li>
+ <li><wiki:show-change-timestamp/> <a href="/wiki/view.dsp?title=<wiki:show-change-title/>"><wiki:show-change-title/></a> version <wiki:show-change-version/> <a href="/wiki/diff.dsp?title=<wiki:show-change-title/>&version=<wiki:show-change-version/>">diff</a> by <wiki:show-change-author/> Comment <wiki:show-change-comment/></li>
</wiki:gen-recent-changes>
</ul>
</div>
Modified: trunk/libraries/web-framework/library.dylan
==============================================================================
--- trunk/libraries/web-framework/library.dylan (original)
+++ trunk/libraries/web-framework/library.dylan Sat Jun 3 02:26:49 2006
@@ -95,8 +95,11 @@
export <user>,
username,
password,
+ password-setter,
email,
+ email-setter,
access,
+ access-setter,
current-user,
login,
logged-in?;
Modified: trunk/libraries/web-framework/users.dylan
==============================================================================
--- trunk/libraries/web-framework/users.dylan (original)
+++ trunk/libraries/web-framework/users.dylan Sat Jun 3 02:26:49 2006
@@ -5,7 +5,7 @@
data username :: <string>;
data password :: <string>;
data email :: <string>;
- data access :: <integer> = 999;
+ data access :: <list> = make(<list>);
end;
define method initialize (user :: <user>, #rest rest, #key, #all-keys)
More information about the chatter
mailing list