Created
December 19, 2017 20:20
-
-
Save botic/bfecc29d7fa1d06e23be36db917f0778 to your computer and use it in GitHub Desktop.
Optimized business hours rendering of raw đź“–StadtKatalog entries
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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