From 65306c0bf3bf824b49ac3c375d8cd7aaaf83be4e Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Tue, 31 Mar 2020 11:06:08 +0900 Subject: [PATCH 01/10] Add sample code testing multiline comments and true/false constants --- spec/visual/samples/racket | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/spec/visual/samples/racket b/spec/visual/samples/racket index 988737261b..1bfb7785ae 100644 --- a/spec/visual/samples/racket +++ b/spec/visual/samples/racket @@ -2,11 +2,20 @@ ;; Single-line comment +;; Multi-line comments + #| Multi-line comment on one line |# #| Multi-line comment on two lines |# +#| +# Block comment. +# (define x 3) +# is not highlighted as the commented text. +|# + + 'symbol `symbol '(a quoted list) @@ -23,6 +32,7 @@ (define (1-crazy-identifier-疯狂的标识符-τρελό-αναγνωριστικό x) (add1 x)) + (check-equal? (1-crazy-identifier-疯狂的标识符-τρελό-αναγνωριστικό 1) 2) (require xml net/url @@ -324,3 +334,6 @@ ; as a list item. (define (render-as-item a-fragment) `(li ,a-fragment)) + +;; #true is not highlighted properly +(define ht #true) From 84ef4ad649bd9905909b5e7c99e85dea87f9fa09 Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Tue, 31 Mar 2020 11:06:42 +0900 Subject: [PATCH 02/10] Remove extraneous code from sample --- spec/visual/samples/racket | 233 ------------------------------------- 1 file changed, 233 deletions(-) diff --git a/spec/visual/samples/racket b/spec/visual/samples/racket index 1bfb7785ae..228ca13c33 100644 --- a/spec/visual/samples/racket +++ b/spec/visual/samples/racket @@ -101,239 +101,6 @@ (λ (query) `(html (body "Hello, World!")))) -;; ---------------------------------------- - -(define (build-request-page label next-url hidden) - `(html - (head (title "Enter a Number to Add")) - (body ([bgcolor "white"]) - (form ([action ,next-url] [method "get"]) - ,label - (input ([type "text"] [name "number"] - [value ""])) - (input ([type "hidden"] [name "hidden"] - [value ,hidden])) - (input ([type "submit"] [name "enter"] - [value "Enter"])))))) - -(define (many query) - ;; Create a page containing the form: - (build-request-page "Number of greetings:" "/reply" "")) - -(define (reply query) - ;; Extract and use the form results: - (define n (string->number (cdr (assq 'number query)))) - `(html (body ,@(for/list ([i (in-range n)]) - " hello")))) - -(hash-set! dispatch-table "many" many) -(hash-set! dispatch-table "reply" reply) - -;; ---------------------------------------- -;; Old, awkward version: - -(define (sum query) - (build-request-page "First number:" "/one" "")) - -(define (one query) - (build-request-page "Second number:" - "/two" - (cdr (assq 'number query)))) - -(define (two query) - (let ([n (string->number (cdr (assq 'hidden query)))] - [m (string->number (cdr (assq 'number query)))]) - `(html (body "The sum is " ,(number->string (+ m n)))))) - -(hash-set! dispatch-table "sum" sum) -(hash-set! dispatch-table "one" one) -(hash-set! dispatch-table "two" two) - -;; ---------------------------------------- - -;; Helper to grab a computation and generate a handler for it: - -(define (send/suspend mk-page) - (let/cc k - (define tag (format "k~a" (current-inexact-milliseconds))) - (hash-set! dispatch-table tag k) - (abort (mk-page (string-append "/" tag))))) - -;; Helper to run the number-getting page via `send/suspend': - -(define (get-number label) - (define query - ;; Generate a URL for the current computation: - (send/suspend - ;; Receive the computation-as-URL here: - (λ (k-url) - ;; Generate the query-page result for this connection. - ;; Send the query result to the saved-computation URL: - (build-request-page label k-url "")))) - ;; We arrive here later, in a new connection - (string->number (cdr (assq 'number query)))) - -;; ---------------------------------------- - -;; New direct-style servlet: - -(define (sum2 query) - (define m (get-number "First number:")) - (define n (get-number "Second number:")) - `(html (body "The sum is " ,(number->string (+ m n))))) - -(hash-set! dispatch-table "sum2" sum2) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -#lang web-server/insta - -(require web-server/formlets - "model-3.rkt") - -; start: request -> doesn't return -; Consumes a request and produces a page that displays -; all of the web content. -(define (start request) - (render-blog-page - (initialize-blog! - (build-path (current-directory) - "the-blog-data.sqlite")) - request)) - -; new-post-formlet : formlet (values string? string?) -; A formlet for requesting a title and body of a post -(define new-post-formlet - (formlet - (#%# ,{input-string . => . title} - ,{input-string . => . body}) - (values title body))) - -; render-blog-page: blog request -> doesn't return -; Produces an HTML page of the content of the -; blog. -(define (render-blog-page a-blog request) - (local [(define (response-generator embed/url) - (response/xexpr - `(html (head (title "My Blog")) - (body - (h1 "My Blog") - ,(render-posts a-blog embed/url) - (form ([action - ,(embed/url insert-post-handler)]) - ,@(formlet-display new-post-formlet) - (input ([type "submit"]))))))) - - (define (insert-post-handler request) - (define-values (title body) - (formlet-process new-post-formlet request)) - (blog-insert-post! a-blog title body) - (render-blog-page a-blog (redirect/get)))] - - (send/suspend/dispatch response-generator))) - -; new-comment-formlet : formlet string -; A formlet for requesting a comment -(define new-comment-formlet - input-string) - -; render-post-detail-page: post request -> doesn't return -; Consumes a post and produces a detail page of the post. -; The user will be able to either insert new comments -; or go back to render-blog-page. -(define (render-post-detail-page a-blog a-post request) - (local [(define (response-generator embed/url) - (response/xexpr - `(html (head (title "Post Details")) - (body - (h1 "Post Details") - (h2 ,(post-title a-post)) - (p ,(post-body a-post)) - ,(render-as-itemized-list - (post-comments a-post)) - (form ([action - ,(embed/url insert-comment-handler)]) - ,@(formlet-display new-comment-formlet) - (input ([type "submit"]))) - (a ([href ,(embed/url back-handler)]) - "Back to the blog"))))) - - (define (insert-comment-handler request) - (render-confirm-add-comment-page - a-blog - (formlet-process new-comment-formlet request) - a-post - request)) - - (define (back-handler request) - (render-blog-page a-blog request))] - - (send/suspend/dispatch response-generator))) - -; render-confirm-add-comment-page : -; blog comment post request -> doesn't return -; Consumes a comment that we intend to add to a post, as well -; as the request. If the user follows through, adds a comment -; and goes back to the display page. Otherwise, goes back to -; the detail page of the post. -(define (render-confirm-add-comment-page a-blog a-comment - a-post request) - (local [(define (response-generator embed/url) - (response/xexpr - `(html (head (title "Add a Comment")) - (body - (h1 "Add a Comment") - "The comment: " (div (p ,a-comment)) - "will be added to " - (div ,(post-title a-post)) - - (p (a ([href ,(embed/url yes-handler)]) - "Yes, add the comment.")) - (p (a ([href ,(embed/url cancel-handler)]) - "No, I changed my mind!")))))) - - (define (yes-handler request) - (post-insert-comment! a-blog a-post a-comment) - (render-post-detail-page a-blog a-post (redirect/get))) - - (define (cancel-handler request) - (render-post-detail-page a-blog a-post request))] - - (send/suspend/dispatch response-generator))) - -; render-post: post (handler -> string) -> xexpr -; Consumes a post, produces an xexpr fragment of the post. -; The fragment contains a link to show a detailed view of the post. -(define (render-post a-blog a-post embed/url) - (local [(define (view-post-handler request) - (render-post-detail-page a-blog a-post request))] - `(div ([class "post"]) - (a ([href ,(embed/url view-post-handler)]) - ,(post-title a-post)) - (p ,(post-body a-post)) - (div ,(number->string (length (post-comments a-post))) - " comment(s)")))) - -; render-posts: blog (handler -> string) -> xexpr -; Consumes a embed/url, produces an xexpr fragment -; of all its posts. -(define (render-posts a-blog embed/url) - (local [(define (render-post/embed/url a-post) - (render-post a-blog a-post embed/url))] - `(div ([class "posts"]) - ,@(map render-post/embed/url (blog-posts a-blog))))) - -; render-as-itemized-list: (listof xexpr) -> xexpr -; Consumes a list of items, and produces a rendering as -; an unorderered list. -(define (render-as-itemized-list fragments) - `(ul ,@(map render-as-item fragments))) - -; render-as-item: xexpr -> xexpr -; Consumes an xexpr, and produces a rendering -; as a list item. -(define (render-as-item a-fragment) - `(li ,a-fragment)) ;; #true is not highlighted properly (define ht #true) From 536b07d79dbfc8006aab12b29ceacd48e0412529 Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Tue, 31 Mar 2020 11:07:37 +0900 Subject: [PATCH 03/10] Add sample code for false constant --- spec/visual/samples/racket | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/visual/samples/racket b/spec/visual/samples/racket index 228ca13c33..690f4c8d38 100644 --- a/spec/visual/samples/racket +++ b/spec/visual/samples/racket @@ -104,3 +104,4 @@ ;; #true is not highlighted properly (define ht #true) +(define hf #false) From ed3514edbb8e5d06dcfbb7209abbdcb5929f84e0 Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Tue, 31 Mar 2020 11:08:02 +0900 Subject: [PATCH 04/10] Add rules for multiline comments --- lib/rouge/lexers/racket.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/rouge/lexers/racket.rb b/lib/rouge/lexers/racket.rb index 38a584ef81..a3fc977cd9 100644 --- a/lib/rouge/lexers/racket.rb +++ b/lib/rouge/lexers/racket.rb @@ -488,6 +488,7 @@ def self.builtins state :root do # comments rule %r/;.*$/, Comment::Single + rule %r/#\|/, Comment::Multiline, :comment rule %r/\s+/m, Text rule %r/[+-]inf[.][f0]/, Num::Float @@ -524,6 +525,13 @@ def self.builtins rule id, Name::Variable end + state :comment do + rule %r/[^|#]+/, Comment::Multiline + rule %r/\|#/, Comment::Multiline, :pop! + rule %r/#\|/, Comment::Multiline, :comment + rule %r/[|#]/, Comment::Multiline + end + state :command do rule id, Name::Function do |m| if self.class.keywords.include? m[0] From 1834f28ce367ebf676b483fa4a859bdcf45cd44a Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Tue, 31 Mar 2020 11:08:40 +0900 Subject: [PATCH 05/10] Improve support for true and false constants --- lib/rouge/lexers/racket.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rouge/lexers/racket.rb b/lib/rouge/lexers/racket.rb index a3fc977cd9..0d50a78b10 100644 --- a/lib/rouge/lexers/racket.rb +++ b/lib/rouge/lexers/racket.rb @@ -511,7 +511,7 @@ def self.builtins rule %r/['`]#{id}/i, Str::Symbol rule %r/#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i, Str::Char - rule %r/#t|#f/, Name::Constant + rule %r/#t(rue)?|#f(alse)?/, Name::Constant rule %r/(?:'|#|`|,@|,|\.)/, Operator rule %r/(['#])(\s*)(\()/m do From 2c1eca0836387d073c799093737f70e53da3c048 Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Wed, 1 Apr 2020 00:08:36 +0900 Subject: [PATCH 06/10] Expand boolean samples --- spec/visual/samples/racket | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/spec/visual/samples/racket b/spec/visual/samples/racket index 690f4c8d38..bfea6e690f 100644 --- a/spec/visual/samples/racket +++ b/spec/visual/samples/racket @@ -10,9 +10,9 @@ two lines |# #| -# Block comment. -# (define x 3) -# is not highlighted as the commented text. +Block comment. +(define x 3) +is not highlighted as the commented text. |# @@ -104,4 +104,8 @@ ;; #true is not highlighted properly (define ht #true) +(define ht #t) +(define ht #T) (define hf #false) +(define hf #f) +(define hf #F) From 350697bbd56a3cb71b730659a7992e8e91b3c1e0 Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Wed, 1 Apr 2020 00:09:11 +0900 Subject: [PATCH 07/10] Make boolean rule case insensitive --- lib/rouge/lexers/racket.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rouge/lexers/racket.rb b/lib/rouge/lexers/racket.rb index 0d50a78b10..456ed7d4c4 100644 --- a/lib/rouge/lexers/racket.rb +++ b/lib/rouge/lexers/racket.rb @@ -511,7 +511,7 @@ def self.builtins rule %r/['`]#{id}/i, Str::Symbol rule %r/#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i, Str::Char - rule %r/#t(rue)?|#f(alse)?/, Name::Constant + rule %r/#t(rue)?|#f(alse)?/i, Name::Constant rule %r/(?:'|#|`|,@|,|\.)/, Operator rule %r/(['#])(\s*)(\()/m do From 1b96ec7ecb14ee4d174986568445d4e5ffcb7078 Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Wed, 1 Apr 2020 03:00:24 +0900 Subject: [PATCH 08/10] Add more samples of comments --- spec/visual/samples/racket | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/spec/visual/samples/racket b/spec/visual/samples/racket index bfea6e690f..f641431dc7 100644 --- a/spec/visual/samples/racket +++ b/spec/visual/samples/racket @@ -2,12 +2,12 @@ ;; Single-line comment -;; Multi-line comments +#| Block comment on one line |# -#| Multi-line comment on one line |# - -#| Multi-line comment on - two lines |# +#|Block comment. +(define x 3) +is not highlighted as the commented text. +|# #| Block comment. @@ -15,6 +15,15 @@ Block comment. is not highlighted as the commented text. |# +#| a |# 1 ; reads equal to 1 +#| #| a |# 1 |# 2 ; reads equal to 2 + +#;1 2 ; reads equal to 2 +#;(define x 1) (define x 2) ; reads equal to (define x 2) +#;(define x (f a b)) (define x 2) ; reads equal to (define x 2) + +#!/bin/sh ; reads equal to nothing +#! /bin/sh ; reads equal to nothing 'symbol `symbol From 6daaffef81ef54d65b57e7b419c5ffb412b3a1ca Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Wed, 1 Apr 2020 03:00:59 +0900 Subject: [PATCH 09/10] Support more types of comments --- lib/rouge/lexers/racket.rb | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/rouge/lexers/racket.rb b/lib/rouge/lexers/racket.rb index 456ed7d4c4..a005439ac7 100644 --- a/lib/rouge/lexers/racket.rb +++ b/lib/rouge/lexers/racket.rb @@ -488,7 +488,9 @@ def self.builtins state :root do # comments rule %r/;.*$/, Comment::Single - rule %r/#\|/, Comment::Multiline, :comment + rule %r/#!.*/, Comment::Single + rule %r/#\|/, Comment::Multiline, :block_comment + rule %r/#;/, Comment::Multiline, :sexp_comment rule %r/\s+/m, Text rule %r/[+-]inf[.][f0]/, Num::Float @@ -525,13 +527,26 @@ def self.builtins rule id, Name::Variable end - state :comment do + state :block_comment do rule %r/[^|#]+/, Comment::Multiline rule %r/\|#/, Comment::Multiline, :pop! - rule %r/#\|/, Comment::Multiline, :comment + rule %r/#\|/, Comment::Multiline, :block_comment rule %r/[|#]/, Comment::Multiline end + state :sexp_comment do + rule %r/[({\[]/, Comment::Multiline, :sexp_comment_inner + rule %r/"(?:\\"|[^"])*?"/, Comment::Multiline, :pop! + rule %r/[^\s]+/, Comment::Multiline, :pop! + rule(//) { pop! } + end + + state :sexp_comment_inner do + rule %r/[^(){}\[\]]+/, Comment::Multiline + rule %r/[)}\]]/, Comment::Multiline, :pop! + rule %r/[({\[]/, Comment::Multiline, :sexp_comment_inner + end + state :command do rule id, Name::Function do |m| if self.class.keywords.include? m[0] From 8dec70a82a42cfdf5d93eda7b2a57b44b50e29bd Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Thu, 2 Apr 2020 19:02:51 +0900 Subject: [PATCH 10/10] Add better comment to visual sample --- spec/visual/samples/racket | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/visual/samples/racket b/spec/visual/samples/racket index f641431dc7..448a655771 100644 --- a/spec/visual/samples/racket +++ b/spec/visual/samples/racket @@ -111,7 +111,7 @@ is not highlighted as the commented text. `(html (body "Hello, World!")))) -;; #true is not highlighted properly +;; Highlight booleans (define ht #true) (define ht #t) (define ht #T)