mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
80 lines
1.7 KiB
JavaScript
80 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
var esniff = require('esniff')
|
|
|
|
, i, current, literals, substitutions, sOut, sEscape, sAhead, sIn, sInEscape, template;
|
|
|
|
sOut = function (char) {
|
|
if (char === '\\') return sEscape;
|
|
if (char === '$') return sAhead;
|
|
current += char;
|
|
return sOut;
|
|
};
|
|
sEscape = function (char) {
|
|
if ((char !== '\\') && (char !== '$')) current += '\\';
|
|
current += char;
|
|
return sOut;
|
|
};
|
|
sAhead = function (char) {
|
|
if (char === '{') {
|
|
literals.push(current);
|
|
current = '';
|
|
return sIn;
|
|
}
|
|
if (char === '$') {
|
|
current += '$';
|
|
return sAhead;
|
|
}
|
|
current += '$' + char;
|
|
return sOut;
|
|
};
|
|
sIn = function (char) {
|
|
var code = template.slice(i), end;
|
|
esniff(code, '}', function (j) {
|
|
if (esniff.nest >= 0) return esniff.next();
|
|
end = j;
|
|
});
|
|
if (end != null) {
|
|
substitutions.push(template.slice(i, i + end));
|
|
i += end;
|
|
current = '';
|
|
return sOut;
|
|
}
|
|
end = code.length;
|
|
i += end;
|
|
current += code;
|
|
return sIn;
|
|
};
|
|
sInEscape = function (char) {
|
|
if ((char !== '\\') && (char !== '}')) current += '\\';
|
|
current += char;
|
|
return sIn;
|
|
};
|
|
|
|
module.exports = function (str) {
|
|
var length, state, result;
|
|
current = '';
|
|
literals = [];
|
|
substitutions = [];
|
|
|
|
template = String(str);
|
|
length = template.length;
|
|
|
|
state = sOut;
|
|
for (i = 0; i < length; ++i) state = state(template[i]);
|
|
if (state === sOut) {
|
|
literals.push(current);
|
|
} else if (state === sEscape) {
|
|
literals.push(current + '\\');
|
|
} else if (state === sAhead) {
|
|
literals.push(current + '$');
|
|
} else if (state === sIn) {
|
|
literals[literals.length - 1] += '${' + current;
|
|
} else if (state === sInEscape) {
|
|
literals[literals.length - 1] += '${' + current + '\\';
|
|
}
|
|
result = { literals: literals, substitutions: substitutions };
|
|
literals = substitutions = null;
|
|
return result;
|
|
};
|