/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.help.internal.toc; import org.eclipse.core.runtime.Path; public class HrefUtil { private static final String PLUGINS_ROOT_SLASH = "PLUGINS_ROOT/"; //$NON-NLS-1$ /** * Creates /pluginid/directory from directory name */ public static String normalizeDirectoryHref(String pluginID, String dir) { // "" is treated as if extra directory was not provided if (dir == null || dir.length() <= 0) return null; // "." means all the files in the plugin if (".".equals(dir)) //$NON-NLS-1$ dir = ""; //$NON-NLS-1$ // remove not needed trailing separator if (dir.length() > 0 && dir.lastIndexOf('/') == dir.length() - 1) { dir = dir.substring(0, dir.length() - 1); } return normalizeHref(pluginID, dir); } /** * Creates /pluginid/href from href relative to the current plugin * * @param pluginID * id of a plugin to which href is relative * @param href * relative href ex: path[#anchorID] ex: * ../pluginID/path[#anchorID] * @return String representation of href, formatted as * /pluginID/path[#anchorID] */ public final static String normalizeHref(String pluginID, String href) { if (href == null) return null; if (href.startsWith("http:") //$NON-NLS-1$ || href.startsWith("https:") //$NON-NLS-1$ || href.startsWith("file:") //$NON-NLS-1$ || href.startsWith("jar:")) //$NON-NLS-1$ // external doc return href; href = normalizeDirectoryPath(href); if (href.startsWith("/")) //$NON-NLS-1$ // already normalized return href; if (href.startsWith("../")) { //$NON-NLS-1$ return href.substring(2); } if (href.startsWith(PLUGINS_ROOT_SLASH)) { return href.substring(PLUGINS_ROOT_SLASH.length() - 1); } if (href.length() > 0) { StringBuffer buf = new StringBuffer(2 + pluginID.length() + href.length()); buf.append('/').append(pluginID); buf.append('/').append(href); return buf.toString(); } return "/" + pluginID; //$NON-NLS-1$ } /** * Parses href and obtains plugin id * * @param href * String in format /string1[/string2] * @return plugin ID, or null */ public static String getPluginIDFromHref(String href) { if (href == null || href.length() < 2 || href.charAt(0) != '/') return null; int secondSlashIx = href.indexOf("/", 1); //$NON-NLS-1$ if (secondSlashIx < 0) // href is /pluginID return href.substring(1); // href is /pluginID/path[#anchorID] return href.substring(1, secondSlashIx); } /** * Parses href and obtains resource path relative to the plugin * * @param href * String in format /string1[/[string2]][#string3] * @return relative resource path, or null */ public static String getResourcePathFromHref(String href) { if (href == null) return null; // drop anchor id int anchorIx = href.lastIndexOf("#"); //$NON-NLS-1$ if (anchorIx >= 0) //anchor exists, drop it href = href.substring(0, anchorIx); if (href.length() < 2 || href.charAt(0) != '/') return null; int secondSlashIx = href.indexOf("/", 1); //$NON-NLS-1$ if (secondSlashIx < 0) // href is /pluginID return null; if (secondSlashIx + 1 < href.length()) // href is /pluginID/path return href.substring(secondSlashIx + 1); // href is /pluginID/ return ""; //$NON-NLS-1$ } /** * Parses directory path and obtains simple form path * * @param href * directory path in format a/../c/1 or a//b/c * to /c/1 and a/b/c * @return normalized directory path, or null */ public static String normalizeDirectoryPath(String href) { if (href != null) { return new Path(href).toString(); } return null; } }