root/branches/perian-1.0/UniversalDetector/UniversalDetector.mm

Revision 406, 2.7 kB (checked in by astrange, 2 years ago)

Use the (LGPL) Mozilla automatic charset detection library for external subtitles.
Unfortunately, it's quite large...
References #87

Line 
1 #import "UniversalDetector.h"
2
3 #import "nscore.h"
4 #import "nsUniversalDetector.h"
5 #import "nsCharSetProber.h"
6
7 class wrappedUniversalDetector:public nsUniversalDetector
8 {
9         public:
10         void Report(const char* aCharset) {}
11
12         const char *charset(float &confidence)
13         {
14                 if(!mGotData)
15                 {
16                         confidence=0;
17                         return 0;
18                 }
19
20                 if(mDetectedCharset)
21                 {
22                         confidence=1;
23                         return mDetectedCharset;
24                 }
25
26                 switch(mInputState)
27                 {
28                         case eHighbyte:
29                         {
30                                 float proberConfidence;
31                                 float maxProberConfidence = (float)0.0;
32                                 PRInt32 maxProber = 0;
33
34                                 for (PRInt32 i = 0; i < NUM_OF_CHARSET_PROBERS; i++)
35                                 {
36                                         proberConfidence = mCharSetProbers[i]->GetConfidence();
37                                         if (proberConfidence > maxProberConfidence)
38                                         {
39                                                 maxProberConfidence = proberConfidence;
40                                                 maxProber = i;
41                                         }
42                                 }
43
44                                 confidence=maxProberConfidence;
45                                 return mCharSetProbers[maxProber]->GetCharSetName();
46                         }
47                         break;
48
49                         case ePureAscii:
50                                 confidence=0;
51                                 return "US-ASCII";
52                 }
53
54                 confidence=0;
55                 return 0;
56         }
57
58         bool done()
59         {
60                 if(mDetectedCharset) return true;
61                 return false;
62         }
63
64         void reset() { Reset(); }
65 };
66
67
68
69 @implementation UniversalDetector
70
71 -(id)init
72 {
73         if(self=[super init])
74         {
75                 detectorptr=(void *)new wrappedUniversalDetector;
76                 charset=nil;
77         }
78         return self;
79 }
80
81 -(void)dealloc
82 {
83         delete (wrappedUniversalDetector *)detectorptr;
84         [charset release];
85         [super dealloc];
86 }
87
88 -(void)analyzeData:(NSData *)data
89 {
90         [self analyzeBytes:(const char *)[data bytes] length:[data length]];
91 }
92
93 -(void)analyzeBytes:(const char *)data length:(int)len
94 {
95         wrappedUniversalDetector *detector=(wrappedUniversalDetector *)detectorptr;
96
97         if(detector->done()) return;
98
99         detector->HandleData(data,len);
100         [charset release];
101         charset=nil;
102 }
103
104 -(void)reset
105 {
106         wrappedUniversalDetector *detector=(wrappedUniversalDetector *)detectorptr;
107         detector->reset();
108 }
109
110 -(BOOL)done
111 {
112         wrappedUniversalDetector *detector=(wrappedUniversalDetector *)detectorptr;
113         return detector->done()?YES:NO;
114 }
115
116 -(NSString *)MIMECharset
117 {
118         if(!charset)
119         {
120                 wrappedUniversalDetector *detector=(wrappedUniversalDetector *)detectorptr;
121                 const char *cstr=detector->charset(confidence);
122                 if(!cstr) return nil;
123                 charset=[[NSString alloc] initWithUTF8String:cstr];
124         }
125         return charset;
126 }
127
128 -(NSStringEncoding)encoding
129 {
130         NSString *mimecharset=[self MIMECharset];
131         if(!mimecharset) return 0;
132         CFStringEncoding cfenc=CFStringConvertIANACharSetNameToEncoding((CFStringRef)mimecharset);
133         if(cfenc==kCFStringEncodingInvalidId) return 0;
134         return CFStringConvertEncodingToNSStringEncoding(cfenc);
135 }
136
137 -(float)confidence
138 {
139         if(!charset) [self MIMECharset];
140         return confidence;
141 }
142
143 +(UniversalDetector *)detector
144 {
145         return [[[UniversalDetector alloc] init] autorelease];
146 }
147
148 @end
Note: See TracBrowser for help on using the browser.