Skip to content

Commit 7e0baa3

Browse files
committed
Handle html tags in wrapping the generated documentation.
-Wdocuentation gets grumpy about word wrapping within doc comments if it happens within a html tag. So support wrapping the entire tag as one "chunk", i.e. - don't let spaces in the tag because of attributes become word breaks for wrapping. Fixes google#134
1 parent 7f72a6e commit 7e0baa3

File tree

5 files changed

+110
-42
lines changed

5 files changed

+110
-42
lines changed

Source/GeneratedServices/Clouderrorreporting/GTLRClouderrorreportingQuery.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,7 @@ GTLR_EXTERN NSString * const kGTLRClouderrorreportingTimeRangePeriodPeriodUnspec
297297
* @param groupName [Required] The group resource name. Written as
298298
* <code>projects/<var>projectID</var>/groups/<var>group_name</var></code>.
299299
* Call
300-
* <a
301-
* href="/error-reporting/reference/rest/v1beta1/projects.groupStats/list">
300+
* <a href="/error-reporting/reference/rest/v1beta1/projects.groupStats/list">
302301
* <code>groupStats.list</code></a> to return a list of groups belonging to
303302
* this project.
304303
* Example: <code>projects/my-project-123/groups/my-group</code>

Source/GeneratedServices/Monitoring/GTLRMonitoringQuery.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ GTLR_EXTERN NSString * const kGTLRMonitoringViewHeaders;
121121
@end
122122

123123
/**
124-
* Stackdriver Monitoring Agent only: Creates a new time series.<aside
125-
* class="caution">This method is only for use by the Stackdriver Monitoring
126-
* Agent. Use projects.timeSeries.create instead.</aside>
124+
* Stackdriver Monitoring Agent only: Creates a new time
125+
* series.<aside class="caution">This method is only for use by the Stackdriver
126+
* Monitoring Agent. Use projects.timeSeries.create instead.</aside>
127127
*
128128
* Method: monitoring.projects.collectdTimeSeries.create
129129
*
@@ -145,9 +145,9 @@ GTLR_EXTERN NSString * const kGTLRMonitoringViewHeaders;
145145
/**
146146
* Fetches a @c GTLRMonitoring_Empty.
147147
*
148-
* Stackdriver Monitoring Agent only: Creates a new time series.<aside
149-
* class="caution">This method is only for use by the Stackdriver Monitoring
150-
* Agent. Use projects.timeSeries.create instead.</aside>
148+
* Stackdriver Monitoring Agent only: Creates a new time
149+
* series.<aside class="caution">This method is only for use by the Stackdriver
150+
* Monitoring Agent. Use projects.timeSeries.create instead.</aside>
151151
*
152152
* @param object The @c GTLRMonitoring_CreateCollectdTimeSeriesRequest to
153153
* include in the query.

Source/GeneratedServices/Partners/GTLRPartnersObjects.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -4317,8 +4317,8 @@ GTLR_EXTERN NSString * const kGTLRPartners_SpecializationStatus_BadgeSpecializat
43174317
* Advertiser entered website in contact form. (Value:
43184318
* "SMB_ENTERED_WEBSITE_IN_CONTACT_PARTNER_FORM")
43194319
* @arg @c kGTLRPartners_LogUserEventRequest_EventAction_SmbFailedRecaptchaInContactPartnerForm
4320-
* Advertiser failed <a
4321-
* href="https://www.google.com/recaptcha/">reCaptcha</a>
4320+
* Advertiser failed
4321+
* <a href="https://www.google.com/recaptcha/">reCaptcha</a>
43224322
* in contact form. (Value:
43234323
* "SMB_FAILED_RECAPTCHA_IN_CONTACT_PARTNER_FORM")
43244324
* @arg @c kGTLRPartners_LogUserEventRequest_EventAction_SmbNoPartnersAvailableWithSearchCriteria

Source/GeneratedServices/Sheets/GTLRSheetsObjects.h

+30-30
Original file line numberDiff line numberDiff line change
@@ -2233,26 +2233,26 @@ GTLR_EXTERN NSString * const kGTLRSheets_ValueRange_MajorDimension_Rows;
22332233
* and COLUMN are supported.
22342234
*
22352235
* Likely values:
2236-
* @arg @c kGTLRSheets_BasicChartSeries_Type_Area An <a
2237-
* href="/chart/interactive/docs/gallery/areachart">area chart</a>.
2236+
* @arg @c kGTLRSheets_BasicChartSeries_Type_Area An
2237+
* <a href="/chart/interactive/docs/gallery/areachart">area chart</a>.
22382238
* (Value: "AREA")
2239-
* @arg @c kGTLRSheets_BasicChartSeries_Type_Bar A <a
2240-
* href="/chart/interactive/docs/gallery/barchart">bar chart</a>. (Value:
2241-
* "BAR")
2239+
* @arg @c kGTLRSheets_BasicChartSeries_Type_Bar A
2240+
* <a href="/chart/interactive/docs/gallery/barchart">bar chart</a>.
2241+
* (Value: "BAR")
22422242
* @arg @c kGTLRSheets_BasicChartSeries_Type_BasicChartTypeUnspecified
22432243
* Default value, do not use. (Value: "BASIC_CHART_TYPE_UNSPECIFIED")
2244-
* @arg @c kGTLRSheets_BasicChartSeries_Type_Column A <a
2245-
* href="/chart/interactive/docs/gallery/columnchart">column chart</a>.
2246-
* (Value: "COLUMN")
2247-
* @arg @c kGTLRSheets_BasicChartSeries_Type_Combo A <a
2248-
* href="/chart/interactive/docs/gallery/combochart">combo chart</a>.
2244+
* @arg @c kGTLRSheets_BasicChartSeries_Type_Column A
2245+
* <a href="/chart/interactive/docs/gallery/columnchart">column
2246+
* chart</a>. (Value: "COLUMN")
2247+
* @arg @c kGTLRSheets_BasicChartSeries_Type_Combo A
2248+
* <a href="/chart/interactive/docs/gallery/combochart">combo chart</a>.
22492249
* (Value: "COMBO")
2250-
* @arg @c kGTLRSheets_BasicChartSeries_Type_Line A <a
2251-
* href="/chart/interactive/docs/gallery/linechart">line chart</a>.
2250+
* @arg @c kGTLRSheets_BasicChartSeries_Type_Line A
2251+
* <a href="/chart/interactive/docs/gallery/linechart">line chart</a>.
22522252
* (Value: "LINE")
2253-
* @arg @c kGTLRSheets_BasicChartSeries_Type_Scatter A <a
2254-
* href="/chart/interactive/docs/gallery/scatterchart">scatter chart</a>.
2255-
* (Value: "SCATTER")
2253+
* @arg @c kGTLRSheets_BasicChartSeries_Type_Scatter A
2254+
* <a href="/chart/interactive/docs/gallery/scatterchart">scatter
2255+
* chart</a>. (Value: "SCATTER")
22562256
*/
22572257
@property(nonatomic, copy, nullable) NSString *type;
22582258

@@ -2272,26 +2272,26 @@ GTLR_EXTERN NSString * const kGTLRSheets_ValueRange_MajorDimension_Rows;
22722272
* The type of the chart.
22732273
*
22742274
* Likely values:
2275-
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Area An <a
2276-
* href="/chart/interactive/docs/gallery/areachart">area chart</a>.
2275+
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Area An
2276+
* <a href="/chart/interactive/docs/gallery/areachart">area chart</a>.
22772277
* (Value: "AREA")
2278-
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Bar A <a
2279-
* href="/chart/interactive/docs/gallery/barchart">bar chart</a>. (Value:
2280-
* "BAR")
2278+
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Bar A
2279+
* <a href="/chart/interactive/docs/gallery/barchart">bar chart</a>.
2280+
* (Value: "BAR")
22812281
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_BasicChartTypeUnspecified
22822282
* Default value, do not use. (Value: "BASIC_CHART_TYPE_UNSPECIFIED")
2283-
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Column A <a
2284-
* href="/chart/interactive/docs/gallery/columnchart">column chart</a>.
2285-
* (Value: "COLUMN")
2286-
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Combo A <a
2287-
* href="/chart/interactive/docs/gallery/combochart">combo chart</a>.
2283+
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Column A
2284+
* <a href="/chart/interactive/docs/gallery/columnchart">column
2285+
* chart</a>. (Value: "COLUMN")
2286+
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Combo A
2287+
* <a href="/chart/interactive/docs/gallery/combochart">combo chart</a>.
22882288
* (Value: "COMBO")
2289-
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Line A <a
2290-
* href="/chart/interactive/docs/gallery/linechart">line chart</a>.
2289+
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Line A
2290+
* <a href="/chart/interactive/docs/gallery/linechart">line chart</a>.
22912291
* (Value: "LINE")
2292-
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Scatter A <a
2293-
* href="/chart/interactive/docs/gallery/scatterchart">scatter chart</a>.
2294-
* (Value: "SCATTER")
2292+
* @arg @c kGTLRSheets_BasicChartSpec_ChartType_Scatter A
2293+
* <a href="/chart/interactive/docs/gallery/scatterchart">scatter
2294+
* chart</a>. (Value: "SCATTER")
22952295
*/
22962296
@property(nonatomic, copy, nullable) NSString *chartType;
22972297

Source/Tools/ServiceGenerator/SGUtils.m

+71-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@
2222
#import "SGUtils.h"
2323
#import "GTLRUtilities.h"
2424

