--- /dev/null
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+ <t:title>Search results for '<t:label t:name="search"/>'</t:title>
+
+ <div class="description">
+ <ul>
+ <t:bind-each t:name="results">
+ <li>
+ <t:a t:href="$wiki/view" t:rest="title"><t:label t:name="title"/></t:a>
+ </li>
+ </t:bind-each>
+ </ul>
+ </div>
+
+ <t:if t:value="empty">
+ <p>No results found!</p>
+ </t:if>
+
+</t:chloe>
<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
- <t:atom t:href="$wiki/changes.atom">
- Recent Changes
- </t:atom>
+ <t:atom t:href="$wiki/changes.atom">
+ Recent Changes
+ </t:atom>
- <t:style t:include="resource:extra/webapps/wiki/wiki.css" />
+ <t:style t:include="resource:extra/webapps/wiki/wiki.css" />
<nav>
<t:if t:value="contents">
<t:button t:action="$login-realm/logout" t:aside="begin" class="link-button link">Logout</t:button>
</t:if>
+
+ <t:form t:method="get" t:action="$wiki/search" style="display: inline;">
+ <input placeholder="Search" name="search" type="text"/>
+ <input type="submit" value="Go"/>
+ </t:form>
</nav>
<div class="page">
USING: accessors calendar db.tuples db.types farkup
furnace.actions furnace.auth furnace.boilerplate
furnace.recaptcha furnace.redirection furnace.syndication
-furnace.utilities html.forms http.server.dispatchers
+furnace.utilities html.forms http.server http.server.dispatchers
http.server.static kernel lcs make namespaces present random
-sequences sorting splitting urls validators ;
+regexp sequences simple-tokenizer sorting splitting unicode urls
+validators ;
IN: webapps.wiki
: wiki-url ( rest path -- url )
{ wiki "articles" } >>template ;
+: <search-articles-action> ( -- action )
+ <page-action>
+
+ [
+ "search" param [ unicode:blank? ] trim
+ dup "search" set-value
+
+ [ f ] [
+ tokenize [
+ " " "\s+" replace "\\b" dup surround
+ "i" <optioned-regexp>
+ ] map
+ ] if-empty
+
+ [ f ] [
+ f <article> select-tuples
+ [ title>> ] sort-with
+ [ revision>> <revision> select-tuple ] map
+ swap '[ content>> _ [ first-match ] with all? ] filter
+ ] if-empty
+
+ [ "results" set-value ]
+ [ not "empty" set-value ] bi
+ ] >>init
+
+ { wiki "search" } >>template ;
+
: list-user-edits ( -- seq )
f <revision> "author" value >>author select-tuples
reverse-chronological-order ;
<rollback-action> "rollback" add-responder
<user-edits-action> "user-edits" add-responder
<list-articles-action> "articles" add-responder
+ <search-articles-action> "search" add-responder
<list-changes-action> "changes" add-responder
<user-edits-feed-action> "user-edits.atom" add-responder
<list-changes-feed-action> "changes.atom" add-responder