Skip to content

Commit 010b548

Browse files
authored
[10.x] Fix apa on non ASCII characters (#51428)
* fix apa on accented words * fix code style * add more tests to apa with more characters * fix code style * remove empty line
1 parent 9be528c commit 010b548

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

src/Illuminate/Support/Str.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,22 +1305,23 @@ public static function apa($value)
13051305
$minorWords = [
13061306
'and', 'as', 'but', 'for', 'if', 'nor', 'or', 'so', 'yet', 'a', 'an',
13071307
'the', 'at', 'by', 'for', 'in', 'of', 'off', 'on', 'per', 'to', 'up', 'via',
1308+
'et', 'ou', 'un', 'une', 'la', 'le', 'les', 'de', 'du', 'des', 'par', 'à',
13081309
];
13091310

13101311
$endPunctuation = ['.', '!', '?', ':', '', ','];
13111312

13121313
$words = preg_split('/\s+/', $value, -1, PREG_SPLIT_NO_EMPTY);
13131314

1314-
$words[0] = ucfirst(mb_strtolower($words[0]));
1315-
13161315
for ($i = 0; $i < count($words); $i++) {
13171316
$lowercaseWord = mb_strtolower($words[$i]);
13181317

13191318
if (str_contains($lowercaseWord, '-')) {
13201319
$hyphenatedWords = explode('-', $lowercaseWord);
13211320

13221321
$hyphenatedWords = array_map(function ($part) use ($minorWords) {
1323-
return (in_array($part, $minorWords) && mb_strlen($part) <= 3) ? $part : ucfirst($part);
1322+
return (in_array($part, $minorWords) && mb_strlen($part) <= 3)
1323+
? $part
1324+
: mb_strtoupper(mb_substr($part, 0, 1)).mb_substr($part, 1);
13241325
}, $hyphenatedWords);
13251326

13261327
$words[$i] = implode('-', $hyphenatedWords);
@@ -1330,7 +1331,7 @@ public static function apa($value)
13301331
! ($i === 0 || in_array(mb_substr($words[$i - 1], -1), $endPunctuation))) {
13311332
$words[$i] = $lowercaseWord;
13321333
} else {
1333-
$words[$i] = ucfirst($lowercaseWord);
1334+
$words[$i] = mb_strtoupper(mb_substr($lowercaseWord, 0, 1)).mb_substr($lowercaseWord, 1);
13341335
}
13351336
}
13361337
}

tests/Support/SupportStrTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,18 @@ public function testStringApa()
9797
$this->assertSame('To Kill a Mockingbird', Str::apa('TO KILL A MOCKINGBIRD'));
9898
$this->assertSame('To Kill a Mockingbird', Str::apa('To Kill A Mockingbird'));
9999

100+
$this->assertSame('Être Écrivain Commence par Être un Lecteur.', Str::apa('Être écrivain commence par être un lecteur.'));
101+
$this->assertSame('Être Écrivain Commence par Être un Lecteur.', Str::apa('Être Écrivain Commence par Être un Lecteur.'));
102+
$this->assertSame('Être Écrivain Commence par Être un Lecteur.', Str::apa('ÊTRE ÉCRIVAIN COMMENCE PAR ÊTRE UN LECTEUR.'));
103+
104+
$this->assertSame("C'est-à-Dire.", Str::apa("c'est-à-dire."));
105+
$this->assertSame("C'est-à-Dire.", Str::apa("C'est-à-Dire."));
106+
$this->assertSame("C'est-à-Dire.", Str::apa("C'EsT-À-DIRE."));
107+
108+
$this->assertSame('Устное Слово – Не Воробей. Как Только Он Вылетит, Его Не Поймаешь.', Str::apa('устное слово – не воробей. как только он вылетит, его не поймаешь.'));
109+
$this->assertSame('Устное Слово – Не Воробей. Как Только Он Вылетит, Его Не Поймаешь.', Str::apa('Устное Слово – Не Воробей. Как Только Он Вылетит, Его Не Поймаешь.'));
110+
$this->assertSame('Устное Слово – Не Воробей. Как Только Он Вылетит, Его Не Поймаешь.', Str::apa('УСТНОЕ СЛОВО – НЕ ВОРОБЕЙ. КАК ТОЛЬКО ОН ВЫЛЕТИТ, ЕГО НЕ ПОЙМАЕШЬ.'));
111+
100112
$this->assertSame('', Str::apa(''));
101113
$this->assertSame(' ', Str::apa(' '));
102114
}

0 commit comments

Comments
 (0)