From db6c28a57fe02b7421a9ac5744038f3c4cf1987a Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Sat, 20 Jun 2015 06:12:52 -0700 Subject: [PATCH 1/7] tighten whitespaces --- README.md | 6 +-- lib/dartdoc.dart | 1 + lib/markdown_processor.dart | 1 + lib/resource_loader.dart | 4 +- lib/resources/styles.css | 76 ++++++++++++++++++++++------------ lib/src/html_generator.dart | 5 +-- lib/src/model.dart | 2 + lib/{ => src}/resources.g.dart | 0 lib/templates/_head.html | 4 +- lib/templates/index.html | 5 ++- tool/grind.dart | 6 ++- 11 files changed, 70 insertions(+), 40 deletions(-) rename lib/{ => src}/resources.g.dart (100%) diff --git a/README.md b/README.md index 9f6224722d..6d7936d7f6 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Run `pub global activate dartdoc` to install `dartdoc`. ## Running dartdoc Run `dartdoc` from the root directory of package. By default, the documentation -is geterated to the `doc/api/` directory. +is generated to the `doc/api/` directory. ## FAQ @@ -31,12 +31,12 @@ the issue tracker, start by opening an issue. Thanks! #### What does the output look like? -You can see the latest API of `dartdoc`, generated by `dartdoc`, +You can see the latest API of `dartdoc` - generated by `dartdoc` - [here](https://dartdoc.firebaseapp.com). #### Generating documentation for Dart SDK -If you want to generatr documentation for the SDK, run `dartdoc` with the +If you want to generate documentation for the SDK, run `dartdoc` with the following command line arguments: - `--dart-sdk /pathTo/dart-sdk` (optional) diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart index 430be19c8e..84aa5bf6d4 100644 --- a/lib/dartdoc.dart +++ b/lib/dartdoc.dart @@ -2,6 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +/// A documentation generator for Dart. library dartdoc; import 'dart:async'; diff --git a/lib/markdown_processor.dart b/lib/markdown_processor.dart index a82e9769af..fa0c3f53c1 100644 --- a/lib/markdown_processor.dart +++ b/lib/markdown_processor.dart @@ -2,6 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +/// Utility code to convert markdown comments to html. library markdown_processor; import 'package:analyzer/src/generated/ast.dart'; diff --git a/lib/resource_loader.dart b/lib/resource_loader.dart index ccd6c889ec..77168b3bc4 100644 --- a/lib/resource_loader.dart +++ b/lib/resource_loader.dart @@ -2,10 +2,10 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// TODO: Consider making this a stand-alone package, if useful. + /// Attempts to make it possible to load resources, independent of how the Dart /// app is run. -/// -/// TODO: consider making this a stand-alone package, if useful library resource_loader; import 'dart:async' show Future; diff --git a/lib/resources/styles.css b/lib/resources/styles.css index d1f6ea582c..c955896500 100644 --- a/lib/resources/styles.css +++ b/lib/resources/styles.css @@ -16,8 +16,8 @@ Palette generated by Material Palette - materialpalette.com/cyan/teal */ html { - position:relative; - min-height:100%; + position: relative; + min-height: 100%; } body { @@ -51,8 +51,8 @@ nav.navbar { header { background-color: #00BCD4; - height: 200px; color: white; + /*box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37);*/ } header.container-fluid { @@ -63,7 +63,12 @@ dl { margin: 0; } -h1, h2, h3, h4, h5, h6 { +h1, +h2, +h3, +h4, +h5, +h6 { font-weight: 300; margin: 0; } @@ -72,10 +77,20 @@ h2 { font-size: 32px; } +.subtitle { + font-size: 16px; +} + p { margin-bottom: 8px; } +p, +ul, +li { + color: #727272; +} + a { color: #0097A7; } @@ -110,16 +125,18 @@ code { @media (min-width:970px) and (max-width: 2500px) { .container { - width:768px; + width: 768px; } } header h1 { - margin-top: 80px; + margin-top: 64px; font-weight: 400; } -header a { +header a, +header p, +header li { color: white; } @@ -138,7 +155,8 @@ dd { section.summary h2 { color: hsl(0, 0%, 46%); - margin-bottom: 32px; + margin-bottom: 16px; + border-bottom: 1px solid #eeeeee; } dl.dl-horizontal dt { @@ -173,6 +191,10 @@ dl dt.callable .name { font-style: italic; } +.undocumented { + font-style: italic; +} + .deprecated { text-decoration: line-through; } @@ -182,18 +204,21 @@ p.firstline { } footer { - background-color: #B6B6B6; padding: 20px; - position:absolute; - bottom:0; - width:100%; - height:60px; + position: absolute; + bottom: 0; + width: 100%; + height: 60px; } footer p { margin: 0; } +.copyright a { + color: #727272; +} + .markdown h1 { font-size: 24px; margin-bottom: 8px; @@ -201,6 +226,7 @@ footer p { .markdown h2 { font-size: 20px; + margin-top: 24px; margin-bottom: 8px; } @@ -237,26 +263,27 @@ footer p { } .multi-line-signature { - font-size: 18px; + font-size: 18px; } .breadcrumbs { - padding: 0; - margin: 8px 0 8px 0; + padding: 0; + margin: 8px 0 8px 0; + font-size: 16px; } .comma-separated { - list-style: none; - padding: 0; - display: inline; + list-style: none; + padding: 0; + display: inline; } .comma-separated li { - display: inline; + display: inline; } .comma-separated li:after { - content: ", "; + content: ", "; } .comma-separated li:last-child:after { @@ -264,14 +291,11 @@ footer p { } .end-with-period li:last-child:after { - content: "."; + content: "."; } - section { - margin-bottom: 64px; - padding-top: 64px; - border-top: 1px solid #eeeeee; + padding-top: 32px; } .container > section:first-child { diff --git a/lib/src/html_generator.dart b/lib/src/html_generator.dart index fad8d808d7..e66b925688 100644 --- a/lib/src/html_generator.dart +++ b/lib/src/html_generator.dart @@ -15,7 +15,7 @@ import 'model.dart'; import 'package_meta.dart'; import '../generator.dart'; import '../markdown_processor.dart'; -import '../resources.g.dart' show resource_names; +import 'resources.g.dart' as resources; import '../resource_loader.dart' as loader; typedef String TemplateRenderer(context, @@ -203,7 +203,6 @@ class HtmlGeneratorInstance { Map data = { 'package': package, 'documentation': package.documentation, - 'oneLineDoc': package.oneLineDoc, 'title': '${package.name} - Dart API docs', 'layoutTitle': _layoutTitle(package.name, package.isSdk ? '' : 'package'), 'metaDescription': @@ -478,7 +477,7 @@ class HtmlGeneratorInstance { // TODO: change this to use resource_loader Future _copyResources() async { final prefix = 'package:dartdoc/resources/'; - for (var resourcePath in resource_names) { + for (var resourcePath in resources.resource_names) { if (!resourcePath.startsWith(prefix)) { throw new StateError( 'Resource paths must start with $prefix, encountered $resourcePath'); diff --git a/lib/src/model.dart b/lib/src/model.dart index dc2e0ed75f..addfd4f183 100644 --- a/lib/src/model.dart +++ b/lib/src/model.dart @@ -499,6 +499,8 @@ class Library extends ModelElement { bool get isInSdk => _library.isInSdk; + bool get isNotDocumented => oneLineDoc.isEmpty; + List _getVariables() { if (_variables != null) return _variables; diff --git a/lib/resources.g.dart b/lib/src/resources.g.dart similarity index 100% rename from lib/resources.g.dart rename to lib/src/resources.g.dart diff --git a/lib/templates/_head.html b/lib/templates/_head.html index 82b0f39f83..1dea8a7e59 100644 --- a/lib/templates/_head.html +++ b/lib/templates/_head.html @@ -15,7 +15,7 @@ - + @@ -37,7 +37,7 @@

