(function (api, $) { "use strict"; if (!api.styleOutput) { api.styleOutput = {}; } api.styleOutput = { rulesCache: [], }; api.styleOutput.generateStyle = function (value, option) { if (undefined === option.property) { option.property = ''; } if (undefined === option.prefix) { option.prefix = ''; } if (undefined === option.units) { option.units = ''; } if (undefined === option.suffix) { option.suffix = ''; } return option.property + ' : ' + option.prefix + value + option.units + option.suffix + ';'; }; api.styleOutput.getFontVariant = function ($variant) { if ($variant === '100') { return {'weight': '100', 'style': 'normal'}; } if ($variant === '100reguler') { return {'weight': '100', 'style': 'reguler'}; } if ($variant === '100italic') { return {'weight': '100', 'style': 'italic'}; } if ($variant === '200') { return {'weight': '200', 'style': 'normal'}; } if ($variant === '200reguler') { return {'weight': '200', 'style': 'reguler'}; } if ($variant === '200italic') { return {'weight': '200', 'style': 'italic'}; } if ($variant === '300') { return {'weight': '300', 'style': 'normal'}; } if ($variant === '300reguler') { return {'weight': '300', 'style': 'reguler'}; } if ($variant === '300italic') { return {'weight': '300', 'style': 'italic'}; } if ($variant === 'regular') { return {'weight': '400', 'style': 'normal'}; } if ($variant === 'italic') { return {'weight': '400', 'style': 'italic'}; } if ($variant === '400reguler') { return {'weight': '400', 'style': 'reguler'}; } if ($variant === '400italic') { return {'weight': '400', 'style': 'italic'}; } if ($variant === '500') { return {'weight': '500', 'style': 'normal'}; } if ($variant === '500reguler') { return {'weight': '500', 'style': 'reguler'}; } if ($variant === '500italic') { return {'weight': '500', 'style': 'italic'}; } if ($variant === '600') { return {'weight': '600', 'style': 'normal'}; } if ($variant === '600reguler') { return {'weight': '600', 'style': 'reguler'}; } if ($variant === '600italic') { return {'weight': '600', 'style': 'italic'}; } if ($variant === '700') { return {'weight': '700', 'style': 'normal'}; } if ($variant === '700reguler') { return {'weight': '700', 'style': 'reguler'}; } if ($variant === '700italic') { return {'weight': '700', 'style': 'italic'}; } if ($variant === '800') { return {'weight': '800', 'style': 'normal'}; } if ($variant === '800reguler') { return {'weight': '800', 'style': 'reguler'}; } if ($variant === '800italic') { return {'weight': '800', 'style': 'italic'}; } if ($variant === '900') { return {'weight': '900', 'style': 'normal'}; } if ($variant === '900reguler') { return {'weight': '900', 'style': 'reguler'}; } if ($variant === '900italic') { return {'weight': '900', 'style': 'italic'}; } }; api.styleOutput.cssDimension = function(value) { // Trim it. value = value.trim(); // If the value is round, then return 50%. if ( 'round' === value ) { value = '50%'; } // If the value is empty, return empty. if ( '' === value ) { return ''; } // If auto, return auto. if ( 'auto' === value ) { return 'auto'; } // Return empty if there are no numbers in the value. if ( ! /[0-9]/.test(value) ) { return ''; } // If we're using calc() then return the value. if ( -1 < value.indexOf('calc(') ) { return value } // The raw value without the units. // $raw_value = self::sanitize_number( value ); var raw_value = value.replace(/[^0-9\.\-\+]/g, '');; var unit_used = ''; // An array of all valid CSS units. Their order was carefully chosen for this evaluation, don't mix it up!!! var units = [ 'rem', 'em', 'ex', '%', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'ch', 'vh', 'vw', 'vmin', 'vmax' ] units.forEach((unit) => { if ( -1 < value.indexOf(unit) ) { unit_used = unit; } }) // Hack for rem values. if ( 'em' === unit_used && -1 < value.indexOf('rem') ) { unit_used = 'rem'; } return raw_value + unit_used; } api.styleOutput.generateFontStyle = function (value) { var style = '', fontSize, lineHeight; if (value['font-family'] !== '') { style += 'font-family: ' + value['font-family'] + '; '; if (value['variant'] && value['variant'].constructor === Array && value['variant'].length === 1) { var variant = this.getFontVariant(value['variant'][0]); style += 'font-weight : ' + variant['weight'] + '; '; style += 'font-style : ' + variant['style'] + '; '; } if (value['font-size'] && value['font-size'] !== '') { fontSize = api.styleOutput.cssDimension( value['font-size'] ) if ( $.isNumeric( fontSize ) ) { if (value['font-size-unit'] && value['font-size-unit'] !== '') { style += 'font-size: ' + fontSize + value['font-size-unit'] + '; '; } else { style += 'font-size: ' + fontSize + 'px; '; } } else { style += 'font-size: ' + value['font-size'] + '; '; } } if (value['letter-spacing'] && value['letter-spacing'] !== '') { style += 'letter-spacing: ' + value['letter-spacing'] + '; '; } if (value['color'] && value['color'] !== '') { style += 'color : ' + value['color'] + '; '; } if (value['line-height'] && value['line-height'] !== '') { lineHeight = api.styleOutput.cssDimension( value['line-height'] ) if ( $.isNumeric( lineHeight ) ) { if ( value['line-height-unit'] && value['line-height-unit'] !== '' && value['line-height-unit'] !== 'none' ) { style += 'line-height: ' + lineHeight + value['line-height-unit'] + '; '; } else { style += 'line-height: ' + value['line-height'] + '; '; } } else { style += 'line-height: ' + value['line-height'] + '; '; } } if (value['text-transform'] && value['text-transform'] !== '') { style += 'text-transform : ' + value['text-transform'] + '; '; } } return style; }; api.styleOutput.attachGoogleFontHeader = function (value, setting) { var font_id = this.settingName(setting, '', '-css'); // need to remove the font first $("#" + font_id).remove(); var variant = []; var subset = []; if (value['variant'] && value['variant'].constructor === Array) { if (value['variant'].length === 1) { variant = ['reguler']; } else { variant = value['variant']; } } if (value['subsets'] && value['subsets'].constructor === Array) { subset = value['subsets']; } var font_family = 'family=' + value['font-family'] + ":" + variant.join(','); var font_subset = 'subset=' + subset.join(','); var url = "//fonts.googleapis.com/css?" + encodeURI(font_family + '&' + font_subset); $('head').append(''); }; api.styleOutput.handleInlineStyle = function (setting, value, option) { var obj = this; if (undefined !== option.element) { var css = obj.generateStyle(value, option); var currentCss = $(option.element).attr('style'); if (undefined === currentCss) { currentCss = ''; } $(option.element).attr('style', currentCss + css); } }; api.styleOutput.handleRemoveClass = function (value, option) { if (1 === value || '1' === value || true === value || 'true' === value || 'on' === value) { $(option.element).removeClass(option.property); } if (0 === value || '0' === value || false === value || 'false' === value || 'off' === value) { $(option.element).addClass(option.property); } }; api.styleOutput.handleInlineSpacing = function (value, option) { value = JSON.parse(value); if (option.property === 'padding') { $(option.element).css({ 'padding-top': value['top'], 'padding-left': value['left'], 'padding-bottom': value['bottom'], 'padding-right': value['right'] }); } if (option.property === 'margin') { $(option.element).css({ 'margin-top': value['top'], 'margin-left': value['left'], 'margin-bottom': value['bottom'], 'margin-right': value['right'] }); } }; api.styleOutput.handleGradient = function (value, option) { var degree = value['degree']; var begincolor = value['begincolor']; var beginlocation = value['beginlocation']; var endcolor = value['endcolor']; var endlocation = value['endlocation']; var gradient = "background: -moz-linear-gradient(" + degree + "deg, " + begincolor + " " + beginlocation + "%, " + endcolor + " " + endlocation + "%);" + "background: -webkit-linear-gradient(" + degree + "deg, " + begincolor + " " + beginlocation + "%, " + endcolor + " " + endlocation + "%);" + "background: -o-linear-gradient(" + degree + "deg, " + begincolor + " " + beginlocation + "%, " + endcolor + " " + endlocation + "%);" + "background: -ms-linear-gradient(" + degree + "deg, " + begincolor + " " + beginlocation + "%, " + endcolor + " " + endlocation + "%);" + "background: linear-gradient(" + degree + "deg, " + begincolor + " " + beginlocation + "%, " + endcolor + " " + endlocation + "%);"; return gradient; }; api.styleOutput.handleAddClass = function (value, option) { if (1 === value || '1' === value || true === value || 'true' === value || 'on' === value) { $(option.element).addClass(option.property); } if (0 === value || '0' === value || false === value || 'false' === value || 'off' === value) { $(option.element).removeClass(option.property); } }; api.styleOutput.handleSwitchClass = function (value, option) { if (1 === value || '1' === value || true === value || 'true' === value || 'on' === value) { $(option.element).removeClass(option.property[0]).addClass(option.property[1]); } if (0 === value || '0' === value || false === value || 'false' === value || 'off' === value) { $(option.element).addClass(option.property[0]).removeClass(option.property[1]); } }; api.styleOutput.handleClassMasking = function (value, option) { $.each(option.property, function (classkey, classname) { $(option.element).removeClass(classname); }); $(option.element).addClass(option.property[value]); }; api.styleOutput.isExcludedFont = function (font) { if (font.indexOf(',') >= 0) { font = font.substring(font.indexOf(','), 0); } var inarray = $.inArray(font, window.outputSetting.excludeFont); return ( inarray >= 0 ); }; api.styleOutput.handleOutput = function (output, newval, setting, result) { var obj = this; if (undefined !== output && 0 < output.length) { var injectCss = ''; var css = ''; _.each(output, function (option) { if (option.method === 'typography') { if (undefined !== option.element && newval['font-family'] !== '') { // add google font into header if (!obj.isExcludedFont(newval['font-family'])) { obj.attachGoogleFontHeader(newval, setting); } // css inject css = obj.generateFontStyle(newval); css = option.element + ' { ' + css + ' } '; injectCss += css; } } if (option.method === 'gradient') { if (undefined !== option.element) { css = obj.handleGradient(newval, option); css = option.element + ' { ' + css + ' } '; if (undefined !== option.mediaquery) { css = option.mediaquery + ' { ' + css + ' } '; } injectCss += css; } } if (option.method === 'inline-css') { if (result) { obj.handleInlineStyle(setting, newval, option); } else { obj.handleInlineStyle(setting, option.default, option); } } if (option.method === 'inject-style') { if (undefined !== option.element) { css = obj.generateStyle(newval, option); css = option.element + ' { ' + css + ' } '; if (undefined !== option.mediaquery) { css = option.mediaquery + ' { ' + css + ' } '; } injectCss += css; } } if (option.method === 'remove-class') { if (result) { obj.handleRemoveClass(newval, option); } else { obj.handleAddClass(newval, option); } } if (option.method === 'add-class') { if (result) { obj.handleAddClass(newval, option); } else { obj.handleRemoveClass(newval, option); } } if (option.method === 'switch-class') { if (result) { obj.handleSwitchClass(newval, option); } else { obj.handleSwitchClass(option.default, option); } } if (option.method === 'class-masking') { if (result) { obj.handleClassMasking(newval, option); } else { obj.handleClassMasking(option.default, option); } } if (option.method === 'inline-spacing') { if (result) { obj.handleInlineSpacing(newval, option); } else { obj.handleInlineSpacing(option.default, option); } } }); var $selector = $('#' + this.settingName(setting)); if (injectCss !== '' && result) { if (!$selector.length) { $('head').append(''); } else { $selector.text(injectCss); } } else { $selector.remove(); } if (!result && $selector.length) { $selector.remove(); } } }; api.styleOutput.settingName = function (setting, prefix, suffix) { if (typeof prefix === 'undefined') prefix = window.outputSetting.inlinePrefix; if (typeof suffix === 'undefined') suffix = ''; var regexp = new RegExp(window.outputSetting.settingPattern); var match = regexp.exec(setting); setting = Array.isArray(match) && match.length >= 2 ? match[2] : setting; return prefix + setting.replace(/\[/g, '_').replace(/\]/g, '') + suffix; }; /** * Bind setting to style output * * @param object */ api.styleOutput.bindSetting = function (object) { var styleOutput = api.styleOutput; styleOutput.rulesCache[object.id] = object.output; api(object.id, function (setting) { setting.bind(function (value) { styleOutput.handleOutput(object.output, value, object.id, true); }); }); }; /** * Listen to customizer panel event */ api.styleOutput.initialize = function () { api.preview.bind('register-style-output', function (object) { api.styleOutput.bindSetting(object); }); api.preview.bind('active-callback-control-output', function (object) { api.styleOutput.handleOutput(api.styleOutput.rulesCache[object.id], api(object.id).get(), object.id, object.result); }); api.preview.bind('register-all-style-output', function (objects) { _.each(objects, function (object) { api.styleOutput.bindSetting(object); }); }); }; api.bind('preview-ready', function () { api.styleOutput.initialize(); }); })(wp.customize, jQuery);