From 8763d754adbb529f1d5f5823cea6f6e21f6e43d4 Mon Sep 17 00:00:00 2001 From: John Ryan Date: Fri, 17 Apr 2020 13:55:12 -0700 Subject: [PATCH] Add thumbnail images to VSI (#415) * add thumbnail image generation improves page load from 41.7 MB to 7.6 MB * remove filesCreated set - thumbnails for each image are generated. * set package:image version in pubspec * Update grind.dart --- web/samples_index/.gitignore | 3 +++ web/samples_index/README.md | 2 +- web/samples_index/lib/src/data.dart | 8 ++++++ web/samples_index/lib/src/templates.dart | 2 +- web/samples_index/pubspec.yaml | 1 + web/samples_index/tool/grind.dart | 33 +++++++++++++++++++++++- 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/web/samples_index/.gitignore b/web/samples_index/.gitignore index a07407b78..bc8e6f07c 100644 --- a/web/samples_index/.gitignore +++ b/web/samples_index/.gitignore @@ -15,3 +15,6 @@ doc/api/ # All HTML files are generated by `grind generate` web/*.html + +# Any thumbnails should be ignored +web/images/**/*_thumb.png diff --git a/web/samples_index/README.md b/web/samples_index/README.md index 67f539a0c..ff23f21fb 100644 --- a/web/samples_index/README.md +++ b/web/samples_index/README.md @@ -9,7 +9,7 @@ We use [grinder](https://pub.dev/packages/grinder) to run the build tasks: ```bash $ pub get $ pub global activate grinder -$ grind build +$ grind generate ``` This will generate the index into `./web` diff --git a/web/samples_index/lib/src/data.dart b/web/samples_index/lib/src/data.dart index 351a6e034..a8b18ae79 100644 --- a/web/samples_index/lib/src/data.dart +++ b/web/samples_index/lib/src/data.dart @@ -7,6 +7,7 @@ library data; import 'package:json_annotation/json_annotation.dart'; import 'package:samples_index/src/util.dart' as util; +import 'package:path/path.dart' as path; part 'data.g.dart'; @@ -103,6 +104,13 @@ class Sample { Map toJson() => _$SampleToJson(this); + String get thumbnail { + var screenshotUrl = screenshots.first.url; + var prefix = path.dirname(screenshotUrl); + var filename = path.basenameWithoutExtension(screenshotUrl); + return path.join(prefix, filename + '_thumb.png'); + } + String get searchAttributes { var buf = StringBuffer(); buf.write(name.toLowerCase()); diff --git a/web/samples_index/lib/src/templates.dart b/web/samples_index/lib/src/templates.dart index 83d58c9e1..e95e5ae0d 100644 --- a/web/samples_index/lib/src/templates.dart +++ b/web/samples_index/lib/src/templates.dart @@ -136,7 +136,7 @@ String _indexCards(List samples) => samples.map(_indexCard).join(); String _indexCard(Sample sample) => '''
-
+
${_escapeElement(sample.type)}

${_escapeElement(sample.name)}

diff --git a/web/samples_index/pubspec.yaml b/web/samples_index/pubspec.yaml index 0d7be6144..a649d6837 100644 --- a/web/samples_index/pubspec.yaml +++ b/web/samples_index/pubspec.yaml @@ -24,4 +24,5 @@ dev_dependencies: build_runner: ^1.7.0 build_web_compilers: ^2.7.0 tuneup: ^0.3.6 + image: ^2.1.0 diff --git a/web/samples_index/tool/grind.dart b/web/samples_index/tool/grind.dart index 53f0188b9..97d8e0a31 100644 --- a/web/samples_index/tool/grind.dart +++ b/web/samples_index/tool/grind.dart @@ -10,6 +10,7 @@ import 'package:path/path.dart' as path; import 'package:samples_index/samples_index.dart'; import 'package:samples_index/src/templates.dart' as templates; import 'package:samples_index/cookbook.dart'; +import 'package:image/image.dart' as image; void main(args) => grind(args); @@ -22,7 +23,7 @@ void analyze() { } @Task('deploy') -@Depends(analyze, testCli, generate, buildRelease) +@Depends(analyze, testCli, generate, createThumbnails, buildRelease) void deploy() { print('All tasks completed. To deploy to Firebase, run:'); print(''); @@ -82,6 +83,36 @@ Future scrapeCookbook() async { } } +@Task('creates thumbnail images in web/images') +Future createThumbnails() async { + await _createThumbnails(Directory('web/images')); + await _createThumbnails(Directory('web/images/cookbook')); +} + +// Creates a thumbnail image for each png file +Future _createThumbnails(Directory directory) async { + var files = await directory.list().toList(); + var filesToWrite = {}; + + for (var entity in files) { + var extension = path.extension(entity.path); + var filename = path.basenameWithoutExtension(entity.path); + if (extension != '.png' || entity is! File || filename.endsWith('_thumb')) { + continue; + } + + var file = entity as File; + var pathPrefix = path.dirname(file.path); + var thumbnailFile = File(path.join(pathPrefix, filename + '_thumb.png')); + + var img = image.decodeImage(await file.readAsBytes()); + var resized = image.copyResize(img, width: 640); + filesToWrite.add(thumbnailFile.writeAsBytes(image.encodePng(resized))); + } + + await Future.wait(filesToWrite); +} + @Task('remove generated HTML files') Future clean() async { var tasks = [];