Package org.openquark.cal.caldoc

Source Code of org.openquark.cal.caldoc.CALDocToTooltipHTMLUtilities

/*
* Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*     * Redistributions of source code must retain the above copyright notice,
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of Business Objects nor the names of its contributors
*       may be used to endorse or promote products derived from this software
*       without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

/*
* CALDocToTooltipHTMLUtilities.java
* Created: Feb 12, 2007
* By: Joseph Wong
*/

package org.openquark.cal.caldoc;

import java.nio.charset.Charset;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.openquark.cal.compiler.CALDocComment;
import org.openquark.cal.compiler.DataConstructor;
import org.openquark.cal.compiler.Function;
import org.openquark.cal.compiler.FunctionalAgent;
import org.openquark.cal.compiler.IdentifierInfo;
import org.openquark.cal.compiler.ModuleName;
import org.openquark.cal.compiler.ModuleTypeInfo;
import org.openquark.cal.compiler.ScopedEntity;
import org.openquark.cal.compiler.TypeClass;
import org.openquark.cal.compiler.TypeConstructor;
import org.openquark.cal.filter.AcceptAllModulesFilter;
import org.openquark.cal.filter.AcceptAllScopedEntitiesFilter;
import org.openquark.cal.metadata.FunctionalAgentMetadata;
import org.openquark.cal.metadata.MetadataManager;
import org.openquark.cal.services.LocaleUtilities;
import org.openquark.cal.services.ProgramModelManager;

/**
* This is a utility class containing helper methods for converting CALDoc into
* properly formatted HTML for use in tooltips in IDEs.
*
* @author Joseph Wong
*/
public class CALDocToTooltipHTMLUtilities {
   
    /** Private constructor. This class is not meant to be instantiated. */
    private CALDocToTooltipHTMLUtilities() {}

    /**
     * Generates the HTML representation for the documentation of a ScopedEntity.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param entity the ScopedEntity to be documented.
     * @return the HTML for the documentation.
     */
    public static String getHTMLForCALDocCommentOfScopedEntity(final ProgramModelManager programModelManager, final ScopedEntity entity) {
        final CALDocComment caldoc = entity.getCALDocComment();
       
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(entity.getName().getModuleName());
       
        docGenerator.tooltip_generateScopedEntityHeader(entity.getName().getModuleName());
       
        // keep track of whether a DL block is needed to wrap around the generated HTML
        final boolean needWrappingDL;
        if (entity instanceof FunctionalAgent) {
            final boolean isDataCons = entity instanceof DataConstructor;
            final String unqualifiedName;
            if (entity instanceof Function) {
                // We want to get the display name, in case the entity is a local function with a unique name like f$x$7
                unqualifiedName = ((Function)entity).getUnqualifiedDisplayName();
            } else {
                unqualifiedName = entity.getName().getUnqualifiedName();
            }
            docGenerator.generateFunctionalAgentDoc(unqualifiedName, (FunctionalAgent)entity, "", (FunctionalAgentMetadata)MetadataManager.getEmptyMetadata(entity, LocaleUtilities.INVARIANT_LOCALE), caldoc, 0, !isDataCons);
            needWrappingDL = true;
           
        } else if (entity instanceof TypeClass){
            docGenerator.generateTypeClassDocHeader((TypeClass)entity, 0);
            needWrappingDL = false;
           
        } else if (entity instanceof TypeConstructor){
            docGenerator.generateTypeConsDocHeader((TypeConstructor)entity, 0);
            needWrappingDL = false;
           
        } else {
            return null;
        }
       
        final String style = getHTMLStyle();
       
        if (needWrappingDL) {
            return style + "<dl>" + docGenerator.getCurrentPageHTML() + "</dl>";
        } else {
            return style + docGenerator.getCurrentPageHTML();
        }
    }
   
    /**
     * Generates the HTML representation for the documentation of a local function.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param entity the ScopedEntity of the local function to be documented.
     * @param localFunction the local function to be documented.
     * @return the HTML for the documentation.
     */
    public static String getHTMLForCALDocCommentOfLocalFunction(final ProgramModelManager programModelManager, final Function entity, final IdentifierInfo.Local.Function localFunction) {
        return getHTMLForCALDocCommentOfLocalFunctionOrPatternMatchVar(programModelManager, entity, localFunction);
    }
   
