RubyOnをJavaで

(2011/8/5修正: 夏なのでフィルタの虫取りをしましたw muse-modeの出力だとうまく処理できてないようだったのを訂正)

C#(.NET)に続き、今度はJavaで書いてみた。

やはり、ひとつの主題を複数の処理系からやってみるのは面白い。

/**
 *
 */

import java.io.*;
import java.util.regex.*;
import java.util.ArrayList;

public class rubyon {

	public static ArrayList DirList() {
		//返り値は配列で
		ArrayList<String> pats = new ArrayList<String>();
		//デフォルトのパスはカレント
		String path = ".";
		//パス名のオブジェクト化
		File dir = new File(path);
		//ディレクトリかどうか判定
		if (!dir.isDirectory()) {
			System.out.println("ディレクトリではないか、"
					+ "または存在しません。");
		}else{
		//再帰的リスト
			String[] contents = dir.list();
			Pattern pattern = Pattern.compile(".+html$");
			for(int i=0;i<contents.length;i++){
				Matcher matcher = pattern.matcher(contents[i]);
				//boolean b= matcher.matches();
				if(matcher.matches() == true){
					//System.out.println(contents[i]);
					pats.add(contents[i]);
				}
			}
		}
		return pats;
	}

	static String fileRead(String fn){
		String seq = "";
		try{
		    File file = new File(fn);
		    BufferedReader br = new BufferedReader(new FileReader(file));

		    String str = br.readLine();
		    while(str != null){
		        //System.out.println(str);
		        seq = seq + str + "\n";
		        str = br.readLine();
		    }

		    br.close();
		}catch(FileNotFoundException e){
		    System.out.println(e);
		}catch(IOException e){
		    System.out.println(e);
		}
		return(seq);
	}

	static void fileWrite(String fn,String seq){
		try {
			FileOutputStream fos = new FileOutputStream(fn);
			OutputStreamWriter osw = new OutputStreamWriter(fos , "UTF-8");
			BufferedWriter bw = new BufferedWriter(osw);
			String msg = seq;
			bw.write(msg);
			bw.close();
			osw.close();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static String onRubyFilter(String fn){
		String seq = fn;
		Pattern pattern;
		Matcher matcher;
		pattern = Pattern.compile("wikipedia");
		matcher = pattern.matcher(seq);
		if( matcher.matches() == true ){
			pattern = Pattern.compile("\\[wikipedia:<([^\\[<>\\]]+)>\\]");
			matcher = pattern.matcher(seq);
			seq = matcher.replaceAll("<a href=\"http://ja.wikipedia.org/wiki/$2\">Wikipedia情報『$1』</a>");
			pattern = Pattern.compile("\\[wikipedia:&lt;([^\\[<>\\]]+)&gt;\\]");
			matcher = pattern.matcher(seq);
			seq = matcher.replaceAll("<a href=\"http://ja.wikipedia.org/wiki/$2\">Wikipedia情報『$1』</a>");
		}
		if(Pattern.compile(">\\]").matcher(seq).find() == true){
			seq = Pattern.compile("\\[([^\\[<>\\]]+)<([^\\[<>\\]]+)>\\]").matcher(seq).replaceAll("<ruby><rb>$1</rb><rp>(</rp><rt>$2</rt><rp>)</rp></ruby>");
		}
		if(Pattern.compile("&gt;\\]").matcher(seq).find() == true){
			seq = Pattern.compile("\\[(.+)&lt;(.+)&gt;\\]").matcher(seq).replaceAll("<ruby><rb>$1</rb><rp>(</rp><rt>$2</rt><rp>)</rp></ruby>");
		}
		return seq;
	}

	public static void main(String[] args) {
		String version = "RubyOn/Java/0.1b";
		System.out.println("#.. ルビタグ挿入ユーティリティ" + version + ".");
		ArrayList<String> dir = DirList();
		for(int i=0;i<dir.size();i++){
			String seq = fileRead(dir.get(i));
			String seqFlx = onRubyFilter(seq);
			if(!seq.equals(seqFlx)){
				String fnFlx = dir.get(i);
				fileWrite(fnFlx,seqFlx);
				System.out.println("#.. " + dir.get(i) + "を処理しました。");
			}else{
				// System.out.println("は処理対象外でした。");
			}
		}
		System.out.println("#.. すべての処理を終わりました。");
	}
}