diff --git a/lib/hyperscript/parser.sx b/lib/hyperscript/parser.sx index ce28b3f4..8aea5615 100644 --- a/lib/hyperscript/parser.sx +++ b/lib/hyperscript/parser.sx @@ -1684,7 +1684,7 @@ ((url (if (and (= (tp-type) "keyword") (= (tp-val) "from")) (do (adv!) (parse-arith (parse-poss (parse-atom)))) nil))) (list (quote fetch-gql) gql-source url)))) (let - ((url-atom (if (and (= (tp-type) "op") (= (tp-val) "/")) (do (adv!) (let ((path-parts (list "/"))) (define read-path (fn () (when (and (not (at-end?)) (or (= (tp-type) "ident") (= (tp-type) "op") (= (tp-type) "dot") (= (tp-type) "number"))) (append! path-parts (tp-val)) (adv!) (read-path)))) (read-path) (join "" path-parts))) (parse-atom)))) + ((url-atom (if (and (= (tp-type) "op") (= (tp-val) "/")) (do (adv!) (let ((path-parts (list "/"))) (define read-path (fn () (when (and (not (at-end?)) (or (and (= (tp-type) "ident") (not (string-contains? (tp-val) "'"))) (= (tp-type) "op") (= (tp-type) "dot") (= (tp-type) "number"))) (append! path-parts (tp-val)) (adv!) (read-path)))) (read-path) (join "" path-parts))) (parse-atom)))) (let ((url (if (nil? url-atom) url-atom (parse-arith (parse-poss url-atom))))) (let @@ -1702,17 +1702,24 @@ ((fmt (or fmt-before fmt-after "text"))) (let ((do-not-throw - (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "do")) - (do - (adv!) - (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "not")) - (do - (adv!) - (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "throw")) - (do (adv!) true) - false)) - false)) - false))) + (cond + ((and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "do")) + (do + (adv!) + (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "not")) + (do + (adv!) + (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "throw")) + (do (adv!) true) + false)) + false))) + ((and (= (tp-type) "ident") (= (tp-val) "don't")) + (do + (adv!) + (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "throw")) + (do (adv!) true) + false))) + (true false)))) (list (quote fetch) url fmt do-not-throw)))))))))) (define parse-call-args diff --git a/lib/hyperscript/tokenizer.sx b/lib/hyperscript/tokenizer.sx index 2483ea8c..eb9fdf68 100644 --- a/lib/hyperscript/tokenizer.sx +++ b/lib/hyperscript/tokenizer.sx @@ -536,10 +536,26 @@ (do (let ((word (read-ident start))) - (hs-emit! - (if (hs-keyword? word) "keyword" "ident") - word - start)) + (let + ((full-word + (if + (and + (< pos src-len) + (= (hs-cur) "'") + (< (+ pos 1) src-len) + (hs-letter? (hs-peek 1)) + (not + (and + (= (hs-peek 1) "s") + (or + (>= (+ pos 2) src-len) + (not (hs-ident-char? (hs-peek 2))))))) + (do (hs-advance! 1) (str word "'" (read-ident pos))) + word))) + (hs-emit! + (if (hs-keyword? full-word) "keyword" "ident") + full-word + start))) (scan!)) (and (or (= ch "=") (= ch "!") (= ch "<") (= ch ">")) diff --git a/shared/static/wasm/sx/hs-parser.sx b/shared/static/wasm/sx/hs-parser.sx index ce28b3f4..8aea5615 100644 --- a/shared/static/wasm/sx/hs-parser.sx +++ b/shared/static/wasm/sx/hs-parser.sx @@ -1684,7 +1684,7 @@ ((url (if (and (= (tp-type) "keyword") (= (tp-val) "from")) (do (adv!) (parse-arith (parse-poss (parse-atom)))) nil))) (list (quote fetch-gql) gql-source url)))) (let - ((url-atom (if (and (= (tp-type) "op") (= (tp-val) "/")) (do (adv!) (let ((path-parts (list "/"))) (define read-path (fn () (when (and (not (at-end?)) (or (= (tp-type) "ident") (= (tp-type) "op") (= (tp-type) "dot") (= (tp-type) "number"))) (append! path-parts (tp-val)) (adv!) (read-path)))) (read-path) (join "" path-parts))) (parse-atom)))) + ((url-atom (if (and (= (tp-type) "op") (= (tp-val) "/")) (do (adv!) (let ((path-parts (list "/"))) (define read-path (fn () (when (and (not (at-end?)) (or (and (= (tp-type) "ident") (not (string-contains? (tp-val) "'"))) (= (tp-type) "op") (= (tp-type) "dot") (= (tp-type) "number"))) (append! path-parts (tp-val)) (adv!) (read-path)))) (read-path) (join "" path-parts))) (parse-atom)))) (let ((url (if (nil? url-atom) url-atom (parse-arith (parse-poss url-atom))))) (let @@ -1702,17 +1702,24 @@ ((fmt (or fmt-before fmt-after "text"))) (let ((do-not-throw - (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "do")) - (do - (adv!) - (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "not")) - (do - (adv!) - (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "throw")) - (do (adv!) true) - false)) - false)) - false))) + (cond + ((and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "do")) + (do + (adv!) + (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "not")) + (do + (adv!) + (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "throw")) + (do (adv!) true) + false)) + false))) + ((and (= (tp-type) "ident") (= (tp-val) "don't")) + (do + (adv!) + (if (and (or (= (tp-type) "keyword") (= (tp-type) "ident")) (= (tp-val) "throw")) + (do (adv!) true) + false))) + (true false)))) (list (quote fetch) url fmt do-not-throw)))))))))) (define parse-call-args diff --git a/shared/static/wasm/sx/hs-tokenizer.sx b/shared/static/wasm/sx/hs-tokenizer.sx index 2483ea8c..eb9fdf68 100644 --- a/shared/static/wasm/sx/hs-tokenizer.sx +++ b/shared/static/wasm/sx/hs-tokenizer.sx @@ -536,10 +536,26 @@ (do (let ((word (read-ident start))) - (hs-emit! - (if (hs-keyword? word) "keyword" "ident") - word - start)) + (let + ((full-word + (if + (and + (< pos src-len) + (= (hs-cur) "'") + (< (+ pos 1) src-len) + (hs-letter? (hs-peek 1)) + (not + (and + (= (hs-peek 1) "s") + (or + (>= (+ pos 2) src-len) + (not (hs-ident-char? (hs-peek 2))))))) + (do (hs-advance! 1) (str word "'" (read-ident pos))) + word))) + (hs-emit! + (if (hs-keyword? full-word) "keyword" "ident") + full-word + start))) (scan!)) (and (or (= ch "=") (= ch "!") (= ch "<") (= ch ">"))