2010-06-04 93 views
3

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

我想设置一个GtkSourceView控件的语言,但要做到这一点,我需要先确定语言。我可以看到这样做是使用MIME类型的唯一途径 - 存在将返回正确的语言如下功能:

GSourceView.source_languages_manager#get_language_from_mime_type : string -> source_language option 

我真的不想硬编码的语言为我的源。如果无法确定OCaml中的mime类型(并且在搜索完文档后我还没有找到方法),那么可能有另一种方法可以确定源语言吗?

回答

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;等等。

+2

OP已经依赖于GtkSourceView,所以他可能想要一个返回类型列表中的类型的函数.../share/mime/types,它由GtkSourceView或其依赖项之一安装。该文件列出了“text/x-erlang”,“text/x-eiffel”等等(只是通过“e”s)。这个文件中没有列出这些类型的规范扩展。 – 2010-06-04 08:53:30

+1

我认为get_language_from_mime_type是用于最终从配置文件eiffel.lang,erlang.lang,...中的.../share/gtksourceview-2.0/language-specs中获得语法描述(突出显示,...) – 2010-06-04 08:56:21

+0

@PascalCuoq - 您的权利,这些是我想查找的MIME类型 - 这是否意味着我必须自己创建一个大型查找表,然后根据文件扩展名返回MIME类型? – 2010-06-04 09:54:11

3

在研究了包含这个功能的gedit源代码之后,我发现了一个glib中的方法,它可以帮我做到这一点。 This answer提供了使用g_file_info_get_content_type()方法的示例。还有​​方法,glib中也有这个方法。

不幸的是,这些功能没有可用的包装,这意味着我可能不得不为他们生成自己的包装。

2

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

这也不难解析/etc/mime.types - 这是一个简单的空白分隔文件。我相信Ocsigen和Ocamlnet都包含这样做的代码,但如果它们易于访问(例如,由Ocamlnet netstring库公开的功能),我不知道它的副作用。