\r
: revalidate-url ( -- url/f )\r
revalidate-url-key param\r
- dup [ >url [ same-host? ] keep and ] when ;\r
+ dup [ >url ensure-port [ same-host? ] keep and ] when ;\r
\r
: validation-failed ( -- * )\r
post-request? revalidate-url and [\r
choice new ;
: render-option ( text selected? -- )
- <option [ "true" =selected ] when option>
+ <option [ "selected" =selected ] when option>
present escape-string write
</option> ;
HELP: ::
{ $syntax ":: word ( bindings... -- outputs... ) body... ;" }
-{ $description "Defines a word with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope. Any " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " forms used in the body of the word definition are automatically closure-converted." }
+{ $description "Defines a word with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope." }
{ $notes "The output names do not affect the word's behavior, however the compiler attempts to check the stack effect as with other definitions." }
{ $examples "See " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " and " { $link POSTPONE: [wlet } "." } ;
[ "item" tags-named [ rss2.0-entry ] map set-entries ]
tri ;
+: atom-entry-link ( tag -- url/f )
+ "link" tags-named [ "rel" swap at "alternate" = ] find nip
+ dup [ "href" swap at >url ] when ;
+
: atom1.0-entry ( tag -- entry )
entry new
swap {
[ "title" tag-named children>string >>title ]
- [ "link" tag-named "href" swap at >url >>url ]
+ [ atom-entry-link >>url ]
[
{ "content" "summary" } any-tag-named
dup children>> [ string? not ] contains?
{ host "www.apple.com" }
{ port 1234 }
{ path "/a/path" }
- { raw-query "a=b" }
{ query H{ { "a" "b" } } }
{ anchor "foo" }
}
{ protocol "http" }
{ host "www.apple.com" }
{ path "/a/path" }
- { raw-query "a=b" }
{ query H{ { "a" "b" } } }
{ anchor "foo" }
}
{
T{ url
{ path "bar" }
- { raw-query "a=b" }
{ query H{ { "a" "b" } } }
}
"bar?a=b"
T{ url
{ protocol "http" }
{ host "localhost" }
- { raw-query "foo=bar" }
{ query H{ { "foo" "bar" } } }
{ path "/" }
}
T{ url
{ protocol "http" }
{ host "localhost" }
- { raw-query "foo=bar" }
{ query H{ { "foo" "bar" } } }
{ path "/" }
}
peg.ebnf urls.encoding ;
IN: urls
-TUPLE: url protocol username password host port path raw-query query anchor ;
+TUPLE: url protocol username password host port path query anchor ;
: <url> ( -- url ) url new ;
username = [^/:@#?]+ => [[ url-decode ]]
password = [^/:@#?]+ => [[ url-decode ]]
pathname = [^#?]+ => [[ url-decode ]]
-query = [^#]+ => [[ >string ]]
+query = [^#]+ => [[ query>assoc ]]
anchor = .+ => [[ url-decode ]]
hostname = [^/#?]+ => [[ url-decode ]]
] [ f f f f f ] if*
]
[ second ] ! pathname
- [ third dup query>assoc ] ! query
+ [ third ] ! query
[ fourth ] ! anchor
} cleave url boa
dup host>> [ [ "/" or ] change-path ] when ;
: derive-url ( base url -- url' )
[ clone ] dip over {
- [ [ protocol>> ] either? >>protocol ]
- [ [ username>> ] either? >>username ]
- [ [ password>> ] either? >>password ]
- [ [ host>> ] either? >>host ]
- [ [ port>> ] either? >>port ]
- [ [ path>> ] bi@ swap url-append-path >>path ]
- [ [ query>> ] either? >>query ]
- [ [ anchor>> ] either? >>anchor ]
+ [ [ protocol>> ] either? >>protocol ]
+ [ [ username>> ] either? >>username ]
+ [ [ password>> ] either? >>password ]
+ [ [ host>> ] either? >>host ]
+ [ [ port>> ] either? >>port ]
+ [ [ path>> ] bi@ swap url-append-path >>path ]
+ [ [ query>> ] either? >>query ]
+ [ [ anchor>> ] either? >>anchor ]
} 2cleave ;
: relative-url ( url -- url' )
} ;
HELP: initial:
-{ $syntax "TUPLE: ... { \"slot\" initial: value } ... ;" }
+{ $syntax "TUPLE: ... { slot initial: value } ... ;" }
{ $values { "slot" "a slot name" } { "value" "any literal" } }
{ $description "Specifies an initial value for a tuple slot." } ;
HELP: read-only
-{ $syntax "TUPLE: ... { \"slot\" read-only } ... ;" }
+{ $syntax "TUPLE: ... { slot read-only } ... ;" }
{ $values { "slot" "a slot name" } }
{ $description "Defines a tuple slot to be read-only. If a tuple has read-only slots, instances of the tuple should only be created by calling " { $link boa } ", instead of " { $link new } ". Using " { $link boa } " is the only way to set the value of a read-only slot." } ;
[
{
- { "search" [ 2 v-min-length 50 v-max-length v-one-line ] }
+ { "search" [ 1 v-min-length 50 v-max-length v-one-line ] }
} validate-params
help-dir set-current-directory
-<?xml version="1.0" encoding="iso-8859-1"?>
+<?xml version="1.0"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<p>This is the <a href="http://factorcode.org" target="_top">Factor</a>
documentation, generated offline from a
- <code>load-everything</code> image. The Factor UI also
- includes a documentation browser tool.</p>
+ <code>load-everything</code> image. If you want, you can also browse the
+ documentation from within the <a href="http://factorcode.org" target="_top">Factor</a> UI.</p>
- <p>You may search article titles below.</p>
+ <p>You may search article titles below; for example, try searching for "HTTP".</p>
<t:form t:action="$help-webapp/search">
<t:field t:name="search" />
</tr>
</table>
- <input type="SUBMIT" value="Submit" />
+ <p> <button>Submit</button> </p>
</t:form>
</t:chloe>
<t:bind-each t:name="annotations">
- <a name="@id"><h2>Annotation: <t:label t:name="summary" /></h2></a>
+ <h2><a name="@id">Annotation: <t:label t:name="summary" /></a></h2>
<table>
<tr><th class="field-label">Author: </th><td><t:label t:name="author" /></td></tr>
</tr>
</table>
- <input type="SUBMIT" value="Done" />
+ <p> <button>Done</button> </p>
</t:form>
[
f <blog>
[ deposit-blog-slots ]
+ [ "id" value >>id ]
[ update-tuple ]
- [
- <url>
- "$planet/admin" >>path
- swap id>> "id" set-query-param
- <redirect>
- ]
tri
+
+ <url>
+ "$planet/admin" >>path
+ "id" value "id" set-query-param
+ <redirect>
] >>submit ;
: <planet-admin> ( -- responder )
<boilerplate>
{ factor-website "page" } >>template ;
-: <configuration> ( responder -- responder' )
+: <login-config> ( responder -- responder' )
"Factor website" <login-realm>
"Factor website" >>name
allow-registration
allow-password-recovery
allow-edit-profile
- allow-deactivation
- test-db <alloy> ;
+ allow-deactivation ;
: <factor-website> ( -- responder )
factor-website new-dispatcher
"password" key-password set-global
common-configuration
<factor-website>
- <pastebin> "pastebin" add-responder
- <planet> "planet" add-responder
+ <pastebin> <factor-boilerplate> <login-config> "pastebin" add-responder
+ <planet> <factor-boilerplate> <login-config> "planet" add-responder
"/tmp/docs/" <help-webapp> "docs" add-responder
- <factor-boilerplate>
- <configuration>
+ test-db <alloy>
main-responder set-global ;
: <gitweb> ( path -- responder )
: init-production ( -- )
common-configuration
<vhost-dispatcher>
- <factor-website> <factor-boilerplate> <configuration> "concatenative.org" add-responder
- <pastebin> <factor-boilerplate> <configuration> "paste.factorcode.org" add-responder
- <planet> <factor-boilerplate> <configuration> "planet.factorcode.org" add-responder
- home "docs" append-path <help-webapp> <configuration> "docs.factorcode.org" add-responder
+ <factor-website> <login-config> <factor-boilerplate> test-db <alloy> "concatenative.org" add-responder
+ <pastebin> <login-config> <factor-boilerplate> test-db <alloy> "paste.factorcode.org" add-responder
+ <planet> <login-config> <factor-boilerplate> test-db <alloy> "planet.factorcode.org" add-responder
+ home "docs" append-path <help-webapp> test-db <alloy> "docs.factorcode.org" add-responder
home "cgi" append-path <gitweb> "gitweb.factorcode.org" add-responder
main-responder set-global ;