28

有谁知道适用于 Android 的语法高亮库?我看过 jsyntaxpane 但这似乎不支持 Android。

4

7 回答 7

35

我设法为 Android 创建了一个基于Prettify的语法荧光笔。实际上,当我找到Java Prettify时,这很容易。只需下载它(遗憾的是,它不是为 maven 发布的)并将其 jar 添加到应用程序的构建路径中。

我基于它创建的语法高亮:

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;
    }
}

语法的颜色是硬编码的,但也可以由应用程序偏好设置。为了在 a 中显示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 库使我的应用程序大了大约 50kB。

于 2013-11-05T10:45:45.280 回答
22

好吧,我为 Android 做了一个开源语法高亮编辑器:

https://github.com/markusfisch/ShaderEditor

它非常简单,可能只适用于小数据,但它可能是一个很好的起点。

于 2013-06-24T21:06:29.357 回答
18

对于只读语法高亮,您有两种选择:

  1. 找到一个可以使用语法高亮和生成 HTML <font color="">(即,没有 CSS)的 Java 库。然后,您可以使用Html.fromHtml()创建一个Spanned可以交给TextView.

  2. 找到一个可以突出显示语法并生成任何类型 HTML 的 Java 库。然后,您可以将其显示在WebView. 这似乎是评论者链接到android-codepad项目所做的。

如果您正在为编辑器寻找语法高亮,那要困难得多。虽然EditText可以采取相同SpannedTextView方式,但您必须通过语法高亮显示所有内容以反映更改,无论是在每次击键的基础上,还是在输入暂停后。或者,您需要将语法高亮规则与编辑过程更加紧密地结合起来,这样您就可以以某种方式逐步调整高亮,而无需重做EditText. 我还没有看到一个开源的 Android 语法高亮编辑器——不过,一些封闭源代码的应用程序作为 Play Store 上的应用程序。

于 2012-08-16T13:13:45.430 回答
4

您好,您可以使用我的 CodeEditor 安卓阿森纳 安卓阿森纳

播放视频

只需使用:

设置 build.gradle(项目)

allprojects {
    repositories {
        ...
        maven {
            url 'https://jitpack.io'
        }
    }
}

build.gradle(应用程序)

dependencies {
    ...
    compile 'com.github.ahmadaghazadeh:CodeEditor:1.0.15'
}

XML DataBinding <com.github.ahmadghazadeh.editor.widget.CodeEditor bind:code="@{viewModel.code}" bind:lang="@{viewModel.lang}" android:layout_width="match_parent" android:layout_height=" match_parent"/>

XML

    <com.github.ahmadaghazadeh.editor.widget.CodeEditor
        bind:code="<html></html>"
        bind:lang="html"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
于 2018-10-04T07:34:15.083 回答
1

我创建了一个用于文本突出显示的 API,可以解决您的问题。

https://github.com/nakshay/TextHighlighter

此 API 允许您传递特定于单词的单词和颜色,并将返回使用 html 标签格式化的字符串,您可以将其发送到 Html.fromHtml() 以获取突出显示的文本。将以下 Gradle 依赖项添加到模块的 gradle 文件中。

compile 'com.github.akshay-naik:texthighlighterapi:1.1.0'
于 2016-08-15T08:24:19.960 回答
0

920 文本编辑器(Play Store上的应用程序, GitHub 上的源代码)使用WebViewAce的组合,这是一个用 JavaScript 编写的可嵌入代码编辑器。

我正在开发一个适用于 Android 的 IDE 应用程序,我想我也会走同样的路。

于 2018-06-04T02:50:31.693 回答
0

如果您愿意,可以使用Highlight库创建自己的语法高亮。

该库通过方案工作,这些方案基本上是规则(使用正则表达式)和相关修改的组合。有一些现成的,像 ColorScheme、SyleScheme、OnClickScheme 等,但是你可以实现 Scheme 接口并创建你自己的。

lib 的基类是 Highlight,其中处理跨度。您可以直接使用它,如下例所示,我们从 TextView 中突出显示 Java 语言的一些关键词

//create Highlight
Highlight highlight = new Highlight();

//scheme color example
highlight.addScheme(
        new ColorScheme(
                Pattern.compile("\\b(private)|(public)|(protected)|(void)\\b"),
                Color.parseColor("#CC7832")
        )
);

//...

//textview example
highlight.setSpan(binding.toolbarTitle);

但是要创建语法高亮,还需要更多的东西,为此还有 HighlightTextWatcher 类,该类针对大型文本进行了优化,并通过 LinesTextWatcher 类(您可以扩展)的更改行进行处理。请参阅使用此类的示例。

//create TextWatcher
HighlightTextWatcher highlightTextWatcher = new HighlightTextWatcher();

//scheme color example
highlightTextWatcher.addScheme(
        new ColorScheme(
                Pattern.compile("\\b(private)|(public)|(protected)|(void)\\b"),
                Color.parseColor("#CC7832")
        )
);

//...

//edittext example
binding.edittext.addTextChangedListener(highlightTextWatcher);

您可以添加任意数量的方案,其余的由 lib 完成。

实现 'com.github.Irineu333:Highlight:1.0.1' (jitpack)

于 2021-12-01T23:58:01.883 回答