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) replacement1 x)) ll))) (list->string (utils:list-flatten z))) ;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 ;; http://macosx.com/forums/software-programming-web-scripting/18422-how-do-i-launch-url-using-cocoa-objective-c.html (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 http://moso.com.au/wiki/index.php?title=Objc:from-address ;;;;;;;;;; ;; 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 "http://moso.com.au/wiki/index.php?title=") (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!
