Подтвердить что ты не робот

Подсветка синтаксиса Android?

Кто-нибудь знает, какие библиотеки подсветки синтаксиса работают на Android? Я посмотрел на jsyntaxpane, но, похоже, не поддерживает Android.

4b9b3361

Ответ 1

Для подсветки синтаксиса только для чтения у вас есть два варианта:

  • Найдите библиотеку Java, которая может выделять синтаксис и генерировать HTML, используя <font color=""> (т.е. без CSS). Затем вы можете использовать Html.fromHtml() для создания объекта Spanned, который вы можете передать в TextView.

  • Найдите библиотеку Java, которая может выделять синтаксис и генерировать любой вид HTML. Затем вы можете отобразить это в WebView. Кажется, это проект android-codepad, связанный с комментарием.

Если вы ищете подсветку синтаксиса для редактора, это значительно сложнее. В то время как EditText может принимать те же Spanned, что TextView может, вам придется запускать все через синтаксический ярлык, чтобы отражать изменения, либо на основе каждого нажатия клавиши, либо после паузы при наборе текста. Или вам нужно будет исправить правила подсветки синтаксиса гораздо более жестко для процесса редактирования, так что вы можете как-то постепенно корректировать выделение, не переделывая все содержимое EditText. Я не видел редактор синтаксиса с открытым исходным кодом для Android - некоторые из них были закрытыми, как приложения в Play Store.

Ответ 2

Мне удалось создать синтаксический ярлык для Android, основанный на Prettify. На самом деле было легко, когда я нашел Java Prettify. Просто скачайте его (к сожалению, он не опубликован для maven) и добавьте его банку в путь сборки вашего приложения.

Ярлык синтаксиса, который я создал на нем:

public class PrettifyHighlighter {
    private static final Map<String, String> COLORS = buildColorsMap();

    private static final String FONT_PATTERN = "<font color=\"#%s\">%s</font>";

    private final Parser parser = new PrettifyParser();

    public String highlight(String fileExtension, String sourceCode) {
        StringBuilder highlighted = new StringBuilder();
        List<ParseResult> results = parser.parse(fileExtension, sourceCode);
        for(ParseResult result : results){
            String type = result.getStyleKeys().get(0);
            String content = sourceCode.substring(result.getOffset(), result.getOffset() + result.getLength());
            highlighted.append(String.format(FONT_PATTERN, getColor(type), content));
        }
        return highlighted.toString();
    }

    private String getColor(String type){
        return COLORS.containsKey(type) ? COLORS.get(type) : COLORS.get("pln");
    }

    private static Map<String, String> buildColorsMap() {
        Map<String, String> map = new HashMap<>();
        map.put("typ", "87cefa");
        map.put("kwd", "00ff00");
        map.put("lit", "ffff00");
        map.put("com", "999999");
        map.put("str", "ff4500");
        map.put("pun", "eeeeee");
        map.put("pln", "ffffff");
        return map;
    }
}

Цвета синтаксиса жестко запрограммированы, но могут также быть заданы, например, приложением. Чтобы отобразить исходный код Java в TextView, просто выполните:

// code is a String with source code to highlight
// myTextView is a TextView component
PrettifyHighlighter highlighter = new PrettifyHighlighter();
String highlighted = highlighter.highlight("java", code);
myTextView.setText(Html.fromHtml(highlighted));

Библиотека Java Prettify сделала мое приложение размером более 50 КБ.

Ответ 3

Ну, я сделал редактор подсветки с открытым исходным кодом для Android:

https://github.com/markusfisch/ShaderEditor

Это довольно просто и, возможно, подходит только для небольших данных, но, вероятно, это хорошая отправная точка.

Ответ 4

Я создал API для выделения текста, который может решить вашу проблему.

https://github.com/nakshay/TextHighlighter

Этот API позволяет передавать слова и цвета, специфичные для слов, и возвращает строку, которая отформатирована с помощью тегов html, которые вы можете отправить в Html.fromHtml(), чтобы получить выделенный текст. добавьте ниже Gradle зависимость от вашего модуля Gradle.

compile 'com.github.akshay-naik:texthighlighterapi:1.1.0'