📄 miscutilities.java
字号:
/* * MiscUtilities.java - Various miscallaneous utility functions * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 1999, 2000, 2001 Slava Pestov * Portions copyright (C) 2000 Richard S. Hall * Portions copyright (C) 2001 Dirk Moebius * * 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 2 * of the License, or 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */package org.gjt.sp.jedit;//{{{ Importsimport javax.swing.text.Segment;import javax.swing.JMenuItem;import java.io.*;import java.util.*;import org.gjt.sp.jedit.io.*;import org.gjt.sp.util.Log;//}}}/** * Path name manipulation, string manipulation, and more.<p> * * The most frequently used members of this class are:<p> * * <b>Some path name methods:</b><p> * <ul> * <li>{@link #getFileName(String)}</li> * <li>{@link #getParentOfPath(String)}</li> * <li>{@link #constructPath(String,String)}</li> * </ul> * <b>String comparison:</b><p> * A {@link #compareStrings(String,String,boolean)} method that unlike * <function>String.compareTo()</function>, correctly recognizes and handles * embedded numbers.<p> * * This class also defines several inner classes for use with the * sorting features of the Java collections API: * * <ul> * <li>{@link MiscUtilities.StringCompare}</li> * <li>{@link MiscUtilities.StringICaseCompare}</li> * <li>{@link MiscUtilities.MenuItemCompare}</li> * </ul> * * For example, you might call:<p> * * <code>Arrays.sort(myListOfStrings, * new MiscUtilities.StringICaseCompare());</code> * * @author Slava Pestov * @author John Gellene (API documentation) * @version $Id: MiscUtilities.java,v 1.35 2003/02/20 01:55:12 spestov Exp $ */public class MiscUtilities{ //{{{ Path name methods //{{{ canonPath() method /** * Returns the canonical form of the specified path name. Currently * only expands a leading <code>~</code>. <b>For local path names * only.</b> * @param path The path name * @since jEdit 4.0pre2 */ public static String canonPath(String path) { if(File.separatorChar == '\\') { // get rid of mixed paths on Windows path = path.replace('/','\\'); } if(path.startsWith("~" + File.separator)) { path = path.substring(2); String home = System.getProperty("user.home"); if(home.endsWith(File.separator)) return home + path; else return home + File.separator + path; } else if(path.equals("~")) return System.getProperty("user.home"); else return path; } //}}} //{{{ isPathAbsolute() method /** * Returns if the specified path name is an absolute path or URL. * @since jEdit 4.1pre11 */ public static boolean isAbsolutePath(String path) { if(isURL(path)) return true; else if(OperatingSystem.isDOSDerived()) { if(path.length() >= 2 && path.charAt(1) == ':') return true; if(path.startsWith("\\\\")) return true; } else if(OperatingSystem.isUnix()) { // nice and simple if(path.length() > 0 && path.charAt(0) == '/') return true; } return false; } //}}} //{{{ constructPath() method /** * Constructs an absolute path name from a directory and another * path name. This method is VFS-aware. * @param parent The directory * @param path The path name */ public static String constructPath(String parent, String path) { if(MiscUtilities.isURL(path)) return path; else if(path.startsWith("~")) return path; else { // have to handle these cases specially on windows. if(OperatingSystem.isDOSDerived()) { if(path.length() == 2 && path.charAt(1) == ':') return path; else if(path.length() > 2 && path.charAt(1) == ':') { if(path.charAt(2) != '\\') { path = path.substring(0,2) + '\\' + path.substring(2); } return resolveSymlinks(path); } else if(path.startsWith("\\\\")) return resolveSymlinks(path); } else if(OperatingSystem.isUnix()) { // nice and simple if(path.length() > 0 && path.charAt(0) == '/') return resolveSymlinks(path); } } if(parent == null) parent = System.getProperty("user.dir"); if(OperatingSystem.isDOSDerived() && path.startsWith("\\")) parent = parent.substring(0,2); VFS vfs = VFSManager.getVFSForPath(parent); return vfs.constructPath(parent,path); } //}}} //{{{ constructPath() method /** * Constructs an absolute path name from three path components. * This method is VFS-aware. * @param parent The parent directory * @param path1 The first path * @param path2 The second path */ public static String constructPath(String parent, String path1, String path2) { return constructPath(constructPath(parent,path1),path2); } //}}} //{{{ concatPath() method /** * Like {@link #constructPath}, except <code>path</code> will be * appended to <code>parent</code> even if it is absolute. * @param path * @param parent */ public static String concatPath(String parent, String path) { parent = canonPath(parent); path = canonPath(path); // Make all child paths relative. if (path.startsWith(File.separator)) path = path.substring(1); else if ((path.length() >= 3) && (path.charAt(1) == ':')) path = path.replace(':', File.separatorChar); if (parent == null) parent = System.getProperty("user.dir"); if (parent.endsWith(File.separator)) return parent + path; else return parent + File.separator + path; } //}}} //{{{ getFileExtension() method /** * Returns the extension of the specified filename, or an empty * string if there is none. * @param name The file name */ public static String getFileExtension(String name) { int index = name.indexOf('.'); if(index == -1) return ""; else return name.substring(index); } //}}} //{{{ getFileName() method /** * Returns the last component of the specified path. * This method is VFS-aware. * @param path The path name */ public static String getFileName(String path) { return VFSManager.getVFSForPath(path).getFileName(path); } //}}} //{{{ getFileNameNoExtension() method /** * Returns the last component of the specified path name without the * trailing extension (if there is one). * @param path The path name * @since jEdit 4.0pre8 */ public static String getFileNameNoExtension(String path) { String name = getFileName(path); int index = name.lastIndexOf('.'); if(index == -1) return name; else return name.substring(0,index); } //}}} //{{{ getFileParent() method /** * @deprecated Call getParentOfPath() instead */ public static String getFileParent(String path) { return getParentOfPath(path); } //}}} //{{{ getParentOfPath() method /** * Returns the parent of the specified path. This method is VFS-aware. * @param path The path name * @since jEdit 2.6pre5 */ public static String getParentOfPath(String path) { return VFSManager.getVFSForPath(path).getParentOfPath(path); } //}}} //{{{ getFileProtocol() method /** * @deprecated Call getProtocolOfURL() instead */ public static String getFileProtocol(String url) { return getProtocolOfURL(url); } //}}} //{{{ getProtocolOfURL() method /** * Returns the protocol specified by a URL. * @param url The URL * @since jEdit 2.6pre5 */ public static String getProtocolOfURL(String url) { return url.substring(0,url.indexOf(':')); } //}}} //{{{ isURL() method /** * Checks if the specified string is a URL. * @param str The string to check * @return True if the string is a URL, false otherwise */ public static boolean isURL(String str) { int fsIndex = Math.max(str.indexOf(File.separatorChar), str.indexOf('/')); if(fsIndex == 0) // /etc/passwd return false; else if(fsIndex == 2) // C:\AUTOEXEC.BAT return false; int cIndex = str.indexOf(':'); if(cIndex <= 1) // D:\WINDOWS return false; else if(fsIndex != -1 && cIndex > fsIndex) // /tmp/RTF::read.pm return false; return true; } //}}} //{{{ saveBackup() method /** * Saves a backup (optionally numbered) of a file. * @param file A local file * @param backups The number of backups. Must be >= 1. If > 1, backup * files will be numbered. * @param backupPrefix The backup file name prefix * @param backupSuffix The backup file name suffix * @param backupDirectory The directory where to save backups; if null, * they will be saved in the same directory as the file itself. * @since jEdit 4.0pre1 */ public static void saveBackup(File file, int backups, String backupPrefix, String backupSuffix, String backupDirectory) { if(backupPrefix == null) backupPrefix = ""; if(backupSuffix == null) backupSuffix = ""; String name = file.getName(); // If backups is 1, create ~ file if(backups == 1) { File backupFile = new File(backupDirectory, backupPrefix + name + backupSuffix); backupFile.delete(); file.renameTo(backupFile); } // If backups > 1, move old ~n~ files, create ~1~ file else { new File(backupDirectory, backupPrefix + name + backupSuffix + backups + backupSuffix).delete(); for(int i = backups - 1; i > 0; i--) { File backup = new File(backupDirectory, backupPrefix + name + backupSuffix + i + backupSuffix); backup.renameTo(new File(backupDirectory, backupPrefix + name + backupSuffix + (i+1) + backupSuffix)); } file.renameTo(new File(backupDirectory, backupPrefix + name + backupSuffix + "1" + backupSuffix)); } } //}}} //{{{ fileToClass() method /** * Converts a file name to a class name. All slash characters are * replaced with periods and the trailing '.class' is removed. * @param name The file name */ public static String fileToClass(String name) { char[] clsName = name.toCharArray(); for(int i = clsName.length - 6; i >= 0; i--) if(clsName[i] == '/') clsName[i] = '.'; return new String(clsName,0,clsName.length - 6); } //}}} //{{{ classToFile() method /** * Converts a class name to a file name. All periods are replaced * with slashes and the '.class' extension is added. * @param name The class name */ public static String classToFile(String name) { return name.replace('.','/').concat(".class"); } //}}} //}}} //{{{ Text methods //{{{ getLeadingWhiteSpace() method /** * Returns the number of leading white space characters in the * specified string. * @param str The string */ public static int getLeadingWhiteSpace(String str) { int whitespace = 0;loop: for(;whitespace < str.length();) { switch(str.charAt(whitespace)) { case ' ': case '\t': whitespace++; break; default: break loop; } } return whitespace; } //}}} //{{{ getTrailingWhiteSpace() method /** * Returns the number of trailing whitespace characters in the * specified string. * @param str The string * @since jEdit 2.5pre5 */ public static int getTrailingWhiteSpace(String str) { int whitespace = 0;loop: for(int i = str.length() - 1; i >= 0; i--) { switch(str.charAt(i)) { case ' ': case '\t': whitespace++; break; default: break loop; } } return whitespace; } //}}} //{{{ getLeadingWhiteSpaceWidth() method /** * Returns the width of the leading white space in the specified * string. * @param str The string * @param tabSize The tab size */ public static int getLeadingWhiteSpaceWidth(String str, int tabSize) { int whitespace = 0;loop: for(int i = 0; i < str.length(); i++) { switch(str.charAt(i)) { case ' ': whitespace++; break; case '\t': whitespace += (tabSize - whitespace % tabSize); break; default: break loop; } } return whitespace; } //}}} //{{{ getVirtualWidth() method /** * Returns the virtual column number (taking tabs into account) of the * specified offset in the segment. * * @param seg The segment * @param tabSize The tab size * @since jEdit 4.1pre1 */ public static int getVirtualWidth(Segment seg, int tabSize) { int virtualPosition = 0; for (int i = 0; i < seg.count; i++) { char ch = seg.array[seg.offset + i]; if (ch == '\t') { virtualPosition += tabSize - (virtualPosition % tabSize); } else { ++virtualPosition; } } return virtualPosition; } //}}} //{{{ getOffsetOfVirtualColumn() method /** * Returns the array offset of a virtual column number (taking tabs * into account) in the segment. * * @param seg The segment * @param tabSize The tab size * @param column The virtual column number * @param totalVirtualWidth If this array is non-null, the total * virtual width will be stored in its first location if this method * returns -1. * * @return -1 if the column is out of bounds * * @since jEdit 4.1pre1 */ public static int getOffsetOfVirtualColumn(Segment seg, int tabSize, int column, int[] totalVirtualWidth) { int virtualPosition = 0; for (int i = 0; i < seg.count; i++) { char ch = seg.array[seg.offset + i]; if (ch == '\t') { int tabWidth = tabSize - (virtualPosition % tabSize); if(virtualPosition >= column) return i; else virtualPosition += tabWidth; } else { if(virtualPosition >= column) return i; else ++virtualPosition; } } if(totalVirtualWidth != null) totalVirtualWidth[0] = virtualPosition; return -1; } //}}} //{{{ createWhiteSpace() method /** * Creates a string of white space with the specified length.<p> * * To get a whitespace string tuned to the current buffer's * settings, call this method as follows: * * <pre>myWhitespace = MiscUtilities.createWhiteSpace(myLength, * (buffer.getBooleanProperty("noTabs") ? 0 * : buffer.getTabSize()));</pre> * * @param len The length * @param tabSize The tab size, or 0 if tabs are not to be used */ public static String createWhiteSpace(int len, int tabSize) { StringBuffer buf = new StringBuffer(); if(tabSize == 0) { while(len-- > 0) buf.append(' '); } else { int count = len / tabSize; while(count-- > 0) buf.append('\t'); count = len % tabSize; while(count-- > 0) buf.append(' '); } return buf.toString(); } //}}} //{{{ globToRE() method /** * Converts a Unix-style glob to a regular expression.<p> * * ? becomes ., * becomes .*, {aa,bb} becomes (aa|bb). * @param glob The glob pattern */ public static String globToRE(String glob) { StringBuffer buf = new StringBuffer();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -