orgdo
Version:
Command-line tool to manage the Todo lists
55 lines (54 loc) • 1.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utits_1 = require("./utits");
const chalk_1 = require("chalk");
const os = require("os");
const MARK = chalk_1.default.bold;
function renderClocks(start, end, clocks) {
start = utits_1.clearTimeInfo(start);
end = utits_1.clearTimeInfo(end);
const begin = firstOfWeek(start);
const weekNum = calWeeksNum(begin, end);
const aggArr = aggregateClocks(begin, weekNum, clocks);
const lines = ["Sun Mon Tue Wed Thu Fri Sat"];
const indexOfStart = dayOffset(begin, start);
const indexOfEnd = dayOffset(begin, end);
let line = "";
aggArr.forEach((v, i) => {
const isSun = i % 7 === 0;
const isEmpty = i < indexOfStart || i > indexOfEnd;
let value = paddingRight(isEmpty ? "" : String(v), isSun ? 3 : 4);
if (i === indexOfStart || i === indexOfEnd) {
value = MARK(value);
}
line += value;
if ((i + 1) % 7 === 0) {
lines.push(line);
line = "";
}
});
return lines.join(os.EOL);
}
exports.renderClocks = renderClocks;
function aggregateClocks(begin, weekNum, clocks) {
const ret = Array.from(" ".repeat(7 * weekNum)).map(v => 0);
clocks.map(clock => {
const offset = dayOffset(begin, utits_1.clearTimeInfo(clock.createdAt));
ret[offset]++;
});
return ret;
}
function firstOfWeek(date) {
const ret = new Date(date.getTime());
ret.setDate(ret.getDate() - ret.getDay());
return ret;
}
function calWeeksNum(begin, target) {
return Math.ceil((dayOffset(begin, target) + 1) / 7);
}
function dayOffset(begin, target) {
return Math.floor((target.getTime() - begin.getTime()) / 86400000);
}
function paddingRight(str, size) {
return (" ".repeat(size) + str).slice(-1 * size);
}