2010-06-04 6 views
3

OCaml에서 파일의 MIME 유형을 어떻게 결정합니까?파일의 MIME 유형 결정

GtkSourceView 컨트롤의 언어를 설정하려고하지만이를 수행하기 위해 먼저 언어를 결정해야합니다. - 내가 마임 타입을 사용하고이 일을 볼 수있는 유일한 방법은 다음과 같이 올바른 언어를 반환하는 기능이있다 :

GSourceView.source_languages_manager#get_language_from_mime_type : string -> source_language option 
난 정말 내 소스에 하드 코딩 언어를 원하지 않는

. OCaml에서 mime-type을 결정할 수 없다면 (그리고 문서를 검색 한 후에도 아직 방법을 찾지 못했습니다.) 소스 언어를 결정할 수있는 또 다른 방법이 있습니까?

답변

3

대부분의 언어에는이 기능이 없으므로 OCaml에서이 언어를 찾을 수 있습니다. 아파치는 mime.types 파일을 가지고있다. 힌트를 찾을 수있다. 이것은 가장 일반적인 방법입니다 - 확장을 mimetype으로 매핑하는 거대한 테이블.

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

또 다른 방법은 파일의 내용을 살펴 보는 것입니다,하지만 당신은 기본적으로 다양한 파일 형식에 대해 알아야 할 : 당신은 쉽게 OCaml의 그것을 구현할 수 있습니다.

모든 언어의 소스 파일이 일반적으로 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"는 "h"와 마찬가지로 C 프로그램입니다. "ml"은 OCaml이다.

+2

OP에는 이미 GtkSourceView에 대한 종속성이 있으므로 GtkSourceView 또는 해당 종속성 중 하나에 의해 설치된 .../share/mime/types에 나열된 유형을 반환하는 함수가 필요합니다. 그 파일은 "text/x-erlang", "text/x-eiffel"등을 나열합니다. ("e"를 그냥지나칩니다.)이 파일에 나열된 유형의 표준 확장은 없습니다. –

+1

get_language_from_mime_type은 궁극적으로 구성 파일 중 하나 인 eiffel.lang, erlang.lang ... .../share/gtksourceview-2.0/language-specs /에서 구문 설명 (강조 표시, ...)을 얻는 것입니다. –

+0

@PascalCuoq - 귀하가 원하는 것은 마임 유형입니다.이 말은 내가 직접 큰 룩업 테이블을 만들고 파일 확장명을 기반으로 MIME 유형을 반환해야한다는 의미입니까? –

3

이 기능을 포함하는 gedit 소스 코드를 연구 한 후에 glib에서이 작업을 수행 할 방법을 발견했습니다. This answerg_file_info_get_content_type() 메소드의 예제 사용을 제공합니다. g_content_type_get_mime_type() 메서드도 있으며 glib에서도 사용할 수 있습니다.

불행히도 이러한 기능을 사용할 수있는 포장이 아직 없습니다. 즉, 포장재를 직접 포장해야 할 수도 있습니다.

2

GTK에서 이미 찾은 기능을 래핑 할 수 있습니다.

또한 공백으로 구분 된 간단한 파일 인 /etc/mime.types을 구문 분석하기가 어렵지 않습니다. 나는 Ocsigen과 Ocamlnet 모두이 작업을 수행하는 코드를 포함하고 있다고 믿지만 액세스가 쉽다면 (Ocamlnet netstring 라이브러리에 의해 노출 된 함수와 같은) 쉽게 접근 할 수 있는지 알 수 없다.

1

이것은 아마도 /etc/mime.types를 사용하여 해당 IMO에 가장 적합한 소스 코드 유형을 결정하는 가장 좋은 방법은 아니지만 사용할 수있는 OCaml bindings for libmagic도 있습니다.