factor/basis/tools/scaffold/scaffold.factor

311 lines
8.3 KiB
Factor
Raw Normal View History

2008-09-03 20:43:36 -04:00
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs io.files io.pathnames io.directories
io.encodings.utf8 hashtables kernel namespaces sequences
vocabs.loader io combinators calendar accessors math.parser
io.streams.string ui.tools.operations quotations strings arrays
prettyprint words vocabs sorting sets classes math alien urls
splitting ascii combinators.short-circuit alarms words.symbol ;
2008-09-03 20:43:36 -04:00
IN: tools.scaffold
SYMBOL: developer-name
SYMBOL: using
2008-09-03 20:43:36 -04:00
ERROR: not-a-vocab-root string ;
ERROR: vocab-name-contains-separator path ;
ERROR: vocab-name-contains-dot path ;
ERROR: no-vocab vocab ;
2008-09-03 20:43:36 -04:00
2008-09-04 02:50:26 -04:00
<PRIVATE
2008-10-21 22:03:37 -04:00
: vocab-root? ( string -- ? ) vocab-roots get member? ;
2008-10-21 22:03:37 -04:00
: contains-dot? ( string -- ? ) ".." swap subseq? ;
2008-09-03 20:43:36 -04:00
: contains-separator? ( string -- ? ) [ path-separator? ] any? ;
2008-10-21 22:03:37 -04:00
: ensure-vocab-exists ( string -- string )
dup vocabs member? [ no-vocab ] unless ;
: check-vocab-name ( string -- string )
[ ]
[ contains-dot? [ vocab-name-contains-dot ] when ]
[ contains-separator? [ vocab-name-contains-separator ] when ] tri ;
2008-09-03 20:43:36 -04:00
: check-root ( string -- string )
dup vocab-root? [ not-a-vocab-root ] unless ;
2008-09-03 20:43:36 -04:00
: check-vocab ( vocab -- vocab )
dup find-vocab-root [ no-vocab ] unless ;
: check-vocab-root/vocab ( vocab-root string -- vocab-root string )
[ check-root ] [ check-vocab-name ] bi* ;
: replace-vocab-separators ( vocab -- path )
path-separator first CHAR: . associate substitute ; inline
: vocab-root/vocab>path ( vocab-root vocab -- path )
check-vocab-root/vocab
[ ] [ replace-vocab-separators ] bi* append-path ;
: vocab>path ( vocab -- path )
check-vocab
[ find-vocab-root ] keep vocab-root/vocab>path ;
: vocab-root/vocab/file>path ( vocab-root vocab file -- path )
[ vocab-root/vocab>path ] dip append-path ;
: vocab-root/vocab/suffix>path ( vocab-root vocab suffix -- path )
[ vocab-root/vocab>path dup file-name append-path ] dip append ;
: vocab/suffix>path ( vocab suffix -- path )
[ vocab>path dup file-name append-path ] dip append ;
2008-09-03 20:43:36 -04:00
: directory-exists ( path -- )
"Not creating a directory, it already exists: " write print ;
: scaffold-directory ( vocab-root vocab -- )
vocab-root/vocab>path
2008-09-03 20:43:36 -04:00
dup exists? [ directory-exists ] [ make-directories ] if ;
: not-scaffolding ( path -- path )
"Not creating scaffolding for " write dup <pathname> . ;
2008-09-03 20:43:36 -04:00
: scaffolding ( path -- path )
"Creating scaffolding for " write dup <pathname> . ;
2008-09-03 20:43:36 -04:00
: scaffolding? ( path -- path ? )
dup exists? [ not-scaffolding f ] [ scaffolding t ] if ;
2008-09-03 20:43:36 -04:00
: scaffold-copyright ( -- )
"! Copyright (C) " write now year>> number>string write
developer-name get [ "Your name" ] unless* bl write "." print
"! See http://factorcode.org/license.txt for BSD license." print ;
: main-file-string ( vocab -- string )
2008-09-03 20:43:36 -04:00
[
scaffold-copyright
"USING: ;" print
"IN: " write print
] with-string-writer ;
: set-scaffold-main-file ( vocab path -- )
[ main-file-string ] dip utf8 set-file-contents ;
2008-09-03 20:43:36 -04:00
: scaffold-main ( vocab-root vocab -- )
tuck ".factor" vocab-root/vocab/suffix>path scaffolding? [
set-scaffold-main-file
] [
2drop
] if ;
2008-09-03 20:43:36 -04:00
: scaffold-authors ( vocab-root vocab -- )
"authors.txt" vocab-root/vocab/file>path scaffolding? [
[ developer-name get ] dip utf8 set-file-contents
2008-09-03 20:43:36 -04:00
] [
drop
2008-09-03 20:43:36 -04:00
] if ;
: lookup-type ( string -- object/string ? )
"new" ?head drop [ { [ CHAR: ' = ] [ digit? ] } 1|| ] trim-tail
2008-09-03 20:43:36 -04:00
H{
{ "object" object } { "obj" object }
2008-09-24 20:05:03 -04:00
{ "quot" quotation }
{ "string" string }
2008-09-03 20:43:36 -04:00
{ "str" string }
{ "hash" hashtable }
2008-09-03 20:43:36 -04:00
{ "hashtable" hashtable }
{ "?" "a boolean" }
{ "ch" "a character" }
{ "word" word }
{ "array" array }
{ "alarm" alarm }
2008-09-05 18:41:14 -04:00
{ "duration" duration }
{ "path" "a pathname string" }
{ "vocab" "a vocabulary specifier" }
{ "vocab-root" "a vocabulary root string" }
2008-09-05 18:41:14 -04:00
{ "c-ptr" c-ptr }
2008-09-24 20:05:03 -04:00
{ "seq" sequence }
{ "assoc" assoc }
2008-09-05 18:41:14 -04:00
{ "alist" "an array of key/value pairs" }
{ "keys" sequence } { "values" sequence }
2008-09-08 10:28:30 -04:00
{ "class" class } { "tuple" tuple }
2008-09-24 20:05:03 -04:00
{ "url" url }
2008-09-03 20:43:36 -04:00
} at* ;
: add-using ( object -- )
vocabulary>> using get [ conjoin ] [ drop ] if* ;
2008-09-03 20:43:36 -04:00
: ($values.) ( array -- )
[ bl ] [
2009-03-14 11:51:38 -04:00
"{ " write
2008-09-03 20:43:36 -04:00
dup array? [ first ] when
dup lookup-type [
[ unparse write bl ]
2008-09-03 22:38:16 -04:00
[ [ pprint ] [ dup string? [ drop ] [ add-using ] if ] bi ] bi*
2008-09-03 20:43:36 -04:00
] [
drop unparse write bl null pprint
null add-using
2008-09-03 20:43:36 -04:00
] if
" }" write
] interleave ;
2008-09-03 20:43:36 -04:00
: 4bl ( -- )
" " write ; inline
2008-09-03 20:43:36 -04:00
: $values. ( word -- )
"declared-effect" word-prop [
[ in>> ] [ out>> ] bi
2dup [ empty? ] bi@ and [
2drop
] [
"{ $values" print
[ 4bl ($values.) ]
[ [ nl 4bl ($values.) ] unless-empty ] bi*
nl "}" print
] if
2008-09-03 20:43:36 -04:00
] when* ;
: symbol-description. ( word -- )
drop
"{ $var-description \"\" } ;" print ;
2008-09-03 20:43:36 -04:00
: $description. ( word -- )
drop
2008-09-04 13:37:50 -04:00
"{ $description \"\" } ;" print ;
2008-09-03 20:43:36 -04:00
: docs-body. ( word/symbol -- )
dup symbol? [
symbol-description.
] [
[ $values. ] [ $description. ] bi
] if ;
: docs-header. ( word -- )
2008-09-24 20:05:03 -04:00
"HELP: " write name>> print ;
2008-09-03 20:43:36 -04:00
2009-02-22 11:03:37 -05:00
: (help.) ( word -- )
[ docs-header. ] [ docs-body. ] bi ;
2008-09-03 20:43:36 -04:00
: interesting-words ( vocab -- array )
words
[ { [ "help" word-prop ] [ predicate? ] } 1|| not ] filter
natural-sort ;
: interesting-words. ( vocab -- )
2009-02-22 11:03:37 -05:00
interesting-words [ (help.) nl ] each ;
: docs-file-string ( vocab -- str2 )
2008-09-03 20:43:36 -04:00
[
2008-09-05 20:29:14 -04:00
{
[ "IN: " write print nl ]
[ interesting-words. ]
[
[ "ARTICLE: " write unparse dup write bl print ]
[ "{ $vocab-link " write pprint " }" print ] bi
";" print nl
]
2008-09-05 20:29:14 -04:00
[ "ABOUT: " write unparse print ]
} cleave
2008-09-03 20:43:36 -04:00
] with-string-writer ;
2008-09-24 20:05:03 -04:00
: write-using ( vocab -- )
"USING:" write
using get keys
2008-09-24 20:05:03 -04:00
{ "help.markup" "help.syntax" } append natural-sort remove
[ bl write ] each
" ;" print ;
: set-scaffold-docs-file ( vocab path -- )
utf8 <file-writer> [
2008-09-24 20:05:03 -04:00
scaffold-copyright
[ docs-file-string ] [ write-using ] bi
2008-09-24 20:05:03 -04:00
write
] with-output-stream ;
2008-09-03 20:43:36 -04:00
2008-09-04 01:43:18 -04:00
: with-scaffold ( quot -- )
[ H{ } clone using ] dip with-variable ; inline
: link-vocab ( vocab -- )
check-vocab
"Edit documentation: " write
"-docs.factor" vocab/suffix>path <pathname> . ;
PRIVATE>
2009-02-22 11:03:37 -05:00
: help. ( word -- )
[ (help.) ] [ nl vocabulary>> link-vocab ] bi ;
: scaffold-help ( vocab -- )
ensure-vocab-exists
2008-09-04 01:43:18 -04:00
[
dup "-docs.factor" vocab/suffix>path scaffolding? [
set-scaffold-docs-file
] [
2drop
] if
2008-09-04 01:43:18 -04:00
] with-scaffold ;
: scaffold-undocumented ( string -- )
[ interesting-words. ] [ link-vocab ] bi ;
2008-09-03 20:43:36 -04:00
: scaffold-vocab ( vocab-root string -- )
2008-09-03 20:43:36 -04:00
{
[ scaffold-directory ]
2008-09-03 20:43:36 -04:00
[ scaffold-main ]
[ scaffold-authors ]
[ nip require ]
2008-09-03 20:43:36 -04:00
} 2cleave ;
2008-09-05 18:41:14 -04:00
<PRIVATE
: tests-file-string ( vocab -- string )
[
scaffold-copyright
"USING: tools.test " write dup write " ;" print
"IN: " write write ".tests" print
] with-string-writer ;
: set-scaffold-tests-file ( vocab path -- )
[ tests-file-string ] dip utf8 set-file-contents ;
PRIVATE>
: scaffold-tests ( vocab -- )
ensure-vocab-exists
dup "-tests.factor" vocab/suffix>path
scaffolding? [
set-scaffold-tests-file
] [
2drop
] if ;
2008-09-05 18:41:14 -04:00
SYMBOL: examples-flag
: example ( -- )
{
"{ $example \"\" \"USING: prettyprint ;\""
" \"\""
" \"\""
"}"
} [ examples-flag get [ 4bl ] when print ] each ;
2008-09-05 18:41:14 -04:00
: examples ( n -- )
t \ examples-flag [
"{ $examples " print
[ example ] times
"}" print
] with-variable ;
: scaffold-rc ( path -- )
[ home ] dip append-path
[ touch-file ] [ "Click to edit: " write <pathname> . ] bi ;
: scaffold-factor-boot-rc ( -- )
windows? "factor-boot-rc" ".factor-boot-rc" ? scaffold-rc ;
: scaffold-factor-rc ( -- )
windows? "factor-rc" ".factor-rc" ? scaffold-rc ;
: scaffold-emacs ( -- ) ".emacs" scaffold-rc ;