-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Font face resolver: print font faces from font families defined in all theme.json origins #59376
Closed
Closed
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
b6ea657
print the missing font faces when a font family is defined in more th…
matiasbenedetto b873f5a
Merge branch 'trunk' into port/print-faces-from-all-origins
matiasbenedetto 2ec7d76
move files to from compat/wordpress-6.4 to compat/wordpress-6.5
matiasbenedetto File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
178 changes: 178 additions & 0 deletions
178
lib/compat/wordpress-6.5/fonts/font-face/class-wp-font-face-resolver.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,178 @@ | ||
<?php | ||
/** | ||
* WP_Font_Face_Resolver class. | ||
* | ||
* @package WordPress | ||
* @subpackage Fonts | ||
* @since 6.4.0 | ||
* | ||
* @core-merge: this file is located in `wp-includes/fonts/`. | ||
*/ | ||
|
||
if ( ! class_exists( 'WP_Font_Face_Resolver' ) ) { | ||
|
||
/** | ||
* The Font Face Resolver abstracts the processing of different data sources | ||
* (such as theme.json) for processing within the Font Face. | ||
* | ||
* This class is for internal core usage and is not supposed to be used by | ||
* extenders (plugins and/or themes). | ||
* | ||
* @access private | ||
*/ | ||
class WP_Font_Face_Resolver { | ||
|
||
/** | ||
* Gets fonts defined in theme.json. | ||
* | ||
* @since 6.4.0 | ||
* | ||
* @return array Returns the font-families, each with their font-face variations. | ||
*/ | ||
public static function get_fonts_from_theme_json() { | ||
$settings = gutenberg_get_global_settings(); | ||
|
||
// Bail out early if there are no font settings. | ||
if ( empty( $settings['typography']['fontFamilies'] ) ) { | ||
return array(); | ||
} | ||
|
||
return static::parse_settings( $settings ); | ||
} | ||
|
||
/** | ||
* Parse theme.json settings to extract font definitions with variations grouped by font-family. | ||
* | ||
* @since 6.4.0 | ||
* | ||
* @param array $settings Font settings to parse. | ||
* @return array Returns an array of fonts, grouped by font-family. | ||
*/ | ||
private static function parse_settings( array $settings ) { | ||
$fonts = array(); | ||
|
||
foreach ( $settings['typography']['fontFamilies'] as $font_families ) { | ||
foreach ( $font_families as $definition ) { | ||
|
||
// Skip if "fontFace" is not defined, meaning there are no variations. | ||
if ( empty( $definition['fontFace'] ) ) { | ||
continue; | ||
} | ||
|
||
// Skip if "fontFamily" is not defined. | ||
if ( empty( $definition['fontFamily'] ) ) { | ||
continue; | ||
} | ||
|
||
$font_family_name = static::maybe_parse_name_from_comma_separated_list( $definition['fontFamily'] ); | ||
|
||
// Skip if no font family is defined. | ||
if ( empty( $font_family_name ) ) { | ||
continue; | ||
} | ||
|
||
$fonts[] = static::convert_font_face_properties( $definition['fontFace'], $font_family_name ); | ||
} | ||
} | ||
|
||
return $fonts; | ||
} | ||
|
||
/** | ||
* Parse font-family name from comma-separated lists. | ||
* | ||
* If the given `fontFamily` is a comma-separated lists (example: "Inter, sans-serif" ), | ||
* parse and return the fist font from the list. | ||
* | ||
* @since 6.4.0 | ||
* | ||
* @param string $font_family Font family `fontFamily' to parse. | ||
* @return string Font-family name. | ||
*/ | ||
private static function maybe_parse_name_from_comma_separated_list( $font_family ) { | ||
if ( str_contains( $font_family, ',' ) ) { | ||
$font_family = explode( ',', $font_family )[0]; | ||
} | ||
|
||
return trim( $font_family, "\"'" ); | ||
} | ||
|
||
/** | ||
* Converts font-face properties from theme.json format. | ||
* | ||
* @since 6.4.0 | ||
* | ||
* @param array $font_face_definition The font-face definitions to convert. | ||
* @param string $font_family_property The value to store in the font-face font-family property. | ||
* @return array Converted font-face properties. | ||
*/ | ||
private static function convert_font_face_properties( array $font_face_definition, $font_family_property ) { | ||
$converted_font_faces = array(); | ||
|
||
foreach ( $font_face_definition as $font_face ) { | ||
// Add the font-family property to the font-face. | ||
$font_face['font-family'] = $font_family_property; | ||
|
||
// Converts the "file:./" src placeholder into a theme font file URI. | ||
if ( ! empty( $font_face['src'] ) ) { | ||
$font_face['src'] = static::to_theme_file_uri( (array) $font_face['src'] ); | ||
} | ||
|
||
// Convert camelCase properties into kebab-case. | ||
$font_face = static::to_kebab_case( $font_face ); | ||
|
||
$converted_font_faces[] = $font_face; | ||
} | ||
|
||
return $converted_font_faces; | ||
} | ||
|
||
/** | ||
* Converts each 'file:./' placeholder into a URI to the font file in the theme. | ||
* | ||
* The 'file:./' is specified in the theme's `theme.json` as a placeholder to be | ||
* replaced with the URI to the font file's location in the theme. When a "src" | ||
* beings with this placeholder, it is replaced, converting the src into a URI. | ||
* | ||
* @since 6.4.0 | ||
* | ||
* @param array $src An array of font file sources to process. | ||
* @return array An array of font file src URI(s). | ||
*/ | ||
private static function to_theme_file_uri( array $src ) { | ||
$placeholder = 'file:./'; | ||
|
||
foreach ( $src as $src_key => $src_url ) { | ||
// Skip if the src doesn't start with the placeholder, as there's nothing to replace. | ||
if ( ! str_starts_with( $src_url, $placeholder ) ) { | ||
continue; | ||
} | ||
|
||
$src_file = str_replace( $placeholder, '', $src_url ); | ||
$src[ $src_key ] = get_theme_file_uri( $src_file ); | ||
} | ||
|
||
return $src; | ||
} | ||
|
||
/** | ||
* Converts all first dimension keys into kebab-case. | ||
* | ||
* @since 6.4.0 | ||
* | ||
* @param array $data The array to process. | ||
* @return array Data with first dimension keys converted into kebab-case. | ||
*/ | ||
private static function to_kebab_case( array $data ) { | ||
foreach ( $data as $key => $value ) { | ||
$kebab_case = _wp_to_kebab_case( $key ); | ||
$data[ $kebab_case ] = $value; | ||
if ( $kebab_case !== $key ) { | ||
unset( $data[ $key ] ); | ||
} | ||
} | ||
|
||
return $data; | ||
} | ||
} | ||
} |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should move to 6.5 folder now I think.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you think that because of this particular change or because of something else?
If you mean because of this particular change, this is my rationale:
I understand that the
wordpress-6.4
folder holds the code needed to make the code work with the latest Gutenberg version running on WordPress < 6.4, right? That's still true, so I'm unsure why this should be moved.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no, wordpress-6.4 is the code that was backported during 6.4, so to make Gutenberg work with 6.3 and lower.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we said the same but with different words :)
Given this PR is only a bugfix, and these classes were merged in
6.4,
and only one bugfix will be different in6.5
, should we still move all files to the WordPress-6.5 folder?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes, because the 6.4 folder will get removed once the minimum supported version for Gutenberg is going to be 6.4 but that particular fix will still be needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think if we don't figure out a way to override the 6.4 use-case properly, then there's no match point in "fixing" this bug in Gutenberg. Maybe we should just close this PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The use 6.4 use-case would be printing all the font faces when running wp 6.4 + the latest GB plugin, but I don't understand the quote. Could you explain or add more context, please?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't understand your question :P
I'm saying that if we can't override the class properly on Gutenberg, why change it at all, the 6.4 code should match the code that was merged in 6.4 and we can't move it to 6.5 and update it because it will have no effect anyway.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I see, thanks for explaining. In that case, the bug will be still there when running 6.4 + Gutenberg. Is that ok? If that's OK we can close the PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's ok for me I think.