roundcubemail/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
private function _parse_text($script)
    {
        $prefix   = '';
        $options  = array();
        $position = 0;
        $length   = strlen($script);

        while ($position < $length) {
            // skip whitespace chars
            $position = self::ltrim_position($script, $position);
            $rulename = '';

            // Comments
            while ($script[$position] === '#') {
                $endl = strpos($script, "\n", $position) ?: $length;
                $line = substr($script, $position, $endl - $position);

                // Roundcube format
                if (preg_match('/^# rule:\[(.*)\]/', $line, $matches)) {
                    $rulename = $matches[1];
                }
                // KEP:14 variables
                else if (preg_match('/^# (EDITOR|EDITOR_VERSION) (.+)$/', $line, $matches)) {
                    $this->set_var($matches[1], $matches[2]);
                }
                // Horde-Ingo format
                else if (!empty($options['format']) && $options['format'] == 'INGO'
                    && preg_match('/^# (.*)/', $line, $matches)
                ) {
                    $rulename = $matches[1];
                }
                else if (empty($options['prefix'])) {
                    $prefix .= $line . "\n";
                }

                // skip empty lines after the comment (#5657)
                $position = self::ltrim_position($script, $endl + 1);
            }

            // handle script header
            if (empty($options['prefix'])) {
                $options['prefix'] = true;
                if ($prefix && strpos($prefix, 'horde.org/ingo')) {
                    $options['format'] = 'INGO';
                }
            }

            // Control structures/blocks
            if (preg_match('/^(if|else|elsif)/i', substr($script, $position, 5))) {
                $rule = $this->_tokenize_rule($script, $position);
                if (strlen($rulename) && !empty($rule)) {
                    $rule['name'] = $rulename;
                }
            }
            // Simple commands
            else {
                $rule = $this->_parse_actions($script, $position, ';');
                if (!empty($rule[0]) && is_array($rule)) {
                    // set "global" variables
                    if ($rule[0]['type'] == 'set') {
                        unset($rule[0]['type']);
                        $this->vars[] = $rule[0];
                        unset($rule);
                    }
                    else {
                        $rule = array('actions' => $rule);
                    }
                }
            }

            if (!empty($rule)) {
                $this->content[] = $rule;
            }
        }

        if (!empty($prefix)) {
            $this->prefix = trim($prefix);
        }
    }
private function _parse_text($script)
    {
        $prefix   = '';
        $options  = array();
        $position = 0;
        $length   = strlen($script);

        while ($position < $length) {
            // skip whitespace chars
            $position = self::ltrim_position($script, $position);
            $rulename = '';

            // Comments
            while ($script[$position] === '#') {
                $endl = strpos($script, "\n", $position) ?: $length;
                $line = substr($script, $position, $endl - $position);

                // Roundcube format
                if (preg_match('/^# rule:\[(.*)\]/', $line, $matches)) {
                    $rulename = $matches[1];
                }
                // KEP:14 variables
                else if (preg_match('/^# (EDITOR|EDITOR_VERSION) (.+)$/', $line, $matches)) {
                    $this->set_var($matches[1], $matches[2]);
                }
                // Horde-Ingo format
                else if (!empty($options['format']) && $options['format'] == 'INGO'
                    && preg_match('/^# (.*)/', $line, $matches)
                ) {
                    $rulename = $matches[1];
                }
                else if (empty($options['prefix'])) {
                    $prefix .= $line . "\n";
                }

                // skip empty lines after the comment (#5657)
                $position = self::ltrim_position($script, $endl + 1);
            }

            // handle script header
            if (empty($options['prefix'])) {
                $options['prefix'] = true;
                if ($prefix && strpos($prefix, 'horde.org/ingo')) {
                    $options['format'] = 'INGO';
                }
            }

            // Control structures/blocks
            if (preg_match('/^(if|else|elsif)/i', substr($script, $position, 5))) {
                $rule = $this->_tokenize_rule($script, $position);
                if (strlen($rulename) && !empty($rule)) {
                    $rule['name'] = $rulename;
                }
            }
            // Simple commands
            else {
                $rule = $this->_parse_actions($script, $position, ';');
                if (!empty($rule[0]) && is_array($rule)) {
                    // set "global" variables
                    if ($rule[0]['type'] == 'set') {
                        unset($rule[0]['type']);
                        $this->vars[] = $rule[0];
                        unset($rule);
                    }
                    else {
                        $rule = array('actions' => $rule);
                    }
                }
            }

            if (!empty($rule)) {
                $this->content[] = $rule;
            }
        }

        if (!empty($prefix)) {
            $this->prefix = trim($prefix);
        }
    }
private function _parse_text ( $ script ) { $ prefix = '' ; $ options = array ( ) ; $ position = 0 ; $ length = strlen ( $ script ) ; while ( $ position < $ length ) { // skip whitespace chars $ position = self :: ltrim_position ( $ script , $ position ) ; $ rulename = '' ; // Comments while ( $ script [ $ position ] === '#' ) { $ endl = strpos ( $ script , "\n" , $ position ) ? : $ length ; $ line = substr ( $ script , $ position , $ endl - $ position ) ; // Roundcube format if ( preg_match ( '/^# rule:\[(.*)\]/' , $ line , $ matches ) ) { $ rulename = $ matches [ 1 ] ; } // KEP:14 variables else if ( preg_match ( '/^# (EDITOR|EDITOR_VERSION) (.+)$/' , $ line , $ matches ) ) { $ this -> set_var ( $ matches [ 1 ] , $ matches [ 2 ] ) ; } // Horde-Ingo format else if ( ! empty ( $ options [ 'format' ] ) && $ options [ 'format' ] == 'INGO' && preg_match ( '/^# (.*)/' , $ line , $ matches ) ) { $ rulename = $ matches [ 1 ] ; } else if ( empty ( $ options [ 'prefix' ] ) ) { $ prefix .= $ line . "\n" ; } // skip empty lines after the comment (#5657) $ position = self :: ltrim_position ( $ script , $ endl + 1 ) ; } // handle script header if ( empty ( $ options [ 'prefix' ] ) ) { $ options [ 'prefix' ] = true ; if ( $ prefix && strpos ( $ prefix , 'horde.org/ingo' ) ) { $ options [ 'format' ] = 'INGO' ; } } // Control structures/blocks if ( preg_match ( '/^(if|else|elsif)/i' , substr ( $ script , $ position , 5 ) ) ) { $ rule = $ this -> _tokenize_rule ( $ script , $ position ) ; if ( strlen ( $ rulename ) && ! empty ( $ rule ) ) { $ rule [ 'name' ] = $ rulename ; } } // Simple commands else { $ rule = $ this -> _parse_actions ( $ script , $ position , ';' ) ; if ( ! empty ( $ rule [ 0 ] ) && is_array ( $ rule ) ) { // set "global" variables if ( $ rule [ 0 ] [ 'type' ] == 'set' ) { unset ( $ rule [ 0 ] [ 'type' ] ) ; $ this -> vars [ ] = $ rule [ 0 ] ; unset ( $ rule ) ; } else { $ rule = array ( 'actions' => $ rule ) ; } } } if ( ! empty ( $ rule ) ) { $ this -> content [ ] = $ rule ; } } if ( ! empty ( $ prefix ) ) { $ this -> prefix = trim ( $ prefix ) ; } }
Converts text script to rules array

@param string Text script
Converts text script to rules array