2019-07-13 09:07:41 +09:00

105 lines
3.1 KiB
JavaScript

function Query (query_str = '') {
// Strip trailing variables
query_str = query_str.indexOf('&$+') > -1 ? query_str.replace('&$+', '').trim() : query_str
this.string = query_str
this.module = query_str.split(' ')[0]
var parts = query_str.split(' ').splice(1)
this.raw = parts.join(' ')
this.methods = {}
this.routes = {}
this.last = query_str.indexOf(' ') > -1 ? query_str.split(' ')[query_str.split(' ').length - 1] : query_str
this.last_char = query_str.trim().substr(query_str.trim().length - 1, 1)
for (part_id in parts) {
var part = parts[part_id]
// Method
if (part.indexOf(':') > -1) {
var key = part.indexOf(':') > -1 ? part.split(':')[0] : 'any'
var value = part.indexOf(':') > -1 ? part.split(':')[1] : part
this.methods[key] = parse_parameters(value)
}
// Port
else if (part.indexOf('->') > -1) {
var key = part.indexOf('->') > -1 ? part.split('->')[0] : 'any'
var value = part.indexOf('->') > -1 ? part.split('->')[1] : part
this.routes[key] = value
}
}
function parse_parameters (param_str) {
// Modifier
if (param_str.indexOf('>>') > -1) {
return parse_modifier(param_str)
} else {
if (param_str.indexOf('&') > -1) {
return parse_sequence(param_str)
} else {
return parse_unit(param_str)
}
}
return param_str
}
function parse_modifier (mod_str) {
var h = {}
var parts = mod_str.split('>>')
if (parts[0].indexOf('&') > -1) {
h.from = parse_sequence(parts[0])
} else {
h.from = parse_unit(parts[0])
}
if (parts[1].indexOf('&') > -1) {
h.to = parse_sequence(parts[1])
} else {
h.to = parse_unit(parts[1])
}
return h
}
function parse_sequence (seq_str) {
var a = []
var parts = seq_str.split('&')
for (part_id in parts) {
var part = parts[part_id]
a.push(parse_unit(part))
}
return a
}
function parse_unit (unit_str) {
// Arc
if (unit_str.indexOf('@') == 0) {
unit_str = unit_str.substr(1, unit_str.length - 1)
var clockwise = unit_str.indexOf('>') == 0
unit_str = unit_str.substr(1, unit_str.length - 1)
return { x: parseInt(unit_str.split(',')[0]), y: parseInt(unit_str.split(',')[1]), clockwise: clockwise }
}
if (unit_str.indexOf('.') > -1 && unit_str.indexOf('/') > -1) {
return unit_str
}
// Rect
if (unit_str.indexOf('|') > -1 && unit_str.indexOf(',') > -1 && unit_str.indexOf('x') > -1) {
return Object.assign(parse_unit(unit_str.split('|')[0]), parse_unit(unit_str.split('|')[1]))
}
// Pos
if (unit_str.indexOf(',') > -1) {
return { x: parseInt(unit_str.split(',')[0]), y: parseInt(unit_str.split(',')[1]) }
}
// Size
if (unit_str.indexOf('x') > -1 && !isNaN(unit_str.split('x')[0]) && !isNaN(unit_str.split('x')[1])) {
return { width: parseInt(unit_str.split('x')[0]), height: parseInt(unit_str.split('x')[1]) }
}
// Float
if (unit_str.indexOf('.') > -1) {
return parseFloat(unit_str)
}
// Any
return unit_str
}
}