silex-website-builder-goodevent
Version:
Free and easy website builder for everyone.
174 lines (161 loc) • 4.33 kB
text/typescript
/**
* Silex, live web creation
* http://projects.silexlabs.org/?/silex/
*
* Copyright (c) 2012 Silex Labs
* http://www.silexlabs.org/
*
* Silex is available under the GPL license
* http://www.silexlabs.org/silex/silex-licensing/
*/
/**
* @fileoverview Helper class for common tasks
*
*/
type Rgb = number[];
export class Style {
/**
* convert style object to object
* with only the keys which are set
*/
static styleToObject(styleObj: CSSStyleDeclaration): object {
const res = {};
for (const styleName of styleObj) {
res[styleName] = styleObj[styleName];
}
return res;
}
/**
* convert style object to string
*/
static styleToString(style: string|object|CSSStyleDeclaration, opt_tab?: string): string {
if (typeof style === 'string') {
return style;
}
if (!opt_tab) {
opt_tab = '';
}
let styleStr = '';
for (const idx in style) {
// filter the numerical indexes of a CSSStyleDeclaration object
// filter initial values and shorthand properties
if (style[idx] && typeof style[idx] === 'string' && style[idx] !== '' &&
idx.match(/[^0-9]/)) {
styleStr +=
opt_tab + idx + ': ' + style[idx] + '; ';
}
}
return styleStr;
}
static hexToRgb(hexColor: string): any {
console.warn('why convert', hexColor, 'to RGB?');
const rgb = parseInt(hexColor.substr(1), 16);
const r = rgb >> 16;
const g = (rgb >> 8) & 255;
const b = rgb & 255;
return [r, g, b];
}
/**
* convert hex color to rgba values
* example: #000000FF will return rgba(0, 0, 0, 1)
*/
static hexToRgba(hex: string): string {
if (hex.indexOf('#') !== 0) {
return hex;
}
if (hex.length !== 9) {
console.error('Error in length ' + hex + ' - ' + hex.length);
return hex;
}
const hexArr = Style.hexToArray(hex);
const r = hexArr[0];
const g = hexArr[1];
const b = hexArr[2];
const a = hexArr[3];
const result = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
return result;
}
/**
* convert rgba to array of values
* example: #000000FF will return [0, 0, 0, 1]
*/
static hexToArray(hex: string): number[] {
if (hex.indexOf('#') !== 0) {
return null;
}
hex = hex.replace('#', '');
const r = parseInt(hex.substring(0, 2), 16);
const g = parseInt(hex.substring(2, 4), 16);
const b = parseInt(hex.substring(4, 6), 16);
const a = parseInt(hex.substring(6, 8), 16) / 255;
const result = [r, g, b, a];
return result;
}
/**
* convert rgb to hex
* example: rgb(0, 0, 0) will return #000000
*/
static rgbToHex(rgb: string): string {
const hexWithA = Style.rgbaToHex(rgb);
return hexWithA.substr(0, 7);
}
/**
* convert rgba to hex
* example: rgba(0, 0, 0, 1) will return #000000FF
*/
static rgbaToHex(rgba: string): string {
// has to be rgb or rgba
if (rgba.indexOf('rgb') !== 0) {
return rgba;
}
// get the array version
const rgbaArr = Style.rgbaToArray(rgba);
let r = rgbaArr[0].toString(16);
if (r.length < 2) {
r = '0' + r;
}
let g = rgbaArr[1].toString(16);
if (g.length < 2) {
g = '0' + g;
}
let b = rgbaArr[2].toString(16);
if (b.length < 2) {
b = '0' + b;
}
let a = rgbaArr[3].toString(16);
if (a.length < 2) {
a = '0' + a;
}
const result = '#' + (r + g + b + a);
return result;
}
/**
* convert rgba to array of values
* example: rgba(0, 0, 0, 1) will return [0, 0, 0, 1]
*/
static rgbaToArray(rgba: string): number[] {
// not rgb nor rgba
if (rgba.indexOf('rgb') !== 0) {
return null;
}
if (rgba.indexOf('rgba') !== 0) {
// rgb
rgba = rgba.replace('rgb', '');
} else {
// rgba
rgba = rgba.replace('rgba', '');
}
rgba = rgba.replace(' ', '');
const rgbaArr = rgba.substring(1, rgba.length - 1).split(',');
// add alpha if needed
if (rgbaArr.length < 4) {
rgbaArr.push('1');
}
const r = parseInt(rgbaArr[0], 10);
const g = parseInt(rgbaArr[1], 10);
const b = parseInt(rgbaArr[2], 10);
const a = parseFloat(rgbaArr[3]) * 255;
const result = [r, g, b, a];
return result;
}
}