/*
 * 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 openbook.tools.converter;

import org.antlr.runtime.Token;
import org.antlr.runtime.debug.DebugEventListener;

/**
 * Renders a runtime ANTLR token.
 * {@linkplain ParseTokenListener} controls a renderer and streams the rendered Strings
 * to appropriate output.
 * <br>
 * A renderer can define additional bean-style setter methods. They will be set before
 * renderer is used.
 * <br>
 * A concrete renderer should have a no argument constructor.
 * <br>
 * {@linkplain ParseTokenListener} or the <em>framework</em> calls a renderer in following sequence:
 * <pre>
 *    bean-style setter methods as per the user configured
 *    getPrologue()
 *    for each token {
 *       if (line is changing) {
 *          endLine()
 *          newLine()
 *       }
 *       render()
 *    }
 *    getEpilogue();
 * </pre>

 * @author Pinaki Poddar
 *
 */
public interface TokenRenderer {
    /**
     * Gets a string to be added before token processing begins.
     * <br>
     * For example, a HTML renderer may return the opening HTML and BODY tags.
     * A HTML render using a Cascaded Style Sheet may additionally specify
     * the <HEAD> tag to include the style sheet.
     */
    String getPrologue();

    /**
     * Gets a string to be added after token processing ends.
     * For example, a HTML renderer may return the closing HTML and BODY tags.
     *
     */
    String getEpilogue();

    /**
     * Produce a string representation of the given token.
     *
     * @param decision the index of the decision (or the context) in which
     * the current token is being processed. The index refers to ANTLR
     * {@link DebugEventListener#enterDecision(int)}.
     *
     * @param token the token to be rendered. Can be a hidden token as well.
     *
     * @return a string representation of the given token.
     */
    String render(int decision, Token token);

    /**
     * Produce a string to signal beginning of a line.
     * <br>
     * For example, a renderer printing line numbers can produce a String with the given line number.
     *
     * @param line the current line number
     *
     * @return a String can be a blank
     */
    String newLine(int line);


    /**
     * Produce a string to signal end of a line.
     * <br>
     * For example, a renderer can produce a newline.
     *
     * @param line the line being ended
     *
     * @return a String can be a blank
     */
    String endLine(int line);
}
