/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.demo.components.sh; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import javax.faces.FacesException; import javax.faces.application.ResourceDependencies; import javax.faces.application.ResourceDependency; import javax.faces.component.FacesComponent; import javax.faces.component.UIComponentBase; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import org.ajax4jsf.javascript.JSFunction; @FacesComponent(value = "syntaxHighlighter") @ResourceDependencies({ @ResourceDependency(library = "org.richfaces", name = "jquery.js"), @ResourceDependency(library = "js", name = "xregexp.js"), @ResourceDependency(library = "js", name = "shCore.js"), @ResourceDependency(library = "js", name = "shBrushJScript.js"), @ResourceDependency(library = "js", name = "shBrushJava.js"), @ResourceDependency(library = "js", name = "shBrushXml.js"), @ResourceDependency(library = "js", name = "shBrushCss.js"), @ResourceDependency(library = "js", name = "shBrushPlain.js"), @ResourceDependency(library = "css", name = "shCore.css"), @ResourceDependency(library = "css", name = "shThemeDefault.css")}) public class SyntaxHighlighter extends UIComponentBase { private static final String COMPONENT_FAMILY = "org.richfaces.SyntaxHighlighter"; private static final String DEFAULT_SOURCE_TYPE = "xhtml"; enum propertyKeys { sourceType, src, style, styleClass } ; @Override public String getFamily() { return COMPONENT_FAMILY; } private void renderStream(FacesContext context, InputStream stream) throws IOException { ResponseWriter writer = context.getResponseWriter(); InputStreamReader in = new InputStreamReader(stream); char[] temp = new char[1024]; try { int bytes; while ((bytes = in.read(temp)) > 0) { writer.writeText(temp, 0, bytes); } } catch (IOException e) { throw new FacesException(e); } finally { in.close(); } } private void renderLabel(FacesContext context, String label) throws IOException { ResponseWriter writer = context.getResponseWriter(); writer.writeText(label.toCharArray(), 0, label.length()); } private void renderContent(FacesContext context) throws IOException { ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); String src = getSrc(); if (src != null) { InputStream stream = ec.getResourceAsStream(src); if (stream != null) { renderStream(context, stream); } else { renderLabel(context, "resource for highlight not found"); } } else { renderLabel(context, "src may not be null"); } } @Override public void encodeEnd(FacesContext context) throws IOException { ResponseWriter writer = context.getResponseWriter(); writer.startElement("div", null); writer.writeAttribute("id", this.getClientId(context), null); writer.writeAttribute("class", this.getStyleClass(), null); writer.writeAttribute("style", this.getStyle(), null); writer.startElement("pre", null); writer.writeAttribute("class", new StringBuffer().append("brush: ").append(this.getSourceType()), null); renderContent(context); writer.endElement("pre"); JSFunction function = new JSFunction("SyntaxHighlighter.all"); writer.startElement("script", null); writer.writeAttribute("type", "text/javascript", null); writer.write("var brs = $('#" + this.getClientId(context).replaceAll(":", "\\\\\\\\:") + "').find('br');"); writer.write("brs.length && brs.replaceWith('\\n');"); writer.write(function.toScript()); writer.endElement("script"); writer.endElement("div"); } public String getSourceType() { return (String) getStateHelper().eval(propertyKeys.sourceType, DEFAULT_SOURCE_TYPE); } public void setSourceType(String sourceType) { getStateHelper().put(propertyKeys.sourceType, sourceType); } public String getSrc() { return (String) getStateHelper().eval(propertyKeys.src); } public void setSrc(String src) { getStateHelper().put(propertyKeys.src, src); } public String getStyle() { return (String) getStateHelper().eval(propertyKeys.style); } public void setStyle(String style) { getStateHelper().put(propertyKeys.style, style); } public String getStyleClass() { return (String) getStateHelper().eval(propertyKeys.styleClass); } public void setStyleClass(String styleClass) { getStateHelper().put(propertyKeys.styleClass, styleClass); } }