Skip to content

Instantly share code, notes, and snippets.

@botic
Created December 19, 2017 20:20
Show Gist options
  • Select an option

  • Save botic/bfecc29d7fa1d06e23be36db917f0778 to your computer and use it in GitHub Desktop.

Select an option

Save botic/bfecc29d7fa1d06e23be36db917f0778 to your computer and use it in GitHub Desktop.
Optimized business hours rendering of raw đź“–StadtKatalog entries
const Calendar = java.util.Calendar;
const weekdayKeys = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
const equalTimeFrames = function(a, b) {
if (a.length !== b.length) {
return false;
}
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
};
const findSimpleRanges = function(week) {
const reduced = [0];
for (let i = 1; i < weekdayKeys.length; i++) {
let prevDay = week[weekdayKeys[i - 1]],
currDay = week[weekdayKeys[i]];
reduced[i] = (equalTimeFrames(prevDay, currDay) ? reduced[i - 1] : i);
}
return reduced;
};
const eliminateEqualRanges = function(week, weekRanges) {
const dedupedRanges = [];
for (let i = weekRanges.length - 1; i >= 0; i--) {
let lowestMatchingRange = -1;
for (let u = 0; u < i && lowestMatchingRange < 0; u++) {
if (equalTimeFrames(week[weekdayKeys[u]], week[weekdayKeys[i]])) {
lowestMatchingRange = u;
}
}
dedupedRanges[i] = (lowestMatchingRange >= 0 ? lowestMatchingRange : weekRanges[i]);
}
return dedupedRanges;
};
exports.reduceTimeRanges = function reduceTimeRanges(week) {
return eliminateEqualRanges(week, findSimpleRanges(week));
};
const createRangeBag = function(reducedTimeRange) {
const rangeBag = Object.create(null);
reducedTimeRange.forEach(function(rangeNumber, index) {
const slot = String(rangeNumber);
if (!rangeBag[slot]) {
rangeBag[slot] = [index];
} else {
rangeBag[slot].push(index);
}
});
return rangeBag;
};
const canFoldIntoDayRange = function(range) {
return range.every(function(dayNumber, idx, arr) {
return !idx || dayNumber === arr[idx - 1] || dayNumber === arr[idx - 1] + 1;
})
};
exports.foldDayNames = function(week, reducedTimeRange, rangeHyphen, rangeDelimiter, languageTag) {
const locale = java.util.Locale.forLanguageTag(languageTag);
const dfs = new java.text.DateFormatSymbols(locale);
const dfsWeekdays = dfs.getShortWeekdays();
const shortWeekdays = [
dfsWeekdays[Calendar.MONDAY],
dfsWeekdays[Calendar.TUESDAY],
dfsWeekdays[Calendar.WEDNESDAY],
dfsWeekdays[Calendar.THURSDAY],
dfsWeekdays[Calendar.FRIDAY],
dfsWeekdays[Calendar.SATURDAY],
dfsWeekdays[Calendar.SUNDAY]
];
const rangeStrings = [];
const rangeBag = createRangeBag(reducedTimeRange);
Object.keys(rangeBag).sort().map(function(rangeNumber) {
const bagOfDays = rangeBag[rangeNumber];
if (canFoldIntoDayRange(bagOfDays) && bagOfDays.length > 1) {
rangeStrings.push({
days: shortWeekdays[bagOfDays[0]] + rangeHyphen + shortWeekdays[bagOfDays.slice(-1)],
timeFrames: week[weekdayKeys[rangeNumber]]
});
} else {
rangeStrings.push({
days: bagOfDays.map(function(dayIndex) {
return shortWeekdays[dayIndex];
}).join(rangeDelimiter),
timeFrames: week[weekdayKeys[rangeNumber]]
});
}
});
return rangeStrings;
};
exports.formatTimeFrames = function(timeFrames, format, delimiter, placeholder) {
if (timeFrames.length === 0) {
return placeholder || "";
}
const frameStr = [];
for (let i = 0; i < timeFrames.length; i += 2) {
frameStr.push(
format.replace("{start}", timeFrames[i]).replace("{end}", timeFrames[i + 1] || "max. 24:00")
);
}
return frameStr.join(delimiter);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment