Contao\StyleSheets::createDefinition PHP Метод

createDefinition() защищенный Метод

Create a format definition and insert it into the database
protected createDefinition ( array $arrDefinition )
$arrDefinition array
    protected function createDefinition($arrDefinition)
    {
        $arrSet = array('pid' => $arrDefinition['pid'], 'sorting' => $arrDefinition['sorting'], 'tstamp' => time(), 'comment' => $arrDefinition['comment'], 'category' => $arrDefinition['category'], 'selector' => $arrDefinition['selector']);
        $arrAttributes = \StringUtil::trimsplit(';', $arrDefinition['attributes']);
        foreach ($arrAttributes as $strDefinition) {
            // Skip empty definitions
            if (trim($strDefinition) == '') {
                continue;
            }
            // Handle keywords, variables and functions (see #7448)
            if (strpos($strDefinition, 'important') !== false || strpos($strDefinition, 'transparent') !== false || strpos($strDefinition, 'inherit') !== false || strpos($strDefinition, '$') !== false || strpos($strDefinition, '(') !== false) {
                $arrSet['own'][] = $strDefinition;
                continue;
            }
            $arrChunks = array_map('trim', explode(':', $strDefinition, 2));
            $strKey = strtolower($arrChunks[0]);
            switch ($strKey) {
                case 'width':
                case 'height':
                    if ($arrChunks[1] == 'auto') {
                        $strUnit = '';
                        $varValue = 'auto';
                    } else {
                        $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]);
                        $varValue = preg_replace('/[^0-9.-]+/', '', $arrChunks[1]);
                    }
                    $arrSet['size'] = 1;
                    $arrSet[$strKey]['value'] = $varValue;
                    $arrSet[$strKey]['unit'] = $strUnit;
                    break;
                case 'min-width':
                case 'min-height':
                    $strName = str_replace('-', '', $strKey);
                    if ($arrChunks[1] == 'inherit') {
                        $strUnit = '';
                        $varValue = 'inherit';
                    } else {
                        $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]);
                        $varValue = preg_replace('/[^0-9.-]+/', '', $arrChunks[1]);
                    }
                    $arrSet['size'] = 1;
                    $arrSet[$strName]['value'] = $varValue;
                    $arrSet[$strName]['unit'] = $strUnit;
                    break;
                case 'max-width':
                case 'max-height':
                    $strName = str_replace('-', '', $strKey);
                    if ($arrChunks[1] == 'inherit' || $arrChunks[1] == 'none') {
                        $strUnit = '';
                        $varValue = $arrChunks[1];
                    } else {
                        $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]);
                        $varValue = preg_replace('/[^0-9.-]+/', '', $arrChunks[1]);
                    }
                    $arrSet['size'] = 1;
                    $arrSet[$strName]['value'] = $varValue;
                    $arrSet[$strName]['unit'] = $strUnit;
                    break;
                case 'top':
                case 'right':
                case 'bottom':
                case 'left':
                    if ($arrChunks[1] == 'auto') {
                        $strUnit = '';
                        $varValue = 'auto';
                    } elseif (isset($arrSet['trbl']['unit'])) {
                        $arrSet['own'][] = $strDefinition;
                        break;
                    } else {
                        $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]);
                        $varValue = preg_replace('/[^0-9.-]+/', '', $arrChunks[1]);
                    }
                    $arrSet['positioning'] = 1;
                    $arrSet['trbl'][$strKey] = $varValue;
                    if ($strUnit != '') {
                        $arrSet['trbl']['unit'] = $strUnit;
                    }
                    break;
                case 'position':
                case 'overflow':
                case 'clear':
                case 'display':
                    $arrSet['positioning'] = 1;
                    $arrSet[$strKey] = $arrChunks[1];
                    break;
                case 'float':
                    $arrSet['positioning'] = 1;
                    $arrSet['floating'] = $arrChunks[1];
                    break;
                case 'margin':
                case 'padding':
                    $arrSet['alignment'] = 1;
                    $arrTRBL = preg_split('/\\s+/', $arrChunks[1]);
                    $arrUnits = array();
                    switch (count($arrTRBL)) {
                        case 1:
                            if ($arrTRBL[0] == 'auto') {
                                $strUnit = '';
                                $varValue = 'auto';
                            } else {
                                $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[0]);
                                $varValue = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            }
                            $arrSet[$strKey] = array('top' => $varValue, 'right' => $varValue, 'bottom' => $varValue, 'left' => $varValue, 'unit' => $strUnit);
                            break;
                        case 2:
                            if ($arrTRBL[0] == 'auto') {
                                $varValue_1 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[0]);
                                $varValue_1 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            }
                            if ($arrTRBL[1] == 'auto') {
                                $varValue_2 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[1]);
                                $varValue_2 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[1]);
                            }
                            // Move to custom section if there are different units
                            if (count(array_filter(array_unique($arrUnits))) > 1) {
                                $arrSet['alignment'] = '';
                                $arrSet['own'][] = $strDefinition;
                                break;
                            }
                            $arrSet[$strKey] = array('top' => $varValue_1, 'right' => $varValue_2, 'bottom' => $varValue_1, 'left' => $varValue_2, 'unit' => '');
                            // Overwrite the unit
                            foreach ($arrUnits as $strUnit) {
                                if ($strUnit != '') {
                                    $arrSet[$strKey]['unit'] = $strUnit;
                                    break;
                                }
                            }
                            break;
                        case 3:
                            if ($arrTRBL[0] == 'auto') {
                                $varValue_1 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[0]);
                                $varValue_1 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            }
                            if ($arrTRBL[1] == 'auto') {
                                $varValue_2 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[1]);
                                $varValue_2 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[1]);
                            }
                            if ($arrTRBL[2] == 'auto') {
                                $varValue_3 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[2]);
                                $varValue_3 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[2]);
                            }
                            // Move to custom section if there are different units
                            if (count(array_filter(array_unique($arrUnits))) > 1) {
                                $arrSet['alignment'] = '';
                                $arrSet['own'][] = $strDefinition;
                                break;
                            }
                            $arrSet[$strKey] = array('top' => $varValue_1, 'right' => $varValue_2, 'bottom' => $varValue_3, 'left' => $varValue_2, 'unit' => '');
                            // Overwrite the unit
                            foreach ($arrUnits as $strUnit) {
                                if ($strUnit != '') {
                                    $arrSet[$strKey]['unit'] = $strUnit;
                                    break;
                                }
                            }
                            break;
                        case 4:
                            if ($arrTRBL[0] == 'auto') {
                                $varValue_1 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[0]);
                                $varValue_1 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            }
                            if ($arrTRBL[1] == 'auto') {
                                $varValue_2 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[1]);
                                $varValue_2 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[1]);
                            }
                            if ($arrTRBL[2] == 'auto') {
                                $varValue_3 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[2]);
                                $varValue_3 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[2]);
                            }
                            if ($arrTRBL[3] == 'auto') {
                                $varValue_4 = 'auto';
                            } else {
                                $arrUnits[] = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[3]);
                                $varValue_4 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[3]);
                            }
                            // Move to custom section if there are different units
                            if (count(array_filter(array_unique($arrUnits))) > 1) {
                                $arrSet['alignment'] = '';
                                $arrSet['own'][] = $strDefinition;
                                break;
                            }
                            $arrSet[$strKey] = array('top' => $varValue_1, 'right' => $varValue_2, 'bottom' => $varValue_3, 'left' => $varValue_4, 'unit' => '');
                            // Overwrite the unit
                            foreach ($arrUnits as $strUnit) {
                                if ($strUnit != '') {
                                    $arrSet[$strKey]['unit'] = $strUnit;
                                    break;
                                }
                            }
                            break;
                    }
                    break;
                case 'margin-top':
                case 'margin-right':
                case 'margin-bottom':
                case 'margin-left':
                    $arrSet['alignment'] = 1;
                    $strName = str_replace('margin-', '', $strKey);
                    if ($arrChunks[1] == 'auto') {
                        $strUnit = '';
                        $varValue = 'auto';
                    } else {
                        $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]);
                        $varValue = preg_replace('/[^0-9.-]+/', '', $arrChunks[1]);
                    }
                    $arrSet['margin'][$strName] = $varValue;
                    if (empty($arrSet['margin']['unit'])) {
                        $arrSet['margin']['unit'] = $strUnit;
                    }
                    break;
                case 'padding-top':
                case 'padding-right':
                case 'padding-bottom':
                case 'padding-left':
                    $arrSet['alignment'] = 1;
                    $strName = str_replace('padding-', '', $strKey);
                    $varValue = preg_replace('/[^0-9.-]+/', '', $arrChunks[1]);
                    $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]);
                    $arrSet['padding'][$strName] = $varValue;
                    $arrSet['padding']['unit'] = $strUnit;
                    break;
                case 'align':
                case 'text-align':
                case 'vertical-align':
                case 'white-space':
                    $arrSet['alignment'] = 1;
                    $arrSet[str_replace('-', '', $strKey)] = $arrChunks[1];
                    break;
                case 'background-color':
                    if (!preg_match('/^#[a-f0-9]+$/i', $arrChunks[1])) {
                        $arrSet['own'][] = $strDefinition;
                    } else {
                        $arrSet['background'] = 1;
                        $arrSet['bgcolor'] = str_replace('#', '', $arrChunks[1]);
                    }
                    break;
                case 'background-image':
                    $url = preg_replace('/url\\(["\']?([^"\')]+)["\']?\\)/i', '$1', $arrChunks[1]);
                    if (strncmp($url, '-', 1) === 0) {
                        // Ignore vendor prefixed commands
                    } elseif (strncmp($url, 'radial-gradient', 15) === 0) {
                        $arrSet['own'][] = $strDefinition;
                        // radial gradients (see #4640)
                    } else {
                        $arrSet['background'] = 1;
                        // Handle linear gradients (see #4640)
                        if (strncmp($url, 'linear-gradient', 15) === 0) {
                            $colors = \StringUtil::trimsplit(',', preg_replace('/linear-gradient ?\\(([^\\)]+)\\)/', '$1', $url));
                            $arrSet['gradientAngle'] = array_shift($colors);
                            $arrSet['gradientColors'] = serialize($colors);
                        } else {
                            $arrSet['bgimage'] = $url;
                        }
                    }
                    break;
                case 'background-position':
                    $arrSet['background'] = 1;
                    if (preg_match('/[0-9]+/', $arrChunks[1])) {
                        $arrSet['own'][] = $strDefinition;
                    } else {
                        $arrSet['bgposition'] = $arrChunks[1];
                    }
                    break;
                case 'background-repeat':
                    $arrSet['background'] = 1;
                    $arrSet['bgrepeat'] = $arrChunks[1];
                    break;
                case 'border':
                    if ($arrChunks[1] == 'none') {
                        $arrSet['own'][] = $strDefinition;
                        break;
                    }
                    $arrWSC = preg_split('/\\s+/', $arrChunks[1]);
                    if ($arrWSC[2] != '' && !preg_match('/^#[a-f0-9]+$/i', $arrWSC[2])) {
                        $arrSet['own'][] = $strDefinition;
                        break;
                    }
                    $arrSet['border'] = 1;
                    $varValue = preg_replace('/[^0-9.-]+/', '', $arrWSC[0]);
                    $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrWSC[0]);
                    $arrSet['borderwidth'] = array('top' => $varValue, 'right' => $varValue, 'bottom' => $varValue, 'left' => $varValue, 'unit' => $strUnit);
                    if ($arrWSC[1] != '') {
                        $arrSet['borderstyle'] = $arrWSC[1];
                    }
                    if ($arrWSC[2] != '') {
                        $arrSet['bordercolor'] = str_replace('#', '', $arrWSC[2]);
                    }
                    break;
                case 'border-top':
                case 'border-right':
                case 'border-bottom':
                case 'border-left':
                    if ($arrChunks[1] == 'none') {
                        $arrSet['own'][] = $strDefinition;
                        break;
                    }
                    $arrWSC = preg_split('/\\s+/', $arrChunks[1]);
                    if ($arrWSC[2] != '' && !preg_match('/^#[a-f0-9]+$/i', $arrWSC[2])) {
                        $arrSet['own'][] = $strDefinition;
                        break;
                    }
                    $arrSet['border'] = 1;
                    $strName = str_replace('border-', '', $strKey);
                    $varValue = preg_replace('/[^0-9.-]+/', '', $arrWSC[0]);
                    $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrWSC[0]);
                    if (isset($arrSet['borderwidth']['unit']) && $arrSet['borderwidth']['unit'] != $strUnit || $arrWSC[1] != '' && isset($arrSet['borderstyle']) && $arrSet['borderstyle'] != $arrWSC[1] || $arrWSC[2] != '' && isset($arrSet['bordercolor']) && $arrSet['bordercolor'] != $arrWSC[2]) {
                        $arrSet['own'][] = $strDefinition;
                        break;
                    }
                    $arrSet['borderwidth'][$strName] = preg_replace('/[^0-9.-]+/', '', $varValue);
                    $arrSet['borderwidth']['unit'] = $strUnit;
                    if ($arrWSC[1] != '') {
                        $arrSet['borderstyle'] = $arrWSC[1];
                    }
                    if ($arrWSC[2] != '') {
                        $arrSet['bordercolor'] = str_replace('#', '', $arrWSC[2]);
                    }
                    break;
                case 'border-width':
                    $arrSet['border'] = 1;
                    $arrTRBL = preg_split('/\\s+/', $arrChunks[1]);
                    $strUnit = '';
                    foreach ($arrTRBL as $v) {
                        if ($v != 0) {
                            $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[0]);
                        }
                    }
                    switch (count($arrTRBL)) {
                        case 1:
                            $varValue = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            $arrSet['borderwidth'] = array('top' => $varValue, 'right' => $varValue, 'bottom' => $varValue, 'left' => $varValue, 'unit' => $strUnit);
                            break;
                        case 2:
                            $varValue_1 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            $varValue_2 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[1]);
                            $arrSet['borderwidth'] = array('top' => $varValue_1, 'right' => $varValue_2, 'bottom' => $varValue_1, 'left' => $varValue_2, 'unit' => $strUnit);
                            break;
                        case 4:
                            $arrSet['borderwidth'] = array('top' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]), 'right' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[1]), 'bottom' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[2]), 'left' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[3]), 'unit' => $strUnit);
                            break;
                    }
                    break;
                case 'border-color':
                    if (!preg_match('/^#[a-f0-9]+$/i', $arrChunks[1])) {
                        $arrSet['own'][] = $strDefinition;
                    } else {
                        $arrSet['border'] = 1;
                        $arrSet['bordercolor'] = str_replace('#', '', $arrChunks[1]);
                    }
                    break;
                case 'border-radius':
                    $arrSet['border'] = 1;
                    $arrTRBL = preg_split('/\\s+/', $arrChunks[1]);
                    $strUnit = '';
                    foreach ($arrTRBL as $v) {
                        if ($v != 0) {
                            $strUnit = preg_replace('/[^acehimnprtvwx%]/', '', $arrTRBL[0]);
                        }
                    }
                    switch (count($arrTRBL)) {
                        case 1:
                            $varValue = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            $arrSet['borderradius'] = array('top' => $varValue, 'right' => $varValue, 'bottom' => $varValue, 'left' => $varValue, 'unit' => $strUnit);
                            break;
                        case 2:
                            $varValue_1 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]);
                            $varValue_2 = preg_replace('/[^0-9.-]+/', '', $arrTRBL[1]);
                            $arrSet['borderradius'] = array('top' => $varValue_1, 'right' => $varValue_2, 'bottom' => $varValue_1, 'left' => $varValue_2, 'unit' => $strUnit);
                            break;
                        case 4:
                            $arrSet['borderradius'] = array('top' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[0]), 'right' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[1]), 'bottom' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[2]), 'left' => preg_replace('/[^0-9.-]+/', '', $arrTRBL[3]), 'unit' => $strUnit);
                            break;
                    }
                    break;
                case '-moz-border-radius':
                case '-webkit-border-radius':
                    // Ignore
                    break;
                case 'border-style':
                case 'border-collapse':
                    $arrSet['border'] = 1;
                    $arrSet[str_replace('-', '', $strKey)] = $arrChunks[1];
                    break;
                case 'border-spacing':
                    $arrSet['border'] = 1;
                    $arrSet['borderspacing'] = array('value' => preg_replace('/[^0-9.-]+/', '', $arrChunks[1]), 'unit' => preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]));
                    break;
                case 'font-family':
                    $arrSet['font'] = 1;
                    $arrSet[str_replace('-', '', $strKey)] = $arrChunks[1];
                    break;
                case 'font-size':
                    if (!preg_match('/[0-9]+/', $arrChunks[1])) {
                        $arrSet['own'][] = $strDefinition;
                    } else {
                        $arrSet['font'] = 1;
                        $arrSet['fontsize'] = array('value' => preg_replace('/[^0-9.-]+/', '', $arrChunks[1]), 'unit' => preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]));
                    }
                    break;
                case 'font-weight':
                    if ($arrChunks[1] == 'bold' || $arrChunks[1] == 'normal') {
                        $arrSet['font'] = 1;
                        $arrSet['fontstyle'][] = $arrChunks[1];
                    } else {
                        $arrSet['own'][] = $strDefinition;
                    }
                    break;
                case 'font-style':
                    if ($arrChunks[1] == 'italic') {
                        $arrSet['font'] = 1;
                        $arrSet['fontstyle'][] = 'italic';
                    } else {
                        $arrSet['own'][] = $strDefinition;
                    }
                    break;
                case 'text-decoration':
                    $arrSet['font'] = 1;
                    switch ($arrChunks[1]) {
                        case 'underline':
                            $arrSet['fontstyle'][] = 'underline';
                            break;
                        case 'none':
                            $arrSet['fontstyle'][] = 'notUnderlined';
                            break;
                        case 'overline':
                        case 'line-through':
                            $arrSet['fontstyle'][] = $arrChunks[1];
                            break;
                    }
                    break;
                case 'font-variant':
                    $arrSet['font'] = 1;
                    if ($arrChunks[1] == 'small-caps') {
                        $arrSet['fontstyle'][] = 'small-caps';
                    } else {
                        $arrSet['own'][] = $strDefinition;
                    }
                    break;
                case 'color':
                    if (!preg_match('/^#[a-f0-9]+$/i', $arrChunks[1])) {
                        $arrSet['own'][] = $strDefinition;
                    } else {
                        $arrSet['font'] = 1;
                        $arrSet['fontcolor'] = str_replace('#', '', $arrChunks[1]);
                    }
                    break;
                case 'line-height':
                    $arrSet['font'] = 1;
                    $arrSet['lineheight'] = array('value' => preg_replace('/[^0-9.-]+/', '', $arrChunks[1]), 'unit' => preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]));
                    break;
                case 'text-transform':
                    $arrSet['font'] = 1;
                    $arrSet['texttransform'] = $arrChunks[1];
                    break;
                case 'text-indent':
                case 'letter-spacing':
                case 'word-spacing':
                    $strName = str_replace('-', '', $strKey);
                    $arrSet['font'] = 1;
                    $arrSet[$strName] = array('value' => preg_replace('/[^0-9.-]+/', '', $arrChunks[1]), 'unit' => preg_replace('/[^acehimnprtvwx%]/', '', $arrChunks[1]));
                    break;
                case 'list-style-type':
                    $arrSet['list'] = 1;
                    $arrSet[str_replace('-', '', $strKey)] = $arrChunks[1];
                    break;
                case 'list-style-image':
                    $arrSet['list'] = 1;
                    $arrSet['liststyleimage'] = preg_replace('/url\\(["\']?([^"\')]+)["\']?\\)/i', '$1', $arrChunks[1]);
                    break;
                case 'behavior':
                    $arrSet['own'][] = $strDefinition;
                    break;
                default:
                    $blnIsOwn = true;
                    // Allow custom definitions
                    if (isset($GLOBALS['TL_HOOKS']['createDefinition']) && is_array($GLOBALS['TL_HOOKS']['createDefinition'])) {
                        foreach ($GLOBALS['TL_HOOKS']['createDefinition'] as $callback) {
                            $this->import($callback[0]);
                            $arrTemp = $this->{$callback[0]}->{$callback[1]}($strKey, $arrChunks[1], $strDefinition, $arrSet);
                            if ($arrTemp && is_array($arrTemp)) {
                                $blnIsOwn = false;
                                $arrSet = array_merge($arrSet, $arrTemp);
                            }
                        }
                    }
                    // Unknown definition
                    if ($blnIsOwn) {
                        $arrSet['own'][] = $strDefinition;
                    }
                    break;
            }
        }
        if (!empty($arrSet['own'])) {
            $arrSet['own'] = implode(";\n", $arrSet['own']) . ';';
        }
        $this->Database->prepare("INSERT INTO tl_style %s")->set($arrSet)->execute();
    }