如何确定文件的mime类型(在OCaml中)?
我正在尝试为GtkSourceView控件设置语言,但要做到这一点,我需要先确定语言。我可以看到这样做的唯一方法是使用mime-type - 有一个函数将返回正确的语言,如下所示:
GSourceView.source_languages_manager#get_language_from_mime_type : string -> source_language option
我真的不想将语言硬编码到我的源代码中。如果无法确定OCaml中的mime类型(我在搜索完文档后还没有找到方法),是否有其他方法可以确定源语言?
答案 0 :(得分:3)
大多数语言都没有这个,所以我很惊讶在OCaml中找到它。 Apache使用mime.types
文件执行此操作 - 您可以在那里查找提示。这是最常用的方式 - 将扩展名映射到mimetypes的巨大表格。您可以轻松地在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;等
答案 1 :(得分:3)
在研究了包含此功能的gedit的源代码之后,我在glib中发现了一个方法,它将为我做这个。 This answer提供了g_file_info_get_content_type()
方法的示例用法。还有g_content_type_get_mime_type()
方法,也可以在glib中使用。
不幸的是,目前还没有可用于这些功能的包装,这意味着我可能必须为它们生成自己的包装。
答案 2 :(得分:2)
在GTK中,您可以包装已找到的功能。
解析/etc/mime.types
也不难 - 这是一个简单的空格分隔文件。我相信Ocsigen和Ocamlnet都包含执行此操作的代码,但如果它们易于访问(例如,Ocamlnet netstring
库公开的函数),我不知道如何。
答案 3 :(得分:1)
这可能不是确定源代码类型的最佳方法(使用/etc/mime.types最适合该IMO),但也可以使用OCaml bindings for libmagic。