Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gendl
gendl
Commits
9e590692
Commit
9e590692
authored
May 05, 2021
by
Dave Cooper
Browse files
fix utf8 issues
parent
75df2edb
Pipeline
#3608
passed with stages
in 8 minutes and 50 seconds
Changes
5
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
gwl/ajax/source/base-ajax-sheet.lisp
View file @
9e590692
...
...
@@ -317,8 +317,8 @@ interface. Defaults to nil."
((
:script
)
(
fmt
"~%var gdliid = '~a';"
(
the
instance-id
)))
((
:script
:src
(
if
(
the
local-assets?
)
"/static/gwl/js/gdlajax159
3g
.js"
"https://genworks.com/static/gwl/js/gdlajax159
3g
.js"
)))))
"/static/gwl/js/gdlajax159
5
.js"
"https://genworks.com/static/gwl/js/gdlajax159
5
.js"
)))))
(
when
(
the
ui-specific-layout-js
)
(
htm
...
...
gwl/source/answer.lisp
View file @
9e590692
...
...
@@ -111,9 +111,8 @@ instance at what time should the recovery instance expire?"
(
when
gwl::*debug?*
(
print-variables
query
))
(
let*
((
requestor
(
query-arg-to-root-path
query
"requestor"
))
(
iid
(
make-keyword
(
iid
(
make-keyword
-sensitive
(
rest
(
assoc
"iid"
query
:test
#'
string-equal
))))
(
hash-entry
(
gethash
iid
*instance-hash-table*
))
(
root-object
(
or
(
first
hash-entry
)
(
restore-from-snap
iid
)))
...
...
@@ -443,6 +442,9 @@ being generated dynamically.
#'
(
lambda
(
req
ent
)
(
the
(
before-response!
))
(
the
(
present-part
req
ent
)))))
(
dolist
(
path
paths
)
(
pushnew
path
(
gethash
(
make-keyword
(
the
instance-id
))
*url-hash-table*
)
:test
#'
string-equal
)
(
when
*debug?*
(
print-variables
path
server
host
(
or
content-type
(
the
content-type
))
function
aserve-args
))
(
dolist
(
host
hosts
)
(
apply
#'
publish
:path
path
:server
server
...
...
gwl/static/gwl/js/gdlajax1593.js
deleted
100755 → 0
View file @
75df2edb
/*
;;
;; EXCEPT WHERE OTHERWISE NOTED BELOW:
;;
;; Copyright 2002-2011 Genworks International
;;
;; This source file is part of the General-purpose Declarative
;; Language project (GDL).
;;
;; This source file contains free software: you can redistribute it
;; and/or modify it under the terms of the GNU Affero General Public
;; License as published by the Free Software Foundation, either
;; version 3 of the License, or (at your option) any later version.
;;
;; This source file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Affero General Public License for more details.
;;
;; You should have received a copy of the GNU Affero General Public
;; License along with this source file. If not, see
;; <http://www.gnu.org/licenses/>.
;;
*/
var
doublequote
=
'
\
"
'
;
function
createRequest
()
{
var
request
try
{
request
=
new
XMLHttpRequest
();
}
catch
(
trymicrosoft
)
{
try
{
request
=
new
ActiveXObject
(
'
Msxml2.XMLHTTP
'
);
}
catch
(
othermicrosoft
)
{
try
{
request
=
new
ActiveXObject
(
'
Microsoft.XMLHTTP
'
);
}
catch
(
failed
)
{
request
=
false
;
}
}
}
if
(
!
request
)
alert
(
'
failed to create XMLHttpRequest
'
);
return
request
}
/**
* returns the absolute left location of an element.
* param: e: element
* return: an integer representing the offset from left.
*/
function
getElementLeftPosition
(
e
){
var
x
=
0
;
while
(
e
){
x
+=
e
.
offsetLeft
;
e
=
e
.
offsetParent
;
}
return
x
;
}
/**
* returns the absolute top location of an element.
* param: e: element
* return: an integer representing the offset from top.
*/
function
getElementTopPosition
(
e
){
var
y
=
0
;
while
(
e
){
y
+=
e
.
offsetTop
;
e
=
e
.
offsetParent
;
}
return
y
;
}
function
gdlAjax1
(
params
,
asynch
)
{
gdlAjax
(
null
,
params
,
async
);
}
function
gdlAjax
(
evt
,
params
,
asynch
)
{
if
(
evt
)
{
var
target
;
if
(
evt
.
target
)
target
=
evt
.
target
;
if
(
evt
.
srcElement
)
target
=
evt
.
srcElement
;
while
((
target
.
tagName
!=
'
DIV
'
)
&&
(
target
.
tagName
!=
'
BODY
'
)){
target
=
target
.
parentNode
;}
var
x
=
evt
.
clientX
-
getElementLeftPosition
(
target
);
var
y
=
evt
.
clientY
-
getElementTopPosition
(
target
);
}
var
request
=
createRequest
();
var
url
=
"
/gdlAjax
"
;
params
=
params
+
'
&x=
'
+
x
+
'
&y=
'
+
y
;
request
.
onreadystatechange
=
function
()
{
gdlUpdate
(
request
)};
request
.
open
(
'
POST
'
,
url
,
asynch
);
request
.
setRequestHeader
(
'
content-type
'
,
'
application/x-www-form-urlencoded
'
);
request
.
send
(
params
);
}
function
gdlUpdate
(
request
)
{
if
(
request
.
readyState
==
1
)
if
(
document
.
getElementById
(
'
gdlStatus
'
))
document
.
getElementById
(
'
gdlStatus
'
).
innerHTML
=
'
Working...
'
;
if
(
request
.
readyState
==
2
)
if
(
document
.
getElementById
(
'
gdlStatus
'
))
document
.
getElementById
(
'
gdlStatus
'
).
innerHTML
=
'
Got Error!
'
;
if
(
request
.
readyState
==
3
)
if
(
document
.
getElementById
(
'
gdlStatus
'
))
document
.
getElementById
(
'
gdlStatus
'
).
innerHTML
=
'
Almost There...
'
;
if
((
request
.
readyState
==
4
)
&&
(
request
.
status
==
200
))
{
var
root
=
request
.
responseXML
.
documentElement
;
var
children
=
root
.
childNodes
;
var
myelem
;
var
codes
;
for
(
i
=
0
;
i
<
children
.
length
;
i
++
)
{
var
child
=
children
[
i
];
var
myid
=
null
;
if
(
child
.
getElementsByTagName
(
'
replaceId
'
)[
0
].
firstChild
!=
null
)
{
myid
=
child
.
getElementsByTagName
(
'
replaceId
'
)[
0
].
firstChild
.
data
}
var
newHTML
=
null
;
if
(
child
.
getElementsByTagName
(
'
newHTML
'
)[
0
].
firstChild
!=
null
)
{
newHTML
=
child
.
getElementsByTagName
(
'
newHTML
'
)[
0
].
firstChild
.
nodeValue
}
var
jsToEval
=
null
;
if
(
child
.
getElementsByTagName
(
'
jsToEval
'
)[
0
].
firstChild
!=
null
)
{
jsToEval
=
child
.
getElementsByTagName
(
'
jsToEval
'
)[
0
].
firstChild
.
nodeValue
}
if
(
myid
&&
(
newHTML
!=
null
))
{
var
myelem
=
document
.
getElementById
(
myid
);
myelem
.
innerHTML
=
newHTML
;
if
(
jsToEval
&&
(
jsToEval
==
'
parseme
'
))
{
codes
=
myelem
.
getElementsByTagName
(
"
script
"
);
for
(
var
j
=
0
;
j
<
codes
.
length
;
j
++
)
{
var
text
=
codes
[
j
].
text
;
if
(
text
)
eval
(
codes
[
j
].
text
);
}}
}
if
(
jsToEval
&&
(
jsToEval
!=
'
parseme
'
)
&&
(
jsToEval
!=
''
))
eval
(
jsToEval
);
}
if
(
document
.
getElementById
(
'
gdlStatus
'
))
{
document
.
getElementById
(
'
gdlStatus
'
).
innerHTML
=
'
Done.
'
;
}
}}
// This code was written by Tyler Akins and has been placed in the
// public domain. It would be nice if you left this header intact.
// Base64 code from Tyler Akins -- http://rumkin.com
var
keyStr
=
'
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=
'
;
var
ua
=
navigator
.
userAgent
.
toLowerCase
();
if
(
ua
.
indexOf
(
"
chrome/
"
)
>=
0
||
ua
.
indexOf
(
"
firefox/
"
)
>=
0
||
ua
.
indexOf
(
'
gecko/
'
)
>=
0
)
{
var
StringMaker
=
function
()
{
this
.
str
=
""
;
this
.
length
=
0
;
this
.
append
=
function
(
s
)
{
this
.
str
+=
s
;
this
.
length
+=
s
.
length
;
}
this
.
prepend
=
function
(
s
)
{
this
.
str
=
s
+
this
.
str
;
this
.
length
+=
s
.
length
;
}
this
.
toString
=
function
()
{
return
this
.
str
;
}
}
}
else
{
var
StringMaker
=
function
()
{
this
.
parts
=
[];
this
.
length
=
0
;
this
.
append
=
function
(
s
)
{
this
.
parts
.
push
(
s
);
this
.
length
+=
s
.
length
;
}
this
.
prepend
=
function
(
s
)
{
this
.
parts
.
unshift
(
s
);
this
.
length
+=
s
.
length
;
}
this
.
toString
=
function
()
{
return
this
.
parts
.
join
(
''
);
}
}
}
function
encode64
(
input
)
{
var
output
=
new
StringMaker
();
var
chr1
,
chr2
,
chr3
;
var
enc1
,
enc2
,
enc3
,
enc4
;
var
i
=
0
;
while
(
i
<
input
.
length
)
{
chr1
=
input
.
charCodeAt
(
i
++
);
chr2
=
input
.
charCodeAt
(
i
++
);
chr3
=
input
.
charCodeAt
(
i
++
);
enc1
=
chr1
>>
2
;
enc2
=
((
chr1
&
3
)
<<
4
)
|
(
chr2
>>
4
);
enc3
=
((
chr2
&
15
)
<<
2
)
|
(
chr3
>>
6
);
enc4
=
chr3
&
63
;
if
(
isNaN
(
chr2
))
{
enc3
=
enc4
=
64
;
}
else
if
(
isNaN
(
chr3
))
{
enc4
=
64
;
}
output
.
append
(
keyStr
.
charAt
(
enc1
)
+
keyStr
.
charAt
(
enc2
)
+
keyStr
.
charAt
(
enc3
)
+
keyStr
.
charAt
(
enc4
));
}
return
output
.
toString
().
replace
(
/
\=
/g
,
''
);
}
function
decode64
(
input
)
{
var
output
=
new
StringMaker
();
var
chr1
,
chr2
,
chr3
;
var
enc1
,
enc2
,
enc3
,
enc4
;
var
i
=
0
;
input
=
input
.
replace
(
/
[^
A-Za-z0-9
\-\_\=]
/g
,
''
);
while
(
i
<
input
.
length
)
{
enc1
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
enc2
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
enc3
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
enc4
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
chr1
=
(
enc1
<<
2
)
|
(
enc2
>>
4
);
chr2
=
((
enc2
&
15
)
<<
4
)
|
(
enc3
>>
2
);
chr3
=
((
enc3
&
3
)
<<
6
)
|
enc4
;
output
.
append
(
String
.
fromCharCode
(
chr1
));
if
(
enc3
!=
64
)
{
output
.
append
(
String
.
fromCharCode
(
chr2
));
}
if
(
enc4
!=
64
)
{
output
.
append
(
String
.
fromCharCode
(
chr3
));
}
}
return
output
.
toString
();
}
//
// debouncing technique from https://css-tricks.com/snippets/jquery/done-resizing-event/.
//
// More general debouncing function here: https://davidwalsh.name/javascript-debounce-function
//
var
resizeTimer
;
function
gdlResize
()
{
// if (document.getElementById('x3dom-1'))
// {}
//else
//{
clearTimeout
(
resizeTimer
);
resizeTimer
=
setTimeout
(
function
()
{
gdlAjax
(
null
,
'
args=
'
+
encode64
(
'
(:|iid|
'
+
doublequote
+
gdliid
+
doublequote
+
'
:|bashee| (:%rp% nil) :|function| :set-slot! :|arguments| (:viewport-dimensions (:width
'
+
(
document
.
getElementById
(
'
viewport
'
).
getBoundingClientRect
().
width
)
+
'
:length
'
+
(
document
.
getElementById
(
'
viewport
'
).
getBoundingClientRect
().
height
)
+
'
)))
'
),
true
);},
250
);
// }
}
function
collectMenuSelections
(
select
)
{
var
items
=
""
;
for
(
var
i
=
0
;
i
<
select
.
options
.
length
;
i
++
)
if
(
select
.
options
[
i
].
selected
)
items
=
items
+
'
:|
'
+
select
.
name
+
'
|
'
+
doublequote
+
encode64
(
select
.
options
[
i
].
value
)
+
doublequote
+
'
'
;
if
(
items
)
return
(
items
);
else
return
(
'
:|
'
+
select
.
name
|
'
|
'
+
doublequote
+
encode64
(
'
nil
'
)
+
doublequote
+
'
'
);
}
function
loadScript
(
url
){
var
script
=
document
.
createElement
(
"
script
"
);
script
.
type
=
"
text/javascript
"
;
script
.
src
=
url
;
document
.
getElementsByTagName
(
"
head
"
)[
0
].
appendChild
(
script
);
}
gwl/static/gwl/js/gdlajax159
3g
.js
→
gwl/static/gwl/js/gdlajax159
5
.js
View file @
9e590692
...
...
@@ -186,111 +186,21 @@ function gdlUpdate (request) {
}}
// This code was written by Tyler Akins and has been placed in the
// public domain. It would be nice if you left this header intact.
// Base64 code from Tyler Akins -- http://rumkin.com
var
keyStr
=
'
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=
'
;
var
ua
=
navigator
.
userAgent
.
toLowerCase
();
if
(
ua
.
indexOf
(
"
chrome/
"
)
>=
0
||
ua
.
indexOf
(
"
firefox/
"
)
>=
0
||
ua
.
indexOf
(
'
gecko/
'
)
>=
0
)
{
var
StringMaker
=
function
()
{
this
.
str
=
""
;
this
.
length
=
0
;
this
.
append
=
function
(
s
)
{
this
.
str
+=
s
;
this
.
length
+=
s
.
length
;
}
this
.
prepend
=
function
(
s
)
{
this
.
str
=
s
+
this
.
str
;
this
.
length
+=
s
.
length
;
}
this
.
toString
=
function
()
{
return
this
.
str
;
}
}
}
else
{
var
StringMaker
=
function
()
{
this
.
parts
=
[];
this
.
length
=
0
;
this
.
append
=
function
(
s
)
{
this
.
parts
.
push
(
s
);
this
.
length
+=
s
.
length
;
}
this
.
prepend
=
function
(
s
)
{
this
.
parts
.
unshift
(
s
);
this
.
length
+=
s
.
length
;
}
this
.
toString
=
function
()
{
return
this
.
parts
.
join
(
''
);
}
}
}
function
b64EncodeUnicode
(
str
)
{
// first we use encodeURIComponent to get percent-encoded UTF-8,
// then we convert the percent encodings into raw bytes which
// can be fed into btoa.
return
btoa
(
encodeURIComponent
(
str
).
replace
(
/%
([
0-9A-F
]{2})
/g
,
function
toSolidBytes
(
match
,
p1
)
{
return
String
.
fromCharCode
(
'
0x
'
+
p1
);
}));
}
function
encode64
(
input
)
{
var
output
=
new
StringMaker
();
var
chr1
,
chr2
,
chr3
;
var
enc1
,
enc2
,
enc3
,
enc4
;
var
i
=
0
;
while
(
i
<
input
.
length
)
{
chr1
=
input
.
charCodeAt
(
i
++
);
chr2
=
input
.
charCodeAt
(
i
++
);
chr3
=
input
.
charCodeAt
(
i
++
);
enc1
=
chr1
>>
2
;
enc2
=
((
chr1
&
3
)
<<
4
)
|
(
chr2
>>
4
);
enc3
=
((
chr2
&
15
)
<<
2
)
|
(
chr3
>>
6
);
enc4
=
chr3
&
63
;
if
(
isNaN
(
chr2
))
{
enc3
=
enc4
=
64
;
}
else
if
(
isNaN
(
chr3
))
{
enc4
=
64
;
}
output
.
append
(
keyStr
.
charAt
(
enc1
)
+
keyStr
.
charAt
(
enc2
)
+
keyStr
.
charAt
(
enc3
)
+
keyStr
.
charAt
(
enc4
));
}
return
output
.
toString
().
replace
(
/
\=
/g
,
''
);
return
b64EncodeUnicode
(
input
).
replace
(
/
\=
/g
,
''
);
}
function
decode64
(
input
)
{
var
output
=
new
StringMaker
();
var
chr1
,
chr2
,
chr3
;
var
enc1
,
enc2
,
enc3
,
enc4
;
var
i
=
0
;
input
=
input
.
replace
(
/
[^
A-Za-z0-9
\-\_\=]
/g
,
''
);
while
(
i
<
input
.
length
)
{
enc1
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
enc2
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
enc3
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
enc4
=
keyStr
.
indexOf
(
input
.
charAt
(
i
++
));
chr1
=
(
enc1
<<
2
)
|
(
enc2
>>
4
);
chr2
=
((
enc2
&
15
)
<<
4
)
|
(
enc3
>>
2
);
chr3
=
((
enc3
&
3
)
<<
6
)
|
enc4
;
output
.
append
(
String
.
fromCharCode
(
chr1
));
if
(
enc3
!=
64
)
{
output
.
append
(
String
.
fromCharCode
(
chr2
));
}
if
(
enc4
!=
64
)
{
output
.
append
(
String
.
fromCharCode
(
chr3
));
}
}
return
output
.
toString
();
}
//
// debouncing technique from https://css-tricks.com/snippets/jquery/done-resizing-event/.
...
...
gwl/tests/simple-form.gendl
0 → 100644
View file @
9e590692
(in-package :gwl-user)
(define-object simple-form (base-ajax-sheet)
:computed-slots ((main-sheet-body
(with-cl-who-string ()
(str (the development-links))
(:p (:h2 "Simple Form Kṛṣṇa Test"))
(:p (str (the form-section main-div))))))
:objects
((form-section :type 'sheet-section
:inner-html (with-cl-who-string ()
(with-html-form (:cl-who? t)
(:p (str (the name-entry form-control-string))))
((:input :id "ok" :type :submit :value "ok"
:onclick (the (gdl-ajax-call :form-controls (list (the name-entry))))))))
(name-entry :type 'text-form-control
:id "name"
:default "Däve C Kṛṣṇa")))
(publish-shared 'simple-form :path "/simple-form")
(publish-gwl-app "/sf" 'simple-form)
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment