@@ -16,130 +16,184 @@ import 'package:dartdoc/src/element_type.dart';
16
16
17
17
final Map <String , String > _fileContents = < String , String > {};
18
18
19
- String linkedParams (List <Parameter > parameters,
20
- {bool showMetadata = true ,
21
- bool showNames = true ,
22
- String separator = ', ' }) {
23
- List <Parameter > requiredParams =
24
- parameters.where ((Parameter p) => ! p.isOptional).toList ();
25
- List <Parameter > positionalParams =
26
- parameters.where ((Parameter p) => p.isOptionalPositional).toList ();
27
- List <Parameter > namedParams =
28
- parameters.where ((Parameter p) => p.isOptionalNamed).toList ();
29
-
30
- StringBuffer builder = StringBuffer ();
31
-
32
- // prefix
33
- if (requiredParams.isEmpty && positionalParams.isNotEmpty) {
34
- builder.write ('[' );
35
- } else if (requiredParams.isEmpty && namedParams.isNotEmpty) {
36
- builder.write ('{' );
37
- }
38
-
39
- // index over params
40
- for (Parameter param in requiredParams) {
41
- bool isLast = param == requiredParams.last;
42
- String ext;
43
- if (isLast && positionalParams.isNotEmpty) {
44
- ext = ', [' ;
45
- } else if (isLast && namedParams.isNotEmpty) {
46
- ext = ', {' ;
47
- } else {
48
- ext = isLast ? '' : ', ' ;
49
- }
50
- builder.write (renderParam (param, ext, showMetadata, showNames));
51
- builder.write (' ' );
52
- }
53
- for (Parameter param in positionalParams) {
54
- bool isLast = param == positionalParams.last;
55
- builder
56
- .write (renderParam (param, isLast ? '' : ', ' , showMetadata, showNames));
57
- builder.write (' ' );
58
- }
59
- for (Parameter param in namedParams) {
60
- bool isLast = param == namedParams.last;
61
- builder
62
- .write (renderParam (param, isLast ? '' : ', ' , showMetadata, showNames));
63
- builder.write (' ' );
64
- }
19
+ /// Render HTML in an extended vertical format using <ol> tag.
20
+ class ParameterRendererHtmlList extends ParameterRendererHtml {
21
+ ParameterRendererHtmlList ({bool showMetadata = true , bool showNames = true })
22
+ : super (showMetadata: showMetadata, showNames: showNames);
23
+ @override
24
+ String listItem (String listItem) => '<li>$listItem </li>\n ' ;
25
+ @override
26
+ // TODO(jcollins-g): consider comma separated lists and more advanced css.
27
+ String orderedList (String listItems) =>
28
+ '<ol class="parameter-list">$listItems </ol>\n ' ;
29
+ }
65
30
66
- // suffix
67
- if (namedParams.isNotEmpty) {
68
- builder.write ('}' );
69
- } else if (positionalParams.isNotEmpty) {
70
- builder.write (']' );
71
- }
31
+ /// Render HTML suitable for a single, wrapped line.
32
+ class ParameterRendererHtml extends ParameterRenderer {
33
+ @override
34
+ final bool showMetadata;
35
+ @override
36
+ final bool showNames;
37
+ ParameterRendererHtml ({this .showMetadata = true , this .showNames = true });
72
38
73
- return builder.toString ().trim ();
39
+ @override
40
+ String listItem (String listItem) => '${listItem }<wbr>' ;
41
+ @override
42
+ String orderedList (String listItems) => listItems;
43
+ @override
44
+ String annotation (String annotation) => '<span>$annotation </span>' ;
45
+ @override
46
+ String covariant (String covariant ) => '<span>$covariant </span>' ;
47
+ @override
48
+ String defaultValue (String defaultValue) =>
49
+ '<span class="default-value">$defaultValue </span>' ;
50
+ @override
51
+ String parameter (String parameter, String htmlId) =>
52
+ '<span class="parameter" id="${htmlId }">$parameter </span>' ;
53
+ @override
54
+ String parameterName (String parameterName) =>
55
+ '<span class="parameter-name">$parameterName </span>' ;
56
+ @override
57
+ String typeName (String typeName) =>
58
+ '<span class="type-annotation">$typeName </span>' ;
59
+ @override
60
+ String required (String required ) => '<span>$required </span>' ;
74
61
}
75
62
76
- String renderParam (
77
- Parameter param, String suffix, bool showMetadata, bool showNames) {
78
- StringBuffer buf = StringBuffer ();
79
- ElementType paramModelType = param.modelType;
63
+ abstract class ParameterRenderer {
64
+ bool get showMetadata;
65
+ bool get showNames;
80
66
81
- buf.write ('<span class="parameter" id="${param .htmlId }">' );
82
- if (showMetadata && param.hasAnnotations) {
83
- param.annotations.forEach ((String annotation) {
84
- buf.write ('<span>$annotation </span> ' );
67
+ String listItem (String item);
68
+ String orderedList (String listItems);
69
+ String annotation (String annotation);
70
+ String covariant (String covariant );
71
+ String defaultValue (String defaultValue);
72
+ String parameter (String parameter, String id);
73
+ String parameterName (String parameterName);
74
+ String typeName (String typeName);
75
+ String required (String required );
76
+
77
+ String _linkedParameterSublist (List <Parameter > parameters, bool trailingComma,
78
+ {String thisOpenBracket = '' , String thisCloseBracket = '' }) {
79
+ StringBuffer builder = StringBuffer ();
80
+ parameters.forEach ((p) {
81
+ String prefix = '' ;
82
+ String suffix = '' ;
83
+ if (identical (p, parameters.first)) {
84
+ prefix = thisOpenBracket;
85
+ }
86
+ if (identical (p, parameters.last)) {
87
+ suffix += thisCloseBracket;
88
+ if (trailingComma) suffix += ', ' ;
89
+ } else {
90
+ suffix += ', ' ;
91
+ }
92
+ builder.write (
93
+ listItem (parameter (prefix + renderParam (p) + suffix, p.htmlId)));
85
94
});
95
+ return builder.toString ();
86
96
}
87
- if (param.isCovariant) {
88
- buf.write ('<span>covariant</span> ' );
89
- }
90
- if (paramModelType is CallableElementTypeMixin ||
91
- paramModelType.type is FunctionType ) {
92
- String returnTypeName;
93
- if (paramModelType.isTypedef) {
94
- returnTypeName = paramModelType.linkedName;
95
- } else {
96
- returnTypeName = paramModelType.createLinkedReturnTypeName ();
97
+
98
+ String linkedParams (List <Parameter > parameters) {
99
+ List <Parameter > positionalParams =
100
+ parameters.where ((Parameter p) => p.isRequiredPositional).toList ();
101
+ List <Parameter > optionalPositionalParams =
102
+ parameters.where ((Parameter p) => p.isOptionalPositional).toList ();
103
+ List <Parameter > namedParams =
104
+ parameters.where ((Parameter p) => p.isNamed).toList ();
105
+
106
+ String positional = '' , optional = '' , named = '' ;
107
+ if (positionalParams.isNotEmpty) {
108
+ positional = _linkedParameterSublist (positionalParams,
109
+ optionalPositionalParams.isNotEmpty || namedParams.isNotEmpty);
97
110
}
98
- buf.write ('<span class="type-annotation">${returnTypeName }</span>' );
99
- if (showNames) {
100
- buf.write (' <span class="parameter-name">${param .name }</span>' );
101
- } else if (paramModelType.isTypedef ||
102
- paramModelType is CallableAnonymousElementType ||
103
- paramModelType.type is FunctionType ) {
104
- buf.write (' <span class="parameter-name">${paramModelType .name }</span>' );
111
+ if (optionalPositionalParams.isNotEmpty) {
112
+ optional = _linkedParameterSublist (
113
+ optionalPositionalParams, namedParams.isNotEmpty,
114
+ thisOpenBracket: '[' , thisCloseBracket: ']' );
105
115
}
106
- if (! paramModelType.isTypedef && paramModelType is DefinedElementType ) {
107
- buf.write ('(' );
108
- buf.write (linkedParams (paramModelType.element.parameters,
109
- showNames: showNames, showMetadata: showMetadata));
110
- buf.write (')' );
116
+ if (namedParams.isNotEmpty) {
117
+ named = _linkedParameterSublist (namedParams, false ,
118
+ thisOpenBracket: '{' , thisCloseBracket: '}' );
111
119
}
112
- if (! paramModelType.isTypedef && paramModelType.type is FunctionType ) {
113
- buf.write ('(' );
114
- buf.write (linkedParams (
115
- (paramModelType as UndefinedElementType ).parameters,
116
- showNames: showNames,
117
- showMetadata: showMetadata));
118
- buf.write (')' );
120
+ return (orderedList (positional + optional + named));
121
+ }
122
+
123
+ String renderParam (Parameter param) {
124
+ StringBuffer buf = StringBuffer ();
125
+ ElementType paramModelType = param.modelType;
126
+
127
+ if (showMetadata && param.hasAnnotations) {
128
+ buf.write (param.annotations.map (annotation).join (' ' ) + ' ' );
119
129
}
120
- } else if (param.modelType != null ) {
121
- String typeName = paramModelType.linkedName;
122
- if (typeName.isNotEmpty) {
123
- buf.write ('<span class="type-annotation">$typeName </span>' );
130
+ if (param.isRequiredNamed) {
131
+ buf.write (required ('required' ) + ' ' );
124
132
}
125
- if (typeName.isNotEmpty && showNames && param.name.isNotEmpty ) {
126
- buf.write (' ' );
133
+ if (param.isCovariant ) {
134
+ buf.write (covariant ( 'covariant' ) + ' ' );
127
135
}
128
- if (showNames && param.name.isNotEmpty) {
129
- buf.write ('<span class="parameter-name">${param .name }</span>' );
136
+ if (paramModelType is CallableElementTypeMixin ||
137
+ paramModelType.type is FunctionType ) {
138
+ String returnTypeName;
139
+ if (paramModelType.isTypedef) {
140
+ returnTypeName = paramModelType.linkedName;
141
+ } else {
142
+ returnTypeName = paramModelType.createLinkedReturnTypeName ();
143
+ }
144
+ buf.write (typeName (returnTypeName));
145
+ if (showNames) {
146
+ buf.write (' ${parameterName (param .name )}' );
147
+ } else if (paramModelType.isTypedef ||
148
+ paramModelType is CallableAnonymousElementType ||
149
+ paramModelType.type is FunctionType ) {
150
+ buf.write (' ${parameterName (paramModelType .name )}' );
151
+ }
152
+ if (! paramModelType.isTypedef && paramModelType is DefinedElementType ) {
153
+ buf.write ('(' );
154
+ buf.write (linkedParams (paramModelType.element.parameters));
155
+ buf.write (')' );
156
+ }
157
+ if (! paramModelType.isTypedef && paramModelType.type is FunctionType ) {
158
+ buf.write ('(' );
159
+ buf.write (
160
+ linkedParams ((paramModelType as UndefinedElementType ).parameters));
161
+ buf.write (')' );
162
+ }
163
+ } else if (param.modelType != null ) {
164
+ String linkedTypeName = paramModelType.linkedName;
165
+ if (linkedTypeName.isNotEmpty) {
166
+ buf.write (typeName (linkedTypeName));
167
+ if (showNames && param.name.isNotEmpty) {
168
+ buf.write (' ' );
169
+ }
170
+ }
171
+ if (showNames && param.name.isNotEmpty) {
172
+ buf.write (parameterName (param.name));
173
+ }
130
174
}
131
- }
132
175
133
- if (param.hasDefaultValue) {
134
- if (param.isOptionalNamed) {
135
- buf.write (': ' );
136
- } else {
137
- buf.write (' = ' );
176
+ if (param.hasDefaultValue) {
177
+ if (param.isNamed) {
178
+ buf.write (': ' );
179
+ } else {
180
+ buf.write (' = ' );
181
+ }
182
+ buf.write (defaultValue (param.defaultValue));
138
183
}
139
- buf.write ('<span class="default-value">${param .defaultValue }</span>' );
184
+ return buf.toString ();
185
+ }
186
+ }
187
+
188
+ String linkedParams (List <Parameter > parameters,
189
+ {showMetadata = true , showNames = true , asList = false }) {
190
+ if (asList) {
191
+ return ParameterRendererHtmlList (
192
+ showMetadata: showMetadata, showNames: showNames)
193
+ .linkedParams (parameters);
140
194
}
141
- buf. write ( '${ suffix }</span>' );
142
- return buf. toString ( );
195
+ return ParameterRendererHtml (showMetadata : showMetadata, showNames : showNames)
196
+ . linkedParams (parameters );
143
197
}
144
198
145
199
/// Returns the [AstNode] for a given [Element] .
0 commit comments