/******************************************************************************* * PSHDL is a library and (trans-)compiler for PSHDL input. It generates * output suitable for implementation or simulation of it. * * Copyright (C) 2013 Karsten Becker (feedback (at) pshdl (dot) org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * This License does not grant permission to use the trade names, trademarks, * service marks, or product names of the Licensor, except as required for * reasonable and customary use in describing the origin of the Work. * * Contributors: * Karsten Becker - initial API and implementation ******************************************************************************/ package org.pshdl.model.utils; import java.util.Stack; import org.pshdl.model.HDLVariable; import org.pshdl.model.HDLVariableRef; import org.pshdl.model.IHDLObject; import org.pshdl.model.parser.SourceInfo; public class SyntaxHighlighter { public static class HTMLHighlighter extends SyntaxHighlighter { private final boolean preContext; public HTMLHighlighter(boolean preContext) { this.preContext = preContext; } @Override public StringBuilder getSpacing() { final StringBuilder sb = new StringBuilder(); for (int i = spacing; i > 0; i--) { sb.append("   "); } return sb; } @Override public String newLine() { if (preContext) return "\n"; return "<br />\n"; } @Override public String simpleSpace() { return " "; } @Override public String literal(String literal) { return span(super.literal(literal), "literal"); } @Override public String keyword(String key) { return span(super.keyword(key), "keyword"); } @Override public String width(String width) { return "<" + width.substring(1, width.length() - 1) + ">"; } @Override public String generatorContent(String generatorID, String generatorContent) { return "<" + generatorContent.substring(1, generatorContent.length() - 1) + ">"; } private String span(String key, String clazz) { return "<span class='" + clazz + "'>" + key + "</span>"; } @Override public String annotation(String name) { return span(super.annotation(name), "annotation"); } } private final boolean includeComments; public SyntaxHighlighter() { this(false); } public SyntaxHighlighter(boolean includeComments) { this.includeComments = includeComments; } public static enum Context { HDLPackage, HDLUnit, HDLStatement, HDLExpression, HDLInterface; } private final Stack<Context> context = new Stack<SyntaxHighlighter.Context>(); protected int spacing = 0; public StringBuilder getSpacing() { final StringBuilder sb = new StringBuilder(); for (int i = spacing; i > 0; i--) { sb.append('\t'); } return sb; } public void incSpacing() { spacing++; } public void decSpacing() { spacing--; } public static final SyntaxHighlighter none(boolean includeComments) { return new SyntaxHighlighter(includeComments); } public static final SyntaxHighlighter none() { return new SyntaxHighlighter(); } public String leaving(IHDLObject obj) { return ""; } public String entering(IHDLObject obj) { if (includeComments) { final SourceInfo meta = obj.getMeta(SourceInfo.INFO); if ((meta != null) && !meta.comments.isEmpty()) { final StringBuilder sb = new StringBuilder(); for (final String comment : meta.comments) { sb.append(comment); } return sb.toString(); } } return ""; } public String annotation(String name) { return name; } public String string(String string) { return string; } public String operator(String op) { return op; } public String functionCall(String nameRefName) { return nameRefName; } public String keyword(String key) { return key; } public String simpleSpace() { return " "; } public String functionDecl(String name) { return name; } public String varName(HDLVariable var) { return var.getName(); } public String interfaceRef(String ifRef) { return ifRef; } public String variableRefName(HDLVariableRef ref) { return ref.getVarRefName().getLastSegment(); } public String literal(String literal) { return literal; } public String width(String width) { return width; } public String newLine() { return "\n"; } public String direction(String dir) { return keyword(dir); } public String interfaceName(String name) { return name; } public String enumRefType(String type) { return type; } public String enumRefVar(String varRefName) { return varRefName; } public String enumName(String name) { return name; } public String variableRefName(HDLQualifiedName refName) { return refName.toString(); } public String param(String param) { return param; } public String packageName(String pkg) { return pkg; } public String unitName(String name) { return name; } public String importName(String imports) { return imports; } public String generatorID(String generatorID) { return generatorID; } public String generatorContent(String generatorID, String generatorContent) { return generatorContent; } public void pushContext(Context context) { this.context.push(context); } public Context getContext() { if (context.isEmpty()) return null; return context.peek(); } public Context popContext() { return context.pop(); } public String primitiveType(String prim) { return keyword(prim); } }