Android语法高亮?

32

有人知道在Android上可用的语法高亮库吗?我查看了jsyntaxpane,但似乎不支持Android。


你想要突出显示什么? - Ahmad
请详细说明您的问题,您想要突出显示哪个组件? - devmiles.com
1
http://code.google.com/p/android-codepad/ - Chirag
抱歉耽搁了,我想用HTML、CSS、JavaScript或PHP代码突出显示一个EditText。 - MindlessBarber
您可以使用此库 https://dev59.com/pmct5IYBdhLWcg3wk-Rq#52641368 - Ahmad Aghazadeh
7个回答

36
我成功地为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;
    }
}

语法的颜色是硬编码的,但也可以通过应用程序偏好设置进行设置。要在 TextView 中显示 Java 源代码,只需执行以下操作:
// 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的大小。

1
@WojciechFrącz 兄弟,C 代码怎么样了?等待回复。 - Tarun Sharma
3
@Tarun,请将第一个“java”参数替换为“c”或“cpp”。 - fracz
@WojciechFrącz 已经尝试在参数中使用,但没有效果。我想了解一下你的地图的第一个参数。我阅读了 prettify 的文档,但对我来说是死胡同。我在文档中找到了 "public static final java.lang.String C_KEYWORDS"。通过访问此链接 http://java-prettify.googlecode.com/svn/trunk/javadoc/prettify/parser/Prettify.html#ALL_KEYWORDS - Tarun Sharma
我使用这个工具来突出显示C++代码。但是有些行缺失,比如<iostream>。 - MaxySpark
做得很好,但格式很奇怪,有不规则的制表符和换行符。 - AmanSharma
显示剩余2条评论

22

2
非常好的例子。它绝对展示了它的简单性。EditText源代码:https://github.com/markusfisch/ShaderEditor/blob/master/src/de/markusfisch/android/shadereditor/ShaderEditor.java - JRomero
3
上面的链接已经失效了,这里是新的链接:https://github.com/markusfisch/ShaderEditor/blob/5af7129d05a1d122923ae78d110a55a09597589f/app/src/main/java/de/markusfisch/android/shadereditor/widget/ShaderEditor.java - Nicolas

18

对于只读的语法高亮,您有两个选项:

  1. 查找一个能够使用<font color="">(即没有CSS)进行语法高亮并生成HTML的Java库。然后,您可以使用Html.fromHtml()创建一个Spanned对象,并将其交给TextView

  2. 查找一个能够语法高亮并生成任何类型的HTML的Java库。然后可以在WebView中显示。这似乎就是评论员链接到的the android-codepad project所做的事情。

如果您正在寻找编辑器的语法高亮,则更加困难。虽然EditText可以接受与TextView相同的Spanned,但您需要在每次击键或者暂停输入后运行语法高亮以反映变化。或者,您需要将语法高亮规则与编辑过程更紧密地结合起来,以便可以在不必重新执行EditText的整个内容的情况下逐步调整高亮。我没有看到针对Android的开源语法高亮编辑器 - 尽管Play商店上有一些作为应用程序的专有软件。


谢谢,我需要它用于编辑器。看起来我要开始查看jsyntaxpane,看看能否将其移植到Android / EditText。 - MindlessBarber
2
@ng93:你在实现语法高亮方面有成功吗?如果是,能否解释一下实现的过程?先谢谢了。 - rule
你找到了任何Java库来实现第一点描述的<font color="">魔法吗? - fracz
@WojciechFrącz:抱歉,我还没有找过。 - CommonsWare
1
如果有人懂俄语,可以在这里阅读我关于这个主题的文章 - http://habrahabr.ru/post/204248/。无论如何,那里有图片和代码片段,可以给你一个方向。如果你想查看结果,可以在这里找到 - https://play.google.com/store/apps/details?id=org.kidinov.awd - Divers
@CommonsWare 请帮帮我。我只想要一个只读的高亮显示,但是我找不到适合的库。:( - MHSaffari

5

你可以使用我的CodeEditor Android Arsenal Android Arsenal

播放视频

使用方法:

设置 build.gradle (project)

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

build.gradle(应用程序)

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

XML数据绑定 <com.github.ahmadaghazadeh.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"/>

1
我已经创建了一个文本高亮的API,可以解决你的问题。

https://github.com/nakshay/TextHighlighter

这个API允许您传递特定于单词的单词和颜色,并返回使用HTML标记格式化的字符串,您可以将其发送到Html.fromHtml()以获取突出显示的文本。在您的模块gradle文件中添加以下Gradle依赖项。
compile 'com.github.akshay-naik:texthighlighterapi:1.1.0'

欢迎提供潜在解决方案的链接,但请添加一些细节以备将来访问者参考,以防链接不再可用。 - Nikolay Mihaylov
1
谢谢你的建议,Nikolay。我会添加更多细节。 - Akshay
我使用了它,但找不到这个函数highlighter.setLanguage(); - Mohammad Tayyab
@MohammadTayyab,这是在后续版本中添加的,请尝试使用最新版本。 - Akshay Naik

0

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

我正在开发一款Android IDE应用程序,我认为我也会采用同样的方式。


PocketHub(在Play商店上的应用程序,源代码在GitHub上)使用了CodeMirror - Antônio Medeiros
另外,MGit(Play Store上的应用程序,GitHub上的源代码)也使用了CodeMirror。但是我无法在我的手机和平板电脑上(Android 4.4.4和Android 6.0)使其工作,也无法让PocketHub工作。 - Antônio Medeiros
CodeMirror在移动浏览器上存在一个bug:无法使用退格键删除换行符,但我在920 Text Editor中使用Ace时没有遇到这个问题。 - Antônio Medeiros

0

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

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

该库的基类是Highlight,其中处理跨度(spans)。您可以直接使用它,例如下面的示例中,我们从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);

你可以添加任意数量的方案,库将处理其余部分。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接