/* * [Asciitab.java] * * Summary: prepares ASCII table in HTML. * * Copyright: (c) 2001-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 1.1 2009-03-22 add style markup, character entities * 1.2 2011-11-23 integrate into Palette */ package com.mindprod.palette; import com.mindprod.common18.BigDate; import com.mindprod.entities.EntifyStrings; import java.io.File; import java.io.FileWriter; import java.io.IOException; import static java.lang.System.*; /** * prepares ASCII table in HTML. *

* Does not run standalone. run when Palette is run. * * @author Roedy Green, Canadian Mind Products * @version 1.2 2011-11-23 integrate into Palette * @since 2001 */ final class Asciitab { private static final String DO_NOT_EDIT = "\n"; /** * how you display this character in HTML * * @param c the character you want to render * * @return html for rendering the character */ private static String asHTML( char c ) { if ( c < 32 ) { /* control char */ return "&#x" + toLZ( c + 0x2400, 4, 16 ) + ";"; } else if ( c > 126 ) { /* high ascii */ // decimal form: "&#" + Integer.toString( c ) + ";"; return EntifyStrings.entifyHTML( String.valueOf( c ) ); } else { switch ( c ) { case 32: return " "; case 38: return "&"; case 34: return """; case 60: return "<"; case 62: return ">"; /* ordinary char */ default: return String.valueOf( c ); } } } /** * how you display this character in HTML, quoted so you can see the code * * @param c the character you want to render * * @return html for rendering the character */ private static String asQuotedHTML( char c ) { String result = asHTML( c ); if ( result.charAt( 0 ) == '&' ) { return "&" + result.substring( 1 ); } else { return result; } } /** * Get description of a character * * @param c character to describe * * @return string destribing character, or   if none available. */ @SuppressWarnings( { "OctalInteger" } ) private static String descs( char c ) { if ( 'A' <= c && c <= 'Z' ) { return "upper case " + String.valueOf( c ); } else if ( 'a' <= c && c <= 'z' ) { return "lower case " + String.valueOf( c ); } else if ( '0' <= c && c <= '9' ) { return "digit " + String.valueOf( c ); } else { switch ( c ) { case 0: return "^@ "; case 1: return "^A "; case 2: return "^B "; case 3: return "^C "; case 4: return "^D "; case 5: return "^E "; case 6: return "^F "; case 7: return "^G "; case 8: return "^H [\\b]"; case 9: return "^I [\\t]"; case 10: return "^J [\\n]"; case 11: return "^K "; case 12: return "^L [\\f]"; case 13: return "^M [\\r]"; case 14: return "^N "; case 15: return "^O "; case 16: return "^P "; case 17: return "^Q , XON resume transmission"; case 18: return "^R "; case 19: return "^S , XOFF pause transmission"; case 20: return "^T "; case 21: return "^U "; case 22: return "^V "; case 23: return "^W "; case 24: return "^X "; case 25: return "^Y "; case 26: return "^Z "; case 27: return "^[ "; case 28: return "^\\ , originally used to separate files in a stream."; case 29: return "^] , originally used to separate groups of similar records " + "(tables) in a stream"; case 30: return "^^ , originally used to separate records."; case 31: return "^_ , originally used to separate fields (or units as they were" + " once called)."; case 32: return "space"; case 33: return "bang, exclamation"; case 34: return "quote"; case 35: return "sharp, number sign"; case 36: return "dollar sign"; case 37: return "percent"; case 38: return "ampersand"; case 39: return "apostrophe"; case 40: return "left parenthesis"; case 41: return "right parenthesis"; case 42: return "star, asterisk"; case 43: return "plus"; case 44: return "comma"; case 45: return "minus"; case 46: return "period"; case 47: return "slash, ,not backslash!"; case 58: return "colon"; case 59: return "semicolon"; case 60: return "less than"; case 61: return "equals"; case 62: return "greater than"; case 63: return "question mark"; case 64: return "at sign"; case 91: return "left square bracket"; case 92: return "backslash, not slash!"; case 93: return "right square bracket"; case 94: return "hat, circumflex"; case 95: return "underscore"; case 96: return "grave, rhymes with have"; case 123: return "left curly brace"; case 124: return "vertical bar"; case 125: return "right curly brace"; case 126: return "tilde"; case 127: return ""; // the following are OCTAL because that's how PostScript specifies them // &xxx; codes are for Latin-1 case 0241: return "PostScript (¡) exclamdown"; case 0242: return "PostScript (¢) cent"; case 0243: return "PostScript (£) sterling"; case 0244: return "PostScript (/) fraction"; case 0245: return "PostScript (¥) yen"; case 0246: return "PostScript (ƒ) florin"; case 0247: return "PostScript (§) section"; case 0250: return "PostScript (¤) currency"; case 0251: return "PostScript (') quotesingle"; case 0252: return "PostScript (“) quotedblleft"; case 0253: return "PostScript («) guillemotleft"; case 0254: return "PostScript (<) guilsinglleft"; case 0255: return "PostScript (>) guilsinglright"; case 0256: return "PostScript fi ligature"; case 0257: return "PostScript fl ligature;"; case 0261: return "PostScript (–) endash"; case 0262: return "PostScript (†) dagger"; case 0263: return "PostScript (·) periodcentered"; case 0266: return "PostScript (¶) paragraph"; case 0267: return "PostScript (•) bullet"; case 0270: return "PostScript (,) quotesinglbase"; case 0271: return "PostScript („) quotedblbase"; case 0272: return "PostScript (”) quotedblright"; case 0273: return "PostScript (») guillemotright"; case 0274: return "PostScript (…) ellipsis"; case 0275: return "PostScript (‰) perthousand"; case 0277: return "PostScript (¿) questiondown"; case 0301: return "PostScript (`) grave"; case 0302: return "PostScript (´) acute"; case 0303: return "PostScript (^) circumflex"; case 0304: return "PostScript (~) tilde"; case 0305: return "PostScript (¯) macron, overbar accent"; case 0306: return "PostScript (u) breve, flattened u-shaped accent"; case 0307: return "PostScript (·) dotaccent"; case 0310: return "PostScript (¨) dieresis"; case 0312: return "PostScript (°) ring"; case 0313: return "PostScript (¸) cedilla"; case 0315: return "PostScript (”) hungarumlaut"; case 0316: return "PostScript (,) ogonek, reverse comma"; case 0317: return "PostScript (v) caron, flattened v-shaped accent"; case 0320: return "PostScript (—) emdash"; case 0341: return "PostScript (Æ) AE"; case 0343: return "PostScript (ª) ordfeminine"; case 0350: return "PostScript (L/) Lslash, L with / overstrike"; case 0351: return "PostScript (Ø) Oslash"; case 0352: return "PostScript (Œ) OE"; case 0353: return "PostScript (º) ordmasculine"; case 0361: return "PostScript (æ) ae"; case 0365: return "PostScript (1) dotlessi, i without dot"; case 0370: return "PostScript (l/) l with / overstrike"; case 0371: return "PostScript (ø) oslash"; case 0372: return "PostScript (œ) oe"; case 0373: return "PostScript (ß) germandbls"; default: return " "; } } } /** * Generate ascii table * * @param dir target dir where generated file goes. * @param filename filename where to put the generated table */ @SuppressWarnings( { "SameParameterValue" } ) static void generateAsciitab( final File dir, final String filename ) { try { FileWriter p = new FileWriter( new File( dir, filename ) ); p.write( "\n" ); p.write( DO_NOT_EDIT + "\n" ); p.write( "\n" ); p.write( "" ); p.write( "\n\n" ); int everyTenthLine = 0; for ( char c = 0; c <= 0xff; c++ ) { p.write( "" ); /* displayable char */ p.write( "" ); /* decimal */ p.write( "" ); /* hex */ p.write( "" ); /* octal */ p.write( "" ); /* HTML entity */ p.write( "" ); /* notes */ p.write( "" ); p.write( "\n" ); } // end for p.write( "
ASCII and Latin-1 Character Table
ASCII and Latin-1 Character Table
CharDecHexOctalHTMLNotes
" ); if ( !isControlChar( c ) ) { p.write( asHTML( c ) ); // avoid generated raw unprintable char } p.write( "" ); p.write( Integer.toString( c ) ); p.write( "" ); p.write( "0x" + toLZ( c, 2, 16 ) ); p.write( "" ); p.write( toLZ( c, 4, 8 ) ); p.write( "" ); p.write( asQuotedHTML( c ) ); p.write( "" ); p.write( descs( c ) ); p.write( "
" ); p.write( "\n" ); p.close(); } catch ( IOException e ) { err.println( e.getMessage() ); } } /** * is this char an unprintable control char? * * @param theCharNumber * * @return true if is a control char */ private static boolean isControlChar( int theCharNumber ) { // leave low control chars. They have special glyphms return 127 <= theCharNumber && theCharNumber <= 159; } /** * Convert an integer to a String, with left zeroes. * * @param i the integer to be converted * @param len len the length of the resulting string * @param base base 10=decimal 16=hex 8=octal * * @return String representation of the int e.g. 007 */ private static String toLZ( int i, int len, int base ) { // Since String is final, we could not add this method there. String s = Integer.toString( i, base ); if ( s.length() > len ) { return s.substring( 0, len ); } else if ( s.length() < len ) // pad on left with zeros { return "000000000000000000000000000".substring( 0, len - s.length() ) + s; } else { return s; } } // end toLZ }