@@ -0,0 +1,96 @@
|
||||
/** Form collect + application/x-www-form-urlencoded. */
|
||||
|
||||
function bareSummonEncodeForm(pairs) {
|
||||
var out = []
|
||||
for (var i = 0; i < pairs.length; i++) {
|
||||
var n = pairs[i].name
|
||||
var v = pairs[i].value
|
||||
if (!n) continue
|
||||
out.push(
|
||||
encodeURIComponent(n) + '=' + encodeURIComponent(v == null ? '' : v)
|
||||
)
|
||||
}
|
||||
return out.join('&')
|
||||
}
|
||||
|
||||
function bareSummonCollectForm(formNode) {
|
||||
var pairs = []
|
||||
var method = (
|
||||
(formNode.attrs && formNode.attrs.method) ||
|
||||
'get'
|
||||
).toLowerCase()
|
||||
var action = (formNode.attrs && formNode.attrs.action) || ''
|
||||
function walk(n) {
|
||||
if (!n || n.type !== 'element') return
|
||||
var name = n.name
|
||||
var a = n.attrs || {}
|
||||
if (
|
||||
(name === 'input' || name === 'textarea' || name === 'select') &&
|
||||
a.name
|
||||
) {
|
||||
var typ = (a.type || 'text').toLowerCase()
|
||||
if (
|
||||
typ === 'submit' ||
|
||||
typ === 'button' ||
|
||||
typ === 'image' ||
|
||||
typ === 'file'
|
||||
)
|
||||
return
|
||||
if (
|
||||
(typ === 'checkbox' || typ === 'radio') &&
|
||||
a.checked == null &&
|
||||
a.value === undefined
|
||||
) {
|
||||
/* still include if checked attr present */
|
||||
}
|
||||
if (typ === 'checkbox' && a.checked === undefined && !('checked' in a))
|
||||
return
|
||||
if (typ === 'radio' && !('checked' in a)) return
|
||||
var val = a.value
|
||||
if (name === 'textarea') val = bareSummonTextContent(n)
|
||||
if (name === 'select') {
|
||||
val = a.value || ''
|
||||
var ch = n.children || []
|
||||
for (var i = 0; i < ch.length; i++) {
|
||||
if (ch[i].name === 'option' && 'selected' in (ch[i].attrs || {})) {
|
||||
val =
|
||||
ch[i].attrs.value != null
|
||||
? ch[i].attrs.value
|
||||
: bareSummonTextContent(ch[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
pairs.push({ name: a.name, value: val == null ? '' : String(val) })
|
||||
}
|
||||
var kids = n.children || []
|
||||
for (var k = 0; k < kids.length; k++) walk(kids[k])
|
||||
}
|
||||
walk(formNode)
|
||||
return {
|
||||
method: method === 'post' ? 'POST' : 'GET',
|
||||
action: action,
|
||||
pairs: pairs
|
||||
}
|
||||
}
|
||||
|
||||
function bareSummonSubmitUrl(form, pageUrl) {
|
||||
var spec =
|
||||
typeof form.method === 'string' ? form : bareSummonCollectForm(form)
|
||||
var action = bareSummonResolveUrl(spec.action || pageUrl, pageUrl)
|
||||
if (!action) return null
|
||||
var q = bareSummonEncodeForm(spec.pairs)
|
||||
if (spec.method === 'GET') {
|
||||
var href = action.href.split('#')[0].split('?')[0]
|
||||
return {
|
||||
method: 'GET',
|
||||
url: href + (q ? '?' + q : ''),
|
||||
body: null
|
||||
}
|
||||
}
|
||||
return {
|
||||
method: 'POST',
|
||||
url: action.href,
|
||||
body: q,
|
||||
headers: { 'content-type': 'application/x-www-form-urlencoded' }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user