mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
59 lines
1.2 KiB
JavaScript
59 lines
1.2 KiB
JavaScript
'use strict';
|
|
var removeComments = require('./removeComments');
|
|
var parseExpression = require('./parseExpression');
|
|
var tokenizer = require('./tokenizer').create([
|
|
{
|
|
name: 'stringDouble',
|
|
pattern: /"(?:[^"]|\\")*"/,
|
|
},
|
|
{
|
|
name: 'stringSingle',
|
|
pattern: /'(?:[^']|\\')*'/
|
|
},
|
|
{
|
|
name: 'groupOpen',
|
|
pattern: /[\{\(\[]/
|
|
},
|
|
{
|
|
name: 'groupClose',
|
|
pattern: /[\}\)\]]/
|
|
},
|
|
{
|
|
name: 'comma',
|
|
pattern: /[,]/
|
|
}
|
|
]);
|
|
|
|
module.exports = function(str) {
|
|
str = removeComments(str);
|
|
|
|
let depth = 0;
|
|
var argStart = 0;
|
|
var args = [];
|
|
|
|
function finishPrevArg(end) {
|
|
var arg = str.substring(argStart, end);
|
|
args.push(parseExpression(arg));
|
|
}
|
|
|
|
tokenizer.forEachToken(str, (token) => {
|
|
switch(token.name) {
|
|
case 'groupOpen':
|
|
depth++;
|
|
break;
|
|
case 'groupClose':
|
|
depth--;
|
|
break;
|
|
case 'comma':
|
|
if (depth === 0) {
|
|
finishPrevArg(token.start);
|
|
argStart = token.end;
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
|
|
finishPrevArg(str.length);
|
|
|
|
return args;
|
|
}; |