Changeset 26858 in project


Ignore:
Timestamp:
06/07/12 05:56:52 (9 years ago)
Author:
Ivan Raikov
Message:

ersatz: refactoring of ersatz parsing mechanisms

Location:
release/4/ersatz/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • release/4/ersatz/trunk/ersatz-lib.scm

    r26853 r26858  
    3131
    3232         template-environment? make-template-environment
    33          tmpl-env-autoescape? tmpl-env-search-path tmpl-env-filters tmpl-env-extensions
     33         tmpl-env-autoescape tmpl-env-search-path tmpl-env-filters tmpl-env-extensions
    3434         template-context? make-template-context
    3535         tmpl-ctx-frame-stack tmpl-ctx-macro-table tmpl-ctx-filter-table tmpl-ctx-buffer
     
    5656         op-replace op-truncate
    5757         op-capitalize op-title op-escape-html op-urlize op-striptags
    58          op-wordcount op-sort
     58         op-wordcount op-sort op-dictsort
    5959         op-list op-sublist
    6060         )
     
    7171
    7272        (require-extension datatype lalr lalr-driver uri-generic)
    73         (require-library utf8 utf8-srfi-13 utf8-srfi-14)
     73        (require-library utf8 utf8-srfi-13 utf8-srfi-14 silex)
    7474       
    7575        (import (only utf8 string-length substring)
     
    7878                      string-ci< string<)
    7979                (only utf8-srfi-14 char-set:lower-case char-set:upper-case char-set:whitespace
    80                       char-set char-set->string))
     80                      char-set char-set->string)
     81                (only silex lex-tables lexer-make-IS lexer-make-lexer )
     82                )
    8183
    8284;;
    8385;; template environment
    8486;;
    85 ;;  autoescape? : if true, template variables are auto escaped when output
     87;;  autoescape  : if true or a procedure, template variables are auto escaped when output
    8688;;  search-path : search path list; if empty, search current directory only
    8789;;  filters     : user-defined filters
     
    8991
    9092(define-record-type template-environment
    91   (make-template-environment  autoescape? search-path filters extensions )
     93  (make-template-environment  autoescape search-path filters extensions )
    9294  template-environment?
    93   (autoescape?         tmpl-env-autoescape?)
     95  (autoescape          tmpl-env-autoescape)
    9496  (search-path         tmpl-env-search-path)
    9597  (filters             tmpl-env-filters)
     
    331333(define (template-std-env )
    332334  (make-template-environment
    333    #t ;; autoescape?
     335   #t  ;; autoescape
    334336   '() ;; search-path
    335337   '() ;; filters
     
    393395(define (init-context1 env #!key (models '()))
    394396  (let ((env-values
    395          `((is_autoescape . ,(Tbool (tmpl-env-autoescape? env))))))
     397         `((is_autoescape . ,(Tbool (and (tmpl-env-autoescape env) #t))))))
    396398    (make-template-context
    397399     (list models (append (tmpl-env-filters env) top-frame)) ;; frame-stack
     
    417419
    418420
     421
     422(define (from-file fn #!key
     423                   (env (template-std-env))
     424                   (models '())
     425                   (ctx #f))
     426  (eval-statements (statements-from-file env fn)
     427                   env: env models: models ctx: ctx))
     428
     429
     430(define (from-string source #!key
     431                     (env (template-std-env))
     432                     (models '())
     433                     (ctx #f))
     434  (eval-statements (statements-from-string source)
     435                   env: env models: models ctx: ctx))
     436
     437
     438
     439
     440
    419441)
  • release/4/ersatz/trunk/ersatz.setup

    r26852 r26858  
    1414       ("ersatz.l.scm" ("ersatz.l")
    1515        (run (csi -n -R silex
    16                   -e "'(lex \"ersatz.l\" \"ersatz.l.scm\" (quote counters) (quote line))'")))
     16                  -e "'(lex-tables \"ersatz.l\" \"default-ersatz-lexer-table\" \"ersatz.l.scm\" (quote counters) (quote line))'")))
    1717
    1818       ((dynld-name "ersatz-lib") ("ersatz-lib.scm" "runtime.scm" "eval.scm" "parser.scm" "ersatz.grm.scm" "ersatz.l.scm")
  • release/4/ersatz/trunk/eval.scm

    r26852 r26858  
    149149                          (let* ((ctx (template-context-with-buffer
    150150                                       ctx (open-output-string)))
    151                                  (stmts (statements-from-string ctx (->string (eval-expr env ctx (car argexprs)))))
     151                                 (stmts (statements-from-string (->string (eval-expr env ctx (car argexprs)))))
    152152                                 (ctx (fold (lambda (s ctx) (eval-statement env ctx s)) ctx stmts)))
    153153                            (Tstr (get-output-string (tmpl-ctx-buffer ctx))))
     
    242242         (ExpandStatement (expr)
    243243              (tvalue-output ctx (eval-expr env ctx expr)
    244                              autoescape: (tmpl-env-autoescape? env)
     244                             autoescape: (tmpl-env-autoescape env)
    245245                             safe: (safe-expr? expr))
    246246              ctx)
     
    312312         (IncludeStatement (path w)
    313313            (if w
    314                 (let ((stmts (statements-from-file env ctx path)))
     314                (let ((stmts (statements-from-file env path)))
    315315                  (fold (lambda (x ctx) (eval-statement env ctx x)) ctx stmts))
    316316                (let ((ctx1 (init-context env)))
    317                   (let ((stmts (statements-from-file env ctx1 path)))
     317                  (let ((stmts (statements-from-file env path)))
    318318                    (fold (lambda (x ctx) (eval-statement env ctx x)) ctx1 stmts)
    319319                    ctx))
     
    360360        (cases tstmt (car stmts)
    361361               (ExtendsStatement (path)
    362                     (let ((stmts1 (unfold-extends env ctx (statements-from-file env ctx path))))
     362                    (let ((stmts1 (unfold-extends env ctx (statements-from-file env path))))
    363363                      (recur (append ret stmts1) (cdr stmts))))
    364364               (else (recur (append ret (list (car stmts))) (cdr stmts)))
     
    422422                   (IncludeStatement (path namespace)
    423423                      (import-macro env ctx
    424                                     (statements-from-file env ctx path)
     424                                    (statements-from-file env path)
    425425                                    namespace: namespace select: select ))
    426426                                     
    427427                   (FromImportStatement (path select-macros)
    428428                      (let ((alias-names (alias-names-of select-macros)))
    429                         (import-macro env ctx (statements-from-file env ctx path)
     429                        (import-macro env ctx (statements-from-file env path)
    430430                                      namespace: namespace
    431431                                      select: alias-names
     
    439439    ))
    440440
     441
     442
     443(define (eval-statements codes #!key
     444                         (env (template-std-env))
     445                         (models '())
     446                         (ctx #f))
     447
     448  (let* ((ctx (or ctx (init-context env: env models: models)))
     449         (codes (align-block (unfold-extends env ctx codes)))
     450         (ctx (import-macro env ctx codes)))
     451
     452    (fold (lambda (s ctx) (eval-statement env ctx s)) ctx codes)
     453
     454    (let ((output (get-output-string (tmpl-ctx-buffer ctx))))
     455      output)
     456    ))
  • release/4/ersatz/trunk/parser.scm

    r26852 r26858  
    123123(define lexer-error error)
    124124
     125
     126(define (parse lexer-table is #!key (file-path #f))
     127    (let ((lexer (lexer-make-lexer lexer-table is)))
     128      (reset-lexer)
     129      (let ((ast (reverse (parser (lambda ()
     130                                   (let ((c (lexer-token-cache)))
     131                                     (let ((t (if (null? c) (lexer)
     132                                                  (let ((t (car c)))
     133                                                    (lexer-token-cache (cdr c))
     134                                                    t))))
     135;                                   (if (lexical-token? t)
     136;                                       (print "lexer: token = " (lexical-token-category t))
     137;                                       (print "lexer: token = " t))
     138                                       t)))
     139                                 (make-parse-error file-path)))))
     140        ast)))
     141
     142
    125143(define (get-file-path fn #!key (template-dirs '()))
    126144  (if (null? template-dirs)
     
    137155
    138156
    139 (define (statements-from-file env ctx fn)
    140   (let* ((fpath (get-file-path fn template-dirs: (tmpl-env-search-path env)))
    141          (source (read-all fpath)))
    142     (statements-from-string ctx source file-path: fpath)))
     157(define (statements-from-file env fn
     158                              #!key
     159                              (lexer-table default-ersatz-lexer-table))
    143160
    144 (define (statements-from-string ctx source #!key (file-path #f))
     161  (let ((fpath (get-file-path fn template-dirs: (tmpl-env-search-path env))))
    145162
    146   (if (string? source)
    147       (lexer-init 'string source)
    148       (error 'statements-from-file "bad argument type; not a string" source))
    149 
    150   (let ((ast (reverse (parser (lambda ()
    151                                 (let ((c (lexer-token-cache)))
    152                                   (let ((t (if (null? c) (lexer)
    153                                                (let ((t (car c)))
    154                                                  (lexer-token-cache (cdr c))
    155                                                  t))))
    156 ;                                   (if (lexical-token? t)
    157 ;                                       (print "lexer: token = " (lexical-token-category t))
    158 ;                                       (print "lexer: token = " t))
    159                                     t)))
    160                               (make-parse-error file-path)))))
    161 
    162     ast)
    163   )
     163    (let* ((inport (if (file-exists? fpath)
     164                       (open-input-file fpath)
     165                       (error 'statements-from-file "input file not found " fpath)))
     166           (is ;; lexer input system
     167            (lexer-make-IS 'port inport)))
     168     
     169      (let ((stmts (parse lexer-table is file-path: fpath)))
     170        (close-input-port inport)
     171        stmts
     172      ))
     173    ))
    164174
    165175
    166 (define (from-file fn #!key
    167                    (env (template-std-env))
    168                    (models '()))
    169   (let* ((ctx (init-context env models))
    170          (fpath (get-file-path fn template-dirs: (tmpl-env-search-path env)))
    171          (source (read-all fpath)))
    172     (from-string source env: env ctx: ctx models: models)))
     176(define (statements-from-string source #!key
     177                                (file-path #f)
     178                                (lexer-table default-ersatz-lexer-table))
     179
     180  (let ((is ;; lexer input system
     181         (if (string? source)
     182             (lexer-make-IS 'string source)
     183             (error 'statements-from-string "bad argument type; not a string" source))))
     184
     185    (parse lexer-table is file-path: file-path)
     186    ))
    173187
    174188
    175 (define (from-string source #!key
    176                      (env (template-std-env))
    177                      (models '())
    178                      (ctx #f))
    179  
    180   (reset-lexer)
    181 
    182   (let* ((ctx (or ctx (init-context env: env models: models)))
    183          (codes (align-block (unfold-extends env ctx (statements-from-string ctx source))))
    184          (ctx (import-macro env ctx codes)))
    185 
    186     (fold (lambda (s ctx) (eval-statement env ctx s)) ctx codes)
    187 
    188     (reset-lexer)
    189     (get-output-string (tmpl-ctx-buffer ctx))
    190 
    191     ))
    192 
    193189(define (reset-lexer)
    194   (lexer-curmode (LexerPlain))
    195190  (lexer-text-buffer (open-output-string))
    196191  (lexer-string-buffer (open-output-string))
     192  (lexer-curmode (LexerPlain))
    197193  (lexer-token-cache '()))
  • release/4/ersatz/trunk/runtime.scm

    r26852 r26858  
    309309          (text (cdr safe.text)))
    310310      (if (or safe (not autoescape)) text
    311           (op-escape-html (Tstr (->string text)) '()))
    312       )))
     311          (if (boolean? autoescape)
     312              (op-escape-html (Tstr (->string text)) '())
     313              (autoescape (Tstr (->string text)) '()))
     314      ))
     315    ))
    313316
    314317
  • release/4/ersatz/trunk/tests/run.scm

    r26852 r26858  
    221221                      )
    222222                 (tval-equal? (Tstr output) (op-escape-html (Tstr script) kwargs))))
    223 
    224223
    225224  (test-assert "safe expand"
     
    358357     
    359358)
    360 
Note: See TracChangeset for help on using the changeset viewer.