*)formatter
textHandler:(XTBaseTextHandler *)textHandler
{
[super format:formatter textHandler:textHandler];
NSArray *formattedElements = [formatter handleHtmlTagTdOpen];
[textHandler receiveFormattedElements:formattedElements];
}
- (XTFormattingSpecification *)makeFormattingSpecificationFrom:(XTFormattingSpecification *)formattingSpec
{
XTFormattingSpecification *res = [XTFormattingSpecification specificationFrom:formattingSpec];
res.blockquoteLevel = 0;
res.listLevel = 0;
res.inListItem = NO;
res.inListHeader = NO;
res.inListItemAfterFirstParagraph = NO;
res.dlLevel = 0;
res.dd = NO;
//TODO !!! adapt: temp hack for gilded.gam (after 3 commands) nested table hack ( within | in nesting table)
if (formattingSpec.activeTextTableCell != nil) {
return res;
}
formattingSpec.tableColumnIndexPlusOne +=1; // yes, must modify parent's
res.tableColumnIndexPlusOne +=1;
//XTFormattingSpecification *res = [XTFormattingSpecification specificationFrom:formattingSpec];
//TODO !!! handle res.activeTextTable == nil
NSInteger tableRowIndex = (res.tableRowIndexPlusOne - 1);
NSInteger tableColumnIndex = (res.tableColumnIndexPlusOne - 1);
XTTextTableBlock *textTableBlock = [[XTTextTableBlock alloc] initWithTable:res.activeTextTable
startingRow:tableRowIndex
rowSpan:1 //TODO !!!
startingColumn:tableColumnIndex
columnSpan:1]; //TODO !!!
[textTableBlock setInheritedHeadIndent:[res totalHeadIndent]];
[textTableBlock setInheritedTailIndent:[res totalTailIndent]];
[res.activeTextTable addTextTableBlock:textTableBlock];
res.activeTextTableCell = textTableBlock;
res.tableVerticalAlignMode = [self getTableVerticalAlignModeWithDefault:formattingSpec.tableVerticalAlignMode];
[textTableBlock setVerticalAlignmentMode:res.tableVerticalAlignMode];
NSString *backgroundColorAttr = [self attributeAsString:@"bgcolor"];
if (backgroundColorAttr != nil) {
XTHtmlColor *htmlColor = [XTHtmlColor forAttributeValue:backgroundColorAttr];
res.textTableCellHtmlColor = htmlColor;
}
if (res.textTableCellHtmlColor.color != nil) {
[textTableBlock setBackgroundHtmlColor:res.textTableCellHtmlColor];
} else if (res.textTableRowHtmlColor != nil) {
[textTableBlock setBackgroundHtmlColor:res.textTableRowHtmlColor];
}
NSNumber *widthAsPercentage = [self attributeAsPercentage:@"width"];
if (widthAsPercentage != nil) {
[textTableBlock setWidthAsPercentage:widthAsPercentage];
} else {
NSNumber *widthAsPoints = [self attributeAsNumberWithOptionalSuffix:@"width"];
if (widthAsPoints != nil) {
[textTableBlock setWidthAsPoints:widthAsPoints];
}
}
[textTableBlock setHeightAsPercentage:formattingSpec.trHeightAsPercentage];
[textTableBlock setHeightAsPoints:formattingSpec.trHeightAsPoints];
[textTableBlock setHeightStar:formattingSpec.trHeightStar];
NSNumber *heightAsPercentage = [self attributeAsPercentage:@"height"];
if (heightAsPercentage != nil) {
[textTableBlock setHeightAsPercentage:heightAsPercentage];
} else {
NSNumber *heightAsPoints = [self attributeAsNumberWithOptionalSuffix:@"height"];
if (heightAsPoints != nil) {
[textTableBlock setHeightAsPoints:heightAsPoints];
}
}
XTHtmlTagTable *parentTable = [self findParentTagTable];
if (parentTable != nil) {
NSNumber *tableId = parentTable.tableId;
textTableBlock.tableId = tableId;
if (parentTable.tableBorderSize >= 1) {
NSInteger borderSize = 1;
//TODO !!! tr/td's attr can override:
[textTableBlock setBorderColor:[NSColor blackColor]];
[textTableBlock setWidth:borderSize type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder];
//textTableBlock.collapsesBorders = YES; //TODO !!! ? find equiv.
}
//TODO !!! tr/td's attr might override:
NSInteger padding = parentTable.cellPadding;
if (padding >= 1) {
[textTableBlock setWidth:padding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding];
}
//TODO !!! attr override?
NSColor *cellBorderColorLeftAndTop = [XTDefaultColours tableCellBorderColorLeftAndTop];
NSColor *cellBorderColorRightAndBottom = [XTDefaultColours tableCellBorderColorRightAndBottom];
[textTableBlock setBorderColor:cellBorderColorLeftAndTop forEdge:NSMinXEdge];
[textTableBlock setBorderColor:cellBorderColorLeftAndTop forEdge:NSMinYEdge];
[textTableBlock setBorderColor:cellBorderColorRightAndBottom forEdge:NSMaxXEdge];
[textTableBlock setBorderColor:cellBorderColorRightAndBottom forEdge:NSMaxYEdge];
[textTableBlock recalcCellMargins];
} else {
XT_DEF_SELNAME;
XT_WARN_0(@"parentTable == nil");
}
// "default is left alignment for | and center alignment for | although you can override this with an ALIGN attribute on the TR element." (HTML 3.2 spec)
XTTextAlignMode defaultTextAlignMode = res.textAlignMode; // from parent tag (TR)
if (defaultTextAlignMode == XT_TEXT_ALIGN_UNSPECIFIED) {
defaultTextAlignMode = [self getDefaultTextAlignMode];
}
res.textAlignMode = [self getTextAlignModeWithDefault:defaultTextAlignMode];
return res;
}
- (XTTextAlignMode)getDefaultTextAlignMode
{
return XT_TEXT_ALIGN_LEFT;
}
- (XTHtmlTagTable *)findParentTagTable
{
//TODO !!! refine: must handle misformed html, but not surrounding
XTHtmlTagTable *res = nil;
XTHtmlTagContainer *container = [self getContainer];
if ([container isKindOfClass:[XTHtmlTagTr class]]) {
XTHtmlTagTr *container2 = (XTHtmlTagTr *)[container getContainer];
if ([container2 isKindOfClass:[XTHtmlTagTable class]]) {
res = (XTHtmlTagTable *)container2;
}
}
return res;
}
- (XTHtmlTagContainer *)findCorrectContainer:(XTHtmlTagContainer *)defaultContainer
{
XTHtmlTagContainer *res = defaultContainer;
for (XTHtmlTagContainer *container = defaultContainer;
container != nil;
container = container.container) {
if ([container isKindOfClass:[XTHtmlTagTr class]]) {
// Our nearest is the one
res = container;
break;
} else if ([container isKindOfClass:[XTHtmlTagTable class]]) {
// Don't look outside nearest
break;
}
}
return res;
}
- (void)formatExit:(NSObject *)formatter
textHandler:(XTBaseTextHandler *)textHandler
{
//TODO !!! very unfinished
NSArray *formattedElements = [formatter handleHtmlTagTdClose:self];
[textHandler receiveFormattedElements:formattedElements];
[super formatExit:formatter textHandler:textHandler];
XTHtmlTagTable *parentTagTable = [self findParentTagTable];
XTTextTable *textTable = parentTagTable.textTable;
[textTable recalcCellMargins];
}
@end
|