🆙 Add cms i using 🆙

This commit is contained in:
Remco
2025-11-25 22:42:56 +01:00
parent 94704e0925
commit d44196149e
35591 changed files with 3601123 additions and 0 deletions
@@ -0,0 +1,16 @@
The MIT License (MIT)
Copyright (c) Pest and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,26 @@
# Upgrade Guide
## General Notes
## Upgrading from 3.x to 4.x
### Minimum PHP Version
PHP 8.3 is now the minimum required version.
### Minimum PestPHP Version
Pest v4 is now the minimum required version.
### Removed `toHaveProfanity` Expectation
The `toHaveProfanity` Expectation has been removed in `v4`. This will cause your test suite to fail if you do not remove
this Expectation. To use this package, you must now run `./vendor/bin/pest --profanity`. You may wish to set this up
as a Composer script:
```json
"scripts": {
"profanity": "pest --profanity"
},
```
You can then execute it by running `composer profanity`. You may also wish to set it up in your CI/CD scripts:
```bash
./vendor/bin/pest --profanity
```
@@ -0,0 +1,55 @@
{
"name": "pestphp/pest-plugin-profanity",
"description": "The Pest Profanity Plugin",
"keywords": [
"php",
"framework",
"pest",
"unit",
"test",
"testing",
"plugin",
"profanity"
],
"license": "MIT",
"require": {
"php": "^8.3",
"pestphp/pest-plugin": "^4.0.0"
},
"autoload": {
"psr-4": {
"Pest\\Profanity\\": "src/"
}
},
"require-dev": {
"faissaloux/pest-plugin-inside": "^1.9",
"pestphp/pest": "^4.0.0",
"pestphp/pest-dev-tools": "^4.0.0"
},
"minimum-stability": "dev",
"prefer-stable": true,
"config": {
"sort-packages": true,
"preferred-install": "dist",
"allow-plugins": {
"pestphp/pest-plugin": true
}
},
"scripts": {
"lint": "pint",
"test:lint": "pint --test",
"test:unit": "pest --colors=always",
"test": [
"@test:lint",
"@test:unit"
],
"profanity": "pest --profanity"
},
"extra": {
"pest": {
"plugins": [
"Pest\\Profanity\\Plugin"
]
}
}
}
@@ -0,0 +1,35 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity;
use Closure;
/**
* @internal
*/
final class Analyser
{
/**
* Analyse the code for profanity.
*
* @param array<int, string> $files
* @param \Closure(\Pest\Profanity\Result): void $callback
* @param array<string> $excludingWords
* @param array<string> $includingWords
* @param array<string>|null $languages
*/
public static function analyse(
array $files,
Closure $callback,
array $excludingWords = [],
array $includingWords = [],
$languages = null
): void {
foreach ($files as $file) {
$errors = ProfanityAnalyser::analyse($file, $excludingWords, $includingWords, $languages);
$callback(new Result($file, $errors));
}
}
}
@@ -0,0 +1,201 @@
<?php
declare(strict_types=1);
return [
'3ahira',
'9owd',
'dor t9awd',
'kahba',
'lkhra',
'lmlawi',
'sir trawd',
'wjh lkhra',
'أجرب',
'أحمق',
'أخرس',
'أرعن',
'أهبل',
'ابن الحرام',
'ابن الشرموطة',
'ابن العاهرة',
'ابن القحبة',
'ابن الوسخة',
'ابن زانية',
'احبة',
'اغتصاب',
'الخرا',
'اللاذينا',
'الملاوي',
'النكاح الفاسد',
'بز',
'بلا أصل',
'بلا قيمة',
'بلا كرامة',
'بلا نخوة',
'بنت زانية',
'بنت قحبة',
'تحرش',
'تف عليك',
'تفو',
'تفو على شرفك',
'جحش',
'جردون',
'جرذ',
'جيفة',
'حسود',
'حشاش',
'حشرة',
'حقارة',
'حقد',
'حقير',
'حقيرة',
'حمار ابن حمار',
'حمار ابن كلب',
'حماري',
'خائن',
'خاري',
'خارية',
'خبيث',
'خرا',
'خرائي',
'خراوي',
'خرنق',
'خرية',
'خسيس',
'خنازير',
'خنزير',
'خنزيرة',
'داعر',
'دور تقود',
'ديوث',
'ديوثة',
'رخيص ابن رخيص',
'زاني',
'زانية',
'زب',
'زب أمك',
'زب الكلب',
'زبالة ابن زبالة',
'زبر',
'زبك',
'زبل',
'زبي',
'زنا المحارم',
'زنجي',
'زنخ',
'سافل',
'سافل ابن سافل',
'سافلة',
'ساقطة',
'سطل',
'سطلان',
'سكران',
'سيد القحاب',
'سيدة القحاب',
'سير تقود',
'سيري تقودي',
'شرموط',
'شرموطة',
'صايع',
'صرصور',
'صرماية',
'طرطور',
'طرطور ابن طرطور',
'طز فيك',
'عاهرة',
'عاهرة بنت عاهرة',
'عرص',
'عرص ابن عرص',
'عرصات',
'عرصة',
'عنصري',
'غباء',
'غبي',
'غدار',
'فاجر',
'فرخ',
'فرخة',
'قحاب',
'قحب',
'قحبة',
'قحبة الشارع',
'قحبوش',
'قمامة',
'قملة',
'قواد',
'قوادين',
'قود',
'كحبة',
'كذاب أشر',
'كريهة',
'كس',
'كس أمك',
'كسمك',
'كسمك تفو عليك',
'كسمك للكلاب',
'كل زق',
'لحاس',
'لحاسة',
'لحس',
'لحس زبي',
'لحس كسي',
'لعنة عليك',
'لوطي',
'لوطية',
'ماكر',
'متخلف',
'متسخ',
'متصيع',
'متناك',
'متناكة',
'مخدرات',
'مخرب',
'مخنث',
'مسخ',
'مص',
'مص زبي',
'معفن',
'مغتصب',
'مقرف',
'مقود',
'مكحط',
'مكحطة',
'مكوة',
'ملاوي',
'ملعون',
'ملعون أبوك',
'ملعون الوالدين',
'ملعون جدك',
'ممسوخ',
'ممسوخة',
'منحرف',
'منحط',
'منحل',
'منيوك',
'مهزلة',
'نتانة',
'نتن',
'نجس',
'نجس ابن نجس',
'نجسة',
'نكاح المحارم',
'نكوح',
'نيك',
'نيك أمك',
'نيك حياتك',
'نيك دمك',
'نيكم',
'واطي',
'وجه الخرا',
'وساخة',
'وسخ العالم',
'وسخ يدك',
'وضاعة',
'وضعيف',
'وضيع',
'ولد زنا',
'ولد قحبة',
'يا عديم الأصل',
'يا عرص',
];
@@ -0,0 +1,60 @@
<?php
declare(strict_types=1);
return [
'asshole',
'bitch',
'bolle',
'bøsse',
'cunt',
'fandens',
'fandme',
'fedtsyl',
'fisse',
'fjols',
'fuck',
'fucker',
'fucking',
'helvede',
'idiot',
'klovn',
'klunker',
'knalde',
'kneppe',
'kusse',
'kælling',
'l0rt',
'lort',
'luder',
'mongol',
'motherfucker',
'møg',
'møgkælling',
'møgso',
'møgsvin',
'neger',
'nosser',
'patter',
'perker',
'pik',
'pikhoved',
'pis',
'pisse',
'pule',
'rend mig i røven',
'røv',
'røvhul',
'satans',
'shit',
'skide',
'skidespræller',
'skøge',
'so',
'sorte svin',
'spasser',
'svin',
'tosse',
'tåbe',
'åndssvag',
];
@@ -0,0 +1,101 @@
<?php
declare(strict_types=1);
return [
'affe',
'affenarsch',
'affenhirn',
'arsch',
'arschgeige',
'arschgesicht',
'arschkind',
'arschkriecher',
'arschloch',
'bloedi',
'bloedsinn',
'blöd',
'blödi',
'blödkopf',
'blödmann',
'doedel',
'doof',
'doofi',
'dreck',
'drecksack',
'drecksau',
'dreckskerl',
'dumm',
'dummkopf',
'dumpfbacke',
'dödel',
'ekel',
'fick',
'ficken',
'ficker',
'fotze',
'fotzen',
'gammelarsch',
'hackfresse',
'heulsuse',
'hirnamputiert',
'hirni',
'hirnlos',
'hirnwichser',
'honk',
'hosenscheisser',
'hosenscheißer',
'hure',
'huren',
'hurensohn',
'idiot',
'idioten',
'kack',
'kackbratze',
'kacke',
'kacker',
'klappe',
'kotnascher',
'kotz',
'kotze',
'kotzer',
'lusche',
'mist',
'muell',
'müll',
'nullchecker',
'otto',
'penner',
'pennergesicht',
'pimmel',
'pimmelfresse',
'piss',
'pissen',
'pisser',
'pissnelke',
'scheiss',
'scheissdreck',
'scheisse',
'scheisskerl',
'scheisskopf',
'scheiße',
'schlampe',
'schlampen',
'schwachkopf',
'schwein',
'schweinehund',
'spacken',
'spacko',
'spasti',
'trottel',
'trotteln',
'versager',
'vollidiot',
'vollpfosten',
'wichs',
'wichse',
'wichser',
'wichskopf',
'wichsloch',
'wichst',
];
@@ -0,0 +1,185 @@
<?php
declare(strict_types=1);
return [
'1d1074',
'1di074',
'1mb3c1l',
'1mbecil',
'4n1m4l',
'4n1mal',
'50r373',
'54l4m3',
'70n70',
'70nt0 d3l cvl0',
'74r4d0',
'7r0l0',
'7r0l4',
'an1m4l',
'animal',
'b0lud0',
'b0ludo',
'b0lvd0',
'b4574rd0',
'b4st4rd0',
'bast4rd0',
'bastardo',
'boludo',
'c4br0n',
'c4bvn',
'c4r4ho',
'c4r4j0',
'cabro0n',
'cabron',
'car4jo',
'carajo',
'cul14d0',
'cul1ado',
'cul3r0',
'culero',
'culiado',
'cv13r0',
'cvlero',
'cvliado',
'f0rr0',
'f0rro',
'forro',
'g1l1p0ll45',
'g1l1p0ll4s',
'g1l1p0llas',
'g4rch4',
'g4rcha',
'garcha',
'gilipollas',
'h1j0 d3 pu74',
'h1jo d3 pvt4',
'hijo de puta',
'idi074',
'idiota',
'imb3c1l',
'imbec1l',
'imbecil',
'imbécil',
'j0d1d0',
'j0d3r',
'j0der',
'j0dido',
'jod1d0',
'joder',
'jodido',
'l4m3cul0s',
'l4m3cvl0s',
'l4m3cvlos',
'lameculos',
'm0ng0l1c0',
'm13rd3r0',
'm13rd4',
'm1erd4',
'm1erda',
'm1erdero',
'm4lp4r1d0',
'm4lparido',
'm4m4gu3v0',
'm4m4hv3v0',
'm4mahv3vo',
'm4r1c0n',
'm4r1c4',
'm4ric0n',
'm4rik4',
'malp4r1d0',
'malparido',
'mam4gu3v0',
'mam4gv3o',
'mam4hv3v0',
'mamaguevo',
'mamahuevo',
'mar1k0n',
'mar1k4',
'marica',
'maricon',
'mierd3r0',
'mierda',
'mierdero',
'mong0l1ko',
'mong0lik0',
'mongólico',
'n0 51rv35',
'n051rv3s',
'n3gr0 d3 m13rd4',
'n3gr0 d3 m1erda',
'n3r1',
'n3ri',
'negro de mierda',
'no s1rv3s',
'no sirves',
'p3l0tud0',
'p3nd3j0',
'p3ndej0',
'p4j3r0',
'p4j3ro',
'p4jero',
'p4jud0',
'p4jvdo',
'pajero',
'pajudo',
'pel0tudo',
'pel0tvd0',
'pelotudo',
'pendej0',
'pendejo',
'pu70',
'pu74',
'put0',
'put34r',
'put4',
'puta',
'putear',
'puto',
'pvt0',
'pvt34r',
'pvt4',
'pvte4r',
'r37r4s4d0',
'r3trasado',
'r474 1nmvnd4',
'r4ta inmvnda',
'rata inmunda',
're7r4s4do',
'retrasado',
's0r373',
's0r3t3',
's0ret3',
's4lame',
'sal4m3',
'salame',
'soret3',
'sorete',
't0nt0',
't0nt0 d3l c0l0',
't4r4d0',
't4rado',
'tarado',
'ton70',
'tonto',
'tonto del culo',
'tr0l4',
'tr0lo',
'tro10',
'trol4',
'trola',
'trolo',
'v3rg4',
'v3rga',
'v4l3 v3rg4',
'val3 v3rga',
'vale verga',
'verg4',
'verga',
'z0rr4',
'z0rra',
'zor4',
'zorra',
'ñ3r1',
'ñeri',
];
@@ -0,0 +1,171 @@
<?php
declare(strict_types=1);
return [
'b1te',
'b@tard',
'baise',
'baiser',
'baises',
'baisez',
'baisons',
'baisé',
'baisée',
'batard',
'bite',
'bites',
'bordel',
'bouffon',
'bouffonne',
'bouffons',
'bougnoule',
'bougnoules',
'bâtard',
'bâtards',
'caca',
'cafard',
'cafards',
'chie',
'chier',
'chies',
'chiotte',
'chiottes',
'chié',
'chiée',
'clito',
'clitoris',
'con',
'connard',
'connards',
'connasse',
'connasses',
'conne',
'connerie',
'conneries',
'cons',
'couilles',
'couillon',
'couillonne',
'crétin',
'crétine',
'crétins',
'débile',
'débiles',
'défoncer',
'défoncé',
'défoncée',
'défoncés',
'dégueulasse',
'dégueulasses',
'dégueulis',
'encule',
'enculer',
'enculé',
'enculés',
'fdp',
'ferme ta gueule',
'fils de chien',
'fils de pute',
'gode',
'godemichet',
'godemichets',
'godes',
'gouine',
'gouines',
'grognasse',
'grognasses',
'gros cul',
'gros porc',
'merde',
'merdeuse',
'merdeux',
'mongol',
'mongolien',
'mongoliens',
'mongols',
'morue',
'morues',
'nique ta mère',
'nique ta race',
'ntm',
'ntr',
'nègre',
'paki',
'pakis',
'partouze',
'partouzes',
'pd',
'pignouf',
'pipi',
'porc',
'porcs',
'put1',
'puta',
'putain',
'pute',
'pute de luxe',
'pute à fric',
'putes',
'pédé',
'pédés',
'pénis',
'pétasse',
'pétasses',
'queue',
'queues',
'raton',
'ratons',
's@lope',
'salopard',
'salope',
'saloperie',
'salopes',
'sexe',
'sexe anal',
'sexe oral',
'sidaïque',
'sidaïques',
'sodomie',
'sodomiser',
'sodomisé',
'suce',
'sucer',
'suceuse',
'suceuses',
'ta gueule',
'tafiole',
'tafioles',
'tapette',
'tapettes',
'tapin',
'tapineuse',
'tapineuses',
'tapins',
'tarlouze',
'tarlouzes',
'tg',
'travelo',
'travelos',
'trou de balle',
'trou du cul',
'trouduc',
'truie',
'truies',
'turlute',
'turluter',
'turluttes',
'va te faire enculer',
'va te faire foutre',
'vagin',
'vtfe',
'vtff',
'youpin',
'youpine',
'youpines',
'youpins',
'zob',
'éjaculation',
'éjacule',
'éjaculer',
];
@@ -0,0 +1,279 @@
<?php
declare(strict_types=1);
return [
'cazzo',
'dio accecato',
'dio affogato nella merda',
'dio aguzzino',
'dio ammuffito',
'dio appassito',
'dio appestato',
'dio asino',
'dio asociale',
'dio assassino',
'dio assatanato',
'dio ateo',
'dio avvelenato',
'dio bastardo',
'dio bastonato',
'dio becchino',
'dio bestia',
'dio boia',
'dio brufoloso',
'dio buffone',
'dio cagnaccio',
'dio camperista balsamico',
'dio can', // Veneto's version
'dio cancheroso',
'dio cancro',
'dio cane',
'dio cane bastardo',
'dio cannibale',
'dio cappuccio',
'dio castrato',
'dio checca',
'dio ciclista senza sellino',
'dio cleziano',
'dio contrabbandiere',
'dio cornuto',
'dio corrosivo',
'dio ebreo',
'dio ecclesiastico',
'dio evasore fiscale',
'dio fagiano',
'dio falsario',
'dio falso',
'dio fracico',
'dio frocio',
'dio frocione',
'dio fuoribordo',
'dio furioso',
'dio gobbo',
'dio guerrafondaio',
'dio impestato',
'dio improbo',
'dio inculato',
'dio kamikaze',
'dio ladro',
'dio lebbroso',
'dio lupo',
'dio lurido',
'dio mafioso',
'dio maiale',
'dio merda',
'dio monco',
'dio morto de fame',
'dio omertoso',
'dio pagliaccio',
'dio papa',
'dio pennellone',
'dio pezzente',
'dio piegato dalla fica',
'dio pompinaro',
'dio porco',
'dio poser',
'dio povero',
'dio puttaniere',
'dio rospo',
'dio schifoso càn',
'dio serpente',
'dio spacciatore',
'dio sporco',
'dio squallido',
'dio squalo',
'dio stronzo',
'dio sudicio',
'dio suino',
'dio superdotato come si gira si incula',
'dio tamarro',
'dio terrorista',
'dio truffatore',
'dio truzzo',
'dio vaffanculo',
'dio verginello',
'dio zerbino',
'dioaccecato',
'dioaffogatonellamerda',
'dioaguzzino',
'dioammuffito',
'dioappassito',
'dioappestato',
'dioasino',
'dioasociale',
'dioassassino',
'dioassatanato',
'dioateo',
'dioavvelenato',
'diobastardo',
'diobastonato',
'diobecchino',
'diobestia',
'dioboia',
'diobrufoloso',
'diobuffone',
'diocagnaccio',
'diocamperistabalsamico',
'diocancheroso',
'diocancro',
'diocane',
'diocannibale',
'diocappuccio',
'diocastrato',
'diochecca',
'diociclistasenzasellino',
'diocleziano',
'diocontrabbandiere',
'diocornuto',
'diocorrosivo',
'dioebreo',
'dioecclesiastico',
'dioevasorefiscale',
'diofagiano',
'diofalsario',
'diofalso',
'diofracico',
'diofrocio',
'diofrocione',
'diofuoribordo',
'diofurioso',
'diogobbo',
'dioguerrafondaio',
'dioimpestato',
'dioimprobo',
'dioinculato',
'diokamikaze',
'dioladro',
'diolebbroso',
'diolupo',
'diolurido',
'diomafioso',
'diomaiale',
'diomerda',
'diomonco',
'diomorto',
'diomortodefame',
'dioomertoso',
'diopagliaccio',
'diopapa',
'diopennellone',
'diopezzente',
'diopiegatodallafica',
'diopompinaro',
'dioporco',
'dioposer',
'diopovero',
'dioputtaniere',
'diorospo',
'dioschifosocàn',
'dioserpente',
'diospacciatore',
'diosporco',
'diosquallido',
'diosqualo',
'diostronzo',
'diosudicio',
'diosuino',
'diosuperdotatocomesigirasiincula',
'diotamarro',
'dioterrorista',
'diotruffatore',
'diotruzzo',
'diovaffanculo',
'dioverginello',
'diozerbino',
'madonna assassina',
'madonna bandita',
'madonna bastarda',
'madonna battona',
'madonna bocchinara',
'madonna capra',
'madonna cornuta',
'madonna cretina',
'madonna crocifissa',
'madonna diavola',
'madonna discord',
'madonna fracica',
'madonna fricchettona',
'madonna indiavolata',
'madonna ladra',
'madonna lardona',
'madonna lebbrosa',
'madonna lurida',
'madonna maiala',
'madonna maledetta',
'madonna mignotta',
'madonna nana',
'madonna pompinara',
'madonna putrida',
'madonna putrida vacca',
'madonna puttana',
'madonna scoreggiona',
'madonna scrofa in calore',
'madonna sorca',
'madonna strozzina',
'madonna stuprata',
'madonna succhiacazzi',
'madonna suina',
'madonna trivellata',
'madonna troia',
'madonna vigliacca',
'madonna zoccola',
'madonna zoccola da gara',
'madonnaassassina',
'madonnabandita',
'madonnabastarda',
'madonnabattona',
'madonnabocchinara',
'madonnacapra',
'madonnacornuta',
'madonnacretina',
'madonnacrocifissa',
'madonnadiavola',
'madonnadiscord',
'madonnafracica',
'madonnafricchettona',
'madonnaindiavolata',
'madonnaladra',
'madonnalardona',
'madonnalebbrosa',
'madonnalurida',
'madonnamaiala',
'madonnamaledetta',
'madonnamignotta',
'madonnanana',
'madonnapompinara',
'madonnaputrida',
'madonnaputridavacca',
'madonnaputtana',
'madonnascoreggiona',
'madonnascrofaincalore',
'madonnasorca',
'madonnastrozzina',
'madonnastuprata',
'madonnasucchiacazzi',
'madonnasuina',
'madonnatrivellata',
'madonnatroia',
'madonnavigliacca',
'madonnazoccola',
'madonnazoccoladagara',
'mannaggia la madonna',
'mannaggialamadonna',
'porca madonna',
'porcamadonna',
'porco dio',
'porcoddio',
'porcodio',
'porno dio',
'pornodio',
'puttana la madonna',
'puttana madonna',
'puttanalamadonna',
'puttanamadonna',
'stocazzo',
'stronzo',
'stupido',
'vaffanculo',
];
@@ -0,0 +1,47 @@
<?php
declare(strict_types=1);
return [
'あたまおかしい',
'あばずれ',
'あほ',
'あほんだら',
'いいかげんにしろ',
'いかれてる',
'うざい',
'うんこ',
'えくすたしー',
'かくせいざい',
'かす',
'きちがい',
'くず',
'くそ',
'くそがき',
'くそじじい',
'くそったれ',
'しね',
'しゃぶ',
'せくはら',
'たわけ',
'だまれ',
'ちくしょう',
'ちんこ',
'てめえ',
'どあほ',
'ばか',
'ふざけるな',
'ぶす',
'まんこ',
'やくざ',
'やろう',
'ろりこん',
'最低',
'最悪',
'死ね',
'畜生',
'痴漢',
'薬中',
'覚醒剤',
'黙れ',
];
@@ -0,0 +1,136 @@
<?php
declare(strict_types=1);
return [
'aapneuker',
'achterlijke aap',
'anushoofd',
'anuslikker',
'asshole',
'ballenlikker',
'bitch',
'blaaskaak',
'd3bi3l',
'debiel',
'debiele pannenkoek',
'dikke varken',
'drol',
'droplul',
'dumbass',
'f*ck',
'f*k',
'f@ck',
'flikker',
'fuck',
'fuck jou',
'g0dverdomme',
'god verdomme',
'godverdomme',
'grafzeiker',
'gvd',
'gvdhoer',
'h**r',
'h0er',
'h0erenk!nd',
'h0r3n',
'hoer zoon',
'hoerenjong',
'hoerenvent',
'hoerenzoon',
'hufter',
'idioot',
'jodenhoer',
'k4nk3r',
'k4nker',
'kak',
'kakkenest',
'kanker mongool',
'kanker tering',
'kanker wijf',
'kankerflikker',
'kankerhoer',
'kankeridioot',
'kankerlijer',
'kankermongool',
'kankerneger',
'kankertokkie',
'kletskop',
'kloot zak',
'klootzak',
'klote',
'klotenboer',
'klotetreiter',
'klotezak',
'kontneuker',
'kut kind',
'kuthoofd',
'kutjong',
'kutkind',
'kutlul',
'kutvent',
'kutwijf',
'k¥t',
'l!j3r',
'labbekak',
'lul',
'lulhannes',
'lulletje',
'l¥l',
'm0ng00l',
'mietje',
'mongool',
'mongool debiel',
'motherfucker',
'n3uk',
'neger',
'negerhoer',
'neuk',
'neuk mij',
'neuken',
'neuker',
'nikker',
'pleuris idioot',
'pleurislijer',
'prick',
'pussy',
'reetkever',
'reetlikker',
'retard',
'schijt',
'schijtzooi',
'sh1t',
'shit',
'shit hoofd',
'slut',
'strontvlieg',
'sukkel',
't3ring',
'tering lijer',
'tering lul',
'teringdebiel',
'teringhoer',
'teringjood',
'teringlijer',
'teringmongool',
'teringneuker',
'teringpapzak',
'teringvent',
'tr!ngl!jr',
'trut',
'tyfus hoer',
'tyfuslijer',
'tyfusmongool',
'tyfuswijf',
't¥fus',
'verdomme',
'viespeuk',
'wanker',
'zakkewasser',
'zeik',
'zeik straal',
'zeikerd',
'zeiksnor',
'zeikstraal',
'zuiplap',
];
@@ -0,0 +1,139 @@
<?php
return [
'anal',
'anta',
'arrombada',
'arrombado',
'babaca',
'benga',
'besta quadrada',
'bicha',
'bichinha',
'bichona',
'boiola',
'boquete',
'bosta',
'brioco',
'broxa',
'buceta',
'bucetona',
'bucetuda',
'bunda mole',
'bundão',
'burra',
'burro',
'cabecinha',
'cabeça de pica',
'cacete',
'cadela',
'cagada',
'cagão',
'caralho',
'caralhudo',
'chifrudo',
'chupa cu',
'chupa pau',
'chupa pica',
'chupa pinto',
'chupa rola',
'chupador de cu',
'chupador de pau',
'chupador de pica',
'chupador de pinto',
'chupador de rola',
'corna',
'corno',
'cretina',
'cretino',
'crápula',
'cu',
'cu de burro',
'cuzão',
'debil mental',
'desgraçada',
'desgraçado',
'escroto',
'escória',
'fdp',
'fedido',
'fedorento',
'filho da puta',
'foda',
'foda-se',
'fodendo',
'fodido',
'fudido',
'goza',
'gozada',
'horrivel',
'imbecil',
'jumenta',
'jumento',
'ladrao',
'ladrão',
'lambe',
'lixo',
'mamada',
'marica',
'maricona',
'merda',
'merdinha',
'mijão',
'mocorongo',
'molestador',
'mongo',
'mongol',
'mongoloide',
'ninfomaniaca',
'ninfomaniaco',
'nojenta',
'nojentinho',
'nojento',
'orgia',
'otário',
'paneleiro',
'pata de camelo',
'pau no cu',
'pau no rabo',
'piranha',
'piroca',
'porno',
'porra',
'pqp',
'prostituta',
'punheta',
'punheteiro',
'puta',
'puta que pariu',
'putaria',
'putaça',
'rameira',
'retardada',
'retardado',
'rola',
'safada',
'safado',
'suruba',
'tarada',
'tarado',
'traveco',
'trouxa',
'vadia',
'vagaba',
'vagabunda',
'vagabundo',
'vai se ferrar',
'vai se fuder',
'vai tomar no cu',
'verme',
'viadinho',
'viado',
'viado de merda',
'vtmc',
'vtmnc',
'xana',
'xereca',
'xexeca',
'xota',
];
@@ -0,0 +1,221 @@
<?php
return [
'алкаш',
'бастард',
'бля',
'блядвон',
'бляди',
'блядина',
'блядища',
'блядки',
'блядовать',
'блядоеб',
'блядский',
'блядство',
'блядун',
'блядь',
'блять',
'бомжара',
'впизду',
'вхуярить',
'выблядок',
'выебать',
'выебывается',
'выебываться',
'высрать',
'гнида',
'говнецо',
'говнистый',
'говнище',
'говно',
'говнюк',
'говнючка',
'говняк',
'говняный',
'гомик',
'дерьмище',
'дерьмо',
'дерьмовый',
'доебаться',
'долбоеб',
'долбоящер',
'долбоёб',
'дристать',
'дрищ',
'ебало',
'ебальник',
'ебанутый',
'ебаный',
'ебать',
'ебать-копать',
'ебаться',
'еблан',
'ебло',
'ебучий',
'ебучка',
'ебёт',
'жид',
'жиды',
'заебал',
'заебали',
'заебался',
'заебать',
'заебистый',
'заебись',
'засереть',
'засранец',
'засрать',
'захуячить',
'лесбо',
'мерзавец',
'москаль',
'мудак',
'мудила',
'мудило',
'мудозвон',
'наебал',
'наебалово',
'наебать',
'наебка',
'нарик',
'насрал',
'насрать',
'нахуячиться',
'негодяй',
'нехуй',
'нигга',
'ниггер',
'нимфоманка',
'нихуя',
'обосравшийся',
'обосрал',
'обосрать',
'обосраться',
'обоссать',
'обоссы',
'обсирать',
'опиздолить',
'отъебаться',
'отъебись',
'охуевший',
'охуел',
'охуенно',
'охуенный',
'охуеть',
'педераст',
'педик',
'перехуярить',
'пидарас',
'пидор',
'пидорас',
'пидорасы',
'пидоры',
'пидорёныш',
'пизда',
'пизданул',
'пизданутый',
'пиздануть',
'пиздатее',
'пиздато',
'пиздатый',
'пиздеж',
'пиздеть',
'пиздец',
'пиздишь',
'пиздобол',
'пиздобратия',
'пиздой',
'пиздомать',
'пиздуй',
'пизды',
'пиздюк',
'пиздюлина',
'пиздюлить',
'пиздюля',
'пиздёж',
'пиздёныш',
'подонок',
'подъебать',
'подъебка',
'поебень',
'похуй',
'похую',
'проебал',
'проебать',
'просрал',
'просрать',
'проститутка',
'проёб',
'разпиздеть',
'разхуячить',
'распиздяй',
'распиздяйство',
'сволочь',
'скотина',
'спиздил',
'спиздить',
'спизжен',
'спизженный',
'сраный',
'срать',
'сраться',
'срачуга',
'срущий',
'ссаный',
'ссать',
'сука',
'сука блять',
'суки',
'сукин',
'сукин сын',
'сучара',
'сучий',
'сучка',
'сучонок',
'схуяли',
'съебал',
'съебаться',
'тварь',
'ублюдки',
'ублюдок',
'узкоглазый',
'урод',
'уроды',
'хач',
'хачи',
'хохлы',
'хохол',
'хуево',
'хуевый',
'хуеплет',
'хуеплёт',
'хуерик',
'хуесос',
'хуесосы',
'хуи',
'хуила',
'хуило',
'хуиня',
'хуистый',
'хуй',
'хуйней',
'хуйни',
'хуйня',
'хуйще',
'хую',
'хуя',
'хуяк',
'хуякать',
'хуярить',
'хуярь',
'хуячить',
'хуёво',
'хуёвый',
'черножопый',
'чурка',
'чурки',
'шалава',
'шлюха',
'шлюшка',
];
@@ -0,0 +1,62 @@
<?php
declare(strict_types=1);
return [
'丑八怪',
'他妈',
'他娘',
'他马',
'你妈',
'你妹',
'你娘',
'你绿了',
'傻屌',
'傻批',
'傻逼',
'去死',
'变态',
'哈批',
'哈比',
'哈逼',
'她妈',
'她娘',
'她马',
'它妈',
'它娘',
'它马',
'屁眼',
'屌',
'干你妈逼',
'干你娘',
'干娘',
'操你',
'操你妈',
'操尼玛',
'操死你',
'死了',
'汉奸',
'沙碧',
'滚你妈逼',
'滚尼玛币',
'滚尼玛逼',
'煞笔',
'狗儿子',
'狗日的',
'白痴',
'笨蛋',
'脑残',
'艹你妈',
'艹尼玛',
'艹死你',
'草你妈',
'草尼玛',
'草死你',
'贱人',
'贱种',
'贱货',
'轮奸',
'鸡八',
'鸡巴',
'鸡鸡',
];
@@ -0,0 +1,60 @@
<?php
declare(strict_types=1);
return [
'三小',
'他娘',
'他媽',
'他馬',
'你妹',
'你娘',
'你媽',
'你綠了',
'傻逼',
'去死',
'她娘',
'她媽',
'她馬',
'它娘',
'它媽',
'它馬',
'尛',
'屁眼',
'屌',
'幹你',
'幹你娘',
'幹你老師',
'幹你老母',
'幹娘',
'幹尼瑪',
'幹林娘',
'恁娘',
'操你',
'操你媽',
'操死你',
'機八',
'機掰',
'死了',
'白痴',
'白癡',
'白目',
'笨蛋',
'腦殘',
'艹',
'艹你媽',
'艹死你',
'草你媽',
'草尼瑪',
'草死你',
'變態',
'賤人',
'賤種',
'賤貨',
'輪姦',
'醜八怪',
'雞八',
'雞巴',
'雞掰',
'雞雞',
];
@@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity\Contracts;
/**
* @internal
*/
interface Logger
{
public function append(string $path, array $profanity): void;
/**
* Outputs the coverage report.
*/
public function output(): void;
}
@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity;
/**
* @internal
*/
final class Error
{
/**
* Creates a new profanity error instance.
*/
public function __construct(
public readonly string $file,
public readonly int $line,
public readonly string $word,
) {
//
}
/**
* Returns the short type of the error.
*/
public function getShortType(): string
{
return 'pr';
}
}
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity\Logging;
use Pest\Profanity\Contracts\Logger;
/**
* @internal
*/
final class JsonLogger implements Logger
{
/**
* Creates a new Logger instance.
*
* @param array<int, array<string, mixed>> $logs
*/
public function __construct(
private readonly string $outputPath,
private array $logs = [],
) {
//
}
/**
* {@inheritDoc}
*/
public function append(string $path, array $profanity): void
{
$this->logs[] = [
'file' => $path,
'profanity' => $profanity,
];
}
/**
* {@inheritDoc}
*/
public function output(): void
{
$json = json_encode([
'format' => 'pest',
'result' => $this->logs,
], JSON_THROW_ON_ERROR);
file_put_contents($this->outputPath, $json);
}
}
@@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity\Logging;
use Pest\Profanity\Contracts\Logger;
/**
* @internal
*/
final class NullLogger implements Logger
{
/**
* {@inheritDoc}
*/
public function append(string $path, array $profanity): void
{
//
}
/**
* {@inheritDoc}
*/
public function output(): void
{
//
}
}
@@ -0,0 +1,60 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity;
use function Termwind\render;
use function Termwind\terminal;
/**
* @internal
*/
class Output
{
public static function successMessage(string $message): void
{
render(<<<HTML
<div class="my-1">
<span class="ml-2 px-1 bg-green font-bold">PASS</span>
<span class="ml-1">$message</span>
</div>
HTML);
}
public static function errorMessage(string $message): void
{
render(<<<HTML
<div class="my-1">
<span class="ml-2 px-1 bg-red font-bold">ERROR</span>
<span class="ml-1">$message</span>
</div>
HTML);
}
public static function pass(string $path): void
{
$truncateAt = max(1, terminal()->width() - 24);
render(<<<HTML
<div class="flex mx-2">
<span class="truncate-{$truncateAt}">$path</span>
<span class="flex-1 content-repeat-[.] text-gray mx-1"></span>
<span class="text-green">OK</span>
</div>
HTML);
}
public static function fail(string $path, string $feedback): void
{
$truncateAt = max(1, terminal()->width() - 24);
render(<<<HTML
<div class="flex mx-2">
<span class="truncate-{$truncateAt}">{$path}</span>
<span class="flex-1 content-repeat-[.] text-gray mx-1"></span>
<span class="text-red">$feedback</span>
</div>
HTML);
}
}
@@ -0,0 +1,201 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity;
use Pest\Contracts\Plugins\HandlesOriginalArguments;
use Pest\Plugins\Concerns\HandleArguments;
use Pest\Profanity\Contracts\Logger;
use Pest\Profanity\Logging\JsonLogger;
use Pest\Profanity\Logging\NullLogger;
use Pest\Profanity\Support\ConfigurationSourceDetector;
use Pest\TestSuite;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Finder\Finder;
use function Termwind\renderUsing;
/**
* @internal
*/
class Plugin implements HandlesOriginalArguments
{
use HandleArguments;
/**
* @var array<string>
*/
private array $excludeWords = [];
/**
* @var array<string>
*/
private array $includeWords = [];
/**
* @var array<string>|null
*/
private $languages = null;
private bool $compact = false;
/**
* The logger used to output profanity to a file.
*/
private Logger $profanityLogger;
/**
* Creates a new Plugin instance.
*/
public function __construct(
private readonly OutputInterface $output
) {
$this->profanityLogger = new NullLogger;
}
/**
* {@inheritdoc}
*/
public function handleOriginalArguments(array $arguments): void
{
if (! $this->hasArgument('--profanity', $arguments)) {
return;
}
foreach ($arguments as $key => $argument) {
if (str_starts_with($argument, '--exclude=')) {
$words = explode(',', substr($argument, strlen('--exclude=')));
$this->excludeWords = array_merge($this->excludeWords, $words);
unset($arguments[$key]);
}
if (str_starts_with($argument, '--include=')) {
$words = explode(',', substr($argument, strlen('--include=')));
$this->includeWords = array_merge($this->includeWords, $words);
unset($arguments[$key]);
}
if (str_starts_with($argument, '--language=')) {
$languageValue = substr($argument, strlen('--language='));
$this->languages = explode(',', $languageValue);
$invalidLanguages = Validator::validateLanguages($this->languages);
unset($arguments[$key]);
}
if (str_starts_with($argument, '--compact')) {
$this->compact = true;
unset($arguments[$key]);
}
if (str_starts_with($argument, '--output=')) {
$outputPath = explode('=', $argument)[1] ?? null;
if (empty($outputPath)) {
Output::errorMessage('No output path provided for [--profanity-json].');
$this->exit(1);
}
$this->profanityLogger = new JsonLogger(explode('=', $argument)[1]);
}
}
if (! empty($invalidLanguages)) {
$invalidLangsStr = implode(', ', $invalidLanguages);
Output::errorMessage("The specified language does not exist: $invalidLangsStr");
$this->output->writeln(['']);
$this->output->writeln('<info>Available languages:</info>');
$profanitiesDir = __DIR__.'/Config/profanities';
$availableLanguages = array_map(
fn ($file) => basename($file, '.php'),
glob("$profanitiesDir/*.php")
);
$this->output->writeln(implode(', ', $availableLanguages));
$this->output->writeln(['']);
$this->exit(1);
}
$source = ConfigurationSourceDetector::detect();
if ($source === []) {
Output::errorMessage('No source section found. Did you forget to add a `source` section to your `phpunit.xml` file?');
$this->exit(1);
}
$files = Finder::create()
->in($source)
->name('*.php')
->notPath('Config/profanities')
->notPath('src/Config/profanities')
->files();
$filesWithProfanity = [];
$totalProfanities = 0;
$this->output->writeln(['']);
Analyser::analyse(
array_keys(iterator_to_array($files)),
function (Result $result) use (&$filesWithProfanity, &$totalProfanities): void {
$path = str_replace(TestSuite::getInstance()->rootPath.'/', '', $result->file);
$errors = $result->errors;
if (empty($errors)) {
if (! $this->compact) {
renderUsing($this->output);
Output::pass($path);
$this->profanityLogger->append($path, []);
}
} else {
$filesWithProfanity[] = $path;
$totalProfanities += count($errors);
usort($errors, fn ($a, $b): int => $a->line <=> $b->line);
$profanityLines = [];
foreach ($errors as $error) {
$profanityLines[] = $error->getShortType().$error->line.'('.$error->word.')';
}
$this->profanityLogger->append($path, $profanityLines);
$profanityLines = implode(', ', $profanityLines);
renderUsing($this->output);
Output::fail($path, $profanityLines);
}
},
$this->excludeWords,
$this->includeWords,
$this->languages
);
$filesWithProfanityCount = count($filesWithProfanity);
$exitCode = (int) (! empty($filesWithProfanity));
$this->profanityLogger->output();
if ($exitCode === 1) {
$instanceWord = $totalProfanities === 1 ? 'instance' : 'instances';
$filesWord = $filesWithProfanityCount === 1 ? 'file' : 'files';
Output::errorMessage("Found $totalProfanities $instanceWord of profanity in $filesWithProfanityCount $filesWord");
} else {
Output::successMessage('No profanity found in your application!');
}
$this->output->writeln(['']);
$this->exit($exitCode);
}
/**
* Exits the process with the given code.
*/
public function exit(int $code): never
{
exit($code);
}
}
@@ -0,0 +1,73 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity;
/**
* @internal
*/
final class ProfanityAnalyser
{
/**
* Scan a file for profanity
*
* @param array<string> $excludingWords
* @param array<string> $includingWords
* @param array<string>|null $languages
* @return array<int, Error>
*/
public static function analyse(string $file, array $excludingWords = [], array $includingWords = [], $languages = null): array
{
$words = [];
$profanitiesDir = __DIR__.'/Config/profanities';
$errors = [];
if (str_contains($file, '/Config/profanities/')) {
return [];
}
if (($profanitiesFiles = scandir($profanitiesDir)) === false) {
return [];
}
$profanitiesFiles = array_diff($profanitiesFiles, ['.', '..']);
if ($languages) {
foreach ($languages as $lang) {
$specificLanguage = "$profanitiesDir/$lang.php";
if (file_exists($specificLanguage)) {
$words = array_merge(
$words,
include $specificLanguage
);
}
}
} else {
$words = include "$profanitiesDir/en.php";
}
$words = array_merge($words, $includingWords);
$words = array_diff($words, $excludingWords);
$fileContents = (string) file_get_contents($file);
$lines = explode("\n", $fileContents);
$foundProfanity = [];
foreach ($words as $word) {
foreach ($lines as $lineNumber => $line) {
$key = $lineNumber.'-'.$word;
if (preg_match('/(?<!\p{L})'.preg_quote($word, '/').'(?!\p{L})/iu', $line) === 1 && ! isset($foundProfanity[$key])) {
// Skip reporting profanity if the line contains the ignore annotation
if (! str_contains($line, '@pest-ignore-profanity')) {
$errors[] = new Error($file, $lineNumber + 1, $word);
$foundProfanity[$key] = true;
}
}
}
}
return $errors;
}
}
@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity;
/**
* @internal
*/
final class Result
{
/**
* Creates a new result instance.
*
* @param array<int, Error> $errors
*/
public function __construct(
public readonly string $file,
public readonly array $errors,
) {
//
}
}
@@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity\Support;
use PHPUnit\TextUI\CliArguments\Builder;
use PHPUnit\TextUI\CliArguments\XmlConfigurationFileFinder;
use PHPUnit\TextUI\Configuration\FilterDirectory;
use PHPUnit\TextUI\XmlConfiguration\DefaultConfiguration;
use PHPUnit\TextUI\XmlConfiguration\Loader;
/**
* @internal
*/
final class ConfigurationSourceDetector
{
/**
* Detects the "source" of the configuration.
*
* @return array<int, string>
*/
public static function detect(): array
{
$cliConfiguration = (new Builder)->fromParameters([]);
$configurationFile = (new XmlConfigurationFileFinder)->find($cliConfiguration);
$xmlConfiguration = DefaultConfiguration::create();
if (is_string($configurationFile)) {
$xmlConfiguration = (new Loader)->load($configurationFile);
}
return array_map(
fn (FilterDirectory $directory): string => (string) realpath($directory->path()),
$xmlConfiguration->source()->includeDirectories()->asArray()
);
}
}
@@ -0,0 +1,65 @@
<?php
declare(strict_types=1);
namespace JonPurvis\Profanify\Support;
final class Russian
{
private static string $pattern = '/[А-Яа-яЁё]+/u';
private bool $detected = false;
/** @var array<string, string> */
private static array $normalized = [];
/** @var array<int|string, string> */
private static array $toNormalize = [
'3' => 'з', '4' => 'ч', '6' => 'б',
'a' => 'а', 'c' => 'с', 'e' => 'е', 'o' => 'о', 'p' => 'р', 'x' => 'х', 'k' => 'к',
'A' => 'д', 'r' => 'г', 'H' => 'н', 'M' => 'м', 'T' => 'т', 'B' => 'в',
];
public function is(string $text): bool
{
if ((bool) preg_match(self::$pattern, $text)) {
$this->detected = true;
}
return $this->detected;
}
public function isDetected(): bool
{
return $this->detected;
}
public static function pattern(): string
{
return self::$pattern;
}
public static function normalize(string $text): string
{
preg_match_all('/\w+/u', $text, $words);
$toNormalizeKeysString = implode('', array_keys(self::$toNormalize));
foreach ($words[0] as $word) {
if (strpbrk($word, $toNormalizeKeysString)) {
$normalized = strtr($word, self::$toNormalize);
self::$normalized[$word] = $normalized;
}
}
return str_replace(array_keys(self::$normalized), array_values(self::$normalized), $text);
}
/**
* @param array<string> $profanities
* @return array<string>
*/
public static function backToOrigin(array $profanities): array
{
return array_map(fn ($profanity): string => array_search($profanity, self::$normalized) ?: $profanity, $profanities);
}
}
@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace Pest\Profanity;
/**
* @internal
*/
class Validator
{
/**
* Validates that the specified languages exist in the profanities directory.
*
* @param array<string>|null $languages
* @return array<int, string> List of languages that don't exist
*/
public static function validateLanguages(?array $languages): array
{
if ($languages === null) {
return [];
}
$profanitiesDir = __DIR__.'/Config/profanities';
$invalidLanguages = [];
foreach ($languages as $language) {
$specificLanguage = "$profanitiesDir/$language.php";
if (! file_exists($specificLanguage)) {
$invalidLanguages[] = $language;
}
}
return $invalidLanguages;
}
}