/* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ import {Layout, TimeDefinition, WordDefinition} from './domain/layout'; import {Letter} from './domain/letter'; class LayoutRendererV2Delegate { private static readonly vorne0: WordDefinition = { 3: [2, 3, 4], 4: [1, 5], 5: [1, 4, 5], 6: [1, 3, 5], 7: [1, 2, 5], 8: [1, 5], 9: [2, 3, 4] }; private static readonly hinten0: WordDefinition = { 3: [8, 9, 10], 4: [7, 11], 5: [7, 10, 11], 6: [7, 9, 11], 7: [7, 8, 11], 8: [7, 11], 9: [8, 9, 10] }; private static readonly vorne1: WordDefinition = { 3: [3], 4: [2, 3], 5: [3], 6: [3], 7: [3], 8: [3], 9: [2, 3, 4] }; private static readonly hinten1: WordDefinition = { 3: [9], 4: [8, 9], 5: [9], 6: [9], 7: [9], 8: [9], 9: [8, 9, 10] }; private static readonly vorne2: WordDefinition = { 3: [2, 3, 4], 4: [1, 5], 5: [5], 6: [4], 7: [3], 8: [2], 9: [1, 2, 3, 4, 5] }; private static readonly hinten2: WordDefinition = { 3: [8, 9, 10], 4: [7, 11], 5: [11], 6: [10], 7: [9], 8: [8], 9: [7, 8, 9, 10, 11] }; private static readonly vorne3: WordDefinition = { 3: [1, 2, 3, 4, 5], 4: [4], 5: [3], 6: [4], 7: [5], 8: [1, 5], 9: [2, 3, 4] }; private static readonly hinten3: WordDefinition = { 3: [7, 8, 9, 10, 11], 4: [10], 5: [9], 6: [10], 7: [11], 8: [7, 11], 9: [8, 9, 10] }; private static readonly vorne4: WordDefinition = { 3: [4], 4: [3, 4], 5: [2, 4], 6: [1, 4], 7: [1, 2, 3, 4, 5], 8: [4], 9: [4] }; private static readonly hinten4: WordDefinition = { 3: [10], 4: [9, 10], 5: [8, 10], 6: [7, 10], 7: [7, 8, 9, 10, 11], 8: [10], 9: [10] }; private static readonly vorne5: WordDefinition = { 3: [1, 2, 3, 4, 5], 4: [1], 5: [1, 2, 3, 4], 6: [5], 7: [5], 8: [1, 5], 9: [2, 3, 4] }; private static readonly hinten5: WordDefinition = { 3: [7, 8, 9, 10, 11], 4: [7], 5: [7, 8, 9, 10], 6: [11], 7: [11], 8: [7, 11], 9: [8, 9, 10] }; private static readonly hinten6: WordDefinition = { 3: [9, 10], 4: [8], 5: [7], 6: [7, 8, 9, 10], 7: [7, 11], 8: [7, 11], 9: [8, 9, 10] }; private static readonly hinten7: WordDefinition = { 3: [7, 8, 9, 10, 11], 4: [11], 5: [10], 6: [9], 7: [8], 8: [8], 9: [8] }; private static readonly hinten8: WordDefinition = { 3: [8, 9, 10], 4: [7, 11], 5: [7, 11], 6: [8, 9, 10], 7: [7, 11], 8: [7, 11], 9: [8, 9, 10] }; private static readonly hinten9: WordDefinition = { 3: [8, 9, 10], 4: [7, 11], 5: [7, 11], 6: [8, 9, 10, 11], 7: [11], 8: [10], 9: [8, 9] }; private static readonly seconds: TimeDefinition = { '0': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten0], '1': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten1], '2': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten2], '3': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten3], '4': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten4], '5': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten5], '6': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten6], '7': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten7], '8': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten8], '9': [LayoutRendererV2Delegate.vorne0, LayoutRendererV2Delegate.hinten9], '10': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten0], '11': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten1], '12': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten2], '13': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten3], '14': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten4], '15': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten5], '16': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten6], '17': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten7], '18': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten8], '19': [LayoutRendererV2Delegate.vorne1, LayoutRendererV2Delegate.hinten9], '20': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten0], '21': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten1], '22': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten2], '23': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten3], '24': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten4], '25': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten5], '26': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten6], '27': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten7], '28': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten8], '29': [LayoutRendererV2Delegate.vorne2, LayoutRendererV2Delegate.hinten9], '30': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten0], '31': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten1], '32': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten2], '33': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten3], '34': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten4], '35': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten5], '36': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten6], '37': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten7], '38': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten8], '39': [LayoutRendererV2Delegate.vorne3, LayoutRendererV2Delegate.hinten9], '40': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten0], '41': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten1], '42': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten2], '43': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten3], '44': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten4], '45': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten5], '46': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten6], '47': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten7], '48': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten8], '49': [LayoutRendererV2Delegate.vorne4, LayoutRendererV2Delegate.hinten9], '50': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten0], '51': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten1], '52': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten2], '53': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten3], '54': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten4], '55': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten5], '56': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten6], '57': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten7], '58': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten8], '59': [LayoutRendererV2Delegate.vorne5, LayoutRendererV2Delegate.hinten9] }; public constructor(private readonly layout: Layout) { } public parse(): Letter[][] { const letters: Letter[][] = []; this.layout.letters.forEach((lineString: string): void => { const line: Letter[] = []; for (let c = 0; c < lineString.length; c++) { line.push(new Letter(lineString[c])); } letters.push(line); }); this.parseArrayOrObject(letters, 'on', this.layout.permanent); if (typeof this.layout.seconds !== 'undefined' && this.layout.seconds !== null) { this.parseTimeDefinition(letters, 'second', this.layout.seconds); } else { this.parseTimeDefinition(letters, 'second', LayoutRendererV2Delegate.seconds); } this.parseTimeDefinition(letters, 'minute', this.layout.minutes); this.parseTimeDefinition(letters, 'hour', this.layout.hours); return letters; } private parseObject(letters: Letter[][], styleClass: string, object: WordDefinition): void { if (typeof object !== 'undefined' && object !== null) { Object.keys(object) .map((key: string): number => Number(key)) .forEach( (y: number): void => object[y].forEach( (x: number): void => letters[y - 1][x - 1].addStyle(styleClass) ) ); } } private parseArrayOrObject(letters: Letter[][], styleClass: string, input: WordDefinition | WordDefinition[]): void { if (typeof input !== 'undefined' && input !== null) { if (Array.isArray(input)) { input.forEach((item: WordDefinition): void => this.parseObject(letters, styleClass, item)); } else { this.parseObject(letters, styleClass, input); } } } private parseTimeDefinition(letters: Letter[][], styleClass: string, definition: TimeDefinition): void { if (typeof definition !== 'undefined' && definition !== null) { Object.keys(definition).forEach((listString: string): void => { const timeValues: string[] = listString.split(','); const highlightLetters: WordDefinition | WordDefinition[] = definition[listString]; timeValues.forEach((timeValue: string): void => this.parseArrayOrObject(letters, styleClass + timeValue, highlightLetters)); }); } } } /** * Hilfsklasse zum Rendern der Buchstaben der Uhr. * @param layout Layout-Objekt, das gerendert werden soll. * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem gerendert werden soll. */ export class LayoutRenderer { public constructor(private readonly layout: Layout, private readonly renderarea: JQuery<HTMLElement>) { } public render(beforeshow?: () => void): void { if (this.layout.parsed === undefined) { if (this.layout.version === 2) { const delegate: LayoutRendererV2Delegate = new LayoutRendererV2Delegate(this.layout); const parsedLayout: Letter[][] = delegate.parse(); Object.defineProperty(this.layout, 'parsed', { value: parsedLayout, writable: false, configurable: false }); } else { console.warn(`Unknown layout version: '${this.layout.version}', expecting '2'`); return; } } const letters: Letter[][] = this.layout.parsed; this.renderarea.fadeOut('fast', (): void => { this.renderarea.empty(); letters.forEach((line, index, array): void => { line.forEach((letter): JQuery<HTMLElement> => this.renderarea.append(letter.toString())); if (index < array.length - 1) { this.renderarea.append('<br/>'); } }); if (beforeshow) { beforeshow(); } this.renderarea.fadeIn('fast'); }); } }