    /**
     * Generates the HTML representation for the documentation of a local pattern match variable.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param entity the ScopedEntity of the local pattern match variable to be documented.
     * @param localPatternMatchVar the variable to be documented.
     * @return the HTML for the documentation.
     */
    public static String getHTMLForCALDocCommentOfLocalPatternMatchVar(final ProgramModelManager programModelManager, final Function entity, final IdentifierInfo.Local.PatternMatchVariable localPatternMatchVar) {
        return getHTMLForCALDocCommentOfLocalFunctionOrPatternMatchVar(programModelManager, entity, localPatternMatchVar);
    }

    /**
     * Generates the HTML representation for the documentation of a local function or pattern match variable.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param entity the ScopedEntity to be documented.
     * @param localFunctionOrPatternMatchVar the variable to be documented.
     * @return the HTML for the documentation.
     */
    private static String getHTMLForCALDocCommentOfLocalFunctionOrPatternMatchVar(final ProgramModelManager programModelManager, final Function entity, final IdentifierInfo.Local localFunctionOrPatternMatchVar) {
        final CALDocComment caldoc = entity.getCALDocComment();
       
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(entity.getName().getModuleName());
       
        docGenerator.tooltip_generateLocalNameHeader(localFunctionOrPatternMatchVar);

        docGenerator.generateFunctionalAgentDoc(localFunctionOrPatternMatchVar.getVarName(), entity, "", (FunctionalAgentMetadata)MetadataManager.getEmptyMetadata(entity, LocaleUtilities.INVARIANT_LOCALE), caldoc, 0, true);

        final String style = getHTMLStyle();
       
        return style + "<dl>" + docGenerator.getCurrentPageHTML() + "</dl>";
    }
   
    /**
     * Generates the HTML representation for the documentation of a function or class method parameter.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param entity the ScopedEntity of the associated top-level/local function or class method.
     * @param parameter the parameter to be documented.
     * @return the HTML for the documentation.
     */
    public static String getHTMLForCALDocCommentOfFunctionParameter(final ProgramModelManager programModelManager, final FunctionalAgent entity, final IdentifierInfo.Local.Parameter parameter) {
        final CALDocComment caldoc = entity.getCALDocComment();
       
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(entity.getName().getModuleName());
       
        docGenerator.tooltip_generateLocalNameHeader(parameter);
        docGenerator.tooltip_generateSimpleLocalNameEntry(parameter);
        docGenerator.tooltip_generateHorizontalRule();

        // We want to get the display name, in case the entity is a local function with a unique name like f$x$7
        final String unqualifiedName;
        if (entity instanceof Function) {
            // We want to get the display name, in case the entity is a local function with a unique name like f$x$7
            unqualifiedName = ((Function)entity).getUnqualifiedDisplayName();
        } else {
            unqualifiedName = entity.getName().getUnqualifiedName();
        }
        docGenerator.generateFunctionalAgentDoc(unqualifiedName, entity, "", (FunctionalAgentMetadata)MetadataManager.getEmptyMetadata(entity, LocaleUtilities.INVARIANT_LOCALE), caldoc, 0, true);

        final String style = getHTMLStyle();
       
        return style + "<dl>" + docGenerator.getCurrentPageHTML() + "</dl>";
    }

    /**
     * Generates the HTML representation for the simple tooltip of a local variable without associated documentation.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param moduleName the name of the associated module.
     * @param localVariable the variable to be documented.
     * @return the HTML for the tooltip.
     */
    public static String getHTMLForSimpleLocalVariable(final ProgramModelManager programModelManager, final ModuleName moduleName, final IdentifierInfo.Local localVariable) {
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(moduleName);
       
        docGenerator.tooltip_generateLocalNameHeader(localVariable);
        docGenerator.tooltip_generateSimpleLocalNameEntry(localVariable);

        final String style = getHTMLStyle();
       
        return style + docGenerator.getCurrentPageHTML();
    }

    /**
     * Generates the HTML representation for the simple tooltip of a type variable.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param moduleName the name of the associated module.
     * @param typeVariable the variable to be documented.
     * @return the HTML for the tooltip.
     */
    public static String getHTMLForTypeVariable(final ProgramModelManager programModelManager, final ModuleName moduleName, final IdentifierInfo.TypeVariable typeVariable) {
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(moduleName);
       
        docGenerator.tooltip_generateTypeVariableHeaderAndEntry(typeVariable);

        final String style = getHTMLStyle();
       
        return style + docGenerator.getCurrentPageHTML();
    }

