/*
* ssa2html.m
* SSARender2
*
* Created by Alexander Strange on 7/28/07.
* Copyright 2007 __MyCompanyName__. All rights reserved.
*
*/
#import "SubImport.h"
#import "SubParsing.h"
@interface SubHTMLExporter : SubRenderer
{
SubContext *sc;
@public;
NSMutableString *html;
}
@end
@implementation SubHTMLExporter
-(SubHTMLExporter*)init
{
if (self = [super init])
{
html = [[NSMutableString alloc] init];
[html appendString:@"\n"];
[html appendString:@"
\n"];
[html appendString:@"\n"];
}
return self;
}
-(void)completedHeaderParsing:(SubContext*)sc_
{
sc = sc_;
[html appendFormat:@"%@\n",[sc->headers objectForKey:@"Title"]];
[html appendString:@"\n"];
[html appendString:@"\n"];
[html appendString:@"\n"];
}
NSString *htmlfilter(NSString *s)
{
NSMutableString *ms = [s mutableCopy];
[ms replaceOccurrencesOfString:@"\n" withString:@"
" options:0 range:NSMakeRange(0, [ms length])];
// [ms replaceOccurrencesOfString:[NSString stringWithFormat:@"%C",0x00A0] withString:@" " options:0 range:NSMakeRange(0, [ms length])];
return ms;
}
-(void*)spanExtraFromRenderDiv:(SubRenderDiv*)div
{
return [NSMutableString string];
}
-(void*)cloneSpanExtra:(SubRenderSpan*)span
{
return [NSMutableString string];
}
-(void)spanChangedTag:(SSATagType)tag span:(SubRenderSpan*)span div:(SubRenderDiv*)div param:(void*)p
{
NSMutableString *sty = span->ex;
int ip;
NSString *sp;
float fp;
#define iv() ip = *(int*)p;
#define sv() sp = *(NSString**)p;
#define fv() fp = *(float*)p;
#define cv() ip = *(int*)p; ip = EndianU32_BtoL(ip); ip = ip & 0xFFFFFF;
switch (tag) {
case tag_b:
iv();
[sty appendFormat:@"font-weight: %@; ", ip? @"bold" : @"normal"];
break;
case tag_i:
iv();
[sty appendFormat:@"font-style: %@; ", ip? @"italic" : @"normal"];
break;
case tag_u:
iv();
[sty appendFormat:@"text-decoration: %@; ", ip? @"underline" : @"none"];
break;
case tag_s:
iv();
[sty appendFormat:@"text-decoration: %@; ", ip? @"line-through" : @"none"];
break;
case tag_fn:
sv();
[sty appendFormat:@"font-family: %@; ", sp];
break;
case tag_fs:
fv();
[sty appendFormat:@"font-size: %fpt; ", fp * (72./96.)];
break;
case tag_1c:
cv();
[sty appendFormat:@"color: #%0.9X; ", ip];
break;
case tag_4c:
cv();
[sty appendFormat:@"text-shadow: #%0.9X %fpx %fpx 0; ", ip, div->styleLine->shadowDist*2., div->styleLine->shadowDist*2.];
break;
default:
NSLog(@"unimplemented tag type %d",tag);
}
}
-(void)htmlifyDivArray:(NSArray*)divs
{
int div_count = [divs count], i;
for (i = 0; i < div_count; i++) {
SubRenderDiv *div = [divs objectAtIndex:i];
int j, spancount = [div->spans count], spans = 1, close_div = 0;
if (div->posX > -1) {
[html appendFormat:@"", div->posY, div->posX];
close_div = 1;
}
[html appendFormat:@"", div->styleLine->name];
for (j = 0; j < spancount; j++) {
SubRenderSpan *span = [div->spans objectAtIndex:j];
NSMutableString *ex = span->ex;
int exl = [ex length];
if (exl) {[html appendFormat:@"",ex]; spans++;}
[html appendString:htmlfilter([div->text substringWithRange:NSMakeRange(span->offset, ((j == (spancount-1)) ? [div->text length] : ((SubRenderSpan*)[div->spans objectAtIndex:j+1])->offset) - span->offset)])];
}
while (spans--) [html appendString:@""];
if (close_div) [html appendString:@"
"];
[html appendString:@"\n"];
}
}
-(void)addSub:(SubLine*)sl
{
unichar *ubuf = malloc(sizeof(unichar) * [sl->line length]);
NSArray *divs = SubParsePacket(sl->line, sc, self, ubuf);
free(ubuf);
NSMutableArray *top = [NSMutableArray array], *bot = [NSMutableArray array], *abs = [NSMutableArray array];
int div_count = [divs count], i;
[html appendString:@"\n"];
for (i = 0; i < div_count; i++) {
SubRenderDiv *div = [divs objectAtIndex:i];
if (div->posX > -1) [abs addObject:div]; else if (div->alignV == kSubAlignmentTop) [top addObject:div]; else [bot insertObject:div atIndex:0];
}
if ([top count]) {
[html appendString:@"
\n"];
[self htmlifyDivArray:top];
[html appendString:@"
\n"];
}
if ([bot count]) {
[html appendString:@"
\n"];
[self htmlifyDivArray:bot];
[html appendString:@"
\n"];
}
[self htmlifyDivArray:abs];
[html appendString:@"
\n"];
[html appendString:@"
\n"];
}
-(void)endOfFile
{
[html appendString:@""];
}
@end
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
SubContext *sc; SubSerializer *ss;
SubHTMLExporter *htm = [[SubHTMLExporter alloc] init];
SubLoadSSAFromPath([NSString stringWithUTF8String:argv[1]],&sc,&ss,htm);
[htm endOfHead];
while (![ss isEmpty]) {
NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];
SubLine *sl = [ss getSerializedPacket];
if ([sl->line length] == 1) continue;
[htm addSub:sl];
[pool2 release];
}
[htm endOfFile];
printf([htm->html UTF8String]);
[pool release];
return 0;
}