: load-help ( -- )
"help.lint" require
- "tools.vocabs.browser" require
+ "help.vocabs" require
"alien.syntax" require
"compiler" require
"tools.time"
"tools.threads"
"tools.vocabs"
- "tools.vocabs.browser"
"tools.vocabs.monitor"
"editors"
} [ require ] each
--- /dev/null
+IN: help.apropos
+USING: help.markup help.syntax strings help.tips ;
+
+HELP: apropos
+{ $values { "str" string } }
+{ $description "Lists all words, vocabularies and help articles whose name contains a subsequence equal to " { $snippet "str" } ". Results are ranked using a simple distance algorithm." } ;
+
+TIP: "Use " { $link apropos } " to search for words, vocabularies and help articles." ;
\ No newline at end of file
--- /dev/null
+IN: help.apropos.tests
+USING: help.apropos tools.test ;
+
+[ ] [ "swp" apropos ] unit-test
--- /dev/null
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors arrays assocs fry help.markup help.topics io
+kernel make math math.parser namespaces sequences sorting
+summary tools.completion tools.vocabs help.vocabs
+vocabs words unicode.case help ;
+IN: help.apropos
+
+: $completions ( seq -- )
+ dup [ word? ] all? [ words-table ] [
+ dup [ vocab-spec? ] all? [
+ $vocabs
+ ] [
+ [ <$pretty-link> 1array ] map $table
+ ] if
+ ] if ;
+
+TUPLE: more-completions seq ;
+
+CONSTANT: max-completions 5
+
+M: more-completions article-title
+ seq>> length number>string " results" append ;
+
+M: more-completions article-name
+ seq>> length max-completions - number>string " more results" append ;
+
+M: more-completions article-content
+ seq>> sort-values keys \ $completions prefix ;
+
+: (apropos) ( str candidates title -- element )
+ [
+ [ completions ] dip '[
+ _ 1array \ $heading prefix ,
+ [ max-completions short head keys \ $completions prefix , ]
+ [ dup length max-completions > [ more-completions boa <$link> , ] [ drop ] if ]
+ bi
+ ] unless-empty
+ ] { } make ;
+
+: word-candidates ( words -- candidates )
+ [ dup name>> >lower ] { } map>assoc ;
+
+: vocab-candidates ( -- candidates )
+ all-vocabs-seq [ dup vocab-name >lower ] { } map>assoc ;
+
+: help-candidates ( seq -- candidates )
+ [ [ >link ] [ article-title >lower ] bi ] { } map>assoc
+ sort-values ;
+
+: $apropos ( str -- )
+ first
+ [ all-words word-candidates "Words" (apropos) ]
+ [ vocab-candidates "Vocabularies" (apropos) ]
+ [ articles get keys help-candidates "Help articles" (apropos) ]
+ tri 3array print-element ;
+
+TUPLE: apropos search ;
+
+C: <apropos> apropos
+
+M: apropos article-title
+ search>> "Search results for “" "”" surround ;
+
+M: apropos article-name article-title ;
+
+M: apropos article-content
+ search>> 1array \ $apropos prefix ;
+
+M: apropos >link ;
+
+INSTANCE: apropos topic
+
+: apropos ( str -- )
+ <apropos> print-topic ;
math system strings sbufs vectors byte-arrays quotations
io.streams.byte-array classes.builtin parser lexer
classes.predicate classes.union classes.intersection
-classes.singleton classes.tuple tools.vocabs.browser math.parser
+classes.singleton classes.tuple help.vocabs math.parser
accessors ;
IN: help.handbook
"This index only includes articles from loaded vocabularies. To explore more vocabularies, see " { $link "vocab-index" } "."
{ $index [ "handbook" orphan-articles remove ] } ;
-ARTICLE: "handbook" "Factor documentation"
-"Welcome to Factor."
-$nl
-"Explore the code base:"
-{ $subsection "vocab-index" }
+ARTICLE: "handbook" "Factor handbook"
"Learn the language:"
{ $subsection "cookbook" }
{ $subsection "first-program" }
{ $subsection "handbook-environment-reference" }
{ $subsection "ui" }
{ $subsection "handbook-library-reference" }
-"The below indices only include articles from loaded vocabularies. To explore more vocabularies, see " { $link "vocab-index" } "."
+"Explore loaded libraries:"
{ $subsection "article-index" }
{ $subsection "primitive-index" }
{ $subsection "error-index" }
{ $subsection "type-index" }
-{ $subsection "class-index" } ;
+{ $subsection "class-index" }
+"Explore the code base:"
+{ $subsection "vocab-index" } ;
ABOUT: "handbook"
{ $subsection "browsing-help" }
{ $subsection "writing-help" }
{ $subsection "help.lint" }
+{ $subsection "tips-of-the-day" }
{ $subsection "help-impl" } ;
IN: help
--- /dev/null
+Slava Pestov
\ No newline at end of file
--- /dev/null
+IN: help.home
+USING: help.markup help.syntax ;
+
+ARTICLE: "help.home" "Factor documentation"
+{ $heading "Starting points" }
+{ $list
+ { $link "ui-listener" }
+ { $link "handbook" }
+ { $link "vocab-index" }
+}
+{ $heading "Recently visited" }
+{ $table
+ { "Words" "Articles" "Vocabs" }
+ { { $recent recent-words } { $recent recent-articles } { $recent recent-vocabs } }
+} print-element
+{ $heading "Recent searches" }
+{ $recent-searches } ;
+
+ABOUT: "help.home"
\ No newline at end of file
--- /dev/null
+! Copyright (C) 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: arrays compiler.units fry hashtables help.topics io
+kernel math namespaces sequences sets help.vocabs
+help.apropos vocabs help.markup ;
+IN: help.home
+
+SYMBOLS: recent-words recent-articles recent-vocabs recent-searches ;
+
+CONSTANT: recent-count 10
+
+{ recent-words recent-articles recent-vocabs recent-searches }
+[ [ V{ } clone ] initialize ] each
+
+GENERIC: add-recent-where ( obj -- obj symbol )
+
+M: link add-recent-where recent-articles ;
+M: word-link add-recent-where recent-words ;
+M: vocab-spec add-recent-where recent-vocabs ;
+M: apropos add-recent-where recent-searches ;
+M: object add-recent-where f ;
+
+: $recent ( element -- )
+ first get [ nl ] [ 1array $pretty-link ] interleave ;
+
+: $recent-searches ( element -- )
+ drop recent-searches get [ nl ] [ ($link) ] interleave ;
+
+: redisplay-recent-page ( -- )
+ "help.home" >link dup associate
+ notify-definition-observers ;
+
+: expire ( seq -- )
+ [ length recent-count - [ 0 > ] keep ] keep
+ '[ 0 _ _ delete-slice ] when ;
+
+: add-recent ( obj -- )
+ add-recent-where dup
+ [ get [ adjoin ] [ expire ] bi ] [ 2drop ] if
+ redisplay-recent-page ;
\ No newline at end of file
USING: io.encodings.utf8 io.encodings.ascii io.encodings.binary
io.files io.files.temp io.directories html.streams help kernel
assocs sequences make words accessors arrays help.topics vocabs
-tools.vocabs tools.vocabs.browser namespaces prettyprint io
+tools.vocabs help.vocabs namespaces prettyprint io
vocabs.loader serialize fry memoize unicode.case math.order
sorting debugger html xml.syntax xml.writer ;
IN: help.html
--- /dev/null
+Slava Pestov
\ No newline at end of file
--- /dev/null
+IN: help.tips
+USING: help.markup help.syntax debugger ;
+
+TIP: "To look at the most recent error, run " { $link :error } ". To look at the most recent error's callstack, run " { $link :c } "." ;
+
+TIP: "Learn to use " { $link "dataflow-combinators" } "." ;
+
+TIP: "Learn to use " { $link "editor" } " to be able to jump to the source code for word definitions from the listener." ;
+
+TIP: "Check out " { $url "http://concatenative.org/wiki/view/Factor/FAQ" } " to get answers to frequently-asked questions." ;
+
+TIP: "Drop by the " { $snippet "#concatenative" } " IRC channel on " { $snippet "irc.freenode.net" } " some time." ;
+
+TIP: "You can write documentation for your own code using the " { $link "help" } "." ;
+
+TIP: "You can write graphical applications using the " { $link "ui" } "." ;
+
+ARTICLE: "all-tips-of-the-day" "All tips of the day"
+{ $tips-of-the-day } ;
+
+ARTICLE: "tips-of-the-day" "Tips of the day"
+"The " { $vocab-link "help.tips" } " vocabulary provides a facility for displaying tips of the day in the " { $link "ui-listener" } ". Tips are defined with a parsing word:"
+{ $subsection POSTPONE: TIP: }
+"All tips defined so far:"
+{ $subsection "all-tips-of-the-day" } ;
+
+ABOUT: "tips-of-the-day"
\ No newline at end of file
--- /dev/null
+! Copyright (C) 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: parser arrays namespaces sequences random help.markup kernel io
+io.styles colors.constants ;
+IN: help.tips
+
+SYMBOL: tips
+
+tips [ V{ } clone ] initialize
+
+SYNTAX: TIP: parse-definition >array tips get push ;
+
+: a-tip ( -- tip ) tips get random ;
+
+SYMBOL: tip-of-the-day-style
+
+H{
+ { page-color COLOR: lavender }
+ { border-width 5 }
+ { wrap-margin 500 }
+} tip-of-the-day-style set-global
+
+: $tip-of-the-day ( element -- )
+ drop
+ [
+ tip-of-the-day-style get
+ [
+ last-element off
+ "Tip of the day" $heading a-tip print-element nl
+ "— " print-element "all-tips-of-the-day" ($link)
+ ]
+ with-nesting
+ ] ($heading) ;
+
+: tip-of-the-day. ( -- ) { $tip-of-the-day } print-content nl ;
+
+: $tips-of-the-day ( element -- )
+ drop tips get [ nl nl ] [ print-element ] interleave ;
\ No newline at end of file
--- /dev/null
+Slava Pestov
+Eduardo Cavazos
--- /dev/null
+Browsing vocabularies
--- /dev/null
+USING: help.markup help.syntax io strings ;
+IN: help.vocabs
+
+ARTICLE: "vocab-tags" "Vocabulary tags"
+{ $all-tags } ;
+
+ARTICLE: "vocab-authors" "Vocabulary authors"
+{ $all-authors } ;
+
+ARTICLE: "vocab-index" "Vocabulary index"
+{ $subsection "vocab-tags" }
+{ $subsection "vocab-authors" }
+{ $vocab "" } ;
+
+HELP: words.
+{ $values { "vocab" "a vocabulary name" } }
+{ $description "Printings a listing of all the words in a vocabulary, categorized by type." } ;
--- /dev/null
+IN: help.vocabs.tests
+USING: help.vocabs tools.test help.markup help vocabs ;
+
+[ ] [ { $vocab "scratchpad" } print-content ] unit-test
+[ ] [ "classes" vocab print-topic ] unit-test
\ No newline at end of file
--- /dev/null
+! Copyright (C) 2007, 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors arrays assocs classes classes.builtin
+classes.intersection classes.mixin classes.predicate
+classes.singleton classes.tuple classes.union combinators
+definitions effects fry generic help help.markup help.stylesheet
+help.topics io io.files io.pathnames io.styles kernel macros
+make namespaces prettyprint sequences sets sorting summary
+tools.vocabs vocabs vocabs.loader words words.symbol definitions.icons ;
+IN: help.vocabs
+
+: $pretty-link ( element -- )
+ [ first definition-icon 1array $image " " print-element ]
+ [ $definition-link ]
+ bi ;
+
+: <$pretty-link> ( definition -- element )
+ 1array \ $pretty-link prefix ;
+
+: vocab-row ( vocab -- row )
+ [ <$pretty-link> ] [ vocab-summary ] bi 2array ;
+
+: vocab-headings ( -- headings )
+ {
+ { $strong "Vocabulary" }
+ { $strong "Summary" }
+ } ;
+
+: root-heading ( root -- )
+ [ "Children from " prepend ] [ "Children" ] if*
+ $heading ;
+
+: $vocabs ( seq -- )
+ [ vocab-row ] map vocab-headings prefix $table ;
+
+: $vocab-roots ( assoc -- )
+ [
+ [ drop ] [ [ root-heading ] [ $vocabs ] bi* ] if-empty
+ ] assoc-each ;
+
+TUPLE: vocab-tag name ;
+
+INSTANCE: vocab-tag topic
+
+C: <vocab-tag> vocab-tag
+
+: $tags ( seq -- ) [ <vocab-tag> ] map $links ;
+
+TUPLE: vocab-author name ;
+
+INSTANCE: vocab-author topic
+
+C: <vocab-author> vocab-author
+
+: $authors ( seq -- ) [ <vocab-author> ] map $links ;
+
+: describe-help ( vocab -- )
+ [
+ dup vocab-help
+ [ "Documentation" $heading ($link) ]
+ [ "Summary" $heading vocab-summary print-element ]
+ ?if
+ ] unless-empty ;
+
+: describe-children ( vocab -- )
+ vocab-name all-child-vocabs $vocab-roots ;
+
+: files. ( seq -- )
+ snippet-style get [
+ code-style get [
+ [ nl ] [ [ string>> ] keep write-object ] interleave
+ ] with-nesting
+ ] with-style ;
+
+: describe-files ( vocab -- )
+ vocab-files [ <pathname> ] map [
+ "Files" $heading
+ [
+ files.
+ ] ($block)
+ ] unless-empty ;
+
+: describe-tuple-classes ( classes -- )
+ [
+ "Tuple classes" $subheading
+ [
+ [ <$pretty-link> ]
+ [ superclass <$pretty-link> ]
+ [ "slots" word-prop [ name>> ] map " " join <$snippet> ]
+ tri 3array
+ ] map
+ { { $strong "Class" } { $strong "Superclass" } { $strong "Slots" } } prefix
+ $table
+ ] unless-empty ;
+
+: describe-predicate-classes ( classes -- )
+ [
+ "Predicate classes" $subheading
+ [
+ [ <$pretty-link> ]
+ [ superclass <$pretty-link> ]
+ bi 2array
+ ] map
+ { { $strong "Class" } { $strong "Superclass" } } prefix
+ $table
+ ] unless-empty ;
+
+: (describe-classes) ( classes heading -- )
+ '[
+ _ $subheading
+ [ <$pretty-link> 1array ] map $table
+ ] unless-empty ;
+
+: describe-builtin-classes ( classes -- )
+ "Builtin classes" (describe-classes) ;
+
+: describe-singleton-classes ( classes -- )
+ "Singleton classes" (describe-classes) ;
+
+: describe-mixin-classes ( classes -- )
+ "Mixin classes" (describe-classes) ;
+
+: describe-union-classes ( classes -- )
+ "Union classes" (describe-classes) ;
+
+: describe-intersection-classes ( classes -- )
+ "Intersection classes" (describe-classes) ;
+
+: describe-classes ( classes -- )
+ [ builtin-class? ] partition
+ [ tuple-class? ] partition
+ [ singleton-class? ] partition
+ [ predicate-class? ] partition
+ [ mixin-class? ] partition
+ [ union-class? ] partition
+ [ intersection-class? ] filter
+ {
+ [ describe-builtin-classes ]
+ [ describe-tuple-classes ]
+ [ describe-singleton-classes ]
+ [ describe-predicate-classes ]
+ [ describe-mixin-classes ]
+ [ describe-union-classes ]
+ [ describe-intersection-classes ]
+ } spread ;
+
+: word-syntax ( word -- string/f )
+ \ $syntax swap word-help elements dup length 1 =
+ [ first second ] [ drop f ] if ;
+
+: describe-parsing ( words -- )
+ [
+ "Parsing words" $subheading
+ [
+ [ <$pretty-link> ]
+ [ word-syntax dup [ <$snippet> ] when ]
+ bi 2array
+ ] map
+ { { $strong "Word" } { $strong "Syntax" } } prefix
+ $table
+ ] unless-empty ;
+
+: word-row ( word -- element )
+ [ <$pretty-link> ]
+ [ stack-effect dup [ effect>string <$snippet> ] when ]
+ bi 2array ;
+
+: word-headings ( -- element )
+ { { $strong "Word" } { $strong "Stack effect" } } ;
+
+: words-table ( words -- )
+ [ word-row ] map word-headings prefix $table ;
+
+: (describe-words) ( words heading -- )
+ '[ _ $subheading words-table ] unless-empty ;
+
+: describe-generics ( words -- )
+ "Generic words" (describe-words) ;
+
+: describe-macros ( words -- )
+ "Macro words" (describe-words) ;
+
+: describe-primitives ( words -- )
+ "Primitives" (describe-words) ;
+
+: describe-compounds ( words -- )
+ "Ordinary words" (describe-words) ;
+
+: describe-predicates ( words -- )
+ "Class predicate words" (describe-words) ;
+
+: describe-symbols ( words -- )
+ [
+ "Symbol words" $subheading
+ [ <$pretty-link> 1array ] map $table
+ ] unless-empty ;
+
+: $words ( words -- )
+ [
+ "Words" $heading
+
+ natural-sort
+ [ [ class? ] filter describe-classes ]
+ [
+ [ [ class? ] [ symbol? ] bi and not ] filter
+ [ parsing-word? ] partition
+ [ generic? ] partition
+ [ macro? ] partition
+ [ symbol? ] partition
+ [ primitive? ] partition
+ [ predicate? ] partition swap
+ {
+ [ describe-parsing ]
+ [ describe-generics ]
+ [ describe-macros ]
+ [ describe-symbols ]
+ [ describe-primitives ]
+ [ describe-compounds ]
+ [ describe-predicates ]
+ } spread
+ ] bi
+ ] unless-empty ;
+
+: words. ( vocab -- )
+ last-element off
+ [ require ] [ words $words ] bi nl ;
+
+: describe-metadata ( vocab -- )
+ [
+ [ vocab-tags [ "Tags:" swap \ $tags prefix 2array , ] unless-empty ]
+ [ vocab-authors [ "Authors:" swap \ $authors prefix 2array , ] unless-empty ]
+ bi
+ ] { } make
+ [ "Meta-data" $heading $table ] unless-empty ;
+
+: $vocab ( element -- )
+ first {
+ [ describe-help ]
+ [ describe-metadata ]
+ [ words $words ]
+ [ describe-files ]
+ [ describe-children ]
+ } cleave ;
+
+: keyed-vocabs ( str quot -- seq )
+ [ all-vocabs ] 2dip '[ [ _ swap @ member? ] filter ] assoc-map ; inline
+
+: tagged ( tag -- assoc )
+ [ vocab-tags ] keyed-vocabs ;
+
+: authored ( author -- assoc )
+ [ vocab-authors ] keyed-vocabs ;
+
+: $tagged-vocabs ( element -- )
+ first tagged $vocab-roots ;
+
+: $authored-vocabs ( element -- )
+ first authored $vocab-roots ;
+
+: $all-tags ( element -- )
+ drop "Tags" $heading all-tags $tags ;
+
+: $all-authors ( element -- )
+ drop "Authors" $heading all-authors $authors ;
+
+INSTANCE: vocab topic
+
+INSTANCE: vocab-link topic
+
+M: vocab-spec article-title vocab-name " vocabulary" append ;
+
+M: vocab-spec article-name vocab-name ;
+
+M: vocab-spec article-content
+ vocab-name \ $vocab swap 2array ;
+
+M: vocab-spec article-parent drop "vocab-index" ;
+
+M: vocab-tag >link ;
+
+M: vocab-tag article-title
+ name>> "Vocabularies tagged “" "”" surround ;
+
+M: vocab-tag article-name name>> ;
+
+M: vocab-tag article-content
+ \ $tagged-vocabs swap name>> 2array ;
+
+M: vocab-tag article-parent drop "vocab-tags" ;
+
+M: vocab-tag summary article-title ;
+
+M: vocab-author >link ;
+
+M: vocab-author article-title
+ name>> "Vocabularies by " prepend ;
+
+M: vocab-author article-name name>> ;
+
+M: vocab-author article-content
+ \ $authored-vocabs swap name>> 2array ;
+
+M: vocab-author article-parent drop "vocab-authors" ;
+
+M: vocab-author summary article-title ;
+++ /dev/null
-IN: tools.apropos
-USING: help.markup help.syntax strings ;
-
-HELP: apropos
-{ $values { "str" string } }
-{ $description "Lists all words, vocabularies and help articles whose name contains a subsequence equal to " { $snippet "str" } ". Results are ranked using a simple distance algorithm." } ;
+++ /dev/null
-IN: tools.apropos.tests
-USING: tools.apropos tools.test ;
-
-[ ] [ "swp" apropos ] unit-test
+++ /dev/null
-! Copyright (C) 2008 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays assocs fry help.markup help.topics io
-kernel make math math.parser namespaces sequences sorting
-summary tools.completion tools.vocabs tools.vocabs.browser
-vocabs words unicode.case help ;
-IN: tools.apropos
-
-: $completions ( seq -- )
- dup [ word? ] all? [ words-table ] [
- dup [ vocab-spec? ] all? [
- $vocabs
- ] [
- [ <$pretty-link> 1array ] map $table
- ] if
- ] if ;
-
-TUPLE: more-completions seq ;
-
-CONSTANT: max-completions 5
-
-M: more-completions article-title
- seq>> length number>string " results" append ;
-
-M: more-completions article-name
- seq>> length max-completions - number>string " more results" append ;
-
-M: more-completions article-content
- seq>> sort-values keys \ $completions prefix ;
-
-: (apropos) ( str candidates title -- element )
- [
- [ completions ] dip '[
- _ 1array \ $heading prefix ,
- [ max-completions short head keys \ $completions prefix , ]
- [ dup length max-completions > [ more-completions boa <$link> , ] [ drop ] if ]
- bi
- ] unless-empty
- ] { } make ;
-
-: word-candidates ( words -- candidates )
- [ dup name>> >lower ] { } map>assoc ;
-
-: vocab-candidates ( -- candidates )
- all-vocabs-seq [ dup vocab-name >lower ] { } map>assoc ;
-
-: help-candidates ( seq -- candidates )
- [ [ >link ] [ article-title >lower ] bi ] { } map>assoc
- sort-values ;
-
-: $apropos ( str -- )
- first
- [ all-words word-candidates "Words" (apropos) ]
- [ vocab-candidates "Vocabularies" (apropos) ]
- [ articles get keys help-candidates "Help articles" (apropos) ]
- tri 3array print-element ;
-
-TUPLE: apropos search ;
-
-C: <apropos> apropos
-
-M: apropos article-title
- search>> "Search results for “" "”" surround ;
-
-M: apropos article-name article-title ;
-
-M: apropos article-content
- search>> 1array \ $apropos prefix ;
-
-: apropos ( str -- )
- <apropos> print-topic ;
+++ /dev/null
-Slava Pestov
-Eduardo Cavazos
+++ /dev/null
-USING: help.markup help.syntax io strings ;
-IN: tools.vocabs.browser
-
-ARTICLE: "vocab-tags" "Vocabulary tags"
-{ $all-tags } ;
-
-ARTICLE: "vocab-authors" "Vocabulary authors"
-{ $all-authors } ;
-
-ARTICLE: "vocab-index" "Vocabulary index"
-{ $subsection "vocab-tags" }
-{ $subsection "vocab-authors" }
-{ $vocab "" } ;
-
-HELP: words.
-{ $values { "vocab" "a vocabulary name" } }
-{ $description "Printings a listing of all the words in a vocabulary, categorized by type." } ;
+++ /dev/null
-IN: tools.vocabs.browser.tests
-USING: tools.vocabs.browser tools.test help.markup help vocabs ;
-
-[ ] [ { $vocab "scratchpad" } print-content ] unit-test
-[ ] [ "classes" vocab print-topic ] unit-test
\ No newline at end of file
+++ /dev/null
-! Copyright (C) 2007, 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays assocs classes classes.builtin
-classes.intersection classes.mixin classes.predicate
-classes.singleton classes.tuple classes.union combinators
-definitions effects fry generic help help.markup help.stylesheet
-help.topics io io.files io.pathnames io.styles kernel macros
-make namespaces prettyprint sequences sets sorting summary
-tools.vocabs vocabs vocabs.loader words words.symbol
-combinators.smart definitions.icons ;
-IN: tools.vocabs.browser
-
-: <$pretty-link> ( definition -- element )
- [
- [ definition-icon 1array \ $image prefix ]
- [ drop " " ]
- [ 1array \ $definition-link prefix ]
- tri
- ] output>array ;
-
-: vocab-row ( vocab -- row )
- [ <$pretty-link> ] [ vocab-summary ] bi 2array ;
-
-: vocab-headings ( -- headings )
- {
- { $strong "Vocabulary" }
- { $strong "Summary" }
- } ;
-
-: root-heading ( root -- )
- [ "Children from " prepend ] [ "Children" ] if*
- $heading ;
-
-: $vocabs ( seq -- )
- [ vocab-row ] map vocab-headings prefix $table ;
-
-: $vocab-roots ( assoc -- )
- [
- [ drop ] [ [ root-heading ] [ $vocabs ] bi* ] if-empty
- ] assoc-each ;
-
-TUPLE: vocab-tag name ;
-
-INSTANCE: vocab-tag topic
-
-C: <vocab-tag> vocab-tag
-
-: $tags ( seq -- ) [ <vocab-tag> ] map $links ;
-
-TUPLE: vocab-author name ;
-
-INSTANCE: vocab-author topic
-
-C: <vocab-author> vocab-author
-
-: $authors ( seq -- ) [ <vocab-author> ] map $links ;
-
-: describe-help ( vocab -- )
- [
- dup vocab-help
- [ "Documentation" $heading ($link) ]
- [ "Summary" $heading vocab-summary print-element ]
- ?if
- ] unless-empty ;
-
-: describe-children ( vocab -- )
- vocab-name all-child-vocabs $vocab-roots ;
-
-: files. ( seq -- )
- snippet-style get [
- code-style get [
- [ nl ] [ [ string>> ] keep write-object ] interleave
- ] with-nesting
- ] with-style ;
-
-: describe-files ( vocab -- )
- vocab-files [ <pathname> ] map [
- "Files" $heading
- [
- files.
- ] ($block)
- ] unless-empty ;
-
-: describe-tuple-classes ( classes -- )
- [
- "Tuple classes" $subheading
- [
- [ <$pretty-link> ]
- [ superclass <$pretty-link> ]
- [ "slots" word-prop [ name>> ] map " " join <$snippet> ]
- tri 3array
- ] map
- { { $strong "Class" } { $strong "Superclass" } { $strong "Slots" } } prefix
- $table
- ] unless-empty ;
-
-: describe-predicate-classes ( classes -- )
- [
- "Predicate classes" $subheading
- [
- [ <$pretty-link> ]
- [ superclass <$pretty-link> ]
- bi 2array
- ] map
- { { $strong "Class" } { $strong "Superclass" } } prefix
- $table
- ] unless-empty ;
-
-: (describe-classes) ( classes heading -- )
- '[
- _ $subheading
- [ <$pretty-link> 1array ] map $table
- ] unless-empty ;
-
-: describe-builtin-classes ( classes -- )
- "Builtin classes" (describe-classes) ;
-
-: describe-singleton-classes ( classes -- )
- "Singleton classes" (describe-classes) ;
-
-: describe-mixin-classes ( classes -- )
- "Mixin classes" (describe-classes) ;
-
-: describe-union-classes ( classes -- )
- "Union classes" (describe-classes) ;
-
-: describe-intersection-classes ( classes -- )
- "Intersection classes" (describe-classes) ;
-
-: describe-classes ( classes -- )
- [ builtin-class? ] partition
- [ tuple-class? ] partition
- [ singleton-class? ] partition
- [ predicate-class? ] partition
- [ mixin-class? ] partition
- [ union-class? ] partition
- [ intersection-class? ] filter
- {
- [ describe-builtin-classes ]
- [ describe-tuple-classes ]
- [ describe-singleton-classes ]
- [ describe-predicate-classes ]
- [ describe-mixin-classes ]
- [ describe-union-classes ]
- [ describe-intersection-classes ]
- } spread ;
-
-: word-syntax ( word -- string/f )
- \ $syntax swap word-help elements dup length 1 =
- [ first second ] [ drop f ] if ;
-
-: describe-parsing ( words -- )
- [
- "Parsing words" $subheading
- [
- [ <$pretty-link> ]
- [ word-syntax dup [ <$snippet> ] when ]
- bi 2array
- ] map
- { { $strong "Word" } { $strong "Syntax" } } prefix
- $table
- ] unless-empty ;
-
-: word-row ( word -- element )
- [ <$pretty-link> ]
- [ stack-effect dup [ effect>string <$snippet> ] when ]
- bi 2array ;
-
-: word-headings ( -- element )
- { { $strong "Word" } { $strong "Stack effect" } } ;
-
-: words-table ( words -- )
- [ word-row ] map word-headings prefix $table ;
-
-: (describe-words) ( words heading -- )
- '[ _ $subheading words-table ] unless-empty ;
-
-: describe-generics ( words -- )
- "Generic words" (describe-words) ;
-
-: describe-macros ( words -- )
- "Macro words" (describe-words) ;
-
-: describe-primitives ( words -- )
- "Primitives" (describe-words) ;
-
-: describe-compounds ( words -- )
- "Ordinary words" (describe-words) ;
-
-: describe-predicates ( words -- )
- "Class predicate words" (describe-words) ;
-
-: describe-symbols ( words -- )
- [
- "Symbol words" $subheading
- [ <$pretty-link> 1array ] map $table
- ] unless-empty ;
-
-: $words ( words -- )
- [
- "Words" $heading
-
- natural-sort
- [ [ class? ] filter describe-classes ]
- [
- [ [ class? ] [ symbol? ] bi and not ] filter
- [ parsing-word? ] partition
- [ generic? ] partition
- [ macro? ] partition
- [ symbol? ] partition
- [ primitive? ] partition
- [ predicate? ] partition swap
- {
- [ describe-parsing ]
- [ describe-generics ]
- [ describe-macros ]
- [ describe-symbols ]
- [ describe-primitives ]
- [ describe-compounds ]
- [ describe-predicates ]
- } spread
- ] bi
- ] unless-empty ;
-
-: words. ( vocab -- )
- last-element off
- [ require ] [ words $words ] bi nl ;
-
-: describe-metadata ( vocab -- )
- [
- [ vocab-tags [ "Tags:" swap \ $tags prefix 2array , ] unless-empty ]
- [ vocab-authors [ "Authors:" swap \ $authors prefix 2array , ] unless-empty ]
- bi
- ] { } make
- [ "Meta-data" $heading $table ] unless-empty ;
-
-: $vocab ( element -- )
- first {
- [ describe-help ]
- [ describe-metadata ]
- [ words $words ]
- [ describe-files ]
- [ describe-children ]
- } cleave ;
-
-: keyed-vocabs ( str quot -- seq )
- [ all-vocabs ] 2dip '[ [ _ swap @ member? ] filter ] assoc-map ; inline
-
-: tagged ( tag -- assoc )
- [ vocab-tags ] keyed-vocabs ;
-
-: authored ( author -- assoc )
- [ vocab-authors ] keyed-vocabs ;
-
-: $tagged-vocabs ( element -- )
- first tagged $vocab-roots ;
-
-: $authored-vocabs ( element -- )
- first authored $vocab-roots ;
-
-: $all-tags ( element -- )
- drop "Tags" $heading all-tags $tags ;
-
-: $all-authors ( element -- )
- drop "Authors" $heading all-authors $authors ;
-
-INSTANCE: vocab topic
-
-INSTANCE: vocab-link topic
-
-M: vocab-spec article-title vocab-name " vocabulary" append ;
-
-M: vocab-spec article-name vocab-name ;
-
-M: vocab-spec article-content
- vocab-name \ $vocab swap 2array ;
-
-M: vocab-spec article-parent drop "vocab-index" ;
-
-M: vocab-tag >link ;
-
-M: vocab-tag article-title
- name>> "Vocabularies tagged “" "”" surround ;
-
-M: vocab-tag article-name name>> ;
-
-M: vocab-tag article-content
- \ $tagged-vocabs swap name>> 2array ;
-
-M: vocab-tag article-parent drop "vocab-tags" ;
-
-M: vocab-tag summary article-title ;
-
-M: vocab-author >link ;
-
-M: vocab-author article-title
- name>> "Vocabularies by " prepend ;
-
-M: vocab-author article-name name>> ;
-
-M: vocab-author article-content
- \ $authored-vocabs swap name>> 2array ;
-
-M: vocab-author article-parent drop "vocab-authors" ;
-
-M: vocab-author summary article-title ;
+++ /dev/null
-Browsing vocabularies
USING: documents help.markup help.syntax ui.gadgets
ui.gadgets.scrollers models strings ui.commands
-ui.text colors fonts ;
+ui.text colors fonts help.tips ;
IN: ui.gadgets.editors
HELP: editor
"Editors edit " { $emphasis "documents" } ":"
{ $subsection "documents" } ;
+TIP: "Editor gadgets support undo and redo; press " { $command editor "editing" com-undo } " and " { $command editor "editing" com-redo } "." ;
+
+TIP: "Learn the keyboard shortcuts used in " { $link "ui.gadgets.editors" } "." ;
+
ABOUT: "ui.gadgets.editors"
! Copyright (C) 2006, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: debugger help help.topics help.crossref kernel models compiler.units
-assocs words vocabs accessors fry combinators.short-circuit
-sequences models models.history tools.apropos combinators
-ui.commands ui.gadgets ui.gadgets.panes ui.gadgets.scrollers
-ui.gadgets.tracks ui.gestures ui.gadgets.buttons ui.gadgets.packs
+USING: debugger help help.topics help.crossref help.home kernel
+models compiler.units assocs words vocabs accessors fry
+combinators.short-circuit namespaces sequences models
+models.history help.apropos combinators ui.commands ui.gadgets
+ui.gadgets.panes ui.gadgets.scrollers ui.gadgets.tracks
+ui.gestures ui.gadgets.buttons ui.gadgets.packs
ui.gadgets.editors ui.gadgets.labels ui.gadgets.status-bar
ui.gadgets.glass ui.gadgets.borders ui.tools.common
ui.tools.browser.popups ui ;
{ 650 400 } browser-gadget set-tool-dim
: show-help ( link browser-gadget -- )
- model>> dup add-history
- [ >link ] dip set-model ;
+ [ >link ] [ model>> ] bi*
+ [ [ add-recent ] [ add-history ] bi* ] [ set-model ] 2bi ;
: <help-pane> ( browser-gadget -- gadget )
model>> [ '[ _ print-topic ] try ] <pane-control> ;
: com-forward ( browser -- ) model>> go-forward ;
-: com-documentation ( browser -- ) "handbook" swap show-help ;
+: com-documentation ( browser -- ) "help.home" swap show-help ;
: browser-help ( -- ) "ui-browser" com-browse ;
over [ show-help ] [ 2drop ] if ;
: navigate ( browser quot -- )
- '[ control-value @ ] keep ?show-help ;
+ '[ control-value @ ] keep ?show-help ; inline
: com-up ( browser -- ) [ article-parent ] navigate ;
-USING: help.markup help.syntax ;
+USING: help.markup help.syntax help.tips ;
IN: ui.tools.deploy
HELP: deploy-tool
"Alternatively, right-click on a vocabulary presentation in the UI and choose " { $strong "Deploy tool" } " from the resulting popup menu."
{ $see-also "tools.deploy" } ;
+TIP: "Generate stand-alone applications from vocabularies with the " { $link "ui.tools.deploy" } "." ;
+
ABOUT: "ui.tools.deploy"
USING: accessors arrays assocs calendar colors colors.constants
documents documents.elements fry kernel words sets splitting math
math.vectors models.delay models.arrow combinators.short-circuit
-parser present sequences tools.completion tools.vocabs.browser generic
+parser present sequences tools.completion help.vocabs generic
generic.standard.engines.tuple fonts definitions.icons ui.images
ui.commands ui.operations ui.gadgets ui.gadgets.editors
ui.gadgets.glass ui.gadgets.scrollers ui.gadgets.tables
USING: help.markup help.syntax ui.commands ui.operations
-ui.gadgets.editors ui.gadgets.panes listener io words ;
+ui.gadgets.editors ui.gadgets.panes listener io words
+ui.tools.listener.completion ui.tools.common help.tips
+tools.vocabs vocabs ;
IN: ui.tools.listener
HELP: interactor
{ $operations \ word }
{ $heading "Vocabulary commands" }
"These words operate on the vocabulary at the cursor."
-{ $operations \ word }
+{ $operations T{ vocab-link f "kernel" } }
{ $command-map interactor "quotation" }
{ $heading "Editing commands" }
"The text editing commands are standard; see " { $link "gadgets-editors-commands" } "."
{ $heading "Implementation" }
"Listeners are instances of " { $link listener-gadget } ". The listener consists of an output area (instance of " { $link pane } ") and an input area (instance of " { $link interactor } "). Clickable presentations can also be printed to the listener; see " { $link "ui-presentations" } "." ;
+TIP: "You can read documentation by pressing F1." ;
+
+TIP: "The listener tool remembers previous lines of input. Press " { $command interactor "completion" recall-previous } " and " { $command interactor "completion" recall-next } " to cycle through them." ;
+
+TIP: "When you mouse over certain objects, a block border will appear. Left-clicking on such an object will perform the default operation. Right-clicking will show a menu with all operations." ;
+
+TIP: "The status bar displays stack effects of recognized words as they are being typed in." ;
+
+TIP: "Press " { $command interactor "completion" code-completion-popup } " to complete word, vocabulary and Unicode character names. The latter two features become available if the cursor is after a " { $link POSTPONE: USE: } ", " { $link POSTPONE: USING: } " or " { $link POSTPONE: CHAR: } "." ;
+
+TIP: "If a word's vocabulary is loaded, but not in the search path, you can use restarts to add the vocabulary to the search path. Auto-use mode (" { $command listener-gadget "toolbar" com-auto-use } ") invokes restarts automatically if there is only one restart." ;
+
+TIP: "Scroll the listener from the keyboard by pressing " { $command listener-gadget "scrolling" com-page-up } " and " { $command listener-gadget "scrolling" com-page-down } "." ;
+
+TIP: "Press " { $command tool "common" refresh-all } " or run " { $link refresh-all } " to reload changed source files from disk. " ;
+
ABOUT: "ui-listener"
\ No newline at end of file
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs calendar combinators locals
colors.constants combinators.short-circuit compiler.units
-concurrency.flags concurrency.mailboxes continuations destructors
-documents documents.elements fry hashtables help help.markup io
-io.styles kernel lexer listener math models models.delay models.arrow
-namespaces parser prettyprint quotations sequences strings threads
-tools.vocabs vocabs vocabs.loader vocabs.parser words debugger ui ui.commands
-ui.pens.solid ui.gadgets ui.gadgets.glass ui.gadgets.buttons ui.gadgets.editors
+help.tips concurrency.flags concurrency.mailboxes continuations
+destructors documents documents.elements fry hashtables help
+help.markup io io.styles kernel lexer listener math models
+models.delay models.arrow namespaces parser prettyprint quotations
+sequences strings threads tools.vocabs vocabs vocabs.loader
+vocabs.parser words debugger ui ui.commands ui.pens.solid ui.gadgets
+ui.gadgets.glass ui.gadgets.buttons ui.gadgets.editors
ui.gadgets.labeled ui.gadgets.panes ui.gadgets.scrollers
ui.gadgets.status-bar ui.gadgets.tracks ui.gadgets.borders ui.gestures
ui.operations ui.tools.browser ui.tools.common ui.tools.debugger
{ T{ key-down f { C+ } "r" } history-completion-popup }
} define-command-map
-: welcome. ( -- )
- "If this is your first time with Factor, please read the " print
- "handbook" ($link) ". To see a list of keyboard shortcuts," print
- "press F1." print nl ;
-
: listener-thread ( listener -- )
dup listener-streams [
[ com-browse ] help-hook set
'[ [ _ input>> ] 2dip debugger-popup ] error-hook set
- welcome.
+ tip-of-the-day. nl
listener
] with-streams* ;
[ wait-for-listener ]
} cleave ;
-: listener-help ( -- ) "ui-listener" com-browse ;
+: listener-help ( -- ) "help.home" com-browse ;
\ listener-help H{ { +nullary+ t } } define-command
--- /dev/null
+USING: help.tips help.markup help.syntax ui.operations
+tools.walker tools.time tools.profiler ui.tools.operations ;
+
+TIP: "Press " { $operation com-stack-effect } " to print the stack effect of the code in the input field without executing it (" { $link "inference" } ")." ;
+
+TIP: "Press " { $operation walk } " to single-step through the code in the input field (" { $link "ui-walker" } ")." ;
+
+TIP: "Press " { $operation time } " to time execution of the code in the input field (" { $link "timing" } ")." ;
ui.tools.browser ui.tools.listener ui.tools.listener.completion
ui.tools.profiler ui.tools.inspector ui.tools.traceback
ui.commands ui.gadgets.editors ui.gestures ui.operations
-ui.tools.deploy models ;
+ui.tools.deploy models help.tips ;
IN: ui.tools.operations
! Objects
{ +listener+ t }
} define-operation
-: com-profile ( quot -- ) profile profiler-window ;
-
[ quotation? ] \ com-profile H{
{ +keyboard+ T{ key-down f { C+ } "o" } }
{ +listener+ t }
--- /dev/null
+IN: ui.tools.profiler
+USING: help.markup help.syntax ui.operations help.tips ;
+
+ARTICLE: "ui.tools.profiler" "UI profiler tool"
+"The " { $vocab-link "ui.tools.profiler" } " vocabulary implements a graphical tool for viewing profiling results (see " { $link "tools.profiler" } ")."
+$nl
+"To use the profiler, enter a piece of code in the listener's input area and press " { $operation com-profile } "." ;
+
+TIP: "Press " { $operation com-profile } " to run the code in the input field with profiling enabled (" { $link "ui.tools.profiler" } ")." ;
+
+ABOUT: "ui.tools.profiler"
\ No newline at end of file
: profiler-window ( -- )
<profiler-gadget> "Profiling results" open-status-window ;
+: com-profile ( quot -- ) profile profiler-window ;
+
MAIN: profiler-window
\ No newline at end of file
USING: editors help.markup help.syntax summary inspector io io.styles
listener parser prettyprint tools.profiler tools.walker ui.commands
ui.gadgets.panes ui.gadgets.presentations ui.operations
-ui.tools.operations ui.tools.profiler ui.tools.common vocabs see ;
+ui.tools.operations ui.tools.profiler ui.tools.common vocabs see
+help.tips ;
IN: ui.tools
ARTICLE: "starting-ui-tools" "Starting the UI tools"
"Platform-specific features:"
{ $subsection "ui-cocoa" } ;
+TIP: "All UI developer tools support a common set of " { $link "ui-shortcuts" } ". Each individual tool has its own shortcuts as well; the F1 key is context-sensitive." ;
+
ABOUT: "ui-tools"
"definitions"
"editors"
"help"
+ "help.apropos"
"help.lint"
"inspector"
"io"
"strings"
"syntax"
"tools.annotations"
- "tools.apropos"
"tools.crossref"
"tools.disassembler"
"tools.memory"
USING: arrays byte-arrays help.markup help.syntax
kernel kernel.private strings.private sequences vectors
-sbufs math tools.vocabs.browser ;
+sbufs math help.vocabs ;
IN: strings
ARTICLE: "strings" "Strings"
USING: kernel fry sequences
- vocabs.loader tools.vocabs.browser
+ vocabs.loader help.vocabs
ui ui.gadgets ui.gadgets.buttons ui.gadgets.packs ui.gadgets.scrollers
ui.tools.listener
accessors ;
USING: accessors arrays assocs combinators help help.crossref
help.markup help.topics io io.streams.string kernel make namespaces
-parser prettyprint sequences summary tools.vocabs tools.vocabs.browser
+parser prettyprint sequences summary tools.vocabs help.vocabs
vocabs vocabs.loader words see ;
IN: fuel.help
! See http://factorcode.org/license.txt for BSD license.
USING: slides help.markup math arrays hashtables namespaces
sequences kernel sequences parser memoize io.encodings.binary
-locals kernel.private tools.vocabs.browser assocs quotations
+locals kernel.private help.vocabs assocs quotations
urls peg.ebnf tools.vocabs tools.annotations tools.crossref
help.topics math.functions compiler.tree.optimizer
compiler.cfg.optimizer fry ;
! See http://factorcode.org/license.txt for BSD license.
USING: slides help.markup math arrays hashtables namespaces
sequences kernel sequences parser memoize io.encodings.binary
-locals kernel.private tools.vocabs.browser assocs quotations
+locals kernel.private help.vocabs assocs quotations
urls peg.ebnf tools.vocabs tools.annotations tools.crossref
help.topics math.functions compiler.tree.optimizer
compiler.cfg.optimizer fry ;
! See http://factorcode.org/license.txt for BSD license.
USING: slides help.markup math arrays hashtables namespaces sequences
kernel sequences parser memoize io.encodings.binary locals
-kernel.private tools.vocabs.browser assocs quotations tools.vocabs
+kernel.private help.vocabs assocs quotations tools.vocabs
tools.annotations tools.crossref help.topics math.functions
compiler.tree.optimizer compiler.cfg.optimizer fry ui.gadgets.panes
tetris tetris.game combinators generalizations multiline
! See http://factorcode.org/license.txt for BSD license.
USING: slides help.markup math arrays hashtables namespaces
sequences kernel sequences parser memoize io.encodings.binary
-locals kernel.private tools.vocabs.browser assocs quotations
+locals kernel.private help.vocabs assocs quotations
urls peg.ebnf tools.vocabs tools.annotations tools.crossref
help.topics math.functions compiler.tree.optimizer
compiler.cfg.optimizer fry ;