require: "pretty.atomo"
require: "util.atomo"
(a: A) evaluate: (e: Expression) :=
a environment evaluate: e
-- various semantic helpers
A bold: s := s in-tag: "strong"
A italic: s := s in-tag: "em"
A underline: s := s in-tag: "span style=\"text-decoration: underline\""
A code: (s: String) := s escape in-tag: "code"
A list: s := s in-tag: "ul"
A numbered-list: s := s in-tag: "ol"
A item: s := s in-tag: "li"
A definitions: s := s in-tag: "dl"
A item: s is: v := (s in-tag: "dt") .. (v in-tag: "dd")
A verbatim: (s: String) :=
s escape in-tag: "pre class=\"verbatim\""
-- annotated source code
(a: A) heading: (h: String) :=
"
" .. h .. " | |
"
(a: A) row: (s: String) :=
"" .. s .. " | |
"
(a: A) row: (s: String) is: (c: String) :=
"" .. s .. " | " .. (a atomo: c) .. " |
"
(a: A) row: (s: String) is: (c: String) on: target :=
"" .. s .. " | " .. (a atomo: c on: target) .. " |
"
-- external link
(a: A) link: name to: (url: Expression) := a link: name to: (a evaluate: url)
(a: A) link: (name: Expression) to: url := a link: (a evaluate: name) to: url
A link: (name: String) to: (url: String) :=
name in-tag: ("a href=\"" .. url .. "\" class=\"external\"")
-- pretty-printing a single expr, inline
(a: A) hl: (e: Expression) :=
a hl: (a evaluate: e)
(a: A) hl: (s: String) :=
(a highlight: s) in-tag: "code"
-- pretty-printing a block of code
(a: A) atomo: (s: String) on: (t: Expression) :=
a atomo: s on: (a evaluate: t)
(a: A) atomo: (s: String) on: env :=
{ do-input: s in: env
a atomo: s
} call
-- example interaction session
(a: A) example: (s: String) :=
a example: s on: Lobby clone
(a: A) example: (s: String) on: (t: Expression) :=
a example: s on: (a evaluate: t)
(a: A) example: (s: String) on: env :=
("Example:" .. (a interaction: s on: env))
in-tag: "div class=\"example\""
-- example interaction session
(a: A) example-segment: (s: String) :=
("Example:" .. (a atomo: s))
in-tag: "div class=\"example\""
-- a REPL simulator
(a: A) interaction: (s: String) :=
a interaction: s on: Lobby clone
-- a REPL simulator locked into an environment
(a: A) interaction: (s: String) on: (t: Expression) :=
a interaction: s on: (a evaluate: t)
(a: A) interaction: (s: String) on: env :=
{ ("interaction: " .. s show) print
log = s lines (map: { e |
output = String-Port new do: {
display: s :=
{ output contents = output contents .. s (as: String) escape
s
} call
}
error = String-Port new do: {
display: s :=
{ error contents = error contents .. (s as: String)
output contents = output contents .. (s (as: String) escape type: "gr")
s
} call
}
res = {
with: [
value-output? -> True
*error-output* -> error
] do: {
with-output-to: output do: {
a highlight: (do-input: e in: env) show
}
}
} catch: { e |
("ERROR: " .. (a highlight: e show)) type: "gr"
}
[ ">" type: "caret"
" "
a highlight: e
"\n"
output contents
res
"\n"
] join
}) join
log in-tag: "pre class=\"interaction\""
} call
evaluate-all: [] in: _ := error: @no-expressions
evaluate-all: [e] in: t := t evaluate: e
evaluate-all: (e . es) in: t :=
{ t evaluate: e
evaluate-all: es in: t
} call
do-input: (s: String) in: env :=
s parse-expressions match: {
[] -> @undefined
es -> evaluate-all: (es map: @expand) in: env
}