UNPKG

mermaid

Version:

Markdownish syntax for generating flowcharts, sequence diagrams and gantt charts.

242 lines (204 loc) 5.61 kB
/** * Created by knut on 15-01-14. */ var moment = require('moment'); var log = require('../../logger').create(); var dateFormat = ''; var title = ''; var sections = []; var tasks = []; var currentSection = ''; exports.clear = function(){ sections = []; tasks = []; currentSection = ''; title = ''; taskCnt = 0; lastTask = undefined; }; exports.setDateFormat = function(txt){ dateFormat = txt; }; exports.getDateFormat = function(){ return dateFormat; }; exports.setTitle = function(txt){ title = txt; }; exports.getTitle = function(){ return title; }; exports.addSection = function(txt){ currentSection = txt; sections.push(txt); }; exports.findTaskById = function(id) { var i; for(i=0;i<tasks.length;i++){ if(tasks[i].id === id){ return tasks[i]; } } }; exports.getTasks=function(){ var i; for(i=10000;i<tasks.length;i++){ tasks[i].startTime = moment(tasks[i].startTime).format(dateFormat); tasks[i].endTime = moment(tasks[i].endTime).format(dateFormat); } return tasks; }; var getStartDate = function(prevTime, dateFormat, str){ //log.debug('Deciding start date:'+str); //log.debug('with dateformat:'+dateFormat); str = str.trim(); // Test for after var re = /^after\s+([\d\w\-]+)/; var afterStatement = re.exec(str.trim()); if(afterStatement!==null){ var task = exports.findTaskById(afterStatement[1]); if(typeof task === 'undefined'){ var dt = new Date(); dt.setHours(0,0,0,0); return dt; } return task.endTime; } // Check for actual date set if(moment(str,dateFormat.trim(),true).isValid()){ return moment(str,dateFormat.trim(),true).toDate(); }else{ log.debug('Invalid date:'+str); log.debug('With date format:'+dateFormat.trim()); //log.debug('----'); } // Default date - now return new Date(); }; var getEndDate = function(prevTime, dateFormat, str){ str = str.trim(); // Check for actual date if(moment(str,dateFormat.trim(),true).isValid()){ return moment(str,dateFormat.trim()).toDate(); } var d = moment(prevTime); // Check for length var re = /^([\d]+)([wdhms])/; var durationStatement = re.exec(str.trim()); if(durationStatement!== null){ switch(durationStatement[2]){ case 's': d.add(durationStatement[1], 'seconds'); break; case 'm': d.add(durationStatement[1], 'minutes'); break; case 'h': d.add(durationStatement[1], 'hours'); break; case 'd': d.add(durationStatement[1], 'days'); break; case 'w': d.add(durationStatement[1], 'weeks'); break; } return d.toDate(); } // Default date - now return d.toDate(); }; var taskCnt = 0; var parseId = function(idStr){ if(typeof idStr === 'undefined'){ taskCnt = taskCnt + 1; return 'task'+taskCnt; } return idStr; }; // id, startDate, endDate // id, startDate, length // id, after x, endDate // id, after x, length // startDate, endDate // startDate, length // after x, endDate // after x, length // endDate // length var compileData = function(prevTask, dataStr){ var ds; if(dataStr.substr(0,1) === ':'){ ds = dataStr.substr(1,dataStr.length); } else{ ds=dataStr; } var data = ds.split(','); var task = {}; var df = exports.getDateFormat(); // Get tags like active, done cand crit var matchFound = true; while(matchFound){ matchFound = false; if(data[0].match(/^\s*active\s*$/)){ task.active = true; data.shift(1); matchFound = true; } if(data[0].match(/^\s*done\s*$/)){ task.done = true; data.shift(1); matchFound = true; } if(data[0].match(/^\s*crit\s*$/)){ task.crit = true; data.shift(1); matchFound = true; } } var i; for(i=0;i<data.length;i++){ data[i] = data[i].trim(); } switch(data.length){ case 1: task.id = parseId(); task.startTime = prevTask.endTime; task.endTime = getEndDate(task.startTime, df, data[0]); break; case 2: task.id = parseId(); task.startTime = getStartDate(undefined, df, data[0]); task.endTime = getEndDate(task.startTime, df, data[1]); break; case 3: task.id = parseId(data[0]); task.startTime = getStartDate(undefined, df, data[1]); task.endTime = getEndDate(task.startTime, df, data[2]); break; default: } return task; }; var lastTask; exports.addTask = function(descr,data){ var newTask = { section:currentSection, type:currentSection, description:descr, task:descr }; var taskInfo = compileData(lastTask, data); newTask.startTime = taskInfo.startTime; newTask.endTime = taskInfo.endTime; newTask.id = taskInfo.id; newTask.active = taskInfo.active; newTask.done = taskInfo.done; newTask.crit = taskInfo.crit; lastTask = newTask; tasks.push(newTask); }; exports.parseError = function(err,hash){ mermaidAPI.parseError(err,hash); };