factor/basis/help/html/html.factor

161 lines
4.8 KiB
Factor
Raw Normal View History

! Copyright (C) 2008, 2011 Slava Pestov.
2008-06-06 19:57:37 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: io.encodings.utf8 io.encodings.binary io.files
io.files.temp io.directories html.streams help help.home kernel
assocs sequences make words accessors arrays help.topics vocabs
vocabs.hierarchy help.vocabs namespaces prettyprint io
vocabs.loader serialize fry memoize unicode.case math.order
sorting debugger html xml.syntax xml.writer math.parser
sets hashtables ;
2009-05-16 17:54:02 -04:00
FROM: io.encodings.ascii => ascii ;
FROM: ascii => ascii? ;
2008-06-06 19:57:37 -04:00
IN: help.html
: escape-char ( ch -- )
dup ascii? [
dup H{
{ CHAR: " "__quo__" }
{ CHAR: * "__star__" }
{ CHAR: : "__colon__" }
{ CHAR: < "__lt__" }
{ CHAR: > "__gt__" }
{ CHAR: ? "__que__" }
{ CHAR: \\ "__back__" }
{ CHAR: | "__pipe__" }
{ CHAR: / "__slash__" }
{ CHAR: , "__comma__" }
{ CHAR: @ "__at__" }
{ CHAR: # "__hash__" }
{ CHAR: % "__percent__" }
} at [ % ] [ , ] ?if
] [ number>string "__" "__" surround % ] if ;
: escape-filename ( string -- filename )
[ [ escape-char ] each ] "" make ;
2008-09-29 05:10:20 -04:00
GENERIC: topic>filename* ( topic -- name prefix )
2008-09-29 20:43:59 -04:00
M: word topic>filename*
dup vocabulary>> [
[ name>> ] [ vocabulary>> ] bi 2array "word"
] [ drop f f ] if ;
M: link topic>filename* name>> dup [ "article" ] [ topic>filename* ] if ;
2008-09-29 05:10:20 -04:00
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" ;
2008-09-29 20:43:59 -04:00
M: f topic>filename* drop \ f topic>filename* ;
2008-09-29 05:10:20 -04:00
: topic>filename ( topic -- filename )
2008-09-29 20:43:59 -04:00
topic>filename* dup [
[
% "-" %
dup array?
[ [ escape-filename ] map "," join ]
[ escape-filename ]
if % ".html" %
2008-09-29 20:43:59 -04:00
] "" make
] [ 2drop f ] if ;
2008-09-29 05:10:20 -04:00
2009-01-31 21:44:30 -05:00
M: topic url-of topic>filename ;
2008-09-29 05:10:20 -04:00
: help-stylesheet ( -- xml )
2009-02-15 20:53:21 -05:00
"vocab:help/html/stylesheet.css" ascii file-contents
2009-01-31 21:44:30 -05:00
[XML <style><-></style> XML] ;
2008-09-29 05:10:20 -04:00
: help-navbar ( -- xml )
2011-11-05 03:05:58 -04:00
"conventions" >link topic>filename
[XML
<div class="navbar">
<b> Factor Documentation </b> |
<a href="/">Home</a> |
2011-11-05 03:05:58 -04:00
<a href=<->>Glossary</a> |
<form method="get" action="/search" style="display:inline;">
<input name="search" type="text"/>
<button type="submit">Search</button>
</form>
<a href="http://factorcode.org" style="float:right; padding: 4px;">factorcode.org</a>
</div>
XML] ;
2009-01-31 21:44:30 -05:00
: help>html ( topic -- xml )
[ article-title " - Factor Documentation" append ]
2009-01-31 21:44:30 -05:00
[ drop help-stylesheet ]
[
[ help-navbar ]
[ [ print-topic ] with-html-writer ]
bi* append
] tri
simple-page ;
2009-01-31 21:44:30 -05:00
: generate-help-file ( topic -- )
dup topic>filename utf8 [ help>html write-xml ] with-file-writer ;
2008-09-29 05:10:20 -04:00
: all-vocabs-really ( -- seq )
all-vocabs-recursive >hashtable no-roots remove-redundant-prefixes
[ vocab-name "scratchpad" = not ] filter ;
2008-09-29 05:10:20 -04:00
: all-topics ( -- topics )
[
2008-09-29 05:23:42 -04:00
articles get keys [ >link ] map %
all-words [ >link ] map %
all-authors [ <vocab-author> ] map %
2008-09-29 05:10:20 -04:00
all-tags [ <vocab-tag> ] map %
2008-09-29 05:23:42 -04:00
all-vocabs-really %
2008-09-29 05:10:20 -04:00
] { } 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-files) ( -- )
2009-01-31 21:44:30 -05:00
all-topics [ '[ _ generate-help-file ] try ] each ;
2008-09-29 05:10:20 -04:00
: generate-help-files ( -- )
2012-07-19 16:55:34 -04:00
H{
{ recent-searches f }
{ recent-words f }
{ recent-articles f }
{ recent-vocabs f }
} [ (generate-help-files) ] with-variables ;
2008-09-29 05:23:42 -04:00
: generate-help ( -- )
"docs" cache-file
[ make-directories ]
[
[
2008-09-29 05:23:42 -04:00
generate-indices
generate-help-files
] with-directory
] bi ;
2008-09-29 05:23:42 -04:00
2008-09-29 05:10:20 -04:00
MEMO: load-index ( name -- index )
binary file-contents bytes>object ;
TUPLE: result title href ;
: partition-exact ( string results -- results' )
[ title>> = ] with partition append ;
2008-09-29 05:10:20 -04:00
: offline-apropos ( string index -- results )
load-index over >lower
2008-09-29 05:10:20 -04:00
'[ [ drop _ ] dip >lower subseq? ] assoc-filter
2008-09-29 06:08:16 -04:00
[ swap result boa ] { } assoc>map
[ title>> ] sort-with
partition-exact ;
2008-09-29 05:10:20 -04:00
: article-apropos ( string -- results )
2008-11-17 18:30:47 -05:00
"articles.idx" offline-apropos ;
2008-09-29 05:10:20 -04:00
: word-apropos ( string -- results )
2008-11-17 18:30:47 -05:00
"words.idx" offline-apropos ;
2008-09-29 05:10:20 -04:00
: vocab-apropos ( string -- results )
2008-11-17 18:30:47 -05:00
"vocabs.idx" offline-apropos ;