diff options
Diffstat (limited to 'velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java')
-rw-r--r-- | velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java b/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java new file mode 100644 index 00000000..1c7e0b2d --- /dev/null +++ b/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java @@ -0,0 +1,72 @@ +package org.apache.velocity.app.event.implement; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.velocity.app.event.IncludeEventHandler; +import org.apache.velocity.context.Context; + +/** + * <p>Event handler that looks for included files relative to the path of the + * current template. The handler assumes that paths are separated by a forward + * slash "/" or backwards slash "\". + * + * @author <a href="mailto:wglass@forio.com">Will Glass-Husain </a> + * @version $Id$ + * @since 1.5 + */ +public class IncludeRelativePath implements IncludeEventHandler { + + /** + * Return path relative to the current template's path. + * + * @param includeResourcePath the path as given in the include directive. + * @param currentResourcePath the path of the currently rendering template that includes the + * include directive. + * @param directiveName name of the directive used to include the resource. (With the + * standard directives this is either "parse" or "include"). + + * @return new path relative to the current template's path + */ + @Override + public String includeEvent( + Context context, + String includeResourcePath, + String currentResourcePath, + String directiveName) + { + // if the resource name starts with a slash, it's not a relative path + if (includeResourcePath.startsWith("/") || includeResourcePath.startsWith("\\") ) { + return includeResourcePath; + } + + int lastslashpos = Math.max( + currentResourcePath.lastIndexOf("/"), + currentResourcePath.lastIndexOf("\\") + ); + + // root of resource tree + if (lastslashpos == -1) { + return includeResourcePath; + } + + // prepend path to the include path + return currentResourcePath.substring(0,lastslashpos) + "/" + includeResourcePath; + } +} |