Impromptu: access the Wiki docs from the editor

When you’re Impromptu-ing but don’t know the meaning or syntax of a function, the usual thing to do is calling (help function-name) to get some help about that function, or (help function-name #t) if you want to see also the examples associated with it. The help text gets displayed in the log view, so that you can then copy/paste what you need from there.
Quite useful, but nonetheless I always find myself fighting with the log window: too small, hidden away by other canvases, or not readable anymore cause after calling the help function I’ve evaluated other stuff that has moved up the much needed help-text.

Since a couple of months ago Impromptu has a wiki too – so I thought, it’d be nice to see a function’s help in a browser window, and possibly contribute to its explanation too..

So, that’s the rationale for this little script. By calling ‘wiki’ you can open up a web browser at the relevant Impromptu-wiki page.. as simple as that.


First off, we need a couple of utility functions that are not included in Impromptu by default, for better manipulating strings, lists and webpages (UPDATE 9-Nov2010: some of this symbols have been included in Improptu 2.5, so I prefixed the one below with the utils: namespace):

;; utilities

;; (utils:list-flatten '(9 9 (9 9 9 ))))  = (9 9 9 9 9)
(define utils:list-flatten
   (lambda (l)
      (cond ((null? l)
            ((atom? l)
             (list l))
            (#t (append (utils:list-flatten  (car l)) (utils:list-flatten  (cdr l)))))))

;; returns a char from a string of length 1, or a list of chars from a longer string
(define utils:char
   (lambda (string_char)
      (if (string? string_char)
          (if (> (string-length string_char) 0)
              (if (> (string-length string_char) 1)
                  (string->list string_char)
                  (car (string->list string_char))))
          (print 'please 'enter 'a 'string))))

;; matches a single character in a string, and replaces it
(define utils:string-replace
   (lambda (s match replacement)
      (let ((ll (string->list s))
            (match1 (utils:char match))
            (replacement1 (utils:char replacement)))
         (if (= (string-length match) 1)
             (let ((z (map (lambda (x)
                              (if (equal? x match1)
                (list->string (utils:list-flatten z)))
             (print "i can match only single characters for now")))))

;; makes a string upper case
(define utils:string-capitalize
   (lambda (s)
      (string-append (string (char-upcase (string-ref s 0))) (substring s 1 (string-length s)))))

;; open-url: calls the default mac browser with a url argument 
;; disclaimer: I'm not an objc programmer... found an example at 
(define utils:open-url
   (lambda (urlstring)
      (let ((urlobj (objc:call "NSURL" "URLWithString:" urlstring))
            (workspace (objc:call "NSWorkspace" "sharedWorkspace")))
         (objc:call workspace "openURL:" urlobj))))


Finally, the functions for opening the wiki page:

;; wiki url caller
;; e.g. (wiki objc:from-address) => goes to

;; wiki-escape: composes the url so that it matches the ones of the online wiki 
(define wikiescape
   (lambda (funname)
      (for-each (lambda (x)
                   (set! funname (utils:string-replace funname (car x) (cadr x))))
                '(("+" "%2B")
                  ("=" "%3D")
                  ("<" "lessthan")
                  (">" "greaterthan")
                  ("*" "%2A")
                  ("?" "%3F")
                  ("!" "%21")
      (utils:string-capitalize funname)))

(define wiki-inner
   (lambda (funname)
      (let* ((urlbase "")
             (newname (wikiescape funname))
             (url (string-append urlbase newname)))
         (utils:open-url url))))

;; macro wrapper and main function that gets called 
(define-macro (wiki name)
   `(wiki-inner (sexpr->string (quote ,name))))


That’s it: load all of this code (or put it in a single file and load it at startup time) and you’ve got the wiki procedure available!


Comments are closed.