ngui-tools
Version:
A GUI typesetting display engine and cross platform GUI application development framework based on NodeJS/OpenGL
209 lines (195 loc) • 5.55 kB
JavaScript
/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2015, xuewen.chu
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of xuewen.chu nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL xuewen.chu BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK ***** */
export process.binding('ngui_css');
import './util';
import './value';
import 'pkg';
const dev = pkg.options.dev;
const _priv = value._priv;
// Meta attribute
/**
* @enum PropertyName Meta attribute
* PROPERTY_X
* PROPERTY_Y
* PROPERTY_SCALE_X
* PROPERTY_SCALE_Y
* PROPERTY_SKEW_X
* PROPERTY_SKEW_Y
* PROPERTY_ROTATE_Z
* PROPERTY_ORIGIN_X
* PROPERTY_ORIGIN_Y
* PROPERTY_OPACITY
* PROPERTY_VISIBLE
* PROPERTY_WIDTH
* PROPERTY_HEIGHT
* PROPERTY_MARGIN_LEFT
* PROPERTY_MARGIN_TOP
* PROPERTY_MARGIN_RIGHT
* PROPERTY_MARGIN_BOTTOM
* PROPERTY_BORDER_LEFT_WIDTH
* PROPERTY_BORDER_TOP_WIDTH
* PROPERTY_BORDER_RIGHT_WIDTH
* PROPERTY_BORDER_BOTTOM_WIDTH
* PROPERTY_BORDER_LEFT_COLOR
* PROPERTY_BORDER_TOP_COLOR
* PROPERTY_BORDER_RIGHT_COLOR
* PROPERTY_BORDER_BOTTOM_COLOR
* PROPERTY_BORDER_RADIUS_LEFT_TOP
* PROPERTY_BORDER_RADIUS_RIGHT_TOP
* PROPERTY_BORDER_RADIUS_RIGHT_BOTTOM
* PROPERTY_BORDER_RADIUS_LEFT_BOTTOM
* PROPERTY_BACKGROUND_COLOR
* PROPERTY_BACKGROUND
* PROPERTY_NEWLINE
* PROPERTY_CLIP
* PROPERTY_CONTENT_ALIGN
* PROPERTY_TEXT_ALIGN
* PROPERTY_MAX_WIDTH
* PROPERTY_MAX_HEIGHT
* PROPERTY_START_X
* PROPERTY_START_Y
* PROPERTY_RATIO_X
* PROPERTY_RATIO_Y
* PROPERTY_REPEAT
* PROPERTY_TEXT_BACKGROUND_COLOR
* PROPERTY_TEXT_COLOR
* PROPERTY_TEXT_SIZE
* PROPERTY_TEXT_STYLE
* PROPERTY_TEXT_FAMILY
* PROPERTY_TEXT_LINE_HEIGHT
* PROPERTY_TEXT_SHADOW
* PROPERTY_TEXT_DECORATION
* PROPERTY_TEXT_OVERFLOW
* PROPERTY_TEXT_WHITE_SPACE
* PROPERTY_ALIGN_X
* PROPERTY_ALIGN_Y
* PROPERTY_SHADOW
* PROPERTY_SRC
* @end
*/
// Non meta attribute
/**
* @enum PropertyName Non meta attribute
* PROPERTY_TIME
* PROPERTY_TRANSLATE
* PROPERTY_SCALE
* PROPERTY_SKEW
* PROPERTY_ORIGIN
* PROPERTY_MARGIN
* PROPERTY_BORDER
* PROPERTY_BORDER_WIDTH
* PROPERTY_BORDER_COLOR
* PROPERTY_BORDER_RADIUS
* PROPERTY_BORDER_LEFT
* PROPERTY_BORDER_TOP
* PROPERTY_BORDER_RIGHT
* PROPERTY_BORDER_BOTTOM
* PROPERTY_MIN_WIDTH
* PROPERTY_MIN_HEIGHT
* PROPERTY_START
* PROPERTY_RATIO
* PROPERTY_BACKGROUND_IMAGE
* PROPERTY_BACKGROUND_REPEAT
* PROPERTY_BACKGROUND_POSITION
* PROPERTY_BACKGROUND_POSITION_X
* PROPERTY_BACKGROUND_POSITION_Y
* PROPERTY_BACKGROUND_SIZE
* PROPERTY_BACKGROUND_SIZE_X
* PROPERTY_BACKGROUND_SIZE_Y
* PROPERTY_ALIGN
* @end
*/
function parse_error_throw(val, msg, help) {
var help_str = '';
if (help) {
help_str = help();
}
msg = msg.replace('%s', '`' + val + '`');
if (help_str) {
throw new TypeError(`Bad argument. ${msg}. Examples: ${help_str}`);
} else {
throw new TypeError(`Bad argument. ${msg}.`);
}
}
/**
* @func parseNumber(val, msg)
*/
export function parseNumber(val, msg) {
if (typeof val == 'number') {
return number;
}
parse_error_throw(val, msg);
}
/**
* @func parseNumber(val, type, msg)
*/
export function parseValue(val, type, msg) {
if (typeof val == 'string') {
var func = value[`parse${type}`];
var out = func(val);
if (out) {
return out;
}
} else if (val instanceof value[type]) {
return val;
}
parse_error_throw(val, msg, _priv[`_parse${type}Help`]);
}
/**
* @func create(sheets) create style sheets
* @arg sheets {Object}
*/
/**
* @func check(css_name)
* @arg css_name {String}
* @ret {bool}
*/
export function check(css_name) {
var name = css_name.replace(/([A-Z_]+)/g, '_$1');
if ( !('PROPERTY_' + name.toUpperCase() in exports) ) {
console.warn( `---------- Invalid name "${css_name}" in CSS style sheet ` );
return false;
}
return true;
}
/**
* @func CSS(sheets)
* @arg sheets {Object}
*/
export function CSS(sheets) {
if ( dev ) {
for ( var cls in sheets ) {
for ( var name in sheets[cls] ) {
check(name);
}
}
}
exports.create(sheets);
}