Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: honcheng/RTLabel
base: master
...
head fork: harpher/RTLabel
compare: master
Checking mergeability… Don't worry, you can still create the pull request.
  • 1 commit
  • 4 files changed
  • 0 commit comments
  • 1 contributor
View
55 README.md
@@ -3,60 +3,15 @@ RTLabel
Rich text formatting based on HTML-like markups for iOS.
-<img src="https://github.com/honcheng/RTLabel/raw/master/screenshot.png"/>
-
-RTLabel works like UILabel, but supports html-like markups for rich text display.
-It is based on Core Text, so it supports some of the stuff that Core Text supports
-
-Features
---------
-
-* bold and italic style
-* color and size
-* stroke
-* indenting
-* kerning
-* line spacing
-* clickable links
-
-Usage
------
+Fork from <a herf="https://github.com/honcheng/RTLabel">honcheng/RTLabel</a>
-1) Drag RTLabel.h and RTLabel.m into your project. Import CoreText framework
+<img src="https://github.com/honcheng/RTLabel/raw/master/screenshot.png"/>
- #import "RTLabel.h"
-
-2) Create RTLabel
-
- NSString *sample_text = @"<b>bold</b>,<i>italic</i> and <u>underlined</u> text, and <font face='HelveticaNeue-CondensedBold' size=20 color='#CCFF00'>text with custom font and color</font>";
-
- RTLabel *label = [[RTLabel alloc] initWithFrame:...];
- [self addSubview:label];
- [label setText:sample_text];
-
-3) Supports the following tags
-
- <b>Bold</b>
- <i>Italic</i>
- <bi>Bold & Italic</bi>
- <u>underline</u>, <u color=red>underline with color</u>
- <a href='http://..'>link</a>
- <uu>double underline</uu> , <uu color='#ccff00'>double underline with color</uu>
- <font face='HelveticaNeue-CondensedBold' size=20 color='#CCFF00'>custom font</font>
- <font face='HelveticaNeue-CondensedBold' size=20 color='#CCFF00' stroke=1>custom font with strokes</font>
- <font face='HelveticaNeue-CondensedBold' size=20 color='#CCFF00' kern=35>custom font with kerning</font>
- <p align=justify>alignment</p>
- <p indent=20>indentation</p>
+Improvement
+--------------------
+* Fixed irregular line spacing by CoreText with multi-language text
Minimum Requirements
--------------------
* ARC - this project uses ARC. If you are not using ARC in your project, add '-fobjc-arc' as a compiler flag for StyledPageControl.h and StyledPageControl.m
* XCode 4.4 and newer (auto-synthesis required)
-
-Contact
--------
-
-[twitter.com/honcheng](http://twitter.com/honcheng)
-[honcheng.com](http://honcheng.com)
-
-![](http://www.cocoacontrols.com/analytics/honcheng/rtlabel.png)
View
4 RTLabelProject/Classes/DemoTableViewCell.m
@@ -32,14 +32,14 @@ - (void)layoutSubviews
CGSize optimumSize = [self.rtLabel optimumSize];
CGRect frame = [self.rtLabel frame];
- frame.size.height = (int)optimumSize.height+5; // +5 to fix height issue, this should be automatically fixed in iOS5
+ frame.size.height = (int)optimumSize.height; // +5 to fix height issue, this should be automatically fixed in iOS5
[self.rtLabel setFrame:frame];
}
+ (RTLabel*)textLabel
{
RTLabel *label = [[RTLabel alloc] initWithFrame:CGRectMake(10,10,300,100)];
- //[label setFont:[UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:20]];
+ [label setFont:[UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:24]];
[label setParagraphReplacement:@""];
return label;
}
View
17 RTLabelProject/Classes/DemoTableViewController.m
@@ -57,9 +57,10 @@ - (id)initWithStyle:(UITableViewStyle)style
[titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:20]];
[titleLabel setText:@"RTLabel"];
[self.navigationItem setTitleView:titleLabel];
- [titleLabel setTextAlignment:UITextAlignmentCenter];
+ [titleLabel setTextAlignment:NSTextAlignmentCenter];
_dataArray = [NSMutableArray array];
+
NSMutableDictionary *row1 = [NSMutableDictionary dictionary];
[row1 setObject:@"<b>bold</b> and <i>italic</i> style" forKey:@"text"];
[self.dataArray addObject:row1];
@@ -77,17 +78,21 @@ - (id)initWithStyle:(UITableViewStyle)style
[self.dataArray addObject:row4];
NSMutableDictionary *row5 = [NSMutableDictionary dictionary];
- [row5 setObject:@"<font face='HelveticaNeue-CondensedBold' size=20 stroke=1>Text with strokes</font> " forKey:@"text"];
+ [row5 setObject:@"<font face='HelveticaNeue-CondensedBold' size=20 stroke=1>Text with strokes</font>" forKey:@"text"];
[self.dataArray addObject:row5];
NSMutableDictionary *row6 = [NSMutableDictionary dictionary];
- [row6 setObject:@"<font face='HelveticaNeue-CondensedBold' size=20 kern=35>KERN</font> " forKey:@"text"];
+ [row6 setObject:@"<font face='HelveticaNeue-CondensedBold' size=20 kern=35>KERN</font>" forKey:@"text"];
[self.dataArray addObject:row6];
NSMutableDictionary *row7 = [NSMutableDictionary dictionary];
- [row7 setObject:@"<font face='HelveticaNeue-CondensedBold' size=14><p align=justify><font color=red>JUSTIFY</font> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim </p> <p align=left><font color=red>LEFT ALIGNED</font> veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><br><p align=right><font color=red>RIGHT ALIGNED</font> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p><br><p align=center><font color=red>CENTER ALIGNED</font> Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</p></font> " forKey:@"text"];
+ [row7 setObject:@"<font face='HelveticaNeue-CondensedBold' size=14><p align=justify><font color=red>JUSTIFY</font> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim </p> <p align=left><font color=red>LEFT ALIGNED</font> veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><br><p align=right><font color=red>RIGHT ALIGNED</font> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p><br><p align=center><font color=red>CENTER ALIGNED</font> Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</p></font>" forKey:@"text"];
[self.dataArray addObject:row7];
+ NSMutableDictionary *row8 = [NSMutableDictionary dictionary];
+ [row8 setObject:@"【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】在放屁都没时间的]kjkasdjfl【】\"高考 \"【考场,小强奋笔疾书】,对\"状 元\"自信满满的他,剑指\"清华 北大\",一路过关斩将,没有一道题可以挡住他,最后一题, 就最后一题啦…天啊竟然要讲个笑话,小强不由望天长叹:十年寒窗 数理化,最后却要讲笑test()话,要想成为状元郎,helloworld ;还要师从<font color='#CCFF00'>【郭德纲】</font>。【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】在放屁都没时间的]kjkasdjfl【】\"高考 \"【考场,小强奋笔疾书】,对\"状 元\"自信满满的他,剑指\"清华 北大\",一路过关斩将,没有一道题可以挡住他,最后一题, 就最后一题啦…天啊竟然要讲个笑话,小强不由望天长叹:十年寒窗 数理化,最后却要讲笑test()话,要想成为状元郎,helloworld ;还要师从<font color='#CCFF00'>【郭德纲】</font>。【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】在放屁都没时间的]kjkasdjfl【】\"高考 \"【考场,小强奋笔疾书】,对\"状 元\"自信满满的他,剑指\"清华 北大\",一路过关斩将,没有一道题可以挡住他,最后一题, 就最后一题啦…天啊竟然要讲个笑话,小强不由望天长叹:十年寒窗 数理化,最后却要讲笑test()话,要想成为状元郎,helloworld ;还要师从<font color='#CCFF00'>【郭德纲】</font>。【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】在放屁都没时间的]kjkasdjfl【】\"高考 \"【考场,小强奋笔疾书】,对\"状 元\"自信满满的他,剑指\"清华 北大\",一路过关斩将,没有一道题可以挡住他,最后一题, 就最后一题啦…天啊竟然要讲个笑话,小强不由望天长叹:十年寒窗 数理化,最后却要讲笑test()话,要想成为状元郎,helloworld ;还要师从<font color='#CCFF00'>【郭德纲】</font>。【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】在放屁都没时间的]kjkasdjfl【】\"高考 \"【考场,小强奋笔疾书】,对\"状 元\"自信满满的他,剑指\"清华 北大\",一路过关斩将,没有一道题可以挡住他,最后一题, 就最后一题啦…天啊竟然要讲个笑话,小强不由望天长叹:十年寒窗 数理化,最后却要讲笑test()话,要想成为状元郎,helloworld ;还要师从<font color='#CCFF00'>【郭德纲】</font>。【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】在放屁都没时间的]kjkasdjfl【】\"高考 \"【考场,小强奋笔疾书】,对\"状 元\"自信满满的他,剑指\"清华 北大\",一路过关斩将,没有一道题可以挡住他,最后一题, 就最后一题啦…天啊竟然要讲个笑话,小强不由望天长叹:十年寒窗 数理化,最后却要讲笑test()话,要想成为状元郎,helloworld ;还要师从<font color='#CCFF00'>【郭德纲】</font>。【<a href=\"javascript:void(0);\" mt=\"url\" tag=\"讲笑话进北大?\" onclick=\"_yrSmblogJsCallNativeSearch(this.getAttribute(\'tag\'))\">#讲笑话进北大?#</a>】---" forKey:@"text"];
+ [self.dataArray addObject:row8];
+
NSMutableDictionary *row20 = [NSMutableDictionary dictionary];
[row20 setObject:@"<p indent=20>Indented bla bla <bi>bla bla bla bla</bi> bla bla bla bla bla bla bla</p>" forKey:@"text"];
[self.dataArray addObject:row20];
@@ -114,7 +119,7 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPa
else
{
RTLabel *rtLabel = [DemoTableViewCell textLabel];
- rtLabel.lineSpacing = 20.0;
+// rtLabel.lineSpacing = 20.0;
[rtLabel setText:[rowInfo objectForKey:@"text"]];
CGSize optimumSize = [rtLabel optimumSize];
[rowInfo setObject:[NSNumber numberWithFloat:optimumSize.height+20] forKey:@"cell_height"];
@@ -142,7 +147,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
[cell.rtLabel setDelegate:self];
}
[cell.rtLabel setText:[[self.dataArray objectAtIndex:indexPath.row] objectForKey:@"text"]];
- cell.rtLabel.lineSpacing = 20.0;
+// cell.rtLabel.lineSpacing = 20.0;
return cell;
}
View
146 RTLabelProject/Classes/RTLabel.m
@@ -104,7 +104,9 @@ + (RTLabelExtractedComponent*)rtLabelExtractComponentsWithTextComponent:(NSMutab
@end
-@interface RTLabel()
+@interface RTLabel() {
+ UIFont *_fullHtmlFont;
+}
- (CGFloat)frameHeight:(CTFrameRef)frame;
- (NSArray *)components;
- (void)parse:(NSString *)data valid_tags:(NSArray *)valid_tags;
@@ -180,14 +182,7 @@ - (void)render
if (!self.plainText) return;
CGContextRef context = UIGraphicsGetCurrentContext();
- if (context != NULL)
- {
- // Drawing code.
- CGContextSetTextMatrix(context, CGAffineTransformIdentity);
- CGAffineTransform flipVertical = CGAffineTransformMake(1,0,0,-1,0,self.frame.size.height);
- CGContextConcatCTM(context, flipVertical);
- }
-
+
// Initialize an attributed string.
CFStringRef string = (__bridge CFStringRef)self.plainText;
CFMutableAttributedStringRef attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
@@ -201,7 +196,7 @@ - (void)render
CFAttributedStringSetAttributes( attrString, CFRangeMake( 0, CFAttributedStringGetLength(attrString) ), styleDict1, 0 );
CFMutableDictionaryRef styleDict = ( CFDictionaryCreateMutable( (0), 0, (0), (0) ) );
-
+
[self applyParagraphStyleToText:attrString attributes:nil atPosition:0 withLength:CFAttributedStringGetLength(attrString)];
@@ -299,42 +294,59 @@ - (void)render
// Create the framesetter with the attributed string.
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
- CFRelease(attrString);
-
+
// Initialize a rectangular path.
CGMutablePathRef path = CGPathCreateMutable();
- CGRect bounds = CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height);
+ CGRect bounds = CGRectMake(0.0, 0.0, self.frame.size.width, CGFLOAT_MAX);
CGPathAddRect(path, NULL, bounds);
// Create the frame and draw it into the graphics context
//CTFrameRef
- CTFrameRef frame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0, 0), path, NULL);
-
- CFRange range;
- CGSize constraint = CGSizeMake(self.frame.size.width, CGFLOAT_MAX);
- self.optimumSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, [self.plainText length]), nil, constraint, &range);
-
-
- if (self.currentSelectedButtonComponentIndex==-1)
- {
- // only check for linkable items the first time, not when it's being redrawn on button pressed
-
- for (RTLabelComponent *linkableComponents in links)
- {
- float height = 0.0;
- CFArrayRef frameLines = CTFrameGetLines(frame);
- for (CFIndex i=0; i<CFArrayGetCount(frameLines); i++)
- {
- CTLineRef line = (CTLineRef)CFArrayGetValueAtIndex(frameLines, i);
- CFRange lineRange = CTLineGetStringRange(line);
- CGFloat ascent;
- CGFloat descent;
- CGFloat leading;
-
- CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
- CGPoint origin;
- CTFrameGetLineOrigins(frame, CFRangeMake(i, 1), &origin);
-
+ CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, CFAttributedStringGetLength(attrString)), path, NULL);
+
+ CFRelease(attrString);
+
+ // only check for linkable items the first time, not when it's being redrawn on button pressed
+
+ float height = 0.0;
+ CFArrayRef frameLines = CTFrameGetLines(frame);
+ for (CFIndex i=0; i<CFArrayGetCount(frameLines); i++)
+ {
+ CTLineRef line = (CTLineRef)CFArrayGetValueAtIndex(frameLines, i);
+ CFRange lineRange = CTLineGetStringRange(line);
+ CGFloat ascent;
+ CGFloat descent;
+ CGFloat leading;
+
+ CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
+
+ CGPoint origin;
+ CTFrameGetLineOrigins(frame, CFRangeMake(i, 1), &origin);
+
+ // calculate lineHeight
+ CGFloat estimatedLineHeight = ascent + descent;
+ CGFloat lineHeight = MAX([self fontHeight], estimatedLineHeight);
+
+ if (context) {
+ CGContextSaveGState(context);
+
+ // Drawing code.
+ CGContextSetTextMatrix(context, CGAffineTransformIdentity);
+ CGAffineTransform flipVertical = CGAffineTransformMake(1,0,0,-1,0,lineHeight);
+ CGContextSetTextMatrix(context, flipVertical);
+// CGContextConcatCTM(context, flipVertical);
+
+ CGContextSetTextPosition(context, 0, height + ascent + (lineHeight-estimatedLineHeight)/2);
+
+ CTLineDraw(line, context);
+
+ CGContextRestoreGState(context);
+ }
+
+ if (self.currentSelectedButtonComponentIndex==-1)
+ {
+ for (RTLabelComponent *linkableComponents in links)
+ {
if ( (linkableComponents.position<lineRange.location && linkableComponents.position+linkableComponents.text.length>(u_int16_t)(lineRange.location)) || (linkableComponents.position>=lineRange.location && linkableComponents.position<lineRange.location+lineRange.length))
{
CGFloat secondaryOffset;
@@ -343,9 +355,11 @@ - (void)render
CGFloat button_width = primaryOffset2 - primaryOffset;
- RTLabelButton *button = [[RTLabelButton alloc] initWithFrame:CGRectMake(primaryOffset+origin.x, height, button_width, ascent+descent)];
+ RTLabelButton *button = [[RTLabelButton alloc] initWithFrame:
+ CGRectMake(primaryOffset+origin.x, height-_lineSpacing/4, button_width, lineHeight+_lineSpacing/2)];
- [button setBackgroundColor:[UIColor colorWithWhite:0 alpha:0]];
+ [button setBackgroundColor:[UIColor clearColor]];
+// [button setBackgroundColor:[UIColor greenColor]];
[button setComponentIndex:linkableComponents.componentIndex];
[button setUrl:[NSURL URLWithString:[linkableComponents.attributes objectForKey:@"href"]]];
@@ -355,21 +369,25 @@ - (void)render
[self addSubview:button];
}
-
- origin.y = self.frame.size.height - origin.y;
- height = origin.y + descent + _lineSpacing;
}
- }
- }
-
- self.visibleRange = CTFrameGetVisibleStringRange(frame);
+ }
+ origin.y = self.frame.size.height - origin.y;
+// height = origin.y + descent + _lineSpacing;
+ height = height + lineHeight + _lineSpacing;
+ }
- CFRelease(thisFont);
+ self.optimumSize = CGSizeMake(self.frame.size.width, height);
+
+ self.visibleRange = CTFrameGetVisibleStringRange(frame);
+
+ CFRelease(thisFont);
CFRelease(path);
CFRelease(styleDict1);
CFRelease(styleDict);
CFRelease(framesetter);
- CTFrameDraw(frame, context);
+
+// CTFrameDraw(frame, context);
+
CFRelease(frame);
}
@@ -387,8 +405,8 @@ - (void)applyParagraphStyleToText:(CFMutableAttributedStringRef)text attributes:
CGFloat headIndent = 0.0;
CGFloat tailIndent = 0.0;
CGFloat lineHeightMultiple = 1.0;
- CGFloat maxLineHeight = 0;
- CGFloat minLineHeight = 0;
+ CGFloat maxLineHeight = 0;
+ CGFloat minLineHeight = [self fontHeight];
CGFloat paragraphSpacing = 0.0;
CGFloat paragraphSpacingBefore = 0.0;
CTTextAlignment textAlignment = (CTTextAlignment)_textAlignment;
@@ -489,7 +507,7 @@ - (void)applyCenterStyleToText:(CFMutableAttributedStringRef)text attributes:(NS
CGFloat tailIndent = 0.0;
CGFloat lineHeightMultiple = 1.0;
CGFloat maxLineHeight = 0;
- CGFloat minLineHeight = 0;
+ CGFloat minLineHeight = [self fontHeight];
CGFloat paragraphSpacing = 0.0;
CGFloat paragraphSpacingBefore = 0.0;
int textAlignment = _textAlignment;
@@ -608,6 +626,9 @@ - (void)applyFontAttributes:(NSDictionary*)attributes toText:(CFMutableAttribute
}
if (font)
{
+ if (position == 0 && length == (int)self.plainText.length) {
+ _fullHtmlFont = font;
+ }
CTFontRef customFont = CTFontCreateWithName ((__bridge CFStringRef)[font fontName], [font pointSize], NULL);
CFAttributedStringSetAttribute(text, CFRangeMake(position, length), kCTFontAttributeName, customFont);
CFRelease(customFont);
@@ -776,6 +797,12 @@ - (void)setHighlightedText:(NSString *)text extractedTextComponent:(RTLabelExtra
[self setHighlightedTextComponents:extractedComponent.textComponents];
}
+- (void)setFont:(UIFont *)font
+{
+ _font = font;
+ _fullHtmlFont = nil;
+}
+
// http://forums.macrumors.com/showthread.php?t=925312
// not accurate
- (CGFloat)frameHeight:(CTFrameRef)theFrame
@@ -1046,6 +1073,17 @@ - (NSString*)visibleText
return text;
}
+- (CGFloat)fontHeight
+{
+ UIFont *f = _fullHtmlFont ? _fullHtmlFont : _font;
+ CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)f.fontName, f.pointSize, NULL);
+ CGFloat fontHeight = CTFontGetAscent(ctFont) + CTFontGetDescent(ctFont); // + CTFontGetLeading(ctFont);
+// CGRect bounds = CTFontGetBoundingBox(ctFont);
+// CGFloat fontHeight = CGRectGetMaxY(bounds);
+ CFRelease(ctFont);
+ return fontHeight;
+}
+
#pragma mark deprecated methods
- (void)setText:(NSString *)text extractedTextStyle:(NSDictionary*)extractTextStyle

No commit comments for this range

Something went wrong with that request. Please try again.