25+
@interface SGUtils ()
26+
+ (NSString *)stringOfLinesFromString:(NSString *)str
27+
firstLinePrefix:(NSString *)firstLinePrefix
28+
extraLinesPrefix:(NSString *)extraLinesPrefix
29+
linesSuffix:(NSString *)linesSuffix
30+
lastLineSuffix:(NSString *)lastLineSuffix
31+
elementJoiner:(NSString *)elementJoiner
32+
handleHTMLTags:(BOOL)handleHTMLTags;
33+
@end
34+
2535
static const NSUInteger kMaxWidth = 80;
2636

2737
@implementation SGHeaderDoc {
@@ -216,7 +226,8 @@ - (void)appendFirstIndent:(NSString *)firstIndent
216226
extraLinesPrefix:extraLinePrefix
217227
linesSuffix:@""
218228
lastLineSuffix:@""
219-
elementJoiner:@" "];
229+
elementJoiner:@" "
230+
handleHTMLTags:YES];
220231
[self internalAppend:wrapped];
221232
}
222233

@@ -392,6 +403,22 @@ + (NSString *)stringOfLinesFromString:(NSString *)str
392403
linesSuffix:(NSString *)linesSuffix
393404
lastLineSuffix:(NSString *)lastLineSuffix
394405
elementJoiner:(NSString *)elementJoiner {
406+
return [self stringOfLinesFromString:str
407+
firstLinePrefix:firstLinePrefix
408+
extraLinesPrefix:extraLinesPrefix
409+
linesSuffix:linesSuffix
410+
lastLineSuffix:lastLineSuffix
411+
elementJoiner:elementJoiner
412+
handleHTMLTags:NO];
413+
}
414+
415+
+ (NSString *)stringOfLinesFromString:(NSString *)str
416+
firstLinePrefix:(NSString *)firstLinePrefix
417+
extraLinesPrefix:(NSString *)extraLinesPrefix
418+
linesSuffix:(NSString *)linesSuffix
419+
lastLineSuffix:(NSString *)lastLineSuffix
420+
elementJoiner:(NSString *)elementJoiner
421+
handleHTMLTags:(BOOL)handleHTMLTags {
395422
if (str.length == 0) return nil;
396423

397424
// Support forced new line by letting them through as words.
@@ -405,8 +432,50 @@ + (NSString *)stringOfLinesFromString:(NSString *)str
405432
if (words.count > 1) {
406433
str = [words componentsJoinedByString:@" \n "];
407434
}
435+
408436
NSCharacterSet *wsSet = [NSCharacterSet whitespaceCharacterSet];
409-
words = [str componentsSeparatedByCharactersInSet:wsSet];
437+
if (handleHTMLTags) {
438+
// Clang's -Wdocumentation doesn't like word wrapping within an
439+
// html tag. Xcode also seems to get confused by it when providing
440+
// the contextual help. So this option looks for HTML tags and
441+
// keeps them as a single thing to wordwrap.
442+
static NSRegularExpression *regex;
443+
static dispatch_once_t onceToken;
444+
dispatch_once(&onceToken, ^{
445+
// Match anything that isn't whitespace, '<', a letter, anything but '>',
446+
// anything that isn't whitespace. This gets us anything before a tag and
447+
// attached to the tag, and anything attached after it.
448+
// NOTE: This is a little fragile, in that we don't want to catch things
449+
// like "<= 12" or "<10".
450+
regex = [NSRegularExpression regularExpressionWithPattern:@"\\S*<[a-zA-Z][^<>]*>\\S*"
451+
options:0
452+
error:NULL];
453+
NSAssert(regex != nil, @"Ooops?");
454+
});
455+
__block NSUInteger lastOffset = 0;
456+
NSMutableArray *collector = [NSMutableArray array];
457+
[regex enumerateMatchesInString:str
458+
options:0
459+
range:NSMakeRange(0, str.length)
460+
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
461+
if (lastOffset != result.range.location) {
462+
// Everything before this match, split on whitespaces.
463+
NSRange prevRange = NSMakeRange(lastOffset, result.range.location - lastOffset);
464+
NSString *subStr = [str substringWithRange:prevRange];
465+
[collector addObjectsFromArray:[subStr componentsSeparatedByCharactersInSet:wsSet]];
466+
}
467+
// Add this tag match so it will be wrapped as one chunk.
468+
NSString *tag = [str substringWithRange:result.range];
469+
[collector addObject:tag];
470+
lastOffset = NSMaxRange(result.range);
471+
}];
472+
// Add anything left after the last match split on whitespece.
473+
NSString *subStr = [str substringFromIndex:lastOffset];
474+
[collector addObjectsFromArray:[subStr componentsSeparatedByCharactersInSet:wsSet]];
475+
words = collector;
476+
} else {
477+
words = [str componentsSeparatedByCharactersInSet:wsSet];
478+
}
410479

411480
// componentsSeparatedByCharactersInSet (and componentsSeparatedByString) is
412481
// documented to take adjacent occurrences of the separator and produce empty

0 commit comments

Comments
 (0)