Working on help webapp
parent
dc1d7c76b7
commit
edc7aa3908
|
@ -0,0 +1,5 @@
|
||||||
|
IN: help.html.tests
|
||||||
|
USING: html.streams classes.predicate help.topics help.markup
|
||||||
|
io.streams.string accessors prettyprint kernel tools.test ;
|
||||||
|
|
||||||
|
[ ] [ [ [ \ predicate-instance? def>> . ] with-html-writer ] with-string-writer drop ] unit-test
|
|
@ -1,5 +1,106 @@
|
||||||
! Copyright (C) 2008 Slava Pestov.
|
! Copyright (C) 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: io.encodings.utf8 io.encodings.ascii io.encodings.binary
|
||||||
|
io.files html.streams html.elements html.components help kernel
|
||||||
|
assocs sequences make words accessors arrays help.topics vocabs
|
||||||
|
tools.vocabs tools.vocabs.browser namespaces prettyprint io
|
||||||
|
vocabs.loader serialize fry memoize unicode.case ;
|
||||||
IN: help.html
|
IN: help.html
|
||||||
|
|
||||||
|
: escape-char ( ch -- )
|
||||||
|
dup H{
|
||||||
|
{ CHAR: " "__quote__" }
|
||||||
|
{ CHAR: * "__star__" }
|
||||||
|
{ CHAR: : "__colon__" }
|
||||||
|
{ CHAR: < "__lt__" }
|
||||||
|
{ CHAR: > "__gt__" }
|
||||||
|
{ CHAR: ? "__question__" }
|
||||||
|
{ CHAR: \\ "__backslash__" }
|
||||||
|
{ CHAR: | "__pipe__" }
|
||||||
|
{ CHAR: _ "__underscore__" }
|
||||||
|
{ CHAR: / "__slash__" }
|
||||||
|
{ CHAR: \\ "__backslash__" }
|
||||||
|
{ CHAR: , "__comma__" }
|
||||||
|
} at [ % ] [ , ] ?if ;
|
||||||
|
|
||||||
|
: escape-filename ( string -- filename )
|
||||||
|
[ [ escape-char ] each ] "" make ;
|
||||||
|
|
||||||
|
GENERIC: topic>filename* ( topic -- name prefix )
|
||||||
|
|
||||||
|
M: word topic>filename* [ name>> ] [ vocabulary>> ] bi 2array "word" ;
|
||||||
|
M: link topic>filename* name>> "article" ;
|
||||||
|
M: word-link topic>filename* name>> topic>filename* ;
|
||||||
|
M: vocab-spec topic>filename* vocab-name "vocab" ;
|
||||||
|
M: vocab-tag topic>filename* name>> "tag" ;
|
||||||
|
M: vocab-author topic>filename* name>> "author" ;
|
||||||
|
|
||||||
|
: topic>filename ( topic -- filename )
|
||||||
|
[
|
||||||
|
topic>filename* % "-" %
|
||||||
|
dup array?
|
||||||
|
[ [ escape-filename ] map "," join ]
|
||||||
|
[ escape-filename ]
|
||||||
|
if % ".html" %
|
||||||
|
] "" make ;
|
||||||
|
|
||||||
|
M: topic browser-link-href topic>filename ;
|
||||||
|
|
||||||
|
: help-stylesheet ( -- )
|
||||||
|
"resource:basis/help/html/stylesheet.css" ascii file-contents write ;
|
||||||
|
|
||||||
|
: help>html ( topic -- )
|
||||||
|
dup topic>filename utf8 [
|
||||||
|
dup article-title
|
||||||
|
[ <style> help-stylesheet </style> ]
|
||||||
|
[ [ help ] with-html-writer ] simple-page
|
||||||
|
] with-file-writer ;
|
||||||
|
|
||||||
|
: all-vocabs-really ( -- seq )
|
||||||
|
#! Hack.
|
||||||
|
all-vocabs values concat
|
||||||
|
vocabs [ find-vocab-root not ] filter [ vocab ] map append ;
|
||||||
|
|
||||||
|
: all-topics ( -- topics )
|
||||||
|
[
|
||||||
|
! articles get keys [ >link ] map %
|
||||||
|
! all-words [ >link ] map %
|
||||||
|
! all-authors [ <vocab-author> ] map %
|
||||||
|
all-tags [ <vocab-tag> ] map %
|
||||||
|
! all-vocabs-really %
|
||||||
|
] { } make ;
|
||||||
|
|
||||||
|
: serialize-index ( index file -- )
|
||||||
|
[ [ [ topic>filename ] dip ] { } assoc-map-as object>bytes ] dip
|
||||||
|
binary set-file-contents ;
|
||||||
|
|
||||||
|
: generate-indices ( -- )
|
||||||
|
articles get keys [ [ >link ] [ article-title ] bi ] { } map>assoc "articles.idx" serialize-index
|
||||||
|
all-words [ dup name>> ] { } map>assoc "words.idx" serialize-index
|
||||||
|
all-vocabs-really [ dup vocab-name ] { } map>assoc "vocabs.idx" serialize-index ;
|
||||||
|
|
||||||
|
: generate-help ( -- )
|
||||||
|
all-topics [ help>html ] each ;
|
||||||
|
|
||||||
|
MEMO: load-index ( name -- index )
|
||||||
|
binary file-contents bytes>object ;
|
||||||
|
|
||||||
|
TUPLE: result title href ;
|
||||||
|
|
||||||
|
M: result link-title title>> ;
|
||||||
|
|
||||||
|
M: result link-href href>> ;
|
||||||
|
|
||||||
|
: offline-apropos ( string index -- results )
|
||||||
|
load-index swap >lower
|
||||||
|
'[ [ drop _ ] dip >lower subseq? ] assoc-filter
|
||||||
|
[ swap result boa ] { } assoc>map ;
|
||||||
|
|
||||||
|
: article-apropos ( string -- results )
|
||||||
|
"articles.idx" offline-apropos ;
|
||||||
|
|
||||||
|
: word-apropos ( string -- results )
|
||||||
|
"words.idx" offline-apropos ;
|
||||||
|
|
||||||
|
: vocab-apropos ( string -- results )
|
||||||
|
"vocabs.idx" offline-apropos ;
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
a:link { text-decoration: none; color: #00004c; }
|
||||||
|
a:visited { text-decoration: none; color: #00004c; }
|
||||||
|
a:active { text-decoration: none; color: #00004c; }
|
||||||
|
a:hover { text-decoration: underline; color: #00004c; }
|
|
@ -0,0 +1,38 @@
|
||||||
|
! Copyright (C) 2008 Slava Pestov.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: kernel accessors http.server.dispatchers
|
||||||
|
http.server.static furnace.actions furnace.redirection urls
|
||||||
|
validators locals io.files html.forms help.html ;
|
||||||
|
IN: webapps.help
|
||||||
|
|
||||||
|
TUPLE: help-webapp < dispatcher ;
|
||||||
|
|
||||||
|
:: <search-action> ( help-dir -- action )
|
||||||
|
<page-action>
|
||||||
|
{ help-webapp "search" } >>template
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
{ "search" [ 2 v-min-length 50 v-max-length v-one-line ] }
|
||||||
|
} validate-params
|
||||||
|
|
||||||
|
help-dir set-current-directory
|
||||||
|
|
||||||
|
"search" value article-apropos "articles" set-value
|
||||||
|
"search" value word-apropos "words" set-value
|
||||||
|
"search" value vocab-apropos "vocabs" set-value
|
||||||
|
|
||||||
|
{ help-webapp "search" } <chloe-content>
|
||||||
|
] >>submit ;
|
||||||
|
|
||||||
|
: <main-action> ( -- action )
|
||||||
|
<page-action>
|
||||||
|
{ help-webapp "help" } >>template ;
|
||||||
|
|
||||||
|
: <help-webapp> ( help-dir -- webapp )
|
||||||
|
help-webapp new-dispatcher
|
||||||
|
<main-action> "" add-responder
|
||||||
|
over <search-action> "search" add-responder
|
||||||
|
swap <static> "content" add-responder ;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!DOCTYPE html
|
||||||
|
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
||||||
|
|
||||||
|
<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
|
||||||
|
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Factor Documentation</title>
|
||||||
|
<t:base t:href="$help-webapp" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<frameset cols="25%, 75%">
|
||||||
|
<frame src="search" name="search" />
|
||||||
|
<frame src="content/article-handbook.html" name="content" />
|
||||||
|
</frameset>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
</t:chloe>
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?xml version='1.0' ?>
|
||||||
|
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||||
|
|
||||||
|
<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
|
||||||
|
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<t:base t:href="$help-webapp/content/" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Factor documentation</h1>
|
||||||
|
|
||||||
|
<t:form t:action="$help-webapp/search">
|
||||||
|
<t:field t:name="search" />
|
||||||
|
<button>Search</button>
|
||||||
|
</t:form>
|
||||||
|
|
||||||
|
<t:if t:value="articles">
|
||||||
|
<h1>Articles</h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<t:each t:name="articles">
|
||||||
|
<li> <t:link t:name="value" t:target="content" /> </li>
|
||||||
|
</t:each>
|
||||||
|
</ul>
|
||||||
|
</t:if>
|
||||||
|
|
||||||
|
<t:if t:value="vocabs">
|
||||||
|
<h1>Vocabularies</h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<t:each t:name="vocabs">
|
||||||
|
<li> <t:link t:name="value" t:target="content" /> </li>
|
||||||
|
</t:each>
|
||||||
|
</ul>
|
||||||
|
</t:if>
|
||||||
|
|
||||||
|
<t:if t:value="words">
|
||||||
|
<h1>Words</h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<t:each t:name="words">
|
||||||
|
<li> <t:link t:name="value" t:target="content" /> </li>
|
||||||
|
</t:each>
|
||||||
|
</ul>
|
||||||
|
</t:if>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
</t:chloe>
|
Loading…
Reference in New Issue