Plugin Updates
This commit is contained in:
@@ -121,12 +121,24 @@ class getid3_lib
|
||||
}
|
||||
}
|
||||
// if integers are 64-bit - no other check required
|
||||
if ($hasINT64 || (($num <= PHP_INT_MAX) && ($num >= PHP_INT_MIN))) { // phpcs:ignore PHPCompatibility.Constants.NewConstants.php_int_minFound
|
||||
if ($hasINT64 || (($num <= PHP_INT_MAX) && ($num >= PHP_INT_MIN))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a division, guarding against division by zero
|
||||
*
|
||||
* @param float|int $numerator
|
||||
* @param float|int $denominator
|
||||
* @param float|int $fallback
|
||||
* @return float|int
|
||||
*/
|
||||
public static function SafeDiv($numerator, $denominator, $fallback = 0) {
|
||||
return $denominator ? $numerator / $denominator : $fallback;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $fraction
|
||||
*
|
||||
@@ -134,7 +146,7 @@ class getid3_lib
|
||||
*/
|
||||
public static function DecimalizeFraction($fraction) {
|
||||
list($numerator, $denominator) = explode('/', $fraction);
|
||||
return $numerator / ($denominator ? $denominator : 1);
|
||||
return (int) $numerator / ($denominator ? $denominator : 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -871,10 +883,6 @@ class getid3_lib
|
||||
* @return string
|
||||
*/
|
||||
public static function iconv_fallback_iso88591_utf8($string, $bom=false) {
|
||||
if (function_exists('utf8_encode')) {
|
||||
return utf8_encode($string);
|
||||
}
|
||||
// utf8_encode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support)
|
||||
$newcharstring = '';
|
||||
if ($bom) {
|
||||
$newcharstring .= "\xEF\xBB\xBF";
|
||||
@@ -943,10 +951,6 @@ class getid3_lib
|
||||
* @return string
|
||||
*/
|
||||
public static function iconv_fallback_utf8_iso88591($string) {
|
||||
if (function_exists('utf8_decode')) {
|
||||
return utf8_decode($string);
|
||||
}
|
||||
// utf8_decode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support)
|
||||
$newcharstring = '';
|
||||
$offset = 0;
|
||||
$stringlength = strlen($string);
|
||||
|
||||
@@ -387,7 +387,7 @@ class getID3
|
||||
*/
|
||||
protected $startup_warning = '';
|
||||
|
||||
const VERSION = '1.9.22-202207161647';
|
||||
const VERSION = '1.9.23-202310190849';
|
||||
const FREAD_BUFFER_SIZE = 32768;
|
||||
|
||||
const ATTACHMENTS_NONE = false;
|
||||
@@ -438,19 +438,19 @@ class getID3
|
||||
$this->startup_error .= 'WARNING: php.ini contains "mbstring.func_overload = '.ini_get('mbstring.func_overload').'", getID3 cannot run with this setting (bitmask 2 (string functions) cannot be set). Recommended to disable entirely.'."\n";
|
||||
}
|
||||
|
||||
// check for magic quotes in PHP < 7.4.0 (when these functions became deprecated)
|
||||
if (version_compare(PHP_VERSION, '7.4.0', '<')) {
|
||||
// check for magic quotes in PHP < 5.4.0 (when these options were removed and getters always return false)
|
||||
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
|
||||
// Check for magic_quotes_runtime
|
||||
if (function_exists('get_magic_quotes_runtime')) {
|
||||
// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_runtimeDeprecated
|
||||
if (get_magic_quotes_runtime()) {
|
||||
if (get_magic_quotes_runtime()) { // @phpstan-ignore-line
|
||||
$this->startup_error .= 'magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).'."\n";
|
||||
}
|
||||
}
|
||||
// Check for magic_quotes_gpc
|
||||
if (function_exists('get_magic_quotes_gpc')) {
|
||||
// phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_gpcDeprecated
|
||||
if (get_magic_quotes_gpc()) {
|
||||
if (get_magic_quotes_gpc()) { // @phpstan-ignore-line
|
||||
$this->startup_error .= 'magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).'."\n";
|
||||
}
|
||||
}
|
||||
@@ -1468,6 +1468,16 @@ class getID3
|
||||
'fail_ape' => 'ERROR',
|
||||
),
|
||||
|
||||
// XZ - data - XZ compressed data
|
||||
'7zip' => array(
|
||||
'pattern' => '^7z\\xBC\\xAF\\x27\\x1C',
|
||||
'group' => 'archive',
|
||||
'module' => '7zip',
|
||||
'mime_type' => 'application/x-7z-compressed',
|
||||
'fail_id3' => 'ERROR',
|
||||
'fail_ape' => 'ERROR',
|
||||
),
|
||||
|
||||
|
||||
// Misc other formats
|
||||
|
||||
@@ -1982,7 +1992,7 @@ class getID3
|
||||
}
|
||||
$BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate;
|
||||
|
||||
$this->info['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed;
|
||||
$this->info['video']['compression_ratio'] = getid3_lib::SafeDiv($BitrateCompressed, $BitrateUncompressed, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2188,6 +2198,8 @@ abstract class getid3_handler
|
||||
}
|
||||
|
||||
/**
|
||||
* @phpstan-impure
|
||||
*
|
||||
* @return int|bool
|
||||
*/
|
||||
protected function ftell() {
|
||||
@@ -2200,6 +2212,8 @@ abstract class getid3_handler
|
||||
/**
|
||||
* @param int $bytes
|
||||
*
|
||||
* @phpstan-impure
|
||||
*
|
||||
* @return string|false
|
||||
*
|
||||
* @throws getid3_exception
|
||||
@@ -2245,6 +2259,8 @@ abstract class getid3_handler
|
||||
* @param int $bytes
|
||||
* @param int $whence
|
||||
*
|
||||
* @phpstan-impure
|
||||
*
|
||||
* @return int
|
||||
*
|
||||
* @throws getid3_exception
|
||||
@@ -2286,6 +2302,8 @@ abstract class getid3_handler
|
||||
}
|
||||
|
||||
/**
|
||||
* @phpstan-impure
|
||||
*
|
||||
* @return string|false
|
||||
*
|
||||
* @throws getid3_exception
|
||||
@@ -2341,6 +2359,8 @@ abstract class getid3_handler
|
||||
}
|
||||
|
||||
/**
|
||||
* @phpstan-impure
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function feof() {
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
getID3() Commercial License
|
||||
===========================
|
||||
|
||||
getID3() is licensed under the "GNU Public License" (GPL) and/or the
|
||||
"getID3() Commercial License" (gCL). This document describes the gCL.
|
||||
|
||||
---------------------------------------------------------------------
|
||||
|
||||
The license is non-exclusively granted to a single person or company,
|
||||
per payment of the license fee, for the lifetime of that person or
|
||||
company. The license is non-transferrable.
|
||||
|
||||
The gCL grants the licensee the right to use getID3() in commercial
|
||||
closed-source projects. Modifications may be made to getID3() with no
|
||||
obligation to release the modified source code. getID3() (or pieces
|
||||
thereof) may be included in any number of projects authored (in whole
|
||||
or in part) by the licensee.
|
||||
|
||||
The licensee may use any version of getID3(), past, present or future,
|
||||
as is most convenient. This license does not entitle the licensee to
|
||||
receive any technical support, updates or bugfixes, except as such are
|
||||
made publicly available to all getID3() users.
|
||||
|
||||
The licensee may not sub-license getID3() itself, meaning that any
|
||||
commercially released product containing all or parts of getID3() must
|
||||
have added functionality beyond what is available in getID3();
|
||||
getID3() itself may not be re-licensed by the licensee.
|
||||
@@ -20,7 +20,8 @@ GNU LGPL: https://gnu.org/licenses/lgpl.html (v3)
|
||||
|
||||
Mozilla MPL: https://www.mozilla.org/MPL/2.0/ (v2)
|
||||
|
||||
getID3 Commercial License: https://www.getid3.org/#gCL (payment required)
|
||||
getID3 Commercial License: https://www.getid3.org/#gCL
|
||||
(no longer available, existing licenses remain valid)
|
||||
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
|
||||
@@ -193,7 +193,7 @@ class getid3_asf extends getid3_handler
|
||||
$info['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000);
|
||||
|
||||
//$info['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate'];
|
||||
$info['bitrate'] = ((isset($thisfile_asf_filepropertiesobject['filesize']) ? $thisfile_asf_filepropertiesobject['filesize'] : $info['filesize']) * 8) / $info['playtime_seconds'];
|
||||
$info['bitrate'] = getid3_lib::SafeDiv($thisfile_asf_filepropertiesobject['filesize'] * 8, $info['playtime_seconds']);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1066,7 +1066,7 @@ class getid3_asf extends getid3_handler
|
||||
break;
|
||||
}
|
||||
|
||||
if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) {
|
||||
if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { // @phpstan-ignore-line
|
||||
foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {
|
||||
if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) {
|
||||
$thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate'];
|
||||
@@ -1152,7 +1152,7 @@ class getid3_asf extends getid3_handler
|
||||
$videomediaoffset += 4;
|
||||
$thisfile_asf_videomedia_currentstream['format_data']['codec_data'] = substr($streamdata['type_specific_data'], $videomediaoffset);
|
||||
|
||||
if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) {
|
||||
if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { // @phpstan-ignore-line
|
||||
foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {
|
||||
if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) {
|
||||
$thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate'];
|
||||
|
||||
@@ -292,12 +292,12 @@ class getid3_matroska extends getid3_handler
|
||||
$track_info['display_x'] = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']);
|
||||
$track_info['display_y'] = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']);
|
||||
|
||||
if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; }
|
||||
if (isset($trackarray['PixelCropTop'])) { $track_info['crop_top'] = $trackarray['PixelCropTop']; }
|
||||
if (isset($trackarray['PixelCropLeft'])) { $track_info['crop_left'] = $trackarray['PixelCropLeft']; }
|
||||
if (isset($trackarray['PixelCropRight'])) { $track_info['crop_right'] = $trackarray['PixelCropRight']; }
|
||||
if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate'] = round(1000000000 / $trackarray['DefaultDuration'], 3); }
|
||||
if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; }
|
||||
if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; }
|
||||
if (isset($trackarray['PixelCropTop'])) { $track_info['crop_top'] = $trackarray['PixelCropTop']; }
|
||||
if (isset($trackarray['PixelCropLeft'])) { $track_info['crop_left'] = $trackarray['PixelCropLeft']; }
|
||||
if (isset($trackarray['PixelCropRight'])) { $track_info['crop_right'] = $trackarray['PixelCropRight']; }
|
||||
if (!empty($trackarray['DefaultDuration'])) { $track_info['frame_rate'] = round(1000000000 / $trackarray['DefaultDuration'], 3); }
|
||||
if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; }
|
||||
|
||||
switch ($trackarray['CodecID']) {
|
||||
case 'V_MS/VFW/FOURCC':
|
||||
|
||||
@@ -152,7 +152,7 @@ class getid3_quicktime extends getid3_handler
|
||||
} elseif (strlen($lat_deg) == 4) { // [+-]DDMM.M
|
||||
$ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60);
|
||||
} elseif (strlen($lat_deg) == 6) { // [+-]DDMMSS.S
|
||||
$ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600);
|
||||
$ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval((int) ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600);
|
||||
}
|
||||
|
||||
if (strlen($lon_deg) == 3) { // [+-]DDD.D
|
||||
@@ -160,7 +160,7 @@ class getid3_quicktime extends getid3_handler
|
||||
} elseif (strlen($lon_deg) == 5) { // [+-]DDDMM.M
|
||||
$ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60);
|
||||
} elseif (strlen($lon_deg) == 7) { // [+-]DDDMMSS.S
|
||||
$ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600);
|
||||
$ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval((int) ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600);
|
||||
}
|
||||
|
||||
if (strlen($alt_deg) == 3) { // [+-]DDD.D
|
||||
@@ -168,7 +168,7 @@ class getid3_quicktime extends getid3_handler
|
||||
} elseif (strlen($alt_deg) == 5) { // [+-]DDDMM.M
|
||||
$ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60);
|
||||
} elseif (strlen($alt_deg) == 7) { // [+-]DDDMMSS.S
|
||||
$ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600);
|
||||
$ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval((int) ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600);
|
||||
}
|
||||
|
||||
foreach (array('latitude', 'longitude', 'altitude') as $key) {
|
||||
@@ -332,7 +332,7 @@ class getid3_quicktime extends getid3_handler
|
||||
}
|
||||
} elseif (isset($value_array['time_to_sample_table'])) {
|
||||
foreach ($value_array['time_to_sample_table'] as $key2 => $value_array2) {
|
||||
if (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0)) {
|
||||
if (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0) && !empty($info['quicktime']['time_scale'])) {
|
||||
$framerate = round($info['quicktime']['time_scale'] / $value_array2['sample_duration'], 3);
|
||||
$framecount = $value_array2['sample_count'];
|
||||
}
|
||||
@@ -776,8 +776,8 @@ class getid3_quicktime extends getid3_handler
|
||||
|
||||
|
||||
case 'stsd': // Sample Table Sample Description atom
|
||||
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
|
||||
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000
|
||||
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); // hardcoded: 0x00
|
||||
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x000000
|
||||
$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4));
|
||||
|
||||
// see: https://github.com/JamesHeinrich/getID3/issues/111
|
||||
@@ -805,7 +805,6 @@ class getid3_quicktime extends getid3_handler
|
||||
$stsdEntriesDataOffset += 2;
|
||||
$atom_structure['sample_description_table'][$i]['data'] = substr($atom_data, $stsdEntriesDataOffset, ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2));
|
||||
$stsdEntriesDataOffset += ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2);
|
||||
|
||||
if (substr($atom_structure['sample_description_table'][$i]['data'], 1, 54) == 'application/octet-stream;type=com.parrot.videometadata') {
|
||||
// special handling for apparently-malformed (TextMetaDataSampleEntry?) data for some version of Parrot drones
|
||||
$atom_structure['sample_description_table'][$i]['parrot_frame_metadata']['mime_type'] = substr($atom_structure['sample_description_table'][$i]['data'], 1, 55);
|
||||
@@ -893,7 +892,8 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
|
||||
break;
|
||||
|
||||
case 'mp4a':
|
||||
default:
|
||||
$atom_structure['sample_description_table'][$i]['subatoms'] = $this->QuicktimeParseContainerAtom(substr($atom_structure['sample_description_table'][$i]['data'], 20), $baseoffset + $stsdEntriesDataOffset - 20 - 16, $atomHierarchy, $ParseAllPossibleAtoms);
|
||||
|
||||
$info['quicktime']['audio']['codec'] = $this->QuicktimeAudioCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);
|
||||
$info['quicktime']['audio']['sample_rate'] = $atom_structure['sample_description_table'][$i]['audio_sample_rate'];
|
||||
$info['quicktime']['audio']['channels'] = $atom_structure['sample_description_table'][$i]['audio_channels'];
|
||||
@@ -919,6 +919,9 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1666,7 +1669,7 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
|
||||
);
|
||||
$atom_structure['data'] = $atom_data;
|
||||
$atom_structure['image_mime'] = 'image/jpeg';
|
||||
$atom_structure['description'] = isset($descriptions[$atomname]) ? $descriptions[$atomname] : 'Nikon preview image';
|
||||
$atom_structure['description'] = $descriptions[$atomname];
|
||||
$info['quicktime']['comments']['picture'][] = array(
|
||||
'image_mime' => $atom_structure['image_mime'],
|
||||
'data' => $atom_data,
|
||||
@@ -1683,7 +1686,7 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
|
||||
case 'NCHD': // Nikon:MakerNoteVersion - https://exiftool.org/TagNames/Nikon.html
|
||||
$makerNoteVersion = '';
|
||||
for ($i = 0, $iMax = strlen($atom_data); $i < $iMax; ++$i) {
|
||||
if (ord($atom_data[$i]) >= 0x00 && ord($atom_data[$i]) <= 0x1F) {
|
||||
if (ord($atom_data[$i]) <= 0x1F) {
|
||||
$makerNoteVersion .= ' '.ord($atom_data[$i]);
|
||||
} else {
|
||||
$makerNoteVersion .= $atom_data[$i];
|
||||
@@ -2101,6 +2104,97 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
|
||||
break;
|
||||
|
||||
|
||||
case 'esds': // Elementary Stream DeScriptor
|
||||
// https://github.com/JamesHeinrich/getID3/issues/414
|
||||
// https://chromium.googlesource.com/chromium/src/media/+/refs/heads/main/formats/mp4/es_descriptor.cc
|
||||
// https://chromium.googlesource.com/chromium/src/media/+/refs/heads/main/formats/mp4/es_descriptor.h
|
||||
$atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); // hardcoded: 0x00
|
||||
$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x000000
|
||||
$esds_offset = 4;
|
||||
|
||||
$atom_structure['ES_DescrTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
|
||||
$esds_offset += 1;
|
||||
if ($atom_structure['ES_DescrTag'] != 0x03) {
|
||||
$this->warning('expecting esds.ES_DescrTag = 0x03, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_DescrTag']).'), at offset '.$atom_structure['offset']);
|
||||
break;
|
||||
}
|
||||
$atom_structure['ES_DescrSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);
|
||||
|
||||
$atom_structure['ES_ID'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 2));
|
||||
$esds_offset += 2;
|
||||
$atom_structure['ES_flagsraw'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
|
||||
$esds_offset += 1;
|
||||
$atom_structure['ES_flags']['stream_dependency'] = (bool) ($atom_structure['ES_flagsraw'] & 0x80);
|
||||
$atom_structure['ES_flags']['url_flag'] = (bool) ($atom_structure['ES_flagsraw'] & 0x40);
|
||||
$atom_structure['ES_flags']['ocr_stream'] = (bool) ($atom_structure['ES_flagsraw'] & 0x20);
|
||||
$atom_structure['ES_stream_priority'] = ($atom_structure['ES_flagsraw'] & 0x1F);
|
||||
if ($atom_structure['ES_flags']['url_flag']) {
|
||||
$this->warning('Unsupported esds.url_flag enabled at offset '.$atom_structure['offset']);
|
||||
break;
|
||||
}
|
||||
if ($atom_structure['ES_flags']['stream_dependency']) {
|
||||
$atom_structure['ES_dependsOn_ES_ID'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 2));
|
||||
$esds_offset += 2;
|
||||
}
|
||||
if ($atom_structure['ES_flags']['ocr_stream']) {
|
||||
$atom_structure['ES_OCR_ES_Id'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 2));
|
||||
$esds_offset += 2;
|
||||
}
|
||||
|
||||
$atom_structure['ES_DecoderConfigDescrTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
|
||||
$esds_offset += 1;
|
||||
if ($atom_structure['ES_DecoderConfigDescrTag'] != 0x04) {
|
||||
$this->warning('expecting esds.ES_DecoderConfigDescrTag = 0x04, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_DecoderConfigDescrTag']).'), at offset '.$atom_structure['offset']);
|
||||
break;
|
||||
}
|
||||
$atom_structure['ES_DecoderConfigDescrTagSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);
|
||||
|
||||
$atom_structure['ES_objectTypeIndication'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
|
||||
$esds_offset += 1;
|
||||
// https://stackoverflow.com/questions/3987850
|
||||
// 0x40 = "Audio ISO/IEC 14496-3" = MPEG-4 Audio
|
||||
// 0x67 = "Audio ISO/IEC 13818-7 LowComplexity Profile" = MPEG-2 AAC LC
|
||||
// 0x69 = "Audio ISO/IEC 13818-3" = MPEG-2 Backward Compatible Audio (MPEG-2 Layers 1, 2, and 3)
|
||||
// 0x6B = "Audio ISO/IEC 11172-3" = MPEG-1 Audio (MPEG-1 Layers 1, 2, and 3)
|
||||
|
||||
$streamTypePlusFlags = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
|
||||
$esds_offset += 1;
|
||||
$atom_structure['ES_streamType'] = ($streamTypePlusFlags & 0xFC) >> 2;
|
||||
$atom_structure['ES_upStream'] = (bool) ($streamTypePlusFlags & 0x02) >> 1;
|
||||
$atom_structure['ES_bufferSizeDB'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 3));
|
||||
$esds_offset += 3;
|
||||
$atom_structure['ES_maxBitrate'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 4));
|
||||
$esds_offset += 4;
|
||||
$atom_structure['ES_avgBitrate'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 4));
|
||||
$esds_offset += 4;
|
||||
if ($atom_structure['ES_avgBitrate']) {
|
||||
$info['quicktime']['audio']['bitrate'] = $atom_structure['ES_avgBitrate'];
|
||||
$info['audio']['bitrate'] = $atom_structure['ES_avgBitrate'];
|
||||
}
|
||||
|
||||
$atom_structure['ES_DecSpecificInfoTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
|
||||
$esds_offset += 1;
|
||||
if ($atom_structure['ES_DecSpecificInfoTag'] != 0x05) {
|
||||
$this->warning('expecting esds.ES_DecSpecificInfoTag = 0x05, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_DecSpecificInfoTag']).'), at offset '.$atom_structure['offset']);
|
||||
break;
|
||||
}
|
||||
$atom_structure['ES_DecSpecificInfoTagSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);
|
||||
|
||||
$atom_structure['ES_DecSpecificInfo'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, $atom_structure['ES_DecSpecificInfoTagSize']));
|
||||
$esds_offset += $atom_structure['ES_DecSpecificInfoTagSize'];
|
||||
|
||||
$atom_structure['ES_SLConfigDescrTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, 1));
|
||||
$esds_offset += 1;
|
||||
if ($atom_structure['ES_SLConfigDescrTag'] != 0x06) {
|
||||
$this->warning('expecting esds.ES_SLConfigDescrTag = 0x05, found 0x'.getid3_lib::PrintHexBytes($atom_structure['ES_SLConfigDescrTag']).'), at offset '.$atom_structure['offset']);
|
||||
break;
|
||||
}
|
||||
$atom_structure['ES_SLConfigDescrTagSize'] = $this->quicktime_read_mp4_descr_length($atom_data, $esds_offset);
|
||||
|
||||
$atom_structure['ES_SLConfigDescr'] = getid3_lib::BigEndian2Int(substr($atom_data, $esds_offset, $atom_structure['ES_SLConfigDescrTagSize']));
|
||||
$esds_offset += $atom_structure['ES_SLConfigDescrTagSize'];
|
||||
break;
|
||||
|
||||
// AVIF-related - https://docs.rs/avif-parse/0.13.2/src/avif_parse/boxes.rs.html
|
||||
case 'pitm': // Primary ITeM
|
||||
case 'iloc': // Item LOCation
|
||||
@@ -2991,6 +3085,7 @@ $this->error('fragmented mp4 files not currently supported');
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param array $info
|
||||
*
|
||||
|
||||
@@ -214,7 +214,7 @@ class getid3_riff extends getid3_handler
|
||||
$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];
|
||||
|
||||
if (empty($info['playtime_seconds'])) { // may already be set (e.g. DTS-WAV)
|
||||
$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']);
|
||||
$info['playtime_seconds'] = (float)getid3_lib::SafeDiv(($info['avdataend'] - $info['avdataoffset']) * 8, $thisfile_audio['bitrate']);
|
||||
}
|
||||
|
||||
$thisfile_audio['lossless'] = false;
|
||||
@@ -440,11 +440,11 @@ class getid3_riff extends getid3_handler
|
||||
$thisfile_riff_WAVE['iXML'][0]['parsed'] = $parsedXML;
|
||||
if (isset($parsedXML['SPEED']['MASTER_SPEED'])) {
|
||||
@list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['MASTER_SPEED']);
|
||||
$thisfile_riff_WAVE['iXML'][0]['master_speed'] = $numerator / ($denominator ? $denominator : 1000);
|
||||
$thisfile_riff_WAVE['iXML'][0]['master_speed'] = (int) $numerator / ($denominator ? $denominator : 1000);
|
||||
}
|
||||
if (isset($parsedXML['SPEED']['TIMECODE_RATE'])) {
|
||||
@list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['TIMECODE_RATE']);
|
||||
$thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = $numerator / ($denominator ? $denominator : 1000);
|
||||
$thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = (int) $numerator / ($denominator ? $denominator : 1000);
|
||||
}
|
||||
if (isset($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO']) && !empty($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) && !empty($thisfile_riff_WAVE['iXML'][0]['timecode_rate'])) {
|
||||
$samples_since_midnight = floatval(ltrim($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_HI'].$parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO'], '0'));
|
||||
@@ -521,7 +521,7 @@ class getid3_riff extends getid3_handler
|
||||
|
||||
if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) {
|
||||
$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];
|
||||
$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']);
|
||||
$info['playtime_seconds'] = (float)getid3_lib::SafeDiv((($info['avdataend'] - $info['avdataoffset']) * 8), $thisfile_audio['bitrate']);
|
||||
}
|
||||
|
||||
if (!empty($info['wavpack'])) {
|
||||
@@ -531,7 +531,7 @@ class getid3_riff extends getid3_handler
|
||||
|
||||
// Reset to the way it was - RIFF parsing will have messed this up
|
||||
$info['avdataend'] = $Original['avdataend'];
|
||||
$thisfile_audio['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
|
||||
$thisfile_audio['bitrate'] = getid3_lib::SafeDiv(($info['avdataend'] - $info['avdataoffset']) * 8, $info['playtime_seconds']);
|
||||
|
||||
$this->fseek($info['avdataoffset'] - 44);
|
||||
$RIFFdata = $this->fread(44);
|
||||
@@ -632,7 +632,7 @@ class getid3_riff extends getid3_handler
|
||||
}
|
||||
}
|
||||
if ($info['avdataend'] > $info['filesize']) {
|
||||
switch (!empty($thisfile_audio_dataformat) ? $thisfile_audio_dataformat : '') {
|
||||
switch ($thisfile_audio_dataformat) {
|
||||
case 'wavpack': // WavPack
|
||||
case 'lpac': // LPAC
|
||||
case 'ofr': // OptimFROG
|
||||
@@ -672,7 +672,7 @@ class getid3_riff extends getid3_handler
|
||||
$this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored');
|
||||
}
|
||||
}
|
||||
if (isset($thisfile_audio_dataformat) && ($thisfile_audio_dataformat == 'ac3')) {
|
||||
if ($thisfile_audio_dataformat == 'ac3') {
|
||||
unset($thisfile_audio['bits_per_sample']);
|
||||
if (!empty($info['ac3']['bitrate']) && ($info['ac3']['bitrate'] != $thisfile_audio['bitrate'])) {
|
||||
$thisfile_audio['bitrate'] = $info['ac3']['bitrate'];
|
||||
@@ -781,15 +781,15 @@ class getid3_riff extends getid3_handler
|
||||
/** @var array $thisfile_riff_video_current */
|
||||
$thisfile_riff_video_current = &$thisfile_riff_video[$streamindex];
|
||||
|
||||
if ($thisfile_riff_raw_avih['dwWidth'] > 0) {
|
||||
if ($thisfile_riff_raw_avih['dwWidth'] > 0) { // @phpstan-ignore-line
|
||||
$thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth'];
|
||||
$thisfile_video['resolution_x'] = $thisfile_riff_video_current['frame_width'];
|
||||
}
|
||||
if ($thisfile_riff_raw_avih['dwHeight'] > 0) {
|
||||
if ($thisfile_riff_raw_avih['dwHeight'] > 0) { // @phpstan-ignore-line
|
||||
$thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight'];
|
||||
$thisfile_video['resolution_y'] = $thisfile_riff_video_current['frame_height'];
|
||||
}
|
||||
if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) {
|
||||
if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) { // @phpstan-ignore-line
|
||||
$thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames'];
|
||||
$thisfile_video['total_frames'] = $thisfile_riff_video_current['total_frames'];
|
||||
}
|
||||
@@ -1913,7 +1913,7 @@ class getid3_riff extends getid3_handler
|
||||
if (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) {
|
||||
unset($RIFFchunk[$chunkname][$thisindex]);
|
||||
}
|
||||
if (isset($RIFFchunk[$chunkname]) && empty($RIFFchunk[$chunkname])) {
|
||||
if (count($RIFFchunk[$chunkname]) === 0) {
|
||||
unset($RIFFchunk[$chunkname]);
|
||||
}
|
||||
$RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = $this->fread($chunksize);
|
||||
@@ -2034,7 +2034,7 @@ class getid3_riff extends getid3_handler
|
||||
foreach ($RIFFinfoKeyLookup as $key => $value) {
|
||||
if (isset($RIFFinfoArray[$key])) {
|
||||
foreach ($RIFFinfoArray[$key] as $commentid => $commentdata) {
|
||||
if (trim($commentdata['data']) != '') {
|
||||
if (!empty($commentdata['data']) && trim($commentdata['data']) != '') {
|
||||
if (isset($CommentsTargetArray[$value])) {
|
||||
$CommentsTargetArray[$value][] = trim($commentdata['data']);
|
||||
} else {
|
||||
|
||||
@@ -1380,11 +1380,11 @@ class getid3_mp3 extends getid3_handler
|
||||
$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] = isset($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]) ? ++$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] : 1;
|
||||
$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] = isset($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]) ? ++$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] : 1;
|
||||
if (++$frames_scanned >= $max_frames_scan) {
|
||||
$pct_data_scanned = ($this->ftell() - $info['avdataoffset']) / ($info['avdataend'] - $info['avdataoffset']);
|
||||
$pct_data_scanned = getid3_lib::SafeDiv($this->ftell() - $info['avdataoffset'], $info['avdataend'] - $info['avdataoffset']);
|
||||
$this->warning('too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.');
|
||||
foreach ($Distribution as $key1 => $value1) {
|
||||
foreach ($value1 as $key2 => $value2) {
|
||||
$Distribution[$key1][$key2] = round($value2 / $pct_data_scanned);
|
||||
$Distribution[$key1][$key2] = $pct_data_scanned ? round($value2 / $pct_data_scanned) : 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1475,7 +1475,7 @@ class getid3_mp3 extends getid3_handler
|
||||
$SyncSeekAttemptsMax = 1000;
|
||||
$FirstFrameThisfileInfo = null;
|
||||
while ($SynchSeekOffset < $sync_seek_buffer_size) {
|
||||
if ((($avdataoffset + $SynchSeekOffset) < $info['avdataend']) && !feof($this->getid3->fp)) {
|
||||
if ((($avdataoffset + $SynchSeekOffset) < $info['avdataend']) && !$this->feof()) {
|
||||
|
||||
if ($SynchSeekOffset > $sync_seek_buffer_size) {
|
||||
// if a synch's not found within the first 128k bytes, then give up
|
||||
@@ -1490,20 +1490,6 @@ class getid3_mp3 extends getid3_handler
|
||||
unset($info['mpeg']);
|
||||
}
|
||||
return false;
|
||||
|
||||
} elseif (feof($this->getid3->fp)) {
|
||||
|
||||
$this->error('Could not find valid MPEG audio synch before end of file');
|
||||
if (isset($info['audio']['bitrate'])) {
|
||||
unset($info['audio']['bitrate']);
|
||||
}
|
||||
if (isset($info['mpeg']['audio'])) {
|
||||
unset($info['mpeg']['audio']);
|
||||
}
|
||||
if (isset($info['mpeg']) && (!is_array($info['mpeg']) || (count($info['mpeg']) == 0))) {
|
||||
unset($info['mpeg']);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1652,7 +1638,7 @@ class getid3_mp3 extends getid3_handler
|
||||
}
|
||||
$frames_scanned++;
|
||||
if ($frames_scan_per_segment && (++$frames_scanned_this_segment >= $frames_scan_per_segment)) {
|
||||
$this_pct_scanned = ($this->ftell() - $scan_start_offset[$current_segment]) / ($info['avdataend'] - $info['avdataoffset']);
|
||||
$this_pct_scanned = getid3_lib::SafeDiv($this->ftell() - $scan_start_offset[$current_segment], $info['avdataend'] - $info['avdataoffset']);
|
||||
if (($current_segment == 0) && (($this_pct_scanned * $max_scan_segments) >= 1)) {
|
||||
// file likely contains < $max_frames_scan, just scan as one segment
|
||||
$max_scan_segments = 1;
|
||||
@@ -1743,6 +1729,10 @@ class getid3_mp3 extends getid3_handler
|
||||
|
||||
}
|
||||
$info['audio']['channels'] = $info['mpeg']['audio']['channels'];
|
||||
if ($info['audio']['channels'] < 1) {
|
||||
$this->error('Corrupt MP3 file: no channels');
|
||||
return false;
|
||||
}
|
||||
$info['audio']['channelmode'] = $info['mpeg']['audio']['channelmode'];
|
||||
$info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate'];
|
||||
return true;
|
||||
|
||||
@@ -210,8 +210,8 @@ $this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['
|
||||
$filedataoffset += 20;
|
||||
|
||||
$info['ogg']['skeleton']['fishead']['version'] = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor'];
|
||||
$info['ogg']['skeleton']['fishead']['presentationtime'] = $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'];
|
||||
$info['ogg']['skeleton']['fishead']['basetime'] = $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator'];
|
||||
$info['ogg']['skeleton']['fishead']['presentationtime'] = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'], $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator']);
|
||||
$info['ogg']['skeleton']['fishead']['basetime'] = getid3_lib::SafeDiv($info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'], $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']);
|
||||
$info['ogg']['skeleton']['fishead']['utc'] = $info['ogg']['skeleton']['fishead']['raw']['utc'];
|
||||
|
||||
|
||||
@@ -288,7 +288,7 @@ $this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['
|
||||
$info['audio']['sample_rate'] = $info['flac']['STREAMINFO']['sample_rate'];
|
||||
$info['audio']['channels'] = $info['flac']['STREAMINFO']['channels'];
|
||||
$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];
|
||||
$info['playtime_seconds'] = $info['flac']['STREAMINFO']['samples_stream'] / $info['flac']['STREAMINFO']['sample_rate'];
|
||||
$info['playtime_seconds'] = getid3_lib::SafeDiv($info['flac']['STREAMINFO']['samples_stream'], $info['flac']['STREAMINFO']['sample_rate']);
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -359,7 +359,7 @@ $this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['
|
||||
return false;
|
||||
}
|
||||
if (!empty($info['audio']['sample_rate'])) {
|
||||
$info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / ($info['ogg']['samples'] / $info['audio']['sample_rate']);
|
||||
$info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) * $info['audio']['sample_rate'] / $info['ogg']['samples'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -534,12 +534,12 @@ $this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['
|
||||
|
||||
$filedata = $this->fread($this->getid3->fread_buffer_size());
|
||||
$filedataoffset = 0;
|
||||
while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {
|
||||
while (substr($filedata, $filedataoffset++, 4) != 'OggS') {
|
||||
if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {
|
||||
// should be found before here
|
||||
return false;
|
||||
}
|
||||
if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) {
|
||||
if (($filedataoffset + 28) > strlen($filedata)) {
|
||||
if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === '')) {
|
||||
// get some more data, unless eof, in which case fail
|
||||
return false;
|
||||
|
||||
@@ -267,7 +267,7 @@ class getid3_apetag extends getid3_handler
|
||||
case 'cover art (publisher logo)':
|
||||
case 'cover art (recording)':
|
||||
case 'cover art (studio)':
|
||||
// list of possible cover arts from http://taglib-sharp.sourcearchive.com/documentation/2.0.3.0-2/Ape_2Tag_8cs-source.html
|
||||
// list of possible cover arts from https://github.com/mono/taglib-sharp/blob/taglib-sharp-2.0.3.2/src/TagLib/Ape/Tag.cs
|
||||
if (is_array($thisfile_ape_items_current['data'])) {
|
||||
$this->warning('APEtag "'.$item_key.'" should be flagged as Binary data, but was incorrectly flagged as UTF-8');
|
||||
$thisfile_ape_items_current['data'] = implode("\x00", $thisfile_ape_items_current['data']);
|
||||
@@ -332,7 +332,7 @@ class getid3_apetag extends getid3_handler
|
||||
$info['ape']['comments']['picture'][] = $comments_picture_data;
|
||||
unset($comments_picture_data);
|
||||
}
|
||||
} while (false);
|
||||
} while (false); // @phpstan-ignore-line
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -66,7 +66,7 @@ class getid3_id3v1 extends getid3_handler
|
||||
if (!empty($ParsedID3v1['genre'])) {
|
||||
unset($ParsedID3v1['genreid']);
|
||||
}
|
||||
if (isset($ParsedID3v1['genre']) && (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown'))) {
|
||||
if (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown')) {
|
||||
unset($ParsedID3v1['genre']);
|
||||
}
|
||||
|
||||
|
||||
@@ -1494,7 +1494,7 @@ class getid3_id3v2 extends getid3_handler
|
||||
unset($comments_picture_data);
|
||||
}
|
||||
}
|
||||
} while (false);
|
||||
} while (false); // @phpstan-ignore-line
|
||||
}
|
||||
|
||||
} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15 GEOB General encapsulated object
|
||||
@@ -3753,18 +3753,12 @@ class getid3_id3v2 extends getid3_handler
|
||||
* @return bool
|
||||
*/
|
||||
public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) {
|
||||
for ($i = 0; $i < strlen($numberstring); $i++) {
|
||||
if ((chr($numberstring[$i]) < chr('0')) || (chr($numberstring[$i]) > chr('9'))) {
|
||||
if (($numberstring[$i] == '.') && $allowdecimal) {
|
||||
// allowed
|
||||
} elseif (($numberstring[$i] == '-') && $allownegative && ($i == 0)) {
|
||||
// allowed
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
$pattern = '#^';
|
||||
$pattern .= ($allownegative ? '\\-?' : '');
|
||||
$pattern .= '[0-9]+';
|
||||
$pattern .= ($allowdecimal ? '(\\.[0-9]+)?' : '');
|
||||
$pattern .= '$#';
|
||||
return preg_match($pattern, $numberstring);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3773,10 +3767,7 @@ class getid3_id3v2 extends getid3_handler
|
||||
* @return bool
|
||||
*/
|
||||
public static function IsValidDateStampString($datestamp) {
|
||||
if (strlen($datestamp) != 8) {
|
||||
return false;
|
||||
}
|
||||
if (!self::IsANumber($datestamp, false)) {
|
||||
if (!preg_match('#^[12][0-9]{3}[01][0-9][0123][0-9]$#', $datestamp)) {
|
||||
return false;
|
||||
}
|
||||
$year = substr($datestamp, 0, 4);
|
||||
|
||||
@@ -20,7 +20,8 @@ GNU LGPL: https://gnu.org/licenses/lgpl.html (v3)
|
||||
|
||||
Mozilla MPL: https://www.mozilla.org/MPL/2.0/ (v2)
|
||||
|
||||
getID3 Commercial License: https://www.getid3.org/#gCL (payment required)
|
||||
getID3 Commercial License: https://www.getid3.org/#gCL
|
||||
(no longer available, existing licenses remain valid)
|
||||
|
||||
*****************************************************************
|
||||
*****************************************************************
|
||||
|
||||
@@ -357,6 +357,13 @@ class PHPMailer
|
||||
*/
|
||||
public $AuthType = '';
|
||||
|
||||
/**
|
||||
* SMTP SMTPXClient command attibutes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $SMTPXClient = [];
|
||||
|
||||
/**
|
||||
* An implementation of the PHPMailer OAuthTokenProvider interface.
|
||||
*
|
||||
@@ -750,7 +757,7 @@ class PHPMailer
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '6.8.1';
|
||||
const VERSION = '6.9.1';
|
||||
|
||||
/**
|
||||
* Error severity: message only, continue processing.
|
||||
@@ -1573,6 +1580,10 @@ class PHPMailer
|
||||
|
||||
//Validate From, Sender, and ConfirmReadingTo addresses
|
||||
foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) {
|
||||
if ($this->{$address_kind} === null) {
|
||||
$this->{$address_kind} = '';
|
||||
continue;
|
||||
}
|
||||
$this->{$address_kind} = trim($this->{$address_kind});
|
||||
if (empty($this->{$address_kind})) {
|
||||
continue;
|
||||
@@ -1999,6 +2010,38 @@ class PHPMailer
|
||||
return $this->smtp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide SMTP XCLIENT attributes
|
||||
*
|
||||
* @param string $name Attribute name
|
||||
* @param ?string $value Attribute value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function setSMTPXclientAttribute($name, $value)
|
||||
{
|
||||
if (!in_array($name, SMTP::$xclient_allowed_attributes)) {
|
||||
return false;
|
||||
}
|
||||
if (isset($this->SMTPXClient[$name]) && $value === null) {
|
||||
unset($this->SMTPXClient[$name]);
|
||||
} elseif ($value !== null) {
|
||||
$this->SMTPXClient[$name] = $value;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get SMTP XCLIENT attributes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getSMTPXclientAttributes()
|
||||
{
|
||||
return $this->SMTPXClient;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send mail via SMTP.
|
||||
* Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
|
||||
@@ -2027,6 +2070,9 @@ class PHPMailer
|
||||
} else {
|
||||
$smtp_from = $this->Sender;
|
||||
}
|
||||
if (count($this->SMTPXClient)) {
|
||||
$this->smtp->xclient($this->SMTPXClient);
|
||||
}
|
||||
if (!$this->smtp->mail($smtp_from)) {
|
||||
$this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
|
||||
throw new Exception($this->ErrorInfo, self::STOP_CRITICAL);
|
||||
@@ -2189,10 +2235,17 @@ class PHPMailer
|
||||
$this->smtp->hello($hello);
|
||||
//Automatically enable TLS encryption if:
|
||||
//* it's not disabled
|
||||
//* we are not connecting to localhost
|
||||
//* we have openssl extension
|
||||
//* we are not already using SSL
|
||||
//* the server offers STARTTLS
|
||||
if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) {
|
||||
if (
|
||||
$this->SMTPAutoTLS &&
|
||||
$this->Host !== 'localhost' &&
|
||||
$sslext &&
|
||||
$secure !== 'ssl' &&
|
||||
$this->smtp->getServerExt('STARTTLS')
|
||||
) {
|
||||
$tls = true;
|
||||
}
|
||||
if ($tls) {
|
||||
@@ -4049,6 +4102,79 @@ class PHPMailer
|
||||
$this->CustomHeader = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear a specific custom header by name or name and value.
|
||||
* $name value can be overloaded to contain
|
||||
* both header name and value (name:value).
|
||||
*
|
||||
* @param string $name Custom header name
|
||||
* @param string|null $value Header value
|
||||
*
|
||||
* @return bool True if a header was replaced successfully
|
||||
*/
|
||||
public function clearCustomHeader($name, $value = null)
|
||||
{
|
||||
if (null === $value && strpos($name, ':') !== false) {
|
||||
//Value passed in as name:value
|
||||
list($name, $value) = explode(':', $name, 2);
|
||||
}
|
||||
$name = trim($name);
|
||||
$value = (null === $value) ? null : trim($value);
|
||||
|
||||
foreach ($this->CustomHeader as $k => $pair) {
|
||||
if ($pair[0] == $name) {
|
||||
// We remove the header if the value is not provided or it matches.
|
||||
if (null === $value || $pair[1] == $value) {
|
||||
unset($this->CustomHeader[$k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace a custom header.
|
||||
* $name value can be overloaded to contain
|
||||
* both header name and value (name:value).
|
||||
*
|
||||
* @param string $name Custom header name
|
||||
* @param string|null $value Header value
|
||||
*
|
||||
* @return bool True if a header was replaced successfully
|
||||
* @throws Exception
|
||||
*/
|
||||
public function replaceCustomHeader($name, $value = null)
|
||||
{
|
||||
if (null === $value && strpos($name, ':') !== false) {
|
||||
//Value passed in as name:value
|
||||
list($name, $value) = explode(':', $name, 2);
|
||||
}
|
||||
$name = trim($name);
|
||||
$value = (null === $value) ? '' : trim($value);
|
||||
|
||||
$replaced = false;
|
||||
foreach ($this->CustomHeader as $k => $pair) {
|
||||
if ($pair[0] == $name) {
|
||||
if ($replaced) {
|
||||
unset($this->CustomHeader[$k]);
|
||||
continue;
|
||||
}
|
||||
if (strpbrk($name . $value, "\r\n") !== false) {
|
||||
if ($this->exceptions) {
|
||||
throw new Exception($this->lang('invalid_header'));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
$this->CustomHeader[$k] = [$name, $value];
|
||||
$replaced = true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an error message to the error container.
|
||||
*
|
||||
|
||||
@@ -35,7 +35,7 @@ class SMTP
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '6.8.1';
|
||||
const VERSION = '6.9.1';
|
||||
|
||||
/**
|
||||
* SMTP line break constant.
|
||||
@@ -198,6 +198,18 @@ class SMTP
|
||||
'Mailjet' => '/[\d]{3} OK queued as (.*)/',
|
||||
];
|
||||
|
||||
/**
|
||||
* Allowed SMTP XCLIENT attributes.
|
||||
* Must be allowed by the SMTP server. EHLO response is not checked.
|
||||
*
|
||||
* @see https://www.postfix.org/XCLIENT_README.html
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $xclient_allowed_attributes = [
|
||||
'NAME', 'ADDR', 'PORT', 'PROTO', 'HELO', 'LOGIN', 'DESTADDR', 'DESTPORT'
|
||||
];
|
||||
|
||||
/**
|
||||
* The last transaction ID issued in response to a DATA command,
|
||||
* if one was detected.
|
||||
@@ -971,6 +983,25 @@ class SMTP
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send SMTP XCLIENT command to server and check its return code.
|
||||
*
|
||||
* @return bool True on success
|
||||
*/
|
||||
public function xclient(array $vars)
|
||||
{
|
||||
$xclient_options = "";
|
||||
foreach ($vars as $key => $value) {
|
||||
if (in_array($key, SMTP::$xclient_allowed_attributes)) {
|
||||
$xclient_options .= " {$key}={$value}";
|
||||
}
|
||||
}
|
||||
if (!$xclient_options) {
|
||||
return true;
|
||||
}
|
||||
return $this->sendCommand('XCLIENT', 'XCLIENT' . $xclient_options, 250);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send an SMTP RSET command.
|
||||
* Abort any transaction that is currently in progress.
|
||||
|
||||
@@ -296,7 +296,7 @@ class Text_MappedDiff extends Text_Diff {
|
||||
/**
|
||||
* Computes a diff between sequences of strings.
|
||||
*
|
||||
* This can be used to compute things like case-insensitve diffs, or diffs
|
||||
* This can be used to compute things like case-insensitive diffs, or diffs
|
||||
* which ignore changes in white-space.
|
||||
*
|
||||
* @param array $from_lines An array of strings.
|
||||
|
||||
@@ -139,6 +139,9 @@ function wp_admin_bar_wp_menu( $wp_admin_bar ) {
|
||||
__( 'About WordPress' ) .
|
||||
'</span>',
|
||||
'href' => $about_url,
|
||||
'meta' => array(
|
||||
'menu_title' => __( 'About WordPress' ),
|
||||
),
|
||||
);
|
||||
|
||||
// Set tabindex="0" to make sub menus accessible when no URL is available.
|
||||
@@ -282,7 +285,10 @@ function wp_admin_bar_my_account_item( $wp_admin_bar ) {
|
||||
'title' => $howdy . $avatar,
|
||||
'href' => $profile_url,
|
||||
'meta' => array(
|
||||
'class' => $class,
|
||||
'class' => $class,
|
||||
/* translators: %s: Current user's display name. */
|
||||
'menu_title' => sprintf( __( 'Howdy, %s' ), $current_user->display_name ),
|
||||
'tabindex' => ( false !== $profile_url ) ? '' : 0,
|
||||
),
|
||||
)
|
||||
);
|
||||
@@ -325,29 +331,19 @@ function wp_admin_bar_my_account_menu( $wp_admin_bar ) {
|
||||
$user_info .= "<span class='username'>{$current_user->user_login}</span>";
|
||||
}
|
||||
|
||||
if ( false !== $profile_url ) {
|
||||
$user_info .= "<span class='display-name edit-profile'>" . __( 'Edit Profile' ) . '</span>';
|
||||
}
|
||||
|
||||
$wp_admin_bar->add_node(
|
||||
array(
|
||||
'parent' => 'user-actions',
|
||||
'id' => 'user-info',
|
||||
'title' => $user_info,
|
||||
'href' => $profile_url,
|
||||
'meta' => array(
|
||||
'tabindex' => -1,
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
if ( false !== $profile_url ) {
|
||||
$wp_admin_bar->add_node(
|
||||
array(
|
||||
'parent' => 'user-actions',
|
||||
'id' => 'edit-profile',
|
||||
'title' => __( 'Edit Profile' ),
|
||||
'href' => $profile_url,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$wp_admin_bar->add_node(
|
||||
array(
|
||||
'parent' => 'user-actions',
|
||||
@@ -397,6 +393,9 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) {
|
||||
'id' => 'site-name',
|
||||
'title' => $title,
|
||||
'href' => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(),
|
||||
'meta' => array(
|
||||
'menu_title' => $title,
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
@@ -436,6 +435,18 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) {
|
||||
|
||||
// Add the appearance submenu items.
|
||||
wp_admin_bar_appearance_menu( $wp_admin_bar );
|
||||
|
||||
// Add a Plugins link.
|
||||
if ( current_user_can( 'activate_plugins' ) ) {
|
||||
$wp_admin_bar->add_node(
|
||||
array(
|
||||
'parent' => 'site-name',
|
||||
'id' => 'plugins',
|
||||
'title' => __( 'Plugins' ),
|
||||
'href' => admin_url( 'plugins.php' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -443,9 +454,9 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) {
|
||||
* Adds the "Edit site" link to the Toolbar.
|
||||
*
|
||||
* @since 5.9.0
|
||||
* @since 6.3.0 Added `$_wp_current_template_id` global for editing of current template directly from the admin bar.
|
||||
*
|
||||
* @global string $_wp_current_template_id
|
||||
* @since 6.3.0 Added `$_wp_current_template_id` global for editing of current template directly from the admin bar.
|
||||
*
|
||||
* @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
|
||||
*/
|
||||
@@ -482,8 +493,9 @@ function wp_admin_bar_edit_site_menu( $wp_admin_bar ) {
|
||||
*
|
||||
* @since 4.3.0
|
||||
*
|
||||
* @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
|
||||
* @global WP_Customize_Manager $wp_customize
|
||||
*
|
||||
* @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
|
||||
*/
|
||||
function wp_admin_bar_customize_menu( $wp_admin_bar ) {
|
||||
global $wp_customize;
|
||||
@@ -926,6 +938,7 @@ function wp_admin_bar_edit_menu( $wp_admin_bar ) {
|
||||
* Adds "Add New" menu.
|
||||
*
|
||||
* @since 3.1.0
|
||||
* @since 6.5.0 Added a New Site link for network installations.
|
||||
*
|
||||
* @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
|
||||
*/
|
||||
@@ -981,6 +994,9 @@ function wp_admin_bar_new_content_menu( $wp_admin_bar ) {
|
||||
'id' => 'new-content',
|
||||
'title' => $title,
|
||||
'href' => admin_url( current( array_keys( $actions ) ) ),
|
||||
'meta' => array(
|
||||
'menu_title' => _x( 'New', 'admin bar menu group label' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
@@ -996,6 +1012,17 @@ function wp_admin_bar_new_content_menu( $wp_admin_bar ) {
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if ( is_multisite() && current_user_can( 'create_sites' ) ) {
|
||||
$wp_admin_bar->add_node(
|
||||
array(
|
||||
'parent' => 'new-content',
|
||||
'id' => 'add-new-site',
|
||||
'title' => _x( 'Site', 'add new from admin bar' ),
|
||||
'href' => network_admin_url( 'site-new.php' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '794dd7047e2302828128');
|
||||
<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '7f2b9b64306bff9c719f');
|
||||
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '794dd7047e2302828128');
|
||||
<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '7f2b9b64306bff9c719f');
|
||||
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '79d08edf9bea9ade42e6');
|
||||
<?php return array('dependencies' => array(), 'version' => '8f1acdfb845f670b0ef2');
|
||||
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '79d08edf9bea9ade42e6');
|
||||
<?php return array('dependencies' => array(), 'version' => '8f1acdfb845f670b0ef2');
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
/**
|
||||
* Block Bindings API
|
||||
*
|
||||
* Contains functions for managing block bindings in WordPress.
|
||||
*
|
||||
* @package WordPress
|
||||
* @subpackage Block Bindings
|
||||
* @since 6.5.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* Registers a new block bindings source.
|
||||
*
|
||||
* Registering a source consists of defining a **name** for that source and a callback function specifying
|
||||
* how to get a value from that source and pass it to a block attribute.
|
||||
*
|
||||
* Once a source is registered, any block that supports the Block Bindings API can use a value
|
||||
* from that source by setting its `metadata.bindings` attribute to a value that refers to the source.
|
||||
*
|
||||
* Note that `register_block_bindings_source()` should be called from a handler attached to the `init` hook.
|
||||
*
|
||||
*
|
||||
* ## Example
|
||||
*
|
||||
* ### Registering a source
|
||||
*
|
||||
* First, you need to define a function that will be used to get the value from the source.
|
||||
*
|
||||
* function my_plugin_get_custom_source_value( array $source_args, $block_instance, string $attribute_name ) {
|
||||
* // Your custom logic to get the value from the source.
|
||||
* // For example, you can use the `$source_args` to look up a value in a custom table or get it from an external API.
|
||||
* $value = $source_args['key'];
|
||||
*
|
||||
* return "The value passed to the block is: $value"
|
||||
* }
|
||||
*
|
||||
* The `$source_args` will contain the arguments passed to the source in the block's
|
||||
* `metadata.bindings` attribute. See the example in the "Usage in a block" section below.
|
||||
*
|
||||
* function my_plugin_register_block_bindings_sources() {
|
||||
* register_block_bindings_source( 'my-plugin/my-custom-source', array(
|
||||
* 'label' => __( 'My Custom Source', 'my-plugin' ),
|
||||
* 'get_value_callback' => 'my_plugin_get_custom_source_value',
|
||||
* ) );
|
||||
* }
|
||||
* add_action( 'init', 'my_plugin_register_block_bindings_sources' );
|
||||
*
|
||||
* ### Usage in a block
|
||||
*
|
||||
* In a block's `metadata.bindings` attribute, you can specify the source and
|
||||
* its arguments. Such a block will use the source to override the block
|
||||
* attribute's value. For example:
|
||||
*
|
||||
* <!-- wp:paragraph {
|
||||
* "metadata": {
|
||||
* "bindings": {
|
||||
* "content": {
|
||||
* "source": "my-plugin/my-custom-source",
|
||||
* "args": {
|
||||
* "key": "you can pass any custom arguments here"
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* } -->
|
||||
* <p>Fallback text that gets replaced.</p>
|
||||
* <!-- /wp:paragraph -->
|
||||
*
|
||||
* @since 6.5.0
|
||||
*
|
||||
* @param string $source_name The name of the source. It must be a string containing a namespace prefix, i.e.
|
||||
* `my-plugin/my-custom-source`. It must only contain lowercase alphanumeric
|
||||
* characters, the forward slash `/` and dashes.
|
||||
* @param array $source_properties {
|
||||
* The array of arguments that are used to register a source.
|
||||
*
|
||||
* @type string $label The label of the source.
|
||||
* @type callback $get_value_callback A callback executed when the source is processed during block rendering.
|
||||
* The callback should have the following signature:
|
||||
*
|
||||
* `function ($source_args, $block_instance,$attribute_name): mixed`
|
||||
* - @param array $source_args Array containing source arguments
|
||||
* used to look up the override value,
|
||||
* i.e. {"key": "foo"}.
|
||||
* - @param WP_Block $block_instance The block instance.
|
||||
* - @param string $attribute_name The name of an attribute .
|
||||
* The callback has a mixed return type; it may return a string to override
|
||||
* the block's original value, null, false to remove an attribute, etc.
|
||||
* @type array $uses_context (optional) Array of values to add to block `uses_context` needed by the source.
|
||||
* }
|
||||
* @return WP_Block_Bindings_Source|false Source when the registration was successful, or `false` on failure.
|
||||
*/
|
||||
function register_block_bindings_source( string $source_name, array $source_properties ) {
|
||||
return WP_Block_Bindings_Registry::get_instance()->register( $source_name, $source_properties );
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters a block bindings source.
|
||||
*
|
||||
* @since 6.5.0
|
||||
*
|
||||
* @param string $source_name Block bindings source name including namespace.
|
||||
* @return WP_Block_Bindings_Source|false The unregistered block bindings source on success and `false` otherwise.
|
||||
*/
|
||||
function unregister_block_bindings_source( string $source_name ) {
|
||||
return WP_Block_Bindings_Registry::get_instance()->unregister( $source_name );
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the list of all registered block bindings sources.
|
||||
*
|
||||
* @since 6.5.0
|
||||
*
|
||||
* @return WP_Block_Bindings_Source[] The array of registered block bindings sources.
|
||||
*/
|
||||
function get_all_registered_block_bindings_sources() {
|
||||
return WP_Block_Bindings_Registry::get_instance()->get_all_registered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a registered block bindings source.
|
||||
*
|
||||
* @since 6.5.0
|
||||
*
|
||||
* @param string $source_name The name of the source.
|
||||
* @return WP_Block_Bindings_Source|null The registered block bindings source, or `null` if it is not registered.
|
||||
*/
|
||||
function get_block_bindings_source( string $source_name ) {
|
||||
return WP_Block_Bindings_Registry::get_instance()->get_registered( $source_name );
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* Pattern Overrides source for the Block Bindings.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @package WordPress
|
||||
* @subpackage Block Bindings
|
||||
*/
|
||||
|
||||
/**
|
||||
* Gets value for the Pattern Overrides source.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*
|
||||
* @param array $source_args Array containing source arguments used to look up the override value.
|
||||
* Example: array( "key" => "foo" ).
|
||||
* @param WP_Block $block_instance The block instance.
|
||||
* @param string $attribute_name The name of the target attribute.
|
||||
* @return mixed The value computed for the source.
|
||||
*/
|
||||
function _block_bindings_pattern_overrides_get_value( array $source_args, $block_instance, string $attribute_name ) {
|
||||
if ( empty( $block_instance->attributes['metadata']['name'] ) ) {
|
||||
return null;
|
||||
}
|
||||
$metadata_name = $block_instance->attributes['metadata']['name'];
|
||||
return _wp_array_get( $block_instance->context, array( 'pattern/overrides', $metadata_name, $attribute_name ), null );
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers Pattern Overrides source in the Block Bindings registry.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*/
|
||||
function _register_block_bindings_pattern_overrides_source() {
|
||||
register_block_bindings_source(
|
||||
'core/pattern-overrides',
|
||||
array(
|
||||
'label' => _x( 'Pattern Overrides', 'block bindings source' ),
|
||||
'get_value_callback' => '_block_bindings_pattern_overrides_get_value',
|
||||
'uses_context' => array( 'pattern/overrides' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
add_action( 'init', '_register_block_bindings_pattern_overrides_source' );
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
/**
|
||||
* Post Meta source for the block bindings.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @package WordPress
|
||||
* @subpackage Block Bindings
|
||||
*/
|
||||
|
||||
/**
|
||||
* Gets value for Post Meta source.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*
|
||||
* @param array $source_args Array containing source arguments used to look up the override value.
|
||||
* Example: array( "key" => "foo" ).
|
||||
* @param WP_Block $block_instance The block instance.
|
||||
* @return mixed The value computed for the source.
|
||||
*/
|
||||
function _block_bindings_post_meta_get_value( array $source_args, $block_instance ) {
|
||||
if ( empty( $source_args['key'] ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ( empty( $block_instance->context['postId'] ) ) {
|
||||
return null;
|
||||
}
|
||||
$post_id = $block_instance->context['postId'];
|
||||
|
||||
// If a post isn't public, we need to prevent unauthorized users from accessing the post meta.
|
||||
$post = get_post( $post_id );
|
||||
if ( ( ! is_post_publicly_viewable( $post ) && ! current_user_can( 'read_post', $post_id ) ) || post_password_required( $post ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check if the meta field is protected.
|
||||
if ( is_protected_meta( $source_args['key'], 'post' ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check if the meta field is registered to be shown in REST.
|
||||
$meta_keys = get_registered_meta_keys( 'post', $block_instance->context['postType'] );
|
||||
// Add fields registered for all subtypes.
|
||||
$meta_keys = array_merge( $meta_keys, get_registered_meta_keys( 'post', '' ) );
|
||||
if ( empty( $meta_keys[ $source_args['key'] ]['show_in_rest'] ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return get_post_meta( $post_id, $source_args['key'], true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers Post Meta source in the block bindings registry.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*/
|
||||
function _register_block_bindings_post_meta_source() {
|
||||
register_block_bindings_source(
|
||||
'core/post-meta',
|
||||
array(
|
||||
'label' => _x( 'Post Meta', 'block bindings source' ),
|
||||
'get_value_callback' => '_block_bindings_post_meta_get_value',
|
||||
'uses_context' => array( 'postId', 'postType' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
add_action( 'init', '_register_block_bindings_post_meta_source' );
|
||||
@@ -135,6 +135,20 @@ function _register_core_block_patterns_and_categories() {
|
||||
'description' => __( 'Different layouts containing video or audio.' ),
|
||||
)
|
||||
);
|
||||
register_block_pattern_category(
|
||||
'videos',
|
||||
array(
|
||||
'label' => _x( 'Videos', 'Block pattern category' ),
|
||||
'description' => __( 'Different layouts containing videos.' ),
|
||||
)
|
||||
);
|
||||
register_block_pattern_category(
|
||||
'audio',
|
||||
array(
|
||||
'label' => _x( 'Audio', 'Block pattern category' ),
|
||||
'description' => __( 'Different layouts containing audio.' ),
|
||||
)
|
||||
);
|
||||
register_block_pattern_category(
|
||||
'posts',
|
||||
array(
|
||||
@@ -377,13 +391,7 @@ function _register_theme_block_patterns() {
|
||||
continue;
|
||||
}
|
||||
|
||||
// The actual pattern content is the output of the file.
|
||||
ob_start();
|
||||
include $file_path;
|
||||
$pattern_data['content'] = ob_get_clean();
|
||||
if ( ! $pattern_data['content'] ) {
|
||||
continue;
|
||||
}
|
||||
$pattern_data['filePath'] = $file_path;
|
||||
|
||||
// Translate the pattern metadata.
|
||||
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.LowLevelTranslationFunction
|
||||
|
||||
@@ -40,6 +40,7 @@ function wp_register_background_support( $block_type ) {
|
||||
* it is also applied to non-server-rendered blocks.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @since 6.5.0 Added support for `backgroundPosition` and `backgroundRepeat` output.
|
||||
* @access private
|
||||
*
|
||||
* @param string $block_content Rendered block content.
|
||||
@@ -64,9 +65,20 @@ function wp_render_background_support( $block_content, $block ) {
|
||||
$background_image_url = isset( $block_attributes['style']['background']['backgroundImage']['url'] )
|
||||
? $block_attributes['style']['background']['backgroundImage']['url']
|
||||
: null;
|
||||
$background_size = isset( $block_attributes['style']['background']['backgroundSize'] )
|
||||
|
||||
if ( ! $background_image_source && ! $background_image_url ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$background_size = isset( $block_attributes['style']['background']['backgroundSize'] )
|
||||
? $block_attributes['style']['background']['backgroundSize']
|
||||
: 'cover';
|
||||
$background_position = isset( $block_attributes['style']['background']['backgroundPosition'] )
|
||||
? $block_attributes['style']['background']['backgroundPosition']
|
||||
: null;
|
||||
$background_repeat = isset( $block_attributes['style']['background']['backgroundRepeat'] )
|
||||
? $block_attributes['style']['background']['backgroundRepeat']
|
||||
: null;
|
||||
|
||||
$background_block_styles = array();
|
||||
|
||||
@@ -76,8 +88,15 @@ function wp_render_background_support( $block_content, $block ) {
|
||||
) {
|
||||
// Set file based background URL.
|
||||
$background_block_styles['backgroundImage']['url'] = $background_image_url;
|
||||
// Only output the background size when an image url is set.
|
||||
$background_block_styles['backgroundSize'] = $background_size;
|
||||
// Only output the background size and repeat when an image url is set.
|
||||
$background_block_styles['backgroundSize'] = $background_size;
|
||||
$background_block_styles['backgroundRepeat'] = $background_repeat;
|
||||
$background_block_styles['backgroundPosition'] = $background_position;
|
||||
|
||||
// If the background size is set to `contain` and no position is set, set the position to `center`.
|
||||
if ( 'contain' === $background_size && ! isset( $background_position ) ) {
|
||||
$background_block_styles['backgroundPosition'] = 'center';
|
||||
}
|
||||
}
|
||||
|
||||
$styles = wp_style_engine_get_styles( array( 'background' => $background_block_styles ) );
|
||||
@@ -99,6 +118,7 @@ function wp_render_background_support( $block_content, $block ) {
|
||||
|
||||
$updated_style .= $styles['css'];
|
||||
$tags->set_attribute( 'style', $updated_style );
|
||||
$tags->add_class( 'has-background' );
|
||||
}
|
||||
|
||||
return $tags->get_updated_html();
|
||||
|
||||
@@ -83,6 +83,86 @@ function wp_apply_dimensions_support( $block_type, $block_attributes ) {
|
||||
return $attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders server-side dimensions styles to the block wrapper.
|
||||
* This block support uses the `render_block` hook to ensure that
|
||||
* it is also applied to non-server-rendered blocks.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*
|
||||
* @param string $block_content Rendered block content.
|
||||
* @param array $block Block object.
|
||||
* @return string Filtered block content.
|
||||
*/
|
||||
function wp_render_dimensions_support( $block_content, $block ) {
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
$block_attributes = ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) ? $block['attrs'] : array();
|
||||
$has_aspect_ratio_support = block_has_support( $block_type, array( 'dimensions', 'aspectRatio' ), false );
|
||||
|
||||
if (
|
||||
! $has_aspect_ratio_support ||
|
||||
wp_should_skip_block_supports_serialization( $block_type, 'dimensions', 'aspectRatio' )
|
||||
) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$dimensions_block_styles = array();
|
||||
$dimensions_block_styles['aspectRatio'] = $block_attributes['style']['dimensions']['aspectRatio'] ?? null;
|
||||
|
||||
// To ensure the aspect ratio does not get overridden by `minHeight` unset any existing rule.
|
||||
if (
|
||||
isset( $dimensions_block_styles['aspectRatio'] )
|
||||
) {
|
||||
$dimensions_block_styles['minHeight'] = 'unset';
|
||||
} elseif (
|
||||
isset( $block_attributes['style']['dimensions']['minHeight'] ) ||
|
||||
isset( $block_attributes['minHeight'] )
|
||||
) {
|
||||
$dimensions_block_styles['aspectRatio'] = 'unset';
|
||||
}
|
||||
|
||||
$styles = wp_style_engine_get_styles( array( 'dimensions' => $dimensions_block_styles ) );
|
||||
|
||||
if ( ! empty( $styles['css'] ) ) {
|
||||
// Inject dimensions styles to the first element, presuming it's the wrapper, if it exists.
|
||||
$tags = new WP_HTML_Tag_Processor( $block_content );
|
||||
|
||||
if ( $tags->next_tag() ) {
|
||||
$existing_style = $tags->get_attribute( 'style' );
|
||||
$updated_style = '';
|
||||
|
||||
if ( ! empty( $existing_style ) ) {
|
||||
$updated_style = $existing_style;
|
||||
if ( ! str_ends_with( $existing_style, ';' ) ) {
|
||||
$updated_style .= ';';
|
||||
}
|
||||
}
|
||||
|
||||
$updated_style .= $styles['css'];
|
||||
$tags->set_attribute( 'style', $updated_style );
|
||||
|
||||
if ( ! empty( $styles['classnames'] ) ) {
|
||||
foreach ( explode( ' ', $styles['classnames'] ) as $class_name ) {
|
||||
if (
|
||||
str_contains( $class_name, 'aspect-ratio' ) &&
|
||||
! isset( $block_attributes['style']['dimensions']['aspectRatio'] )
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
$tags->add_class( $class_name );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $tags->get_updated_html();
|
||||
}
|
||||
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
add_filter( 'render_block', 'wp_render_dimensions_support', 10, 2 );
|
||||
|
||||
// Register the block support.
|
||||
WP_Block_Supports::get_instance()->register(
|
||||
'dimensions',
|
||||
|
||||
@@ -166,8 +166,8 @@ function wp_render_elements_support_styles( $pre_render, $block ) {
|
||||
'skip' => $skip_button_color_serialization,
|
||||
),
|
||||
'link' => array(
|
||||
'selector' => ".$class_name a",
|
||||
'hover_selector' => ".$class_name a:hover",
|
||||
'selector' => ".$class_name a:where(:not(.wp-element-button))",
|
||||
'hover_selector' => ".$class_name a:where(:not(.wp-element-button)):hover",
|
||||
'skip' => $skip_link_color_serialization,
|
||||
),
|
||||
'heading' => array(
|
||||
|
||||
@@ -615,6 +615,9 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
$processor->add_class( $class_name );
|
||||
}
|
||||
return $processor->get_updated_html();
|
||||
} elseif ( ! $block_supports_layout ) {
|
||||
// Ensure layout classnames are not injected if there is no layout support.
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$global_settings = wp_get_global_settings();
|
||||
@@ -638,7 +641,7 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
* for features like the enhanced pagination of the Query block.
|
||||
*/
|
||||
$container_class = wp_unique_prefixed_id(
|
||||
'wp-container-' . sanitize_title( $block['blockName'] ) . '-layout-'
|
||||
'wp-container-' . sanitize_title( $block['blockName'] ) . '-is-layout-'
|
||||
);
|
||||
|
||||
// Set the correct layout type for blocks using legacy content width.
|
||||
@@ -796,12 +799,12 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
* are still present in the wrapper as they are in this example. Frequently, additional classes
|
||||
* will also be present; rarely should classes be removed.
|
||||
*
|
||||
* @TODO: Find a better way to match the first inner block. If it's possible to identify where the
|
||||
* first inner block starts, then it will be possible to find the last tag before it starts
|
||||
* and then that tag, if an opening tag, can be solidly identified as a wrapping element.
|
||||
* Can some unique value or class or ID be added to the inner blocks when they process
|
||||
* so that they can be extracted here safely without guessing? Can the block rendering function
|
||||
* return information about where the rendered inner blocks start?
|
||||
* @todo Find a better way to match the first inner block. If it's possible to identify where the
|
||||
* first inner block starts, then it will be possible to find the last tag before it starts
|
||||
* and then that tag, if an opening tag, can be solidly identified as a wrapping element.
|
||||
* Can some unique value or class or ID be added to the inner blocks when they process
|
||||
* so that they can be extracted here safely without guessing? Can the block rendering function
|
||||
* return information about where the rendered inner blocks start?
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
@@ -834,7 +837,8 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
break;
|
||||
}
|
||||
|
||||
if ( false !== strpos( $processor->get_attribute( 'class' ), $inner_block_wrapper_classes ) ) {
|
||||
$class_attribute = $processor->get_attribute( 'class' );
|
||||
if ( is_string( $class_attribute ) && str_contains( $class_attribute, $inner_block_wrapper_classes ) ) {
|
||||
break;
|
||||
}
|
||||
} while ( $processor->next_tag() );
|
||||
@@ -883,17 +887,45 @@ function wp_restore_group_inner_container( $block_content, $block ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$replace_regex = sprintf(
|
||||
/*
|
||||
* This filter runs after the layout classnames have been added to the block, so they
|
||||
* have to be removed from the outer wrapper and then added to the inner.
|
||||
*/
|
||||
$layout_classes = array();
|
||||
$processor = new WP_HTML_Tag_Processor( $block_content );
|
||||
|
||||
if ( $processor->next_tag( array( 'class_name' => 'wp-block-group' ) ) ) {
|
||||
foreach ( $processor->class_list() as $class_name ) {
|
||||
if ( str_contains( $class_name, 'is-layout-' ) ) {
|
||||
$layout_classes[] = $class_name;
|
||||
$processor->remove_class( $class_name );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$content_without_layout_classes = $processor->get_updated_html();
|
||||
$replace_regex = sprintf(
|
||||
'/(^\s*<%1$s\b[^>]*wp-block-group[^>]*>)(.*)(<\/%1$s>\s*$)/ms',
|
||||
preg_quote( $tag_name, '/' )
|
||||
);
|
||||
$updated_content = preg_replace_callback(
|
||||
$updated_content = preg_replace_callback(
|
||||
$replace_regex,
|
||||
static function ( $matches ) {
|
||||
return $matches[1] . '<div class="wp-block-group__inner-container">' . $matches[2] . '</div>' . $matches[3];
|
||||
},
|
||||
$block_content
|
||||
$content_without_layout_classes
|
||||
);
|
||||
|
||||
// Add layout classes to inner wrapper.
|
||||
if ( ! empty( $layout_classes ) ) {
|
||||
$processor = new WP_HTML_Tag_Processor( $updated_content );
|
||||
if ( $processor->next_tag( array( 'class_name' => 'wp-block-group__inner-container' ) ) ) {
|
||||
foreach ( $layout_classes as $class_name ) {
|
||||
$processor->add_class( $class_name );
|
||||
}
|
||||
}
|
||||
$updated_content = $processor->get_updated_html();
|
||||
}
|
||||
return $updated_content;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,9 +58,8 @@ function wp_apply_shadow_support( $block_type, $block_attributes ) {
|
||||
|
||||
$shadow_block_styles = array();
|
||||
|
||||
$preset_shadow = array_key_exists( 'shadow', $block_attributes ) ? "var:preset|shadow|{$block_attributes['shadow']}" : null;
|
||||
$custom_shadow = isset( $block_attributes['style']['shadow'] ) ? $block_attributes['style']['shadow'] : null;
|
||||
$shadow_block_styles['shadow'] = $preset_shadow ? $preset_shadow : $custom_shadow;
|
||||
$custom_shadow = $block_attributes['style']['shadow'] ?? null;
|
||||
$shadow_block_styles['shadow'] = $custom_shadow;
|
||||
|
||||
$attributes = array();
|
||||
$styles = wp_style_engine_get_styles( $shadow_block_styles );
|
||||
|
||||
@@ -398,6 +398,7 @@ function wp_get_typography_value_and_unit( $raw_value, $options = array() ) {
|
||||
*
|
||||
* @since 6.1.0
|
||||
* @since 6.3.0 Checks for unsupported min/max viewport values that cause invalid clamp values.
|
||||
* @since 6.5.0 Returns early when min and max viewport subtraction is zero to avoid division by zero.
|
||||
* @access private
|
||||
*
|
||||
* @param array $args {
|
||||
@@ -468,12 +469,18 @@ function wp_get_computed_fluid_typography_value( $args = array() ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Calculates the linear factor denominator. If it's 0, we cannot calculate a fluid value.
|
||||
$linear_factor_denominator = $maximum_viewport_width['value'] - $minimum_viewport_width['value'];
|
||||
if ( empty( $linear_factor_denominator ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Build CSS rule.
|
||||
* Borrowed from https://websemantics.uk/tools/responsive-font-calculator/.
|
||||
*/
|
||||
$view_port_width_offset = round( $minimum_viewport_width['value'] / 100, 3 ) . $font_size_unit;
|
||||
$linear_factor = 100 * ( ( $maximum_font_size['value'] - $minimum_font_size['value'] ) / ( $maximum_viewport_width['value'] - $minimum_viewport_width['value'] ) );
|
||||
$linear_factor = 100 * ( ( $maximum_font_size['value'] - $minimum_font_size['value'] ) / ( $linear_factor_denominator ) );
|
||||
$linear_factor_scaled = round( $linear_factor * $scale_factor, 3 );
|
||||
$linear_factor_scaled = empty( $linear_factor_scaled ) ? 1 : $linear_factor_scaled;
|
||||
$fluid_target_font_size = implode( '', $minimum_font_size_rem ) . " + ((1vw - $view_port_width_offset) * $linear_factor_scaled)";
|
||||
|
||||
@@ -125,11 +125,11 @@ function get_default_block_template_types() {
|
||||
),
|
||||
'single' => array(
|
||||
'title' => _x( 'Single Posts', 'Template name' ),
|
||||
'description' => __( 'Displays single posts on your website unless a custom template has been applied to that post or a dedicated template exists.' ),
|
||||
'description' => __( 'Displays a single post on your website unless a custom template has been applied to that post or a dedicated template exists.' ),
|
||||
),
|
||||
'page' => array(
|
||||
'title' => _x( 'Pages', 'Template name' ),
|
||||
'description' => __( 'Display all static pages unless a custom template has been applied or a dedicated template exists.' ),
|
||||
'description' => __( 'Displays a static page unless a custom template has been applied to that page or a dedicated template exists.' ),
|
||||
),
|
||||
'archive' => array(
|
||||
'title' => _x( 'All Archives', 'Template name' ),
|
||||
@@ -174,7 +174,7 @@ function get_default_block_template_types() {
|
||||
);
|
||||
|
||||
/**
|
||||
* Filters the list of template types.
|
||||
* Filters the list of default template types.
|
||||
*
|
||||
* @since 5.9.0
|
||||
*
|
||||
@@ -224,14 +224,21 @@ function _filter_block_template_part_area( $type ) {
|
||||
* @return string[] A list of paths to all template part files.
|
||||
*/
|
||||
function _get_block_templates_paths( $base_directory ) {
|
||||
static $template_path_list = array();
|
||||
if ( isset( $template_path_list[ $base_directory ] ) ) {
|
||||
return $template_path_list[ $base_directory ];
|
||||
}
|
||||
$path_list = array();
|
||||
if ( file_exists( $base_directory ) ) {
|
||||
try {
|
||||
$nested_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $base_directory ) );
|
||||
$nested_html_files = new RegexIterator( $nested_files, '/^.+\.html$/i', RecursiveRegexIterator::GET_MATCH );
|
||||
foreach ( $nested_html_files as $path => $file ) {
|
||||
$path_list[] = $path;
|
||||
}
|
||||
} catch ( Exception $e ) {
|
||||
// Do nothing.
|
||||
}
|
||||
$template_path_list[ $base_directory ] = $path_list;
|
||||
return $path_list;
|
||||
}
|
||||
|
||||
@@ -241,10 +248,10 @@ function _get_block_templates_paths( $base_directory ) {
|
||||
* @since 5.9.0
|
||||
* @access private
|
||||
*
|
||||
* @param string $template_type 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
* @param string $slug Template slug.
|
||||
* @return array|null {
|
||||
* Array with template metadata if $template_type is one of 'wp_template' or 'wp_template_part'.
|
||||
* Array with template metadata if $template_type is one of 'wp_template' or 'wp_template_part',
|
||||
* null otherwise.
|
||||
*
|
||||
* @type string $slug Template slug.
|
||||
@@ -298,7 +305,7 @@ function _get_block_template_file( $template_type, $slug ) {
|
||||
* @since 6.3.0 Added the `$query` parameter.
|
||||
* @access private
|
||||
*
|
||||
* @param string $template_type 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
* @param array $query {
|
||||
* Arguments to retrieve templates. Optional, empty by default.
|
||||
*
|
||||
@@ -513,7 +520,7 @@ function _remove_theme_attribute_from_template_part_block( &$block ) {
|
||||
* @access private
|
||||
*
|
||||
* @param array $template_file Theme file.
|
||||
* @param string $template_type 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
* @return WP_Block_Template Template.
|
||||
*/
|
||||
function _build_block_template_result_from_file( $template_file, $template_type ) {
|
||||
@@ -894,6 +901,14 @@ function _build_block_template_result_from_post( $post ) {
|
||||
}
|
||||
}
|
||||
|
||||
$hooked_blocks = get_hooked_blocks();
|
||||
if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
|
||||
$before_block_visitor = make_before_block_visitor( $hooked_blocks, $template );
|
||||
$after_block_visitor = make_after_block_visitor( $hooked_blocks, $template );
|
||||
$blocks = parse_blocks( $template->content );
|
||||
$template->content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
|
||||
}
|
||||
|
||||
return $template;
|
||||
}
|
||||
|
||||
@@ -910,7 +925,7 @@ function _build_block_template_result_from_post( $post ) {
|
||||
* @type string $area A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
|
||||
* @type string $post_type Post type to get the templates for.
|
||||
* }
|
||||
* @param string $template_type 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
* @return WP_Block_Template[] Array of block templates.
|
||||
*/
|
||||
function get_block_templates( $query = array(), $template_type = 'wp_template' ) {
|
||||
@@ -931,7 +946,7 @@ function get_block_templates( $query = array(), $template_type = 'wp_template' )
|
||||
* @type string $area A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
|
||||
* @type string $post_type Post type to get the templates for.
|
||||
* }
|
||||
* @param string $template_type 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
*/
|
||||
$templates = apply_filters( 'pre_get_block_templates', null, $query, $template_type );
|
||||
if ( ! is_null( $templates ) ) {
|
||||
@@ -1036,7 +1051,7 @@ function get_block_templates( $query = array(), $template_type = 'wp_template' )
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param string $id Template unique identifier (example: 'theme_slug//template_slug').
|
||||
* @param string $template_type Optional. Template type: 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Optional. Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
* Default 'wp_template'.
|
||||
* @return WP_Block_Template|null Template.
|
||||
*/
|
||||
@@ -1051,7 +1066,7 @@ function get_block_template( $id, $template_type = 'wp_template' ) {
|
||||
* @param WP_Block_Template|null $block_template Return block template object to short-circuit the default query,
|
||||
* or null to allow WP to run its normal queries.
|
||||
* @param string $id Template unique identifier (example: 'theme_slug//template_slug').
|
||||
* @param string $template_type Template type: 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
*/
|
||||
$block_template = apply_filters( 'pre_get_block_template', null, $id, $template_type );
|
||||
if ( ! is_null( $block_template ) ) {
|
||||
@@ -1097,7 +1112,7 @@ function get_block_template( $id, $template_type = 'wp_template' ) {
|
||||
*
|
||||
* @param WP_Block_Template|null $block_template The found block template, or null if there isn't one.
|
||||
* @param string $id Template unique identifier (example: 'theme_slug//template_slug').
|
||||
* @param array $template_type Template type: 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
*/
|
||||
return apply_filters( 'get_block_template', $block_template, $id, $template_type );
|
||||
}
|
||||
@@ -1110,7 +1125,7 @@ function get_block_template( $id, $template_type = 'wp_template' ) {
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $id Template unique identifier (example: 'theme_slug//template_slug').
|
||||
* @param string $template_type Optional. Template type: 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Optional. Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
* Default 'wp_template'.
|
||||
* @return WP_Block_Template|null The found block template, or null if there isn't one.
|
||||
*/
|
||||
@@ -1125,7 +1140,7 @@ function get_block_file_template( $id, $template_type = 'wp_template' ) {
|
||||
* @param WP_Block_Template|null $block_template Return block template object to short-circuit the default query,
|
||||
* or null to allow WP to run its normal queries.
|
||||
* @param string $id Template unique identifier (example: 'theme_slug//template_slug').
|
||||
* @param string $template_type Template type: 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
*/
|
||||
$block_template = apply_filters( 'pre_get_block_file_template', null, $id, $template_type );
|
||||
if ( ! is_null( $block_template ) ) {
|
||||
@@ -1159,7 +1174,7 @@ function get_block_file_template( $id, $template_type = 'wp_template' ) {
|
||||
*
|
||||
* @param WP_Block_Template|null $block_template The found block template, or null if there is none.
|
||||
* @param string $id Template unique identifier (example: 'theme_slug//template_slug').
|
||||
* @param string $template_type Template type: 'wp_template' or 'wp_template_part'.
|
||||
* @param string $template_type Template type. Either 'wp_template' or 'wp_template_part'.
|
||||
*/
|
||||
return apply_filters( 'get_block_file_template', $block_template, $id, $template_type );
|
||||
}
|
||||
@@ -1169,7 +1184,7 @@ function get_block_file_template( $id, $template_type = 'wp_template' ) {
|
||||
*
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $part The block template part to print. Use "header" or "footer".
|
||||
* @param string $part The block template part to print. Either 'header' or 'footer'.
|
||||
*/
|
||||
function block_template_part( $part ) {
|
||||
$template_part = get_block_template( get_stylesheet() . '//' . $part, 'wp_template_part' );
|
||||
@@ -1203,7 +1218,7 @@ function block_footer_area() {
|
||||
* @since 6.0.0
|
||||
*
|
||||
* @param string $path The path of the file in the theme.
|
||||
* @return Bool Whether this file is in an ignored directory.
|
||||
* @return bool Whether this file is in an ignored directory.
|
||||
*/
|
||||
function wp_is_theme_directory_ignored( $path ) {
|
||||
$directories_to_ignore = array( '.DS_Store', '.svn', '.git', '.hg', '.bzr', 'node_modules', 'vendor' );
|
||||
@@ -1332,8 +1347,8 @@ function wp_generate_block_templates_export_file() {
|
||||
*
|
||||
* @since 6.1.0
|
||||
*
|
||||
* @param string $slug The template slug to be created.
|
||||
* @param boolean $is_custom Optional. Indicates if a template is custom or
|
||||
* @param string $slug The template slug to be created.
|
||||
* @param bool $is_custom Optional. Indicates if a template is custom or
|
||||
* part of the template hierarchy. Default false.
|
||||
* @param string $template_prefix Optional. The template prefix for the created template.
|
||||
* Used to extract the main template type, e.g.
|
||||
@@ -1417,3 +1432,48 @@ function get_template_hierarchy( $slug, $is_custom = false, $template_prefix = '
|
||||
$template_hierarchy[] = 'index';
|
||||
return $template_hierarchy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inject ignoredHookedBlocks metadata attributes into a template or template part.
|
||||
*
|
||||
* Given an object that represents a `wp_template` or `wp_template_part` post object
|
||||
* prepared for inserting or updating the database, locate all blocks that have
|
||||
* hooked blocks, and inject a `metadata.ignoredHookedBlocks` attribute into the anchor
|
||||
* blocks to reflect the latter.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*
|
||||
* @param stdClass $post An object representing a template or template part
|
||||
* prepared for inserting or updating the database.
|
||||
* @param WP_REST_Request $request Request object.
|
||||
* @return stdClass The updated object representing a template or template part.
|
||||
*/
|
||||
function inject_ignored_hooked_blocks_metadata_attributes( $post, $request ) {
|
||||
$filter_name = current_filter();
|
||||
if ( ! str_starts_with( $filter_name, 'rest_pre_insert_' ) ) {
|
||||
return $post;
|
||||
}
|
||||
$post_type = str_replace( 'rest_pre_insert_', '', $filter_name );
|
||||
|
||||
$hooked_blocks = get_hooked_blocks();
|
||||
if ( empty( $hooked_blocks ) && ! has_filter( 'hooked_block_types' ) ) {
|
||||
return $post;
|
||||
}
|
||||
|
||||
// At this point, the post has already been created.
|
||||
// We need to build the corresponding `WP_Block_Template` object as context argument for the visitor.
|
||||
// To that end, we need to suppress hooked blocks from getting inserted into the template.
|
||||
add_filter( 'hooked_block_types', '__return_empty_array', 99999, 0 );
|
||||
$template = $request['id'] ? get_block_template( $request['id'], $post_type ) : null;
|
||||
remove_filter( 'hooked_block_types', '__return_empty_array', 99999 );
|
||||
|
||||
$before_block_visitor = make_before_block_visitor( $hooked_blocks, $template, 'set_ignored_hooked_blocks_metadata' );
|
||||
$after_block_visitor = make_after_block_visitor( $hooked_blocks, $template, 'set_ignored_hooked_blocks_metadata' );
|
||||
|
||||
$blocks = parse_blocks( $post->post_content );
|
||||
$content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
|
||||
|
||||
$post->post_content = $content;
|
||||
return $post;
|
||||
}
|
||||
|
||||
+380
-157
@@ -36,6 +36,7 @@ function remove_block_asset_path_prefix( $asset_handle_or_path ) {
|
||||
*
|
||||
* @since 5.5.0
|
||||
* @since 6.1.0 Added `$index` parameter.
|
||||
* @since 6.5.0 Added support for `viewScriptModule` field.
|
||||
*
|
||||
* @param string $block_name Name of the block.
|
||||
* @param string $field_name Name of the metadata field.
|
||||
@@ -52,6 +53,9 @@ function generate_block_asset_handle( $block_name, $field_name, $index = 0 ) {
|
||||
if ( str_starts_with( $field_name, 'view' ) ) {
|
||||
$asset_handle .= '-view';
|
||||
}
|
||||
if ( str_ends_with( strtolower( $field_name ), 'scriptmodule' ) ) {
|
||||
$asset_handle .= '-script-module';
|
||||
}
|
||||
if ( $index > 0 ) {
|
||||
$asset_handle .= '-' . ( $index + 1 );
|
||||
}
|
||||
@@ -59,11 +63,13 @@ function generate_block_asset_handle( $block_name, $field_name, $index = 0 ) {
|
||||
}
|
||||
|
||||
$field_mappings = array(
|
||||
'editorScript' => 'editor-script',
|
||||
'script' => 'script',
|
||||
'viewScript' => 'view-script',
|
||||
'editorStyle' => 'editor-style',
|
||||
'style' => 'style',
|
||||
'editorScript' => 'editor-script',
|
||||
'editorStyle' => 'editor-style',
|
||||
'script' => 'script',
|
||||
'style' => 'style',
|
||||
'viewScript' => 'view-script',
|
||||
'viewScriptModule' => 'view-script-module',
|
||||
'viewStyle' => 'view-style',
|
||||
);
|
||||
$asset_handle = str_replace( '/', '-', $block_name ) .
|
||||
'-' . $field_mappings[ $field_name ];
|
||||
@@ -100,7 +106,7 @@ function get_block_asset_url( $path ) {
|
||||
|
||||
$template = get_template();
|
||||
if ( ! isset( $template_paths_norm[ $template ] ) ) {
|
||||
$template_paths_norm[ $template ] = wp_normalize_path( get_template_directory() );
|
||||
$template_paths_norm[ $template ] = wp_normalize_path( realpath( get_template_directory() ) );
|
||||
}
|
||||
|
||||
if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $template ] ) ) ) {
|
||||
@@ -110,7 +116,7 @@ function get_block_asset_url( $path ) {
|
||||
if ( is_child_theme() ) {
|
||||
$stylesheet = get_stylesheet();
|
||||
if ( ! isset( $template_paths_norm[ $stylesheet ] ) ) {
|
||||
$template_paths_norm[ $stylesheet ] = wp_normalize_path( get_stylesheet_directory() );
|
||||
$template_paths_norm[ $stylesheet ] = wp_normalize_path( realpath( get_stylesheet_directory() ) );
|
||||
}
|
||||
|
||||
if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $stylesheet ] ) ) ) {
|
||||
@@ -121,14 +127,73 @@ function get_block_asset_url( $path ) {
|
||||
return plugins_url( basename( $path ), $path );
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a script module ID for the selected block metadata field. It detects
|
||||
* when a path to file was provided and optionally finds a corresponding asset
|
||||
* file with details necessary to register the script module under with an
|
||||
* automatically generated module ID. It returns unprocessed script module
|
||||
* ID otherwise.
|
||||
*
|
||||
* @since 6.5.0
|
||||
*
|
||||
* @param array $metadata Block metadata.
|
||||
* @param string $field_name Field name to pick from metadata.
|
||||
* @param int $index Optional. Index of the script module ID to register when multiple
|
||||
* items passed. Default 0.
|
||||
* @return string|false Script module ID or false on failure.
|
||||
*/
|
||||
function register_block_script_module_id( $metadata, $field_name, $index = 0 ) {
|
||||
if ( empty( $metadata[ $field_name ] ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$module_id = $metadata[ $field_name ];
|
||||
if ( is_array( $module_id ) ) {
|
||||
if ( empty( $module_id[ $index ] ) ) {
|
||||
return false;
|
||||
}
|
||||
$module_id = $module_id[ $index ];
|
||||
}
|
||||
|
||||
$module_path = remove_block_asset_path_prefix( $module_id );
|
||||
if ( $module_id === $module_path ) {
|
||||
return $module_id;
|
||||
}
|
||||
|
||||
$path = dirname( $metadata['file'] );
|
||||
$module_asset_raw_path = $path . '/' . substr_replace( $module_path, '.asset.php', - strlen( '.js' ) );
|
||||
$module_id = generate_block_asset_handle( $metadata['name'], $field_name, $index );
|
||||
$module_asset_path = wp_normalize_path(
|
||||
realpath( $module_asset_raw_path )
|
||||
);
|
||||
|
||||
$module_path_norm = wp_normalize_path( realpath( $path . '/' . $module_path ) );
|
||||
$module_uri = get_block_asset_url( $module_path_norm );
|
||||
|
||||
$module_asset = ! empty( $module_asset_path ) ? require $module_asset_path : array();
|
||||
$module_dependencies = isset( $module_asset['dependencies'] ) ? $module_asset['dependencies'] : array();
|
||||
$block_version = isset( $metadata['version'] ) ? $metadata['version'] : false;
|
||||
$module_version = isset( $module_asset['version'] ) ? $module_asset['version'] : $block_version;
|
||||
|
||||
wp_register_script_module(
|
||||
$module_id,
|
||||
$module_uri,
|
||||
$module_dependencies,
|
||||
$module_version
|
||||
);
|
||||
|
||||
return $module_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a script handle for the selected block metadata field. It detects
|
||||
* when a path to file was provided and finds a corresponding asset file
|
||||
* with details necessary to register the script under automatically
|
||||
* when a path to file was provided and optionally finds a corresponding asset
|
||||
* file with details necessary to register the script under automatically
|
||||
* generated handle name. It returns unprocessed script handle otherwise.
|
||||
*
|
||||
* @since 5.5.0
|
||||
* @since 6.1.0 Added `$index` parameter.
|
||||
* @since 6.5.0 The asset file is optional. Added script handle support in the asset file.
|
||||
*
|
||||
* @param array $metadata Block metadata.
|
||||
* @param string $field_name Field name to pick from metadata.
|
||||
@@ -142,56 +207,49 @@ function register_block_script_handle( $metadata, $field_name, $index = 0 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$script_handle = $metadata[ $field_name ];
|
||||
if ( is_array( $script_handle ) ) {
|
||||
if ( empty( $script_handle[ $index ] ) ) {
|
||||
$script_handle_or_path = $metadata[ $field_name ];
|
||||
if ( is_array( $script_handle_or_path ) ) {
|
||||
if ( empty( $script_handle_or_path[ $index ] ) ) {
|
||||
return false;
|
||||
}
|
||||
$script_handle = $script_handle[ $index ];
|
||||
$script_handle_or_path = $script_handle_or_path[ $index ];
|
||||
}
|
||||
|
||||
$script_path = remove_block_asset_path_prefix( $script_handle );
|
||||
if ( $script_handle === $script_path ) {
|
||||
return $script_handle;
|
||||
$script_path = remove_block_asset_path_prefix( $script_handle_or_path );
|
||||
if ( $script_handle_or_path === $script_path ) {
|
||||
return $script_handle_or_path;
|
||||
}
|
||||
|
||||
$path = dirname( $metadata['file'] );
|
||||
$script_asset_raw_path = $path . '/' . substr_replace( $script_path, '.asset.php', - strlen( '.js' ) );
|
||||
$script_handle = generate_block_asset_handle( $metadata['name'], $field_name, $index );
|
||||
$script_asset_path = wp_normalize_path(
|
||||
realpath( $script_asset_raw_path )
|
||||
);
|
||||
|
||||
if ( empty( $script_asset_path ) ) {
|
||||
_doing_it_wrong(
|
||||
__FUNCTION__,
|
||||
sprintf(
|
||||
/* translators: 1: Asset file location, 2: Field name, 3: Block name. */
|
||||
__( 'The asset file (%1$s) for the "%2$s" defined in "%3$s" block definition is missing.' ),
|
||||
$script_asset_raw_path,
|
||||
$field_name,
|
||||
$metadata['name']
|
||||
),
|
||||
'5.5.0'
|
||||
);
|
||||
return false;
|
||||
// Asset file for blocks is optional. See https://core.trac.wordpress.org/ticket/60460.
|
||||
$script_asset = ! empty( $script_asset_path ) ? require $script_asset_path : array();
|
||||
$script_handle = isset( $script_asset['handle'] ) ?
|
||||
$script_asset['handle'] :
|
||||
generate_block_asset_handle( $metadata['name'], $field_name, $index );
|
||||
if ( wp_script_is( $script_handle, 'registered' ) ) {
|
||||
return $script_handle;
|
||||
}
|
||||
|
||||
$script_path_norm = wp_normalize_path( realpath( $path . '/' . $script_path ) );
|
||||
$script_uri = get_block_asset_url( $script_path_norm );
|
||||
|
||||
$script_args = array();
|
||||
$script_path_norm = wp_normalize_path( realpath( $path . '/' . $script_path ) );
|
||||
$script_uri = get_block_asset_url( $script_path_norm );
|
||||
$script_dependencies = isset( $script_asset['dependencies'] ) ? $script_asset['dependencies'] : array();
|
||||
$block_version = isset( $metadata['version'] ) ? $metadata['version'] : false;
|
||||
$script_version = isset( $script_asset['version'] ) ? $script_asset['version'] : $block_version;
|
||||
$script_args = array();
|
||||
if ( 'viewScript' === $field_name && $script_uri ) {
|
||||
$script_args['strategy'] = 'defer';
|
||||
}
|
||||
|
||||
$script_asset = require $script_asset_path;
|
||||
$script_dependencies = isset( $script_asset['dependencies'] ) ? $script_asset['dependencies'] : array();
|
||||
$result = wp_register_script(
|
||||
$result = wp_register_script(
|
||||
$script_handle,
|
||||
$script_uri,
|
||||
$script_dependencies,
|
||||
isset( $script_asset['version'] ) ? $script_asset['version'] : false,
|
||||
$script_version,
|
||||
$script_args
|
||||
);
|
||||
if ( ! $result ) {
|
||||
@@ -326,6 +384,7 @@ function get_block_metadata_i18n_schema() {
|
||||
* @since 6.1.0 Added support for `render` field.
|
||||
* @since 6.3.0 Added `selectors` field.
|
||||
* @since 6.4.0 Added support for `blockHooks` field.
|
||||
* @since 6.5.0 Added support for `allowedBlocks`, `viewScriptModule`, and `viewStyle` fields.
|
||||
*
|
||||
* @param string $file_or_folder Path to the JSON file with metadata definition for
|
||||
* the block or path to the folder where the `block.json` file is located.
|
||||
@@ -352,13 +411,14 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
$file_or_folder;
|
||||
|
||||
$is_core_block = str_starts_with( $file_or_folder, ABSPATH . WPINC );
|
||||
|
||||
if ( ! $is_core_block && ! file_exists( $metadata_file ) ) {
|
||||
// If the block is not a core block, the metadata file must exist.
|
||||
$metadata_file_exists = $is_core_block || file_exists( $metadata_file );
|
||||
if ( ! $metadata_file_exists && empty( $args['name'] ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Try to get metadata from the static cache for core blocks.
|
||||
$metadata = false;
|
||||
$metadata = array();
|
||||
if ( $is_core_block ) {
|
||||
$core_block_name = str_replace( ABSPATH . WPINC . '/blocks/', '', $file_or_folder );
|
||||
if ( ! empty( $core_blocks_meta[ $core_block_name ] ) ) {
|
||||
@@ -367,14 +427,15 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
}
|
||||
|
||||
// If metadata is not found in the static cache, read it from the file.
|
||||
if ( ! $metadata ) {
|
||||
if ( $metadata_file_exists && empty( $metadata ) ) {
|
||||
$metadata = wp_json_file_decode( $metadata_file, array( 'associative' => true ) );
|
||||
}
|
||||
|
||||
if ( ! is_array( $metadata ) || empty( $metadata['name'] ) ) {
|
||||
if ( ! is_array( $metadata ) || ( empty( $metadata['name'] ) && empty( $args['name'] ) ) ) {
|
||||
return false;
|
||||
}
|
||||
$metadata['file'] = wp_normalize_path( realpath( $metadata_file ) );
|
||||
|
||||
$metadata['file'] = $metadata_file_exists ? wp_normalize_path( realpath( $metadata_file ) ) : null;
|
||||
|
||||
/**
|
||||
* Filters the metadata provided for registering a block type.
|
||||
@@ -404,6 +465,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
$settings = array();
|
||||
$property_mappings = array(
|
||||
'apiVersion' => 'api_version',
|
||||
'name' => 'name',
|
||||
'title' => 'title',
|
||||
'category' => 'category',
|
||||
'parent' => 'parent',
|
||||
@@ -419,6 +481,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
'styles' => 'styles',
|
||||
'variations' => 'variations',
|
||||
'example' => 'example',
|
||||
'allowedBlocks' => 'allowed_blocks',
|
||||
);
|
||||
$textdomain = ! empty( $metadata['textdomain'] ) ? $metadata['textdomain'] : null;
|
||||
$i18n_schema = get_block_metadata_i18n_schema();
|
||||
@@ -426,18 +489,50 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
foreach ( $property_mappings as $key => $mapped_key ) {
|
||||
if ( isset( $metadata[ $key ] ) ) {
|
||||
$settings[ $mapped_key ] = $metadata[ $key ];
|
||||
if ( $textdomain && isset( $i18n_schema->$key ) ) {
|
||||
if ( $metadata_file_exists && $textdomain && isset( $i18n_schema->$key ) ) {
|
||||
$settings[ $mapped_key ] = translate_settings_using_i18n_schema( $i18n_schema->$key, $settings[ $key ], $textdomain );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! empty( $metadata['render'] ) ) {
|
||||
$template_path = wp_normalize_path(
|
||||
realpath(
|
||||
dirname( $metadata['file'] ) . '/' .
|
||||
remove_block_asset_path_prefix( $metadata['render'] )
|
||||
)
|
||||
);
|
||||
if ( $template_path ) {
|
||||
/**
|
||||
* Renders the block on the server.
|
||||
*
|
||||
* @since 6.1.0
|
||||
*
|
||||
* @param array $attributes Block attributes.
|
||||
* @param string $content Block default content.
|
||||
* @param WP_Block $block Block instance.
|
||||
*
|
||||
* @return string Returns the block content.
|
||||
*/
|
||||
$settings['render_callback'] = static function ( $attributes, $content, $block ) use ( $template_path ) {
|
||||
ob_start();
|
||||
require $template_path;
|
||||
return ob_get_clean();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
$settings = array_merge( $settings, $args );
|
||||
|
||||
$script_fields = array(
|
||||
'editorScript' => 'editor_script_handles',
|
||||
'script' => 'script_handles',
|
||||
'viewScript' => 'view_script_handles',
|
||||
);
|
||||
foreach ( $script_fields as $metadata_field_name => $settings_field_name ) {
|
||||
if ( ! empty( $settings[ $metadata_field_name ] ) ) {
|
||||
$metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ];
|
||||
}
|
||||
if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
|
||||
$scripts = $metadata[ $metadata_field_name ];
|
||||
$processed_scripts = array();
|
||||
@@ -465,11 +560,49 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
}
|
||||
}
|
||||
|
||||
$module_fields = array(
|
||||
'viewScriptModule' => 'view_script_module_ids',
|
||||
);
|
||||
foreach ( $module_fields as $metadata_field_name => $settings_field_name ) {
|
||||
if ( ! empty( $settings[ $metadata_field_name ] ) ) {
|
||||
$metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ];
|
||||
}
|
||||
if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
|
||||
$modules = $metadata[ $metadata_field_name ];
|
||||
$processed_modules = array();
|
||||
if ( is_array( $modules ) ) {
|
||||
for ( $index = 0; $index < count( $modules ); $index++ ) {
|
||||
$result = register_block_script_module_id(
|
||||
$metadata,
|
||||
$metadata_field_name,
|
||||
$index
|
||||
);
|
||||
if ( $result ) {
|
||||
$processed_modules[] = $result;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$result = register_block_script_module_id(
|
||||
$metadata,
|
||||
$metadata_field_name
|
||||
);
|
||||
if ( $result ) {
|
||||
$processed_modules[] = $result;
|
||||
}
|
||||
}
|
||||
$settings[ $settings_field_name ] = $processed_modules;
|
||||
}
|
||||
}
|
||||
|
||||
$style_fields = array(
|
||||
'editorStyle' => 'editor_style_handles',
|
||||
'style' => 'style_handles',
|
||||
'viewStyle' => 'view_style_handles',
|
||||
);
|
||||
foreach ( $style_fields as $metadata_field_name => $settings_field_name ) {
|
||||
if ( ! empty( $settings[ $metadata_field_name ] ) ) {
|
||||
$metadata[ $metadata_field_name ] = $settings[ $metadata_field_name ];
|
||||
}
|
||||
if ( ! empty( $metadata[ $metadata_field_name ] ) ) {
|
||||
$styles = $metadata[ $metadata_field_name ];
|
||||
$processed_styles = array();
|
||||
@@ -530,33 +663,6 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! empty( $metadata['render'] ) ) {
|
||||
$template_path = wp_normalize_path(
|
||||
realpath(
|
||||
dirname( $metadata['file'] ) . '/' .
|
||||
remove_block_asset_path_prefix( $metadata['render'] )
|
||||
)
|
||||
);
|
||||
if ( $template_path ) {
|
||||
/**
|
||||
* Renders the block on the server.
|
||||
*
|
||||
* @since 6.1.0
|
||||
*
|
||||
* @param array $attributes Block attributes.
|
||||
* @param string $content Block default content.
|
||||
* @param WP_Block $block Block instance.
|
||||
*
|
||||
* @return string Returns the block content.
|
||||
*/
|
||||
$settings['render_callback'] = static function ( $attributes, $content, $block ) use ( $template_path ) {
|
||||
ob_start();
|
||||
require $template_path;
|
||||
return ob_get_clean();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the settings determined from the block type metadata.
|
||||
*
|
||||
@@ -565,14 +671,9 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
* @param array $settings Array of determined settings for registering a block type.
|
||||
* @param array $metadata Metadata provided for registering a block type.
|
||||
*/
|
||||
$settings = apply_filters(
|
||||
'block_type_metadata_settings',
|
||||
array_merge(
|
||||
$settings,
|
||||
$args
|
||||
),
|
||||
$metadata
|
||||
);
|
||||
$settings = apply_filters( 'block_type_metadata_settings', $settings, $metadata );
|
||||
|
||||
$metadata['name'] = ! empty( $settings['name'] ) ? $settings['name'] : $metadata['name'];
|
||||
|
||||
return WP_Block_Type_Registry::get_instance()->register(
|
||||
$metadata['name'],
|
||||
@@ -751,6 +852,156 @@ function get_hooked_blocks() {
|
||||
return $hooked_blocks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the markup for blocks hooked to the given anchor block in a specific relative position.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*
|
||||
* @param array $parsed_anchor_block The anchor block, in parsed block array format.
|
||||
* @param string $relative_position The relative position of the hooked blocks.
|
||||
* Can be one of 'before', 'after', 'first_child', or 'last_child'.
|
||||
* @param array $hooked_blocks An array of hooked block types, grouped by anchor block and relative position.
|
||||
* @param WP_Block_Template|array $context The block template, template part, or pattern that the anchor block belongs to.
|
||||
* @return string
|
||||
*/
|
||||
function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooked_blocks, $context ) {
|
||||
$anchor_block_type = $parsed_anchor_block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/**
|
||||
* Filters the list of hooked block types for a given anchor block type and relative position.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @param string[] $hooked_block_types The list of hooked block types.
|
||||
* @param string $relative_position The relative position of the hooked blocks.
|
||||
* Can be one of 'before', 'after', 'first_child', or 'last_child'.
|
||||
* @param string $anchor_block_type The anchor block type.
|
||||
* @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type,
|
||||
* or pattern that the anchor block belongs to.
|
||||
*/
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
|
||||
$markup = '';
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$parsed_hooked_block = array(
|
||||
'blockName' => $hooked_block_type,
|
||||
'attrs' => array(),
|
||||
'innerBlocks' => array(),
|
||||
'innerContent' => array(),
|
||||
);
|
||||
|
||||
/**
|
||||
* Filters the parsed block array for a given hooked block.
|
||||
*
|
||||
* @since 6.5.0
|
||||
*
|
||||
* @param array|null $parsed_hooked_block The parsed block array for the given hooked block type, or null to suppress the block.
|
||||
* @param string $hooked_block_type The hooked block type name.
|
||||
* @param string $relative_position The relative position of the hooked block.
|
||||
* @param array $parsed_anchor_block The anchor block, in parsed block array format.
|
||||
* @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type,
|
||||
* or pattern that the anchor block belongs to.
|
||||
*/
|
||||
$parsed_hooked_block = apply_filters( 'hooked_block', $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );
|
||||
|
||||
/**
|
||||
* Filters the parsed block array for a given hooked block.
|
||||
*
|
||||
* The dynamic portion of the hook name, `$hooked_block_type`, refers to the block type name of the specific hooked block.
|
||||
*
|
||||
* @since 6.5.0
|
||||
*
|
||||
* @param array|null $parsed_hooked_block The parsed block array for the given hooked block type, or null to suppress the block.
|
||||
* @param string $hooked_block_type The hooked block type name.
|
||||
* @param string $relative_position The relative position of the hooked block.
|
||||
* @param array $parsed_anchor_block The anchor block, in parsed block array format.
|
||||
* @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type,
|
||||
* or pattern that the anchor block belongs to.
|
||||
*/
|
||||
$parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );
|
||||
|
||||
if ( null === $parsed_hooked_block ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// It's possible that the filter returned a block of a different type, so we explicitly
|
||||
// look for the original `$hooked_block_type` in the `ignoredHookedBlocks` metadata.
|
||||
if (
|
||||
! isset( $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'] ) ||
|
||||
! in_array( $hooked_block_type, $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'], true )
|
||||
) {
|
||||
$markup .= serialize_block( $parsed_hooked_block );
|
||||
}
|
||||
}
|
||||
|
||||
return $markup;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a list of hooked block types to an anchor block's ignored hooked block types.
|
||||
*
|
||||
* This function is meant for internal use only.
|
||||
*
|
||||
* @since 6.5.0
|
||||
* @access private
|
||||
*
|
||||
* @param array $parsed_anchor_block The anchor block, in parsed block array format.
|
||||
* @param string $relative_position The relative position of the hooked blocks.
|
||||
* Can be one of 'before', 'after', 'first_child', or 'last_child'.
|
||||
* @param array $hooked_blocks An array of hooked block types, grouped by anchor block and relative position.
|
||||
* @param WP_Block_Template|array $context The block template, template part, or pattern that the anchor block belongs to.
|
||||
* @return string An empty string.
|
||||
*/
|
||||
function set_ignored_hooked_blocks_metadata( &$parsed_anchor_block, $relative_position, $hooked_blocks, $context ) {
|
||||
$anchor_block_type = $parsed_anchor_block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
if ( empty( $hooked_block_types ) ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
foreach ( $hooked_block_types as $index => $hooked_block_type ) {
|
||||
$parsed_hooked_block = array(
|
||||
'blockName' => $hooked_block_type,
|
||||
'attrs' => array(),
|
||||
'innerBlocks' => array(),
|
||||
'innerContent' => array(),
|
||||
);
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$parsed_hooked_block = apply_filters( 'hooked_block', $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context );
|
||||
|
||||
if ( null === $parsed_hooked_block ) {
|
||||
unset( $hooked_block_types[ $index ] );
|
||||
}
|
||||
}
|
||||
|
||||
$previously_ignored_hooked_blocks = isset( $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'] )
|
||||
? $parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks']
|
||||
: array();
|
||||
|
||||
$parsed_anchor_block['attrs']['metadata']['ignoredHookedBlocks'] = array_unique(
|
||||
array_merge(
|
||||
$previously_ignored_hooked_blocks,
|
||||
$hooked_block_types
|
||||
)
|
||||
);
|
||||
|
||||
// Markup for the hooked blocks has already been created (in `insert_hooked_blocks`).
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a function that injects the theme attribute into, and hooked blocks before, a given block.
|
||||
*
|
||||
@@ -761,14 +1012,19 @@ function get_hooked_blocks() {
|
||||
* This function is meant for internal use only.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @since 6.5.0 Added $callback argument.
|
||||
* @access private
|
||||
*
|
||||
* @param array $hooked_blocks An array of blocks hooked to another given block.
|
||||
* @param WP_Block_Template|array $context A block template, template part, or pattern that the blocks belong to.
|
||||
* @param array $hooked_blocks An array of blocks hooked to another given block.
|
||||
* @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object,
|
||||
* or pattern that the blocks belong to.
|
||||
* @param callable $callback A function that will be called for each block to generate
|
||||
* the markup for a given list of blocks that are hooked to it.
|
||||
* Default: 'insert_hooked_blocks'.
|
||||
* @return callable A function that returns the serialized markup for the given block,
|
||||
* including the markup for any hooked blocks before it.
|
||||
*/
|
||||
function make_before_block_visitor( $hooked_blocks, $context ) {
|
||||
function make_before_block_visitor( $hooked_blocks, $context, $callback = 'insert_hooked_blocks' ) {
|
||||
/**
|
||||
* Injects hooked blocks before the given block, injects the `theme` attribute into Template Part blocks, and returns the serialized markup.
|
||||
*
|
||||
@@ -781,47 +1037,23 @@ function make_before_block_visitor( $hooked_blocks, $context ) {
|
||||
* @param array $prev The previous sibling block of the given block. Default null.
|
||||
* @return string The serialized markup for the given block, with the markup for any hooked blocks prepended to it.
|
||||
*/
|
||||
return function ( &$block, &$parent_block = null, $prev = null ) use ( $hooked_blocks, $context ) {
|
||||
return function ( &$block, &$parent_block = null, $prev = null ) use ( $hooked_blocks, $context, $callback ) {
|
||||
_inject_theme_attribute_in_template_part_block( $block );
|
||||
|
||||
$markup = '';
|
||||
|
||||
if ( $parent_block && ! $prev ) {
|
||||
// Candidate for first-child insertion.
|
||||
$relative_position = 'first_child';
|
||||
$anchor_block_type = $parent_block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/**
|
||||
* Filters the list of hooked block types for a given anchor block type and relative position.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @param string[] $hooked_block_types The list of hooked block types.
|
||||
* @param string $relative_position The relative position of the hooked blocks.
|
||||
* Can be one of 'before', 'after', 'first_child', or 'last_child'.
|
||||
* @param string $anchor_block_type The anchor block type.
|
||||
* @param WP_Block_Template|array $context The block template, template part, or pattern that the anchor block belongs to.
|
||||
*/
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
$markup .= call_user_func_array(
|
||||
$callback,
|
||||
array( &$parent_block, 'first_child', $hooked_blocks, $context )
|
||||
);
|
||||
}
|
||||
|
||||
$relative_position = 'before';
|
||||
$anchor_block_type = $block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
$markup .= call_user_func_array(
|
||||
$callback,
|
||||
array( &$block, 'before', $hooked_blocks, $context )
|
||||
);
|
||||
|
||||
return $markup;
|
||||
};
|
||||
@@ -837,14 +1069,19 @@ function make_before_block_visitor( $hooked_blocks, $context ) {
|
||||
* This function is meant for internal use only.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @since 6.5.0 Added $callback argument.
|
||||
* @access private
|
||||
*
|
||||
* @param array $hooked_blocks An array of blocks hooked to another block.
|
||||
* @param WP_Block_Template|array $context A block template, template part, or pattern that the blocks belong to.
|
||||
* @param array $hooked_blocks An array of blocks hooked to another block.
|
||||
* @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object,
|
||||
* or pattern that the blocks belong to.
|
||||
* @param callable $callback A function that will be called for each block to generate
|
||||
* the markup for a given list of blocks that are hooked to it.
|
||||
* Default: 'insert_hooked_blocks'.
|
||||
* @return callable A function that returns the serialized markup for the given block,
|
||||
* including the markup for any hooked blocks after it.
|
||||
*/
|
||||
function make_after_block_visitor( $hooked_blocks, $context ) {
|
||||
function make_after_block_visitor( $hooked_blocks, $context, $callback = 'insert_hooked_blocks' ) {
|
||||
/**
|
||||
* Injects hooked blocks after the given block, and returns the serialized markup.
|
||||
*
|
||||
@@ -856,34 +1093,18 @@ function make_after_block_visitor( $hooked_blocks, $context ) {
|
||||
* @param array $next The next sibling block of the given block. Default null.
|
||||
* @return string The serialized markup for the given block, with the markup for any hooked blocks appended to it.
|
||||
*/
|
||||
return function ( &$block, &$parent_block = null, $next = null ) use ( $hooked_blocks, $context ) {
|
||||
$markup = '';
|
||||
|
||||
$relative_position = 'after';
|
||||
$anchor_block_type = $block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
return function ( &$block, &$parent_block = null, $next = null ) use ( $hooked_blocks, $context, $callback ) {
|
||||
$markup = call_user_func_array(
|
||||
$callback,
|
||||
array( &$block, 'after', $hooked_blocks, $context )
|
||||
);
|
||||
|
||||
if ( $parent_block && ! $next ) {
|
||||
// Candidate for last-child insertion.
|
||||
$relative_position = 'last_child';
|
||||
$anchor_block_type = $parent_block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
$markup .= call_user_func_array(
|
||||
$callback,
|
||||
array( &$parent_block, 'last_child', $hooked_blocks, $context )
|
||||
);
|
||||
}
|
||||
|
||||
return $markup;
|
||||
@@ -1201,8 +1422,8 @@ function filter_block_content( $text, $allowed_html = 'post', $allowed_protocols
|
||||
/**
|
||||
* Callback used for regular expression replacement in filter_block_content().
|
||||
*
|
||||
* @private
|
||||
* @since 6.2.1
|
||||
* @access private
|
||||
*
|
||||
* @param array $matches Array of preg_replace_callback matches.
|
||||
* @return string Replacement string.
|
||||
@@ -1576,6 +1797,7 @@ function block_version( $content ) {
|
||||
* @param array $style_properties Array containing the properties of the style name, label,
|
||||
* style_handle (name of the stylesheet to be enqueued),
|
||||
* inline_style (string containing the CSS to be added).
|
||||
* See WP_Block_Styles_Registry::register().
|
||||
* @return bool True if the block style was registered with success and false otherwise.
|
||||
*/
|
||||
function register_block_style( $block_name, $style_properties ) {
|
||||
@@ -1965,16 +2187,17 @@ function get_comments_pagination_arrow( $block, $pagination_type = 'next' ) {
|
||||
|
||||
/**
|
||||
* Strips all HTML from the content of footnotes, and sanitizes the ID.
|
||||
*
|
||||
* This function expects slashed data on the footnotes content.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
*
|
||||
* @param string $footnotes JSON encoded string of an array containing the content and ID of each footnote.
|
||||
* @return string Filtered content without any HTML on the footnote content and with the sanitized id.
|
||||
* @param string $footnotes JSON-encoded string of an array containing the content and ID of each footnote.
|
||||
* @return string Filtered content without any HTML on the footnote content and with the sanitized ID.
|
||||
*/
|
||||
function _wp_filter_post_meta_footnotes( $footnotes ) {
|
||||
$footnotes_decoded = json_decode( $footnotes, true );
|
||||
$footnotes_decoded = json_decode( $footnotes, true );
|
||||
if ( ! is_array( $footnotes_decoded ) ) {
|
||||
return '';
|
||||
}
|
||||
@@ -1991,7 +2214,7 @@ function _wp_filter_post_meta_footnotes( $footnotes ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the filters to filter footnotes meta field.
|
||||
* Adds the filters for footnotes meta field.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
@@ -2001,7 +2224,7 @@ function _wp_footnotes_kses_init_filters() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the filters that filter footnotes meta field.
|
||||
* Removes the filters for footnotes meta field.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
@@ -2011,7 +2234,7 @@ function _wp_footnotes_remove_filters() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the filter of footnotes meta field if the user does not have unfiltered_html capability.
|
||||
* Registers the filter of footnotes meta field if the user does not have `unfiltered_html` capability.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
@@ -2024,12 +2247,12 @@ function _wp_footnotes_kses_init() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes footnotes meta field filters when imported data should be filtered.
|
||||
* Initializes the filters for footnotes meta field when imported data should be filtered.
|
||||
*
|
||||
* This filter is the last being executed on force_filtered_html_on_import.
|
||||
* If the input of the filter is true it means we are in an import situation and should
|
||||
* enable kses, independently of the user capabilities.
|
||||
* So in that case we call _wp_footnotes_kses_init_filters;
|
||||
* This filter is the last one being executed on {@see 'force_filtered_html_on_import'}.
|
||||
* If the input of the filter is true, it means we are in an import situation and should
|
||||
* enable kses, independently of the user capabilities. So in that case we call
|
||||
* _wp_footnotes_kses_init_filters().
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
@@ -2038,7 +2261,7 @@ function _wp_footnotes_kses_init() {
|
||||
* @return string Input argument of the filter.
|
||||
*/
|
||||
function _wp_footnotes_force_filtered_html_on_import_filter( $arg ) {
|
||||
// force_filtered_html_on_import is true we need to init the global styles kses filters.
|
||||
// If `force_filtered_html_on_import` is true, we need to init the global styles kses filters.
|
||||
if ( $arg ) {
|
||||
_wp_footnotes_kses_init_filters();
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-archives-editor"
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
"caption": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"type": "rich-text",
|
||||
"source": "rich-text",
|
||||
"selector": "figcaption",
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
@@ -54,6 +54,9 @@
|
||||
"margin": false,
|
||||
"padding": false
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-audio-editor",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
text-align:center;
|
||||
}
|
||||
.is-dark-theme .wp-block-audio figcaption{
|
||||
color:hsla(0,0%,100%,.65);
|
||||
color:#ffffffa6;
|
||||
}
|
||||
|
||||
.wp-block-audio{
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-audio{margin:0 0 1em}
|
||||
.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:#ffffffa6}.wp-block-audio{margin:0 0 1em}
|
||||
@@ -4,7 +4,7 @@
|
||||
text-align:center;
|
||||
}
|
||||
.is-dark-theme .wp-block-audio figcaption{
|
||||
color:hsla(0,0%,100%,.65);
|
||||
color:#ffffffa6;
|
||||
}
|
||||
|
||||
.wp-block-audio{
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-audio{margin:0 0 1em}
|
||||
.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:#ffffffa6}.wp-block-audio{margin:0 0 1em}
|
||||
@@ -30,7 +30,11 @@
|
||||
"alignWide": false,
|
||||
"spacing": {
|
||||
"margin": true,
|
||||
"padding": true
|
||||
"padding": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"margin": false,
|
||||
"padding": false
|
||||
}
|
||||
},
|
||||
"__experimentalBorder": {
|
||||
"__experimentalSkipSerialization": true,
|
||||
@@ -46,6 +50,9 @@
|
||||
"text": false,
|
||||
"background": false,
|
||||
"__experimentalDuotone": "img"
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"selectors": {
|
||||
|
||||
@@ -46,8 +46,50 @@ function render_block_core_block( $attributes ) {
|
||||
$content = $wp_embed->run_shortcode( $reusable_block->post_content );
|
||||
$content = $wp_embed->autoembed( $content );
|
||||
|
||||
// Back compat.
|
||||
// For blocks that have not been migrated in the editor, add some back compat
|
||||
// so that front-end rendering continues to work.
|
||||
|
||||
// This matches the `v2` deprecation. Removes the inner `values` property
|
||||
// from every item.
|
||||
if ( isset( $attributes['content'] ) ) {
|
||||
foreach ( $attributes['content'] as &$content_data ) {
|
||||
if ( isset( $content_data['values'] ) ) {
|
||||
$is_assoc_array = is_array( $content_data['values'] ) && ! wp_is_numeric_array( $content_data['values'] );
|
||||
|
||||
if ( $is_assoc_array ) {
|
||||
$content_data = $content_data['values'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This matches the `v1` deprecation. Rename `overrides` to `content`.
|
||||
if ( isset( $attributes['overrides'] ) && ! isset( $attributes['content'] ) ) {
|
||||
$attributes['content'] = $attributes['overrides'];
|
||||
}
|
||||
|
||||
/**
|
||||
* We set the `pattern/overrides` context through the `render_block_context`
|
||||
* filter so that it is available when a pattern's inner blocks are
|
||||
* rendering via do_blocks given it only receives the inner content.
|
||||
*/
|
||||
$has_pattern_overrides = isset( $attributes['content'] );
|
||||
if ( $has_pattern_overrides ) {
|
||||
$filter_block_context = static function ( $context ) use ( $attributes ) {
|
||||
$context['pattern/overrides'] = $attributes['content'];
|
||||
return $context;
|
||||
};
|
||||
add_filter( 'render_block_context', $filter_block_context, 1 );
|
||||
}
|
||||
|
||||
$content = do_blocks( $content );
|
||||
unset( $seen_refs[ $attributes['ref'] ] );
|
||||
|
||||
if ( $has_pattern_overrides ) {
|
||||
remove_filter( 'render_block_context', $filter_block_context, 1 );
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,17 +4,24 @@
|
||||
"name": "core/block",
|
||||
"title": "Pattern",
|
||||
"category": "reusable",
|
||||
"description": "Create and save content to reuse across your site. Update the pattern, and the changes apply everywhere it’s used.",
|
||||
"description": "Reuse this design across your site.",
|
||||
"keywords": [ "reusable" ],
|
||||
"textdomain": "default",
|
||||
"attributes": {
|
||||
"ref": {
|
||||
"type": "number"
|
||||
},
|
||||
"content": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"supports": {
|
||||
"customClassName": false,
|
||||
"html": false,
|
||||
"inserter": false
|
||||
"inserter": false,
|
||||
"renaming": false,
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,8 +36,8 @@
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"type": "rich-text",
|
||||
"source": "rich-text",
|
||||
"selector": "a,button",
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
@@ -97,7 +97,9 @@
|
||||
}
|
||||
},
|
||||
"reusable": false,
|
||||
"shadow": true,
|
||||
"shadow": {
|
||||
"__experimentalSkipSerialization": true
|
||||
},
|
||||
"spacing": {
|
||||
"__experimentalSkipSerialization": true,
|
||||
"padding": [ "horizontal", "vertical" ],
|
||||
@@ -118,7 +120,10 @@
|
||||
"width": true
|
||||
}
|
||||
},
|
||||
"__experimentalSelector": ".wp-block-button .wp-block-button__link"
|
||||
"__experimentalSelector": ".wp-block-button .wp-block-button__link",
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"styles": [
|
||||
{ "name": "fill", "label": "Fill", "isDefault": true },
|
||||
|
||||
@@ -14,44 +14,13 @@
|
||||
}
|
||||
.wp-block-button:focus{
|
||||
box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color);
|
||||
outline:2px solid transparent;
|
||||
outline:2px solid #0000;
|
||||
outline-offset:-2px;
|
||||
}
|
||||
.wp-block-button[data-rich-text-placeholder]:after{
|
||||
opacity:.8;
|
||||
}
|
||||
|
||||
.wp-block-button__inline-link{
|
||||
color:#757575;
|
||||
height:0;
|
||||
max-width:290px;
|
||||
overflow:hidden;
|
||||
}
|
||||
.wp-block-button__inline-link-input__suggestions{
|
||||
max-width:290px;
|
||||
}
|
||||
@media (min-width:782px){
|
||||
.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{
|
||||
max-width:260px;
|
||||
}
|
||||
}
|
||||
@media (min-width:960px){
|
||||
.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{
|
||||
max-width:290px;
|
||||
}
|
||||
}
|
||||
.is-selected .wp-block-button__inline-link{
|
||||
height:auto;
|
||||
overflow:visible;
|
||||
}
|
||||
|
||||
.wp-button-label__width .components-button-group{
|
||||
display:block;
|
||||
}
|
||||
.wp-button-label__width .components-base-control__field{
|
||||
margin-bottom:12px;
|
||||
}
|
||||
|
||||
div[data-type="core/button"]{
|
||||
display:table;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#757575;height:0;max-width:290px;overflow:hidden}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link{height:auto;overflow:visible}.wp-button-label__width .components-button-group{display:block}.wp-button-label__width .components-base-control__field{margin-bottom:12px}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}
|
||||
.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}
|
||||
@@ -14,44 +14,13 @@
|
||||
}
|
||||
.wp-block-button:focus{
|
||||
box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color);
|
||||
outline:2px solid transparent;
|
||||
outline:2px solid #0000;
|
||||
outline-offset:-2px;
|
||||
}
|
||||
.wp-block-button[data-rich-text-placeholder]:after{
|
||||
opacity:.8;
|
||||
}
|
||||
|
||||
.wp-block-button__inline-link{
|
||||
color:#757575;
|
||||
height:0;
|
||||
max-width:290px;
|
||||
overflow:hidden;
|
||||
}
|
||||
.wp-block-button__inline-link-input__suggestions{
|
||||
max-width:290px;
|
||||
}
|
||||
@media (min-width:782px){
|
||||
.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{
|
||||
max-width:260px;
|
||||
}
|
||||
}
|
||||
@media (min-width:960px){
|
||||
.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{
|
||||
max-width:290px;
|
||||
}
|
||||
}
|
||||
.is-selected .wp-block-button__inline-link{
|
||||
height:auto;
|
||||
overflow:visible;
|
||||
}
|
||||
|
||||
.wp-button-label__width .components-button-group{
|
||||
display:block;
|
||||
}
|
||||
.wp-button-label__width .components-base-control__field{
|
||||
margin-bottom:12px;
|
||||
}
|
||||
|
||||
div[data-type="core/button"]{
|
||||
display:table;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{
|
||||
/*!rtl:ignore*/text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#757575;height:0;max-width:290px;overflow:hidden}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link{height:auto;overflow:visible}.wp-button-label__width .components-button-group{display:block}.wp-button-label__width .components-base-control__field{margin-bottom:12px}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}
|
||||
/*!rtl:ignore*/text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid #0000;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}
|
||||
@@ -64,17 +64,17 @@
|
||||
border-radius:0 !important;
|
||||
}
|
||||
|
||||
.wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{
|
||||
.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{
|
||||
border:2px solid;
|
||||
padding:.667em 1.333em;
|
||||
}
|
||||
|
||||
.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){
|
||||
.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){
|
||||
color:currentColor;
|
||||
}
|
||||
|
||||
.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){
|
||||
background-color:transparent;
|
||||
.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){
|
||||
background-color:initial;
|
||||
background-image:none;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){background-color:transparent;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}
|
||||
.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){background-color:initial;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}
|
||||
@@ -64,17 +64,17 @@
|
||||
border-radius:0 !important;
|
||||
}
|
||||
|
||||
.wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{
|
||||
.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{
|
||||
border:2px solid;
|
||||
padding:.667em 1.333em;
|
||||
}
|
||||
|
||||
.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){
|
||||
.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){
|
||||
color:currentColor;
|
||||
}
|
||||
|
||||
.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){
|
||||
background-color:transparent;
|
||||
.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){
|
||||
background-color:initial;
|
||||
background-image:none;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){background-color:transparent;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}
|
||||
.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link:where(.is-style-outline),.wp-block-button:where(.is-style-outline)>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-text-color),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link:where(.is-style-outline):not(.has-background),.wp-block-button:where(.is-style-outline)>.wp-block-button__link:not(.has-background){background-color:initial;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}
|
||||
@@ -4,6 +4,7 @@
|
||||
"name": "core/buttons",
|
||||
"title": "Buttons",
|
||||
"category": "design",
|
||||
"allowedBlocks": [ "core/button" ],
|
||||
"description": "Prompt visitors to take action with a group of button-style links.",
|
||||
"keywords": [ "link" ],
|
||||
"textdomain": "default",
|
||||
@@ -38,6 +39,9 @@
|
||||
"default": {
|
||||
"type": "flex"
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-buttons-editor",
|
||||
|
||||
@@ -33,10 +33,8 @@ function render_block_core_calendar( $attributes ) {
|
||||
str_contains( $permalink_structure, '%monthnum%' ) &&
|
||||
str_contains( $permalink_structure, '%year%' )
|
||||
) {
|
||||
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
|
||||
$monthnum = $attributes['month'];
|
||||
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
|
||||
$year = $attributes['year'];
|
||||
$year = $attributes['year'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,10 +68,8 @@ function render_block_core_calendar( $attributes ) {
|
||||
$calendar
|
||||
);
|
||||
|
||||
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
|
||||
$monthnum = $previous_monthnum;
|
||||
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited
|
||||
$year = $previous_year;
|
||||
$year = $previous_year;
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"style": "wp-block-calendar"
|
||||
|
||||
@@ -70,8 +70,7 @@ function render_block_core_categories( $attributes ) {
|
||||
function build_dropdown_script_block_core_categories( $dropdown_id ) {
|
||||
ob_start();
|
||||
?>
|
||||
<script type='text/javascript'>
|
||||
/* <![CDATA[ */
|
||||
<script>
|
||||
( function() {
|
||||
var dropdown = document.getElementById( '<?php echo esc_js( $dropdown_id ); ?>' );
|
||||
function onCatChange() {
|
||||
@@ -81,10 +80,9 @@ function build_dropdown_script_block_core_categories( $dropdown_id ) {
|
||||
}
|
||||
dropdown.onchange = onCatChange;
|
||||
})();
|
||||
/* ]]> */
|
||||
</script>
|
||||
<?php
|
||||
return ob_get_clean();
|
||||
return wp_get_inline_script_tag( str_replace( array( '<script>', '</script>' ), '', ob_get_clean() ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-categories-editor",
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
"textdomain": "default",
|
||||
"attributes": {
|
||||
"content": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"type": "rich-text",
|
||||
"source": "rich-text",
|
||||
"selector": "code",
|
||||
"__unstablePreserveWhiteSpace": true
|
||||
}
|
||||
@@ -56,6 +56,9 @@
|
||||
"background": true,
|
||||
"text": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"style": "wp-block-code"
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
"text": true
|
||||
}
|
||||
},
|
||||
"shadow": true,
|
||||
"spacing": {
|
||||
"blockGap": true,
|
||||
"padding": true,
|
||||
@@ -68,6 +69,9 @@
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"layout": true
|
||||
"layout": true,
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
"name": "core/columns",
|
||||
"title": "Columns",
|
||||
"category": "design",
|
||||
"allowedBlocks": [ "core/column" ],
|
||||
"description": "Display content in multiple columns, with blocks added to each column.",
|
||||
"textdomain": "default",
|
||||
"attributes": {
|
||||
@@ -78,7 +79,11 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
},
|
||||
"shadow": true
|
||||
},
|
||||
"editorStyle": "wp-block-columns-editor",
|
||||
"style": "wp-block-columns"
|
||||
|
||||
@@ -48,6 +48,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"style": "wp-block-comment-template"
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
"title": "Comments Pagination",
|
||||
"category": "theme",
|
||||
"parent": [ "core/comments" ],
|
||||
"allowedBlocks": [
|
||||
"core/comments-pagination-previous",
|
||||
"core/comments-pagination-numbers",
|
||||
"core/comments-pagination-next"
|
||||
],
|
||||
"description": "Displays a paginated navigation to next/previous set of comments, when applicable.",
|
||||
"textdomain": "default",
|
||||
"attributes": {
|
||||
@@ -48,6 +53,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-comments-pagination-editor",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"title": "Comments Title",
|
||||
"category": "theme",
|
||||
"ancestor": [ "core/comments" ],
|
||||
"description": "Displays a title with the number of comments",
|
||||
"description": "Displays a title with the number of comments.",
|
||||
"textdomain": "default",
|
||||
"usesContext": [ "postId", "postType" ],
|
||||
"attributes": {
|
||||
@@ -61,6 +61,9 @@
|
||||
"__experimentalFontStyle": true,
|
||||
"__experimentalFontWeight": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,9 +19,6 @@
|
||||
},
|
||||
"alt": {
|
||||
"type": "string",
|
||||
"source": "attribute",
|
||||
"selector": "img",
|
||||
"attribute": "alt",
|
||||
"default": ""
|
||||
},
|
||||
"hasParallax": {
|
||||
@@ -42,6 +39,9 @@
|
||||
"customOverlayColor": {
|
||||
"type": "string"
|
||||
},
|
||||
"isUserOverlayColor": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"backgroundType": {
|
||||
"type": "string",
|
||||
"default": "image"
|
||||
@@ -114,6 +114,9 @@
|
||||
"__experimentalSkipSerialization": [ "gradients" ],
|
||||
"enableContrastChecker": false
|
||||
},
|
||||
"dimensions": {
|
||||
"aspectRatio": true
|
||||
},
|
||||
"typography": {
|
||||
"fontSize": true,
|
||||
"lineHeight": true,
|
||||
@@ -129,6 +132,9 @@
|
||||
},
|
||||
"layout": {
|
||||
"allowJustification": false
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-cover-editor",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
background-color:#000;
|
||||
}
|
||||
.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{
|
||||
background-color:transparent;
|
||||
background-color:initial;
|
||||
}
|
||||
.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{
|
||||
background-color:inherit;
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -14,7 +14,7 @@
|
||||
background-color:#000;
|
||||
}
|
||||
.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{
|
||||
background-color:transparent;
|
||||
background-color:initial;
|
||||
}
|
||||
.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{
|
||||
background-color:inherit;
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -13,8 +13,8 @@
|
||||
"default": false
|
||||
},
|
||||
"summary": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"type": "rich-text",
|
||||
"source": "rich-text",
|
||||
"selector": "summary"
|
||||
}
|
||||
},
|
||||
@@ -58,6 +58,9 @@
|
||||
},
|
||||
"layout": {
|
||||
"allowEditing": false
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-details-editor",
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
"caption": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"type": "rich-text",
|
||||
"source": "rich-text",
|
||||
"selector": "figcaption",
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
@@ -44,6 +44,9 @@
|
||||
"align": true,
|
||||
"spacing": {
|
||||
"margin": true
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-embed-editor",
|
||||
|
||||
@@ -10,9 +10,13 @@
|
||||
.wp-block-embed .components-placeholder__error{
|
||||
word-break:break-word;
|
||||
}
|
||||
.wp-block-embed .components-placeholder__learn-more{
|
||||
|
||||
.wp-block-embed__learn-more{
|
||||
margin-top:1em;
|
||||
}
|
||||
.wp-block-post-content .wp-block-embed__learn-more a{
|
||||
color:var(--wp-admin-theme-color);
|
||||
}
|
||||
|
||||
.block-library-embed__interactive-overlay{
|
||||
bottom:0;
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}
|
||||
.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed__learn-more{margin-top:1em}.wp-block-post-content .wp-block-embed__learn-more a{color:var(--wp-admin-theme-color)}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}
|
||||
@@ -10,9 +10,13 @@
|
||||
.wp-block-embed .components-placeholder__error{
|
||||
word-break:break-word;
|
||||
}
|
||||
.wp-block-embed .components-placeholder__learn-more{
|
||||
|
||||
.wp-block-embed__learn-more{
|
||||
margin-top:1em;
|
||||
}
|
||||
.wp-block-post-content .wp-block-embed__learn-more a{
|
||||
color:var(--wp-admin-theme-color);
|
||||
}
|
||||
|
||||
.block-library-embed__interactive-overlay{
|
||||
bottom:0;
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}
|
||||
.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed__learn-more{margin-top:1em}.wp-block-post-content .wp-block-embed__learn-more a{color:var(--wp-admin-theme-color)}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}
|
||||
@@ -4,7 +4,7 @@
|
||||
text-align:center;
|
||||
}
|
||||
.is-dark-theme .wp-block-embed figcaption{
|
||||
color:hsla(0,0%,100%,.65);
|
||||
color:#ffffffa6;
|
||||
}
|
||||
|
||||
.wp-block-embed{
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em}
|
||||
.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:#ffffffa6}.wp-block-embed{margin:0 0 1em}
|
||||
@@ -4,7 +4,7 @@
|
||||
text-align:center;
|
||||
}
|
||||
.is-dark-theme .wp-block-embed figcaption{
|
||||
color:hsla(0,0%,100%,.65);
|
||||
color:#ffffffa6;
|
||||
}
|
||||
|
||||
.wp-block-embed{
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em}
|
||||
.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:#ffffffa6}.wp-block-embed{margin:0 0 1em}
|
||||
@@ -14,25 +14,8 @@
|
||||
*
|
||||
* @return string Returns the block content.
|
||||
*/
|
||||
function render_block_core_file( $attributes, $content, $block ) {
|
||||
$should_load_view_script = ! empty( $attributes['displayPreview'] );
|
||||
$view_js_file = 'wp-block-file-view';
|
||||
// If the script already exists, there is no point in removing it from viewScript.
|
||||
if ( ! wp_script_is( $view_js_file ) ) {
|
||||
$script_handles = $block->block_type->view_script_handles;
|
||||
|
||||
// If the script is not needed, and it is still in the `view_script_handles`, remove it.
|
||||
if ( ! $should_load_view_script && in_array( $view_js_file, $script_handles, true ) ) {
|
||||
$block->block_type->view_script_handles = array_diff( $script_handles, array( $view_js_file ) );
|
||||
}
|
||||
// If the script is needed, but it was previously removed, add it again.
|
||||
if ( $should_load_view_script && ! in_array( $view_js_file, $script_handles, true ) ) {
|
||||
$block->block_type->view_script_handles = array_merge( $script_handles, array( $view_js_file ) );
|
||||
}
|
||||
}
|
||||
|
||||
function render_block_core_file( $attributes, $content ) {
|
||||
// Update object's aria-label attribute if present in block HTML.
|
||||
|
||||
// Match an aria-label attribute from an object tag.
|
||||
$pattern = '@<object.+(?<attribute>aria-label="(?<filename>[^"]+)?")@i';
|
||||
$content = preg_replace_callback(
|
||||
@@ -53,13 +36,26 @@ function render_block_core_file( $attributes, $content, $block ) {
|
||||
$content
|
||||
);
|
||||
|
||||
// If it uses the Interactivity API, add the directives.
|
||||
if ( $should_load_view_script ) {
|
||||
// If it's interactive, enqueue the script module and add the directives.
|
||||
if ( ! empty( $attributes['displayPreview'] ) ) {
|
||||
$suffix = wp_scripts_get_suffix();
|
||||
if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
|
||||
$module_url = gutenberg_url( '/build/interactivity/file.min.js' );
|
||||
}
|
||||
|
||||
wp_register_script_module(
|
||||
'@wordpress/block-library/file',
|
||||
isset( $module_url ) ? $module_url : includes_url( "blocks/file/view{$suffix}.js" ),
|
||||
array( '@wordpress/interactivity' ),
|
||||
defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' )
|
||||
);
|
||||
wp_enqueue_script_module( '@wordpress/block-library/file' );
|
||||
|
||||
$processor = new WP_HTML_Tag_Processor( $content );
|
||||
$processor->next_tag();
|
||||
$processor->set_attribute( 'data-wp-interactive', '' );
|
||||
$processor->set_attribute( 'data-wp-interactive', 'core/file' );
|
||||
$processor->next_tag( 'object' );
|
||||
$processor->set_attribute( 'data-wp-bind--hidden', '!selectors.core.file.hasPdfPreview' );
|
||||
$processor->set_attribute( 'data-wp-bind--hidden', '!state.hasPdfPreview' );
|
||||
$processor->set_attribute( 'hidden', true );
|
||||
return $processor->get_updated_html();
|
||||
}
|
||||
@@ -67,25 +63,6 @@ function render_block_core_file( $attributes, $content, $block ) {
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the view script has the `wp-interactivity` dependency.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @global WP_Scripts $wp_scripts
|
||||
*/
|
||||
function block_core_file_ensure_interactivity_dependency() {
|
||||
global $wp_scripts;
|
||||
if (
|
||||
isset( $wp_scripts->registered['wp-block-file-view'] ) &&
|
||||
! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-file-view']->deps, true )
|
||||
) {
|
||||
$wp_scripts->registered['wp-block-file-view']->deps[] = 'wp-interactivity';
|
||||
}
|
||||
}
|
||||
|
||||
add_action( 'wp_print_scripts', 'block_core_file_ensure_interactivity_dependency' );
|
||||
|
||||
/**
|
||||
* Registers the `core/file` block on server.
|
||||
*/
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
"attribute": "id"
|
||||
},
|
||||
"fileName": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"type": "rich-text",
|
||||
"source": "rich-text",
|
||||
"selector": "a:not([download])"
|
||||
},
|
||||
"textLinkHref": {
|
||||
@@ -42,8 +42,8 @@
|
||||
"default": true
|
||||
},
|
||||
"downloadButtonText": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"type": "rich-text",
|
||||
"source": "rich-text",
|
||||
"selector": "a[download]"
|
||||
},
|
||||
"displayPreview": {
|
||||
@@ -72,7 +72,6 @@
|
||||
},
|
||||
"interactivity": true
|
||||
},
|
||||
"viewScript": "file:./view.min.js",
|
||||
"editorStyle": "wp-block-file-editor",
|
||||
"style": "wp-block-file"
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '3fd0154de23a0ecc28af');
|
||||
<?php return array('dependencies' => array(), 'version' => '498971a8a9512421f3b5');
|
||||
|
||||
@@ -1,12 +1,34 @@
|
||||
"use strict";
|
||||
(self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[81],{
|
||||
import * as __WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__ from "@wordpress/interactivity";
|
||||
/******/ // The require scope
|
||||
/******/ var __webpack_require__ = {};
|
||||
/******/
|
||||
/************************************************************************/
|
||||
/******/ /* webpack/runtime/define property getters */
|
||||
/******/ (() => {
|
||||
/******/ // define getter functions for harmony exports
|
||||
/******/ __webpack_require__.d = (exports, definition) => {
|
||||
/******/ for(var key in definition) {
|
||||
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
||||
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
||||
/******/ }
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
||||
/******/ (() => {
|
||||
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
||||
/******/ })();
|
||||
/******/
|
||||
/************************************************************************/
|
||||
var __webpack_exports__ = {};
|
||||
|
||||
/***/ 149:
|
||||
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
|
||||
|
||||
|
||||
// EXTERNAL MODULE: ./node_modules/@wordpress/interactivity/src/index.js + 15 modules
|
||||
var src = __webpack_require__(754);
|
||||
;// CONCATENATED MODULE: external "@wordpress/interactivity"
|
||||
var x = (y) => {
|
||||
var x = {}; __webpack_require__.d(x, y); return x
|
||||
}
|
||||
var y = (x) => (() => (x))
|
||||
const interactivity_namespaceObject = x({ ["store"]: () => (__WEBPACK_EXTERNAL_MODULE__wordpress_interactivity_8e89b257__.store) });
|
||||
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/utils/index.js
|
||||
/**
|
||||
* Uses a combination of user agent matching and feature detection to determine whether
|
||||
@@ -53,6 +75,7 @@ const createActiveXObject = type => {
|
||||
}
|
||||
return ax;
|
||||
};
|
||||
|
||||
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/view.js
|
||||
/**
|
||||
* WordPress dependencies
|
||||
@@ -62,21 +85,13 @@ const createActiveXObject = type => {
|
||||
* Internal dependencies
|
||||
*/
|
||||
|
||||
(0,src/* store */.h)({
|
||||
selectors: {
|
||||
core: {
|
||||
file: {
|
||||
hasPdfPreview: browserSupportsPdfs
|
||||
}
|
||||
(0,interactivity_namespaceObject.store)('core/file', {
|
||||
state: {
|
||||
get hasPdfPreview() {
|
||||
return browserSupportsPdfs();
|
||||
}
|
||||
}
|
||||
}, {
|
||||
lock: true
|
||||
});
|
||||
|
||||
/***/ })
|
||||
|
||||
},
|
||||
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
||||
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
||||
/******/ var __webpack_exports__ = (__webpack_exec__(149));
|
||||
/******/ }
|
||||
]);
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '8a0237493a27c0d781aa');
|
||||
<?php return array('dependencies' => array(), 'version' => '9c04187f1796859989c3');
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
"use strict";(self.__WordPressPrivateInteractivityAPI__=self.__WordPressPrivateInteractivityAPI__||[]).push([[81],{149:function(i,t,e){var n=e(754);const o=i=>{let t;try{t=new window.ActiveXObject(i)}catch(i){t=void 0}return t};(0,n.h)({selectors:{core:{file:{hasPdfPreview:()=>!(window.navigator.userAgent.indexOf("Mobi")>-1)&&(!(window.navigator.userAgent.indexOf("Android")>-1)&&(!(window.navigator.userAgent.indexOf("Macintosh")>-1&&window.navigator.maxTouchPoints&&window.navigator.maxTouchPoints>2)&&!((window.ActiveXObject||"ActiveXObject"in window)&&!o("AcroPDF.PDF")&&!o("PDF.PdfCtrl"))))}}}})}},function(i){var t;t=149,i(i.s=t)}]);
|
||||
import*as e from"@wordpress/interactivity";var t={d:(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const o=(e=>{var o={};return t.d(o,e),o})({store:()=>e.store}),r=e=>{let t;try{t=new window.ActiveXObject(e)}catch(e){t=void 0}return t};(0,o.store)("core/file",{state:{get hasPdfPreview(){return!(window.navigator.userAgent.indexOf("Mobi")>-1||window.navigator.userAgent.indexOf("Android")>-1||window.navigator.userAgent.indexOf("Macintosh")>-1&&window.navigator.maxTouchPoints&&window.navigator.maxTouchPoints>2||(window.ActiveXObject||"ActiveXObject"in window)&&!r("AcroPDF.PDF")&&!r("PDF.PdfCtrl"))}}},{lock:!0});
|
||||
@@ -68,18 +68,6 @@ function render_block_core_footnotes( $attributes, $content, $block ) {
|
||||
* @since 6.3.0
|
||||
*/
|
||||
function register_block_core_footnotes() {
|
||||
foreach ( array( 'post', 'page' ) as $post_type ) {
|
||||
register_post_meta(
|
||||
$post_type,
|
||||
'footnotes',
|
||||
array(
|
||||
'show_in_rest' => true,
|
||||
'single' => true,
|
||||
'type' => 'string',
|
||||
'revisions_enabled' => true,
|
||||
)
|
||||
);
|
||||
}
|
||||
register_block_type_from_metadata(
|
||||
__DIR__ . '/footnotes',
|
||||
array(
|
||||
@@ -89,6 +77,40 @@ function register_block_core_footnotes() {
|
||||
}
|
||||
add_action( 'init', 'register_block_core_footnotes' );
|
||||
|
||||
|
||||
/**
|
||||
* Registers the footnotes meta field required for footnotes to work.
|
||||
*
|
||||
* @since 6.5.0
|
||||
*/
|
||||
function register_block_core_footnotes_post_meta() {
|
||||
$post_types = get_post_types( array( 'show_in_rest' => true ) );
|
||||
foreach ( $post_types as $post_type ) {
|
||||
// Only register the meta field if the post type supports the editor, custom fields, and revisions.
|
||||
if (
|
||||
post_type_supports( $post_type, 'editor' ) &&
|
||||
post_type_supports( $post_type, 'custom-fields' ) &&
|
||||
post_type_supports( $post_type, 'revisions' )
|
||||
) {
|
||||
register_post_meta(
|
||||
$post_type,
|
||||
'footnotes',
|
||||
array(
|
||||
'show_in_rest' => true,
|
||||
'single' => true,
|
||||
'type' => 'string',
|
||||
'revisions_enabled' => true,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Most post types are registered at priority 10, so use priority 20 here in
|
||||
* order to catch them.
|
||||
*/
|
||||
add_action( 'init', 'register_block_core_footnotes_post_meta', 20 );
|
||||
|
||||
/**
|
||||
* Adds the footnotes field to the revisions display.
|
||||
*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"name": "core/footnotes",
|
||||
"title": "Footnotes",
|
||||
"category": "text",
|
||||
"description": "",
|
||||
"description": "Display footnotes added to the page.",
|
||||
"keywords": [ "references" ],
|
||||
"textdomain": "default",
|
||||
"usesContext": [ "postId", "postType" ],
|
||||
@@ -33,6 +33,7 @@
|
||||
"html": false,
|
||||
"multiple": false,
|
||||
"reusable": false,
|
||||
"inserter": false,
|
||||
"spacing": {
|
||||
"margin": true,
|
||||
"padding": true,
|
||||
@@ -54,6 +55,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"clientNavigation": true
|
||||
}
|
||||
},
|
||||
"style": "wp-block-footnotes"
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
width:96%;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce img::selection{
|
||||
background-color:transparent;
|
||||
background-color:initial;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{
|
||||
-ms-user-select:element;
|
||||
@@ -96,14 +96,14 @@
|
||||
padding-top:.5em;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview{
|
||||
border:1px solid transparent;
|
||||
border:1px solid #0000;
|
||||
clear:both;
|
||||
margin-bottom:16px;
|
||||
position:relative;
|
||||
width:99.99%;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{
|
||||
background:transparent;
|
||||
background:#0000;
|
||||
display:block;
|
||||
max-width:100%;
|
||||
}
|
||||
@@ -122,17 +122,17 @@
|
||||
padding:10px;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{
|
||||
word-wrap:break-word;
|
||||
border:1px solid #ddd;
|
||||
margin:0;
|
||||
padding:1em 0;
|
||||
word-wrap:break-word;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{
|
||||
margin:0;
|
||||
text-align:center;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{
|
||||
border-color:transparent;
|
||||
border-color:#0000;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{
|
||||
display:block;
|
||||
@@ -208,7 +208,7 @@
|
||||
|
||||
div[data-type="core/freeform"]:before{
|
||||
border:1px solid #ddd;
|
||||
outline:1px solid transparent;
|
||||
outline:1px solid #0000;
|
||||
transition:border-color .1s linear,box-shadow .1s linear;
|
||||
}
|
||||
@media (prefers-reduced-motion:reduce){
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -76,7 +76,7 @@
|
||||
width:96%;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce img::selection{
|
||||
background-color:transparent;
|
||||
background-color:initial;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{
|
||||
-ms-user-select:element;
|
||||
@@ -96,14 +96,14 @@
|
||||
padding-top:.5em;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview{
|
||||
border:1px solid transparent;
|
||||
border:1px solid #0000;
|
||||
clear:both;
|
||||
margin-bottom:16px;
|
||||
position:relative;
|
||||
width:99.99%;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{
|
||||
background:transparent;
|
||||
background:#0000;
|
||||
display:block;
|
||||
max-width:100%;
|
||||
}
|
||||
@@ -122,17 +122,17 @@
|
||||
padding:10px;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{
|
||||
word-wrap:break-word;
|
||||
border:1px solid #ddd;
|
||||
margin:0;
|
||||
padding:1em 0;
|
||||
word-wrap:break-word;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{
|
||||
margin:0;
|
||||
text-align:center;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{
|
||||
border-color:transparent;
|
||||
border-color:#0000;
|
||||
}
|
||||
.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{
|
||||
display:block;
|
||||
@@ -208,7 +208,7 @@
|
||||
|
||||
div[data-type="core/freeform"]:before{
|
||||
border:1px solid #ddd;
|
||||
outline:1px solid transparent;
|
||||
outline:1px solid #0000;
|
||||
transition:border-color .1s linear,box-shadow .1s linear;
|
||||
}
|
||||
@media (prefers-reduced-motion:reduce){
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -33,17 +33,18 @@ function block_core_gallery_data_id_backcompatibility( $parsed_block ) {
|
||||
add_filter( 'render_block_data', 'block_core_gallery_data_id_backcompatibility' );
|
||||
|
||||
/**
|
||||
* Adds a style tag for the --wp--style--unstable-gallery-gap var.
|
||||
*
|
||||
* The Gallery block needs to recalculate Image block width based on
|
||||
* the current gap setting in order to maintain the number of flex columns
|
||||
* so a css var is added to allow this.
|
||||
* Renders the `core/gallery` block on the server.
|
||||
*
|
||||
* @param array $attributes Attributes of the block being rendered.
|
||||
* @param string $content Content of the block being rendered.
|
||||
* @return string The content of the block being rendered.
|
||||
*/
|
||||
function block_core_gallery_render( $attributes, $content ) {
|
||||
// Adds a style tag for the --wp--style--unstable-gallery-gap var.
|
||||
// The Gallery block needs to recalculate Image block width based on
|
||||
// the current gap setting in order to maintain the number of flex columns
|
||||
// so a css var is added to allow this.
|
||||
|
||||
$gap = $attributes['style']['spacing']['blockGap'] ?? null;
|
||||
// Skip if gap value contains unsupported characters.
|
||||
// Regex for CSS value borrowed from `safecss_filter_attr`, and used here
|
||||
@@ -115,7 +116,51 @@ function block_core_gallery_render( $attributes, $content ) {
|
||||
'context' => 'block-supports',
|
||||
)
|
||||
);
|
||||
return (string) $processed_content;
|
||||
|
||||
// The WP_HTML_Tag_Processor class calls get_updated_html() internally
|
||||
// when the instance is treated as a string, but here we explicitly
|
||||
// convert it to a string.
|
||||
$updated_content = $processed_content->get_updated_html();
|
||||
|
||||
/*
|
||||
* Randomize the order of image blocks. Ideally we should shuffle
|
||||
* the `$parsed_block['innerBlocks']` via the `render_block_data` hook.
|
||||
* However, this hook doesn't apply inner block updates when blocks are
|
||||
* nested.
|
||||
* @todo: In the future, if this hook supports updating innerBlocks in
|
||||
* nested blocks, it should be refactored.
|
||||
*
|
||||
* @see: https://github.com/WordPress/gutenberg/pull/58733
|
||||
*/
|
||||
if ( empty( $attributes['randomOrder'] ) ) {
|
||||
return $updated_content;
|
||||
}
|
||||
|
||||
// This pattern matches figure elements with the `wp-block-image` class to
|
||||
// avoid the gallery's wrapping `figure` element and extract images only.
|
||||
$pattern = '/<figure[^>]*\bwp-block-image\b[^>]*>.*?<\/figure>/';
|
||||
|
||||
// Find all Image blocks.
|
||||
preg_match_all( $pattern, $updated_content, $matches );
|
||||
if ( ! $matches ) {
|
||||
return $updated_content;
|
||||
}
|
||||
$image_blocks = $matches[0];
|
||||
|
||||
// Randomize the order of Image blocks.
|
||||
shuffle( $image_blocks );
|
||||
$i = 0;
|
||||
$content = preg_replace_callback(
|
||||
$pattern,
|
||||
static function () use ( $image_blocks, &$i ) {
|
||||
$new_image_block = $image_blocks[ $i ];
|
||||
++$i;
|
||||
return $new_image_block;
|
||||
},
|
||||
$updated_content
|
||||
);
|
||||
|
||||
return $content;
|
||||
}
|
||||
/**
|
||||
* Registers the `core/gallery` block on server.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user