Index: Makefile ================================================================== --- Makefile +++ Makefile @@ -7,39 +7,46 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. include install.cfg -SRCFILES = stml.scm misc-stml.scm session.scm sqltbl.scm formdat.scm setup.scm stmlrun.scm keystore.scm html-filter.scm cookie.scm +SRCFILES = stml.scm misc-stml.scm session.scm sqltbl.scm formdat.scm setup.scm keystore.scm html-filter.scm cookie.scm MODULEFILES = $(wildcard modules/*/*-mod.scm) SOFILES = $(MODULEFILES:%.scm=%.so) CFILES = $(MODULEFILES:%.scm=%.c) OFILES = $(SRCFILES:%.scm=%.o) TARGFILES = $(notdir $(SOFILES)) MODULES = $(addprefix $(TARGDIR)/modules/,$(TARGFILES)) install : $(TARGDIR)/stmlrun $(LOGDIR) $(MODULES) + chicken-install all : $(SOFILES) # stmlrun : stmlrun.scm formdat.scm misc-stml.scm session.scm stml.scm \ # setup.scm html-filter.scm requirements.scm keystore.scm \ # cookie.scm sqltbl.scm # csc stmlrun.scm -$(TARGDIR)/stmlrun : stmlrun +$(TARGDIR)/stmlrun : stmlrun stml.so install stmlrun $(TARGDIR) chmod a+rx $(TARGDIR)/stmlrun $(TARGDIR)/modules : mkdir -p $(TARGDIR)/modules $(MODULES) : $(SOFILES) $(TARGDIR)/modules cp $< $@ -stmlrun : $(OFILES) stmlrun.scm requirements.scm - csc $(OFILES) -o stmlrun +stmlrun : $(OFILES) stmlrun.scm requirements.scm stmlcommon.scm + csc $(OFILES) stmlrun.scm -o stmlrun + +stml.so : stmlmodule.so + cp stmlmodule.so stml.so + +stmlmodule.so : $(OFILES) stmlmodule.scm requirements.scm stmlcommon.scm + csc $(OFILES) -s stmlmodule.scm # logging currently relies on this # $(LOGDIR) : mkdir -p $(LOGDIR) Index: misc-stml.scm ================================================================== --- misc-stml.scm +++ misc-stml.scm @@ -170,15 +170,16 @@ (s:log res) (loop (read-line p)(cons (list l "
") res))))) #t)))) (define (s:validate-inputs) - (if (not (s:validate-uri))(begin (s:error-page "Bad URI" (let ((ref (get-environment-variable "HTTP_REFERER"))) - (if ref - (list "referred from" ref) - ""))) - (exit)))) + (if (not (s:validate-uri)) + (begin (s:error-page "Bad URI" (let ((ref (get-environment-variable "HTTP_REFERER"))) + (if ref + (list "referred from" ref) + ""))) + (exit)))) ;; anything except a list is converted to a string!!! (define (s:any->string val) (cond ((string? val) val) ADDED rollup-pages.scm Index: rollup-pages.scm ================================================================== --- /dev/null +++ rollup-pages.scm @@ -0,0 +1,31 @@ +(use regex posix srfi-69 srfi-1) + +(define extract-rx (regexp "pages\\/(.*)_(view|ctrl).scm")) + +(let* ((views (glob "pages/*_view.scm")) + (ctrls (glob "pages/*_ctrl.scm")) + (all (append views ctrls)) + (lookup (make-hash-table)) + (pages (delete-duplicates + (map (lambda (x) + (let* ((res (string-match extract-rx x)) + (page (cadr res)) + (type (caddr res))) + (hash-table-set! lookup (conc page "_" type) #t) + (cadr res))) + all)))) + (if (null? all)(begin (print "No page files matching pages/*_(view|ctrl).scm")(exit))) + (print "Pages: " pages) + (with-output-to-file "all_pages.scm" + (lambda () + (for-each (lambda (page) + (print "(define (pages:" page ")") + (if (hash-table-ref/default lookup (conc page "_ctrl") #f) + (print "(include \"pages/" page "_ctrl.scm\")")) + (if (hash-table-ref/default lookup (conc page "_view") #f) + (print "(include \"pages/" page "_view.scm\")")) + (print ")\n")) + pages)))) + + + Index: session.scm ================================================================== --- session.scm +++ session.scm @@ -93,44 +93,12 @@ (define (sdat-set-logfile! vec val)(vector-set! vec 29 val)) (define (sdat-set-seen-pages! vec val)(vector-set! vec 30 val)) (define (sdat-set-page-dir-style! vec val)(vector-set! vec 31 val)) (define (sdat-set-debugmode! vec val)(vector-set! vec 32 val)) -;; (define-class () -;; (dbtype ;; 'pg or 'sqlite3 -;; dbinit -;; conn -;; params ;; params from the key=val&key1=val2 string -;; path-params ;; remaining params from the path -;; session-key -;; session-id -;; domain -;; toppage ;; defaults to "index" - override in .stml.config if desired -;; page ;; the page name - defaults to home -;; curr-page ;; the current page being evaluated -;; content-type ;; the default content type is text/html, override to deliver other stuff -;; page-type ;; use in conjunction with content-type to deliver other payloads -;; sroot -;; twikidir ;; location for twikis - needs to be fully writable by web server -;; pagedat -;; alt-page-dat -;; pagevars ;; session vars specific to this page -;; pagevars-before -;; sessionvars ;; session vars visible to all pages -;; sessionvars-before -;; globalvars ;; global vars visible to all sessions -;; globalvars-before -;; logpt -;; formdat -;; request-method -;; session-cookie -;; curr-err -;; log-port -;; logfile -;; seen-pages -;; page-dir-style ;; #t = new style, #f = old style -;; debugmode)) +;; The global session +(define s:session (make-sdat)) ;; SPLIT INTO STRAIGHT FORWARD INIT AND COMPLEX INIT (define (session:initialize self) (sdat-set-dbtype! self 'pg) (sdat-set-page! self "home") ;; these are defaults @@ -450,17 +418,17 @@ ;; get session vars for a specified page ;; (define (session:get self page key) (let ((ht (session:get-page-hash self page))) - (hash-table-ref/default ht key #f))) + (hash-table-ref/default ht (s:any->string key) #f))) ;; delete a session var for a specified page ;; (define (session:del! self page key) (let ((ht (session:get-page-hash self page))) - (hash-table-delete! ht key))) + (hash-table-delete! ht (s:any->string key)))) ;; get ALL keys for this page and store in the session pagevars hash ;; (define (session:get-vars self) (let ((session-id (sdat-get-session-id self))) @@ -604,93 +572,70 @@ ((string? x) x) (else '()))) (port-map (lambda (s) (eval s e)) (lambda ()(read p)))))) + +(define (session:process-file f) + (let* ((p (open-input-file f)) + (dat (process-port p))) + (close-input-port p) + dat)) ;; May 2011, putting all pages into one directory for the following reasons: ;; 1. want filename to reflect page name (emacs limitation) ;; 2. that's it! no other reason. could make it configurable ... -(define (session:call-parts self page parts) +;; page-dir-style is: +;; 'stored => stored in executable +;; 'flat => pages flat directory +;; 'dir => directory tree pages//{view,control}.scm +;; parts: +;; 'both => load control and view (anything other than view or control +;; 'view => load view only +;; 'control => load control only +(define (session:call-parts self page #!key (parts 'both)) (sdat-set-curr-page! self page) - ;; (session:log self "page-dir-style: " (sdat-get-page-dir-style self)) - (let* ((dir-style ;; (equal? (sdat-get-page-dir-style self) "onedir")) ;; flag #t for onedir, #f for old style - (sdat-get-page-dir-style self)) - (dir (string-append (sdat-get-sroot self) - (if dir-style - (conc "/pages/") - (conc "/pages/" page)))) - (control (string-append dir (if dir-style - (conc page "_ctrl.scm") - "/control.scm"))) - (view (string-append dir (if dir-style - (conc page "_view.scm") - "/view.scm"))) - (load-view (and (file-exists? view) - (or (eq? parts 'both)(eq? parts 'view)))) - (load-control (and (file-exists? control) - (or (eq? parts 'both)(eq? parts 'control)))) - (view-dat '())) - ;; (session:log self "dir-style: " dir-style) - ;; (sugar "/home/matt/kiatoa/stml/sugar.scm" )) - ;; (print "dir=" dir " control=" control " view=" view " load-view=" load-view " load=control=" load-control) - (if load-control - (begin - (load control) - (session:set-called! self page))) - ;; move this to where it gets exectuted only once - ;; - ;;(s:log "s:b yields " (s:b "blah")) - (if load-view - ;; option one: - ;; - ;; (let ((inp (open-input-string - ;; (files-read->string "/home/matt/kiatoa/stml/sugar.scm" - ;; view)))) - ;; (map - ;; (lambda (x) - ;; (cond - ;; ((list? x) x) - ;; ((string? x) x) - ;; (else '()))) - ;; (port-map eval (lambda () - ;; (read inp))))) - ;; - ;; option two: - ;; - (let* (;; (inps (map open-input-file (list view))) ;; sugar view))) - (p (open-input-file view)) ;; (apply make-concatenated-port inps)) - (dat (process-port p))) - ;;(map - ;; (lambda (x) - ;; (cond - ;; ((list? x) x) - ;; ((string? x) x) - ;; (else '()))) - ;; (port-map eval (lambda ()(read p)))))) - ;; (map close-input-port inps) - (close-input-port p) - dat) - (list "

Page not found " page "

")))) - -;;(define (session:call self page) -;; (session:call-parts self page 'both)) + (session:log self "page-dir-style: " (sdat-get-page-dir-style self)) + (let* ((dir-style (sdat-get-page-dir-style self));; (equal? (sdat-get-page-dir-style self) "onedir")) ;; flag #t for onedir, #f for old style + (dir (string-append (sdat-get-sroot self) + (if dir-style + (conc "/pages/") + (conc "/pages/" page))))) + (case dir-style + ;; NB// Stored always loads both control and view + ((stored)((eval (string->symbol (conc "pages:" page))))) + ((dir) + ;; first the control + (let ((control-file (conc "pages/" page "_ctrl.scm")) + (view-file (conc "pages/" page "_view.scm"))) + (if (and (file-exists? control-file) + (not (eq? parts 'view))) + (begin + (session:set-called! self page) + (load control-file))) + (if (file-exists? view-file) + (if (not (eq? parts 'control)) + (session:process-file view-file)) + (list "

Page not found " page "

")))) + ((flat)) + (else + (list "ERROR: page-dir-style must be stored, dir or flat, got " dir-style))))) (define (session:call self page parts) (session:call-parts self page 'both)) -(define (session:load-model self model) - (let ((model.scm (string-append (sdat-get-sroot self) "/models/" model ".scm")) - (model.so (string-append (sdat-get-sroot self) "/models/" model ".so"))) - (if (file-exists? model.so) - (load model.so) - (if (file-exists? model.scm) - (load model.scm) - (s:log "ERROR: model " model.scm " not found"))))) - -(define (session:model-path self model) - (string-append (sdat-get-sroot self) "/models/" model ".scm")) +;; (define (session:load-model self model) +;; (let ((model.scm (string-append (sdat-get-sroot self) "/models/" model ".scm")) +;; (model.so (string-append (sdat-get-sroot self) "/models/" model ".so"))) +;; (if (file-exists? model.so) +;; (load model.so) +;; (if (file-exists? model.scm) +;; (load model.scm) +;; (s:log "ERROR: model " model.scm " not found"))))) + +;; (define (session:model-path self model) +;; (string-append (sdat-get-sroot self) "/models/" model ".scm")) (define (session:pp-formdat self) (let ((dat (formdat:all->strings (sdat-get-formdat self)))) (string-intersperse dat "
"))) Index: setup.scm ================================================================== --- setup.scm +++ setup.scm @@ -10,14 +10,10 @@ (declare (unit setup)) (declare (uses session)) (require-extension srfi-69) (require-extension regex) -;; -(define s:session (make-sdat)) -(session:initialize s:session) - ;; use this for getting data from page to page when scope and evals ;; get in the way (define s:local-vars (make-hash-table)) (define (s:local-set! k v) @@ -24,17 +20,13 @@ (hash-table-set! s:local-vars k v)) (define (s:local-get k) (hash-table-ref/default s:local-vars k #f)) -(session:setup s:session) - (define (s:log . msg) (apply session:log s:session msg)) -(session:get-vars s:session) - (define (s:set-err . args) (sdat-set-curr-err! s:session args)) ;; Usage: (s:get-err s:big) (define (s:get-err wrapperfunc) ADDED stml.meta Index: stml.meta ================================================================== --- /dev/null +++ stml.meta @@ -0,0 +1,20 @@ +( +; Your egg's license: +(license "LGPL") + +; Pick one from the list of categories (see below) for your egg and enter it +; here. +(category misc) + +; A list of eggs mpeg3 depends on. If none, you can omit this declaration +; altogether. If you are making an egg for chicken 3 and you need to use +; procedures from the `files' unit, be sure to include the `files' egg in the +; `needs' section (chicken versions < 3.4.0 don't provide the `files' unit). +; `depends' is an alias to `needs'. +(needs srfi-69) + +; A list of eggs required for TESTING ONLY. See the `Tests' section. +(test-depends test) + +(author "Matt Welland") +(synopsis "Primitive argument processor.")) ADDED stml.setup Index: stml.setup ================================================================== --- /dev/null +++ stml.setup @@ -0,0 +1,18 @@ +;; Copyright 2007-2010, Matthew Welland. +;; +;; This program is made available under the GNU GPL version 2.0 or +;; greater. See the accompanying file COPYING for details. +;; +;; This program is distributed WITHOUT ANY WARRANTY; without even the +;; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +;; PURPOSE. + +;;;; margs.setup + +;; compile the code into a dynamically loadable shared object +;; (will generate margs.so) +;; (compile -s margs.scm) + +;; Install as extension library +(install-extension 'stml "stml.so") + ADDED stmlcommon.scm Index: stmlcommon.scm ================================================================== --- /dev/null +++ stmlcommon.scm @@ -0,0 +1,65 @@ +;; Copyright 2007-2011, Matthew Welland. +;; +;; This program is made available under the GNU GPL version 2.0 or +;; greater. See the accompanying file COPYING for details. +;; +;; This program is distributed WITHOUT ANY WARRANTY; without even the +;; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +;; PURPOSE. + +;; (require-extension syntax-case) +;; (declare (run-time-macros)) + +(include "requirements.scm") +(declare (uses cookie)) +(declare (uses html-filter)) +(declare (uses misc-stml)) +(declare (uses formdat)) +(declare (uses stml)) +(declare (uses session)) +(declare (uses setup)) ;; s:session gets created here +(declare (uses sqltbl)) +(declare (uses keystore)) + +(define (stml:cgi-session session) + (session:initialize session) + (session:setup session) + (session:get-vars session) + + (sdat-set-log-port! session ;; (current-error-port)) + (open-output-file (sdat-get-logfile session) #:append)) + (s:validate-inputs) + (session:run-actions session) + (sdat-set-pagedat! session + (append (sdat-get-pagedat session) + (s:call (sdat-get-toppage session)))) + (if (eq? (sdat-get-page-type session) 'html) ;; default is html. + (session:cgi-out session) + (session:alt-out session)) + (session:save-vars session) + (session:close session)) + +(define (stml:main proc) + (handle-exceptions + exn + (begin + (print "Content-type: text/html") + (print "") + (print " EXCEPTION ") + (print " QUERY_STRING is: " (get-environment-variable "QUERY_STRING") "
") + (print "
")
+     ;; (print "   EXCEPTION: " ((condition-property-accessor 'exn 'message) exn))
+     (print-error-message exn)
+     (print-call-chain)
+     (print "
") + (print "") + (for-each (lambda (var) + (print "")) + (get-environment-variables)) + (print "
" (car var) "" (cdr var) "
") + (print "")) + + (if proc (proc s:session) (stml:cgi-session s:session)) + ;; (raise-error) + ;; (exit) + )) ADDED stmlmodule.scm Index: stmlmodule.scm ================================================================== --- /dev/null +++ stmlmodule.scm @@ -0,0 +1,14 @@ +;; Copyright 2007-2011, Matthew Welland. +;; +;; This program is made available under the GNU GPL version 2.0 or +;; greater. See the accompanying file COPYING for details. +;; +;; This program is distributed WITHOUT ANY WARRANTY; without even the +;; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +;; PURPOSE. + +;; (require-extension syntax-case) +;; (declare (run-time-macros)) + +(include "stmlcommon.scm") + Index: stmlrun.scm ================================================================== --- stmlrun.scm +++ stmlrun.scm @@ -10,49 +10,9 @@ ;; PURPOSE. ;; (require-extension syntax-case) ;; (declare (run-time-macros)) -(handle-exceptions - exn - (begin - (print "Content-type: text/html") - (print "") - (print " EXCEPTION ") - (print " QUERY_STRING is: " (get-environment-variable "QUERY_STRING") "
") - (print "
")
-   ;; (print "   EXCEPTION: " ((condition-property-accessor 'exn 'message) exn))
-   (print-error-message exn)
-   (print-call-chain)
-   (print "
") - (print "") - (for-each (lambda (var) - (print "")) - (get-environment-variables)) - (print "
" (car var) "" (cdr var) "
") - (print "")) - (include "requirements.scm") - (declare (uses cookie)) - (declare (uses html-filter)) - (declare (uses misc-stml)) - (declare (uses formdat)) - (declare (uses stml)) - (declare (uses session)) - (declare (uses setup)) ;; s:session gets created here - (declare (uses sqltbl)) - (declare (uses keystore)) - - (sdat-set-log-port! s:session ;; (current-error-port)) - (open-output-file (sdat-get-logfile s:session) #:append)) - (s:validate-inputs) - (session:run-actions s:session) - (sdat-set-pagedat! s:session - (append (sdat-get-pagedat s:session) - (s:call (sdat-get-toppage s:session)))) - (if (eq? (sdat-get-page-type s:session) 'html) ;; default is html. - (session:cgi-out s:session) - (session:alt-out s:session)) - (session:save-vars s:session) - (session:close s:session) - ;; (raise-error) - ;; (exit) - ) +;; (include "stmlcommon.scm") +(require-library stml) + +(stml:main #f)