Changeset 18545 in project


Ignore:
Timestamp:
06/18/10 20:34:00 (11 years ago)
Author:
sjamaan
Message:

qwiki: Make search more humane by getting (mostly) rid of the estraier magic search syntax

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/4/qwiki/branches/svnwiki-sxml/qwiki-search.scm

    r18535 r18545  
    4141(use data-structures extras srfi-1 srfi-13 intarweb uri-common
    4242     qwiki qwiki-sxml sxml-transforms sxpath sxpath-lolevel estraier-client)
     43(require-library regex)
     44(import irregex)
    4345
    4446(define search-server-uri
     
    6466        ;; procedure arguments too, this way...)
    6567        (attribs-sxpath (sxpath '(// def sig *)))
    66         (alist-append/string! (lambda (key value alist)
    67                                 (let* ((old (alist-ref key alist eq? ""))
    68                                        (new (string-append old " " value)))
    69                                   (alist-update! key new alist)))))
     68        (add-def! (lambda (key value alist)
     69                    (let* ((old-item (alist-ref key alist eq? ""))
     70                           (new-item (string-append old-item " " value))
     71                           (old-ids (alist-ref 'identifier alist eq? ""))
     72                           (new-ids (string-append old-ids " " value)))
     73                      (alist-update! 'identifier new-ids
     74                                     (alist-update! key new-item alist))))))
    7075    (lambda (doc)
    7176      (let loop ((items (attribs-sxpath doc))
     
    7479            (values (contents-sxpath doc) (alist-delete! #f attrs))
    7580            (loop (cdr items)
    76                   (alist-append/string! (sxml:element-name (car items))
    77                                         (sxml:text (car items))
    78                                         attrs)))))))
     81                  (add-def! (sxml:element-name (car items))
     82                            (sxml:text (car items))
     83                            attrs)))))))
    7984
    8085(define (update-search-entry! path page)
     
    96101                        (form (@ (action "/search"))
    97102                              (div
    98                                (label "text"
    99                                       (input (@ (type "text") (name "phrase"))))
    100                                (label "attributes"
    101                                       (input (@ (type "text") (name "attrs"))))
     103                               (label "free text"
     104                                      (input (@ (type "text") (name "text"))))
     105                               (label "identifier"
     106                                      (input (@ (type "text") (name "ident"))))
    102107                               (input (@ (type "submit") (value "search")))
    103108                               (a (@ (href "/search-help")) "search help"))))
     
    109114  (ensure-qwiki-node-exists!)
    110115  (let* ((query (uri-query (request-uri request)))
    111          (phrase (alist-ref 'phrase query))
    112          (attrs (alist-ref 'attrs query))
    113          (attr-phrases (if attrs (list attrs) (list)))
     116         ;; accept search like "procedure: foo" or just "foo"
     117         (ident-m (irregex-match '(seq (* white) (submatch (+ print))
     118                                       (* white) ":" (+ white)
     119                                       (submatch (+ print)) (* white))
     120                                 (alist-ref 'ident query eq? "")))
     121         (type (if ident-m (irregex-match-substring ident-m 1) "identifier"))
     122         (ident (if ident-m
     123                    (irregex-match-substring ident-m 2)
     124                    (string-trim-both (alist-ref 'ident query eq? ""))))
     125         (attr-phrases (if (not (string-null? ident))
     126                           (list (conc type " STRINC " ident))
     127                           (list)))
     128         (text (alist-ref 'text query eq? ""))
     129         (phrase (if (string-null? (string-trim-both text))
     130                     ;; Search for the identifier in main text so it shows
     131                     ;; that text's context in the results (not perfect but
     132                     ;; better than nothing)
     133                     ident
     134                     text))
    114135         (page (or (string->number (alist-ref 'page query eq? "0")) 0))
    115136         (page-size 10))
Note: See TracChangeset for help on using the changeset viewer.