“Les 12 Meilleurs Internet Casinos En Ligne En France 2024

Meilleurs Casinos En Ligne: Les 11 Web Sites Français Fiables En 2024

En plus de sa variété sobre jeux, Azur Gambling establishment propose également dieses bonus attractifs qui peuvent considérablement forcir vos chances sobre gagner dès vos premiers dépôts. Cresus Casino se positionne comme l’un des leaders grâce à son interface intuitive et son impressionnante sélection de jeux. De plus, Lucky8 Casino garantit votre expérience de jeu fluide et agréable, idéale pour des joueurs en quête de” “variété. Enfin, Azur Gambling establishment se démarque equiparable son service consumer exceptionnel et sa large gamme sobre jeux.

Malgré les défis mondiaux, l’amour des Français pour des paris en ligne – des sports ain courses hippiques” “au poker – n’a fait que ze renforcer, grâce à la surveillance para l’Autorité nationale kklk jeux (ANJ). Maintenant, avec des quantité d’euros en jeu, le marché ni casino en segment en métropole est as well as dynamique que jamais. Que tu sois un joueur débutant à la recherche de ton premier casino en hachure, ou un habitué des jeux sobre ligne en quête de nouvelles expériences, Casino en trait France est konstruera destination privilégiée. Nous t’offrons des revues détaillées, des conseils d’experts et la majorité des dernières informations pour t’aider à faire des choix éclairés.

Gamdom Casino

Un reward offert aux derniers joueurs lors de leur première ouverture de compte auprès d’un casino. Ainsi, après avoir décidé qu’un bonus particulier vous intéresse, les joueurs devez analyser sobrement toutes les informations en vente libre. Habituellement, vous devez trouver tout ce dont vous avez besoin dans los angeles section bonus man casino officiel. Mais les conditions entre ma plupart des conseil sont à peu près identiques, alors séparons-les en varieties. Avant de réclamer un bonus, les joueurs devez comprendre o qual chaque offre a des termes ainsi que conditions que vous devez respecter. Après tout, aussi bons soient-ils, les Des casinos en hachure en métropole ne fourniront pas simplement des fonds gratuits que vous pourrez utiliser à votre guise casino en ligne.

Que vous soyez en France ou autre part, les joueurs à la recherche kklk meilleures expériences auront accès à ci-dessous des internet casinos adaptés à leurs besoins spécifiques. Pour précision, les casinos français sur internet énumérés sur cette liste noire ne seront pas de” “facto des plateformes véreuses à éviter. En effet, l’ANJ (anciennement ARJEL) applique votre loi très de premier ordre en matière d’interdiction de jeux d’argent, qui touche tous les joueurs français. L’ANJ accorde l’agrément aux opérateurs de jeux en ligne ou exige le respect de critères stricts tels que la protection des internautes et la pugilat contre le blanchiment d’argent. Il contrôle également les opérateurs agréés pour assurer leur conformité aux réglementations.

Quel Est L’âge Légal Pour Jouer En Ligne Aux Jeux D’argent?

Ces conseil peuvent vous produire de l’argent benefit, des tours gratuits, ou des remboursements sur vos pertes, ce qui vous donne la possibilité de jouer as well as longtemps sans dépenser plus. Pour ceux qui aiment l’aventure, des titres comme ‘Book of Charms’ et ‘Lucky Jack port Lost Jungle’ apportent des expériences palpitantes avec des graphismes impressionnants et dieses histoires captivantes. Les machines à sous ne sont pas seulement un moyen de divertissement, elles peuvent aussi vous rapporter des gains considérables grâce à leurs multiples fonctionnalités bonus et travels gratuits.

Ici, chaque mot-clé vous guide vers un choix éclairé, chaque détail the été pensé put répondre à vos attentes les as well as exigeantes. 10 juillet 2024 — L’ANJ prône une économie ludique punitive « Isabelle FALQUE PIERROTIN — la Présidente de l’Autorité Nationale kklk jeux (ANJ) – prône une économie ludique punitive, restricted, sanitair… Assurez-vous para fournir la majorité des data nécessaires pour accélérer le processus de retrait. Ils permettent de découvrir sobre nouveaux titres systems de jouer sur des favoris sans engager de professionnels, ain parfois même para décrocher des jackpots sans avoir misé un centime.”

Comment Nous-mêmes Testons Et Comparons Les Casinos Sobre Ligne

Que vous recherchiez votre oasis de equipment à sous ou un paradis para jeux de table, cette liste some sort of été conçue put satisfaire beaucoup de goûts. Philippe Latombe put autoriser les exploitants de casinos à proposer des amusements en ligne. Selon cette proposition, el moratoire de cinq ans serait instauré, durant lequel des jeux de gambling establishment seraient légaux uniquement pour les professionnels nationaux existants. La proposition de loi a été déposée le 23 no 2023 à l’Assemblée nationale et renvoyée à la Commission rate des lois. Les prochaines étapes incluent les discussions en commission et l’examen en séance publique à l’Assemblée.

Grâce à Web et aux solutions informatiques, toute unité en âge sobre le faire peut s’inscrire sur un portail web de jeu virtuel et jouer à tous les jeux qui lui plaisent. Dans la suite du texte, vous découvrirez les jeux de casino les plus appréciés kklk français, ainsi o qual les différents methods bonus pour sumado a accéder. Il reste donc tout à fait normal que de plus durante plus de joueurs se laissent tenter par cette facilité très accessible en se promenant sur Internet.

Choisissez Este Casino En Hachure Réputé

Heureusement, si les internautes peuvent s’inscrire sur des sites sobre casino étrangers, una sélection sera illimitée. Les casinos sur internet étant interdits en métropole, ce sont des paris sportifs quel professionnel dominent le marché du jeu sobre ligne. Les méthodes de retrait sur les sites sobre jeux de hasard offrent une variété d’options pour permettre aux joueurs d’avoir le plus para choix possible. Cependant, il est essential de noter la cual des méthodes comme il se trouve que Paypal, Paysafecard ou Skrill ne deviennent pas disponibles en métropole.” “[newline]Avant de choisir, assurez-vous de vous renseigner sur les différentes options de paiement. Pour augmenter vos chances de économiser sur les sites, arianne est essentiel para jouer aux amusements que vous connaissez. Pour faciliter ce fait, nous avons los à votre personality une sélection sobre jeux de on line casino en ligne gratuits sur notre site.

Nous vous proposons de découvrir ci-dessous les meilleurs processeurs sur les sites français. La license et la réglementation sont des indicateurs clés de una légitimité d’un online casino en ligne. Une licence délivrée doble une autorité reconnue, comme la Fanghiglia Gambling Authority ou l’Autorité nationale dieses Jeux (ANJ) en France, garantit que the casino suit des normes strictes.

🎁 Benefit Sans Dépôt

Les outils d’auto-exclusion sont une bouée de sauvetage put ceux qui sentent l’appel du jeu devenir trop ft. En bloquant l’accès aux sites de casino pendant votre période déterminée, tous ces mécanismes aident à prendre du recul et à reprendre le contrôle. Les free spins deviennent les petites pépites des passionnés sobre machines à sous, des opportunités de gains sans energy supplémentaire.

N’oubliez pas de conducteur la case « J’ai lu des conditions d’utilisation » et de cliqueter sur s’inscrire. Dans le monde numérique, cette catégorie de jeux revêt une nouvelle dimension, tout en préservant l’essence de l’expérience online casino. Les machines à sous sont des étoiles filantes i casino sur internet, scintillant de thèmes variés et de fonctionnalités innovantes. Des titres mythiques comme Super Moolah aux créations modernes de Starburst, ces jeux invitent à un journey dans des logement graphiques époustouflants, où chaque spin peut être synonyme sobre jackpot. Elles offrent aux joueurs une myriade d’opportunités pour tester leur possibility et affiner leur art du tableau. Les programmes para fidélité sont the tapis rouge déroulé aux pieds des joueurs réguliers, une reconnaissance de leur loyauté.

Dépôt Minimum

De nombreux jeux peuvent être disponibles sur les internet casinos en direct tels que le poker live, le black jack live ou the baccara live. Il s’agit ici de jouer en buffering avec un croupier directement et derrière d’autres joueurs humains comme participants. Pour profiter d’une expérience de qualité en déambulant le live” “gambling establishment ou casino directement, il est intérieur d’avoir une dépendance parfaitement stable. La plateforme se concentre principalement sur the poker en hachure, offrant des tournois réguliers et des cash games pour les joueurs de tous niveaux.

Cresus Casino ze distingue par child offre de bienvenue généreuse qui donne la possibilité aux nouveaux joueurs de démarrer dos un capital sobre jeu accru. En effet, ce casino propose un reward” “para bienvenue de 200% jusqu’à 500 €, de quoi prolonger vos sessions para jeu et étendre vos chances sobre gains. L’interface user-friendly et conviviale para Cresus Casino apporte la navigation à travers les différentes sections, rendant l’expérience utilisateur agréable et sans tracas. Découvrez notre guide dieses plateformes les plus sûres, avec divers jeux et dieses bonus attractifs. Les méthodes de paiement sécurisées sont le pilier de la confiance entre les joueurs et les casinos en ligne. Avec des protocoles para sécurité avancés comme il se trouve que SSL et kklk mesures anti-fraude, des casinos garantissent los angeles protection des transactions financières et kklk données personnelles dieses utilisateurs.

Meilleur Casino Sobre Ligne Global: Joker8 Casino

Les casinos proposent votre variété de méthodes de paiement fill accommoder les préférences et les besoins de leurs cybernautes. Pour une facilité d’utilisation et dieses transactions rapides ain anonymes, ces derniers peuvent par pressbook opter pour” “kklk tickets prépayés comme Neosurf et CASHlib. S’ils ont votre préférence pour des cartes de crédit/débit, ils peuvent utiliser Visa ou Master card. L’un des critères les plus importants pour le choix d’un casino reste la variété des moyens de paiement proposée. Il faut savoir que les différentes méthodes disponibles pour les deals peuvent changer d’un pays à l’autre.

Aussi, il faut s’assurer que les circumstances pour obtenir soient avantageuses, c’est à dire que vous devez facilement pouvoir les remplir. Pour être sûr sobre la fiabilité d’un casino en ligne, are generally régulation et la licence sont des premiers critères os quais vous devez voler ne compte. Un casino sur internet fiable est avant complet un casino régulé qui est autorisé à proposer syns services dans votre secteur des amusements en ligne. De plus, avec les nombreux opérateurs quel professionnel existent aujourd’hui en déambulant le marché, eine faites pas l’erreur de gravir algun site peu autentico. Les indétrônables devices à sous deviennent certainement les jeux d’argent les additionally populaires sur des casinos” “en ligne. Plusieurs des internet casinos de notre liste vous permettront de jouer sur dieses machines à sous gratuitement avec les bonus de trips gratuits offerts aux nouveaux joueurs.

Top Pour Des Tournois De Equipment À Sous: Tortuga Casino

Les options bancaires les plus rapides sont les portefeuilles électroniques, qui seront généralement instantanés, pendant que les cartes de crédit détiennent de près en termes de vitesse. Quand on découvre le monde kklk casinos en trait en France, axé en se promenant sur le divertissement et le plaisir, in ne peut qu’avoir vous souhaitez l’essayer. Ceux qui n’ont jamais essayé le tableau en ligne trouveront les informations suivantes très utiles. Dans un océan de possibilités, la fiabilité reste le phare quel professionnel guide les joueurs vers des eaux sécuritaires.

Comme les lois griffin et règlements seront sujets à changements, il est recommandé de se renseigner sur les dernières lois griffin concernant les amusements d’argent avant para choisir de pratiquer en ligne. Une fois l’inscription validée, vous recevrez un email à entamer, afin de confirmer votre inscription, sobre activant votre plan en cliquant en déambulant le lien présent dans l’email reçu. Lors de chaque connexion au gambling establishment en ligne choisi en France, il vous suffit d’utiliser vos identifiants. Vous pouvez lire des avis mis” “à votre disposition puis si cela vous intéresse, cliquer en se promenant sur « visiter votre casino » pour accéder au site du casino. Ajoutez à cela este programme VIP riche en cashback ain promotions hebdomadaires, ou vous comprendrez envie de Cresus Casino physique parmi les étoiles du jeu sur internet. Pour des raisons de sécurité évidentes, les plateformes que nous recommandons un protocole KYC (Know Your Customer), votre vérification d’identité visant à prévenir des vols de petits.

Choisissez Plutôt Un Casino En Ligne Fiable

Fabrice MENARD est algun auteur expérimenté quel professionnel côtoie l’industrie des jeux d’argent en ligne depuis plus de 8 ans. Propriétaire, éditeur et auteur de casinos-en-ligne. fr, c’est l’un kklk rares du domaine à mettre à la disposition dieses lecteurs un sève 100% fiable ainsi que sans parti pris. Les régulations en évolution offrent une structure solide, favorisant un environnement sobre jeu sécurisé ou équitable. Si vous vous trouvez dans le marché de l’un des will pay ci-dessous, vous aurez accès aux top rated sites d’Afrique.

Pour des casinos français terrestres comme pour des opérateurs de internet casinos en ligne étrangers, c’est un terreau fertile auquel arianne leur est interdit d’accéder. De multiple sites ont à ce jour reçu des avertissements serve interdire leur accès aux Français vivant sur le territoire français. Les Français qui jouent aux jeux de on line casino en France le typeface sur des” “sites de jeux étrangers à Malte, Gibraltar ou Curaçao ou sont donc soumis à la législation des pays dans lesquels ces websites sont enregistrés.

Moi Casino

Cependant, il est important para rester conscient des inconvénients potentiels et de toujours opter pour des plateformes fiables et sécurisées. En choisissant judicieusement, les joueurs sont capables profiter d’une expérience de jeu sobre ligne enrichissante ainsi que sécurisée. Si vous aspirez à jouer sur les meilleurs sites de gambling establishment sur internet français, trouver les plateformes des plus prisées peut parfois être délicat. De nombreux sites de casino en ligne en métropole, sinon tous, offriront all scuba divers bonus et marketing promotions aux nouveaux joueurs et aux joueurs existants.

Un casino en hachure est nettement moins onéreux à entretenir qu’un établissement terrestre et peut par conséquent offrir à ses membres un retour au joueur plus avantageux. Ce manual répertorie exclusivement les casinos agréés ANJ qui ont été autorisés par the gouvernement français ou qui possèdent une licence de jeu légale délivrée doble l’ANJ, l’Autorité Nationale des Jeux. Grâce à Casino-Legal-France. fr, profitez de notre sélection de on line casino en ligne légal en France fill jouer au gambling establishment sur Internet légalement. Bwin est l’une des marques des plus anciennes ou les plus respectées dans le lieu des jeux sobre ligne. Les internautes doivent fournir dieses informations d’identification, sélectionner une méthode para retrait, et accompagner les instructions man casino pour finaliser le” “processus.

Existe-t-il Des Casinos En Ligne Agréés Similar L’anj En Portugal?

Chargé para réguler les amusements d’argent en hachure selon la loi française, il exerce des fonctions légales avec une rigueur exemplaire. Les documents originaux doivent être photographiés ou scannés de manière à être parfaitement lisibles et téléversés dans le marché de la section dédiée à l’intention ni service clientèle sobre la plateforme para jeu en” “trait. Une notification vous sera alors envoyée après analyse dieses pièces, pour les joueurs informer du succès du protocole. Un dépôt minimum indécis est attrayant pour ceux qui veulent limiter leur budget ou tester votre casino sans gros investissement initial. Cependant, des dépôts plus élevés peuvent être nécessaires pour débloquer certains bonus systems jeux spécifiques. Les dépôts minimums courants sur les casinos français sont généralement de 1 €, 5 €, 10 € et 20 €.

Opter serve un casino durante ligne fiable, c’est choisir un partenaire qui protège cet argent et le vie privée grâce à la rigueur d’une banque suisse. Faites-nous confiance pour les joueurs guider vers des meilleurs casinos durante ligne français et pour vous tenir informé des dernières tendances et développements de l’industrie. Il serait bénéfique que cette loi se révèle être adoptée, car l’interdiction actuelle empêche l’Etat Français de protéger les joueurs et de bénéficier dieses taxes et autres prélèvements associés aux jeux de gambling establishment en ligne. Son rôle essentiel dans le marché de la régulation i jeu en hachure en France en réalité l’un des organes de contrôle des plus rigoureux au monde. La détention d’une licence représente souvent vue comme une marque para crédibilité pour un casino.

Méthodes De Retrait

Il est par conséquent crucial de vérifier la licence ou les restrictions spécifiques avant de repérer un casino” “sur internet. Les free rotates sont des tours gratuits offerts aux joueurs pour tacher des machines à sous spécifiques sans risquer leur soigné argent. Ces tours gratuits peuvent être obtenus sans condition de dépôt bare minimum, et cela est idéal pour les nouveaux joueurs souhaitant tester différentes machines à sous. Que les joueurs choisissiez de pratiquer via une software dédiée ou directement depuis un navigateur, les casinos mobile phones offrent un meilleur accès au tableau, le rendant in addition accessible et versatile. Dans les portions suivantes, nous examinerons de plus près chacun de tous ces casinos et votre qui les rend uniques.

Et pour les moyens de paiement, les joueurs pourrez profiter, tel sur les autres plateformes, des cartes bancaires, des virements bancaires et des portefeuilles électroniques pour réaliser vos transactions. Betclic est une plateforme de jeux durante ligne très en demande en Europe, offrant des paris sportifs, des jeux para casino et ni poker. Fondé durante 2005, Betclic représente détenteur d’une licence délivrée par les autorités maltaises (MGA) aussi que par l’ANJ, ce qui garantit une expérience de jeu sécurisée ainsi que légale. Un support client de qualité en français représente essentiel pour une expérience de jeu confortable et without tracas. Les internet casinos en ligne français s’assurent que les cybernautes francophones reçoivent toute l’assistance dont ils ont besoin, à tout moment et en toute confiance.

🎁 Tours Gratuits (free Spins)

Aussi, certains casinos comme Wild Sultan ou Winoui tenez ont leurs cleans applications que il est possible de télécharger via le navigateur. Les machines à sous, des mini-jeux et votre vidéo poker apportent certes un divertissement agréable, mais pour une expérience as well as immersive et réaliste, rien ne vaut les casinos are living. Là, vous saurez vous plonger dans l’action en jouant à des amusements classiques tels o qual la roulette ou le blackjack, complet en interagissant avec de vrais croupiers en direct. La législation française réelle ne permet pas de jouer para l’argent aux devices à sous durante ligne sur les internet sites agréés ANJ. Une alternative divertissante est de jouer sur un site tel MyJackpot. fr quel professionnel permet de pratiquer gratuitement à additionally de 100 devices à sous de qualité avec dieses évènements hebdomadaires ain des défis quotidiens.

Vous pouvez trouver tous les grands classiques, tels os quais le blackjack, la roulette, le poker et le baccarat, chacun offrant une expérience semblable à celle des internet casinos terrestres. Les variantes populaires comme Super Roulette, Speed Roulette, ou encore le blackjack avec des alternatives de paris diversifiés ajoutent une dimension supplémentaire à ces jeux traditionnels. Ce qui fait franchement la différence à Azur Casino, c’est son service client réactif et online 24h/24 et 7j/7. Que vous ayez une question en se promenant sur un jeu,” “nécessaire d’assistance pour un retrait, ou promote autre problème, l’équipe d’Azur Casino est toujours prête à les joueurs aider.

Lucky8 Casino

Les générateurs de nombres aléatoires (RNG) sont des juges impartiaux du casino en segment, veillant” “à ce que toutes vos jeu soit une épreuve d’équité. Ces systèmes sophistiqués garantissent que le capital seul dicte des résultats, préservant ainsi l’intégrité du jeu et la confiance des joueurs. Les jeux en direct sont la bottom de l’expérience on line casino, une fenêtre ouverte sur un monde où le virtuel et le réel se rencontrent. Interagir avec de vrais croupiers, sentir are generally montée d’adrénaline à chaque donne, chaque spin, c’est l’essence même du tableau en direct.

L’Autorité nationale des jeux (ANJ) joue un rôle vital dans la régulation des jeux d’argent en ligne durante France. Elle veille au respect de la législation, à la prévention man jeu excessif ain à la security des mineurs, garantissant ainsi un environnement de jeu responsable et sécurisé. Les jeux de desk en ligne, tels que le black jack, la roulette et le baccarat, offrent aux amateurs para stratégie la possibilité de mettre leurs compétences à l’épreuve. Ces jeux allient le frisson ni hasard à l’analyse et la décision, proposant ainsi une expérience de jeu profonde et enrichissante.

(function () { var searchreplace = (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); function isContentEditableFalse(node) { return node && node.nodeType === 1 && node.contentEditable === 'false'; } function findAndReplaceDOMText(regex, node, replacementNode, captureGroup, schema) { var m; var matches = []; var text, count = 0, doc; var blockElementsMap, hiddenTextElementsMap, shortEndedElementsMap; doc = node.ownerDocument; blockElementsMap = schema.getBlockElements(); hiddenTextElementsMap = schema.getWhiteSpaceElements(); shortEndedElementsMap = schema.getShortEndedElements(); function getMatchIndexes(m, captureGroup) { captureGroup = captureGroup || 0; if (!m[0]) { throw new Error('findAndReplaceDOMText cannot handle zero-length matches'); } var index = m.index; if (captureGroup > 0) { var cg = m[captureGroup]; if (!cg) { throw new Error('Invalid capture group'); } index += m[0].indexOf(cg); m[0] = cg; } return [ index, index + m[0].length, [m[0]] ]; } function getText(node) { var txt; if (node.nodeType === 3) { return node.data; } if (hiddenTextElementsMap[node.nodeName] && !blockElementsMap[node.nodeName]) { return ''; } txt = ''; if (isContentEditableFalse(node)) { return '\n'; } if (blockElementsMap[node.nodeName] || shortEndedElementsMap[node.nodeName]) { txt += '\n'; } if (node = node.firstChild) { do { txt += getText(node); } while (node = node.nextSibling); } return txt; } function stepThroughMatches(node, matches, replaceFn) { var startNode, endNode, startNodeIndex, endNodeIndex, innerNodes = [], atIndex = 0, curNode = node, matchLocation = matches.shift(), matchIndex = 0; out: while (true) { if (blockElementsMap[curNode.nodeName] || shortEndedElementsMap[curNode.nodeName] || isContentEditableFalse(curNode)) { atIndex++; } if (curNode.nodeType === 3) { if (!endNode && curNode.length + atIndex >= matchLocation[1]) { endNode = curNode; endNodeIndex = matchLocation[1] - atIndex; } else if (startNode) { innerNodes.push(curNode); } if (!startNode && curNode.length + atIndex > matchLocation[0]) { startNode = curNode; startNodeIndex = matchLocation[0] - atIndex; } atIndex += curNode.length; } if (startNode && endNode) { curNode = replaceFn({ startNode: startNode, startNodeIndex: startNodeIndex, endNode: endNode, endNodeIndex: endNodeIndex, innerNodes: innerNodes, match: matchLocation[2], matchIndex: matchIndex }); atIndex -= endNode.length - endNodeIndex; startNode = null; endNode = null; innerNodes = []; matchLocation = matches.shift(); matchIndex++; if (!matchLocation) { break; } } else if ((!hiddenTextElementsMap[curNode.nodeName] || blockElementsMap[curNode.nodeName]) && curNode.firstChild) { if (!isContentEditableFalse(curNode)) { curNode = curNode.firstChild; continue; } } else if (curNode.nextSibling) { curNode = curNode.nextSibling; continue; } while (true) { if (curNode.nextSibling) { curNode = curNode.nextSibling; break; } else if (curNode.parentNode !== node) { curNode = curNode.parentNode; } else { break out; } } } } function genReplacer(nodeName) { var makeReplacementNode; if (typeof nodeName !== 'function') { var stencilNode_1 = nodeName.nodeType ? nodeName : doc.createElement(nodeName); makeReplacementNode = function (fill, matchIndex) { var clone = stencilNode_1.cloneNode(false); clone.setAttribute('data-mce-index', matchIndex); if (fill) { clone.appendChild(doc.createTextNode(fill)); } return clone; }; } else { makeReplacementNode = nodeName; } return function (range) { var before; var after; var parentNode; var startNode = range.startNode; var endNode = range.endNode; var matchIndex = range.matchIndex; if (startNode === endNode) { var node_1 = startNode; parentNode = node_1.parentNode; if (range.startNodeIndex > 0) { before = doc.createTextNode(node_1.data.substring(0, range.startNodeIndex)); parentNode.insertBefore(before, node_1); } var el = makeReplacementNode(range.match[0], matchIndex); parentNode.insertBefore(el, node_1); if (range.endNodeIndex < node_1.length) { after = doc.createTextNode(node_1.data.substring(range.endNodeIndex)); parentNode.insertBefore(after, node_1); } node_1.parentNode.removeChild(node_1); return el; } before = doc.createTextNode(startNode.data.substring(0, range.startNodeIndex)); after = doc.createTextNode(endNode.data.substring(range.endNodeIndex)); var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex); for (var i = 0, l = range.innerNodes.length; i < l; ++i) { var innerNode = range.innerNodes[i]; var innerEl = makeReplacementNode(innerNode.data, matchIndex); innerNode.parentNode.replaceChild(innerEl, innerNode); } var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex); parentNode = startNode.parentNode; parentNode.insertBefore(before, startNode); parentNode.insertBefore(elA, startNode); parentNode.removeChild(startNode); parentNode = endNode.parentNode; parentNode.insertBefore(elB, endNode); parentNode.insertBefore(after, endNode); parentNode.removeChild(endNode); return elB; }; } text = getText(node); if (!text) { return; } if (regex.global) { while (m = regex.exec(text)) { matches.push(getMatchIndexes(m, captureGroup)); } } else { m = text.match(regex); matches.push(getMatchIndexes(m, captureGroup)); } if (matches.length) { count = matches.length; stepThroughMatches(node, matches, genReplacer(replacementNode)); } return count; } var FindReplaceText = { findAndReplaceDOMText: findAndReplaceDOMText }; var getElmIndex = function (elm) { var value = elm.getAttribute('data-mce-index'); if (typeof value === 'number') { return '' + value; } return value; }; var markAllMatches = function (editor, currentIndexState, regex) { var node, marker; marker = editor.dom.create('span', { 'data-mce-bogus': 1 }); marker.className = 'mce-match-marker'; node = editor.getBody(); done(editor, currentIndexState, false); return FindReplaceText.findAndReplaceDOMText(regex, node, marker, false, editor.schema); }; var unwrap = function (node) { var parentNode = node.parentNode; if (node.firstChild) { parentNode.insertBefore(node.firstChild, node); } node.parentNode.removeChild(node); }; var findSpansByIndex = function (editor, index) { var nodes; var spans = []; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); if (nodes.length) { for (var i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex === null || !nodeIndex.length) { continue; } if (nodeIndex === index.toString()) { spans.push(nodes[i]); } } } return spans; }; var moveSelection = function (editor, currentIndexState, forward) { var testIndex = currentIndexState.get(); var dom = editor.dom; forward = forward !== false; if (forward) { testIndex++; } else { testIndex--; } dom.removeClass(findSpansByIndex(editor, currentIndexState.get()), 'mce-match-marker-selected'); var spans = findSpansByIndex(editor, testIndex); if (spans.length) { dom.addClass(findSpansByIndex(editor, testIndex), 'mce-match-marker-selected'); editor.selection.scrollIntoView(spans[0]); return testIndex; } return -1; }; var removeNode = function (dom, node) { var parent = node.parentNode; dom.remove(node); if (dom.isEmpty(parent)) { dom.remove(parent); } }; var find = function (editor, currentIndexState, text, matchCase, wholeWord) { text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); text = text.replace(/\s/g, '[^\\S\\r\\n]'); text = wholeWord ? '\\b' + text + '\\b' : text; var count = markAllMatches(editor, currentIndexState, new RegExp(text, matchCase ? 'g' : 'gi')); if (count) { currentIndexState.set(-1); currentIndexState.set(moveSelection(editor, currentIndexState, true)); } return count; }; var next = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, true); if (index !== -1) { currentIndexState.set(index); } }; var prev = function (editor, currentIndexState) { var index = moveSelection(editor, currentIndexState, false); if (index !== -1) { currentIndexState.set(index); } }; var isMatchSpan = function (node) { var matchIndex = getElmIndex(node); return matchIndex !== null && matchIndex.length > 0; }; var replace = function (editor, currentIndexState, text, forward, all) { var i, nodes, node, matchIndex, currentMatchIndex, nextIndex = currentIndexState.get(), hasMore; forward = forward !== false; node = editor.getBody(); nodes = global$1.grep(global$1.toArray(node.getElementsByTagName('span')), isMatchSpan); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); matchIndex = currentMatchIndex = parseInt(nodeIndex, 10); if (all || matchIndex === currentIndexState.get()) { if (text.length) { nodes[i].firstChild.nodeValue = text; unwrap(nodes[i]); } else { removeNode(editor.dom, nodes[i]); } while (nodes[++i]) { matchIndex = parseInt(getElmIndex(nodes[i]), 10); if (matchIndex === currentMatchIndex) { removeNode(editor.dom, nodes[i]); } else { i--; break; } } if (forward) { nextIndex--; } } else if (currentMatchIndex > currentIndexState.get()) { nodes[i].setAttribute('data-mce-index', currentMatchIndex - 1); } } currentIndexState.set(nextIndex); if (forward) { hasMore = hasNext(editor, currentIndexState); next(editor, currentIndexState); } else { hasMore = hasPrev(editor, currentIndexState); prev(editor, currentIndexState); } return !all && hasMore; }; var done = function (editor, currentIndexState, keepEditorSelection) { var i, nodes, startContainer, endContainer; nodes = global$1.toArray(editor.getBody().getElementsByTagName('span')); for (i = 0; i < nodes.length; i++) { var nodeIndex = getElmIndex(nodes[i]); if (nodeIndex !== null && nodeIndex.length) { if (nodeIndex === currentIndexState.get().toString()) { if (!startContainer) { startContainer = nodes[i].firstChild; } endContainer = nodes[i].firstChild; } unwrap(nodes[i]); } } if (startContainer && endContainer) { var rng = editor.dom.createRng(); rng.setStart(startContainer, 0); rng.setEnd(endContainer, endContainer.data.length); if (keepEditorSelection !== false) { editor.selection.setRng(rng); } return rng; } }; var hasNext = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() + 1).length > 0; }; var hasPrev = function (editor, currentIndexState) { return findSpansByIndex(editor, currentIndexState.get() - 1).length > 0; }; var Actions = { done: done, find: find, next: next, prev: prev, replace: replace, hasNext: hasNext, hasPrev: hasPrev }; var get = function (editor, currentIndexState) { var done = function (keepEditorSelection) { return Actions.done(editor, currentIndexState, keepEditorSelection); }; var find = function (text, matchCase, wholeWord) { return Actions.find(editor, currentIndexState, text, matchCase, wholeWord); }; var next = function () { return Actions.next(editor, currentIndexState); }; var prev = function () { return Actions.prev(editor, currentIndexState); }; var replace = function (text, forward, all) { return Actions.replace(editor, currentIndexState, text, forward, all); }; return { done: done, find: find, next: next, prev: prev, replace: replace }; }; var Api = { get: get }; var open = function (editor, currentIndexState) { var last = {}, selectedText; editor.undoManager.add(); selectedText = global$1.trim(editor.selection.getContent({ format: 'text' })); function updateButtonStates() { win.statusbar.find('#next').disabled(Actions.hasNext(editor, currentIndexState) === false); win.statusbar.find('#prev').disabled(Actions.hasPrev(editor, currentIndexState) === false); } function notFoundAlert() { editor.windowManager.alert('Could not find the specified string.', function () { win.find('#find')[0].focus(); }); } var win = editor.windowManager.open({ layout: 'flex', pack: 'center', align: 'center', onClose: function () { editor.focus(); Actions.done(editor, currentIndexState); editor.undoManager.add(); }, onSubmit: function (e) { var count, caseState, text, wholeWord; e.preventDefault(); caseState = win.find('#case').checked(); wholeWord = win.find('#words').checked(); text = win.find('#find').value(); if (!text.length) { Actions.done(editor, currentIndexState, false); win.statusbar.items().slice(1).disabled(true); return; } if (last.text === text && last.caseState === caseState && last.wholeWord === wholeWord) { if (!Actions.hasNext(editor, currentIndexState)) { notFoundAlert(); return; } Actions.next(editor, currentIndexState); updateButtonStates(); return; } count = Actions.find(editor, currentIndexState, text, caseState, wholeWord); if (!count) { notFoundAlert(); } win.statusbar.items().slice(1).disabled(count === 0); updateButtonStates(); last = { text: text, caseState: caseState, wholeWord: wholeWord }; }, buttons: [ { text: 'Find', subtype: 'primary', onclick: function () { win.submit(); } }, { text: 'Replace', disabled: true, onclick: function () { if (!Actions.replace(editor, currentIndexState, win.find('#replace').value())) { win.statusbar.items().slice(1).disabled(true); currentIndexState.set(-1); last = {}; } } }, { text: 'Replace all', disabled: true, onclick: function () { Actions.replace(editor, currentIndexState, win.find('#replace').value(), true, true); win.statusbar.items().slice(1).disabled(true); last = {}; } }, { type: 'spacer', flex: 1 }, { text: 'Prev', name: 'prev', disabled: true, onclick: function () { Actions.prev(editor, currentIndexState); updateButtonStates(); } }, { text: 'Next', name: 'next', disabled: true, onclick: function () { Actions.next(editor, currentIndexState); updateButtonStates(); } } ], title: 'Find and replace', items: { type: 'form', padding: 20, labelGap: 30, spacing: 10, items: [ { type: 'textbox', name: 'find', size: 40, label: 'Find', value: selectedText }, { type: 'textbox', name: 'replace', size: 40, label: 'Replace with' }, { type: 'checkbox', name: 'case', text: 'Match case', label: ' ' }, { type: 'checkbox', name: 'words', text: 'Whole words', label: ' ' } ] } }); }; var Dialog = { open: open }; var register = function (editor, currentIndexState) { editor.addCommand('SearchReplace', function () { Dialog.open(editor, currentIndexState); }); }; var Commands = { register: register }; var showDialog = function (editor, currentIndexState) { return function () { Dialog.open(editor, currentIndexState); }; }; var register$1 = function (editor, currentIndexState) { editor.addMenuItem('searchreplace', { text: 'Find and replace', shortcut: 'Meta+F', onclick: showDialog(editor, currentIndexState), separator: 'before', context: 'edit' }); editor.addButton('searchreplace', { tooltip: 'Find and replace', onclick: showDialog(editor, currentIndexState) }); editor.shortcuts.add('Meta+F', '', showDialog(editor, currentIndexState)); }; var Buttons = { register: register$1 }; global.add('searchreplace', function (editor) { var currentIndexState = Cell(-1); Commands.register(editor, currentIndexState); Buttons.register(editor, currentIndexState); return Api.get(editor, currentIndexState); }); function Plugin () { } return Plugin; }()); })();