    /**
     * Generates the HTML representation for the simple tooltip of a record field name.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param moduleName the name of the associated module.
     * @param fieldName the record field name to be documented.
     * @return the HTML for the tooltip.
     */
    public static String getHTMLForRecordFieldName(final ProgramModelManager programModelManager, final ModuleName moduleName, final IdentifierInfo.RecordFieldName fieldName) {
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(moduleName);
       
        docGenerator.tooltip_generateRecordFieldNameHeaderAndEntry(fieldName);

        final String style = getHTMLStyle();
       
        return style + docGenerator.getCurrentPageHTML();
    }
   
    /**
     * Generates the HTML representation for the documentation of a data constructor field name.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param entities a list of the ScopedEntity instances of the associated data cons(es).
     * @param dataConsField the data constructor field to be documented.
     * @return the HTML for the documentation.
     */
    public static String getHTMLForCALDocCommentOfDataConsFieldName(final ProgramModelManager programModelManager, final List<DataConstructor> entities, final IdentifierInfo.DataConsFieldName dataConsField) {
       
        if (entities.isEmpty()) {
            throw new IllegalArgumentException("must have at least one data cons");
        }
       
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(entities.get(0).getName().getModuleName());
       
        docGenerator.tooltip_generateDataConsFieldNameHeader(dataConsField);
        docGenerator.tooltip_generateDataConsFieldNameEntry(dataConsField);

        for (final DataConstructor dataCons : entities) {
            docGenerator.tooltip_generateHorizontalRule();

            final CALDocComment caldoc = dataCons.getCALDocComment();
            final String unqualifiedName = dataCons.getName().getUnqualifiedName();
           
            docGenerator.tooltip_generateDefListOpen();
            docGenerator.generateFunctionalAgentDoc(unqualifiedName, (FunctionalAgent)dataCons, "", (FunctionalAgentMetadata)MetadataManager.getEmptyMetadata(dataCons, LocaleUtilities.INVARIANT_LOCALE), caldoc, 0, false);
            docGenerator.tooltip_generateDefListClose();
        }
       
        final String style = getHTMLStyle();
       
        return style + docGenerator.getCurrentPageHTML();
    }
   
    /**
     * Generates the HTML representation for the documentation of a ScopedEntity.
     * @param programModelManager the ProgramModelManager for the program containing the entity.
     * @param moduleTypeInfo the type info for the module to be documented.
     * @return the HTML for the documentation.
     */
    public static String getHTMLForCALDocCommentOfModule(final ProgramModelManager programModelManager, ModuleTypeInfo moduleTypeInfo) {
        final HTMLDocumentationGeneratorConfiguration config = makeBareboneConfiguration();
        final HTMLDocumentationGenerator docGenerator = new HTMLDocumentationGenerator(programModelManager, null, config, true);
        docGenerator.startNewCurrentPageWithModule(moduleTypeInfo.getModuleName());
       
        docGenerator.tooltip_generateModuleEntryHeader(moduleTypeInfo.getModuleName());
        docGenerator.generateModuleDescription(moduleTypeInfo);
       
        final String style = getHTMLStyle();
        return style + docGenerator.getCurrentPageHTML();
    }

    /**
     * @return a barebone configuration for use in tooltip generation.
     */
    private static HTMLDocumentationGeneratorConfiguration makeBareboneConfiguration() {
        final Logger logger = Logger.getAnonymousLogger();
        logger.setLevel(Level.ALL);
        logger.setUseParentHandlers(false);
       
        // Create a barebone configuration
        final HTMLDocumentationGeneratorConfiguration config = new HTMLDocumentationGeneratorConfiguration(
            new FileGenerator() {
                public void generateTextFile(String fileName, String content, Charset charset) {}
                public void generateTextFile(String subdirectory, String fileName, String content, Charset charset) {}
                },
            new AcceptAllModulesFilter(),
            new AcceptAllScopedEntitiesFilter(),
            false,
            true,
            true,
            true,
            true,
            false,
            false,
            "",
            "",
            "",
            "",
            "",
            LocaleUtilities.INVARIANT_LOCALE,
            logger);
        return config;
    }

    /**
     * @return the style parameters used by the CALDoc functions.
     */
    public static String getHTMLStyle(){
        return "<style type='text/css'>\n" + HTMLDocumentationGenerator.getCompactDisplayCSS() + "\n</style>\n";   
    }
}
TOP

Related Classes of org.openquark.cal.caldoc.CALDocToTooltipHTMLUtilities

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.