<?php
/**
 * File containing the abstract ezcDocumentDocbookToWikiBaseHandler base class.
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package Document
 * @version //autogen//
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

/**
 * Basic converter which stores a list of handlers for each node in the docbook
 * element tree. Those handlers will be executed for the elements, when found.
 * The handler can then handle the repective subtree.
 *
 * Additional handlers may be added by the user to the converter class.
 *
 * @package Document
 * @version //autogen//
 */
abstract class ezcDocumentDocbookToWikiBaseHandler extends ezcDocumentElementVisitorHandler
{
    /**
     * Render a directive
     *
     * Render a directive with the given paramters.
     *
     * @param string $name
     * @param string $parameter
     * @param array $options
     * @param string $content
     * @return string
     */
    protected function renderDirective( $name, $parameter, array $options, $content = null )
    {
        $indentation = str_repeat( ' ', ezcDocumentDocbookToWikiConverter::$indentation );

        // Show directive with given parameters
        $directive = sprintf( "\n%s.. %s:: %s\n",
            $indentation,
            $name,
            $parameter
        );

        // Append options
        foreach ( $options as $key => $value )
        {
            $directive .= sprintf( "%s   :%s: %s\n",
                $indentation,
                ezcDocumentDocbookToWikiConverter::escapeWikiText( $key ),
                ezcDocumentDocbookToWikiConverter::escapeWikiText( $value )
            );
        }

        // Append content, if given
        if ( $content !== null )
        {
            $directive .= "\n" . str_repeat( ' ', ezcDocumentDocbookToWikiConverter::$indentation + 3 ) .
                trim( ezcDocumentDocbookToWikiConverter::wordWrap( $content, 3 ) ) . "\n";
        }

        // Append an additional newline after the directive contents
        $directive .= "\n";

        return $directive;
    }
}

?>
