//
//  TextDrawable.m
//  pdftest
//
//  Created by Ray on 10/12/16.
//  Copyright © 2016 United Software Applications, Inc. All rights reserved.
//

#import "TextDrawable.h"
#import <CoreText/CoreText.h>
#import "TextUtils.h"

@implementation TextDrawable


-(instancetype) init:(CGRect) rect source_type:(NSString*) source_type source:(NSString*)source textAlignment:(NSString*)textAlignment vAlign:(NSString*)vAlign size:(NSString*)size
{
    
    if (self = [super init]) {
        //        NSMutableDictionary* m1=[drawableTemplate mutableCopy];
        //        NSMutableDictionary* m2=[drawableTemplate mutableCopy];
        //        [self setDrawableTemplate:[[RAUtils string2dict:[RAUtils dict2string:drawableTemplate]]  mutableCopy] ];
        
        NSMutableDictionary * drawableTemplate = [TextDrawable createTextTemplate:rect source_type:source_type source:source textAlignment:textAlignment vAlign:vAlign size:size];
        
        
        [self setDrawableTemplate:[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:drawableTemplate]] ];
        
    }
    return self;
    
}
+(NSMutableDictionary *) createTextTemplate:(CGRect) rect source_type:(NSString*) source_type source:(NSString*)source textAlignment:(NSString*)textAlignment vAlign:(NSString*)vAlign size:(NSString*)size
{
    

    
    
    
    
    if(textAlignment.length==0)
        textAlignment= @"Center";
    if(vAlign.length==0)
        vAlign= @"Middle";
    if(size.length==0)
        vAlign= @"10";

    
    
    NSMutableDictionary* ret=[super createDrawableTemplate:rect];
    
    ret[@"type"]=@"text" ;
    ret[@"source_type"]=source_type ;
    ret[@"source"]=source ;
    ret[@"text"]=source ;
    ret[@"textAlignment"]=textAlignment ;
    ret[@"vAlign"]=vAlign ;
    ret[@"size"]=size ;
    
    return ret;
}


-(void) setDrawableTemplate:(NSMutableDictionary *)drawableTemplate
{
    
    [super setDrawableTemplate:drawableTemplate];
    
    
    
    NSString* align= drawableTemplate[@"textAlignment"];
    if(align.length==0 || [align.lowercaseString isEqualToString:@"left"])
    {
        self.textalignment= kCTTextAlignmentLeft;
    }
    else if([align.lowercaseString isEqualToString:@"right"])
    {
        self.textalignment= kCTTextAlignmentRight;
    }
    else if([align.lowercaseString isEqualToString:@"center"])
    {
        self.textalignment= kCTTextAlignmentCenter;
    }
    else
    {
        self.textalignment= kCTTextAlignmentLeft;
    }
    
    
    
    
    NSString* colorvalue=drawableTemplate[@"color"];
    if(colorvalue.length>0 )
    {
        unsigned long color = strtoul([colorvalue UTF8String],0,16);
        self.textColor= UIColorFromRGB(color);
    }
    else
    {
        self.textColor= [UIColor blackColor];
        
    }
    
    
    //    kCTTextAlignmentJustified CT_ENUM_AVAILABLE(10_8, 6_0) = 3,
    //    kCTTextAlignmentNatural   CT_ENUM_AVAILABLE(10_8, 6_0) = 4,
    
    
    //    _drawableTemplate = drawableTemplate;
    //    self.margin_left=[self.drawableTemplate[@"margin_left"] doubleValue];
    //    self.margin_right=[self.drawableTemplate[@"margin_right"] doubleValue];
    //    self.margin_top=[self.drawableTemplate[@"margin_top"] doubleValue];
    //    self.margin_bottom=[self.drawableTemplate[@"margin_bottom"] doubleValue];
    //    self.rect = CGRectMake(0, 0, [self.drawableTemplate[@"width"] doubleValue], [self.drawableTemplate[@"height"] doubleValue]);
}


