a = b + c*e a = b.add(c.multiply(e))
javac knock-off compiler espresso.
var l = new List[Color]()
("(" ~> expr <~ ")" <~ ";") ^^ DoLoop
|
A wiki provides directly editable web pages. Invented by Ward Cunningham in 1995. “Wiki wiki” is Hawaiian for “quick”. |
|
|
|
|
|
|
Wow, that's great! How can I get one? There are plenty of wikis available, but DIY is fun.
|


1: Serve pages (as normal).
2: Serve edit pages.
3: Store edited pages and serve them.

url/wiki?action=action&page=page
where
actionis eithereditorsubmit.
pageis a page name.
url/wiki?action=edit&page=poem.html
main()class Wiki {
public static void main(String args[]) {
final Map<String, String>
input = getInput(args);
final String page = input.get("page");
if (input.get("action").equals("edit"))
doEdit(page);
else
doSubmit(page, input.get("pagesource");
}
}
// and so on
}
main()import java.util.Map
import java.util.HashMap
object Wiki {
def main(args: Array[String]) {
val input = getInput(args)
val page = input.get("page")
if (input.get("action").equals("edit"))
doEdit(page)
else
doSubmit(page, input.get("pagesource")
}
// and so on
}
main() Observationsimport java.util.HashMap
val input = getInput(args)
Array's a proper class.
def main(args: Array[String]) {
object Wiki {
def main(args: Array[String]) {
class Wiki {
// blah blah blah
private static void
doEdit(String pageName) {
sendCGIResponse(makeEditPage(pageName));
}
private static void
doSubmit(String pageName, String pageSource) {
writeWikiPage(pageName, pageSource);
sendCGIResponse(makeWikiPage(pageName));
}
// blah blah blah
object Wiki {
// blah blah blah
private def
doEdit(pageName: String) {
sendCGIResponse(makeEditPage(pageName))
}
private def
doSubmit(pageName: String, pageSource: String) {
writeWikiPage(pageName, pageSource)
sendCGIResponse(makeWikiPage(pageName))
}
// blah blah blah
private def
doEdit(pageName: String) {
class EditWikiPage
extends HTMLPage
implements SafeString {
EditWikiPage(String fn) { super(fn); }
EditWikiPage() { this(""); }
public String
decontaminate(String str, Sanitizer sfun) {
// blah blah blah
}
// blah blah blah
}
class EditPageWiki(fn: String)
extends HTMLPage with SafeString {
private val filename = fn
def this() { this("") }
// blah blah blah
}
class EditWikiPage(fn: String)
/* blah blah blah */ {
private val filename = fn
def this() { this("") }
decontaminate()?
John <script> ... </script> Doe
interface SafeString {
// Return the string scrubbed of the
// dangerous constructs defined in the
// given sanitizer.
String decontaminate(
String str, Sanitizer sfun);
}
interface Sanitizer {
String scrub(String str);
}
trait SafeString {
def decontaminate(
str: String, sfun: Sanitizer) {
// blah blah blah
}
}
abstract class Sanitizer {
def scrub(str: String): String
}
SafeString trait defines, not just declares,
decontaminate().
EditWikiPage inherits it.
abstract class HTMLPage {
void process(TagTransformer f) {
List<HTMLTag> newPage =
new ArrayList<HTMLTag>();
for (HTMLTag tag: page) {
final HTMLTag newTag = f.munge(tag);
if (newTag != null)
newPage.add(newTag);
}
page = newPage;
}
}
interface TagTransformer {
HTMLTag munge(HTMLTag tag);
}
page =
page.transform(
new TagTransformer() {
public HTMLTag munge(HTMLTag tag) {
return tag.isTag("script")
? null
: tag;
}
}
);
abstract class HTMLPage {
def process(munge: HTMLTag => HTMLTag) {
var newPage: List[HTMLTag] = List()
for (tag <- page) {
val newTag = munge(tag)
if (newTag != null)
newPage = newTag :: newPage
}
page = newPage
}
}
def process(munge: HTMLTag => HTMLTag) {
val newTag = munge(tag)
var newPage: List[HTMLTag] = List()
newPage = newTag :: newPage
page = page.transform(
(tag: HTMLTag) =>
if (tag.isTag("script")) null
else tag)or
val scrub =
(tag: HTMLTag) =>
if (tag isTag "script") null else tag
page = page.transform(scrub)
val scrub =
(tag: HTMLTag) =>
if (tag isTag "script") null else tag
if (tag.isTag("script")) null else tag
if (tag isTag "script") null else tag
def process(munge: HTMLTag => HTMLTag) {
page = for (t <- page) yield munge(t)
page = for (t <- page if t != null) yield t
}
def process(munge: HTMLTag => HTMLTag) {
page =
for (t <- (for (t <- page) yield munge(t))
if t != null) yield t
}
www.scala-lang.com .
www.drmaciver.com/planetscala/ .