正确缩进和解析TextView中的源代码

时间:2014-03-15 10:51:00

标签: android html

是否可以以逐字模式或类似方式解析HTML代码,以便最终可能出现的源代码片段(包含在代码 HTML标记之间)可以正确显示吗?

我想要做的是以用户友好的模式显示源代码(易于与文本的其余部分区分,保持缩进等),如Stack Overflow所做的那样:)

似乎Html.fromHtml()仅支持reduced subset个HTML标记。

2 个答案:

答案 0 :(得分:1)

TextView永远不会成功支持你想要的所有html格式和样式。请改用WebView

TextView是本机的,更轻量级,但正因为它的轻量级,它不会理解你描述的一些指令。

答案 1 :(得分:0)

最后,我自己编写了收到的HTML代码,因为Html.fromHtml不支持precode标记,y用我的自定义格式替换它们并预解析这些标记内的代码用<br/>替换“\ n”,用&nbsp;替换“”。

然后我将结果发送到Html.fromHtml,结果很好:

public class HtmlParser {
    public static Spanned parse(String text) {
        if (text == null) return null;

        text = parseSourceCode(text);

        Spanned textSpanned = Html.fromHtml(text);
        return textSpanned;
    }

    private static String parseSourceCode(String text) {
        if (text.indexOf(ORIGINAL_PATTERN_BEGIN) < 0) return text;

        StringBuilder result = new StringBuilder();
        int begin;
        int end;
        int beginIndexToProcess = 0;

        while (text.indexOf(ORIGINAL_PATTERN_BEGIN) >= 0) {
            begin = text.indexOf(ORIGINAL_PATTERN_BEGIN);
            end = text.indexOf(ORIGINAL_PATTERN_END);

            String code = parseCodeSegment(text, begin, end);

            result.append(text.substring(beginIndexToProcess, begin));
            result.append(PARSED_PATTERN_BEGIN);
            result.append(code);
            result.append(PARSED_PATTERN_END);

            //replace in the original text to find the next appearance
            text = text.replaceFirst(ORIGINAL_PATTERN_BEGIN, PARSED_PATTERN_BEGIN);
            text = text.replaceFirst(ORIGINAL_PATTERN_END, PARSED_PATTERN_END);

            //update the string index to process
            beginIndexToProcess = text.lastIndexOf(PARSED_PATTERN_END) + PARSED_PATTERN_END.length();
        }

        //add the rest of the string
        result.append(text.substring(beginIndexToProcess, text.length()));

        return result.toString();
    }

    private static String parseCodeSegment(String text, int begin, int end) {
        String code = text.substring(begin + ORIGINAL_PATTERN_BEGIN.length(), end);
        code = code.replace(" ", "&nbsp;");
        code = code.replace("\n","<br/>");
        return code;
    }

    private static final String ORIGINAL_PATTERN_BEGIN = "<pre><code>";
    private static final String ORIGINAL_PATTERN_END = "</code></pre>";

    private static final String PARSED_PATTERN_BEGIN = "<font color=\"#888888\"><tt>";
    private static final String PARSED_PATTERN_END = "</tt></font>";
}