-(CGRect) Query_Rect:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
{
    
            bool expand=[self.drawableTemplate[@"expand"] boolValue];
    if(!expand)
    {
    CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
    
    return parentrect;
    }
    else
    {
        
        
        
        
        NSString * source=self.drawableTemplate[@"source_type"];
        if(source==nil)
            source=@"const";
        if([source isEqualToString:@"const"])
        {
            self.text=self.drawableTemplate[@"text"];
            //  self.text=[self.text stringByReplacingOccurrencesOfString:@"\r\n" withString:@"<br>"];
            
        }
        else if([source isEqualToString:@"data"])
        {
            if([self.drawableTemplate[@"source_isexpression"] boolValue])
            {
                NSString *content =  data[self.drawableTemplate[@"source"]];
                NSString *pattern = @"\\$\\.\\{([\\s\\S]*?)\\}\\.\\$";
                NSArray* matches=[TextUtils expression_varable:content regex:pattern];
                //            if (matches) {
                //                for (NSTextCheckingResult *match in matches) {
                //                    for (int i = 0; i < match.numberOfRanges; ++i) {
                //                        DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
                //                    }
                //                }
                //            }
                if (matches)
                {
                    self.text=content;
                    for (NSTextCheckingResult *match in matches)
                    {
                        
                        for (int i = 0; i < match.numberOfRanges/2; ++i) {
                            DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
                            DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
                            
                            self.text=[self.text stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[NSString stringWithFormat:@"%@",data[[content substringWithRange:[match rangeAtIndex:i+1]]]]];
                        }
                    }
                }
                //self.text=content;
                
            }
            else
            {
                self.text=data[self.drawableTemplate[@"source"]];
            }
        }
        
        if(self.text==nil)
            self.text=@"";
        
        
        
        
        
//        if([self.text isEqualToString:@"www.newpacificdirect.com"])
//        {
//            int debug=0;
//        }
        
        
        bool bold = [self.drawableTemplate[@"bold"] boolValue];
        bool italic = [self.drawableTemplate[@"italic"] boolValue];
        NSString* font=self.drawableTemplate[@"font"];
        
        //    [super flipContext:context ContextHeight:flip_height];
        // super flipContext:context ContextHeight:<#(double)#>
        CGFloat fontsize = [self.drawableTemplate[@"size"] doubleValue];
        
        //NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
        //创建AttributeStringfdsa
        
        NSMutableAttributedString *string = nil;
        //    if([self.drawableTemplate[@"ishtml"] boolValue])
        //    {
        //        string=[[[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil] mutableCopy];
        //
        //    }
        //    else
        {
            string=[[NSMutableAttributedString alloc] initWithString:self.text];
            //创建字体以及字体大小
            //        CTFontRef ctfont = [self CreateFont:font size:fontsize bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
            //        //    CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
            //        //字体，把helvetica 样式加到整个，string上
            //        [string addAttribute:(id)kCTFontAttributeName
            //                       value:CFBridgingRelease(ctfont)
            //                       range:NSMakeRange(0, [string length])];
            //
            //        //字体样式 ,把helveticaBold 样式加到整个，string上
            //        //    [string addAttribute:(id)kCTFontAttributeName
            //        //                   value:CFBridgingRelease(helveticaBold)
            //        //                   range:NSMakeRange(0, [string length])];
            //
            //        //颜色,此处为黑色，你可以自己改颜色，[UIColor redColor]
            //        [string addAttribute:(id)kCTForegroundColorAttributeName
            //                       value:(id)self.textColor.CGColor
            //                       range:NSMakeRange(0, [string length])];
            
            string = [self richtext2attributedstring:string font:font size:fontsize bold:bold];
            
            
            //设置字体间距
            long number = self.characterSpace;
            CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
            [string addAttribute:(id)kCTKernAttributeName value:CFBridgingRelease(num) range:NSMakeRange(0, [string length])];
            //CFRelease(num);
            
            
            //创建文本对齐方式
            CTTextAlignment alignment = self.textalignment;//对齐方
            CTParagraphStyleSetting alignmentStyle;
            alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;
            alignmentStyle.valueSize=sizeof(alignment);
            alignmentStyle.value=&alignment;
            
            //创建文本,    行间距
            CGFloat lineSpace=self.lineSpace;//间距数据
            CTParagraphStyleSetting lineSpaceStyle;
            lineSpaceStyle.spec=kCTParagraphStyleSpecifierLineSpacing;
            lineSpaceStyle.valueSize=sizeof(lineSpace);
            lineSpaceStyle.value=&lineSpace;
            
            //设置  line break;
            CTLineBreakMode linebreakmode = kCTLineBreakByTruncatingTail;
            CTParagraphStyleSetting linebreakStyle;
            linebreakStyle.spec = kCTParagraphStyleSpecifierLineBreakMode;
            linebreakStyle.valueSize = sizeof(CGFloat);
            linebreakStyle.value = &linebreakmode;
            
            
            //设置  段落间距
            CGFloat paragraph = self.paragraphSpace;
            CTParagraphStyleSetting paragraphStyle;
            paragraphStyle.spec = kCTParagraphStyleSpecifierParagraphSpacing;
            paragraphStyle.valueSize = sizeof(CGFloat);
            paragraphStyle.value = &paragraph;
            
            
            
            
            //创建样式数组
            CTParagraphStyleSetting settings[]={
                alignmentStyle,lineSpaceStyle,paragraphStyle,linebreakStyle
            };
            
            //设置样式
            CTParagraphStyleRef paragraphStyle1 = CTParagraphStyleCreate(settings, sizeof(settings));
            
            //给字符串添加样式attribute
            [string addAttribute:(id)kCTParagraphStyleAttributeName
                           value:CFBridgingRelease(paragraphStyle1)
                           range:NSMakeRange(0, [string length])];
            
        }
        
        
        
        //     CGRect pdfrect=[self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
        // [string drawInRect:pdfrect];
        
        
        //   [self.text drawInRect:pdfrect withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:40],NSForegroundColorAttributeName : [UIColor redColor]}];
        
        // layout master
        CTFramesetterRef  framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);
        //计算文本绘制size ，这里300是文字宽度，你可以自己更改为247，但是要记得，在height 方法里的这个位置，也改为247
        CGSize tmpSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(self.rect.size.width-self.margin_left-self.margin_right, MAXFLOAT), NULL);
        //创建textBoxSize以设置view的frame
        CGSize textBoxSize = CGSizeMake((int)tmpSize.width + 1, (int)tmpSize.height + 1);
        //    DebugLog(@"textBoxSize0  == %f,%f,%f",textBoxSize.width,textBoxSize.height,textBoxSize.width / textBoxSize.height);
        //   self.frame = CGRectMake(0, 0, textBoxSize.width , textBoxSize.height);
        //    [string release];
        
        //- (void)drawRect:(CGRect)rect;代码
        
        
        
        
        //    CGMutablePathRef leftColumnPath = CGPathCreateMutable();
        
        CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
        

        double height =0;
        if(tmpSize.height<parentrect.size.height)
            height=tmpSize.height;
        else
            if(expand)
            {
                height=tmpSize.height;
                self.rect = CGRectMake(self.rect.origin.x, self.rect.origin.y, self.rect.size.width, height+self.margin_top+self.margin_bottom);
            }
            else
                height=parentrect.size.height;
        
        CGRect rect=CGRectMake(parentrect.origin.x, parentrect.origin.y, parentrect.size.width, height);
        
        CGRect expand_rect=rect;
        
        //    CGRect rect=[RAUtils rectAlign:parentrect rect:scalerect hAlign:self.hAlign vAlign:self.vAlign];
        //    rect=[RAUtils rectVAlign:parentrect rect:rect vAlign:self.vAlign];
        //
        //    // CGRect pdfrect = [self to_pdf_rect:p_rect pos:self.rect contextHeight:flip_height];
        //
        //    rect= [self parent_to_pdf_rect:rect contextHeight:flip_height];
        //    //  pdfrect=CGRectMake(pdfrect.origin.x, flip_height-pdfrect.origin.y, pdfrect.size.width, pdfrect.size.height);
        //    CGPathAddRect(leftColumnPath, NULL,
        //                  rect);
        //
        //    CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,
        //                                                    CFRangeMake(0, 0),
        //                                                    leftColumnPath, NULL);
        //
        //    //    DebugLog(@"textBoxSize1  == %f,%f",self.frame.size.width,self.frame.size.height);
        //    // flip the coordinate system
        //    //    CGContextRef context = UIGraphicsGetCurrentContext();
        //
        //
        //    //    CGContextClearRect(context, self.rect);
        //    //    CGContextSetFillColorWithColor(context, [[UIColor whiteColor]CGColor]);
        //    //    CGContextFillRect(context, CGRectMake(0, 0, self.rect.size.width, self.rect.size.height));
        //    
        //    
        //    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
        //    //   CGContextTranslateCTM(context, 0, self.rect.size.height);
        //    //   CGContextScaleCTM(context, 1.0, -1.0);
        //    
        //    // draw
        //    CTFrameDraw(leftFrame, context);
        //    
        //    
        //    CFRelease(leftFrame);
        //    // cleanup
        //    
        //    CGPathRelease(leftColumnPath);
        CFRelease(framesetter);
        
        
        //    return self.rect;
        //  [self DrawBound:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
        if(expand&&expand_rect.size.height>parentrect.size.height)
            return expand_rect;
        else
            return parentrect;
        //    return CGPointMake(parentrect.origin.x+parentrect.size.width, parentrect.origin.y+parentrect.size.height);
        
        //    [super restoreFlip:context ContextHeight:flip_height];
    }
    
    
}
-(CTFontRef)CreateFont:(NSString*)name  size:(double)size bold:(bool)bold
{
    
    if(name.length==0)
    {
        name=@"Helvetica";
        //        name=@"DejaVu Sans";
    }
    if(size==0)
    {
        size=10;
    }
    NSString* style = @"Regular";
    if(bold)
        style=@"Bold";
    
    //name=@"Courier";
    
    NSDictionary *fontAttributes =
    [NSDictionary dictionaryWithObjectsAndKeys:
     name, (NSString *)kCTFontFamilyNameAttribute,
     style, (NSString *)kCTFontStyleNameAttribute,
     [NSNumber numberWithFloat:size],
     (NSString *)kCTFontSizeAttribute,
     nil];
    // Create a descriptor.
    CFDictionaryRef cffontAttributes =(__bridge CFDictionaryRef)fontAttributes;
    CTFontDescriptorRef descriptor =
    CTFontDescriptorCreateWithAttributes(cffontAttributes);
    
 //      CFBridgingRelease(cffontAttributes);
    
    // Create a font using the descriptor.
    CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, 0.0, NULL);
    CFBridgingRelease(descriptor);
    
    return font;
    
    //    if(bold)
    //    {
    //        CTFontRef font=CTFontCreateWithName((__bridge CFStringRef)name, size, NULL);
    //        CTFontRef font_bold =CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, kCTFontBoldTrait, kCTFontBoldTrait);
    //        CFBridgingRelease(font);
    //        return font_bold;
    //    }
    //    return CTFontCreateWithName((__bridge CFStringRef)name, size, NULL);
}
//-(NSString*) QueryFontName:(NSString*)font
//{
//    if(font==nil)
//    {
//        return @"Helvetica";
//    }
//    else if([font.lowercaseString isEqualToString:@"kalinga"])
//    {
//        return @"kalinga";
//    }
//    return @"Helvetica";
//}
-(NSMutableAttributedString*) richtext2attributedstring:(NSMutableAttributedString*)string font:(NSString*)font  size:(double)size bold:(bool)bold
{
    //    UILabel* uilabel=[[UILabel alloc]init];
    //    uilabel.font=[UIFont fontWithName:font size:size];
    //    NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
    //    uilabel.attributedText = attrStr;
    //    DebugLog(@"%@", attrStr);
    //    DebugLog(@"%@", uilabel.attributedText);
    
    CTFontRef ctfont = [self CreateFont:font size:size bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);b
    
    //CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
    //    CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
    //字体，把helvetica 样式加到整个，string上
    [string addAttribute:(id)kCTFontAttributeName
                   value:CFBridgingRelease(ctfont)
                   range:NSMakeRange(0, [string length])];
    
    //颜色,此处为黑色，你可以自己改颜色，[UIColor redColor]
    [string addAttribute:(id)kCTForegroundColorAttributeName
                   value:(id)self.textColor.CGColor
                   range:NSMakeRange(0, [string length])];
    
    
    if(!bold)
    {
        CTFontRef ctfont_bold = [self CreateFont:font size:size bold:true];
        NSString* newstring= nil;
        //   NSString *content =  string.string ;
        NSString *pattern = @"\\<b\\>([\\s\\S]*?)\\<\\/b\\>";
        //        NSArray* matches=[TextUtils expression_varable:content regex:pattern];
        //        if (matches) {
        //            for (NSTextCheckingResult *match in matches) {
        //                for (int i = 0; i < match.numberOfRanges; ++i) {
        //                    DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
        //                }
        //            }
        //        }
        NSTextCheckingResult * match=[TextUtils expression_findfistMatch:string.string regex:pattern];
        
        while(match)
        {
            //for (int i = 0; i < match.numberOfRanges/2; ++i)
            {
                int i=0;
                DebugLog(@"%d->range with richtext label: %d,%d",i, [match rangeAtIndex:i].location,[match rangeAtIndex:i].length);
                DebugLog(@"%d-> range of text: %d,%d ",i+1, [match rangeAtIndex:i+1].location,[match rangeAtIndex:i+1].length);
                
                
                DebugLog(@"string length: %d",string.string.length);
                [string addAttribute:(id)kCTFontAttributeName
                               value:(__bridge id _Nonnull)(ctfont_bold)
                               range:[match rangeAtIndex:i+1]];
                
                [string replaceCharactersInRange:NSMakeRange([match rangeAtIndex:i+1].location+[match rangeAtIndex:i+1].length, [match rangeAtIndex:i].location+[match rangeAtIndex:i].length-([match rangeAtIndex:i+1].location+[match rangeAtIndex:i+1].length)) withString:@""];
                [string replaceCharactersInRange:NSMakeRange([match rangeAtIndex:i].location, [match rangeAtIndex:i+1].location-[match rangeAtIndex:i].location) withString:@""];
                
                DebugLog(@"string after replace: %@",string.string);
                //newstring=[newstring stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[content substringWithRange:[match rangeAtIndex:i+1]]];
                match=[TextUtils expression_findfistMatch:string.string regex:pattern];
            }
        }
        //        if (matches)
        //        {
        //            newstring=content;
        //            for (NSTextCheckingResult *match in matches)
        //            {
        //
        //                for (int i = 0; i < match.numberOfRanges/2; ++i)
        //                {
        //                    DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
        //                    DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
        //
        //                    [string addAttribute:(id)kCTFontAttributeName
        //                                   value:CFBridgingRelease(ctfont_bold)
        //                                   range:[match rangeAtIndex:i+1]];
        //
        //                    newstring=[newstring stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[content substringWithRange:[match rangeAtIndex:i+1]]];
        //
        //                }
        //            }
        //        }
        
        
        
        CFBridgingRelease(ctfont_bold);
    }
    
    
    return string;
}
-(CGRect) Draw:(CGContextRef) context dataSource:(NSMutableDictionary*)data ParentRect:(CGRect)p_rect startX:(double) x startY:(double) y flipHeight:(double)flip_height range:(NSRange)between_header_and_footer
{
    
    
    
    
    NSString * source=self.drawableTemplate[@"source_type"];
    if(source==nil)
        source=@"const";
    if([source isEqualToString:@"const"])
    {
        self.text=self.drawableTemplate[@"text"];
        //  self.text=[self.text stringByReplacingOccurrencesOfString:@"\r\n" withString:@"<br>"];
        
    }
    else if([source isEqualToString:@"data"])
    {
        if([self.drawableTemplate[@"source_isexpression"] boolValue])
        {
            NSString *content =  data[self.drawableTemplate[@"source"]];
            NSString *pattern = @"\\$\\.\\{([\\s\\S]*?)\\}\\.\\$";
            NSArray* matches=[TextUtils expression_varable:content regex:pattern];
            //            if (matches) {
            //                for (NSTextCheckingResult *match in matches) {
            //                    for (int i = 0; i < match.numberOfRanges; ++i) {
            //                        DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
            //                    }
            //                }
            //            }
            if (matches)
            {
                self.text=content;
                for (NSTextCheckingResult *match in matches)
                {
                    
                    for (int i = 0; i < match.numberOfRanges/2; ++i) {
                        DebugLog(@"%d-> %@",i, [content substringWithRange:[match rangeAtIndex:i]]);
                        DebugLog(@"%d-> %@",i+1, [content substringWithRange:[match rangeAtIndex:i+1]]);
                        
                        self.text=[self.text stringByReplacingOccurrencesOfString:[content substringWithRange:[match rangeAtIndex:i]] withString:[NSString stringWithFormat:@"%@",data[[content substringWithRange:[match rangeAtIndex:i+1]]]]];
                    }
                }
            }
            //self.text=content;
            
        }
        else
        {
            self.text=data[self.drawableTemplate[@"source"]];
        }
    }
    
    if(self.text==nil)
        self.text=@"";
    
    
    
    
    
//    if([self.text isEqualToString:@"www.newpacificdirect.com"])
//    {
//        int debug=0;
//    }
    
    
    bool bold = [self.drawableTemplate[@"bold"] boolValue];
    bool italic = [self.drawableTemplate[@"italic"] boolValue];
    NSString* font=self.drawableTemplate[@"font"];
    
    //    [super flipContext:context ContextHeight:flip_height];
    // super flipContext:context ContextHeight:<#(double)#>
    CGFloat fontsize = [self.drawableTemplate[@"size"] doubleValue];
    
    //NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
    //创建AttributeStringfdsa
    
    NSMutableAttributedString *string = nil;
    //    if([self.drawableTemplate[@"ishtml"] boolValue])
    //    {
    //        string=[[[NSAttributedString alloc] initWithData:[self.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil] mutableCopy];
    //
    //    }
    //    else
    {
        string=[[NSMutableAttributedString alloc] initWithString:self.text];
        //创建字体以及字体大小
        //        CTFontRef ctfont = [self CreateFont:font size:fontsize bold:bold];//CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
        //        //    CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica"), fontsize, NULL);
        //        //字体，把helvetica 样式加到整个，string上
        //        [string addAttribute:(id)kCTFontAttributeName
        //                       value:CFBridgingRelease(ctfont)
        //                       range:NSMakeRange(0, [string length])];
        //
        //        //字体样式 ,把helveticaBold 样式加到整个，string上
        //        //    [string addAttribute:(id)kCTFontAttributeName
        //        //                   value:CFBridgingRelease(helveticaBold)
        //        //                   range:NSMakeRange(0, [string length])];
        //
        //        //颜色,此处为黑色，你可以自己改颜色，[UIColor redColor]
        //        [string addAttribute:(id)kCTForegroundColorAttributeName
        //                       value:(id)self.textColor.CGColor
        //                       range:NSMakeRange(0, [string length])];
        
        string = [self richtext2attributedstring:string font:font size:fontsize bold:bold];
        
        
        //设置字体间距
        long number = self.characterSpace;
        CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
        [string addAttribute:(id)kCTKernAttributeName value:CFBridgingRelease(num) range:NSMakeRange(0, [string length])];
        //CFRelease(num);
        
        
        //创建文本对齐方式
        CTTextAlignment alignment = self.textalignment;//对齐方
        CTParagraphStyleSetting alignmentStyle;
        alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;
        alignmentStyle.valueSize=sizeof(alignment);
        alignmentStyle.value=&alignment;
        
        //创建文本,    行间距
        CGFloat lineSpace=self.lineSpace;//间距数据
        CTParagraphStyleSetting lineSpaceStyle;
        lineSpaceStyle.spec=kCTParagraphStyleSpecifierLineSpacing;
        lineSpaceStyle.valueSize=sizeof(lineSpace);
        lineSpaceStyle.value=&lineSpace;
        
        //设置  line break;
        CTLineBreakMode linebreakmode = kCTLineBreakByTruncatingTail;
        CTParagraphStyleSetting linebreakStyle;
        linebreakStyle.spec = kCTParagraphStyleSpecifierLineBreakMode;
        linebreakStyle.valueSize = sizeof(CGFloat);
        linebreakStyle.value = &linebreakmode;
        
        
        //设置  段落间距
        CGFloat paragraph = self.paragraphSpace;
        CTParagraphStyleSetting paragraphStylesetting;
        paragraphStylesetting.spec = kCTParagraphStyleSpecifierParagraphSpacing;
        paragraphStylesetting.valueSize = sizeof(CGFloat);
        paragraphStylesetting.value = &paragraph;
        
        
        
        
        //创建样式数组
        CTParagraphStyleSetting settings[]={
            alignmentStyle,lineSpaceStyle,paragraphStylesetting,linebreakStyle
        };
        
        //设置样式
        CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, sizeof(settings));
        
        //给字符串添加样式attribute
        [string addAttribute:(id)kCTParagraphStyleAttributeName
                       value:CFBridgingRelease(paragraphStyle)
                       range:NSMakeRange(0, [string length])];
        
    }
    
    
    
    //     CGRect pdfrect=[self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
    // [string drawInRect:pdfrect];
    
    
    //   [self.text drawInRect:pdfrect withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:40],NSForegroundColorAttributeName : [UIColor redColor]}];
    
    // layout master
    CTFramesetterRef  framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);
    //计算文本绘制size ，这里300是文字宽度，你可以自己更改为247，但是要记得，在height 方法里的这个位置，也改为247
    CGSize tmpSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(self.rect.size.width-self.margin_left-self.margin_right, MAXFLOAT), NULL);
    //创建textBoxSize以设置view的frame
    CGSize textBoxSize = CGSizeMake((int)tmpSize.width + 1, (int)tmpSize.height + 1);
    //    DebugLog(@"textBoxSize0  == %f,%f,%f",textBoxSize.width,textBoxSize.height,textBoxSize.width / textBoxSize.height);
    //   self.frame = CGRectMake(0, 0, textBoxSize.width , textBoxSize.height);
    //    [string release];
    
    //- (void)drawRect:(CGRect)rect;代码
    
    
    
    
    CGMutablePathRef leftColumnPath = CGPathCreateMutable();
    
    CGRect parentrect = [self to_parent_rect:p_rect pos:self.rect offsetX:0 offsetY:0];
    
    bool expand=[self.drawableTemplate[@"expand"] boolValue];
    double height =0;
    if(tmpSize.height<parentrect.size.height)
        height=tmpSize.height;
    else
        if(expand)
        {
            height=tmpSize.height;
            self.rect = CGRectMake(self.rect.origin.x, self.rect.origin.y, self.rect.size.width, height+self.margin_top+self.margin_bottom);
        }
        else
            height=parentrect.size.height;
    
    CGRect rect=CGRectMake(parentrect.origin.x, parentrect.origin.y, parentrect.size.width, height);
    
    CGRect expand_rect=rect;
    
    //    CGRect rect=[RAUtils rectAlign:parentrect rect:scalerect hAlign:self.hAlign vAlign:self.vAlign];
    rect=[TextUtils rectVAlign:parentrect rect:rect vAlign:self.vAlign];
    
    // CGRect pdfrect = [self to_pdf_rect:p_rect pos:self.rect contextHeight:flip_height];
    
    rect= [self parent_to_pdf_rect:rect contextHeight:flip_height];
    //  pdfrect=CGRectMake(pdfrect.origin.x, flip_height-pdfrect.origin.y, pdfrect.size.width, pdfrect.size.height);
    CGPathAddRect(leftColumnPath, NULL,
                  rect);
    
    CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,
                                                    CFRangeMake(0, 0),
                                                    leftColumnPath, NULL);
    
    //    DebugLog(@"textBoxSize1  == %f,%f",self.frame.size.width,self.frame.size.height);
    // flip the coordinate system
    //    CGContextRef context = UIGraphicsGetCurrentContext();
    
    
    //    CGContextClearRect(context, self.rect);
    //    CGContextSetFillColorWithColor(context, [[UIColor whiteColor]CGColor]);
    //    CGContextFillRect(context, CGRectMake(0, 0, self.rect.size.width, self.rect.size.height));
    
    
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    //   CGContextTranslateCTM(context, 0, self.rect.size.height);
    //   CGContextScaleCTM(context, 1.0, -1.0);
    
    // draw
    CTFrameDraw(leftFrame, context);
    
    
    CFRelease(leftFrame);
    // cleanup
    
    CGPathRelease(leftColumnPath);
    CFRelease(framesetter);
    
    
    //    return self.rect;
    [self DrawBound:context dataSource:data ParentRect:p_rect startX:x startY:y flipHeight:flip_height range:between_header_and_footer];
    if(expand&&expand_rect.size.height>parentrect.size.height)
        return expand_rect;
    else
        return parentrect;
    //    return CGPointMake(parentrect.origin.x+parentrect.size.width, parentrect.origin.y+parentrect.size.height);
    
    //    [super restoreFlip:context ContextHeight:flip_height];
}


@end
