From b17d8216761112dd1c77f67518d5291cbc642d87 Mon Sep 17 00:00:00 2001 From: Tim O'Brien Date: Tue, 31 May 2011 06:26:25 -0500 Subject: [PATCH] Initial commit (because someone deleted the original project) --- .gitignore | 6 + pom.xml | 41 +++++ .../org/sonatype/book/#VelocityMerger.java# | 46 ++++++ .../org/sonatype/book/ContentHandler.java | 49 ++++++ .../org/sonatype/book/MeshVelocityMojo.java | 68 ++++++++ .../sonatype/book/SiteMeshPageExtractor.java | 154 ++++++++++++++++++ .../org/sonatype/book/VelocityMerger.java | 49 ++++++ 7 files changed, 413 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/org/sonatype/book/#VelocityMerger.java# create mode 100644 src/main/java/org/sonatype/book/ContentHandler.java create mode 100644 src/main/java/org/sonatype/book/MeshVelocityMojo.java create mode 100644 src/main/java/org/sonatype/book/SiteMeshPageExtractor.java create mode 100644 src/main/java/org/sonatype/book/VelocityMerger.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc1e327 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*~ +target +.classpath +.settings +.project +.versionsBackup \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..044bcfc --- /dev/null +++ b/pom.xml @@ -0,0 +1,41 @@ + + 4.0.0 + org.sonatype.book + book-sitemesh-plugin + maven-plugin + maven-book-sitemesh-plugin Maven Mojo + 1.1-SNAPSHOT + http://maven.apache.org + + + org.apache.maven + maven-plugin-api + 2.0 + + + junit + junit + 3.8.1 + test + + + org.apache.velocity + velocity + 1.6.1 + jar + compile + + + opensymphony + sitemesh + 2.4 + jar + compile + + + commons-io + commons-io + 1.4 + + + diff --git a/src/main/java/org/sonatype/book/#VelocityMerger.java# b/src/main/java/org/sonatype/book/#VelocityMerger.java# new file mode 100644 index 0000000..28dd915 --- /dev/null +++ b/src/main/java/org/sonatype/book/#VelocityMerger.java# @@ -0,0 +1,46 @@ +package org.sonatype.book; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.Reader; +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +public class VelocityMerger { + + private File velocityTemplate; + + public VelocityMerger(File velocityTemplate) { + this.velocityTemplate = velocityTemplate; + } + + public void mergeFile( File htmlFile, SiteMeshPageExtractor extractor ) throws Exception { + + + Velocity.setProperty("input.encoding", "UTF-8"); + Velocity.setProperty("output.encoding", "UTF-8"); + Velocity.setProperty("response.encoding", "UTF-8"); + Velocity.init(); + + VelocityContext context = new VelocityContext(); + context.put( "title", extractor.getProperties().get("title") ); + context.put( "head", extractor.getHead() ); + context.put( "body", extractor.getBody() ); + context. + + Reader template = new FileReader( velocityTemplate ); + + StringWriter writer = new StringWriter(); + + Velocity.evaluate( context, writer, "MERGE", template ); + + FileWriter output = new FileWriter( htmlFile ); + IOUtils.write( writer.toString(), output ); + output.close(); + } + +} diff --git a/src/main/java/org/sonatype/book/ContentHandler.java b/src/main/java/org/sonatype/book/ContentHandler.java new file mode 100644 index 0000000..e9e1b49 --- /dev/null +++ b/src/main/java/org/sonatype/book/ContentHandler.java @@ -0,0 +1,49 @@ +package org.sonatype.book; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.util.Collection; + +import org.apache.commons.io.DirectoryWalker; +import org.apache.commons.io.filefilter.IOFileFilter; + +public class ContentHandler extends DirectoryWalker { + + private VelocityMerger velocityMerger; + + public ContentHandler(IOFileFilter directoryFilter, + IOFileFilter fileFilter, int depthLimit, VelocityMerger vMerger) { + super(directoryFilter, fileFilter, depthLimit); + this.velocityMerger = vMerger; + } + + + + @Override + protected boolean handleDirectory(File directory, int depth, + Collection results) throws IOException { + return true; + } + + + + @Override + protected void handleFile(File file, int depth, Collection results) + throws IOException { + SiteMeshPageExtractor extractor = new SiteMeshPageExtractor(); + extractor.parse( file ); + + try { + velocityMerger.mergeFile( file, extractor ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + public void go(File dir, Collection results) throws IOException { + walk( dir, results); + } +} diff --git a/src/main/java/org/sonatype/book/MeshVelocityMojo.java b/src/main/java/org/sonatype/book/MeshVelocityMojo.java new file mode 100644 index 0000000..6f5f322 --- /dev/null +++ b/src/main/java/org/sonatype/book/MeshVelocityMojo.java @@ -0,0 +1,68 @@ +package org.sonatype.book; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Properties; + +import org.apache.commons.io.DirectoryWalker; +import org.apache.commons.io.filefilter.FileFilterUtils; +import org.apache.commons.io.filefilter.HiddenFileFilter; +import org.apache.commons.io.filefilter.IOFileFilter; + +/** + * @goal mesh-velocity + * + * @phase test + */ +public class MeshVelocityMojo extends AbstractMojo { + /** + * Location of the file. + * + * @parameter expression="${basedir}/target/site" + * @required + */ + private File htmlDirectory; + + /** + * Velocity Template + * + * @parameter + * @required + */ + private File velocityTemplate; + + /** + * Book Title + * + * @parameter + * @required + */ + private String bookTitle; + + public void execute() throws MojoExecutionException { + + // Create a filter for Non-hidden directories + IOFileFilter fooDirFilter = FileFilterUtils + .andFileFilter(FileFilterUtils.directoryFileFilter(), + HiddenFileFilter.VISIBLE); + + Properties properties = new Properties(); + properties.put( "bookTitle", bookTitle); + + ContentHandler handler = new ContentHandler(fooDirFilter, + FileFilterUtils.suffixFileFilter(".html"), -1, + new VelocityMerger(velocityTemplate, properties)); + try { + handler.go(htmlDirectory, new ArrayList()); + } catch (IOException e) { + throw new MojoExecutionException("Problem during directory scan", e); + } + + } +} diff --git a/src/main/java/org/sonatype/book/SiteMeshPageExtractor.java b/src/main/java/org/sonatype/book/SiteMeshPageExtractor.java new file mode 100644 index 0000000..b0af562 --- /dev/null +++ b/src/main/java/org/sonatype/book/SiteMeshPageExtractor.java @@ -0,0 +1,154 @@ + package org.sonatype.book; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; + +import com.opensymphony.module.sitemesh.html.BasicRule; +import com.opensymphony.module.sitemesh.html.HTMLProcessor; +import com.opensymphony.module.sitemesh.html.Tag; +import com.opensymphony.module.sitemesh.html.TagRule; +import com.opensymphony.module.sitemesh.html.TextFilter; +import com.opensymphony.module.sitemesh.html.rules.BodyTagRule; +import com.opensymphony.module.sitemesh.html.rules.HeadExtractingRule; +import com.opensymphony.module.sitemesh.html.rules.MetaTagRule; +import com.opensymphony.module.sitemesh.html.rules.PageBuilder; +import com.opensymphony.module.sitemesh.html.rules.TitleExtractingRule; +import com.opensymphony.module.sitemesh.html.util.CharArray; + +/** + * PageExtractor which extract page information from an HTML file using the SiteMesh library. + * + * @author Joe Walnes + * @author Jörg Schaible + */ +public class SiteMeshPageExtractor +{ + private Properties properties; + private String filename; + private String head; + private String body; + private List links; + private final TagRule[] rules; + private final TextFilter[] filter; + + public SiteMeshPageExtractor() + { + rules = new TagRule[0]; + filter = new TextFilter[0]; + links = new ArrayList(); + } + + public void parse(File htmlFile) { + try { + extractContentFromHTML( FileUtils.readFileToString( htmlFile ).toCharArray() ); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void extractContentFromHTML( char[] rawHTML ) throws IOException + { + // where to dump properties extracted from the page + properties = new Properties(); + PageBuilder pageBuilder = new PageBuilder() + { + public void addProperty( String key, String value ) + { + properties.setProperty( key, value ); + } + }; + + // buffers to hold head and body content + CharArray headBuffer = new CharArray( 64 ); + CharArray bodyBuffer = new CharArray( 4096 ); + + // setup rules for html processor + HTMLProcessor htmlProcessor = new HTMLProcessor( rawHTML, bodyBuffer ); + htmlProcessor.addRule( new BodyTagRule( pageBuilder, bodyBuffer ) ); + htmlProcessor.addRule( new HeadExtractingRule( headBuffer ) ); + htmlProcessor.addRule( new TitleExtractingRule( pageBuilder ) ); + htmlProcessor.addRule( new MetaTagRule( pageBuilder ) ); + htmlProcessor.addRule( new LinkExtractingRule() ); + + for ( int i = 0; i < rules.length; i++ ) + { + htmlProcessor.addRule( rules[i] ); + } + for ( int i = 0; i < filter.length; i++ ) + { + htmlProcessor.addTextFilter( filter[i] ); + } + + // go! + htmlProcessor.process(); + this.head = headBuffer.toString(); + this.body = bodyBuffer.toString(); + } + + public static class CannotParsePageException extends RuntimeException + { + public CannotParsePageException( Throwable cause ) + { + super( cause ); + } + } + + /** Rule for HTMLProcessor that records all links. */ + private class LinkExtractingRule extends BasicRule + { + + public boolean shouldProcess( String tag ) + { + return tag.equalsIgnoreCase( "a" ); + } + + public void process( Tag tag ) + { + if ( tag.hasAttribute( "href", false ) ) + { + links.add( tag.getAttributeValue( "href", false ) ); + } + tag.writeTo( currentBuffer() ); + } + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getHead() { + return head; + } + + public void setHead(String head) { + this.head = head; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + + +} diff --git a/src/main/java/org/sonatype/book/VelocityMerger.java b/src/main/java/org/sonatype/book/VelocityMerger.java new file mode 100644 index 0000000..b8940de --- /dev/null +++ b/src/main/java/org/sonatype/book/VelocityMerger.java @@ -0,0 +1,49 @@ +package org.sonatype.book; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.Reader; +import java.io.StringWriter; +import java.util.Properties; + +import org.apache.commons.io.IOUtils; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +public class VelocityMerger { + + private File velocityTemplate; + private Properties properties; + + public VelocityMerger(File velocityTemplate, Properties properties) { + this.velocityTemplate = velocityTemplate; + this.properties = properties; + } + + public void mergeFile( File htmlFile, SiteMeshPageExtractor extractor ) throws Exception { + Velocity.setProperty("input.encoding", "UTF-8"); + Velocity.setProperty("output.encoding", "UTF-8"); + Velocity.setProperty("response.encoding", "UTF-8"); + Velocity.init(); + + VelocityContext context = new VelocityContext(); + context.put( "title", extractor.getProperties().get("title") ); + context.put( "head", extractor.getHead() ); + context.put( "body", extractor.getBody() ); + for( Object key : properties.keySet() ) { + context.put( (String) key, properties.get(key)); + } + + Reader template = new FileReader( velocityTemplate ); + + StringWriter writer = new StringWriter(); + + Velocity.evaluate( context, writer, "MERGE", template ); + + FileWriter output = new FileWriter( htmlFile ); + IOUtils.write( writer.toString(), output ); + output.close(); + } + +}