{{{ layoutTitle }}}

-

+

{{{ oneLineDoc }}}

diff --git a/lib/templates/index.html b/lib/templates/index.html index a888042a7f..b137acb3c7 100644 --- a/lib/templates/index.html +++ b/lib/templates/index.html @@ -12,10 +12,11 @@

Libraries

{{ name }}
- {{{ oneLineDoc }}} + {{#isNotDocumented}}Library not documented.{{/isNotDocumented}} + {{{ oneLineDoc }}}
{{/package.libraries}} -{{>footer}} \ No newline at end of file +{{>footer}} diff --git a/tool/grind.dart b/tool/grind.dart index a32c111450..c866a2b98c 100644 --- a/tool/grind.dart +++ b/tool/grind.dart @@ -15,6 +15,8 @@ import 'package:path/path.dart' as path; final Directory docsDir = new Directory(path.join('${Directory.systemTemp.path}', defaultOutDir)); +final String sep = Platform.pathSeparator; + main([List args]) => grind(args); @Task('Start observatory for a test run') @@ -130,12 +132,12 @@ indexResources() { throw new StateError('lib/resources directory not found'); } var outDir = new Directory(path.join('lib')); - var out = new File(path.join(outDir.path, 'resources.g.dart')); + var out = new File(path.join(outDir.path, 'src${sep}resources.g.dart')); out.createSync(recursive: true); var buffer = new StringBuffer() ..write('// WARNING: This file is auto-generated.\n\n') ..write('library resources;\n\n') - ..write('const List RESOURCE_NAMES = const [\n'); + ..write('const List resource_names = const [\n'); var packagePaths = []; for (var fileName in listDir(sourcePath, recursive: true)) { if (!FileSystemEntity.isDirectorySync(fileName)) { From 8c0c3c1fdbf70d847cc0a31ee8890b73654aa9f8 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Sat, 20 Jun 2015 07:55:06 -0700 Subject: [PATCH 2/7] re-style code blocks; implements section; work on a scrolling header --- README.md | 2 +- bin/dartdoc.dart | 2 +- lib/resource_loader.dart | 3 +-- lib/resources/styles.css | 14 ++++++++------ lib/templates/_callable.html | 7 +++---- lib/templates/_footer.html | 26 ++++++++++++++++++++++---- lib/templates/class.html | 3 +-- 7 files changed, 37 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 6d7936d7f6..21d0a8aeda 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,8 @@ You can see the latest API of `dartdoc` - generated by `dartdoc` - If you want to generate documentation for the SDK, run `dartdoc` with the following command line arguments: -- `--dart-sdk /pathTo/dart-sdk` (optional) - `--sdk-docs` +- `--dart-sdk /pathTo/dart-sdk` (optional) ## Issues and bugs diff --git a/bin/dartdoc.dart b/bin/dartdoc.dart index e509ea6966..50511cf845 100644 --- a/bin/dartdoc.dart +++ b/bin/dartdoc.dart @@ -87,7 +87,7 @@ main(List arguments) async { : new PackageMeta.fromDir(inputDir); print("Generating documentation for '${packageMeta}' into " - "${outputDir.absolute.path}${Platform.pathSeparator}."); + "${outputDir.absolute.path}${Platform.pathSeparator}"); print(''); var generators = initGenerators(url, headerFilePath, footerFilePath); diff --git a/lib/resource_loader.dart b/lib/resource_loader.dart index 77168b3bc4..ad4a3f9510 100644 --- a/lib/resource_loader.dart +++ b/lib/resource_loader.dart @@ -4,8 +4,7 @@ // TODO: Consider making this a stand-alone package, if useful. -/// Attempts to make it possible to load resources, independent of how the Dart -/// app is run. +/// Make it possible to load resources, independent of how the Dart app is run. library resource_loader; import 'dart:async' show Future; diff --git a/lib/resources/styles.css b/lib/resources/styles.css index c955896500..0e7d99ad06 100644 --- a/lib/resources/styles.css +++ b/lib/resources/styles.css @@ -98,11 +98,13 @@ a { pre { font-family: 'Source Code Pro', monospace; color: black; - border-radius: 0; - font-size: 12px; - width: 80ch; + border-radius: 4px; + font-size: 14px; word-wrap: normal; line-height: 1.4; + border: 1px solid #f0f0f0; + margin: 16px; + padding: 8px; } pre code { @@ -116,7 +118,7 @@ pre code { code { font-family: 'Source Code Pro', monospace; /* overriding bootstrap */ - font-size: inherit; + font-size: 14px; color: inherit; border-radius: 0; padding: 0; @@ -170,11 +172,11 @@ dt .name { @media (min-width: 768px) { .dl-horizontal dd { - margin-left: 320px; + margin-left: 160px; } .dl-horizontal dt { - width: 320px; + width: 160px; } } diff --git a/lib/templates/_callable.html b/lib/templates/_callable.html index 8beec23e6f..de592eeb82 100644 --- a/lib/templates/_callable.html +++ b/lib/templates/_callable.html @@ -1,11 +1,10 @@
- {{>name_summary}} - {{#isInherited}}Inherited{{/isInherited}} - ( {{{ linkedParamsNoMetadata }}} ) + {{>name_summary}}({{{ linkedParamsNoMetadata }}}) → {{{ linkedReturnType }}} + {{#isInherited}}Inherited{{/isInherited}}
{{{ oneLineDoc }}} -
\ No newline at end of file + diff --git a/lib/templates/_footer.html b/lib/templates/_footer.html index fcbe63f8aa..7367500591 100644 --- a/lib/templates/_footer.html +++ b/lib/templates/_footer.html @@ -5,9 +5,10 @@

- {{package.name}} {{ package.version }} | + {{package.name}} {{package.version}} + • - CC BY-SA 4.0 + creative commons

@@ -16,9 +17,26 @@ diff --git a/lib/templates/class.html b/lib/templates/class.html index 6ddfde7a5a..a52eaaac9a 100644 --- a/lib/templates/class.html +++ b/lib/templates/class.html @@ -66,8 +66,7 @@

Constructors

{{#class.constructors}}
- {{{linkedName}}} - ( {{{ linkedParams }}} ) + {{{linkedName}}}({{{ linkedParams }}})
{{#isConst}} From d6a5f463981ca88ae45260a126ba5d6402e587c2 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Sat, 20 Jun 2015 19:44:52 -0700 Subject: [PATCH 3/7] tweaks for mobile devices; better scroll header --- lib/dartdoc.dart | 14 +++- lib/generator.dart | 4 +- lib/markdown_processor.dart | 6 +- lib/resource_loader.dart | 2 +- lib/resources/styles.css | 110 ++++++++++++++++++-------- lib/src/model.dart | 17 +++- lib/templates/_callable.html | 2 +- lib/templates/_footer.html | 19 ++--- lib/templates/_readable_writable.html | 4 +- lib/templates/class.html | 15 ++-- 10 files changed, 129 insertions(+), 64 deletions(-) diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart index 84aa5bf6d4..a5e7d5118b 100644 --- a/lib/dartdoc.dart +++ b/lib/dartdoc.dart @@ -24,6 +24,9 @@ import 'src/model.dart'; import 'src/model_utils.dart'; import 'src/package_meta.dart'; +export 'src/model.dart'; +export 'src/package_meta.dart'; + const String name = 'dartdoc'; // Update when pubspec version changes. const String version = '0.0.2+3'; @@ -56,10 +59,12 @@ class DartDoc { DartDoc(this.rootDir, this.excludes, this.sdkDir, this.generators, this.outputDir, this.packageRootDir, this.packageMeta); - /// Generate the documentation. [DartDocResults] is returned if dartdoc - /// succeeds. [DartDocFailure] is thrown if dartdoc fails in an expected way, - /// for instance if there is an anaysis error in the code. Any other exception - /// can be throw if there is an unexpected failure. + /// Generate DartDoc documentation. + /// + /// [DartDocResults] is returned if dartdoc succeeds. [DartDocFailure] is + /// thrown if dartdoc fails in an expected way, for example if there is an + /// anaysis error in the code. Any other exception can be throw if there is an + /// unexpected failure. Future generateDocs() async { _stopwatch = new Stopwatch()..start(); @@ -169,6 +174,7 @@ class DartDoc { } } +/// The results of a [DartDoc.generateDocs] call. class DartDocResults { final PackageMeta packageMeta; final Package package; diff --git a/lib/generator.dart b/lib/generator.dart index efa063fa34..1859d023cb 100644 --- a/lib/generator.dart +++ b/lib/generator.dart @@ -11,7 +11,9 @@ import 'dart:io'; import 'src/model.dart' show Package; /// An abstract class that defines a generator that generates documentation for -/// a given package. Generators can generate documentation in different formats: +/// a given package. +/// +/// Generators can generate documentation in different formats: /// html, json etc. abstract class Generator { /// Generate the documentation for the given package in the specified diff --git a/lib/markdown_processor.dart b/lib/markdown_processor.dart index fa0c3f53c1..2fafea2f15 100644 --- a/lib/markdown_processor.dart +++ b/lib/markdown_processor.dart @@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. /// Utility code to convert markdown comments to html. -library markdown_processor; +library dartdoc.markdown_processor; import 'package:analyzer/src/generated/ast.dart'; import 'package:analyzer/src/generated/element.dart' @@ -96,10 +96,6 @@ String oneLinerWithoutReferences(String text) { if (blocks.isEmpty) return ''; String firstPara = new PlainTextRenderer().render([blocks.first]); - if (firstPara.length > 200) { - firstPara = firstPara.substring(0, 200) + '...'; - } - return firstPara.trim(); } diff --git a/lib/resource_loader.dart b/lib/resource_loader.dart index ad4a3f9510..83bae8315b 100644 --- a/lib/resource_loader.dart +++ b/lib/resource_loader.dart @@ -5,7 +5,7 @@ // TODO: Consider making this a stand-alone package, if useful. /// Make it possible to load resources, independent of how the Dart app is run. -library resource_loader; +library dartdoc.resource_loader; import 'dart:async' show Future; import 'dart:io' show Platform, File, Directory; diff --git a/lib/resources/styles.css b/lib/resources/styles.css index 0e7d99ad06..5c24ba1882 100644 --- a/lib/resources/styles.css +++ b/lib/resources/styles.css @@ -1,18 +1,26 @@ -/* - -Colors -Palette generated by Material Palette - materialpalette.com/cyan/teal +/* Palette generated by Material Palette - materialpalette.com/blue-grey/light-blue */ -.dark-primary-color { background: #0097A7; } -.default-primary-color { background: #00BCD4; } -.light-primary-color { background: #B2EBF2; } +.dark-primary-color { background: #455A64; } +.default-primary-color { background: #607D8B; } +.light-primary-color { background: #CFD8DC; } .text-primary-color { color: #FFFFFF; } -.accent-color { background: #009688; } +.accent-color { background: #03A9F4; } .primary-text-color { color: #212121; } .secondary-text-color { color: #727272; } .divider-color { border-color: #B6B6B6; } +/* + Palette generated by Material Palette - materialpalette.com/cyan/teal + + .dark-primary-color { background: #0097A7; } + .default-primary-color { background: #00BCD4; } + .light-primary-color { background: #B2EBF2; } + .text-primary-color { color: #FFFFFF; } + .accent-color { background: #009688; } + .primary-text-color { color: #212121; } + .secondary-text-color { color: #727272; } + .divider-color { border-color: #B6B6B6; } */ html { @@ -22,11 +30,12 @@ html { body { font-family: 'Roboto', sans-serif; - font-size: 14px; + font-size: 15px; padding-top: 50px; margin-bottom: 60px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: 100%; + overflow-x: hidden; } /* some of this is to reset bootstrap */ @@ -42,17 +51,14 @@ nav.navbar { -webkit-justify-content: center; } -@media(max-width: 768px) -{ - nav .container { - width: 100% - } -} - header { - background-color: #00BCD4; + background-color: #607D8B; color: white; - /*box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37);*/ + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37); +} + +header.header-fixed nav.navbar-fixed-top { + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37); } header.container-fluid { @@ -73,12 +79,18 @@ h6 { margin: 0; } +h1.title { + overflow: hidden; + text-overflow: ellipsis; +} + h2 { font-size: 32px; } .subtitle { font-size: 16px; + min-height: 1.4em; } p { @@ -92,7 +104,7 @@ li { } a { - color: #0097A7; + color: #455A64; } pre { @@ -125,12 +137,31 @@ code { background-color: inherit; } -@media (min-width:970px) and (max-width: 2500px) { +@media (min-width: 970px) and (max-width: 2500px) { .container { width: 768px; } } +@media(max-width: 768px) { + nav .container { + width: 100% + } + h1 { + font-size: 24px; + } +} + +@media (min-width: 768px) { + .dl-horizontal dd { + margin-left: 128px; + } + + .dl-horizontal dt { + width: 128px; + } +} + header h1 { margin-top: 64px; font-weight: 400; @@ -158,7 +189,18 @@ dd { section.summary h2 { color: hsl(0, 0%, 46%); margin-bottom: 16px; - border-bottom: 1px solid #eeeeee; + border-bottom: 1px solid #B6B6B6; +} + +section.summary dd { + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; +} + +section.summary dt { + margin-left: 2em; + text-indent: -2em; } dl.dl-horizontal dt { @@ -170,21 +212,15 @@ dt .name { font-size: 16px; } -@media (min-width: 768px) { - .dl-horizontal dd { - margin-left: 160px; - } - - .dl-horizontal dt { - width: 160px; - } -} - dl dt.callable .name { float: none; width: auto; } +.parameter { + white-space: nowrap; +} + .signature a { color: rgb(51, 51, 51); } @@ -217,6 +253,16 @@ footer p { margin: 0; } +footer .no-break { + white-space: nowrap; +} + +footer .container, +footer .container-fluid { + padding-left: 0; + padding-right: 0; +} + .copyright a { color: #727272; } @@ -253,7 +299,7 @@ footer p { } .gt-separated li:after { - content: " > "; + content: " → "; } .gt-separated li:last-child:after { diff --git a/lib/src/model.dart b/lib/src/model.dart index addfd4f183..9e0b6a50e7 100644 --- a/lib/src/model.dart +++ b/lib/src/model.dart @@ -45,7 +45,7 @@ void _addToImplementors(Class c) { } } -abstract class ModelElement { +abstract class ModelElement implements Comparable { final Element element; final Library library; @@ -98,6 +98,14 @@ abstract class ModelElement { throw "Unknown type ${e.runtimeType}"; } + int compareTo(dynamic other) { + if (other is ModelElement) { + return name.toLowerCase().compareTo(other.name.toLowerCase()); + } else { + return 0; + } + } + String get documentation { if (_documentation != null) { return _documentation; @@ -383,9 +391,12 @@ class Package { Library._libraryMap.putIfAbsent(lib.name, () => lib); _libraries.add(lib); }); + _libraries.forEach((library) { library._allClasses.forEach(_addToImplementors); }); + + _implementors.values.forEach((l) => l.sort()); } /// Does this package represent the SDK? @@ -740,6 +751,8 @@ class Class extends ModelElement { return typeChain; } + List get superChainReversed => superChain.reversed.toList(); + List get mixins => _mixins; bool get hasMixins => mixins.isNotEmpty; @@ -750,7 +763,7 @@ class Class extends ModelElement { /// Returns all the implementors of the class specified. List get implementors => - _implementors[this] != null ? _implementors[this] : new List(0); + _implementors[this] != null ? _implementors[this] : []; bool get hasImplementors => implementors.isNotEmpty; diff --git a/lib/templates/_callable.html b/lib/templates/_callable.html index de592eeb82..93ce7be23b 100644 --- a/lib/templates/_callable.html +++ b/lib/templates/_callable.html @@ -1,5 +1,5 @@
- {{>name_summary}}({{{ linkedParamsNoMetadata }}}) + {{>name_summary}}({{{ linkedParamsNoMetadata }}}) → {{{ linkedReturnType }}} diff --git a/lib/templates/_footer.html b/lib/templates/_footer.html index 7367500591..82e0658a0f 100644 --- a/lib/templates/_footer.html +++ b/lib/templates/_footer.html @@ -3,12 +3,13 @@