001/*
002    Licensed to the Apache Software Foundation (ASF) under one
003    or more contributor license agreements.  See the NOTICE file
004    distributed with this work for additional information
005    regarding copyright ownership.  The ASF licenses this file
006    to you under the Apache License, Version 2.0 (the
007    "License"); you may not use this file except in compliance
008    with the License.  You may obtain a copy of the License at
009
010       http://www.apache.org/licenses/LICENSE-2.0
011
012    Unless required by applicable law or agreed to in writing,
013    software distributed under the License is distributed on an
014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015    KIND, either express or implied.  See the License for the
016    specific language governing permissions and limitations
017    under the License.
018 */
019package org.apache.wiki.htmltowiki.syntax;
020
021import org.apache.wiki.htmltowiki.XHtmlElementToWikiTranslator;
022import org.apache.wiki.htmltowiki.XHtmlToWikiConfig;
023import org.jdom2.Element;
024import org.jdom2.JDOMException;
025
026import java.io.PrintWriter;
027import java.util.Map;
028
029
030/**
031 * Translates to wiki syntax from an {@code A} element.
032 */
033public abstract class ADecorator {
034
035    final protected PrintWriter out;
036    final protected XHtmlToWikiConfig config;
037    final protected XHtmlElementToWikiTranslator chain;
038
039    protected ADecorator( final PrintWriter out, final XHtmlToWikiConfig config, final XHtmlElementToWikiTranslator chain ) {
040        this.out = out;
041        this.config = config;
042        this.chain = chain;
043    }
044
045    /**
046     * Translates the given XHTML element into wiki markup.
047     *
048     * @param e XHTML element being translated.
049     */
050    public void decorate( final Element e, final String ref ) throws JDOMException {
051        final Map< String, String > augmentedWikiLinkAttributes = MarkupHelper.getAugmentedWikiLinkAttributes( e );
052        if( containsAdditionalLinkAttributes( augmentedWikiLinkAttributes ) ) {
053            final String augmentedWikiLink = MarkupHelper.augmentedWikiLinkMapToString( augmentedWikiLinkAttributes );
054            linkMarkup( e, ref, augmentedWikiLink );
055        } else if( !e.getTextTrim().equalsIgnoreCase( ref ) ) {
056            linkMarkup( e, ref );
057        } else {
058            linkMarkup( e );
059        }
060    }
061
062    boolean containsAdditionalLinkAttributes( final Map< String, String > augmentedWikiLinkAttributes ) {
063        return !augmentedWikiLinkAttributes.isEmpty();
064    }
065
066    /**
067     * Translate a link to a footnote to wiki syntax.
068     *
069     * @param text link's text
070     * @param href link's href
071     */
072    public void decorateFootnote( final String text, final String href ) {
073        linkMarkup( text, href );
074    }
075
076    /**
077     * Translate an undefined link to wiki syntax.
078     *
079     * @param e element being translated.
080     */
081    public void decorateUndefinedLink( final Element e ) throws JDOMException {
082        linkMarkup( e );
083    }
084
085    /**
086     * Provide wiki markup for the XHTML element being translated.
087     *
088     * @param e element being translated.
089     * @throws JDOMException error parsing the element being translated.
090     */
091    protected abstract void linkMarkup( Element e ) throws JDOMException;
092
093    /**
094     * Provide wiki markup for the XHTML element being translated.
095     *
096     * @param e element being translated.
097     * @param ref link's href.
098     * @throws JDOMException error parsing the element being translated.
099     */
100    protected abstract void linkMarkup( Element e, String ref ) throws JDOMException;
101
102    /**
103     * Provide wiki markup for the XHTML element being translated.
104     *
105     * @param e element being translated.
106     * @param ref link's href.
107     * @param additionalAttrs link's additional attributes.
108     * @throws JDOMException error parsing the element being translated.
109     */
110    protected abstract void linkMarkup( Element e, String ref, String additionalAttrs ) throws JDOMException;
111
112    /**
113     * Provide wiki markup for the XHTML element being translated.
114     *
115     * @param text link's text
116     * @param ref link's href - might be equals to {@code text}!
117     */
118    protected abstract void linkMarkup( String text, String ref );
119
120}