##// END OF EJS Templates
Rename system to txt2web
naryl -
r49:cd6f7adb default
parent child Browse files
Show More
@@ -0,0 +1,24 b''
1
2 (defsystem txt2web
3 :description "QSP compiler to monolithic HTML page"
4 :depends-on (:alexandria :system-locale ;; General
5 :esrap ;; Parsing
6 :parenscript :flute ;; Codegening
7 )
8 :pathname "src/"
9 :serial t
10 :components ((:file "package")
11 (:file "utils")
12 (:file "l10n")
13 (:file "walker")
14
15 (:file "patches")
16 (:file "js-syms")
17 (:file "main-macros")
18 (:file "ps-macros")
19 (:file "api-macros")
20 (:file "intrinsic-macros")
21
22 (:file "class")
23 (:file "main")
24 (:file "parser")))
@@ -1,46 +1,47 b''
1
1
2 BIN = txt2web
2 BIN = txt2web
3 PKG = $(BIN)
3 PKG = $(BIN)
4 SYSTEM = $(BIN)
4 DIST = txt2web.tar.xz
5 DIST = txt2web.tar.xz
5
6
6 LISP = sbcl
7 LISP = sbcl
7
8
8 all: $(BIN)
9 all: $(BIN)
9
10
10 dist: $(DIST)
11 dist: $(DIST)
11
12
12 graphs: diagrams.png
13 graphs: diagrams.png
13
14
14 $(BIN): *.asd src/*.lisp src/*.ps strings/*.sexp
15 $(BIN): *.asd src/*.lisp src/*.ps strings/*.sexp
15 buildapp.$(LISP) --asdf-path .\
16 buildapp.$(LISP) --asdf-path .\
16 --asdf-tree .qlot/dists\
17 --asdf-tree .qlot/dists\
17 --load-system $(PKG)\
18 --load-system $(SYSTEM)\
18 --entry $(PKG):entry-point\
19 --entry $(PKG):entry-point\
19 --output $(BIN)
20 --output $(BIN)
20
21
21 install-deps:
22 install-deps:
22 sbcl --load install-deps.lisp
23 sbcl --load install-deps.lisp
23
24
24 update-deps:
25 update-deps:
25 sbcl --load update-deps.lisp
26 sbcl --load update-deps.lisp
26
27
27 %.png: %.dot
28 %.png: %.dot
28 dot $< -T png -o $@
29 dot $< -T png -o $@
29
30
30 $(DIST): $(BIN) extras/*
31 $(DIST): $(BIN) extras/*
31 tar cfvJ $@ $< extras
32 tar cfvJ $@ $< extras
32
33
33 upload: $(DIST)
34 upload: $(DIST)
34 curl --upload-file $(DIST) https://transfer.sh/$(DIST)
35 curl --upload-file $(DIST) https://transfer.sh/$(DIST)
35 @echo
36 @echo
36
37
37 distclean: clean clean-deps
38 distclean: clean clean-deps
38
39
39 clean:
40 clean:
40 rm -f $(BIN) $(DIST)
41 rm -f $(BIN) $(DIST)
41
42
42 clean-deps:
43 clean-deps:
43 rm qlfile.lock
44 -rm qlfile.lock
44 rm -rf .qlot
45 -rm -rf .qlot
45
46
46 .PHONY: all graphs install-deps update-deps clean upload
47 .PHONY: all graphs install-deps update-deps clean upload
@@ -1,52 +1,52 b''
1 ("quicklisp" .
1 ("quicklisp" .
2 (:class qlot/source/dist:source-dist
2 (:class qlot/source/dist:source-dist
3 :initargs (:distribution "http://beta.quicklisp.org/dist/quicklisp.txt" :%version :latest)
3 :initargs (:distribution "http://beta.quicklisp.org/dist/quicklisp.txt" :%version :latest)
4 :version "2020-04-27"))
4 :version "2020-06-10"))
5 ("alexandria" .
5 ("alexandria" .
6 (:class qlot/source/ql:source-ql
6 (:class qlot/source/ql:source-ql
7 :initargs (:%version :latest)
7 :initargs (:%version :latest)
8 :version "ql-2020-04-27"))
8 :version "ql-2020-06-10"))
9 ("system-locale" .
9 ("system-locale" .
10 (:class qlot/source/ql:source-ql
10 (:class qlot/source/ql:source-ql
11 :initargs (:%version :latest)
11 :initargs (:%version :latest)
12 :version "ql-2020-04-27"))
12 :version "ql-2020-06-10"))
13 ("esrap" .
13 ("esrap" .
14 (:class qlot/source/ql:source-ql
14 (:class qlot/source/ql:source-ql
15 :initargs (:%version :latest)
15 :initargs (:%version :latest)
16 :version "ql-2020-04-27"))
16 :version "ql-2020-06-10"))
17 ("parenscript" .
17 ("parenscript" .
18 (:class qlot/source/ql:source-ql
18 (:class qlot/source/ql:source-ql
19 :initargs (:%version :latest)
19 :initargs (:%version :latest)
20 :version "ql-2020-04-27"))
20 :version "ql-2020-06-10"))
21 ("flute" .
21 ("flute" .
22 (:class qlot/source/ql:source-ql
22 (:class qlot/source/ql:source-ql
23 :initargs (:%version :latest)
23 :initargs (:%version :latest)
24 :version "ql-2020-04-27"))
24 :version "ql-2020-06-10"))
25 ("cl-ppcre" .
25 ("cl-ppcre" .
26 (:class qlot/source/ql:source-ql
26 (:class qlot/source/ql:source-ql
27 :initargs (:%version :latest)
27 :initargs (:%version :latest)
28 :version "ql-2020-04-27"))
28 :version "ql-2020-06-10"))
29 ("anaphora" .
29 ("anaphora" .
30 (:class qlot/source/ql:source-ql
30 (:class qlot/source/ql:source-ql
31 :initargs (:%version :latest)
31 :initargs (:%version :latest)
32 :version "ql-2020-04-27"))
32 :version "ql-2020-06-10"))
33 ("named-readtables" .
33 ("named-readtables" .
34 (:class qlot/source/ql:source-ql
34 (:class qlot/source/ql:source-ql
35 :initargs (:%version :latest)
35 :initargs (:%version :latest)
36 :version "ql-2020-04-27"))
36 :version "ql-2020-06-10"))
37 ("assoc-utils" .
37 ("assoc-utils" .
38 (:class qlot/source/ql:source-ql
38 (:class qlot/source/ql:source-ql
39 :initargs (:%version :latest)
39 :initargs (:%version :latest)
40 :version "ql-2020-04-27"))
40 :version "ql-2020-06-10"))
41 ("let-over-lambda" .
41 ("let-over-lambda" .
42 (:class qlot/source/ql:source-ql
42 (:class qlot/source/ql:source-ql
43 :initargs (:%version :latest)
43 :initargs (:%version :latest)
44 :version "ql-2020-04-27"))
44 :version "ql-2020-06-10"))
45 ("documentation-utils" .
45 ("documentation-utils" .
46 (:class qlot/source/ql:source-ql
46 (:class qlot/source/ql:source-ql
47 :initargs (:%version :latest)
47 :initargs (:%version :latest)
48 :version "ql-2020-04-27"))
48 :version "ql-2020-06-10"))
49 ("trivial-indent" .
49 ("trivial-indent" .
50 (:class qlot/source/ql:source-ql
50 (:class qlot/source/ql:source-ql
51 :initargs (:%version :latest)
51 :initargs (:%version :latest)
52 :version "ql-2020-04-27"))
52 :version "ql-2020-06-10"))
@@ -1,46 +1,46 b''
1
1
2 (in-package sugar-qsp.api)
2 (in-package txt2web.api)
3
3
4 (defpsmacro with-call-args (args &body body)
4 (defpsmacro with-call-args (args &body body)
5 `(progn
5 `(progn
6 (init-args ,args)
6 (init-args ,args)
7 ,@body
7 ,@body
8 (get-result)))
8 (get-result)))
9
9
10 (defpsmacro with-frame (&body body)
10 (defpsmacro with-frame (&body body)
11 `(progn
11 `(progn
12 (push-local-frame)
12 (push-local-frame)
13 (unwind-protect
13 (unwind-protect
14 ,@body
14 ,@body
15 (pop-local-frame))))
15 (pop-local-frame))))
16
16
17 (defpsmacro href-call (func &rest args)
17 (defpsmacro href-call (func &rest args)
18 `(+ "javascript:" (inline-call ,func ,@args)))
18 `(+ "javascript:" (inline-call ,func ,@args)))
19
19
20 (defpsmacro inline-call (func &rest args)
20 (defpsmacro inline-call (func &rest args)
21 `(+ ',func
21 `(+ ',func
22 "(\""
22 "(\""
23 ,(first args)
23 ,(first args)
24 ,@(loop :for arg :in (cdr args)
24 ,@(loop :for arg :in (cdr args)
25 :collect "\", \""
25 :collect "\", \""
26 :collect arg)
26 :collect arg)
27 "\");"))
27 "\");"))
28
28
29 (defpsmacro with-sleep ((resume-func) &body body)
29 (defpsmacro with-sleep ((resume-func) &body body)
30 `(new (*promise
30 `(new (*promise
31 (lambda (resolve)
31 (lambda (resolve)
32 (start-sleeping)
32 (start-sleeping)
33 (let ((,resume-func (lambda ()
33 (let ((,resume-func (lambda ()
34 (finish-sleeping)
34 (finish-sleeping)
35 (resolve)))))
35 (resolve)))))
36 ,@body))))
36 ,@body))))
37
37
38 (defvar *serv-vars* nil)
38 (defvar *serv-vars* nil)
39
39
40 (defpsmacro define-serv-var (name (value &optional index) &body body)
40 (defpsmacro define-serv-var (name (value &optional index) &body body)
41 (setf name (string-upcase (symbol-name name)))
41 (setf name (string-upcase (symbol-name name)))
42 (pushnew name *serv-vars* :test #'equal)
42 (pushnew name *serv-vars* :test #'equal)
43 `(setf (getprop serv-vars ,name)
43 `(setf (getprop serv-vars ,name)
44 (create :name ,name
44 (create :name ,name
45 :body (lambda (,value ,@(when index (list index)))
45 :body (lambda (,value ,@(when index (list index)))
46 ,@body))))
46 ,@body))))
@@ -1,531 +1,531 b''
1
1
2 (in-package sugar-qsp.api)
2 (in-package txt2web)
3
3
4 ;;; API deals with DOM manipulation and some bookkeeping for the
4 ;;; API deals with DOM manipulation and some bookkeeping for the
5 ;;; intrinsics, namely variables
5 ;;; intrinsics, namely variables
6 ;;; API is an implementation detail and has no QSP documentation. It
6 ;;; API is an implementation detail and has no QSP documentation. It
7 ;;; doesn't call intrinsics
7 ;;; doesn't call intrinsics
8
8
9 ;;; Utils
9 ;;; Utils
10
10
11 (defun make-act-html (title img)
11 (defun make-act-html (title img)
12 (+ "<a class='qsp-act' href='" (href-call call-act title) "' onmouseover='" (inline-call select-act title) "'>"
12 (+ "<a class='qsp-act' href='" (href-call call-act title) "' onmouseover='" (inline-call select-act title) "'>"
13 (if img (+ "<img src='" img "'>") "")
13 (if img (+ "<img src='" img "'>") "")
14 title
14 title
15 "</a>"))
15 "</a>"))
16
16
17 (defun make-menu-item-html (num title img loc)
17 (defun make-menu-item-html (num title img loc)
18 (+ "<a href='" (href-call finish-menu loc) "'>"
18 (+ "<a href='" (href-call finish-menu loc) "'>"
19 (if img (+ "<img src='" img "'>") "")
19 (if img (+ "<img src='" img "'>") "")
20 title
20 title
21 "</a>"))
21 "</a>"))
22
22
23 (defun make-obj (title img selected)
23 (defun make-obj (title img selected)
24 (+ "<li onclick='" (inline-call select-obj title img) "'>"
24 (+ "<li onclick='" (inline-call select-obj title img) "'>"
25 "<a class='qsp-obj" (if selected " qsp-obj-selected" "") "'>"
25 "<a class='qsp-obj" (if selected " qsp-obj-selected" "") "'>"
26 (if img (+ "<img src='" img "'>") "")
26 (if img (+ "<img src='" img "'>") "")
27 title
27 title
28 "</a>"))
28 "</a>"))
29
29
30 (defun make-menu-delimiter ()
30 (defun make-menu-delimiter ()
31 "<hr>")
31 "<hr>")
32
32
33 (defun copy-obj (obj)
33 (defun copy-obj (obj)
34 (chain *j-s-o-n (parse (chain *j-s-o-n (stringify obj)))))
34 (chain *j-s-o-n (parse (chain *j-s-o-n (stringify obj)))))
35
35
36 (defun report-error (text)
36 (defun report-error (text)
37 (alert text))
37 (alert text))
38
38
39 (defun start-sleeping ()
39 (defun start-sleeping ()
40 (chain (by-id "qsp") class-list (add "disable")))
40 (chain (by-id "qsp") class-list (add "disable")))
41
41
42 (defun finish-sleeping ()
42 (defun finish-sleeping ()
43 (chain (by-id "qsp") class-list (remove "disable")))
43 (chain (by-id "qsp") class-list (remove "disable")))
44
44
45 (defun sleep (msec)
45 (defun sleep (msec)
46 (with-sleep (resume)
46 (with-sleep (resume)
47 (set-timeout resume msec)))
47 (set-timeout resume msec)))
48
48
49 (defun init-dom ()
49 (defun init-dom ()
50 ;; Save/load buttons
50 ;; Save/load buttons
51 (let ((btn (by-id "qsp-btn-save")))
51 (let ((btn (by-id "qsp-btn-save")))
52 (setf (@ btn onclick) savegame)
52 (setf (@ btn onclick) savegame)
53 (setf (@ btn href) "#"))
53 (setf (@ btn href) "#"))
54 (let ((btn (by-id "qsp-btn-open")))
54 (let ((btn (by-id "qsp-btn-open")))
55 (setf (@ btn onclick) opengame)
55 (setf (@ btn onclick) opengame)
56 (setf (@ btn href) "#"))
56 (setf (@ btn href) "#"))
57 ;; Close image on click
57 ;; Close image on click
58 (setf (@ (by-id "qsp-image-container") onclick)
58 (setf (@ (by-id "qsp-image-container") onclick)
59 show-image)
59 show-image)
60 ;; Enter in input field
60 ;; Enter in input field
61 (setf (@ (get-frame :input) onkeyup)
61 (setf (@ (get-frame :input) onkeyup)
62 on-input-key)
62 on-input-key)
63 ;; Close the dropdown on any click
63 ;; Close the dropdown on any click
64 (setf (@ window onclick)
64 (setf (@ window onclick)
65 (lambda (event)
65 (lambda (event)
66 (setf (@ window mouse)
66 (setf (@ window mouse)
67 (list (@ event page-x)
67 (list (@ event page-x)
68 (@ event page-y)))
68 (@ event page-y)))
69 (finish-menu nil))))
69 (finish-menu nil))))
70
70
71 (defun call-serv-loc (var-name &rest args)
71 (defun call-serv-loc (var-name &rest args)
72 (let ((loc-name (get-global var-name 0)))
72 (let ((loc-name (get-global var-name 0)))
73 (when loc-name
73 (when loc-name
74 (let ((loc (getprop *locs loc-name)))
74 (let ((loc (getprop *locs loc-name)))
75 (when loc
75 (when loc
76 (call-loc loc-name args))))))
76 (call-loc loc-name args))))))
77
77
78 (defun filename-game (filename)
78 (defun filename-game (filename)
79 (let ((game-name (chain filename (match "(.*/)?([^.]+)(\\.[a-zA-Z]+)?") 2))))
79 (let ((game-name (chain filename (match "(.*/)?([^.]+)(\\.[a-zA-Z]+)?") 2))))
80 (getprop *games game-name))
80 (getprop *games game-name))
81
81
82 (defun run-game (name)
82 (defun run-game (name)
83 (let ((game (filename-game name)))
83 (let ((game (filename-game name)))
84 (setf *main-game name)
84 (setf *main-game name)
85 ;; Replace locations with the new game's
85 ;; Replace locations with the new game's
86 (setf *locs game)
86 (setf *locs game)
87 (funcall (getprop game
87 (funcall (getprop game
88 (chain *object (keys game) 0))
88 (chain *object (keys game) 0))
89 (list))))
89 (list))))
90
90
91 ;;; Misc
91 ;;; Misc
92
92
93 (defun newline (key)
93 (defun newline (key)
94 (append-id (key-to-id key) "<br>" t))
94 (append-id (key-to-id key) "<br>" t))
95
95
96 (defun clear-id (id)
96 (defun clear-id (id)
97 (setf (inner-html (by-id id)) ""))
97 (setf (inner-html (by-id id)) ""))
98
98
99 (defun escape-html (text)
99 (defun escape-html (text)
100 (chain text
100 (chain text
101 (replace (regex "/&/g") "&amp;")
101 (replace (regex "/&/g") "&amp;")
102 (replace (regex "/</g") "&lt;")
102 (replace (regex "/</g") "&lt;")
103 (replace (regex "/>/g") "&gt;")
103 (replace (regex "/>/g") "&gt;")
104 (replace (regex "/\"/g") "&quot;")
104 (replace (regex "/\"/g") "&quot;")
105 (replace (regex "/'/g") "&apos;")))
105 (replace (regex "/'/g") "&apos;")))
106
106
107 (defun prepare-contents (s &optional force-html)
107 (defun prepare-contents (s &optional force-html)
108 (setf s (chain s (to-string)))
108 (setf s (chain s (to-string)))
109 (if (or force-html (get-global "USEHTML" 0))
109 (if (or force-html (get-global "USEHTML" 0))
110 s
110 s
111 (escape-html s)))
111 (escape-html s)))
112
112
113 (defun get-id (id &optional force-html)
113 (defun get-id (id &optional force-html)
114 (inner-html (by-id id)))
114 (inner-html (by-id id)))
115
115
116 (defun set-id (id contents &optional force-html)
116 (defun set-id (id contents &optional force-html)
117 (setf (inner-html (by-id id)) (prepare-contents contents force-html)))
117 (setf (inner-html (by-id id)) (prepare-contents contents force-html)))
118
118
119 (defun append-id (id contents &optional force-html)
119 (defun append-id (id contents &optional force-html)
120 (when contents
120 (when contents
121 (incf (inner-html (by-id id)) (prepare-contents contents force-html))))
121 (incf (inner-html (by-id id)) (prepare-contents contents force-html))))
122
122
123 (defun on-input-key (ev)
123 (defun on-input-key (ev)
124 (when (= 13 (@ ev key-code))
124 (when (= 13 (@ ev key-code))
125 (chain ev (prevent-default))
125 (chain ev (prevent-default))
126 (call-serv-loc "$USERCOM")))
126 (call-serv-loc "$USERCOM")))
127
127
128 ;;; Function calls
128 ;;; Function calls
129
129
130 (defun init-args (args)
130 (defun init-args (args)
131 (dotimes (i (length args))
131 (dotimes (i (length args))
132 (let ((arg (elt args i)))
132 (let ((arg (elt args i)))
133 (if (numberp arg)
133 (if (numberp arg)
134 (set-var args i :num arg)
134 (set-var args i :num arg)
135 (set-var args i :str arg)))))
135 (set-var args i :str arg)))))
136
136
137 (defun get-result ()
137 (defun get-result ()
138 (or (get-global "$RESULT" 0)
138 (or (get-global "$RESULT" 0)
139 (get-global "RESULT" 0)))
139 (get-global "RESULT" 0)))
140
140
141 (defun call-loc (name args)
141 (defun call-loc (name args)
142 (setf name (chain name (to-upper-case)))
142 (setf name (chain name (to-upper-case)))
143 (with-frame
143 (with-frame
144 (with-call-args args
144 (with-call-args args
145 (funcall (getprop *locs name))))
145 (funcall (getprop *locs name))))
146 (void))
146 (void))
147
147
148 (defun call-act (title)
148 (defun call-act (title)
149 (with-frame
149 (with-frame
150 (funcall (getprop *acts title :act)))
150 (funcall (getprop *acts title :act)))
151 (void))
151 (void))
152
152
153 ;;; Text windows
153 ;;; Text windows
154
154
155 (defun key-to-id (key)
155 (defun key-to-id (key)
156 (case key
156 (case key
157 (:all "qsp")
157 (:all "qsp")
158 (:main "qsp-main")
158 (:main "qsp-main")
159 (:stat "qsp-stat")
159 (:stat "qsp-stat")
160 (:objs "qsp-objs")
160 (:objs "qsp-objs")
161 (:acts "qsp-acts")
161 (:acts "qsp-acts")
162 (:input "qsp-input")
162 (:input "qsp-input")
163 (:image "qsp-image")
163 (:image "qsp-image")
164 (:dropdown "qsp-dropdown")
164 (:dropdown "qsp-dropdown")
165 (t (report-error "Internal error!"))))
165 (t (report-error "Internal error!"))))
166
166
167 (defun get-frame (key)
167 (defun get-frame (key)
168 (by-id (key-to-id key)))
168 (by-id (key-to-id key)))
169
169
170 (defun add-text (key text)
170 (defun add-text (key text)
171 (append-id (key-to-id key) text))
171 (append-id (key-to-id key) text))
172
172
173 (defun get-text (key)
173 (defun get-text (key)
174 (get-id (key-to-id key)))
174 (get-id (key-to-id key)))
175
175
176 (defun clear-text (key)
176 (defun clear-text (key)
177 (clear-id (key-to-id key)))
177 (clear-id (key-to-id key)))
178
178
179 (defun enable-frame (key enable)
179 (defun enable-frame (key enable)
180 (let ((obj (get-frame key)))
180 (let ((obj (get-frame key)))
181 (setf (@ obj style display) (if enable "block" "none"))
181 (setf (@ obj style display) (if enable "block" "none"))
182 (void)))
182 (void)))
183
183
184 ;;; Actions
184 ;;; Actions
185
185
186 (defun add-act (title img act)
186 (defun add-act (title img act)
187 (setf (getprop *acts title)
187 (setf (getprop *acts title)
188 (create :title title :img img :act act :selected nil))
188 (create :title title :img img :act act :selected nil))
189 (update-acts))
189 (update-acts))
190
190
191 (defun del-act (title)
191 (defun del-act (title)
192 (delete (getprop *acts title))
192 (delete (getprop *acts title))
193 (update-acts))
193 (update-acts))
194
194
195 (defun clear-act ()
195 (defun clear-act ()
196 (setf *acts (create))
196 (setf *acts (create))
197 (update-acts))
197 (update-acts))
198
198
199 (defun update-acts ()
199 (defun update-acts ()
200 (clear-id "qsp-acts")
200 (clear-id "qsp-acts")
201 (let ((elt (by-id "qsp-acts")))
201 (let ((elt (by-id "qsp-acts")))
202 (for-in (title *acts)
202 (for-in (title *acts)
203 (let ((obj (getprop *acts title)))
203 (let ((obj (getprop *acts title)))
204 (incf (inner-html elt) (make-act-html title (getprop obj :img)))))))
204 (incf (inner-html elt) (make-act-html title (getprop obj :img)))))))
205
205
206 (defun select-act (title)
206 (defun select-act (title)
207 (loop :for (k v) :of *acts
207 (loop :for (k v) :of *acts
208 :do (setf (getprop v :selected) nil))
208 :do (setf (getprop v :selected) nil))
209 (setf (getprop *acts title :selected) t)
209 (setf (getprop *acts title :selected) t)
210 (call-serv-loc "$ONACTSEL"))
210 (call-serv-loc "$ONACTSEL"))
211
211
212 ;;; "Syntax"
212 ;;; "Syntax"
213
213
214 (defun qspfor (name index from to step body)
214 (defun qspfor (name index from to step body)
215 (for ((i from))
215 (for ((i from))
216 ((< i to))
216 ((< i to))
217 ((incf i step))
217 ((incf i step))
218 (set-var name index :num i)
218 (set-var name index :num i)
219 (unless (await (funcall body))
219 (unless (await (funcall body))
220 (return-from qspfor))))
220 (return-from qspfor))))
221
221
222 ;;; Variables
222 ;;; Variables
223
223
224 (defun new-var (slot &rest indexes)
224 (defun new-var (slot &rest indexes)
225 (let ((v (list)))
225 (let ((v (list)))
226 (dolist (index indexes)
226 (dolist (index indexes)
227 (setf (elt v index) (if (eq #\$ (elt slot 0)) "" 0)))
227 (setf (elt v index) (if (eq #\$ (elt slot 0)) "" 0)))
228 (setf (@ v :indexes) (create))
228 (setf (@ v :indexes) (create))
229 v))
229 v))
230
230
231 (defun set-str-element (slot index value)
231 (defun set-str-element (slot index value)
232 (if (has index (getprop slot :indexes))
232 (if (has index (getprop slot :indexes))
233 (setf (elt (getprop slot)
233 (setf (elt (getprop slot)
234 (getprop slot :indexes index))
234 (getprop slot :indexes index))
235 value)
235 value)
236 (progn
236 (progn
237 (chain slot (push value))
237 (chain slot (push value))
238 (setf (elt slot index)
238 (setf (elt slot index)
239 (length slot))))
239 (length slot))))
240 (void))
240 (void))
241
241
242 (defun set-any-element (slot index value)
242 (defun set-any-element (slot index value)
243 (cond ((null index)
243 (cond ((null index)
244 (chain (elt slot) (push value)))
244 (chain (elt slot) (push value)))
245 ((numberp index)
245 ((numberp index)
246 (setf (elt slot index) value))
246 (setf (elt slot index) value))
247 ((stringp index)
247 ((stringp index)
248 (set-str-element slot index value))
248 (set-str-element slot index value))
249 (t (report-error "INTERNAL ERROR")))
249 (t (report-error "INTERNAL ERROR")))
250 (void))
250 (void))
251
251
252 (defun set-serv-var (name index value)
252 (defun set-serv-var (name index value)
253 (let ((slot (getprop *globals name)))
253 (let ((slot (getprop *globals name)))
254 (set-any-element slot index value))
254 (set-any-element slot index value))
255 (funcall (getprop serv-vars name :body) value index)
255 (funcall (getprop serv-vars name :body) value index)
256 (void))
256 (void))
257
257
258 (defun get-element (slot index)
258 (defun get-element (slot index)
259 (if (numberp index)
259 (if (numberp index)
260 (elt slot index)
260 (elt slot index)
261 (elt slot (getprop slot :indexes index))))
261 (elt slot (getprop slot :indexes index))))
262
262
263 (defun get-global (name index)
263 (defun get-global (name index)
264 (elt (getprop *globals name) index))
264 (elt (getprop *globals name) index))
265
265
266 (defun kill-var (store name &optional index)
266 (defun kill-var (store name &optional index)
267 (setf name (chain name (to-upper-case)))
267 (setf name (chain name (to-upper-case)))
268 (if (and index (not (= 0 index)))
268 (if (and index (not (= 0 index)))
269 (chain (getprop *globals name) (kill index))
269 (chain (getprop *globals name) (kill index))
270 (delete (getprop *globals name)))
270 (delete (getprop *globals name)))
271 (void))
271 (void))
272
272
273 (defun array-size (name)
273 (defun array-size (name)
274 (@ (var-ref name) :values length))
274 (@ (var-ref name) :values length))
275
275
276 ;;; Locals
276 ;;; Locals
277
277
278 (defun push-local-frame ()
278 (defun push-local-frame ()
279 (chain *locals (push (create)))
279 (chain *locals (push (create)))
280 (void))
280 (void))
281
281
282 (defun pop-local-frame ()
282 (defun pop-local-frame ()
283 (chain *locals (pop))
283 (chain *locals (pop))
284 (void))
284 (void))
285
285
286 (defun current-local-frame ()
286 (defun current-local-frame ()
287 (elt *locals (1- (length *locals))))
287 (elt *locals (1- (length *locals))))
288
288
289 ;;; Objects
289 ;;; Objects
290
290
291 (defun select-obj (title img)
291 (defun select-obj (title img)
292 (loop :for (k v) :of *objs
292 (loop :for (k v) :of *objs
293 :do (setf (getprop v :selected) nil))
293 :do (setf (getprop v :selected) nil))
294 (setf (getprop *objs title :selected) t)
294 (setf (getprop *objs title :selected) t)
295 (call-serv-loc "$ONOBJSEL" title img))
295 (call-serv-loc "$ONOBJSEL" title img))
296
296
297 (defun update-objs ()
297 (defun update-objs ()
298 (let ((elt (by-id "qsp-objs")))
298 (let ((elt (by-id "qsp-objs")))
299 (setf (inner-html elt) "<ul>")
299 (setf (inner-html elt) "<ul>")
300 (loop :for (name obj) :of *objs
300 (loop :for (name obj) :of *objs
301 :do (incf (inner-html elt)
301 :do (incf (inner-html elt)
302 (make-obj name (@ obj :img) (@ obj :selected))))
302 (make-obj name (@ obj :img) (@ obj :selected))))
303 (incf (inner-html elt) "</ul>")))
303 (incf (inner-html elt) "</ul>")))
304
304
305 ;;; Menu
305 ;;; Menu
306
306
307 (defun open-menu (menu-data)
307 (defun open-menu (menu-data)
308 (let ((elt (get-frame :dropdown))
308 (let ((elt (get-frame :dropdown))
309 (i 0))
309 (i 0))
310 (loop :for item :in menu-data
310 (loop :for item :in menu-data
311 :do (incf i)
311 :do (incf i)
312 :do (incf (inner-html elt)
312 :do (incf (inner-html elt)
313 (if (eq item :delimiter)
313 (if (eq item :delimiter)
314 (make-menu-delimiter i)
314 (make-menu-delimiter i)
315 (make-menu-item-html i
315 (make-menu-item-html i
316 (@ item :text)
316 (@ item :text)
317 (@ item :icon)
317 (@ item :icon)
318 (@ item :loc)))))
318 (@ item :loc)))))
319 (let ((mouse (@ window mouse)))
319 (let ((mouse (@ window mouse)))
320 (setf (@ elt style left) (+ (elt mouse 0) "px"))
320 (setf (@ elt style left) (+ (elt mouse 0) "px"))
321 (setf (@ elt style top) (+ (elt mouse 1) "px"))
321 (setf (@ elt style top) (+ (elt mouse 1) "px"))
322 ;; Make sure it's inside the viewport
322 ;; Make sure it's inside the viewport
323 (when (> (@ document body inner-width)
323 (when (> (@ document body inner-width)
324 (+ (elt mouse 0) (@ elt inner-width)))
324 (+ (elt mouse 0) (@ elt inner-width)))
325 (incf (@ elt style left) (@ elt inner-width)))
325 (incf (@ elt style left) (@ elt inner-width)))
326 (when (> (@ document body inner-height)
326 (when (> (@ document body inner-height)
327 (+ (elt mouse 0) (@ elt inner-height)))
327 (+ (elt mouse 0) (@ elt inner-height)))
328 (incf (@ elt style top) (@ elt inner-height))))
328 (incf (@ elt style top) (@ elt inner-height))))
329 (setf (@ elt style display) "block")))
329 (setf (@ elt style display) "block")))
330
330
331 (defun finish-menu (loc)
331 (defun finish-menu (loc)
332 (when *menu-resume
332 (when *menu-resume
333 (let ((elt (get-frame :dropdown)))
333 (let ((elt (get-frame :dropdown)))
334 (setf (inner-html elt) "")
334 (setf (inner-html elt) "")
335 (setf (@ elt style display) "none")
335 (setf (@ elt style display) "none")
336 (funcall *menu-resume)
336 (funcall *menu-resume)
337 (setf *menu-resume nil))
337 (setf *menu-resume nil))
338 (when loc
338 (when loc
339 (call-loc loc)))
339 (call-loc loc)))
340 (void))
340 (void))
341
341
342 (defun menu (menu-data)
342 (defun menu (menu-data)
343 (with-sleep (resume)
343 (with-sleep (resume)
344 (open-menu menu-data)
344 (open-menu menu-data)
345 (setf *menu-resume resume))
345 (setf *menu-resume resume))
346 (void))
346 (void))
347
347
348 ;;; Content
348 ;;; Content
349
349
350 (defun clean-audio ()
350 (defun clean-audio ()
351 (loop :for k :in (chain *object (keys *playing))
351 (loop :for k :in (chain *object (keys *playing))
352 :for v := (getprop *playing k)
352 :for v := (getprop *playing k)
353 :do (when (@ v ended)
353 :do (when (@ v ended)
354 (delete (@ *playing k)))))
354 (delete (@ *playing k)))))
355
355
356 (defun show-image (path)
356 (defun show-image (path)
357 (let ((img (get-frame :image)))
357 (let ((img (get-frame :image)))
358 (cond (path
358 (cond (path
359 (setf (@ img src) path)
359 (setf (@ img src) path)
360 (setf (@ img style display) "flex"))
360 (setf (@ img style display) "flex"))
361 (t
361 (t
362 (setf (@ img src) "")
362 (setf (@ img src) "")
363 (setf (@ img style display) "hidden")))))
363 (setf (@ img style display) "hidden")))))
364
364
365 (defun show-inline-images (frame-name images)
365 (defun show-inline-images (frame-name images)
366 (let ((frame (get-frame frame-name))
366 (let ((frame (get-frame frame-name))
367 (text ""))
367 (text ""))
368 (incf text "<div style='position:relative; display: inline-block'>")
368 (incf text "<div style='position:relative; display: inline-block'>")
369 (incf text (+ "<img src='" (@ images 0) "'>"))
369 (incf text (+ "<img src='" (@ images 0) "'>"))
370 (loop :for image :in (chain images (slice 1))
370 (loop :for image :in (chain images (slice 1))
371 :do (incf text
371 :do (incf text
372 (+ "<img style='position:absolute' src='" image "'>")))
372 (+ "<img style='position:absolute' src='" image "'>")))
373 (incf text "</div>")
373 (incf text "</div>")
374 (incf (inner-html frame) text)))
374 (incf (inner-html frame) text)))
375
375
376 (defun rgb-string (rgb)
376 (defun rgb-string (rgb)
377 (let ((red (ps::>> rgb 16))
377 (let ((red (ps::>> rgb 16))
378 (green (logand (ps::>> rgb 8) 255))
378 (green (logand (ps::>> rgb 8) 255))
379 (blue (logand rgb 255)))
379 (blue (logand rgb 255)))
380 (flet ((rgb-to-hex (comp)
380 (flet ((rgb-to-hex (comp)
381 (let ((hex (chain (*number comp) (to-string 16))))
381 (let ((hex (chain (*number comp) (to-string 16))))
382 (if (< (length hex) 2)
382 (if (< (length hex) 2)
383 (+ "0" hex)
383 (+ "0" hex)
384 hex))))
384 hex))))
385 (+ "#" (rgb-to-hex red) (rgb-to-hex green) (rgb-to-hex blue)))))
385 (+ "#" (rgb-to-hex red) (rgb-to-hex green) (rgb-to-hex blue)))))
386
386
387 (defun store-obj (key obj)
387 (defun store-obj (key obj)
388 (store-str key (btoa (encode-u-r-i-component (chain *j-s-o-n (stringify obj)))))
388 (store-str key (btoa (encode-u-r-i-component (chain *j-s-o-n (stringify obj)))))
389 (void))
389 (void))
390 (defun store-str (key str)
390 (defun store-str (key str)
391 (chain local-storage (set-item (+ "qsp_" key) str))
391 (chain local-storage (set-item (+ "qsp_" key) str))
392 (void))
392 (void))
393
393
394 (defun load-obj (key)
394 (defun load-obj (key)
395 (chain *j-s-o-n (parse (encode-u-r-i-component (atob (load-str key))))))
395 (chain *j-s-o-n (parse (encode-u-r-i-component (atob (load-str key))))))
396 (defun load-str (key)
396 (defun load-str (key)
397 (chain local-storage (get-item (+ "qsp_" key))))
397 (chain local-storage (get-item (+ "qsp_" key))))
398
398
399 ;;; Saves
399 ;;; Saves
400
400
401 (defun slot-savegame (slot comment)
401 (defun slot-savegame (slot comment)
402 (let ((saves (load-obj "saves")))
402 (let ((saves (load-obj "saves")))
403 (setf (@ saves slot) comment)
403 (setf (@ saves slot) comment)
404 (store-obj saves))
404 (store-obj saves))
405 (store-str slot (state-to-base64))
405 (store-str slot (state-to-base64))
406 (void))
406 (void))
407
407
408 (defun slot-loadgame (slot)
408 (defun slot-loadgame (slot)
409 (base64-to-state (load-str slot))
409 (base64-to-state (load-str slot))
410 (void))
410 (void))
411
411
412 (defun slot-deletegame (slot)
412 (defun slot-deletegame (slot)
413 (let ((saves (load-obj "saves")))
413 (let ((saves (load-obj "saves")))
414 (setf (@ saves slot) undefined)
414 (setf (@ saves slot) undefined)
415 (store-obj saves))
415 (store-obj saves))
416 (store-str slot undefined)
416 (store-str slot undefined)
417 (void))
417 (void))
418
418
419 (defun slot-listgames ()
419 (defun slot-listgames ()
420 (load-obj "saves"))
420 (load-obj "saves"))
421
421
422 (defun opengame ()
422 (defun opengame ()
423 (let ((element (chain document (create-element :input))))
423 (let ((element (chain document (create-element :input))))
424 (chain element (set-attribute :type :file))
424 (chain element (set-attribute :type :file))
425 (chain element (set-attribute :id :qsp-opengame))
425 (chain element (set-attribute :id :qsp-opengame))
426 (chain element (set-attribute :tabindex -1))
426 (chain element (set-attribute :tabindex -1))
427 (chain element (set-attribute "aria-hidden" t))
427 (chain element (set-attribute "aria-hidden" t))
428 (setf (@ element style display) :block)
428 (setf (@ element style display) :block)
429 (setf (@ element style visibility) :hidden)
429 (setf (@ element style visibility) :hidden)
430 (setf (@ element style position) :fixed)
430 (setf (@ element style position) :fixed)
431 (setf (@ element onchange)
431 (setf (@ element onchange)
432 (lambda (event)
432 (lambda (event)
433 (let* ((file (@ event target files 0))
433 (let* ((file (@ event target files 0))
434 (reader (new (*file-reader))))
434 (reader (new (*file-reader))))
435 (setf (@ reader onload)
435 (setf (@ reader onload)
436 (lambda (ev)
436 (lambda (ev)
437 (block nil
437 (block nil
438 (let ((target (@ ev current-target)))
438 (let ((target (@ ev current-target)))
439 (unless (@ target result)
439 (unless (@ target result)
440 (return))
440 (return))
441 (base64-to-state (@ target result))
441 (base64-to-state (@ target result))
442 (unstash-state)))))
442 (unstash-state)))))
443 (chain reader (read-as-text file)))))
443 (chain reader (read-as-text file)))))
444 (chain document body (append-child element))
444 (chain document body (append-child element))
445 (chain element (click))
445 (chain element (click))
446 (chain document body (remove-child element))))
446 (chain document body (remove-child element))))
447
447
448 (defun savegame ()
448 (defun savegame ()
449 (let ((element (chain document (create-element :a))))
449 (let ((element (chain document (create-element :a))))
450 (chain element (set-attribute :href (+ "data:text/plain;charset=utf-8," (state-to-base64))))
450 (chain element (set-attribute :href (+ "data:text/plain;charset=utf-8," (state-to-base64))))
451 (chain element (set-attribute :download "savegame.sav"))
451 (chain element (set-attribute :download "savegame.sav"))
452 (setf (@ element style display) :none)
452 (setf (@ element style display) :none)
453 (chain document body (append-child element))
453 (chain document body (append-child element))
454 (chain element (click))
454 (chain element (click))
455 (chain document body (remove-child element))))
455 (chain document body (remove-child element))))
456
456
457 (defun stash-state (args)
457 (defun stash-state (args)
458 (call-serv-loc "$ONGSAVE")
458 (call-serv-loc "$ONGSAVE")
459 (setf *state-stash
459 (setf *state-stash
460 (chain *j-s-o-n (stringify
460 (chain *j-s-o-n (stringify
461 (create :vars *globals
461 (create :vars *globals
462 :objs *objs
462 :objs *objs
463 :loc-args args
463 :loc-args args
464 :msecs (- (chain *date (now)) *started-at)
464 :msecs (- (chain *date (now)) *started-at)
465 :timer-interval *timer-interval
465 :timer-interval *timer-interval
466 :main-html (inner-html
466 :main-html (inner-html
467 (get-frame :main))
467 (get-frame :main))
468 :stat-html (inner-html
468 :stat-html (inner-html
469 (get-frame :stat))
469 (get-frame :stat))
470 :next-location *current-location))))
470 :next-location *current-location))))
471 (void))
471 (void))
472
472
473 (defun unstash-state ()
473 (defun unstash-state ()
474 (let ((data (chain *j-s-o-n (parse *state-stash))))
474 (let ((data (chain *j-s-o-n (parse *state-stash))))
475 (clear-act)
475 (clear-act)
476 (setf *globals (@ data :vars))
476 (setf *globals (@ data :vars))
477 (loop :for k :in (chain *object (keys *globals))
477 (loop :for k :in (chain *object (keys *globals))
478 :do (chain *object (set-prototype-of (getprop *globals k)
478 :do (chain *object (set-prototype-of (getprop *globals k)
479 (@ *var prototype))))
479 (@ *var prototype))))
480 (setf *started-at (- (chain *date (now)) (@ data :msecs)))
480 (setf *started-at (- (chain *date (now)) (@ data :msecs)))
481 (setf *objs (@ data :objs))
481 (setf *objs (@ data :objs))
482 (setf *current-location (@ data :next-location))
482 (setf *current-location (@ data :next-location))
483 (setf (inner-html (get-frame :main))
483 (setf (inner-html (get-frame :main))
484 (@ data :main-html))
484 (@ data :main-html))
485 (setf (inner-html (get-frame :stat))
485 (setf (inner-html (get-frame :stat))
486 (@ data :stat-html))
486 (@ data :stat-html))
487 (update-objs)
487 (update-objs)
488 (set-timer (@ data :timer-interval))
488 (set-timer (@ data :timer-interval))
489 (call-serv-loc "$ONGLOAD")
489 (call-serv-loc "$ONGLOAD")
490 (call-loc *current-location (@ data :loc-args))
490 (call-loc *current-location (@ data :loc-args))
491 (void)))
491 (void)))
492
492
493 (defun state-to-base64 ()
493 (defun state-to-base64 ()
494 (btoa (encode-u-r-i-component *state-stash)))
494 (btoa (encode-u-r-i-component *state-stash)))
495
495
496 (defun base64-to-state (data)
496 (defun base64-to-state (data)
497 (setf *state-stash (decode-u-r-i-component (atob data))))
497 (setf *state-stash (decode-u-r-i-component (atob data))))
498
498
499 ;;; Timers
499 ;;; Timers
500
500
501 (defun set-timer (interval)
501 (defun set-timer (interval)
502 (setf *timer-interval interval)
502 (setf *timer-interval interval)
503 (clear-interval *timer-obj)
503 (clear-interval *timer-obj)
504 (setf *timer-obj
504 (setf *timer-obj
505 (set-interval
505 (set-interval
506 (lambda ()
506 (lambda ()
507 (call-serv-loc "$COUNTER"))
507 (call-serv-loc "$COUNTER"))
508 interval)))
508 interval)))
509
509
510 ;;; Special variables
510 ;;; Special variables
511
511
512 (defvar serv-vars (create))
512 (defvar serv-vars (create))
513
513
514 (define-serv-var $backimage (path)
514 (define-serv-var $backimage (path)
515 (setf (@ (get-frame :main) style background-image) path))
515 (setf (@ (get-frame :main) style background-image) path))
516
516
517 (define-serv-var bcolor (color)
517 (define-serv-var bcolor (color)
518 (setf (@ (get-frame :all) style background-color) (rgb-string color)))
518 (setf (@ (get-frame :all) style background-color) (rgb-string color)))
519
519
520 (define-serv-var fcolor (color)
520 (define-serv-var fcolor (color)
521 (setf (@ (get-frame :all) style color) (rgb-string color)))
521 (setf (@ (get-frame :all) style color) (rgb-string color)))
522
522
523 (define-serv-var lcolor (color)
523 (define-serv-var lcolor (color)
524 (setf (@ (get-frame :style) inner-text)
524 (setf (@ (get-frame :style) inner-text)
525 (+ "a { color: " (rgb-string color) ";}")))
525 (+ "a { color: " (rgb-string color) ";}")))
526
526
527 (define-serv-var fsize (size)
527 (define-serv-var fsize (size)
528 (setf (@ (get-frame :all) style font-size) size))
528 (setf (@ (get-frame :all) style font-size) size))
529
529
530 (define-serv-var $fname (font-name)
530 (define-serv-var $fname (font-name)
531 (setf (@ (get-frame :all) style font-family) (+ font-name ",serif")))
531 (setf (@ (get-frame :all) style font-family) (+ font-name ",serif")))
@@ -1,14 +1,14 b''
1
1
2 (in-package sugar-qsp)
2 (in-package txt2web)
3
3
4 (defclass compiler ()
4 (defclass compiler ()
5 ((body :accessor body :initform #.(load-src "extras/body.html"))
5 ((body :accessor body :initform #.(load-src "extras/body.html"))
6 (css :accessor css :initform (list #.(load-src "extras/default.css")))
6 (css :accessor css :initform (list #.(load-src "extras/default.css")))
7 (js :accessor js :initform (reverse
7 (js :accessor js :initform (reverse
8 (list
8 (list
9 '#.(read-progn-from-string (load-src "src/main.ps"))
9 '#.(read-progn-from-string (load-src "src/main.ps"))
10 '#.(read-progn-from-string (load-src "src/api.ps"))
10 '#.(read-progn-from-string (load-src "src/api.ps"))
11 '#.(read-progn-from-string (load-src "src/intrinsics.ps")))))
11 '#.(read-progn-from-string (load-src "src/intrinsics.ps")))))
12 (compile :accessor compile-only :initarg :compile)
12 (compile :accessor compile-only :initarg :compile)
13 (target :accessor target :initarg :target)
13 (target :accessor target :initarg :target)
14 (beautify :accessor beautify :initarg :beautify)))
14 (beautify :accessor beautify :initarg :beautify)))
@@ -1,170 +1,170 b''
1
1
2 (in-package sugar-qsp.lib)
2 (in-package txt2web.lib)
3
3
4 ;;;; Macros implementing some intrinsics where it makes sense
4 ;;;; Macros implementing some intrinsics where it makes sense
5 ;;;; E.g. an equivalent JS function exists, or it's a direct API call
5 ;;;; E.g. an equivalent JS function exists, or it's a direct API call
6
6
7 ;;; 1loc
7 ;;; 1loc
8
8
9 ;;; 2var
9 ;;; 2var
10
10
11 (defpsmacro killvar (varname &optional index)
11 (defpsmacro killvar (varname &optional index)
12 `(api-call kill-var ,varname ,index))
12 `(api-call kill-var ,varname ,index))
13
13
14 (defpsmacro killall ()
14 (defpsmacro killall ()
15 `(api-call kill-all))
15 `(api-call kill-all))
16
16
17 ;;; 3expr
17 ;;; 3expr
18
18
19 (defpsmacro no (arg)
19 (defpsmacro no (arg)
20 `(- -1 ,arg))
20 `(- -1 ,arg))
21
21
22 ;;; 4code
22 ;;; 4code
23
23
24 (defpsmacro qspver ()
24 (defpsmacro qspver ()
25 "0.0.1")
25 "0.0.1")
26
26
27 (defpsmacro curloc ()
27 (defpsmacro curloc ()
28 `*current-location)
28 `*current-location)
29
29
30 (defpsmacro rnd ()
30 (defpsmacro rnd ()
31 `(funcall rand 1 1000))
31 `(funcall rand 1 1000))
32
32
33 (defpsmacro qspmax (&rest args)
33 (defpsmacro qspmax (&rest args)
34 (if (= 1 (length args))
34 (if (= 1 (length args))
35 `(*math.max.apply nil ,@args)
35 `(*math.max.apply nil ,@args)
36 `(*math.max ,@args)))
36 `(*math.max ,@args)))
37
37
38 (defpsmacro qspmin (&rest args)
38 (defpsmacro qspmin (&rest args)
39 (if (= 1 (length args))
39 (if (= 1 (length args))
40 `(*math.min.apply nil ,@args)
40 `(*math.min.apply nil ,@args)
41 `(*math.min ,@args)))
41 `(*math.min ,@args)))
42
42
43 ;;; 5arrays
43 ;;; 5arrays
44
44
45 (defpsmacro arrsize (name)
45 (defpsmacro arrsize (name)
46 `(api-call array-size ,name))
46 `(api-call array-size ,name))
47
47
48 ;;; 6str
48 ;;; 6str
49
49
50 (defpsmacro len (s)
50 (defpsmacro len (s)
51 `(length ,s))
51 `(length ,s))
52
52
53 (defpsmacro mid (s from &optional count)
53 (defpsmacro mid (s from &optional count)
54 `(chain ,s (substring ,from ,count)))
54 `(chain ,s (substring ,from ,count)))
55
55
56 (defpsmacro ucase (s)
56 (defpsmacro ucase (s)
57 `(chain ,s (to-upper-case)))
57 `(chain ,s (to-upper-case)))
58
58
59 (defpsmacro lcase (s)
59 (defpsmacro lcase (s)
60 `(chain ,s (to-lower-case)))
60 `(chain ,s (to-lower-case)))
61
61
62 (defpsmacro trim (s)
62 (defpsmacro trim (s)
63 `(chain ,s (trim)))
63 `(chain ,s (trim)))
64
64
65 (defpsmacro replace (s from to)
65 (defpsmacro replace (s from to)
66 `(chain ,s (replace ,from ,to)))
66 `(chain ,s (replace ,from ,to)))
67
67
68 (defpsmacro val (s)
68 (defpsmacro val (s)
69 `(parse-int ,s 10))
69 `(parse-int ,s 10))
70
70
71 (defpsmacro qspstr (n)
71 (defpsmacro qspstr (n)
72 `(chain ,n (to-string)))
72 `(chain ,n (to-string)))
73
73
74 ;;; 7if
74 ;;; 7if
75
75
76 ;;; 8sub
76 ;;; 8sub
77
77
78 ;;; 9loops
78 ;;; 9loops
79
79
80 ;; JUMP is in ps-macros.lisp (because it's a part of a huge kludge)
80 ;; JUMP is in ps-macros.lisp (because it's a part of a huge kludge)
81
81
82 (defpsmacro exit ()
82 (defpsmacro exit ()
83 `(return-from nil (values)))
83 `(return-from nil (values)))
84
84
85 ;;; 10dynamic
85 ;;; 10dynamic
86
86
87 ;;; 11main
87 ;;; 11main
88
88
89 (defpsmacro desc (s)
89 (defpsmacro desc (s)
90 (declare (ignore s))
90 (declare (ignore s))
91 "")
91 "")
92
92
93 ;;; 12stat
93 ;;; 12stat
94
94
95 (defpsmacro showstat (enable)
95 (defpsmacro showstat (enable)
96 `(api-call enable-frame :stat ,enable))
96 `(api-call enable-frame :stat ,enable))
97
97
98 ;;; 13diag
98 ;;; 13diag
99
99
100 (defpsmacro msg (text)
100 (defpsmacro msg (text)
101 `(alert ,text))
101 `(alert ,text))
102
102
103 ;;; 14act
103 ;;; 14act
104
104
105 (defpsmacro showacts (enable)
105 (defpsmacro showacts (enable)
106 `(api-call enable-frame :acts ,enable))
106 `(api-call enable-frame :acts ,enable))
107
107
108 (defpsmacro delact (&optional name)
108 (defpsmacro delact (&optional name)
109 (if name
109 (if name
110 `(api-call del-act ,name)
110 `(api-call del-act ,name)
111 `(api-call del-act)))
111 `(api-call del-act)))
112
112
113 (defpsmacro cla ()
113 (defpsmacro cla ()
114 `(api-call clear-act))
114 `(api-call clear-act))
115
115
116 ;;; 15objs
116 ;;; 15objs
117
117
118 (defpsmacro showobjs (enable)
118 (defpsmacro showobjs (enable)
119 `(api-call enable-frame :objs ,enable))
119 `(api-call enable-frame :objs ,enable))
120
120
121 (defpsmacro countobj ()
121 (defpsmacro countobj ()
122 `(length *objs))
122 `(length *objs))
123
123
124 (defpsmacro getobj (index)
124 (defpsmacro getobj (index)
125 `(or (elt *objs ,index) ""))
125 `(or (elt *objs ,index) ""))
126
126
127 ;;; 16menu
127 ;;; 16menu
128
128
129 ;;; 17sound
129 ;;; 17sound
130
130
131 (defpsmacro isplay (filename)
131 (defpsmacro isplay (filename)
132 `(funcall (@ playing includes) ,filename))
132 `(funcall (@ playing includes) ,filename))
133
133
134 ;;; 18img
134 ;;; 18img
135
135
136 (defpsmacro view (&optional path)
136 (defpsmacro view (&optional path)
137 `(api-call show-image ,path))
137 `(api-call show-image ,path))
138
138
139 (defpsmacro img (&rest images)
139 (defpsmacro img (&rest images)
140 `(api-call show-inline-images :stat (list ,@images)))
140 `(api-call show-inline-images :stat (list ,@images)))
141
141
142 (defpsmacro *img (&rest images)
142 (defpsmacro *img (&rest images)
143 `(api-call show-inline-images :main (list ,@images)))
143 `(api-call show-inline-images :main (list ,@images)))
144
144
145 ;;; 19input
145 ;;; 19input
146
146
147 (defpsmacro showinput (enable)
147 (defpsmacro showinput (enable)
148 `(api-call enable-frame :input ,enable))
148 `(api-call enable-frame :input ,enable))
149
149
150 ;;; 20time
150 ;;; 20time
151
151
152 (defpsmacro wait (msec)
152 (defpsmacro wait (msec)
153 `(await (api-call sleep ,msec)))
153 `(await (api-call sleep ,msec)))
154
154
155 (defpsmacro settimer (interval)
155 (defpsmacro settimer (interval)
156 `(api-call set-timer ,interval))
156 `(api-call set-timer ,interval))
157
157
158 ;;; 21local
158 ;;; 21local
159
159
160 ;;; 22for
160 ;;; 22for
161
161
162 ;;; misc
162 ;;; misc
163
163
164 (defpsmacro opengame (&optional filename)
164 (defpsmacro opengame (&optional filename)
165 (declare (ignore filename))
165 (declare (ignore filename))
166 `(api-call opengame))
166 `(api-call opengame))
167
167
168 (defpsmacro savegame (&optional filename)
168 (defpsmacro savegame (&optional filename)
169 (declare (ignore filename))
169 (declare (ignore filename))
170 `(api-call savegame))
170 `(api-call savegame))
@@ -1,326 +1,326 b''
1
1
2 (in-package sugar-qsp.lib)
2 (in-package txt2web)
3
3
4 ;;;; Functions and procedures defined by the QSP language.
4 ;;;; Functions and procedures defined by the QSP language.
5 ;;;; They can call api and deal with locations and other data directly.
5 ;;;; They can call api and deal with locations and other data directly.
6 ;;;; Except vars. Use VAR and SET or GET-VAR and SET-VAR api calls.
6 ;;;; Except vars. Use VAR and SET or GET-VAR and SET-VAR api calls.
7
7
8 ;;; 1loc
8 ;;; 1loc
9
9
10 (defun goto (target args)
10 (defun goto (target args)
11 (api:clear-text :main)
11 (api:clear-text :main)
12 (funcall xgoto target args)
12 (funcall xgoto target args)
13 (void))
13 (void))
14
14
15 (defun xgoto (target args)
15 (defun xgoto (target args)
16 (setf args (or args (list)))
16 (setf args (or args (list)))
17 (api:clear-act)
17 (api:clear-act)
18 (setf *current-location (chain target (to-upper-case)))
18 (setf *current-location (chain target (to-upper-case)))
19 (api:stash-state args)
19 (api:stash-state args)
20 (api:call-loc *current-location args)
20 (api:call-loc *current-location args)
21 (api:call-serv-loc "$ONNEWLOC")
21 (api:call-serv-loc "$ONNEWLOC")
22 (void))
22 (void))
23
23
24 ;;; 2var
24 ;;; 2var
25
25
26 ;;; 3expr
26 ;;; 3expr
27
27
28 (defun obj (name)
28 (defun obj (name)
29 (has name *objs))
29 (has name *objs))
30
30
31 (defun loc (name)
31 (defun loc (name)
32 (has name *locs))
32 (has name *locs))
33
33
34 ;;; 4code
34 ;;; 4code
35
35
36 (defun rand (a &optional (b 1))
36 (defun rand (a &optional (b 1))
37 (let ((min (min a b))
37 (let ((min (min a b))
38 (max (max a b)))
38 (max (max a b)))
39 (+ min (chain *math (random (- max min))))))
39 (+ min (chain *math (random (- max min))))))
40
40
41 ;;; 5arrays
41 ;;; 5arrays
42
42
43 (defun copyarr (to from start count)
43 (defun copyarr (to from start count)
44 (multiple-value-bind (to-name to-slot)
44 (multiple-value-bind (to-name to-slot)
45 (api:var-real-name to)
45 (api:var-real-name to)
46 (multiple-value-bind (from-name from-slot)
46 (multiple-value-bind (from-name from-slot)
47 (api:var-real-name from)
47 (api:var-real-name from)
48 (for ((i start))
48 (for ((i start))
49 ((< i (min (api:array-size from-name)
49 ((< i (min (api:array-size from-name)
50 (+ start count))))
50 (+ start count))))
51 ((incf i))
51 ((incf i))
52 (api:set-var to-name (+ start i) to-slot
52 (api:set-var to-name (+ start i) to-slot
53 (api:get-var from-name (+ start i) from-slot))))))
53 (api:get-var from-name (+ start i) from-slot))))))
54
54
55 (defun arrpos (name value &optional (start 0))
55 (defun arrpos (name value &optional (start 0))
56 (multiple-value-bind (real-name slot)
56 (multiple-value-bind (real-name slot)
57 (api:var-real-name name)
57 (api:var-real-name name)
58 (for ((i start)) ((< i (api:array-size name))) ((incf i))
58 (for ((i start)) ((< i (api:array-size name))) ((incf i))
59 (when (eq (api:get-var real-name i slot) value)
59 (when (eq (api:get-var real-name i slot) value)
60 (return-from arrpos i))))
60 (return-from arrpos i))))
61 -1)
61 -1)
62
62
63 (defun arrcomp (name pattern &optional (start 0))
63 (defun arrcomp (name pattern &optional (start 0))
64 (multiple-value-bind (real-name slot)
64 (multiple-value-bind (real-name slot)
65 (api:var-real-name name)
65 (api:var-real-name name)
66 (for ((i start)) ((< i (api:array-size name))) ((incf i))
66 (for ((i start)) ((< i (api:array-size name))) ((incf i))
67 (when (funcall (getprop (api:get-var real-name i slot) 'match) pattern)
67 (when (funcall (getprop (api:get-var real-name i slot) 'match) pattern)
68 (return-from arrcomp i))))
68 (return-from arrcomp i))))
69 -1)
69 -1)
70
70
71 ;;; 6str
71 ;;; 6str
72
72
73 (defun instr (s subs &optional (start 1))
73 (defun instr (s subs &optional (start 1))
74 (+ start (chain s (substring (- start 1)) (search subs))))
74 (+ start (chain s (substring (- start 1)) (search subs))))
75
75
76 (defun isnum (s)
76 (defun isnum (s)
77 (if (is-na-n s)
77 (if (is-na-n s)
78 0
78 0
79 -1))
79 -1))
80
80
81 (defun strcomp (s pattern)
81 (defun strcomp (s pattern)
82 (if (chain s (match pattern))
82 (if (chain s (match pattern))
83 -1
83 -1
84 0))
84 0))
85
85
86 (defun strfind (s pattern group)
86 (defun strfind (s pattern group)
87 (let* ((re (new (*reg-exp pattern)))
87 (let* ((re (new (*reg-exp pattern)))
88 (match (chain re (exec s))))
88 (match (chain re (exec s))))
89 (chain match (group group))))
89 (chain match (group group))))
90
90
91 (defun strpos (s pattern &optional (group 0))
91 (defun strpos (s pattern &optional (group 0))
92 (let* ((re (new (*reg-exp pattern)))
92 (let* ((re (new (*reg-exp pattern)))
93 (match (chain re (exec s)))
93 (match (chain re (exec s)))
94 (found (chain match (group group))))
94 (found (chain match (group group))))
95 (if found
95 (if found
96 (chain s (search found))
96 (chain s (search found))
97 0)))
97 0)))
98
98
99 ;;; 7if
99 ;;; 7if
100
100
101 ;; Has to be a function because it always evaluates all three of its
101 ;; Has to be a function because it always evaluates all three of its
102 ;; arguments
102 ;; arguments
103 (defun iif (cond-expr then-expr else-expr)
103 (defun iif (cond-expr then-expr else-expr)
104 (if cond-expr then-expr else-expr))
104 (if cond-expr then-expr else-expr))
105
105
106 ;;; 8sub
106 ;;; 8sub
107
107
108 (defun gosub (target &rest args)
108 (defun gosub (target &rest args)
109 (api:call-loc target args)
109 (api:call-loc target args)
110 (void))
110 (void))
111
111
112 (defun func (target &rest args)
112 (defun func (target &rest args)
113 (api:call-loc target args))
113 (api:call-loc target args))
114
114
115 ;;; 9loops
115 ;;; 9loops
116
116
117 ;;; 10dynamic
117 ;;; 10dynamic
118
118
119 (defun dynamic (block &rest args)
119 (defun dynamic (block &rest args)
120 (when (stringp block)
120 (when (stringp block)
121 (api:report-error "DYNAMIC can't evaluate arbitrary strings.\\nUse {braces} to create blocks for DYNAMIC."))
121 (api:report-error "DYNAMIC can't evaluate arbitrary strings.\\nUse {braces} to create blocks for DYNAMIC."))
122 (api:with-call-args args
122 (api:with-call-args args
123 (funcall block args))
123 (funcall block args))
124 (void))
124 (void))
125
125
126 (defun dyneval (block &rest args)
126 (defun dyneval (block &rest args)
127 (when (stringp block)
127 (when (stringp block)
128 (api:report-error "DYNEVAL can't evaluate arbitrary strings.\\nUse {braces} to create blocks for DYNEVAL."))
128 (api:report-error "DYNEVAL can't evaluate arbitrary strings.\\nUse {braces} to create blocks for DYNEVAL."))
129 (api:with-call-args args
129 (api:with-call-args args
130 (funcall block args)))
130 (funcall block args)))
131
131
132 ;;; 11main
132 ;;; 11main
133
133
134 (defun main-p (s)
134 (defun main-p (s)
135 (api:add-text :main s)
135 (api:add-text :main s)
136 (void))
136 (void))
137
137
138 (defun main-pl (s)
138 (defun main-pl (s)
139 (api:add-text :main s)
139 (api:add-text :main s)
140 (api:newline :main)
140 (api:newline :main)
141 (void))
141 (void))
142
142
143 (defun main-nl (s)
143 (defun main-nl (s)
144 (api:newline :main)
144 (api:newline :main)
145 (api:add-text :main s)
145 (api:add-text :main s)
146 (void))
146 (void))
147
147
148 (defun maintxt (s)
148 (defun maintxt (s)
149 (api:get-text :main)
149 (api:get-text :main)
150 (void))
150 (void))
151
151
152 (defun desc (s)
152 (defun desc (s)
153 "")
153 "")
154
154
155 (defun main-clear ()
155 (defun main-clear ()
156 (api:clear-text :main)
156 (api:clear-text :main)
157 (void))
157 (void))
158
158
159 ;;; 12stat
159 ;;; 12stat
160
160
161 (defun stat-p (s)
161 (defun stat-p (s)
162 (api:add-text :stat s)
162 (api:add-text :stat s)
163 (void))
163 (void))
164
164
165 (defun stat-pl (s)
165 (defun stat-pl (s)
166 (api:add-text :stat s)
166 (api:add-text :stat s)
167 (api:newline :stat)
167 (api:newline :stat)
168 (void))
168 (void))
169
169
170 (defun stat-nl (s)
170 (defun stat-nl (s)
171 (api:newline :stat)
171 (api:newline :stat)
172 (api:add-text :stat s)
172 (api:add-text :stat s)
173 (void))
173 (void))
174
174
175 (defun stattxt (s)
175 (defun stattxt (s)
176 (api:get-text :stat)
176 (api:get-text :stat)
177 (void))
177 (void))
178
178
179 (defun stat-clear ()
179 (defun stat-clear ()
180 (api:clear-text :stat)
180 (api:clear-text :stat)
181 (void))
181 (void))
182
182
183 (defun cls ()
183 (defun cls ()
184 (stat-clear)
184 (stat-clear)
185 (main-clear)
185 (main-clear)
186 (cla)
186 (cla)
187 (cmdclear)
187 (cmdclear)
188 (void))
188 (void))
189
189
190 ;;; 13diag
190 ;;; 13diag
191
191
192 ;;; 14act
192 ;;; 14act
193
193
194 (defun selact ()
194 (defun selact ()
195 (loop :for (k v) :of *acts
195 (loop :for (k v) :of *acts
196 :do (when (@ v :selected)
196 :do (when (@ v :selected)
197 (return-from selact (@ v :name)))))
197 (return-from selact (@ v :name)))))
198
198
199 (defun curacts ()
199 (defun curacts ()
200 (let ((acts (api-call copy-obj *acts)))
200 (let ((acts (api-call copy-obj *acts)))
201 (lambda ()
201 (lambda ()
202 (setf *acts acts)
202 (setf *acts acts)
203 (void))))
203 (void))))
204
204
205 ;;; 15objs
205 ;;; 15objs
206
206
207 (defun addobj (name img)
207 (defun addobj (name img)
208 (setf img (or img ""))
208 (setf img (or img ""))
209 (setf (getprop *objs name)
209 (setf (getprop *objs name)
210 (create :name name :img img :selected nil))
210 (create :name name :img img :selected nil))
211 (api:update-objs)
211 (api:update-objs)
212 (api-call call-serv-loc "$ONOBJADD" name img)
212 (api-call call-serv-loc "$ONOBJADD" name img)
213 (void))
213 (void))
214
214
215 (defun delobj (name)
215 (defun delobj (name)
216 (delete (getprop *objs name))
216 (delete (getprop *objs name))
217 (api:update-objs)
217 (api:update-objs)
218 (api-call call-serv-loc "$ONOBJDEL" name)
218 (api-call call-serv-loc "$ONOBJDEL" name)
219 (void))
219 (void))
220
220
221 (defun killobj (&optional (num nil))
221 (defun killobj (&optional (num nil))
222 (if (eq nil num)
222 (if (eq nil num)
223 (setf *objs (create))
223 (setf *objs (create))
224 (delobj (elt (chain *object (keys *objs)) num)))
224 (delobj (elt (chain *object (keys *objs)) num)))
225 (api:update-objs)
225 (api:update-objs)
226 (void))
226 (void))
227
227
228 (defun selobj ()
228 (defun selobj ()
229 (loop :for (k v) :of *objs
229 (loop :for (k v) :of *objs
230 :do (when (@ v :selected)
230 :do (when (@ v :selected)
231 (return-from selobj (@ v :name)))))
231 (return-from selobj (@ v :name)))))
232
232
233 ;;; 16menu
233 ;;; 16menu
234
234
235 (defun menu (menu-name)
235 (defun menu (menu-name)
236 (let ((menu-data (list)))
236 (let ((menu-data (list)))
237 (loop :for item-obj :in (@ (api:get-array (api:var-real-name menu-name)) values)
237 (loop :for item-obj :in (@ (api:get-array (api:var-real-name menu-name)) values)
238 :for item := (@ item-obj :str)
238 :for item := (@ item-obj :str)
239 :do (cond ((string= item "")
239 :do (cond ((string= item "")
240 (break))
240 (break))
241 ((string= item "-:-")
241 ((string= item "-:-")
242 (chain menu-data (push :delimiter)))
242 (chain menu-data (push :delimiter)))
243 (t
243 (t
244 (let* ((tokens (chain item (split ":"))))
244 (let* ((tokens (chain item (split ":"))))
245 (when (= (length tokens) 2)
245 (when (= (length tokens) 2)
246 (chain tokens (push "")))
246 (chain tokens (push "")))
247 (let* ((text (chain tokens (splice 0 (- (length tokens) 2)) (join ":")))
247 (let* ((text (chain tokens (splice 0 (- (length tokens) 2)) (join ":")))
248 (loc (getprop tokens (- (length tokens) 2)))
248 (loc (getprop tokens (- (length tokens) 2)))
249 (icon (getprop tokens (- (length tokens) 1))))
249 (icon (getprop tokens (- (length tokens) 1))))
250 (chain menu-data
250 (chain menu-data
251 (push (create :text text
251 (push (create :text text
252 :loc loc
252 :loc loc
253 :icon icon))))))))
253 :icon icon))))))))
254 (api:menu menu-data)
254 (api:menu menu-data)
255 (void)))
255 (void)))
256
256
257 ;;; 17sound
257 ;;; 17sound
258
258
259 (defun play (filename &optional (volume 100))
259 (defun play (filename &optional (volume 100))
260 (let ((audio (new (*audio filename))))
260 (let ((audio (new (*audio filename))))
261 (setf (getprop *playing filename) audio)
261 (setf (getprop *playing filename) audio)
262 (setf (@ audio volume) (* volume 0.01))
262 (setf (@ audio volume) (* volume 0.01))
263 (chain audio (play))))
263 (chain audio (play))))
264
264
265 (defun close (filename)
265 (defun close (filename)
266 (funcall (getprop *playing filename) stop)
266 (funcall (getprop *playing filename) stop)
267 (delete (getprop *playing filename))
267 (delete (getprop *playing filename))
268 (void))
268 (void))
269
269
270 (defun closeall ()
270 (defun closeall ()
271 (loop :for k :in (chain *object (keys *playing))
271 (loop :for k :in (chain *object (keys *playing))
272 :for v := (getprop *playing k)
272 :for v := (getprop *playing k)
273 :do (funcall v stop))
273 :do (funcall v stop))
274 (setf *playing (create)))
274 (setf *playing (create)))
275
275
276 ;;; 18img
276 ;;; 18img
277
277
278 (defun refint ()
278 (defun refint ()
279 ;; "Force interface update" Uh... what exactly do we do here?
279 ;; "Force interface update" Uh... what exactly do we do here?
280 ;(api:report-error "REFINT is not supported")
280 ;(api:report-error "REFINT is not supported")
281 )
281 )
282
282
283 ;;; 19input
283 ;;; 19input
284
284
285 (defun usertxt ()
285 (defun usertxt ()
286 (let ((input (by-id "qsp-input")))
286 (let ((input (by-id "qsp-input")))
287 (@ input value)))
287 (@ input value)))
288
288
289 (defun cmdclear ()
289 (defun cmdclear ()
290 (let ((input (by-id "qsp-input")))
290 (let ((input (by-id "qsp-input")))
291 (setf (@ input value) "")))
291 (setf (@ input value) "")))
292
292
293 (defun input (text)
293 (defun input (text)
294 (chain window (prompt text)))
294 (chain window (prompt text)))
295
295
296 ;;; 20time
296 ;;; 20time
297
297
298 (defun msecscount ()
298 (defun msecscount ()
299 (- (chain *date (now)) *started-at))
299 (- (chain *date (now)) *started-at))
300
300
301 ;;; 21local
301 ;;; 21local
302
302
303 ;;; 22for
303 ;;; 22for
304
304
305 ;;; misc
305 ;;; misc
306
306
307 (defun rgb (red green blue)
307 (defun rgb (red green blue)
308 (+ (<< red 16)
308 (+ (<< red 16)
309 (<< green 8)
309 (<< green 8)
310 blue))
310 blue))
311
311
312 (defun openqst (name)
312 (defun openqst (name)
313 (api-call run-game name))
313 (api-call run-game name))
314
314
315 (defun addqst (name)
315 (defun addqst (name)
316 (let ((game (api-call filename-game name)))
316 (let ((game (api-call filename-game name)))
317 ;; Add the game's locations
317 ;; Add the game's locations
318 (chain *object (assign *locs
318 (chain *object (assign *locs
319 (getprop *games name)))))
319 (getprop *games name)))))
320
320
321 (defun killqst ()
321 (defun killqst ()
322 ;; Delete all locations not from the current main game
322 ;; Delete all locations not from the current main game
323 (loop :for (k v) :in *games
323 (loop :for (k v) :in *games
324 :do (unless (string= k *main-game)
324 :do (unless (string= k *main-game)
325 (delete (getprop *locs k)))))
325 (delete (getprop *locs k)))))
326
326
@@ -1,44 +1,44 b''
1
1
2 (in-package sugar-qsp.js)
2 (in-package txt2web.js)
3
3
4 ;;; Contains symbols from standard JS library to avoid obfuscating
4 ;;; Contains symbols from standard JS library to avoid obfuscating
5 ;;; and/or namespacing them
5 ;;; and/or namespacing them
6
6
7 (cl:defmacro syms (cl:&rest syms)
7 (cl:defmacro syms (cl:&rest syms)
8 `(cl:progn
8 `(cl:progn
9 ,@(cl:loop :for sym :in syms
9 ,@(cl:loop :for sym :in syms
10 :collect `(cl:export ',sym))))
10 :collect `(cl:export ',sym))))
11
11
12 (syms
12 (syms
13 ;; main
13 ;; main
14 window
14 window
15 *object assign
15 *object assign
16 now
16 now
17 onload
17 onload
18 keys includes
18 keys includes
19 has-own-property
19 has-own-property
20 ;; api
20 ;; api
21 document get-element-by-id get-elements-by-tag-name
21 document get-element-by-id get-elements-by-tag-name
22 onclick onchange
22 onclick onchange
23 atob btoa split
23 atob btoa split
24 alert prompt
24 alert prompt
25 set-timeout set-interval clear-interval
25 set-timeout set-interval clear-interval
26 *promise *j-s-o-n
26 *promise *j-s-o-n
27 href parse match
27 href parse match
28 set-prototype-of
28 set-prototype-of
29 body append-child remove-child
29 body append-child remove-child
30 add ; remove (is already in COMMON-LISP)
30 add ; remove (is already in COMMON-LISP)
31 create-element set-attribute class-list
31 create-element set-attribute class-list
32 *file-reader read-as-text
32 *file-reader read-as-text
33 style display src
33 style display src
34 page-x page-y
34 page-x page-y
35 top left
35 top left
36 background-image background-color
36 background-image background-color
37 color inner-text font-size font-family font-name
37 color inner-text font-size font-family font-name
38 local-storage set-item get-item
38 local-storage set-item get-item
39 ;; lib
39 ;; lib
40 *number parse-int
40 *number parse-int
41 to-string to-upper-case concat
41 to-string to-upper-case concat
42 click target current-target files index-of result
42 click target current-target files index-of result
43 decode-u-r-i-component splice
43 decode-u-r-i-component splice
44 )
44 )
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now