Onko kaverisi liian l33t? Haluatko kenties itse olla l33t315tä l33t31n ? Hanki nyt LeetSpeekDenied -- ilman sitä 3t v01 3lää!
Tjooh, /mainonta. Eli tällainen hassuhko softa jolla voi kääntää "leettiä" normaalien ihmisten luettavaan muotoon. Ohjelma voi myös tuottaa HC-tason l33tt1ä irkkikavereidesi .. eh, iloksi.
Ohjelma käyttää tekstitiedostoa, jossa on listattuna kaikki merkkikorvaavuudet. Lisäksi pari luokkaa joissa eroteltuna GUI ja muu roska.
Aijjoo, tuo listatiedosto on tosiaan sitten unicodea, joten jouduin hieman täällä näkyvää listaa karsimaan.
Leet2Readable.java
import java.util.*; import java.io.*; /** * <p>Title: Leet2Readable</p> * <p>Description: Konvertoi L33441ä</p> * @author Tuomas Virtanen * @version 1.0 */ public class Leet2Readable { private ArrayList <String>vals = new ArrayList<String>(); private ArrayList <String>keys = new ArrayList<String>(); private String listFile = "list.txt"; public Leet2Readable() { readFileToMem(); } private void readFileToMem() { try { // näistä kahdesta valitaan tapa tiedoston lukemiseen // Alempi on tarkoitettu tiedoston lukemiseen .jar-containerista // Ylempi suoraan tietystä hakemistosta //InputStream is = new FileInputStream(new File(listFile)); InputStream is = Leet2Readable.class.getResourceAsStream(listFile); // Luetaan tiedosto talteen. Avaimet toiseen ja arvot toiseen listaan // Olisi tämän voinut paremminkin toteuttaa, esim. hashtablella tms. // Eipä vaan väsyneenä tullut ajateltua. Ainakin on helppo käyttää. BufferedReader reader = new BufferedReader(new InputStreamReader(is,"unicode")); String line; int pos = 0; while ((line = reader.readLine()) != null) { String[] arr = line.split("\t"); if(arr.length > 1 && arr[0] != null && arr[1] != null) { vals.add(pos,arr[1]); keys.add(pos,arr[0]); pos++; } } } catch (FileNotFoundException ex) { } catch (IOException ex) {} } private String convert(String text, boolean s) { StringBuffer sb = new StringBuffer(); int charpoint = 0; // Ilmoittaa tarkasteltavan kohdan text = text.toUpperCase(); boolean found = false; // Aletaan käymään tekstiä läpi niin kauan kuin juttua riittää while(charpoint < text.length()) { found = false; // Katsotaan löytyykö kohdasta charpoint korvattavaa merkkijonoa for(int k = 0; k < vals.size(); k++) { // Valitaan halutaanko leet->norm vai norm->leet String key = (s) ? vals.get(k) : keys.get(k); String val = (s) ? keys.get(k) : vals.get(k); int len = key.length(); // Jos löydettiin korvattava merkki, niin laitetaan korvaavuus uuteen merkkijonoon // Liikutetaan samalla charpoint-muuttujaa eteenpäin korvattavan tekstin verran if(text.length() > charpoint+len && text.substring(charpoint,charpoint+len).equals(key)) { sb.append(val); charpoint += len; found = true; break; } } // Jos ei löydetty korvaavuutta, niin heitetään vain tarkasteltu merkki // palautettavaan merkkijonoon ja liikutaan eteenpäin if(!found && text.length() > charpoint) { sb.append(text.charAt(charpoint)); charpoint++; } } // Sitten vaan haetaan merkkijono stringbufferista ja palautellaan se return sb.toString(); } public String norm2leet(String text) { return convert(text, true); } public String leet2norm(String text) { return convert(text, false); } }
MainLuokka.java
import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * <p>Title: MainLuokka</p> * <p>Description: GUI</p> * @author Tuomas Virtanen * @version 1.0 */ public class MainLuokka extends JFrame { private JTextField kaannettava; private JTextField valmis; private JButton nappialas; private JButton nappiylos; private Leet2Readable converter; public static void main(String[] args) { // Asetetaan tyyliksi käyttiksen natiivi try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { } // Luodaan oliot ja ikkuna Leet2Readable lr = new Leet2Readable(); MainLuokka m = new MainLuokka(); m.makeGui(); } public void makeGui() { // Luodaan komponentit converter = new Leet2Readable(); JPanel p = new JPanel(); GridLayout lay = new GridLayout(3,2,2,2); p.setLayout(lay); nappiylos = new JButton("leet2norm"); nappialas = new JButton("norm2leet"); kaannettava = new JTextField(25); valmis = new JTextField(25); // Lisätään komponentit paneeliin p.add(new JLabel("Käännettävä teksti")); p.add(kaannettava); p.add(nappialas); p.add(nappiylos); p.add(new JLabel("Käännetty teksti:")); p.add(valmis); // Kiinnitetään paneeli frameen getContentPane().add(p); // Asetetaan ikkunan nimi, koko, jne // Lopuksi julistetaan näkyväksi setTitle("LeetSpeakDenied"); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setSize(400,96); setVisible(true); // Asetetaan tuloskentän teksti // Eli luetaan syötekenttä -> konvertoidaan -> heitetään tuloskenttään nappiylos.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { valmis.setText(converter.leet2norm(kaannettava.getText())); } }); nappialas.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { valmis.setText(converter.norm2leet(kaannettava.getText())); } }); } }
list.txt
|\/| M |/\| w \/\/ W |-| H ]-[ H )-( H I-I H ]-| H |-[ H |\| N |_| U |V| M /.\ A /-\ A \/ V /\ A |\ A >< X |< K |_ L ][ I |) D () O |2 R \2 R |3 B þ th | I 1 l 0 O + T 3 E 4 A 5 S 6 G 7 T 0 O
Kauheen lamet noi leettikielen merkit :(
Onneksi merkkitiedostoa voi itse muuttaa paremmaksi :)
()nn3k51 f1r3f0x11n 0n |337k3y-3x73n510n n11n 31 pää53 3|1737 hypp1mään 51|m1||3.
Mahti javaa uskomatoman taitavaa varsinkin tuo jar juttu
äl on 1 koska 1337 leet ii on ii
Hah! Joku kerkesi ennen minua tekemään tällaisen leetspeak kääntäjän. :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.