! Copyright (C) 2012 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
-USING: fry help help.markup help.topics io kernel memoize
-sequences sequences.deep sorting splitting strings unicode.case
-unicode.categories ;
+USING: arrays combinators combinators.short-circuit help
+help.apropos help.markup help.stylesheet help.topics io
+io.styles kernel math namespaces sequences sorting splitting
+strings unicode words ;
IN: help.search
<PRIVATE
-: (article-words) ( name -- words )
- article-content [ string? ] filter
- [ >lower [ blank? ] split-when ] map concat
- [ CHAR: - over member? [ "-" split ] when ] map
- flatten harvest ;
+: search-words ( str -- seq )
+ >lower "-" split [ [ blank? ] split-when ] map concat ;
+
+: element-value ( element -- str )
+ dup array? [
+ dup ?first {
+ { \ $link [ second article-name ] }
+ { \ $vocab-link [ second ] }
+ { \ $emphasis [ second ] }
+ { \ $subsection [ second article-name ] }
+ { \ $subsections [ rest [ article-name ] map join-words ] }
+ { \ $description [ rest [ element-value ] map join-words ] }
+ { \ $notes [ rest [ element-value ] map join-words ] }
+ { \ $snippet [ rest [ element-value ] map join-words ] }
+ [ 2drop f ]
+ } case
+ ] [ dup string? [ drop f ] unless ] if ;
MEMO: article-words ( name -- words )
- (article-words) [
- dup [ letter? not ] any? [
- [ [ letter? ] [ digit? ] bi or not ] split-when
- ] when
- ] map flatten [ [ digit? ] all? not ] filter harvest ;
+ article-content [ element-value ] map join-words search-words
+ [ [ digit? ] all? ] reject
+ [ [ { [ letter? ] [ digit? ] } 1|| not ] trim ] map! harvest ;
+
+: (search-articles) ( string -- seq' )
+ search-words [ { } ] [
+ [ all-articles ] dip
+ dup length 1 > [
+ '[ article-words _ subseq-of? ] filter
+ ] [
+ first '[ article-words [ _ head? ] any? ] filter
+ ] if
+ ] if-empty [ article-name ] sort-with ;
PRIVATE>
-: search-docs ( string -- seq' )
- [ all-articles ] dip >lower [ blank? ] split-when
- '[ article-words [ _ member? ] any? ] filter
- [ article-name ] sort-with ;
-
-: search-docs. ( string -- )
- search-docs [ ($link) nl ] each ;
+: search-articles ( string -- )
+ [
+ last-element off
+ [
+ "Search results for “" "”" surround
+ title-style get [ format ] ($block)
+ ]
+ [
+ (search-articles) [ word? ] partition swap
+ "Articles" "Words"
+ [ over empty? [ 2drop ] [ $heading $completions ] if ]
+ bi-curry@ bi*
+ ] bi
+ ] with-default-style nl ;