mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-15 04:10:40 -07:00
117 lines
3.0 KiB
JavaScript
117 lines
3.0 KiB
JavaScript
// quote related
|
|
var singleQuoted = /'[^']*'/
|
|
var doubleQuoted = /"[^"]*"/
|
|
var quoted = new RegExp(`${singleQuoted.source}|${doubleQuoted.source}`)
|
|
var quoteBalanced = new RegExp(`(?:${quoted.source}|[^'"])*`)
|
|
|
|
// basic types
|
|
var integer = /-?\d+/
|
|
var number = /-?\d+\.?\d*|\.?\d+/
|
|
var bool = /true|false/
|
|
|
|
// peoperty access
|
|
var identifier = /[\w-]+/
|
|
var subscript = new RegExp(`\\[(?:${quoted.source}|[\\w-\\.]+)\\]`)
|
|
var literal = new RegExp(`(?:${quoted.source}|${bool.source}|${number.source})`)
|
|
var variable = new RegExp(`${identifier.source}(?:\\.${identifier.source}|${subscript.source})*`)
|
|
|
|
// range related
|
|
var rangeLimit = new RegExp(`(?:${variable.source}|${number.source})`)
|
|
var range = new RegExp(`\\(${rangeLimit.source}\\.\\.${rangeLimit.source}\\)`)
|
|
var rangeCapture = new RegExp(`\\((${rangeLimit.source})\\.\\.(${rangeLimit.source})\\)`)
|
|
|
|
var value = new RegExp(`(?:${variable.source}|${literal.source}|${range.source})`)
|
|
|
|
// hash related
|
|
var hash = new RegExp(`(?:${identifier.source})\\s*:\\s*(?:${value.source})`)
|
|
var hashCapture = new RegExp(`(${identifier.source})\\s*:\\s*(${value.source})`, 'g')
|
|
|
|
// full match
|
|
var tagLine = new RegExp(`^\\s*(${identifier.source})\\s*([\\s\\S]*)\\s*$`)
|
|
var literalLine = new RegExp(`^${literal.source}$`, 'i')
|
|
var variableLine = new RegExp(`^${variable.source}$`)
|
|
var numberLine = new RegExp(`^${number.source}$`)
|
|
var boolLine = new RegExp(`^${bool.source}$`, 'i')
|
|
var quotedLine = new RegExp(`^${quoted.source}$`)
|
|
var rangeLine = new RegExp(`^${rangeCapture.source}$`)
|
|
var integerLine = new RegExp(`^${integer.source}$`)
|
|
|
|
// filter related
|
|
var valueDeclaration = new RegExp(`(?:${identifier.source}\\s*:\\s*)?${value.source}`)
|
|
var valueList = new RegExp(`${valueDeclaration.source}(\\s*,\\s*${valueDeclaration.source})*`)
|
|
var filter = new RegExp(`${identifier.source}(?:\\s*:\\s*${valueList.source})?`, 'g')
|
|
var filterCapture = new RegExp(`(${identifier.source})(?:\\s*:\\s*(${valueList.source}))?`)
|
|
var filterLine = new RegExp(`^${filterCapture.source}$`)
|
|
|
|
var operators = [
|
|
/\s+or\s+/,
|
|
/\s+and\s+/,
|
|
/==|!=|<=|>=|<|>|\s+contains\s+/
|
|
]
|
|
|
|
function isInteger (str) {
|
|
return integerLine.test(str)
|
|
}
|
|
|
|
function isLiteral (str) {
|
|
return literalLine.test(str)
|
|
}
|
|
|
|
function isRange (str) {
|
|
return rangeLine.test(str)
|
|
}
|
|
|
|
function isVariable (str) {
|
|
return variableLine.test(str)
|
|
}
|
|
|
|
function matchValue (str) {
|
|
return value.exec(str)
|
|
}
|
|
|
|
function parseLiteral (str) {
|
|
var res = str.match(numberLine)
|
|
if (res) {
|
|
return Number(str)
|
|
}
|
|
res = str.match(boolLine)
|
|
if (res) {
|
|
return str.toLowerCase() === 'true'
|
|
}
|
|
res = str.match(quotedLine)
|
|
if (res) {
|
|
return str.slice(1, -1)
|
|
}
|
|
throw new TypeError(`cannot parse '${str}' as literal`)
|
|
}
|
|
|
|
module.exports = {
|
|
quoted,
|
|
number,
|
|
bool,
|
|
literal,
|
|
filter,
|
|
integer,
|
|
hash,
|
|
hashCapture,
|
|
range,
|
|
rangeCapture,
|
|
identifier,
|
|
value,
|
|
quoteBalanced,
|
|
operators,
|
|
quotedLine,
|
|
numberLine,
|
|
boolLine,
|
|
rangeLine,
|
|
literalLine,
|
|
filterLine,
|
|
tagLine,
|
|
isLiteral,
|
|
isVariable,
|
|
parseLiteral,
|
|
isRange,
|
|
matchValue,
|
|
isInteger
|
|
}
|