3

如何确定文件的 mime 类型(在 OCaml 中)?

我正在尝试为 GtkSourceView 控件设置语言,但要做到这一点,我需要先确定语言。我能看到的唯一方法是使用 mime 类型 - 有一个函数将返回正确的语言,如下所示:

GSourceView.source_languages_manager#get_language_from_mime_type : string -> source_language option

我真的不想将语言硬编码到我的源代码中。如果无法确定 OCaml 中的 mime 类型(在搜索文档后我还没有找到方法),是否有另一种方法可以确定源语言?

4

4 回答 4

4

在研究了包含此功能的 gedit 的源代码后,我在 glib 中发现了一个可以为我执行此操作的方法。 该答案提供了该方法的示例使用g_file_info_get_content_type()。还有g_content_type_get_mime_type()方法,在 glib 中也有。

不幸的是,这些函数还没有可用的包装,这意味着我可能必须为它们生成自己的包装。

于 2010-06-04T15:23:10.017 回答
3

大多数语言都没有这个,所以我会很惊讶在 OCaml 中找到它。Apache 用一个mime.types文件来做这件事——你可以在那里寻找提示。这是最常用的方式 - 一个将扩展映射到 mimetype 的巨大表。您可以轻松地在 OCaml 中实现它:

let mimetype_of_extension = function
    | "txt" | "log" -> "text/plain"
    | "html" | "htm" -> "text/html"
    | "zip" | "application/zip"
...

另一种方法是查看文件内容,但您基本上需要了解各种文件格式。

也就是说,它对您没有多大帮助,因为所有语言的源文件通常都被视为text/plain. 它们无法通过 mimetype 区分;因此我真的不知道你的get_language_from_mime_type功能是做什么的。

然而,各种源文件的文件扩展名或多或少是标准化的,所以如果你知道扩展名,你就会知道语言。获取扩展名就像从文件名中提取最后一个句点之后的任何内容一样简单。

let extension_of_filename filename =
    let pos = (String.rindex filename '.') + 1 in
    let len = String.length filename in
    let ext = String.create (len - pos) in
    String.blit filename pos ext 0 (len - pos);
    ext;;

好吧,至少在除了 Brainfuck 和 OCaml 之外的任何语言中都很简单。之后,就很简单了——“c”是一个 C 程序,“h”也是;“ml”是 OCaml;等等

于 2010-06-04T03:24:07.660 回答
2

在 GTK 中,你可以包装你已经找到的函数。

它也不难解析/etc/mime.types——它是一个简单的空格分隔文件。我相信 Ocsigen 和 Ocamlnet 都包含执行此操作的代码,但我不知道它们是否易于访问(例如 Ocamlnetnetstring库公开的函数)。

于 2010-06-05T15:55:14.777 回答
1

这可能不是确定源代码类型的最佳方法(使用 /etc/mime.types 最适合该 IMO),但您也可以使用用于 libmagic 的 OCaml 绑定。

于 2010-07-10T16:12:53.680 回答