Newer
Older
IoTP / src / main / java / info / istlab / IoTP / IndentProgram.java
package info.istlab.IoTP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;

public class IndentProgram {
    public static String indent(String input) throws IOException {
        BufferedReader br = new BufferedReader(new StringReader(input));
        ArrayList<String> sb; // 一時保存用
        sb = new ArrayList<String>();
        ArrayList<Integer> idt;
        idt = new ArrayList<Integer>();
        ArrayList<String> out; // 一時保存用
        out = new ArrayList<String>();
        String line;

        while ((line = br.readLine()) != null) {
            line = line.trim(); // 行頭と行末の空白を除去する
            sb.add(line);
        }
        br.close();
        int indentLevel = 0;
        boolean tobeaddindent = false;
        for (String lorig : sb) {
            String l = removeComment(lorig);
            l = l.trim();

            if (tobeaddindent){
                indentLevel += 2;
                tobeaddindent = false;
            }
            // } があれば、その行から-2
            if (l.startsWith("}")) {
                indentLevel -= 2;
            }
            if (l.endsWith("{")) { // { があれば、次の行から+2
                tobeaddindent = true;
            }
            idt.add(indentLevel);
            // それ以外は、プラマイZero
        }
        for (int i = 0; i < sb.size(); i++) {
            int il = idt.get(i);
            out.add(printIndent(il) + sb.get(i));
        }
        StringBuffer strb = new StringBuffer();
        for(String l: out){
            strb.append(l+"\n");
        }
        return strb.toString();
    }

    // インデントを出力するためのヘルパー関数
    private static String printIndent(int indentLevel) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < indentLevel; i++) {
            sb.append(" ");
        }
        return sb.toString();
    }
    public static String removeComment(String input) {
        int index = input.indexOf("//"); // "//"のインデックスを検索する
        if (index != -1) { // "//"が見つかった場合
            return input.substring(0, index); // "//"より前の部分文字列を返す
        }
        return input; // "//"が見つからなかった場合、元の文字列を返す
    }
}