/*******************************************************************************
 * Copyright (c) 2008 IGA Tosiki, NTT DATA BUSINESS BRAINS Corp.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    IGA Tosiki (NTT DATA BUSINESS BRAINS Corp.) - initial API and implementation
 *******************************************************************************/
/*
 * blanco Framework
 * Copyright (C) 2008 NTT DATA BUSINESS BRAINS CORPORATION
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.html.parser.util;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import blanco.html.parser.BlancoHtmlParser;
import blanco.html.parser.BlancoHtmlParserFactory;
import blanco.html.parser.helper.BlancoHtmlDecideEncodingContentHandler;

public class BlancoHtmlParserUtil {
    /**
     * 要素のなかの属性についてのホワイトスペースを判定します。
     * 
     * @param cRead
     *            判定したい文字。
     * @return ホワイトスペースならtrue。
     */
    public static boolean isWhiteSpace(final char cRead) {
        switch (cRead) {
        case ' ':// 0x20: SPACE
        case '\t': // 0x09: TAB
        case '\f':// 0x0c: FF
        case '\r':// 0x0d (line break)
        case '\n': // 0x0a (line break)
            return true;
        default:
            return false;
        }
    }

    /**
     * HTMLの文字コード判定をおこないます。
     * 
     * @param argInputHtml
     * @return 判定結果の文字エンコーディング。
     * @throws IOException
     */
    public static String decideEncoding(final byte[] argInputHtml)
            throws IOException {
        final BlancoHtmlParser encodingParser = BlancoHtmlParserFactory
                .getInstance();
        final BlancoHtmlDecideEncodingContentHandler encodingHandler = new BlancoHtmlDecideEncodingContentHandler();
        encodingParser.setHandler(encodingHandler);

        encodingParser.parse(new BufferedReader(new InputStreamReader(
                new ByteArrayInputStream(argInputHtml), "ISO8859_1")));
        if (encodingHandler.getEncoding() != null) {
            // TODO Javaがサポートしない文字コードが与えられた場合の例外処理。
            // TODO Shift_JIS と来たら Windows-31J に読み替える、などのこざかしい技の検討が必要。
            // TODO 本来論的に、HTML上のエンコーディングと 実際に
            // Javaプログラミング言語で扱う際のエンコーディングとは分けて考える必要があるように思われる。
            return encodingHandler.getEncoding();
        } else {
            // 分からなかったので決めうち。
            // TODO 理想的には、複数の文字エンコーディングで当ててみて、もっとも ?
            // が少なかったものを採用、などの処理を別途実装するのが良いと考える。
            return "Windows-31J";
        }
    }
}
