Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ vars = {
"upstream_boolean_selector": "https://github.com/dart-lang/boolean_selector.git",
"upstream_boringssl_gen": "https://github.com/dart-lang/boringssl_gen.git",
"upstream_boringssl": "https://github.com/openssl/openssl.git",
"upstream_brotli": "https://github.com/google/brotli.git",
"upstream_browser_launcher": "https://github.com/dart-lang/browser_launcher.git",
"upstream_buildroot": "https://github.com/flutter/buildroot.git",
"upstream_cli_util": "https://github.com/dart-lang/cli_util.git",
Expand Down Expand Up @@ -294,6 +295,9 @@ deps = {
'src/third_party/boringssl':
Var('github_git') + '/dart-lang/boringssl_gen.git' + '@' + Var('dart_boringssl_gen_rev'),

'src/third_party/brotli':
Var('skia_git') + '/external/github.com/google/brotli.git' + '@' + 'ed1995b6bda19244070ab5d331111f16f67c8054',

'src/third_party/yapf':
Var('github_git') + '/google/yapf' + '@' + '212c5b5ad8e172d2d914ae454c121c89cccbcb35',

Expand Down
67 changes: 56 additions & 11 deletions lib/web_ui/dev/generate_fallback_font_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import 'dart:convert' show jsonDecode;
import 'dart:io' as io;

import 'package:args/command_runner.dart';
import 'package:csslib/parser.dart' as csslib;
import 'package:csslib/visitor.dart'
show Declaration, FontFaceDirective, StyleSheet, UriTerm, Visitor;
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;

Expand Down Expand Up @@ -56,19 +59,23 @@ class GenerateFallbackFontDataCommand extends Command<bool>
if (response.statusCode != 200) {
throw ToolExit('Failed to download Google Fonts list.');
}
final List<String> fallbackFonts = <String>[];
final Map<String, dynamic> googleFontsResult =
jsonDecode(response.body) as Map<String, dynamic>;
final List<Map<String, dynamic>> fontDatas =
(googleFontsResult['items'] as List<dynamic>)
.cast<Map<String, dynamic>>();
final Map<String, Uri> urlForFamily = <String, Uri>{};
for (final Map<String, dynamic> fontData in fontDatas) {
if (fallbackFonts.contains(fontData['family'])) {
if (apiFallbackFonts.contains(fontData['family'])) {
final String family = fontData['family'] as String;
final Uri uri = Uri.parse(fontData['files']['regular'] as String)
.replace(scheme: 'https');
urlForFamily[fontData['family'] as String] = uri;
urlForFamily[family] = uri;
fallbackFonts.add(family);
}
}
await addSplitFonts(fallbackFonts, urlForFamily);
final Map<String, String> charsetForFamily = <String, String>{};
final io.Directory fontDir = downloadTestFonts
? await io.Directory(path.join(
Expand Down Expand Up @@ -120,12 +127,6 @@ class GenerateFallbackFontDataCommand extends Command<bool>
sb.writeln('final List<NotoFont> fallbackFonts = <NotoFont>[');

for (final String family in fallbackFonts) {
if (family == 'Noto Emoji') {
sb.write(' if (!configuration.useColorEmoji)');
}
if (family == 'Noto Color Emoji') {
sb.write(' if (configuration.useColorEmoji)');
}
sb.writeln(" NotoFont('$family', '${urlForFamily[family]!}',");
final List<String> starts = <String>[];
final List<String> ends = <String>[];
Expand Down Expand Up @@ -168,12 +169,50 @@ class GenerateFallbackFontDataCommand extends Command<bool>
));
await fontDataFile.writeAsString(sb.toString());
}

Future<void> addSplitFonts(
List<String> fallbackFonts, Map<String, Uri> urlForFamily) async {
for (final String font in splitFonts) {
final String modifiedFontName = font.replaceAll(' ', '+');
final Uri cssUri = Uri.parse(
'https://fonts.googleapis.com/css2?family=$modifiedFontName');
final http.Client client = http.Client();
final http.Response response =
await client.get(cssUri, headers: <String, String>{
// Spoof the User-Agent so Google Fonts serves WOFF2 fonts
'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/112.0.0.0 Safari/537.36'
});
final String cssString = response.body;
final StyleSheet stylesheet = csslib.parse(cssString);
final UriCollector uriCollector = UriCollector();
stylesheet.visit(uriCollector);
int familyCount = 0;
for (final Uri uri in uriCollector.uris) {
final String fontName = '$font $familyCount';
fallbackFonts.add(fontName);
urlForFamily[fontName] = uri;
familyCount += 1;
}
}
print(urlForFamily);
}
}

const List<String> fallbackFonts = <String>[
class UriCollector extends Visitor {
final List<Uri> uris = <Uri>[];

@override
void visitUriTerm(UriTerm uriTerm) {
print(uriTerm.value);
uris.add(Uri.parse(uriTerm.value as String));
}
}

/// Fonts that should be downloaded directly from the Google Fonts API.
const List<String> apiFallbackFonts = <String>[
'Noto Sans',
'Noto Color Emoji',
'Noto Emoji',
'Noto Sans Symbols',
'Noto Sans Symbols 2',
'Noto Sans Adlam',
Expand Down Expand Up @@ -315,6 +354,12 @@ const List<String> fallbackFonts = <String>[
'Noto Sans Zanabazar Square',
];

/// Fonts which are split up into several smaller subfonts. These need special
/// handling.
const List<String> splitFonts = <String>[
'Noto Color Emoji',
];

String _packFontRanges(List<String> starts, List<String> ends) {
assert(starts.length == ends.length);

Expand Down
Loading