// Font Functions // Encoding from http://en.wikipedia.org/wiki/ASCII // Author: Andrew Plumb // License: LGPL 2.1 module outline_2d(outline,points,paths,width=0.1,resolution=8) { if(outline && resolution > 4) { for(j=[0:len(paths)-1]) union() { for(i=[1:len(paths[j])-1]) hull() { translate(points[paths[j][i-1]]) circle($fn=resolution,r=width/2); translate(points[paths[j][i]]) circle($fn=resolution,r=width/2); } hull() { translate(points[paths[j][len(paths[j])-1]]) circle($fn=resolution,r=width/2); translate(points[paths[j][0]]) circle($fn=resolution,r=width/2); } } } else { polygon(points=points,paths=paths); } } module bold_2d(bold,width=0.2,resolution=8) { for(j=[0:$children-1]) { if(bold) { union() { children(j); for(i=[0:resolution-1]) { dx=width*cos(360*i/resolution); dy=width*sin(360*i/resolution); translate([dx,dy]) children(j); } } } else { children(j); } } } module polytext(charstring,size,font,line=0,justify=1,align=-1 ,bold=false,bold_width=0.2,bold_resolution=8 ,underline=false,underline_start=[0,0],underline_width=1.0 ,outline=false,outline_width=0.2,outline_resolution=8 ,strike=false,strike_start=[-0.5,0],strike_width=1.0 ) { line_length=len(charstring)*font[0][0]; line_shift_x=-line_length/2+justify*line_length/2; char_width=font[0][0]; char_height=font[0][1]; char_shift_height=-char_height/2-align*char_height/2; char_thickness=font[0][2]; char_index_map=search(charstring,font[2],1,1); for(i=[0:len(char_index_map)-1]) { thisCharIndex=char_index_map[i]; x_pos=i*size+line_shift_x*size/char_width; translate([x_pos,line*size+char_shift_height*size/char_height]) scale([size/char_width,size/char_height]) { if(char_thickness==0) bold_2d(bold,width=bold_width,resolution=bold_resolution) outline_2d(outline,points=font[2][thisCharIndex][6][0],paths=font[2][thisCharIndex][6][1] ,width=outline_width,resolution=outline_resolution); if( charstring[i] != " " ) { if(underline) translate(underline_start) square(size=[char_width-2*underline_start[0],underline_width],center=false); if(strike) translate([strike_start[0],char_height/2+strike_start[1]]) square(size=[char_width-2*strike_start[0],strike_width],center=false); } if(char_thickness>0) polyhedron(points=font[2][thisCharIndex][6][0],triangles=font[2][thisCharIndex][6][1]); } } } function 8bit_polyfont(dx=0.1,dy=0.1) = [ [8,8,0,"fixed"],["Decimal Byte","Caret Notation","Character Escape Code","Abbreviation","Name","Bound Box","[points,paths]"] ,[ [ 0,"^@","\0","NUL","Null character",[[0,0],[8,8]],[]] ,[ 1,"^A","", "SOH","Start of Header",[[0,0],[8,8]],[]] ,[ 2,"^B","", "STX","Start of Text",[[0,0],[8,8]],[]] ,[ 3,"^C","", "ETX","End of Text",[[0,0],[8,8]],[]] ,[ 4,"^D","", "EOT","End of Transmission",[[0,0],[8,8]],[]] ,[ 5,"^E","", "ENQ","Enquiry",[[0,0],[8,8]],[]] ,[ 6,"^F","", "ACK","Acknowledgment",[[0,0],[8,8]],[]] ,[ 7,"^G","\a","BEL","Bell",[[0,0],[8,8]],[]] ,[ 8,"^H","\b","BS", "Backspace",[[0,0],[8,8]],[]] ,[ 9,"^I","\t","HT", "Horizontal Tab",[[0,0],[8,8]],[]] ,[ 10,"^J","\n","LF", "Line Feed",[[0,0],[8,8]],[]] ,[ 11,"^K","\v","VT", "Vertical Tab",[[0,0],[8,8]],[]] ,[ 12,"^L","\f","FF", "Form feed",[[0,0],[8,8]],[]] ,[ 13,"^M","\r","CR", "Carriage return",[[0,0],[8,8]],[]] ,[ 14,"^N","", "SO", "Shift Out",[[0,0],[8,8]],[]] ,[ 15,"^O","", "SI", "Shift In",[[0,0],[8,8]],[]] ,[ 16,"^P","", "DLE","Data Link Escape",[[0,0],[8,8]],[]] ,[ 17,"^Q","", "DC1","Device Control 1",[[0,0],[8,8]],[]] ,[ 18,"^R","", "DC2","Device Control 2",[[0,0],[8,8]],[]] ,[ 19,"^S","", "DC3","Device Control 3",[[0,0],[8,8]],[]] ,[ 20,"^T","", "DC4","Device Control 4",[[0,0],[8,8]],[]] ,[ 21,"^U","", "NAK","Negative Acknowledgement",[[0,0],[8,8]],[]] ,[ 22,"^V","", "SYN","Synchronous Idle",[[0,0],[8,8]],[]] ,[ 23,"^W","", "ETB","End of Transmission Block",[[0,0],[8,8]],[]] ,[ 24,"^X","", "CAN","Cancel",[[0,0],[8,8]],[]] ,[ 25,"^Y","", "EM", "End of Medium",[[0,0],[8,8]],[]] ,[ 26,"^Z","", "SUB","Substitute",[[0,0],[8,8]],[]] ,[ 27,"^[","\e","ESC","Escape",[[0,0],[8,8]],[]] ,[ 28,"^\\","", "FS", "File Separator",[[0,0],[8,8]],[]] ,[ 29,"^]","", "GS", "Group Separator",[[0,0],[8,8]],[]] ,[ 30,"^^","", "RS", "Record Separator",[[0,0],[8,8]],[]] ,[ 31,"^_","", "US", "Unit Separator",[[0,0],[8,8]],[]] ,[ 32," "," ", "", "Space",[[0,0],[2,8]],[]] ,[ 33,"!","!", "", "",[[0,0],[8,8]],[ [[3,1],[3,2],[5,2],[5,1] ,[3,3],[3,7],[5,7],[5,3]] ,[[0,1,2,3],[4,5,6,7]] ]] ,[ 34,"\"","\"","", "",[[0,0],[8,8]],[ [[1,4],[1,7],[3,7],[3,4] ,[5,4],[5,7],[7,7],[7,4]] ,[[0,1,2,3],[4,5,6,7]] ]] ,[ 35,"#","#", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[0,2],[0,3],[1,3],[1,5],[0,5],[0,6],[1,6],[1,7],[3,7],[3,6],[5,6],[5,7],[7,7] ,[7,6],[8,6],[8,5],[7,5],[7,3],[8,3],[8,2],[7,2],[7,1],[5,1],[5,2],[3,2],[3,1] ,[3,3],[3,5],[5,5],[5,3]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27],[28,29,30,31]] ]] ,[ 36,"$","$", "", "",[[0,0],[8,8]],[ [[3,1],[3,2],[1,2],[1,3],[5,3],[5,4],[2,4],[2,5],[1,5],[1,6],[2,6],[2,7],[3,7],[3,8],[5,8],[5,7],[7,7],[7,6] ,[3,6],[3,5],[6,5],[6,4],[7,4],[7,3],[6,3],[6,2],[5,2],[5,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]] ]] ,[ 37,"%","%", "", "",[[0,0],[8,8]],[ [[1,1],[1,3],[2,3],[2,5],[1,5],[1,7],[3,7],[3,5],[4,5],[4,6],[5,6],[5,7],[7,7] ,[7,6],[6,6],[6,5],[5,5],[5,4],[4,4],[4,3],[3,3],[3,2],[2,2],[2,1] ,[5,1],[5,3],[7,3],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],[24,25,26,27]] ]] ,[ 38,"&","&", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,4],[2,4],[2,5],[3,5],[3,6],[2,6],[2,7],[3,7],[3,8],[6,8],[6,7],[7,7],[7,6],[6,6],[6,5],[5,5],[5,4] ,[8,4],[8,3],[7,3],[7,2],[8,2],[8,1],[6,1],[6,2],[5,2],[5,1] ,[3,2],[3,4],[4,4],[4,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],[30,31,32,33]] ]] ,[ 39,"'","'", "", "",[[0,0],[8,8]],[ [[3,4],[3,7],[5,7],[5,4]] ,[[0,1,2,3]] ]] ,[ 40,"(","(", "", "",[[0,0],[8,8]],[ [[3,1],[3,2],[2,2],[2,6],[3,6],[3,7],[6,7],[6,6],[5,6],[5,5],[4,5],[4,3],[5,3],[5,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[ 41,")",")", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[3,2],[3,3],[4,3],[4,5],[3,5],[3,6],[2,6],[2,7],[5,7],[5,6],[6,6],[6,2],[5,2],[5,1],[4,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]] ]] ,[ 42,"*","*", "", "",[[0,0],[8,8]],[ [[1,2],[1,3],[2,3],[2,4],[0,4],[0,5],[2,5],[2,6],[1,6],[1,7],[3,7],[3,6],[5,6],[5,7],[7,7],[7,6],[6,6] ,[6,5],[8,5],[8,4],[6,4],[6,3],[7,3],[7,2],[5,2],[5,3],[3,3],[3,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]] ]] ,[ 43,"+","+", "", "",[[0,0],[8,8]],[ [[3,1],[3,3],[1,3],[1,5],[3,5],[3,7],[5,7],[5,5],[7,5],[7,3],[5,3],[5,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11]] ]] ,[ 44,",",",", "", "",[[0,0],[8,8]],[ [[2,0],[2,1],[3,1],[3,3],[5,3],[5,1],[4,1],[4,0]] ,[[0,1,2,3,4,5,6,7]] ]] ,[ 45,"-","-", "", "",[[0,0],[8,8]],[ [[1,3],[1,5],[7,5],[7,3]] ,[[0,1,2,3]] ]] ,[ 46,".",".", "", "",[[0,0],[8,8]],[ [[3,1],[3,3],[5,3],[5,1]] ,[[0,1,2,3]] ]] ,[ 47,"/","/", "", "",[[0,0],[8,8]],[ [[1,1],[1,3],[2,3],[2,4],[3,4],[3,5],[4,5],[4,6],[5,6],[5,7],[7,7],[7,6],[6,6],[6,5],[5,5],[5,4],[4,4],[4,3],[3,3],[3,2],[2,2],[2,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]] ]] ,[ 48,"0","0", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,2],[6,2],[6,1] ,[3,2],[3,3],[5,3],[5,2] ,[3,4],[3,6],[5,6],[5,5],[4,5],[4,4]] ,[[0,1,2,3,4,5,6,7,8,9,10,11],[12,13,14,15],[16,17,18,19,20,21]] ]] ,[ 49,"1","1", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[3,2],[3,5],[2,5],[2,6],[3,6],[3,7],[5,7],[5,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11]] ]] ,[ 50,"2","2", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[2,2],[2,3],[3,3],[3,4],[4,4],[4,5],[5,5],[5,6],[3,6],[3,5],[1,5],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,5],[6,5],[6,4],[5,4],[5,3],[4,3],[4,2],[3,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]] ]] ,[ 51,"3","3", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,3],[3,3],[3,2],[5,2],[5,3],[4,3],[4,4],[3,4],[3,5],[4,5],[4,6],[1,6],[1,7],[7,7],[7,6],[6,6],[6,5],[5,5],[5,4],[6,4],[6,3],[7,3],[7,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]] ]] ,[ 52,"4","4", "", "",[[0,0],[8,8]],[ [[4,1],[4,2],[1,2],[1,4],[2,4],[2,5],[3,5],[3,6],[4,6],[4,7],[6,7],[6,3],[7,3],[7,2],[6,2],[6,1] ,[3,3],[3,4],[4,4],[4,3]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[16,17,18,19]] ]] ,[ 53,"5","5", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,3],[3,3],[3,2],[5,2],[5,4],[1,4],[1,7],[7,7],[7,6],[3,6],[3,5],[6,5],[6,4],[7,4],[7,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[ 54,"6","6", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[2,6],[2,7],[6,7],[6,6],[3,6],[3,5],[6,5],[6,4],[7,4],[7,2],[6,2],[6,1] ,[3,2],[3,4],[5,4],[5,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[16,17,18,19]] ]] ,[ 55,"7","7", "", "",[[0,0],[8,8]],[ [[2,1],[2,3],[3,3],[3,4],[4,4],[4,5],[5,5],[5,6],[1,6],[1,7],[7,7],[7,5],[6,5],[6,4],[5,4],[5,3],[4,3],[4,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]] ]] ,[ 56,"8","8", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,4],[2,4],[2,5],[1,5],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,5],[6,5],[6,4],[7,4],[7,2],[6,2],[6,1] ,[3,2],[3,4],[5,4],[5,2] ,[3,5],[3,6],[5,6],[5,5]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],[20,21,22,23],[24,25,26,27]] ]] ,[ 57,"9","9", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[4,2],[4,3],[5,3],[5,4],[2,4],[2,5],[1,5],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,3],[6,3],[6,2],[5,2],[5,1] ,[3,5],[3,6],[5,6],[5,5]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],[20,21,22,23]] ]] ,[ 58,":",":", "", "",[[0,0],[8,8]],[ [[3,1],[3,3],[5,3],[5,1] ,[3,4],[3,6],[5,6],[5,4]] ,[[0,1,2,3],[4,5,6,7]] ]] ,[ 59,";",";", "", "",[[0,0],[8,8]],[ [[2,0],[2,1],[3,1],[3,3],[5,3],[5,1],[4,1],[4,0] ,[3,4],[3,6],[5,6],[5,4]] ,[[0,1,2,3,4,5,6,7],[8,9,10,11]] ]] ,[ 60,"<","<", "", "",[[0,0],[8,8]],[ [[5,1],[5,2],[4,2],[4,3],[3,3],[3,4],[2,4],[2,5],[3,5],[3,6],[4,6],[4,7],[5,7],[5,8],[7,8],[7,7],[6,7],[6,6],[5,6],[5,5],[4,5],[4,4],[5,4],[5,3],[6,3],[6,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]] ]] ,[ 61,"=","=", "", "",[[0,0],[8,8]],[ [[1,2],[1,3],[7,3],[7,2] ,[1,5],[1,6],[7,6],[7,5]] ,[[0,1,2,3],[4,5,6,7]] ]] ,[ 62,">",">", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[2,2],[2,3],[3,3],[3,4],[4,4],[4,5],[3,5],[3,6],[2,6],[2,7],[1,7],[1,8],[3,8],[3,7],[4,7],[4,6],[5,6],[5,5],[6,5],[6,4],[5,4],[5,3],[4,3],[4,2],[3,2],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]] ]] ,[ 63,"?","?", "", "",[[0,0],[8,8]],[ [[3,1],[3,2],[5,2],[5,1] ,[3,3],[3,4],[4,4],[4,5],[5,5],[5,6],[3,6],[3,5],[1,5],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,5],[6,5],[6,4],[5,4],[5,3]] ,[[0,1,2,3],[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]] ]] ,[ 64,"@","@", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,3],[4,3],[4,5],[5,5],[5,6],[3,6],[3,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]] ]] ,[ 65,"A","A", "", "",[[0,0],[8,8]],[ [[1,1],[1,5],[2,5],[2,6],[3,6],[3,7],[5,7],[5,6],[6,6],[6,5],[7,5],[7,1],[5,1],[5,2],[3,2],[3,1] ,[3,3],[3,5],[5,5],[5,3]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[16,17,18,19]] ]] ,[ 66,"B","B", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[6,7],[6,6],[7,6],[7,5],[6,5],[6,4],[7,4],[7,2],[6,2],[6,1] ,[3,5],[3,6],[5,6],[5,5] ,[3,2],[3,4],[5,4],[5,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11],[12,13,14,15],[16,17,18,19]] ]] ,[ 67,"C","C", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,5],[5,5],[5,6],[3,6],[3,2],[5,2],[5,3],[7,3],[7,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[ 68,"D","D", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[5,7],[5,6],[6,6],[6,5],[7,5],[7,3],[6,3],[6,2],[5,2],[5,1] ,[3,2],[3,6],[4,6],[4,5],[5,5],[5,3],[4,3],[4,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11],[12,13,14,15,16,17,18,19]] ]] ,[ 69,"E","E", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[7,7],[7,6],[3,6],[3,5],[6,5],[6,4],[3,4],[3,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11]] ]] ,[ 70,"F","F", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[7,7],[7,6],[3,6],[3,5],[6,5],[6,4],[3,4],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9]] ]] ,[ 71,"G","G", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[2,6],[2,7],[7,7],[7,6],[3,6],[3,2],[5,2],[5,3],[4,3],[4,4],[7,4],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[ 72,"H","H", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,5],[5,5],[5,7],[7,7],[7,1],[5,1],[5,4],[3,4],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11]] ]] ,[ 73,"I","I", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[3,2],[3,6],[1,6],[1,7],[7,7],[7,6],[5,6],[5,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11]] ]] ,[ 74,"J","J", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,3],[3,3],[3,2],[5,2],[5,6],[4,6],[4,7],[7,7],[7,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13]] ]] ,[ 75,"K","K", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,5],[4,5],[4,6],[5,6],[5,7],[7,7],[7,6],[6,6],[6,5],[5,5],[5,3],[6,3],[6,2],[7,2],[7,1],[5,1],[5,2],[4,2],[4,3],[3,3],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]] ]] ,[ 76,"L","L", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,2],[7,2],[7,1]] ,[[0,1,2,3,4,5]] ]] ,[ 77,"M","M", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,6],[4,6],[4,5],[5,5],[5,6],[6,6],[6,7],[8,7],[8,1],[6,1],[6,4],[5,4],[5,3],[4,3],[4,4],[3,4],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[ 78,"N","N", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,6],[4,6],[4,5],[5,5],[5,7],[7,7],[7,1],[5,1],[5,2],[4,2],[4,3],[3,3],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[ 79,"O","O", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,2],[6,2],[6,1] ,[3,2],[3,6],[5,6],[5,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11],[12,13,14,15]] ]] ,[ 80,"P","P", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[6,7],[6,6],[7,6],[7,4],[6,4],[6,3],[3,3],[3,1] ,[3,4],[3,6],[5,6],[5,4]] ,[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13]] ]] ,[ 81,"Q","Q", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[2,6],[2,7],[6,7],[6,6],[7,6],[7,3],[6,3],[6,2],[7,2],[7,1],[5,1],[5,2],[4,2],[4,1] ,[3,3],[3,6],[5,6],[5,3]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],[18,19,20,21]] ]] ,[ 82,"R","R", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[6,7],[6,6],[7,6],[7,4],[6,4],[6,2],[7,2],[7,1],[5,1],[5,2],[4,2],[4,3],[3,3],[3,1] ,[3,4],[3,6],[5,6],[5,4]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[16,17,18,19]] ]] ,[ 83,"S","S", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[5,2],[5,4],[2,4],[2,5],[1,5],[1,6],[2,6],[2,7],[6,7],[6,6],[3,6],[3,5],[6,5],[6,4],[7,4],[7,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[ 84,"T","T", "", "",[[0,0],[8,8]],[ [[3,1],[3,6],[1,6],[1,7],[7,7],[7,6],[5,6],[5,1]] ,[[0,1,2,3,4,5,6,7]] ]] ,[ 85,"U","U", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,2],[5,2],[5,7],[7,7],[7,1]] ,[[0,1,2,3,4,5,6,7]] ]] ,[ 86,"V","V", "", "",[[0,0],[8,8]],[ [[3,1],[3,2],[2,2],[2,3],[1,3],[1,7],[3,7],[3,3],[5,3],[5,7],[7,7],[7,3],[6,3],[6,2],[5,2],[5,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[ 87,"W","W", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,4],[4,4],[4,5],[5,5],[5,4],[6,4],[6,7],[8,7],[8,1],[6,1],[6,2],[5,2],[5,3],[4,3],[4,2],[3,2],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[ 88,"X","X", "", "",[[0,0],[8,8]],[ [[1,1],[1,3],[2,3],[2,5],[1,5],[1,7],[3,7],[3,5],[5,5],[5,7],[7,7],[7,5],[6,5],[6,3],[7,3],[7,1],[5,1],[5,3],[3,3],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[ 89,"Y","Y", "", "",[[0,0],[8,8]],[ [[3,1],[3,4],[2,4],[2,5],[1,5],[1,7],[3,7],[3,5],[5,5],[5,7],[7,7],[7,5],[6,5],[6,4],[5,4],[5,1],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]] ]] ,[ 90,"Z","Z", "", "",[[0,0],[8,8]],[ [[1,1],[1,3],[2,3],[2,4],[3,4],[3,5],[4,5],[4,6],[1,6],[1,7],[7,7],[7,6],[6,6],[6,5],[5,5],[5,4],[4,4],[4,3],[3,3],[3,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]] ]] ,[ 91,"[","[", "", "",[[0,0],[8,8]],[ // ] ] [[2,1],[2,7],[6,7],[6,6],[4,6],[4,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7]] ]] ,[ 92,"\\","\\","", "",[[0,0],[8,8]],[ [[6,1],[6,2],[5,2],[5,3],[4,3],[4,4],[3,4],[3,5],[2,5],[2,6],[1,6],[1,7],[3,7],[3,6],[4,6],[4,5],[5,5],[5,4],[6,4],[6,3],[7,3],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]] ]] ,[ 93,"]","]", "", "",[[0,0],[8,8]],[ // [ [ [[2,1],[2,2],[4,2],[4,6],[2,6],[2,7],[6,7],[6,1]] ,[[0,1,2,3,4,5,6,7]] ]] ,[ 94,"^","^", "", "",[[0,0],[8,8]],[ [[2,4],[2,5] ,[3-dx,5],[3,5+dy] ,[3,6] ,[4-dx,6],[4,6+dy] ,[4,7],[5,7] ,[5,6+dy],[5+dx,6] ,[6,6] ,[6,5+dy],[6+dx,5] ,[7,5],[7,4],[6,4] ,[6,5-dy],[6-dx,5] ,[5,5] ,[5,6-dy],[5-dx,6],[4+dx,6],[4,6-dy] ,[4,5] ,[3+dx,5],[3,5-dy] ,[3,4]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]] ]] ,[ 95,"_","_", "", "",[[0,0],[8,8]],[ [[0,0],[0,1],[8,1],[8,0]] ,[[0,1,2,3]] ]] ,[ 96,"`","`", "", "",[[0,0],[8,8]],[ [[2,6],[2,7],[3,7] ,[3,6+dy],[3+dx,6] ,[4,6] ,[4,5+dy],[4+dx,5] ,[5,5],[5,4],[4,4] ,[4,5-dy],[4-dx,5] ,[3,5] ,[3,6-dy],[3-dx,6]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[ 97,"a","a", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,3],[2,3],[2,4],[5,4],[5,5],[2,5],[2,6],[6,6],[6,5],[7,5],[7,1] ,[3,2],[3,3],[5,3],[5,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13],[14,15,16,17]] ]] ,[ 98,"b","b", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,5],[6,5],[6,4],[7,4],[7,2],[6,2],[6,1] ,[3,2],[3,4],[5,4],[5,2]] ,[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13]] ]] ,[ 99,"c","c", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,5],[2,5],[2,6],[6,6],[6,5],[3,5],[3,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11]] ]] ,[100,"d","d", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,4],[2,4],[2,5],[5,5],[5,7],[7,7],[7,1] ,[3,2],[3,4],[5,4],[5,2]] ,[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13]] ]] ,[101,"e","e", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,5],[2,5],[2,6],[6,6],[6,5],[7,5],[7,3],[3,3],[3,2],[6,2],[6,1] ,[3,4],[3,5],[5,5],[5,4]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13],[14,15,16,17]] ]] ,[102,"f","f", "", "",[[0,0],[8,8]],[ [[3,1],[3,4],[2,4],[2,5],[3,5],[3,6],[4,6],[4,7],[7,7],[7,6],[5,6],[5,5],[7,5],[7,4],[5,4],[5,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[103,"g","g", "", "",[[0,0],[8,8]],[ [[1,0],[1,1],[5,1],[5,2],[2,2],[2,3],[1,3],[1,5],[2,5],[2,6],[6,6],[6,5],[7,5],[7,1],[6,1],[6,0] ,[3,3],[3,5],[5,5],[5,3]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[16,17,18,19]] ]] ,[104,"h","h", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,5],[6,5],[6,4],[7,4],[7,1],[5,1],[5,4],[3,4],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11]] ]] ,[105,"i","i", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[3,2],[3,4],[2,4],[2,5],[5,5],[5,2],[6,2],[6,1] ,[3,6],[3,7],[5,7],[5,6]] ,[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13]] ]] ,[106,"j","j", "", "",[[0,0],[8,8]],[ [[2,0],[2,1],[5,1],[5,5],[7,5],[7,1],[6,1],[6,0] ,[5,6],[5,7],[7,7],[7,6]] ,[[0,1,2,3,4,5,6,7],[8,9,10,11]] ]] ,[107,"k","k", "", "",[[0,0],[8,8]],[ [[1,1],[1,7],[3,7],[3,4],[4,4],[4,5],[6,5],[6,4],[5,4],[5,3],[6,3],[6,2],[7,2],[7,1],[5,1],[5,2],[4,2],[4,3],[3,3],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[108,"l","l", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[3,2],[3,6],[2,6],[2,7],[5,7],[5,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9]] ]] ,[109,"m","m", "", "",[[0,0],[8,8]],[ [[1,1],[1,6],[3,6],[3,5],[5,5],[5,6],[7,6],[7,5],[8,5],[8,1],[6,1],[6,3],[5,3],[5,2],[4,2],[4,3],[3,3],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]] ]] ,[110,"n","n", "", "",[[0,0],[8,8]],[ [[1,1],[1,6],[6,6],[6,5],[7,5],[7,1],[5,1],[5,5],[3,5],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9]] ]] ,[111,"o","o", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,5],[2,5],[2,6],[6,6],[6,5],[7,5],[7,2],[6,2],[6,1] ,[3,2],[3,5],[5,5],[5,2]] ,[[0,1,2,3,4,5,6,7,8,9,10,11],[12,13,14,15]] ]] ,[112,"p","p", "", "",[[0,0],[8,8]],[ [[1,0],[1,6],[6,6],[6,5],[7,5],[7,3],[6,3],[6,2],[3,2],[3,0] ,[3,3],[3,5],[5,5],[5,3]] ,[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13]] ]] ,[113,"q","q", "", "",[[0,0],[8,8]],[ [[5,0],[5,2],[2,2],[2,3],[1,3],[1,5],[2,5],[2,6],[7,6],[7,0] ,[3,3],[3,5],[5,5],[5,3]] ,[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13]] ]] ,[114,"r","r", "", "",[[0,0],[8,8]],[ [[1,1],[1,6],[6,6],[6,5],[7,5],[7,4],[5,4],[5,5],[3,5],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9]] ]] ,[115,"s","s", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[5,2],[5,3],[2,3],[2,4],[1,4],[1,5],[2,5],[2,6],[7,6],[7,5],[3,5],[3,4],[6,4],[6,3],[7,3],[7,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[116,"t","t", "", "",[[0,0],[8,8]],[ [[4,1],[4,2],[3,2],[3,5],[1,5],[1,6],[3,6],[3,7],[5,7],[5,6],[7,6],[7,5],[5,5],[5,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[117,"u","u", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[1,2],[1,6],[3,6],[3,2],[5,2],[5,6],[7,6],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9]] ]] ,[118,"v","v", "", "",[[0,0],[8,8]],[ [[3,1],[3,2],[2,2],[2,3],[1,3],[1,6],[3,6],[3,3],[5,3],[5,6],[7,6],[7,3],[6,3],[6,2],[5,2],[5,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]] ]] ,[119,"w","w", "", "",[[0,0],[8,8]],[ [[2,1],[2,3],[1,3],[1,6],[3,6],[3,4],[4,4],[4,5],[5,5],[5,4],[6,4],[6,6],[8,6],[8,3],[7,3],[7,1],[5,1],[5,2],[4,2],[4,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[120,"x","x", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[2,2],[2,3],[3,3],[3,4],[2,4],[2,5],[1,5],[1,6],[3,6],[3,5],[5,5],[5,6],[7,6],[7,5],[6,5],[6,4],[5,4],[5,3],[6,3],[6,2],[7,2],[7,1],[5,1],[5,2],[3,2],[3,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]] ]] ,[121,"y","y", "", "",[[0,0],[8,8]],[ [[1,0],[1,1],[4,1],[4,2],[2,2],[2,3],[1,3],[1,6],[3,6],[3,3],[5,3],[5,6],[7,6],[7,2],[6,2],[6,1],[5,1],[5,0]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]] ]] ,[122,"z","z", "", "",[[0,0],[8,8]],[ [[1,1],[1,2],[2,2],[2,3],[3,3],[3,4],[4,4],[4,5],[1,5],[1,6],[7,6],[7,5],[6,5],[6,4],[5,4],[5,3],[4,3],[4,2],[7,2],[7,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[123,"{","{", "", "",[[0,0],[8,8]],[ [[4,1],[4,2],[3,2],[3,4],[2,4],[2,5],[3,5],[3,7],[4,7],[4,8],[6,8],[6,7],[5,7],[5,5],[4,5],[4,4],[5,4],[5,2],[6,2],[6,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[124,"|","|", "", "",[[0,0],[8,8]],[ [[3,0],[3,8],[5,8],[5,0]] ,[[0,1,2,3]] ]] ,[125,"}","}", "", "",[[0,0],[8,8]],[ [[2,1],[2,2],[3,2],[3,4],[4,4],[4,5],[3,5],[3,7],[2,7],[2,8],[4,8],[4,7],[5,7],[5,5],[6,5],[6,4],[5,4],[5,2],[4,2],[4,1]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[126,"~","~", "", "",[[0,0],[8,8]],[ [[2,5],[2,6] ,[3-dx,6],[3,6+dy] ,[3,7],[5,7],[5,6] ,[6-dx,6],[6,6+dy] ,[6,7],[7,7],[7,6] ,[6+dx,6],[6,6-dy] ,[6,5],[4,5],[4,6] ,[3+dx,6],[3,6-dy] ,[3,5]] ,[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]] ]] ,[127,"^?","", "DEL","Delete",[[0,0],[8,8]],[]] ] ]; // From http://www.brailleauthority.org/sizespacingofbraille/ // // Section 3.2 of Specification 800 (Braille Books and Pamphlets) February 2008 reads as follows: // Size and Spacing // 3.2.1 The nominal height of braille dots shall be 0.019 inches [0.48 mm] and shall be uniform within any given transcription. // 3.2.2 The nominal base diameter of braille dots shall be 0.057 inches [1.44 mm]. // 3.2.3 Cell spacing of dots shall conform to the following: // 3.2.3.1 The nominal distance from center to center of adjacent dots (horizontally or vertically, but not diagonally) // in the same cell shall be 0.092 inches [2.340 mm]. // 3.2.3.2 The nominal distance from center to center of corresponding dots in adjacent cells shall be 0.245 inches [6.2 mm]. // 3.2.4 The nominal line spacing of braille cells from center to center of nearest corresponding dots in adjacent lines shall // be 0.400 inches [1.000 cm]. // // Additional References: // http://www.loc.gov/nls/specs/800.pdf // http://www.tiresias.org/research/reports/braille_cell.htm module braille_ascii_spec800(inString,dot_backing=true,cell_backing=false,justify=1,align=-1,dot_h=0.48,dot_d=1.44,dot_spacing=2.340,cell_d2d_spacing=6.2, line_d2d_spacing=10.0, echo_translate=true) { // justify: // -1 : left side // 0 : center // 1 : right side (default) // align: // -1 : bottom braille cell edge - shift up (default) // 0 : center braille cell // 1 : top braille cell edge - shift down thisFont=braille_ascii_font(dot_h=dot_h,dot_d=dot_d,dot_spacing=dot_spacing ,cell_d2d_spacing=cell_d2d_spacing,line_d2d_spacing=line_d2d_spacing); x_shift=thisFont[0][0]; y_shift=thisFont[0][1]; theseIndicies=search(inString,thisFont[2],1,1); for( i=[0:len(theseIndicies)-1]) translate([i*x_shift-(1-justify)*x_shift*len(theseIndicies)/2,-y_shift*(align+1)/2]) { dotPattern=thisFont[2][theseIndicies[i]][6]; if(dot_backing) translate([cell_d2d_spacing/2-dot_spacing/2-dot_d/2,line_d2d_spacing/2-dot_spacing-dot_d/2,-dot_h]) cube(size=[dot_spacing+dot_d,2*dot_spacing+dot_d,dot_h],center=false); if(cell_backing) translate([0,0,-dot_h]) cube(size=[x_shift,y_shift,dot_h],center=false); if(echo_translate) echo(str(inString[i]," maps to '",thisFont[2][theseIndicies[i]][4],"'")); for(dotIndex=dotPattern) { translate([cell_d2d_spacing/2-dot_spacing/2+floor((dotIndex-1)/3)*dot_spacing , line_d2d_spacing/2-dot_spacing+(2-(dotIndex-1)%3)*dot_spacing]) scale([dot_d,dot_d,2*dot_h]) sphere($fn=8,r=0.5); } } } // Encoding from http://en.wikipedia.org/wiki/Braille_ASCII // Dot Pattern: // 1 4 // 2 5 // 3 6 function braille_ascii_font(dot_h=0.48,dot_d=1.44,dot_spacing=2.340,cell_d2d_spacing=6.2,line_d2d_spacing=10.0) = [ [cell_d2d_spacing,line_d2d_spacing,0,"bump"],["Decimal Byte","Caret Notation","Character Escape Code","Abbreviation","Name","Bound Box","[bump_list]"] ,[ [ 0,"^@","\0","NUL","Null character",[[0,0],[2,3]],[]] ,[ 1,"^A","", "SOH","Start of Header",[[0,0],[2,3]],[]] ,[ 2,"^B","", "STX","Start of Text",[[0,0],[2,3]],[]] ,[ 3,"^C","", "ETX","End of Text",[[0,0],[2,3]],[]] ,[ 4,"^D","", "EOT","End of Transmission",[[0,0],[2,3]],[]] ,[ 5,"^E","", "ENQ","Enquiry",[[0,0],[2,3]],[]] ,[ 6,"^F","", "ACK","Acknowledgment",[[0,0],[2,3]],[]] ,[ 7,"^G","\a","BEL","Bell",[[0,0],[2,3]],[]] ,[ 8,"^H","\b","BS", "Backspace",[[0,0],[2,3]],[]] ,[ 9,"^I","\t","HT", "Horizontal Tab",[[0,0],[2,3]],[]] ,[ 10,"^J","\n","LF", "Line Feed",[[0,0],[2,3]],[]] ,[ 11,"^K","\v","VT", "Vertical Tab",[[0,0],[2,3]],[]] ,[ 12,"^L","\f","FF", "Form feed",[[0,0],[2,3]],[]] ,[ 13,"^M","\r","CR", "Carriage return",[[0,0],[2,3]],[]] ,[ 14,"^N","", "SO", "Shift Out",[[0,0],[2,3]],[]] ,[ 15,"^O","", "SI", "Shift In",[[0,0],[2,3]],[]] ,[ 16,"^P","", "DLE","Data Link Escape",[[0,0],[2,3]],[]] ,[ 17,"^Q","", "DC1","Device Control 1",[[0,0],[2,3]],[]] ,[ 18,"^R","", "DC2","Device Control 2",[[0,0],[2,3]],[]] ,[ 19,"^S","", "DC3","Device Control 3",[[0,0],[2,3]],[]] ,[ 20,"^T","", "DC4","Device Control 4",[[0,0],[2,3]],[]] ,[ 21,"^U","", "NAK","Negative Acknowledgement",[[0,0],[2,3]],[]] ,[ 22,"^V","", "SYN","Synchronous Idle",[[0,0],[2,3]],[]] ,[ 23,"^W","", "ETB","End of Transmission Block",[[0,0],[2,3]],[]] ,[ 24,"^X","", "CAN","Cancel",[[0,0],[2,3]],[]] ,[ 25,"^Y","", "EM", "End of Medium",[[0,0],[2,3]],[]] ,[ 26,"^Z","", "SUB","Substitute",[[0,0],[2,3]],[]] ,[ 27,"^[","\e","ESC","Escape",[[0,0],[2,3]],[]] ,[ 28,"^\\","", "FS", "File Separator",[[0,0],[2,3]],[]] ,[ 29,"^]","", "GS", "Group Separator",[[0,0],[2,3]],[]] ,[ 30,"^^","", "RS", "Record Separator",[[0,0],[2,3]],[]] ,[ 31,"^_","", "US", "Unit Separator",[[0,0],[2,3]],[]] ,[ 32," "," ", "", "Space",[[0,0],[2,3]],[]] ,[ 33,"!","!", "", "the",[[0,0],[2,3]],[ 2,3,4,6 ]] ,[ 34,"\"","\"","", "(contraction)",[[0,0],[2,3]],[ 5 ]] ,[ 35,"#","#", "", "(number prefix)",[[0,0],[2,3]],[ 3,4,5,6 ]] ,[ 36,"$","$", "", "ed",[[0,0],[2,3]],[ 1,2,4,6 ]] ,[ 37,"%","%", "", "sh",[[0,0],[2,3]],[ 1,4,6 ]] ,[ 38,"&","&", "", "and",[[0,0],[2,3]],[ 1,2,3,4,6 ]] ,[ 39,"'","'", "", "",[[0,0],[2,3]],[ 3 ]] ,[ 40,"(","(", "", "of",[[0,0],[2,3]],[ 1,2,3,5,6 ]] ,[ 41,")",")", "", "with",[[0,0],[2,3]],[ 2,3,4,5,6 ]] ,[ 42,"*","*", "", "ch",[[0,0],[2,3]],[ 1,6 ]] ,[ 43,"+","+", "", "ing",[[0,0],[2,3]],[ 3,4,6 ]] ,[ 44,",",",", "", "(uppercase prefix)",[[0,0],[2,3]],[ 6 ]] ,[ 45,"-","-", "", "",[[0,0],[2,3]],[ 3,6 ]] ,[ 46,".",".", "", "(italic prefix)",[[0,0],[2,3]],[ 4,6 ]] ,[ 47,"/","/", "", "st",[[0,0],[2,3]],[ 3,4 ]] ,[ 48,"0","0", "", "\"",[[0,0],[2,3]],[ 3,5,6 ]] ,[ 49,"1","1", "", ",",[[0,0],[2,3]],[ 2 ]] ,[ 50,"2","2", "", ";",[[0,0],[2,3]],[ 2,3 ]] ,[ 51,"3","3", "", ":",[[0,0],[2,3]],[ 2,5 ]] ,[ 52,"4","4", "", ".",[[0,0],[2,3]],[ 2,5,6 ]] ,[ 53,"5","5", "", "en",[[0,0],[2,3]],[ 2,6 ]] ,[ 54,"6","6", "", "!",[[0,0],[2,3]],[ 2,3,5 ]] ,[ 55,"7","7", "", "( or )",[[0,0],[2,3]],[ 2,3,5,6 ]] ,[ 56,"8","8", "", "\" or ?",[[0,0],[2,3]],[ 2,3,6 ]] ,[ 57,"9","9", "", "in",[[0,0],[2,3]],[ 3,5 ]] ,[ 58,":",":", "", "wh",[[0,0],[2,3]],[ 1,5,6 ]] ,[ 59,";",";", "", "(letter prefix)",[[0,0],[2,3]],[ 5,6 ]] ,[ 60,"<","<", "", "gh",[[0,0],[2,3]],[ 1,2,6 ]] ,[ 61,"=","=", "", "for",[[0,0],[2,3]],[ 1,2,3,4,5,6 ]] ,[ 62,">",">", "", "ar",[[0,0],[2,3]],[ 3,4,5 ]] ,[ 63,"?","?", "", "th",[[0,0],[2,3]],[ 1,4,5,6 ]] ,[ 64,"@","@", "", "(accent prefix)",[[0,0],[2,3]],[ 4 ]] ,[ 65,"A","A", "", "a",[[0,0],[2,3]],[ 1 ]] ,[ 66,"B","B", "", "b",[[0,0],[2,3]],[ 1,2 ]] ,[ 67,"C","C", "", "c",[[0,0],[2,3]],[ 1,4 ]] ,[ 68,"D","D", "", "d",[[0,0],[2,3]],[ 1,4,5 ]] ,[ 69,"E","E", "", "e",[[0,0],[2,3]],[ 1,5 ]] ,[ 70,"F","F", "", "f",[[0,0],[2,3]],[ 1,2,4 ]] ,[ 71,"G","G", "", "g",[[0,0],[2,3]],[ 1,2,4,5 ]] ,[ 72,"H","H", "", "h",[[0,0],[2,3]],[ 1,2,5 ]] ,[ 73,"I","I", "", "i",[[0,0],[2,3]],[ 2,4 ]] ,[ 74,"J","J", "", "j",[[0,0],[2,3]],[ 2,4,5 ]] ,[ 75,"K","K", "", "k",[[0,0],[2,3]],[ 1,3 ]] ,[ 76,"L","L", "", "l",[[0,0],[2,3]],[ 1,2,3 ]] ,[ 77,"M","M", "", "m",[[0,0],[2,3]],[ 1,3,4 ]] ,[ 78,"N","N", "", "n",[[0,0],[2,3]],[ 1,3,4,5 ]] ,[ 79,"O","O", "", "o",[[0,0],[2,3]],[ 1,3,5 ]] ,[ 80,"P","P", "", "p",[[0,0],[2,3]],[ 1,2,3,4 ]] ,[ 81,"Q","Q", "", "q",[[0,0],[2,3]],[ 1,2,3,4,5 ]] ,[ 82,"R","R", "", "r",[[0,0],[2,3]],[ 1,2,3,5 ]] ,[ 83,"S","S", "", "s",[[0,0],[2,3]],[ 2,3,4 ]] ,[ 84,"T","T", "", "t",[[0,0],[2,3]],[ 2,3,4,5 ]] ,[ 85,"U","U", "", "u",[[0,0],[2,3]],[ 1,3,6 ]] ,[ 86,"V","V", "", "v",[[0,0],[2,3]],[ 1,2,3,6 ]] ,[ 87,"W","W", "", "w",[[0,0],[2,3]],[ 2,4,5,6 ]] ,[ 88,"X","X", "", "x",[[0,0],[2,3]],[ 1,3,4,6 ]] ,[ 89,"Y","Y", "", "y",[[0,0],[2,3]],[ 1,3,4,5,6 ]] ,[ 90,"Z","Z", "", "z",[[0,0],[2,3]],[ 1,3,5,6 ]] ,[ 91,"[","[", "", "ow",[[0,0],[2,3]],[ 2,4,6 ]] // ]] ,[ 92,"\\","\\","", "ou",[[0,0],[2,3]],[ 1,2,5,6 ]] // [[ ,[ 93,"]","]", "", "er",[[0,0],[2,3]],[ 1,2,4,5,6 ]] ,[ 94,"^","^", "", "(contraction)",[[0,0],[2,3]],[ 4,5 ]] ,[ 95,"_","_", "", "(contraction)",[[0,0],[2,3]],[ 4,5,6 ]] ,[ 96,"`","`", "", "",[[0,0],[2,3]],[ ]] // Repeating upper-case patterns for lower-case letters. ,[ 97,"a","a", "", "a",[[0,0],[2,3]],[ 1 ]] ,[ 98,"b","b", "", "b",[[0,0],[2,3]],[ 1,2 ]] ,[ 99,"c","c", "", "c",[[0,0],[2,3]],[ 1,4 ]] ,[100,"d","d", "", "d",[[0,0],[2,3]],[ 1,4,5 ]] ,[101,"e","e", "", "e",[[0,0],[2,3]],[ 1,5 ]] ,[102,"f","f", "", "f",[[0,0],[2,3]],[ 1,2,4 ]] ,[103,"g","g", "", "g",[[0,0],[2,3]],[ 1,2,4,5 ]] ,[104,"h","h", "", "h",[[0,0],[2,3]],[ 1,2,5 ]] ,[105,"i","i", "", "i",[[0,0],[2,3]],[ 2,4 ]] ,[106,"j","j", "", "j",[[0,0],[2,3]],[ 2,4,5 ]] ,[107,"k","k", "", "k",[[0,0],[2,3]],[ 1,3 ]] ,[108,"l","l", "", "l",[[0,0],[2,3]],[ 1,2,3 ]] ,[109,"m","m", "", "m",[[0,0],[2,3]],[ 1,3,4 ]] ,[110,"n","n", "", "n",[[0,0],[2,3]],[ 1,3,4,5 ]] ,[111,"o","o", "", "o",[[0,0],[2,3]],[ 1,3,5 ]] ,[112,"p","p", "", "p",[[0,0],[2,3]],[ 1,2,3,4 ]] ,[113,"q","q", "", "q",[[0,0],[2,3]],[ 1,2,3,4,5 ]] ,[114,"r","r", "", "r",[[0,0],[2,3]],[ 1,2,3,5 ]] ,[115,"s","s", "", "s",[[0,0],[2,3]],[ 2,3,4 ]] ,[116,"t","t", "", "t",[[0,0],[2,3]],[ 2,3,4,5 ]] ,[117,"u","u", "", "u",[[0,0],[2,3]],[ 1,3,6 ]] ,[118,"v","v", "", "v",[[0,0],[2,3]],[ 1,2,3,6 ]] ,[119,"w","w", "", "w",[[0,0],[2,3]],[ 2,4,5,6 ]] ,[120,"x","x", "", "x",[[0,0],[2,3]],[ 1,3,4,6 ]] ,[121,"y","y", "", "y",[[0,0],[2,3]],[ 1,3,4,5,6 ]] ,[122,"z","z", "", "z",[[0,0],[2,3]],[ 1,3,5,6 ]] ,[123,"{","{", "", "",[[0,0],[2,3]],[ ]] ,[124,"|","|", "", "",[[0,0],[2,3]],[ ]] ,[125,"}","}", "", "",[[0,0],[2,3]],[ ]] ,[126,"~","~", "", "",[[0,0],[2,3]],[ ]] ,[127,"^?","", "DEL","Delete",[[0,0],[2,3]],[]] ] ];