001/**
002 *   GRANITE DATA SERVICES
003 *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 *   This file is part of the Granite Data Services Platform.
006 *
007 *   Granite Data Services is free software; you can redistribute it and/or
008 *   modify it under the terms of the GNU Lesser General Public
009 *   License as published by the Free Software Foundation; either
010 *   version 2.1 of the License, or (at your option) any later version.
011 *
012 *   Granite Data Services is distributed in the hope that it will be useful,
013 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
014 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 *   General Public License for more details.
016 *
017 *   You should have received a copy of the GNU Lesser General Public
018 *   License along with this library; if not, write to the Free Software
019 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 *   USA, or see <http://www.gnu.org/licenses/>.
021 */
022
023package org.granite.generator.gsp;
024
025import java.util.List;
026
027import org.granite.generator.gsp.token.Comment;
028import org.granite.generator.gsp.token.Expression;
029import org.granite.generator.gsp.token.Scriplet;
030import org.granite.generator.gsp.token.TemplateText;
031import org.granite.generator.gsp.token.Token;
032
033/**
034 * @author Franck WOLFF
035 */
036public class GroovyRenderer implements Renderer {
037
038    private String source = null;
039
040    @Override
041        public String renderSource(List<Token> tokens) {
042        return renderSource(tokens, null);
043    }
044
045    @Override
046        public String renderSource(List<Token> tokens, String out) {
047        StringBuilder sb = new StringBuilder(1024);
048
049        for (Token token : tokens) {
050            if (token instanceof TemplateText) {
051                String content = token.getContent();
052
053                if (content.length() > 0) {
054                    int iLast = content.length() - 1;
055                    sb.append("print(\"");
056
057                    for (int i = 0; i < content.length(); i++) {
058                        char c = content.charAt(i);
059
060                        switch (c) {
061                        case '\\':
062                            sb.append("\\\\");
063                            break;
064                        case '"' :
065                            sb.append("\\\"");
066                            break;
067                        case '\n':
068                            sb.append("\\n\");\n");
069                            if (i < iLast)
070                                sb.append("print(\"");
071                            break;
072                        case '\f':
073                            sb.append("\\f");
074                            break;
075                        default  :
076                            sb.append(c);
077                            break;
078                        }
079                    }
080
081                    if (content.charAt(iLast) != '\n')
082                        sb.append("\");\n");
083                }
084            }
085            else if (token instanceof Expression)
086                sb.append("print(").append(token.getContent()).append(");\n");
087            else if (token instanceof Scriplet)
088                sb.append(token.getContent()).append('\n');
089            else if (!(token instanceof Comment))
090                throw new UnsupportedOperationException("Unsupported token (not implemented): " + token);
091        }
092
093        source = sb.toString();
094
095        return source;
096    }
097
098    @Override
099        public String getSource() {
100        return source;
101    }
102}