2010-06-04 224 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庫公開的功能),我不知道它的副作用。