UNPKG

lib-songbeamer

Version:

transforming SongBeamer Song-Files and Ablaufplan-Files

325 lines (314 loc) 10 kB
/** * @overview Ablaufplan-File Lib * @module ablauf * @author Dominik Sigmund * @version 1.0 * @description Gets Json from and json to Ablaufplan-files * @memberof lib-songbeamer */ /** Get Json from a string * @param {string} data - String as delivered by fs.readFile * @param {ablauf~jsonCallback} callback - A Callback with an error or the Json * @returns Nothing * */ const regex = /item\s.*\s*Caption\s[=]\s(.*)\s.*\s*Color\s[=]\s(.*)\s.*(?:\s*FileName\s[=]\s(.*)\s.*)?/gm exports.toJSON = function (data, callback) { var json = [] let m while ((m = regex.exec(data)) !== null) { var item = {} item.filename = '' // Set as empty, it is optional if (m.index === regex.lastIndex) { regex.lastIndex++ } m.forEach((match, groupIndex) => { switch (groupIndex) { case 0: // item break case 1: // Caption item.caption = clean(match) break case 2: // Color item.color = color2Hex(match) break case 3: // (optional) Filename item.filename = clean(match) break default: callback(new Error('Should not happen: groupIndex=' + groupIndex + ', match=' + match)) } }) item.type = getType(item.caption, item.filename) json.push(item) } callback(null, json) } /** Write Json to a File String * @param {object} json - String as delivered by fs.readFile * @param {ablauf~stringCallback} callback - A Callback with an error or the String as delivered to fs.writeFile * @returns Nothing * */ exports.toFile = function (items, callback) { var file = 'object AblaufPlanItems: TAblaufPlanItems\r\n items = <\r\n' for (let index = 0; index < items.length; index++) { const item = items[index] file += ' item\r\n' file += ' Caption = \'' + item.caption + '\'\r\n' file += ' Color = ' + hex2Color(item.color) + '\r\n' if (item.filename !== '') { file += ' FileName = \'' + item.filename + '\'\r\n' } if (index === items.length - 1) { // last item file += ' end>\r\n' } else { file += ' end\r\n' } } file += 'end' callback(null, file) } /** Removes Strange Symbols from the Text for a better json * @param {string} text - A Bite of Text * @returns {String} - A cleaner bit of Text * */ function clean (text) { if (typeof text !== 'undefined') { text = text.replace(/'/g, '') return text } else { return '' } } /** Takes Color Information and returns a css-hex-representation * @param {string} color - Some weird color (string, windows decimal, ...) * @returns {string} - A clean hex-rep * */ function color2Hex (color) { if (color.startsWith('cl')) { // color starts with cl var colortext = color.replace('cl', '').toLowerCase() return colourNameToHex(colortext) } else { // windows dec color // converts to a integer var intnumber = color - 0 // isolate the colors - really not necessary var red, green, blue // needed since toString does not zero fill on left var template = '#000000' // in the MS Windows world RGB colors // are 0xBBGGRR because of the way Intel chips store bytes red = (intnumber & 0x0000ff) << 16 green = intnumber & 0x00ff00 blue = (intnumber & 0xff0000) >>> 16 // mask out each color and reverse the order intnumber = red | green | blue // toString converts a number to a hexstring var HTMLcolor = intnumber.toString(16) // template adds # for standard HTML #RRGGBB HTMLcolor = template.substring(0, 7 - HTMLcolor.length) + HTMLcolor return HTMLcolor } } /** Takes a Hex-Color and makes a windows-decimal-color out of it. * @param {string} hex - A Hex Color * @returns {string} - Windows Decimal Color * */ function hex2Color (hex) { var intnumber = parseInt(hex.replace('#', ''), 16) var blue = (intnumber & 0x0000ff) << 16 var green = intnumber & 0x00ff00 var red = (intnumber & 0xff0000) >>> 16 // mask out each color and reverse the order intnumber = blue | green | red return intnumber } /** Guesses the Type of the Item * @param {string} caption - The Caption of the item * @param {string} filename - The Filename of the item * @returns {string} - Type, may be: song, video, powerpoint, sermon, unknown * */ function getType (caption, filename) { if (typeof filename !== 'undefined') { var p = filename.split('.') var suffix = p[p.length - 1].trim() switch (suffix) { case 'sng': return 'song' case 'mp4': return 'video' case 'ppt': case 'pptx': return 'powerpoint' default: return 'unknown' } } else { if (caption.indexOf('Predigt') >= 0) { return 'sermon' } // TODO: parse caption return 'unknown' } } /** Takes a cssColor-Name and returns the hex-value or an empty string * @param {string} colour - A ColourName * @returns {string} - A Hex-Color or an empty String * */ function colourNameToHex (colour) { var colours = {'aliceblue': '#f0f8ff', 'antiquewhite': '#faebd7', 'aqua': '#00ffff', 'aquamarine': '#7fffd4', 'azure': '#f0ffff', 'beige': '#f5f5dc', 'bisque': '#ffe4c4', 'black': '#000000', 'blanchedalmond': '#ffebcd', 'blue': '#0000ff', 'blueviolet': '#8a2be2', 'brown': '#a52a2a', 'burlywood': '#deb887', 'cadetblue': '#5f9ea0', 'chartreuse': '#7fff00', 'chocolate': '#d2691e', 'coral': '#ff7f50', 'cornflowerblue': '#6495ed', 'cornsilk': '#fff8dc', 'crimson': '#dc143c', 'cyan': '#00ffff', 'darkblue': '#00008b', 'darkcyan': '#008b8b', 'darkgoldenrod': '#b8860b', 'darkgray': '#a9a9a9', 'darkgreen': '#006400', 'darkkhaki': '#bdb76b', 'darkmagenta': '#8b008b', 'darkolivegreen': '#556b2f', 'darkorange': '#ff8c00', 'darkorchid': '#9932cc', 'darkred': '#8b0000', 'darksalmon': '#e9967a', 'darkseagreen': '#8fbc8f', 'darkslateblue': '#483d8b', 'darkslategray': '#2f4f4f', 'darkturquoise': '#00ced1', 'darkviolet': '#9400d3', 'deeppink': '#ff1493', 'deepskyblue': '#00bfff', 'dimgray': '#696969', 'dodgerblue': '#1e90ff', 'firebrick': '#b22222', 'floralwhite': '#fffaf0', 'forestgreen': '#228b22', 'fuchsia': '#ff00ff', 'gainsboro': '#dcdcdc', 'ghostwhite': '#f8f8ff', 'gold': '#ffd700', 'goldenrod': '#daa520', 'gray': '#808080', 'green': '#008000', 'greenyellow': '#adff2f', 'honeydew': '#f0fff0', 'hotpink': '#ff69b4', 'indianred ': '#cd5c5c', 'indigo': '#4b0082', 'ivory': '#fffff0', 'khaki': '#f0e68c', 'lavender': '#e6e6fa', 'lavenderblush': '#fff0f5', 'lawngreen': '#7cfc00', 'lemonchiffon': '#fffacd', 'lightblue': '#add8e6', 'lightcoral': '#f08080', 'lightcyan': '#e0ffff', 'lightgoldenrodyellow': '#fafad2', 'lightgrey': '#d3d3d3', 'lightgreen': '#90ee90', 'lightpink': '#ffb6c1', 'lightsalmon': '#ffa07a', 'lightseagreen': '#20b2aa', 'lightskyblue': '#87cefa', 'lightslategray': '#778899', 'lightsteelblue': '#b0c4de', 'lightyellow': '#ffffe0', 'lime': '#00ff00', 'limegreen': '#32cd32', 'linen': '#faf0e6', 'magenta': '#ff00ff', 'maroon': '#800000', 'mediumaquamarine': '#66cdaa', 'mediumblue': '#0000cd', 'mediumorchid': '#ba55d3', 'mediumpurple': '#9370d8', 'mediumseagreen': '#3cb371', 'mediumslateblue': '#7b68ee', 'mediumspringgreen': '#00fa9a', 'mediumturquoise': '#48d1cc', 'mediumvioletred': '#c71585', 'midnightblue': '#191970', 'mintcream': '#f5fffa', 'mistyrose': '#ffe4e1', 'moccasin': '#ffe4b5', 'navajowhite': '#ffdead', 'navy': '#000080', 'oldlace': '#fdf5e6', 'olive': '#808000', 'olivedrab': '#6b8e23', 'orange': '#ffa500', 'orangered': '#ff4500', 'orchid': '#da70d6', 'palegoldenrod': '#eee8aa', 'palegreen': '#98fb98', 'paleturquoise': '#afeeee', 'palevioletred': '#d87093', 'papayawhip': '#ffefd5', 'peachpuff': '#ffdab9', 'peru': '#cd853f', 'pink': '#ffc0cb', 'plum': '#dda0dd', 'powderblue': '#b0e0e6', 'purple': '#800080', 'rebeccapurple': '#663399', 'red': '#ff0000', 'rosybrown': '#bc8f8f', 'royalblue': '#4169e1', 'saddlebrown': '#8b4513', 'salmon': '#fa8072', 'sandybrown': '#f4a460', 'seagreen': '#2e8b57', 'seashell': '#fff5ee', 'sienna': '#a0522d', 'silver': '#c0c0c0', 'skyblue': '#87ceeb', 'slateblue': '#6a5acd', 'slategray': '#708090', 'snow': '#fffafa', 'springgreen': '#00ff7f', 'steelblue': '#4682b4', 'tan': '#d2b48c', 'teal': '#008080', 'thistle': '#d8bfd8', 'tomato': '#ff6347', 'turquoise': '#40e0d0', 'violet': '#ee82ee', 'wheat': '#f5deb3', 'white': '#ffffff', 'whitesmoke': '#f5f5f5', 'yellow': '#ffff00', 'yellowgreen': '#9acd32'} if (typeof colours[colour.toLowerCase()] !== 'undefined') { return colours[colour.toLowerCase()] } else { return '' } } /** * This callback is displayed as part of the ablauf class. * @callback ablauf~jsonCallback * @param {object} Error or null * @param {object.status} Number of Error (Uses HTTP-Status) * @param {object.message} Custom Error Message * @param {object} Json - The JSON. See Schema */ /** * This callback is displayed as part of the ablauf class. * @callback ablauf~stringCallback * @param {object} Error or null * @param {object.status} Number of Error (Uses HTTP-Status) * @param {object.message} Custom Error Message * @param {object} String - The String, as in the file */