Initial push, working on test cases
This commit is contained in:
116
src/utilities.js
Normal file
116
src/utilities.js
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (C) Noverant, Inc - All Rights Reserved Unauthorized copying of this file, via any
|
||||
* medium is strictly prohibited Proprietary and confidential
|
||||
*/
|
||||
|
||||
// @flow
|
||||
export const SECONDS_PER_SECOND = 1;
|
||||
export const SECONDS_PER_MINUTE = 60;
|
||||
export const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
|
||||
export const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
|
||||
|
||||
const designations = [
|
||||
['D', SECONDS_PER_DAY],
|
||||
['H', SECONDS_PER_HOUR],
|
||||
['M', SECONDS_PER_MINUTE],
|
||||
['S', SECONDS_PER_SECOND],
|
||||
];
|
||||
|
||||
/**
|
||||
* Converts a Number to a String of HH:MM:SS
|
||||
*
|
||||
* @param totalSeconds
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getSecondsAsHHMMSS(totalSeconds: Number) {
|
||||
// SCORM spec does not deal with negative durations, give zero back
|
||||
if(!totalSeconds || totalSeconds <= 0) {
|
||||
return '00:00:00';
|
||||
}
|
||||
|
||||
let hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);
|
||||
|
||||
let dateObj = new Date(totalSeconds * 1000);
|
||||
let minutes = dateObj.getUTCMinutes();
|
||||
let seconds = dateObj.getSeconds();
|
||||
|
||||
return hours.toString().padStart(2, '0') + ':' +
|
||||
minutes.toString().padStart(2, '0') + ':' +
|
||||
seconds.toString().padStart(2, '0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the number of seconds from ISO 8601 Duration
|
||||
*
|
||||
* @param seconds
|
||||
* @returns {String}
|
||||
*/
|
||||
export function getSecondsAsISODuration(seconds: Number) {
|
||||
// SCORM spec does not deal with negative durations, give zero back
|
||||
if(!seconds || seconds <= 0) {
|
||||
return 'P0S';
|
||||
}
|
||||
|
||||
let duration = 'P';
|
||||
let remainder = seconds;
|
||||
|
||||
designations.forEach(([sign, current_seconds]) => {
|
||||
const value = Math.floor(remainder / current_seconds);
|
||||
|
||||
remainder = remainder % current_seconds;
|
||||
|
||||
if (value) {
|
||||
duration += `${value}${sign}`;
|
||||
}
|
||||
});
|
||||
|
||||
return duration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the number of seconds from HH:MM:SS.DDDDDD
|
||||
*
|
||||
* @param timeString
|
||||
* @param timeRegex
|
||||
* @returns {number}
|
||||
*/
|
||||
export function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {
|
||||
if(!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
|
||||
return 0;
|
||||
}
|
||||
const parts = timeString.split(':');
|
||||
const hours = Number(parts[0]);
|
||||
const minutes = Number(parts[1]);
|
||||
const seconds = Number(parts[2]);
|
||||
return (hours * 3600) + (minutes * 60) + seconds;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the number of seconds from ISO 8601 Duration
|
||||
*
|
||||
* @param duration
|
||||
* @param durationRegex
|
||||
* @returns {number}
|
||||
*/
|
||||
export function getDurationAsSeconds(duration: String, durationRegex: RegExp) {
|
||||
if(!duration || !duration.match(durationRegex)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
let [,years,months,,days,hours,minutes,seconds] = new RegExp(durationRegex).exec(duration) || [];
|
||||
|
||||
let now = new Date();
|
||||
let anchor = new Date(now);
|
||||
anchor.setFullYear(anchor.getFullYear() + Number(years || 0));
|
||||
anchor.setMonth(anchor.getMonth() + Number(months || 0));
|
||||
anchor.setDate(anchor.getDate() + Number(days || 0));
|
||||
anchor.setHours(anchor.getHours() + Number(hours || 0));
|
||||
anchor.setMinutes(anchor.getMinutes() + Number(minutes || 0));
|
||||
anchor.setSeconds(anchor.getSeconds() + Number(seconds || 0));
|
||||
if(seconds) {
|
||||
let milliseconds = Number(Number(seconds) % 1).toFixed(6) * 1000.0;
|
||||
anchor.setMilliseconds(anchor.getMilliseconds() + milliseconds);
|
||||
}
|
||||
|
||||
return (anchor - now) / 1000.0;
|
||||
}
|
||||
Reference in New Issue
Block a user