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ファイルを使ってそれを行います - ヒントを探すことができます。これが最も一般的な方法です。拡張子を MIME タイプにマップする巨大なテーブルです。OCaml で簡単に実装できます。

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

もう 1 つの方法は、ファイルの内容を確認することですが、基本的にはさまざまなファイル形式について知る必要があります。

とはいえ、すべての言語のソース ファイルは通常text/plain. それらは MIME タイプで区別できません。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" は "h" と同様に C プログラムです。"ml" は OCaml です。等

于 2010-06-04T03:24:07.660 に答える
2

GTK では、既に見つけた関数をラップできます。

解析する/etc/mime.typesのも難しくありません。空白で区切られた単純なファイルです。Ocsigen と Ocamlnet の両方にこれを行うためのコードが含まれていると思いますが、簡単にアクセスできるかどうかはわかりません (たとえば、Ocamlnetnetstringライブラリによって公開されている関数)。

于 2010-06-05T15:55:14.777 に答える
1

これはおそらくソース コードのタイプを決定するための最良の方法ではありません (その IMO には /etc/mime.types を使用するのが最適です) が、使用できるlibmagic 用の OCaml バインディングもあります。

于 2010-07-10T16:12:53.680 に答える