📄 textutil.java
字号:
{ String val = props.getProperty( key ); if( val == null ) return defval; return isPositive( val ); } /** * Fetches a String property from the set of Properties. This differs from * Properties.getProperty() in a couple of key respects: First, property value * is trim()med (so no extra whitespace back and front), and well, that's it. * * @param props The Properties to search through * @param key The property key * @param defval A default value to return, if the property does not exist. * @return The property value. * @since 2.1.151 */ public static String getStringProperty( Properties props, String key, String defval ) { String val = props.getProperty( key ); if( val == null ) return defval; return val.trim(); } /** * Returns true, if the string "val" denotes a positive string. Allowed * values are "yes", "on", and "true". Comparison is case-insignificant. * Null values are safe. * * @param val Value to check. * @return True, if val is "true", "on", or "yes"; otherwise false. * * @since 2.0.26 */ public static boolean isPositive( String val ) { if( val == null ) return false; return ( val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes") ); } /** * Makes sure that the POSTed data is conforms to certain rules. These * rules are: * <UL> * <LI>The data always ends with a newline (some browsers, such * as NS4.x series, does not send a newline at the end, which makes * the diffs a bit strange sometimes. * <LI>The CR/LF/CRLF mess is normalized to plain CRLF. * </UL> * * The reason why we're using CRLF is that most browser already * return CRLF since that is the closest thing to a HTTP standard. */ public static String normalizePostData( String postData ) { StringBuffer sb = new StringBuffer(); for( int i = 0; i < postData.length(); i++ ) { switch( postData.charAt(i) ) { case 0x0a: // LF, UNIX sb.append( "\r\n" ); break; case 0x0d: // CR, either Mac or MSDOS sb.append( "\r\n" ); // If it's MSDOS, skip the LF so that we don't add it again. if( i < postData.length()-1 && postData.charAt(i+1) == 0x0a ) { i++; } break; default: sb.append( postData.charAt(i) ); break; } } if( sb.length() < 2 || !sb.substring( sb.length()-2 ).equals("\r\n") ) { sb.append( "\r\n" ); } return sb.toString(); } private static final int EOI = 0; private static final int LOWER = 1; private static final int UPPER = 2; private static final int DIGIT = 3; private static final int OTHER = 4; private static int getCharKind(int c) { if (c==-1) { return EOI; } char ch = (char) c; if (Character.isLowerCase(ch)) return LOWER; else if (Character.isUpperCase(ch)) return UPPER; else if (Character.isDigit(ch)) return DIGIT; else return OTHER; } /** * Adds spaces in suitable locations of the input string. This is * used to transform a WikiName into a more readable format. * * @param s String to be beautified. * @return A beautified string. */ public static String beautifyString( String s ) { return beautifyString( s, " " ); } /** * Adds spaces in suitable locations of the input string. This is * used to transform a WikiName into a more readable format. * * @param s String to be beautified. * @param space Use this string for the space character. * @return A beautified string. * @since 2.1.127 */ public static String beautifyString( String s, String space ) { StringBuffer result = new StringBuffer(); if( s == null || s.length() == 0 ) return ""; int cur = s.charAt(0); int curKind = getCharKind(cur); int prevKind = LOWER; int nextKind = -1; int next = -1; int nextPos = 1; while( curKind != EOI ) { next = (nextPos < s.length()) ? s.charAt(nextPos++) : -1; nextKind = getCharKind( next ); if( (prevKind == UPPER) && (curKind == UPPER) && (nextKind == LOWER) ) { result.append(space); result.append((char) cur); } else { result.append((char) cur); if( ( (curKind == UPPER) && (nextKind == DIGIT) ) || ( (curKind == LOWER) && ((nextKind == DIGIT) || (nextKind == UPPER)) ) || ( (curKind == DIGIT) && ((nextKind == UPPER) || (nextKind == LOWER)) )) { result.append(space); } } prevKind = curKind; cur = next; curKind = nextKind; } return result.toString(); } /** * Creates a Property object based on an array which contains alternatively * a key and a value. It is useful for generating default mappings. * For example: * <pre> * String[] properties = { "jspwiki.property1", "value1", * "jspwiki.property2", "value2 }; * * Properties props = TextUtil.createPropertes( values ); * * System.out.println( props.getProperty("jspwiki.property1") ); * </pre> * would output "value1". * * @param values Alternating key and value pairs. * @return Property object * @see java.util.Property * @throws IllegalArgumentException, if the property array is missing * a value for a key. * @since 2.2. */ public static Properties createProperties( String[] values ) throws IllegalArgumentException { if( values.length % 2 != 0 ) throw new IllegalArgumentException( "One value is missing."); Properties props = new Properties(); for( int i = 0; i < values.length; i += 2 ) { props.setProperty( values[i], values[i+1] ); } return props; } /** * Counts the number of sections (separated with "----") from the page. * * @param pagedata The WikiText to parse. * @return int Number of counted sections. * @since 2.1.86. */ public static int countSections( String pagedata ) { int tags = 0; int start = 0; while( (start = pagedata.indexOf("----",start)) != -1 ) { tags++; start+=4; // Skip this "----" } // // The first section does not get the "----" // return pagedata.length() > 0 ? tags+1 : 0; } /** * Gets the given section (separated with "----") from the page text. * Note that the first section is always #1. If a page has no section markers, * them there is only a single section, #1. * * @param pagedata WikiText to parse. * @param section Which section to get. * @return String The section. * @throws IllegalArgumentException If the page does not contain this many sections. * @since 2.1.86. */ public static String getSection( String pagedata, int section ) throws IllegalArgumentException { int tags = 0; int start = 0; int previous = 0; while( (start = pagedata.indexOf("----",start)) != -1 ) { if( ++tags == section ) { return pagedata.substring( previous, start ); } start += 4; // Skip this "----" previous = start; } if( ++tags == section ) { return pagedata.substring( previous ); } throw new IllegalArgumentException("There is no section no. "+section+" on the page."); } /** * A simple routine which just repeates the arguments. This is useful * for creating something like a line or something. * * @param what String to repeat * @param times How many times to repeat the string. * @return Guess what? * @since 2.1.98. */ public static String repeatString( String what, int times ) { StringBuffer sb = new StringBuffer(); for( int i = 0; i < times; i++ ) { sb.append( what ); } return sb.toString(); } /** * Converts a string from the Unicode representation into something that can be * embedded in a java properties file. All references outside the ASCII range * are replaced with \\uXXXX. * * @param s * @return */ public static String native2Ascii(String s) { StringBuffer sb = new StringBuffer(); for(int i = 0; i < s.length(); i++) { char aChar = s.charAt(i); if ((aChar < 0x0020) || (aChar > 0x007e)) { sb.append('\\'); sb.append('u'); sb.append(toHex((aChar >> 12) & 0xF)); sb.append(toHex((aChar >> 8) & 0xF)); sb.append(toHex((aChar >> 4) & 0xF)); sb.append(toHex( aChar & 0xF)); } else { sb.append(aChar); } } return sb.toString(); } private static char toHex(int nibble) { final char[] hexDigit = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; return hexDigit[(nibble & 0xF)]; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -