Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function solve(params) {
- var modelLinesCount = parseInt(params[0]),
- currentLine,
- models = {},
- sections = {},
- result = '',
- i, j, k, l;
- for (i = 0; i < modelLinesCount; i += 1) {
- currentLine = params[i + 1].trim();
- var modelName = '',
- modelValue = '',
- isModelName = true;
- for (j = 0; j < currentLine.length; j += 1) {
- if (currentLine[j] === ':') {
- isModelName = false;
- continue;
- }
- if (isModelName) {
- modelName += currentLine[j];
- } else {
- modelValue += currentLine[j];
- }
- }
- models[modelName.trim()] = modelValue.trim();
- }
- var isKeyWord = false,
- inSection = false,
- inRenderSection = false,
- inIf = false,
- inForeach = false,
- isSectionName = false,
- inCondition = false,
- inIfBody = false,
- inForBody = false,
- inEscaped = false,
- inForCondition = false,
- keyWord = '',
- sectionName = '',
- sectionContent = '',
- toBeRendered = '',
- conditionModel = '',
- condition = '',
- forCondition = '',
- forConditionArray = [],
- forBody = '';
- for (i = modelLinesCount + 2; i < params.length; i += 1) {
- currentLine = params[i].trim();
- if (currentLine === '') {
- result += '\n';
- continue;
- }
- for (j = 0; j < currentLine.length; j += 1) {
- if (currentLine[j] === '@' && currentLine[j + 1] === '@') {
- inEscaped = true;
- continue;
- }
- if (inEscaped) {
- if (currentLine[j] === ' ' || currentLine[j] === '<') {
- inEscaped = false;
- }
- result += currentLine[j];
- if (j === currentLine.length - 1) {
- result += '\n';
- }
- continue;
- }
- if (currentLine[j] === '@' && !inEscaped) {
- isKeyWord = true;
- keyWord = '@';
- continue;
- }
- if (isKeyWord) {
- if (currentLine[j] === ' ' || currentLine[j] === '(' || currentLine[j] === '<' || j === currentLine.length - 1) {
- isKeyWord = false;
- switch (keyWord) {
- case '@section': // TODO: same as if
- inSection = true;
- isSectionName = true;
- break;
- case '@renderSection':
- inRenderSection = true;
- break;
- case '@if':
- if (currentLine[currentLine.length - 1] === '{') {
- inIf = true;
- break;
- }
- case '@foreach':
- if (currentLine[currentLine.length - 1] === '{') {
- inForeach = true;
- break;
- }
- default:
- keyWord = keyWord.slice(1);
- if (inIf && condition === 'false') {
- continue;
- }
- if (inForBody) {
- if (j === currentLine.length - 1) {
- if (models[keyWord]) {
- forBody += models[keyWord] + '\n';
- } else {
- forBody += '##' + keyWord + '##' + '\n';
- }
- } else {
- if (models[keyWord]) {
- forBody += models[keyWord] + currentLine[j];
- } else {
- forBody += '##' + keyWord + '##' + currentLine[j];
- }
- }
- continue;
- }
- if (j === currentLine.length - 1) {
- keyWord += currentLine[j];
- result += models[keyWord] + '\n';
- } else {
- result += models[keyWord] + currentLine[j];
- }
- break;
- }
- continue;
- }
- keyWord += currentLine[j];
- continue;
- }
- if (inSection) {
- if (currentLine[j] === '}') {
- inSection = false;
- sections[sectionName] = sectionContent;
- sectionName = '';
- sectionContent = '';
- continue;
- }
- if (isSectionName && (currentLine[j] === ' ' || currentLine[j] === '{')) {
- isSectionName = false;
- continue;
- }
- if (isSectionName) {
- sectionName += currentLine[j];
- } else {
- if (currentLine[j] === '{') {
- continue;
- }
- sectionContent += currentLine[j];
- if (j === currentLine.length - 1) {
- sectionContent += '\n';
- }
- }
- continue;
- }
- if (inRenderSection) {
- if (currentLine[j] === ')') {
- inRenderSection = false;
- result += sections[toBeRendered];
- toBeRendered = '';
- continue;
- }
- if (currentLine[j] === '(' || currentLine[j] === '"' || currentLine[j] === "'") {
- continue;
- }
- toBeRendered += currentLine[j];
- continue;
- }
- if (inIf) {
- if (currentLine[j] === '}') {
- inIf = false;
- inIfBody = false;
- condition = '';
- continue;
- }
- if (currentLine[j] === '{') {
- inIfBody = true;
- continue;
- }
- if (currentLine[j] === '(' && !inIfBody) {
- inCondition = true;
- continue;
- }
- if (currentLine[j] === ')' && !inIfBody) {
- inCondition = false;
- condition = models[conditionModel];
- conditionModel = '';
- continue;
- }
- if (inCondition) {
- conditionModel += currentLine[j];
- continue;
- }
- if (condition === 'true' && inIfBody) {
- result += currentLine[j];
- if (j === currentLine.length - 1) {
- result += '\n';
- }
- continue;
- } else {
- continue;
- }
- }
- if (inForeach) {
- if (currentLine[j] === '}') {
- inForeach = false;
- for (k = 0; k < models[forConditionArray[3]].length; k += 1) {
- var arr = forBody.split('##');
- var prop = arr[1];
- for (l in arr) {
- if (arr[l] === prop) {
- arr[l] = models[forConditionArray[3]][k];
- }
- }
- var resultBody = arr.join('');
- result += resultBody;
- }
- inForBody = false;
- forBody = '';
- forCondition = '';
- continue;
- }
- if (currentLine[j] === '(' && !inForBody) {
- inForCondition = true;
- continue;
- }
- if (currentLine[j] === ')' && !inForBody) {
- inForCondition = false;
- forConditionArray = forCondition.split(' '); // var, prop, in, model
- models[forConditionArray[3]] = models[forConditionArray[3]].split(',');
- continue;
- }
- if (inForCondition) {
- forCondition += currentLine[j];
- continue;
- }
- if (currentLine[j] === '{') {
- inForBody = true;
- continue;
- }
- if (inForBody) {
- forBody += currentLine[j];
- if (j === currentLine.length - 1) {
- forBody += '\n';
- }
- continue;
- }
- }
- result += currentLine[j];
- if (j === currentLine.length - 1) {
- result += '\n';
- }
- }
- }
- // console.log(models);
- return result.trim();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement