Merge pull request #20 from M82-project/BartPatch

Bart patch
Этот коммит содержится в:
Sebastien Larinier 2025-07-29 11:53:57 +02:00 коммит произвёл GitHub
родитель 106313c1f1 769df8eb5d
Коммит fb8ef33b28
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
4 изменённых файлов: 109 добавлений и 16 удалений

Просмотреть файл

@ -86,6 +86,8 @@ const DIMA_ENHANCED_KEYWORDS = {
], ],
}, },
temporal: ["imminent", "proche", "bientôt", "soon", "approaching"], temporal: ["imminent", "proche", "bientôt", "soon", "approaching"],
formal: ["situation critique", "état d'urgence", "alerte maximale"],
informal: ["c'est la cata", "on est foutu", "ça craint"],
}, },
patterns: [ patterns: [
/(?:alerte|alert|warning|attention)\s+(?:rouge|red|maximum)/i, /(?:alerte|alert|warning|attention)\s+(?:rouge|red|maximum)/i,
@ -126,6 +128,43 @@ const DIMA_ENHANCED_KEYWORDS = {
/(?:expire|ends?)\s+(?:bientôt|soon|today|demain|tomorrow)/i, /(?:expire|ends?)\s+(?:bientôt|soon|today|demain|tomorrow)/i,
], ],
}, },
TE0251: {
core: ["tout le monde", "consensus", "everyone", "la plupart", "most people", "nous pensons", "we think"],
variants: {
universal_claims: [
"personne ne peut nier",
"nobody can deny",
"c'est du bon sens",
"it's common sense",
"chacun sait que",
"everyone knows"
],
majority_appeals: [
"la majorité pense",
"the majority thinks",
"l'opinion générale",
"most agree"
]
},
patterns: [
/(?:tout le monde|everyone)\s+(?:sait|knows?|dit|says?)/i,
/(?:la plupart|most)\s+(?:des gens|people)\s+(?:pensent|think)/i
],
},
TE0422: {
core: ["autorité", "authority", "expert", "spécialiste", "specialist", "professeur", "professor", "docteur", "doctor", "officiel"],
variants: {
titles: ["Dr.", "Pr.", "Prof.", "PhD", "expert reconnu", "spécialiste renommé"],
institutions: ["selon Harvard", "université de", "une étude de", "des chercheurs de"],
appeal_phrases: ["selon les experts", "la science prouve", "études montrent", "scientifiquement prouvé"]
},
patterns: [
/(?:selon|according to)\s+(?:les?\s+)?(?:experts?|spécialistes?)/i,
/(?:étude|study|research)\s+(?:révèle|shows?|démontre)/i,
/(?:Dr\.|Prof\.|PhD)\s+\w+\s+(?:affirme|says?)/i
],
},
}; };
const CONTEXT_PATTERNS = { const CONTEXT_PATTERNS = {

Просмотреть файл

@ -121,6 +121,8 @@ const DIMA_TECHNIQUES = [
"case", "case",
"témoignage", "témoignage",
"testimony", "testimony",
"histoire vraie", "true story", "vécu", "expérience", "prenons l'exemple",
"take the example","illustration", "démonstration", "spécimen", "par exemple", "for example"
], ],
weight: 1.0, weight: 1.0,
type: "technique", type: "technique",
@ -132,10 +134,8 @@ const DIMA_TECHNIQUES = [
phase: "Detect", phase: "Detect",
description: "Répétition pour créer une familiarité artificielle", description: "Répétition pour créer une familiarité artificielle",
mots_cles: [ mots_cles: [
"encore", "encore et toujours",
"again", "again and again",
"toujours",
"always",
"répétition", "répétition",
"repetition", "repetition",
"familier", "familier",
@ -159,6 +159,8 @@ const DIMA_TECHNIQUES = [
"frequent", "frequent",
"épidémie", "épidémie",
"epidemic", "epidemic",
"sans cesse", "constantly", "en permanence", "all the time", "se répand", "spreading",
"prolifère", "multiplies", "tendance", "trend", "phénomène", "phenomenon", "on en parle partout"
], ],
weight: 1.1, weight: 1.1,
type: "technique", type: "technique",
@ -174,8 +176,7 @@ const DIMA_TECHNIQUES = [
"same as", "same as",
"cela rappelle", "cela rappelle",
"déjà vu", "déjà vu",
"par ailleurs", "dans ce contexte",
"contexte",
], ],
weight: 0.9, weight: 0.9,
type: "technique", type: "technique",
@ -198,6 +199,8 @@ const DIMA_TECHNIQUES = [
"shocking", "shocking",
"inhabituel", "inhabituel",
"unusual", "unusual",
"surprenant", "surprising", "inattendu", "unexpected", "anormal", "abnormal", "hors norme", "extraordinary",
"stupéfiant", "mind-blowing", "hallucinant", "unbelievable", "jamais vu", "never seen", "renversant"
], ],
weight: 1.3, weight: 1.3,
type: "technique", type: "technique",
@ -232,8 +235,11 @@ const DIMA_TECHNIQUES = [
phase: "Detect", phase: "Detect",
description: "Mise en avant de l'unicité pour marquer les esprits", description: "Mise en avant de l'unicité pour marquer les esprits",
mots_cles: [ mots_cles: [
"unique", "uniquement",
"seul", "seuleument",
"rien de comparable",
"sans comparaison",
"sans équivalent",
"only", "only",
"exclusif", "exclusif",
"exclusive", "exclusive",
@ -453,6 +459,9 @@ const DIMA_TECHNIQUES = [
"selon une étude", "selon une étude",
"un témoignage", "un témoignage",
"un témoin", "un témoin",
"prenons l'exemple de", "regardez le cas de", "voici l'histoire de", "j'ai un ami qui", "mon voisin",
"cela prouve que", "this proves that", "la preuve c'est que", "comme le montre", "cet exemple illustre",
"une connaissance", "dans ma famille", "someone I know", "consider the case of"
], ],
weight: 1.4, weight: 1.4,
type: "technique", type: "technique",
@ -483,15 +492,13 @@ const DIMA_TECHNIQUES = [
"stéréotype", "stéréotype",
"les étrangers", "les étrangers",
"les immigrants", "les immigrants",
"all the",
"toujours",
"always",
"jamais",
"never",
"en général", "en général",
"in general", "in general",
"les français", "les français",
"americans", "americans",
"tous les", "toutes les", "every single", "sans exception", "généralement", "typically",
"ils sont tous", "comme tous les", "usually they", "systématiquement", "invariablement",
"à chaque fois", "every time", "c'est toujours comme ça", "always the same", "c'est typique des"
], ],
weight: 1.6, weight: 1.6,
type: "technique", type: "technique",
@ -544,6 +551,9 @@ const DIMA_TECHNIQUES = [
"suffit de", "suffit de",
"just need to", "just need to",
"solution", "solution",
"basique", "basic", "élémentaire", "elementary", "logique", "logical", "naturel", "natural",
"sans effort", "effortless", "automatique", "automatic", "c'est simple", "it's simple",
"il suffit de", "la solution est simple", "the solution is simple"
], ],
weight: 1.3, weight: 1.3,
type: "technique", type: "technique",
@ -659,7 +669,9 @@ const DIMA_TECHNIQUES = [
"sources confirment", "sources confirment",
"rien ne démontre", "rien ne démontre",
"hasard ?", "hasard ?",
"les faits", "les faits rapportés",
"selon certains", "some say", "il paraît que", "apparently", "on dit que", "they say",
"j'ai entendu dire", "I heard", "des experts", "some experts", "certaines sources", "various sources"
], ],
weight: 1.2, weight: 1.2,
type: "technique", type: "technique",
@ -692,6 +704,9 @@ const DIMA_TECHNIQUES = [
"image", "image",
"imaginez", "imaginez",
"supposons", "supposons",
"visualisez", "visualize", "pensez à", "think about", "ne trouvez-vous pas", "don't you think",
"n'est-ce pas", "isn't it", "si jamais", "what if", "dans l'hypothèse", "hypothetically",
"cela rappelle", "this reminds", "picture this"
], ],
weight: 1.1, weight: 1.1,
type: "technique", type: "technique",
@ -715,6 +730,9 @@ const DIMA_TECHNIQUES = [
"i was right", "i was right",
"évident", "évident",
"obvious", "obvious",
"valide", "validates", "corrobore", "corroborates", "je le savais", "I knew it", "exactement", "exactly",
"forcément", "inevitably", "logiquement", "logically", "cela confirme", "this confirms",
"comme attendu", "as anticipated", "évidemment", "obviously"
], ],
weight: 1.5, weight: 1.5,
type: "technique", type: "technique",
@ -770,6 +788,7 @@ const DIMA_TECHNIQUES = [
description: "Mise en avant des bénéfices personnels pour motiver l'action", description: "Mise en avant des bénéfices personnels pour motiver l'action",
mots_cles: [ mots_cles: [
"vous bénéficiez", "vous bénéficiez",
"vous gagnez",
"you benefit", "you benefit",
"votre avantage", "votre avantage",
"your advantage", "your advantage",
@ -828,11 +847,13 @@ const DIMA_TECHNIQUES = [
"confident", "confident",
"sûr", "sûr",
"sure", "sure",
"certain",
"capable", "capable",
"expert", "expert",
"maîtrise", "maîtrise",
"mastery", "mastery",
"assuré", "assured", "convaincu", "convinced", "spécialiste", "specialist", "professionnel", "professional",
"indubitable", "undoubtable", "incontestable", "unquestionable", "je suis sûr", "i am sure",
"sans aucun doute", "without a doubt", "évidemment", "obviously"
], ],
weight: 1.2, weight: 1.2,
type: "technique", type: "technique",
@ -852,6 +873,9 @@ const DIMA_TECHNIQUES = [
"invest more", "invest more",
"ne pas abandonner", "ne pas abandonner",
"don't give up", "don't give up",
"persévérer", "persevere", "tenir bon", "hold on", "doubler la mise", "double down",
"aller plus loin", "go further", "s'engager", "commit", "ne pas lâcher", "don't quit",
"continue à", "continue to", "keep going", "coûte que coûte", "quoi qu'il en coûte"
], ],
weight: 1.1, weight: 1.1,
type: "technique", type: "technique",
@ -893,6 +917,9 @@ const DIMA_TECHNIQUES = [
"status quo", "status quo",
"comme ça", "comme ça",
"as is", "as is",
"stabilité", "stability", "équilibre", "balance", "préserver", "preserve", "garder", "keep",
"résister au changement", "resist change", "mieux vaut rester", "better to stay",
"ne changeons rien", "let's not change", "comme avant", "as before"
], ],
weight: 1.0, weight: 1.0,
type: "technique", type: "technique",

Просмотреть файл

@ -130,8 +130,21 @@ class ContentExtractor {
"advertisement", "advertisement",
"social", "social",
"share", "share",
"cookie", "popup", "modal", "overlay", "banner", "newsletter",
"related", "suggest", "recommend", "widget", "promo", "promotion",
"comment", "rating", "review", "breadcrumb", "pagination", "tag",
"metadata", "byline", "author-bio", "subscription", "paywall"
];
const skipIds = ["nav", "menu", "footer", "header", "sidebar", "comments","cookie-banner", "newsletter", "popup", "modal", "overlay",
"related-articles", "advertisement", "social-sharing"];
const skipAttributes = [
'data-module="Advertisement"',
'data-component="SocialShare"',
'data-track-component="Newsletter"',
'role="banner"',
'role="navigation"',
'role="complementary"'
]; ];
const skipIds = ["nav", "menu", "footer", "header", "sidebar", "comments"];
const className = element.className?.toLowerCase() || ""; const className = element.className?.toLowerCase() || "";
const id = element.id?.toLowerCase() || ""; const id = element.id?.toLowerCase() || "";
@ -139,7 +152,10 @@ class ContentExtractor {
return ( return (
skipClasses.some((skip) => className.includes(skip)) || skipClasses.some((skip) => className.includes(skip)) ||
skipIds.some((skip) => id.includes(skip)) || skipIds.some((skip) => id.includes(skip)) ||
skipAttributes.some((attr) => element.getAttribute(attr.split('=')[0]) === attr.split('=')[1]?.replace(/"/g, '')) ||
element.getAttribute("aria-hidden") === "true" || element.getAttribute("aria-hidden") === "true" ||
element.getAttribute("role") === "banner" ||
element.getAttribute("role") === "navigation" ||
getComputedStyle(element).display === "none" getComputedStyle(element).display === "none"
); );
} }

Просмотреть файл

@ -378,6 +378,17 @@ class TechniqueAnalyzer {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
} }
calculatePositionWeight(position, textLength) {
const relativePosition = position / textLength;
// Boost pour les éléments en début de texte (titres, accroches)
if (relativePosition < 0.15) return 1.4;
// Boost modéré pour le premier tiers
if (relativePosition < 0.33) return 1.1;
// Boost pour la fin (conclusions, appels à l'action)
if (relativePosition > 0.85) return 1.2;
// Poids normal pour le milieu
return 1.0;
}
calculateRiskLevel(score) { calculateRiskLevel(score) {
if (score < 15) return "Faible"; if (score < 15) return "Faible";
if (score < 30) return "Modéré"; if (score < 30) return "Modéré";