@@ -16,130 +16,184 @@ import 'package:dartdoc/src/element_type.dart';
1616
1717final Map <String , String > _fileContents = < String , String > {};
1818
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+ }
6530
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 });
7238
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>' ;
7461}
7562
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;
8066
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)));
8594 });
95+ return builder.toString ();
8696 }
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);
97110 }
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: ']' );
105115 }
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: '}' );
111119 }
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 (' ' ) + ' ' );
119129 }
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' ) + ' ' );
124132 }
125- if (typeName.isNotEmpty && showNames && param.name.isNotEmpty ) {
126- buf.write (' ' );
133+ if (param.isCovariant ) {
134+ buf.write (covariant ( 'covariant' ) + ' ' );
127135 }
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+ }
130174 }
131- }
132175
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));
138183 }
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);
140194 }
141- buf. write ( '${ suffix }</span>' );
142- return buf. toString ( );
195+ return ParameterRendererHtml (showMetadata : showMetadata, showNames : showNames)
196+ . linkedParams (parameters );
143197}
144198
145199/// Returns the [AstNode] for a given [Element] .
0 commit comments