factor/extra/webapps/pastebin/pastebin.factor

117 lines
2.8 KiB
Factor
Raw Normal View History

2007-12-06 00:06:34 -05:00
USING: calendar furnace furnace.validator io.files kernel
2007-12-06 01:02:58 -05:00
namespaces sequences store http.server.responders html
math.parser rss xml.writer ;
2007-11-07 15:01:42 -05:00
IN: webapps.pastebin
TUPLE: pastebin pastes ;
: <pastebin> ( -- pastebin )
V{ } clone pastebin construct-boa ;
2007-12-06 00:06:34 -05:00
TUPLE: paste
summary author channel mode contents date
annotations n ;
2007-11-07 15:01:42 -05:00
2007-12-06 00:06:34 -05:00
: <paste> ( summary author channel mode contents -- paste )
f V{ } clone f paste construct-boa ;
2007-11-07 15:01:42 -05:00
2007-12-06 00:06:34 -05:00
TUPLE: annotation summary author mode contents ;
2007-11-07 15:01:42 -05:00
C: <annotation> annotation
SYMBOL: store
"pastebin.store" resource-path load-store store set-global
<pastebin> \ pastebin store get store-variable
: get-paste ( n -- paste )
pastebin get pastebin-pastes nth ;
: show-paste ( n -- )
serving-html
get-paste
[ "show-paste" render-component ] with-html-stream ;
2007-11-07 15:01:42 -05:00
\ show-paste { { "n" v-number } } define-action
: new-paste ( -- )
serving-html
[ "new-paste" render-template ] with-html-stream ;
2007-11-07 15:01:42 -05:00
\ new-paste { } define-action
: paste-list ( -- )
serving-html
2007-11-07 15:01:42 -05:00
[
[ show-paste ] "show-paste-quot" set
[ new-paste ] "new-paste-quot" set
2007-12-06 00:06:34 -05:00
pastebin get "paste-list" render-component
] with-html-stream ;
2007-11-07 15:01:42 -05:00
\ paste-list { } define-action
2007-12-06 01:02:58 -05:00
: paste-link ( paste -- link )
paste-n number>string [ show-paste ] curry quot-link ;
: paste-feed ( -- entries )
pastebin get pastebin-pastes [
{
paste-summary
paste-link
paste-date
2007-12-08 17:18:25 -05:00
} get-slots timestamp>rfc3339 f swap <entry>
2007-12-06 01:02:58 -05:00
] map ;
: feed.xml ( -- )
"text/xml" serving-content
"pastebin"
"http://pastebin.factorcode.org"
paste-feed <feed> feed>xml write-xml ;
\ feed.xml { } define-action
2007-11-07 15:01:42 -05:00
: save-pastebin-store ( -- )
store get-global save-store ;
: add-paste ( paste pastebin -- )
2007-12-08 17:18:25 -05:00
>r now over set-paste-date r>
2007-12-06 00:06:34 -05:00
pastebin-pastes 2dup length swap set-paste-n push ;
2007-11-07 15:01:42 -05:00
2007-12-06 00:06:34 -05:00
: submit-paste ( summary author channel mode contents -- )
2007-12-08 15:14:24 -05:00
<paste> [
\ pastebin get-global add-paste
save-pastebin-store
] keep paste-link permanent-redirect ;
2007-11-07 15:01:42 -05:00
\ submit-paste {
2007-12-10 02:34:56 -05:00
{ "summary" "- no summary -" v-default }
{ "author" "- no author -" v-default }
2007-11-07 15:01:42 -05:00
{ "channel" "#concatenative" v-default }
2007-12-06 00:06:34 -05:00
{ "mode" "factor" v-default }
2007-11-07 15:01:42 -05:00
{ "contents" v-required }
} define-action
: annotate-paste ( n summary author mode contents -- )
2007-11-07 15:01:42 -05:00
<annotation> swap get-paste
paste-annotations push
save-pastebin-store ;
\ annotate-paste {
{ "n" v-required v-number }
2007-12-10 02:34:56 -05:00
{ "summary" "- no summary -" v-default }
2007-11-07 15:01:42 -05:00
{ "author" v-required }
2007-12-06 00:06:34 -05:00
{ "mode" "factor" v-default }
2007-11-07 15:01:42 -05:00
{ "contents" v-required }
} define-action
\ annotate-paste [ "n" show-paste ] define-redirect
2007-12-06 01:02:58 -05:00
: style.css ( -- )
"text/css" serving-content
"style.css" send-resource ;
\ style.css { } define-action
2007-11-07 15:01:42 -05:00
"pastebin" "paste-list" "extra/webapps/pastebin" web-app