Определение типа MIME файла - PullRequest
3 голосов
/ 04 июня 2010

Как я могу определить mime-тип файла (в OCaml)?

Я пытаюсь установить язык для элемента управления GtkSourceView, но для этого мне нужно сначала определить язык. Единственный способ сделать это - использовать mime-тип - есть функция, которая возвращает правильный язык следующим образом:

GSourceView.source_languages_manager#get_language_from_mime_type : string -> source_language option

Я действительно не хочу жестко кодировать язык в моем источнике. Если невозможно определить mime-тип в OCaml (и я еще не нашел способ после поиска в документации), есть ли другой способ определить исходный язык?

Ответы [ 4 ]

3 голосов
/ 04 июня 2010

Изучив исходный код gedit, который включает в себя эту функциональность, я обнаружил в glib метод, который сделает это за меня. Этот ответ дает пример использования метода g_file_info_get_content_type(). Существует также метод g_content_type_get_mime_type(), который также доступен в glib.

К сожалению, для этих функций пока нет доступных упаковок, а это значит, что мне, возможно, придется сгенерировать их для них.

3 голосов
/ 04 июня 2010

В большинстве языков этого нет, поэтому я был бы очень удивлен, обнаружив его в OCaml. Apache делает это с файлом mime.types - вы можете найти там подсказки. Это самый обычный способ - огромная таблица, которая отображает расширения в миметипы. Вы можете легко реализовать это в OCaml:

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

Другой способ - просмотреть содержимое файла, но тогда вам в основном нужно знать о различных форматах файлов.

Тем не менее, это не очень вам помогает, поскольку исходные файлы всех языков обычно обрабатываются как text/plain. Они не различимы по типу миме; и поэтому я действительно понятия не имею, что делает ваша 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 голосов
/ 05 июня 2010

В GTK вы можете обернуть функции, которые вы уже нашли.

Также нетрудно разобрать /etc/mime.types - это простой файл, разделенный пробелами. Я полагаю, что и Ocsigen, и Ocamlnet содержат код для этого, но я не знаю, насколько легко они доступны (например, функция, предоставляемая библиотекой Ocamlnet netstring).

1 голос
/ 10 июля 2010

Вероятно, это не лучший метод для определения типа исходного кода (лучше всего использовать /etc/mime.types для этого IMO), но есть также привязки OCaml для libmagic , которые можно использовать .

...