factor/basis/help/html/html.factor

175 lines
5.0 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: accessors arrays assocs colors.constants debugger fry
help help.crossref help.home help.markup help.stylesheet
help.topics help.vocabs html html.streams io io.directories
io.encodings.binary io.encodings.utf8 io.files io.files.temp
io.pathnames io.styles kernel make math.parser memoize
namespaces sequences serialize splitting tools.completion vocabs
vocabs.hierarchy words xml.syntax xml.writer ;
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 )
topic>filename* [
2008-09-29 20:43:59 -04:00
[
% "-" %
dup array?
[ [ escape-filename ] map "," join ]
[ escape-filename ]
if % ".html" %
2008-09-29 20:43:59 -04:00
] "" make
] [ drop 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
M: pathname url-of
string>> "resource:" ?head [
"https://github.com/slavapestov/factor/blob/master/"
prepend
] [ drop f ] if ;
: 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 ]
2015-08-16 14:38:38 -04:00
[
[
title-style get
{ { page-color COLOR: FactorLightTan } } assoc-union
title-style [ print-topic ] with-variable
] 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-disk-vocabs-recursive no-roots remove-redundant-prefixes
[ vocab-name "scratchpad" = ] reject ;
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 -- )
binary [
[ [ topic>filename ] dip ] { } assoc-map-as serialize
] with-file-writer ;
2008-09-29 05:10:20 -04:00
: generate-article-index ( -- )
articles get [ [ >link ] [ article-title ] bi* ] assoc-map
"articles.idx" serialize-index ;
: generate-word-index ( -- )
all-words [ dup name>> ] { } map>assoc
"words.idx" serialize-index ;
2008-09-29 05:10:20 -04:00
: generate-vocab-index ( -- )
all-vocabs-really [ dup vocab-name ] { } map>assoc
"vocabs.idx" serialize-index ;
: generate-indices ( -- )
generate-article-index
generate-word-index
generate-vocab-index ;
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 }
} [
all-topics [ '[ _ generate-help-file ] try ] each
] 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 ;
: offline-apropos ( string index -- results )
load-index completions ;
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 ;