PageSourceSearch

https://7esl.com/category/grammar/articles/

html 7esl.com collected 2026-09-24 19:05:42 UTC 181,794 bytes, 1,518 lines download raw bytes

1<!DOCTYPE html><html lang="en-US" prefix="og: https://ogp.me/ns#"><head><meta charset="UTF-8"> 
1<script>/* 7ESL local-network guard */
2(function(){function L(u){if(typeof u!=='string')return false;var s=u.toLowerCase();return s.indexOf('//localhost')>-1||s.indexOf('//127.0.0.1')>-1||s.indexOf('//0.0.0.0')>-1||s.indexOf('//[::1]')>-1||s.indexOf('//192.168.')>-1||s.indexOf('//10.0.')>-1;}
3if(window.fetch){var f=window.fetch.bind(window);window.fetch=function(i,o){var u=(typeof i==='string')?i:(i&&i.url);if(L(u)){return Promise.resolve(new Response('',{status:204}));}return f(i,o);};}
4if(window.XMLHttpRequest){var op=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(m,u){if(typeof u==='string'&&L(u)){arguments[1]='about:blank';}return op.apply(this,arguments);};}})();</script>
4 
4<script id="esl-aud-js">(function(d){try{var e=d.documentElement;if(e.getAttribute("data-aud"))return;var m=/(?:^|;\s*)esl_aud=([a-z]{1,8})/.exec(d.cookie||"");e.setAttribute("data-aud",{teacher:"teacher",learner:"learner",kid:"kid",skip:"none"}[m?m[1]:""]||"ask");}catch(x){}})(document);</script>
4 <meta name="viewport" content="width=device-width, initial-scale=1"><title>Articles &bull; 7ESL</title><meta name="description" content="Discover the essentials of using articles in English grammar with our comprehensive guide. Learn the correct application of &#039;a,&#039; &#039;an,&#039; and &#039;the&#039; to enhance your writing and speaking skills."/><meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/><link rel="canonical" href="https://7esl.com/category/grammar/articles/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="article" /><meta property="og:title" content="Articles &bull; 7ESL" /><meta property="og:description" content="Discover the essentials of using articles in English grammar with our comprehensive guide. Learn the correct application of &#039;a,&#039; &#039;an,&#039; and &#039;the&#039; to enhance your writing and speaking skills." /><meta property="og:url" content="https://7esl.com/category/grammar/articles/" /><meta property="og:site_name" content="7ESL" /><meta property="article:publisher" content="https://www.facebook.com/7ESLAI" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Articles &bull; 7ESL" /><meta name="twitter:description" content="Discover the essentials of using articles in English grammar with our comprehensive guide. Learn the correct application of &#039;a,&#039; &#039;an,&#039; and &#039;the&#039; to enhance your writing and speaking skills." /><meta name="twitter:label1" content="Posts" /><meta name="twitter:data1" content="5" /> 
4<script type="application/ld+json" class="rank-math-schema">{"@context":"https://schema.org","@graph":[{"@type":"CollectionPage","@id":"https://7esl.com/category/grammar/articles/#webpage","name":"Articles","url":"https://7esl.com/category/grammar/articles/","inLanguage":"en-US","isPartOf":{"@type":"WebSite","@id":"https://7esl.com/#website","name":"7ESL","url":"https://7esl.com/"},"publisher":{"@type":"Organization","name":"7ESL","url":"https://7esl.com/"}},{"@type":"BreadcrumbList","@id":"https://7esl.com/category/grammar/articles/#breadcrumb","itemListElement":[{"@type":"ListItem","position":"1","item":{"@id":"https://7esl.com","name":"Home"}},{"@type":"ListItem","position":"2","item":{"@id":"https://7esl.com/knowledge-base/","name":"Knowledge Base"}},{"@type":"ListItem","position":"3","item":{"@id":"https://7esl.com/category/grammar/","name":"Grammar"}},{"@type":"ListItem","position":"4","item":{"@id":"https://7esl.com/category/grammar/articles/","name":"Articles"}}]}]}</script>
4 <link rel='dns-prefetch' href='//scripts.mediavine.com' /><link rel='dns-prefetch' href='//scripts.pubnation.com' /><link rel='dns-prefetch' href='//keywords.pubnation.com' /><link href='https://scripts.pubnation.com' crossorigin='anonymous' rel='preconnect' /><link href='https://keywords.pubnation.com' crossorigin='anonymous' rel='preconnect' /><link href='https://fonts.gstatic.com' crossorigin rel='preconnect' /><link href='https://fonts.googleapis.com' crossorigin rel='preconnect' /><style id="wp-img-auto-sizes-contain-inline-css">img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
5/*# sourceURL=wp-img-auto-sizes-contain-inline-css */</style><style id="global-styles-inline-css">:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--contrast: var(--contrast);--wp--preset--color--contrast-2: var(--contrast-2);--wp--preset--color--contrast-3: var(--contrast-3);--wp--preset--color--base: var(--base);--wp--preset--color--base-2: var(--base-2);--wp--preset--color--base-3: var(--base-3);--wp--preset--color--accent: var(--accent);--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
5--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-family--quicksand: Quicksand, sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-contrast-color{color: var(--wp--preset--color--contrast) !important;}.has-contrast-2-color{color: var(--wp--preset--color--contrast-2) !important;}.has-contrast-3-color{color: var(--wp--preset--color--contrast-3) !important;}.has-base-color{color: var(--wp--preset--color--base) !important;}.has-base-2-color{color: var(--wp--preset--color--base-2) !important;}.has-base-3-color{color: var(--wp--preset--color--base-3) !important;}.has-accent-color{color: var(--wp--preset--color--accent) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-contrast-background-color{background-color: var(--wp--preset--color--contrast) !important;}.has-contrast-2-background-color{background-color: var(--wp--preset--color--contrast-2) !important;}.has-contrast-3-background-color{background-color: var(--wp--preset--color--contrast-3) !important;}.has-base-background-color{background-color: var(--wp--preset--color--base) !important;}.has-base-2-background-color{background-color: var(--wp--preset--color--base-2) !important;}.has-base-3-background-color{background-color: var(--wp--preset--color--base-3) !important;}.has-accent-background-color{background-color: var(--wp--preset--color--accent) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-contrast-border-color{border-color: var(--wp--preset--color--contrast) !important;}.has-contrast-2-border-color{border-color: var(--wp--preset--color--contrast-2) !important;}.has-contrast-3-border-color{border-color: var(--wp--preset--color--contrast-3) !important;}.has-base-border-color{border-color: var(--wp--preset--color--base) !important;}.has-base-2-border-color{border-color: var(--wp--preset--color--base-2) !important;}.has-base-3-border-color{border-color: var(--wp--preset--color--base-3) !important;}.has-accent-border-color{border-color: var(--wp--preset--color--accent) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
5.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-quicksand-font-family{font-family: var(--wp--preset--font-family--quicksand) !important;}
6/*# sourceURL=global-styles-inline-css */</style><link rel='stylesheet' id='generate-google-fonts-css' href='https://fonts.googleapis.com/css?family=Quicksand:300,regular,500,700&#038;display=swap&#038;ver=3.6.1' media='all' /> 
6<script type="text/javascript">window._nslDOMReady = (function () {
7                const executedCallbacks = new Set();
8            
9                return function (callback) {
10                    /**
11                    * Third parties might dispatch DOMContentLoaded events, so we need to ensure that we only run our callback once!
12                    */
13                    if (executedCallbacks.has(callback)) return;
14            
15                    const wrappedCallback = function () {
16                        if (executedCallbacks.has(callback)) return;
17                        executedCallbacks.add(callback);
18                        callback();
19                    };
20            
21                    if (document.readyState === "complete" || document.readyState === "interactive") {
22                        wrappedCallback();
23                    } else {
24                        document.addEventListener("DOMContentLoaded", wrappedCallback);
25                    }
26                };
27            })();</script>
27 
27<script id="breeze-prefetch-js-extra">var breeze_prefetch = {"local_url":"https://7esl.com","ignore_remote_prefetch":"1","ignore_list":["wp-admin","wp-login.php"]};
28//# sourceURL=breeze-prefetch-js-extra</script>
28 
28<script id="mv-script-wrapper-js" async="async" fetchpriority="high" data-noptimize="1" data-cfasync="false" data-mv-mcp="2.10.12" src="https://scripts.mediavine.com/tags/7esl.js?ver=7.1.2"></script>
28 <link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://7esl.com/xmlrpc.php?rsd" /><link rel="preload" as="font" type="font/woff2" href="https://7esl.com/wp-content/uploads/fonts/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkP8o18S0wx40QDw.woff2" crossorigin><link rel="icon" href="https://7esl.com/wp-content/uploads/2023/03/cropped-7ESL-Favicon-150x150.png" sizes="32x32" /><link rel="icon" href="https://7esl.com/wp-content/uploads/2023/03/cropped-7ESL-Favicon-300x300.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://7esl.com/wp-content/uploads/2023/03/cropped-7ESL-Favicon-300x300.png" /><meta name="msapplication-TileImage" content="https://7esl.com/wp-content/uploads/2023/03/cropped-7ESL-Favicon-300x300.png" /> 
28<script id="sevenesl-avatar-fallback">document.addEventListener('DOMContentLoaded', function () {
29      var fallback = 'https://7esl.com/wp-content/plugins/7esl-core/assets/images/default_avatar.png';
30      document.querySelectorAll('img.avatar, .forum-avatar-link img, .wrapAvatar img.avatarTutor, img.avatarTutor, img.avatarUser').forEach(function (img) {
31        img.addEventListener('error', function handleError() {
32          if (img.getAttribute('src') !== fallback) {
33            img.setAttribute('src', fallback);
34          }
35        }, { once: true });
36      });
37    });</script>
37 
37<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-js-jquery-jquery.min-6836d82c2675.js?ver=1790251294"></script>
37<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-js-js-front-end-breeze-prefetch-links.min-3c10be81bf6e.js?ver=1790251294"></script>
37<link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_1-a0063705c9d5.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_2-d3e84902fbfa.css?ver=1790251294" rel="stylesheet" /><style type="text/css" media="all">img[width][height]{height:auto}.gb-button,.tag,.rank-math-breadcrumb,.breadcrumb,.ez-toc-title,.ez-toc-title-container{min-height:1px}</style><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-7esl-core-assets-thinklab-0a81d6875288.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-7esl-core-assets-forum-redesign-e34b5a59e8a2.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-fonts-inter-inter-6b77128a995a.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_4-9077cbb97de5.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_5-e9a280b7c847.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_6-e57fcc13046c.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-assets-css-style-18c2a1dc22eb.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-assets-css-plyr-v3.7.2-e4f19c2644a6.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-novashare-css-style.min-90542393b44d.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_7-500e0b834c6d.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-css-components-widget-areas.min-b6b59ce9e554.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-assets-css-main.min-6e916044c122.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_8-dc6ca685ebbd.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-tests-assets-tests-f2d9ff9f3e69.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-7esl-core-assets-esl-toc-4d563c24623c.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-tests-assets-article-tabs-1eaa751632f2.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-7esl-core-assets-site-chrome-e51cc8c2ef12.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-functions-css-style.min-f9b95f7711b4.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-7esl-core-assets-sevenesl-ui-fixes-277d23690ab5.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-7esl-core-assets-category-editorial-cdaee314d5f1.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-functions-css-navigation-branding-flex.min-75b5071a0a09.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_9-c66a0c78d33b.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_10-ad4d0ae8724b.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_11-2ac4270b1048.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_12-4e002ea9bc5b.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_13-177401c7150a.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_14-650e59be5ed8.css?ver=1790251294" rel="stylesheet" /><link type="text/css" media="all" href="https://7esl.com/wp-content/cache/breeze-minification/css/breeze_category-grammar-articles-1-112735-inline_15-0c72a66d8df5.css?ver=1790251294" rel="stylesheet" /></head><body class="archive category category-articles category-37395 wp-custom-logo wp-embed-responsive wp-theme-generatepress escx-active post-image-below-header post-image-aligned-center generate-columns-activated sticky-menu-slide sticky-enabled desktop-sticky-menu right-sidebar nav-float-right separate-containers header-aligned-left dropdown-hover"><div class="escx-topbar"><div class="escx-wrap"><div class="escx-topbar__left"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#f5a623" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M2 12h20M12 2a15 15 0 0 1 0 20 15 15 0 0 1 0-20"/></svg> <span>Trusted by 10M+ learners worldwide &mdash; free lessons, tools &amp; games</span></div><div class="escx-topbar__right"> <a href="https://7esl.com/forum/">Forums</a> <a href="https://7esl.com/app/">Download App</a> <a href="https://7esl.com/membership/?src=topbar_adfree" class="escx-topbar__pill escx-topbar__pill--af">Go ad-free</a> <a href="https://7esl.com/membership/?src=topbar" class="escx-topbar__pill escx-topbar__pill--up">⚡ Go Pro</a> <a href="https://7esl.com/tutor-register/" class="escx-topbar__pill" data-aud-hide="learner kid ask none">★ Become a Tutor</a></div></div></div><header class="escx" id="escxHeader"><div class="escx-wrap escx__bar"> <a href="https://7esl.com/" class="escx-logo"> <img loading="lazy" src="https://7esl.com/wp-content/plugins/7esl-core/assets/images/logo-7esl-dark.svg" alt="7ESL" width="131" height="34"
38onerror="this.style.display='none';this.nextElementSibling.style.display='inline-flex'"> <span style="display:none;align-items:center;gap:8px"><span class="escx-logo__mark"><svg width="22" height="22" viewBox="0 0 24 24" fill="none"><path d="M3 7l9-4 9 4-9 4-9-4z" fill="#fff"/><path d="M7 10v5c0 1.5 2.2 2.5 5 2.5s5-1 5-2.5v-5" stroke="#fff" stroke-width="1.6" fill="none"/></svg></span>7<b>ESL</b></span> </a><nav class="escx-nav" aria-label="Primary"><div class="escx-nav__item"> <a href="https://7esl.com/knowledge-base/">Learn <svg class="escx-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M6 9l6 6 6-6"/></svg></a><div class="escx-mega" style="min-width:860px"><div class="escx-mega__grid" style="grid-template-columns:1fr 1fr 1fr 1fr"><div><div class="escx-col__h">Core skills</div> <a class="escx-mlink" href="https://7esl.com/category/grammar/"><span class="escx-mlink__ic">📖</span><span><span class="escx-mlink__tt">Grammar</span><span class="escx-mlink__ds">Rules, tenses &amp; structure</span></span></a><a class="escx-mlink" href="https://7esl.com/category/vocabulary/"><span class="escx-mlink__ic">📚</span><span><span class="escx-mlink__tt">Vocabulary</span><span class="escx-mlink__ds">Word lists by topic</span></span></a><a class="escx-mlink" href="https://7esl.com/category/writing/"><span class="escx-mlink__ic">
38✍</span><span><span class="escx-mlink__tt">Writing</span><span class="escx-mlink__ds">Essays, emails &amp; style</span></span></a><a class="escx-mlink" href="https://7esl.com/category/speaking/"><span class="escx-mlink__ic">🎤</span><span><span class="escx-mlink__tt">Speaking</span><span class="escx-mlink__ds">Conversation &amp; fluency</span></span></a></div><div><div class="escx-col__h">Words &amp; expressions</div> <a class="escx-mlink" href="https://7esl.com/category/idioms/"><span class="escx-mlink__ic">💡</span><span><span class="escx-mlink__tt">Idioms</span><span class="escx-mlink__ds">Common expressions</span></span></a><a class="escx-mlink" href="https://7esl.com/category/slang/"><span class="escx-mlink__ic">😎</span><span><span class="escx-mlink__tt">Slang</span><span class="escx-mlink__ds">Everyday informal English</span></span></a><a class="escx-mlink" href="https://7esl.com/category/internet-slang/"><span class="escx-mlink__ic">🌐</span><span><span class="escx-mlink__tt">Internet Slang</span><span class="escx-mlink__ds">Online &amp; texting terms</span></span></a><a class="escx-mlink" href="https://7esl.com/category/positive-words/"><span class="escx-mlink__ic">✨</span><span><span class="escx-mlink__tt">Positive Words</span><span class="escx-mlink__ds">Words &amp; phrases that uplift</span></span></a></div><div><div class="escx-col__h">More topics</div> <a class="escx-mlink" href="https://7esl.com/category/business-english/"><span class="escx-mlink__ic">💼</span><span><span class="escx-mlink__tt">Business English</span><span class="escx-mlink__ds">Workplace &amp; professional</span></span></a><a class="escx-mlink" href="https://7esl.com/category/visual-vocabulary/"><span class="escx-mlink__ic">🎨</span><span><span class="escx-mlink__tt">Visual Vocabulary</span><span class="escx-mlink__ds">Learn words with pictures</span></span></a><a class="escx-mlink" href="https://7esl.com/category/american-and-british-english/"><span class="escx-mlink__ic">🇬🇧</span><span><span class="escx-mlink__tt">British vs. American</span><span class="escx-mlink__ds">Spelling &amp; usage differences</span></span></a><a class="escx-mlink" href="https://7esl.com/category/foreign-language/"><span class="escx-mlink__ic">🌍</span><span><span class="escx-mlink__tt">Foreign Words</span><span class="escx-mlink__ds">Loanwords used in English</span></span></a><a class="escx-mlink" href="https://7esl.com/category/words-list/"><span class="escx-mlink__ic">📝</span><span><span class="escx-mlink__tt">Words List</span><span class="escx-mlink__ds">Curated word collections</span></span></a></div><div class="escx-feat"><div><h4>Free Courses</h4><p>Step-by-step modules with lessons, quizzes &amp; progress tracking.</p></div> <a class="escx-feat__cta" href="https://7esl.com/courses/">Browse all courses &rarr;</a></div></div><div class="escx-mega__foot"><span>Thousands of free lessons on grammar, vocabulary, idioms &amp; more</span><a href="https://7esl.com/knowledge-base/">Browse all topics &rarr;</a></div></div></div><div class="escx-nav__item"> <a href="https://7esl.com/tests/">Tests <span class="escx-badge escx-badge--hot">HOT</span> <svg class="escx-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M6 9l6 6 6-6"/></svg></a><div class="escx-mega" style="min-width:520px"><div class="escx-mega__grid" style="grid-template-columns:1.15fr 1fr"><div><div class="escx-col__h">Browse tests</div> <a class="escx-mlink" href="https://7esl.com/english-level-test/"><span class="escx-mlink__ic">🎯</span><span><span class="escx-mlink__tt">Level Tests</span><span class="escx-mlink__ds">Find your CEFR level (A1&ndash;C2)</span></span></a><a class="escx-mlink" href="https://7esl.com/exams/"><span class="escx-mlink__ic">🏆</span><span><span class="escx-mlink__tt">Exam Practice</span><span class="escx-mlink__ds">IELTS, TOEFL, Cambridge &amp; more</span></span></a><a class="escx-mlink" href="https://7esl.com/practice/"><span class="escx-mlink__ic">📝</span><span><span class="escx-mlink__tt">Practice Tests</span><span class="escx-mlink__ds">By skill, topic &amp; level</span></span></a></div><div class="escx-feat" style="background:linear-gradient(160deg,#163C66,#0B2540)"><div><h4>
38Exam Simulator</h4><p>Timed, auto-marked papers with instant scores, model answers &amp; XP.</p></div> <a class="escx-feat__cta" href="https://7esl.com/exams/">Start a mock exam &rarr;</a></div></div></div></div><div class="escx-nav__item"> <a href="https://7esl.com/tools/">Tools <svg class="escx-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M6 9l6 6 6-6"/></svg></a><div class="escx-mega" style="min-width:560px"><div class="escx-mega__grid" style="grid-template-columns:1fr 1fr"><div><div class="escx-col__h">Learn &amp; write</div> <a class="escx-mlink" href="https://7esl.com/learning-tools/"><span class="escx-mlink__ic">🎓</span><span><span class="escx-mlink__tt">Learning Tools</span><span class="escx-mlink__ds">Flashcards, vocabulary &amp; IELTS practice</span></span></a><a class="escx-mlink" href="https://7esl.com/writing-tools/"><span class="escx-mlink__ic">✎</span><span><span class="escx-mlink__tt">Writing Tools</span><span class="escx-mlink__ds">Grammar checker, paraphraser, summarizer</span></span></a><a class="escx-mlink" href="https://7esl.com/word-tools/"><span class="escx-mlink__ic">🎲</span><span><span class="escx-mlink__tt">Word Tools</span><span class="escx-mlink__ds">Wordle, anagram &amp; scrabble solvers</span></span></a><a class="escx-mlink" href="https://7esl.com/picture-vocabulary/"><span class="escx-mlink__ic">🎨</span><span><span class="escx-mlink__tt">Picture Vocabulary</span><span class="escx-mlink__ds">Learn vocabulary with images</span></span></a></div><div><div class="escx-col__h">Teaching &amp; speech</div> <a class="escx-mlink" href="https://7esl.com/teacher-tools/"><span class="escx-mlink__ic">🏫</span><span><span class="escx-mlink__tt">Teacher Tools</span><span class="escx-mlink__ds">Worksheets, flashcards &amp; bingo</span></span></a><a class="escx-mlink" href="https://7esl.com/how-to-pronounce/"><span class="escx-mlink__ic">🔊</span><span><span class="escx-mlink__tt">Pronunciation Tools</span><span class="escx-mlink__ds">Say any word, name or brand</span></span></a><a class="escx-mlink" href="https://7esl.com/spelling-tools/"><span class="escx-mlink__ic">📠</span><span><span class="escx-mlink__tt">Spelling Tools</span><span class="escx-mlink__ds">NATO alphabet, misspellings &amp; more</span></span></a></div></div><div class="escx-mega__foot"><span>80+ free English tools &mdash; no signup needed</span><a href="https://7esl.com/tools/">See all tools &rarr;</a></div></div></div><div class="escx-nav__item"> <a href="https://7esl.com/games/">Games <svg class="escx-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M6 9l6 6 6-6"/></svg></a><div class="escx-mega" style="min-width:560px"><div class="escx-mega__grid" style="grid-template-columns:1fr 1fr 1fr"><div><div class="escx-col__h">Categories</div> <a class="escx-mlink" href="https://7esl.com/word-games/"><span class="escx-mlink__ic">🔀</span><span><span class="escx-mlink__tt">Word Games</span><span class="escx-mlink__ds">Wordle, Spelling Bee, Anagram</span></span></a><a class="escx-mlink" href="https://7esl.com/vocabulary-games/"><span class="escx-mlink__ic">📚</span><span><span class="escx-mlink__tt">Vocabulary Games</span><span class="escx-mlink__ds">Match, flashcards, memory</span></span></a></div><div><div class="escx-col__h">&nbsp;</div> <a class="escx-mlink" href="https://7esl.com/grammar-games/"><span class="escx-mlink__ic">🔧</span><span><span class="escx-mlink__tt">Grammar Games</span><span class="escx-mlink__ds">Cloze, sentence builder</span></span></a><a class="escx-mlink" href="https://7esl.com/kids-games/"><span class="escx-mlink__ic">🧸</span><span><span class="escx-mlink__tt">Kids Games</span><span class="escx-mlink__ds">Fun games for ages 4&ndash;9</span></span></a><a class="escx-mlink" href="https://7esl.com/pronunciation-games/"><span class="escx-mlink__ic">🔊</span><span><span class="escx-mlink__tt">Pronunciation &amp; Spelling</span><span class="escx-mlink__ds">Listen, choose, spell</span></span></a></div><div class="escx-feat" style="background:linear-gradient(160deg,#F5A623,#D98A00);color:#3a2700"><div><h4 style="color:#3a2700">Earn XP &amp; Badges</h4><p style="color:#5a3f00">Every game scores XP, levels you up and unlocks shields.</p></div> <a class="escx-feat__cta" style="background:#0B2540;color:#fff" href="https://7esl.com/games/">Play all games &rarr;</a></div></div></div></div><div class="escx-nav__item"> <a href="https://7esl.com/teacher-tools/">For Teachers <svg class="escx-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M6 9l6 6 6-6"/></svg></a><div class="escx-mega" style="min-width:640px"><div class="escx-mega__grid" style="grid-template-columns:1fr 1fr"><div><div class="escx-col__h">Classroom material</div> <a class="escx-mlink" href="https://7esl.com/category/esl-resources/worksheets/"><span class="escx-mlink__ic">📄</span><span><span class="escx-mlink__tt">Worksheets</span><span class="escx-mlink__ds">Printable, ready for class</span></span></a><a class="escx-mlink" href="https://7esl.com/category/esl-resources/esl-pdfs/"><span class="escx-mlink__ic">📚</span><span><span class="escx-mlink__tt">PDF Books</span><span class="escx-mlink__ds">Free downloadable books</span></span></a><a class="escx-mlink" href="https://7esl.com/picture-vocabulary/"><span class="escx-mlink__ic">🎨</span><span><span class="escx-mlink__tt">Picture Vocabulary</span><span class="escx-mlink__ds">Flashcard images by topic</span></span></a><a class="escx-mlink" href="https://7esl.com/kids-games/"><span class="escx-mlink__ic">🧸</span><span><span class="escx-mlink__tt">Kids Games</span><span class="escx-mlink__ds">For young learners</span></span></a></div><div><div class="escx-col__h">Your tools</div> <a class="escx-mlink" href="https://7esl.com/teacher-tools/"><span class="escx-mlink__ic">🏫</span><span><span class="escx-mlink__tt">Teacher Tools</span><span class="escx-mlink__ds">Worksheet makers, bingo, flashcards</span></span></a><a class="escx-mlink" data-aud-hide="learner kid ask none" href="https://7esl.com/tutor-register/"><span class="escx-mlink__ic">⭐</span><span><span class="escx-mlink__tt">Become a Tutor</span><span class="escx-mlink__ds">Teach 1-on-1 and get paid</span></span></a><a class="escx-mlink" href="https://7esl.com/tutors/"><span class="escx-mlink__ic">👨‍🏫</span><span><span class="escx-mlink__tt">Find a Tutor</span><span class="escx-mlink__ds">1-on-1 lessons via Google Meet</span></span></a></div></div><div class="escx-mega__foot"><span>Free worksheet makers &mdash; no signup needed</span><a href="https://7esl.com/teacher-tools/">All teacher tools &rarr;</a></div></div></div></nav><div class="escx__spacer"></div><div class="escx__actions"> <button class="escx-icbtn" id="escxSearchBtn" aria-label="Search"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.3-4.3"/></svg></button> <a class="escx-btn escx-btn--ghost" href="https://7esl.com/login/">Login</a> <a class="escx-btn escx-btn--pri" href="https://7esl.com/signup/">Sign up free</a></div> <button class="escx-burger" id="escxBurger" aria-label="Open menu"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#163C66" stroke-width="2.2"><path d="M3 6h18M3 12h18M3 18h18"/></svg></button></div><div class="escx-search" id="escxSearch"><form class="escx-wrap" role="search" method="get" action="https://7esl.com/"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#5B6B79" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.3-4.3"/></svg> <input type="search" name="s" placeholder="Search lessons, tools, games, exams&hellip;"> <button class="escx-btn escx-btn--pri" type="submit">Search</button></form></div></header> <a class="screen-reader-text skip-link" href="#content" title="Skip to content">Skip to content</a><div class="page-hero"><div class="inside-page-hero grid-container grid-parent"><meta http-equiv="Content-Security-Policy" content="block-all-mixed-content" /><meta name="google-site-verification" content="AGR3MNmtsz8nyGh7BE2vXcg-tc27_0UNpdbI52vqJRM" /><meta name="p:domain_verify" content="310d9a8637368dc8a09c3b4d82add598"/>
vendor: 64 bytes, line 38
38 <script async src="https://www.googletagmanager.com/gtag/js?id=
38G-D3Z7V8R0BW
vendor: 12 bytes, line 38
38"></script> 
38<script>
vendor: 134 bytes, lines 38-42
38window.dataLayer = window.dataLayer || [];
39  function gtag(){dataLayer.push(arguments);}
40  gtag('js', new Date());
41
42  gtag('config', '
42G-D3Z7V8R0BW
vendor: 3 bytes, line 42
42');
42</script>
42 </div></div><div class="site grid-container container hfeed" id="page"><div class="site-content" id="content"><div class="content-area" id="primary"><main class="site-main" id="main"><div class="sevenesl-archive-breadcrumbs inside-article"><nav class="sevenesl-breadcrumbs" aria-label="Breadcrumbs"><nav aria-label="breadcrumbs" class="rank-math-breadcrumb"><p><a href="https://7esl.com">Home</a><span class="separator"> › </span><a href="https://7esl.com/knowledge-base/">Knowledge Base</a><span class="separator"> › </span><a href="https://7esl.com/category/grammar/">Grammar</a><span class="separator"> › </span><span class="last">Articles</span></p></nav></nav></div><div class="generate-columns-container "><section class="sevenesl-archive-hero inside-article has-parent-category has-landing-content"><div class="sevenesl-archive-hero__surface"><div class="sevenesl-archive-parent-wrap"> <a class="sevenesl-parent-badge" href="https://7esl.com/category/grammar/"> <span class="sevenesl-parent-badge__icon" aria-hidden="true">▣</span> <span>Grammar</span> </a></div><h1 class="page-title sevenesl-archive-title">Articles</h1><div class="esl-cat-tool-cta" style="display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin:16px 0 4px;padding:14px 18px;border:1px solid #bae6fd;border-radius:14px;background:linear-gradient(135deg,#f0f9ff,#ecfeff)"><div style="flex:1 1 260px;min-width:0"><div style="font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#0369a1;margin-bottom:2px">Free tool for this topic</div><div style="font-size:17px;font-weight:800;color:#0f172a;line-height:1.25">Grammar Checker</div><div style="font-size:13px;color:#475569;margin-top:3px">Check your writing for grammar, spelling and punctuation mistakes.</div></div><a class="esl-cat-tool-cta__btn" href="https://7esl.com/grammar-check/" style="flex:0 0 auto;display:inline-flex;align-items:center;gap:8px;background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;text-decoration:none;font-weight:700;font-size:14px;padding:11px 20px;border-radius:999px">Open the tool &rarr;</a></div><div class="sevenesl-archive-stats" aria-label="Category overview"><div class="sevenesl-archive-stat-card"> <span class="sevenesl-archive-stat-card__label">Articles</span> <strong class="sevenesl-archive-stat-card__value">5</strong></div><div class="sevenesl-archive-stat-card"> <span class="sevenesl-archive-stat-card__label">Subcategories</span> <strong class="sevenesl-archive-stat-card__value">0</strong></div><div class="sevenesl-level-tags-strip" aria-label="Levels"><div class="sevenesl-level-tags-strip__items"> <a
43class="sevenesl-level-tag-pill sevenesl-level-tag-pill--a"
44href="https://7esl.com/courses/a1-english/"
45> <span>A1</span> </a> <a
46class="sevenesl-level-tag-pill sevenesl-level-tag-pill--a"
47href="https://7esl.com/courses/a2-english/"
48> <span>A2</span> </a> <a
49class="sevenesl-level-tag-pill sevenesl-level-tag-pill--b"
50href="https://7esl.com/courses/b1-english/"
51> <span>B1</span> </a> <a
52class="sevenesl-level-tag-pill sevenesl-level-tag-pill--b"
53href="https://7esl.com/courses/b2-english/"
54> <span>B2</span> </a></div></div></div></div></section><section class="sevenesl-category-editorial inside-article" aria-label="Articles Guide"><div class="entry-content sevenesl-category-entry-content"><div id="esl-toc" class="esl-toc"><button type="button" class="esl-toc__title" aria-expanded="true" aria-controls="esl-toc-list"><span class="esl-toc__title-text">Contents</span><span class="esl-toc__toggle" aria-hidden="true"></span></button><nav class="esl-toc__nav" aria-label="Contents"><ul id="esl-toc-list" class="esl-toc__list"><li class="esl-toc__item esl-toc__item--h2"><div class="esl-toc__row"><a class="esl-toc__link" href="#what-is-an-article"><span class="esl-toc__num" aria-hidden="true">1</span><span class="esl-toc__label">What Is an Article?</span></a></div></li><li class="esl-toc__item esl-toc__item--h2"><div class="esl-toc__row"><a class="esl-toc__link" href="#different-types-of-articles"><span class="esl-toc__num" aria-hidden="true">2</span><span class="esl-toc__label">Different Types of Articles</span></a><button type="button" class="esl-toc__expand" aria-expanded="false" aria-label="Show subsections"></button></div><ul class="esl-toc__sub"><li class="esl-toc__item esl-toc__item--h3"><a class="esl-toc__link" href="#definite-article">Definite Article</a></li><li class="esl-toc__item esl-toc__item--h3"><a class="esl-toc__link" href="#indefinite-articles">Indefinite Articles</a></li></ul></li><li class="esl-toc__item esl-toc__item--h2"><div class="esl-toc__row"><a class="esl-toc__link" href="#rules-for-using-articles"><span class="esl-toc__num" aria-hidden="true">3</span><span class="esl-toc__label">Rules for Using Articles</span></a><button type="button" class="esl-toc__expand" aria-expanded="false" aria-label="Show subsections"></button></div><ul class="esl-toc__sub"><li class="esl-toc__item esl-toc__item--h3"><a class="esl-toc__link" href="#rule-1-article-choice-depends-on-sound">Rule #1: Article choice depends on sound</a></li><li class="esl-toc__item esl-toc__item--h3"><a class="esl-toc__link" href="#rule-2-articles-with-adjectives">Rule #2: Articles with adjectives</a></li><li class="esl-toc__item esl-toc__item--h3"><a class="esl-toc__link" href="#rule-3-uncountable-nouns">Rule #3: Uncountable nouns</a></li><li class="esl-toc__item esl-toc__item--h3"><a class="esl-toc__link" href="#rule-4-articles-and-possessive-pronouns">Rule #4: Articles and possessive pronouns</a></li><li class="esl-toc__item esl-toc__item--h3"><a class="esl-toc__link" href="#rule-5-when-articles-are-omitted">Rule #5: When articles are omitted</a></li></ul></li><li class="esl-toc__item esl-toc__item--h2"><div class="esl-toc__row"><a class="esl-toc__link" href="#when-not-to-use-an-english-article"><span class="esl-toc__num" aria-hidden="true">4</span><span class="esl-toc__label">
54When Not to Use an English Article</span></a></div></li><li class="esl-toc__item esl-toc__item--h2"><div class="esl-toc__row"><a class="esl-toc__link" href="#articles-with-countable-and-uncountable-nouns"><span class="esl-toc__num" aria-hidden="true">5</span><span class="esl-toc__label">Articles with Countable and Uncountable Nouns</span></a></div></li><li class="esl-toc__item esl-toc__item--h2"><div class="esl-toc__row"><a class="esl-toc__link" href="#how-to-use-articles-a-an-the-video"><span class="esl-toc__num" aria-hidden="true">6</span><span class="esl-toc__label">How to Use Articles (A / An / The) | Video</span></a></div></li></ul></nav></div><p>When studying English grammar, you may have come across <strong>articles</strong>. In this lesson, we will take a clear and structured look at what an article is, how it is used, and the rules surrounding it. The explanation is supported by examples and <a href="https://7esl.com/articles-worksheet/">exercises</a> so that you can gain a solid understanding of how articles function in real sentences.</p><h2 id="what-is-an-article">What Is an Article?</h2><p>In English grammar, there are two different types of articles: the <strong>definite article</strong> and the <strong>indefinite articles</strong>. In simple terms, an article tells the listener or reader whether a noun is <strong>specific</strong> or <strong>non-specific</strong>.</p><div class="mv-ads esl-ad-slot" data-slot="cat-landing" style="min-height:350px;margin:22px auto;max-width:340px;text-align:center;"></div><p>The three English articles are: <strong>a</strong>, <strong>an</strong>, and <strong>the</strong>.</p><p>Let’s look at some examples to clarify the meaning of an article.</p><ul><li><em>During <strong>the</strong> long journey, the family played car games.</em></li></ul><div class="mv-ads esl-ad-slot" data-slot="cat-landing" style="min-height:350px;margin:22px auto;max-width:340px;text-align:center;"></div><p>Here, the article <strong>the</strong> shows that we are talking about a <strong>specific</strong> journey and a <strong>specific</strong> family.</p><p>If we change the article, the meaning becomes more general:</p><ul><li><em>During <strong>a</strong> long journey, <strong>a</strong> family can play car games.</em></li></ul><div class="mv-ads esl-ad-slot" data-slot="cat-landing" style="min-height:350px;margin:22px auto;max-width:340px;text-align:center;"></div><p class="esl-adfree-nudge" style="max-width:340px;margin:-14px auto 22px;text-align:center;font-size:12px;line-height:1.5;color:#94a3b8;">Ads paying for your free English lessons. Prefer a quiet page? <a href="https://7esl.com/membership/?src=ad_slot" style="color:#64748b;text-decoration:underline;">Go ad-free</a></p><p>By changing the article, the sentence now refers to any journey or any family, not a particular one.</p><p><strong>Quick notes:</strong></p><ul><li>Articles are small but very important words in English.</li><li>Articles are considered adjectives because they modify nouns.</li><li>Articles always come before the nouns they describe.</li></ul><p><img loading="lazy" fetchpriority="high" decoding="async" class="alignnone wp-image-17620 size-full" src="https://7esl.com/wp-content/uploads/2018/01/Articles_-A2FAN2F-THE-1.jpg" alt="English articles a an the grammar rules and examples" width="2980" height="3089" title="Articles Landing 1" srcset="https://7esl.com/wp-content/uploads/2018/01/Articles_-A2FAN2F-THE-1.jpg 2980w, https://7esl.com/wp-content/uploads/2018/01/Articles_-A2FAN2F-THE-1-460x477.jpg 460w, https://7esl.com/wp-content/uploads/2018/01/Articles_-A2FAN2F-THE-1-768x796.jpg 768w, https://7esl.com/wp-content/uploads/2018/01/Articles_-A2FAN2F-THE-1-988x1024.jpg 988w, https://7esl.com/wp-content/uploads/2018/01/Articles_-A2FAN2F-THE-1-116x120.jpg 116w, https://7esl.com/wp-content/uploads/2018/01/Articles_-A2FAN2F-THE-1-310x321.jpg 310w" sizes="(max-width: 2980px) 100vw, 2980px" /></p><h2 id="different-types-of-articles">Different Types of Articles</h2><p>English has two types of articles, each with its own purpose:</p><ul><li><strong>Definite article:</strong> <em>the</em></li><li><strong>
54Indefinite articles:</strong> <em>a</em> and <em>an</em></li></ul><h3 id="definite-article">Definite Article</h3><p>The word <strong>the</strong> is called the definite article. It is used when the speaker is referring to something specific or something that is already known to the listener.</p><p>The definite article can be used with singular nouns, plural nouns, and uncountable nouns.</p><ul><li>Please show me <strong>the</strong> photo.</li><li>Can I see <strong>the</strong> blue dress? I do not like <strong>the</strong> red one.</li><li>Are we going to watch <strong>the</strong> football game?</li><li>I need <strong>the</strong> long wire; it is <strong>the</strong> only one that will reach the socket.</li></ul><h3 id="indefinite-articles">Indefinite Articles</h3><p>The indefinite articles are <strong>a</strong> and <strong>an</strong>. They are used when we are talking about something in a general or non-specific way.</p><p><strong>Important rule:</strong> The choice between <strong>a</strong> and <strong>an</strong> depends on the <strong>sound</strong> at the beginning of the word, not the letter.</p><ul><li>Use <strong>a</strong> before words that begin with a <strong>consonant sound</strong>.</li><li>Use <strong>an</strong> before words that begin with a <strong>vowel sound</strong>.</li></ul><p>Examples:</p><ul><li>I need to read <strong>a</strong> book.</li><li>I am going to watch <strong>a</strong> movie.</li><li>There is <strong>an</strong> animal in the garden.</li><li>Sally has <strong>an</strong> invention she is working on.</li></ul><h2 id="rules-for-using-articles">Rules for Using Articles</h2><h3 id="rule-1-article-choice-depends-on-sound">Rule #1: Article choice depends on sound</h3><p>Some words begin with a consonant letter but have a vowel sound, or vice versa.</p><ul><li><em>It is <strong>an</strong> honour to meet the Queen.</em> (The “h” is silent.)</li><li><em>He is <strong>a</strong> United Nations representative.</em>
54 (“United” begins with a /j/ sound.)</li><li><em>She is <strong>a</strong> university student.</em></li></ul><h3 id="rule-2-articles-with-adjectives">Rule #2: Articles with adjectives</h3><p>When a noun is modified by an adjective, the article is chosen based on the <strong>adjective’s sound</strong>, not the noun.</p><ul><li><em>The <strong>Inuit</strong> people traditionally lived in <strong>a</strong> large igloo.</em></li><li><em>Last week I read <strong>an</strong> amazing book.</em></li></ul><h3 id="rule-3-uncountable-nouns">Rule #3: Uncountable nouns</h3><p>Uncountable nouns cannot be used with <strong>a</strong> or <strong>an</strong>.</p><p>Incorrect:</p><ul><li><em>Please give the dog <strong>a</strong> water.</em></li></ul><p>Correct alternatives:</p><ul><li><em>Please give the dog <strong>some</strong> water.</em></li><li><em>Please give the dog <strong>a bowl of</strong> water.</em></li></ul><h3 id="rule-4-articles-and-possessive-pronouns">Rule #4: Articles and possessive pronouns</h3><p>Articles are not used together with possessive pronouns.</p><p>Incorrect:</p><ul><li><em>Have you got <strong>the</strong> my coat?</em></li></ul><p>Correct:</p><ul><li><em>Have you got my coat?</em></li></ul><h3 id="rule-5-when-articles-are-omitted">Rule #5: When articles are omitted</h3><p>Sometimes, no article is needed:</p><ul><li><em>I like to play football.</em></li><li><em>She has breakfast at 7 a.m.</em></li></ul><h2 id="when-not-to-use-an-english-article">When Not to Use an English Article</h2><ol><li>When talking about things in general.</li><li>Before the names of sports and games.</li><li>Before most country names (except the UK, the USA, the Netherlands).</li><li>Before the names of languages.</li><li>Before meals when speaking generally.</li><li>Before noun + number combinations.</li></ol><h2 id="articles-with-countable-and-uncountable-nouns">Articles with Countable and Uncountable Nouns</h2><p>To choose the correct article, you must decide whether a noun is <strong>countable</strong> or <strong>uncountable</strong>.</p><p><strong>Countable nouns:</strong></p><p><em>an apple, a school, one picture, two pictures, three men</em></p><p><strong>Uncountable nouns:</strong></p><p><em>information, water, understanding, wood, cheese</em></p><h2 id="how-to-use-articles-a-an-the-video">How to Use Articles (A / An / The) | Video</h2><div class="embed-container"><iframe loading="lazy" src="https://www.youtube.com/embed/TulY-6VR2sE" frameborder="0" allowfullscreen="allowfullscreen"><br /> </iframe></div><p>Articles are a fundamental part of English grammar. Their correct use depends on the noun they modify and, in many cases, on the sound that follows the article. With practice, these rules become natural and easy to apply.</p></div><section id="esl-panel-test" class="esl-tab-panel esl-mini-quiz-section"
55aria-label="Practice quiz — knowledge check"
56data-test-id="894"><div class="esl-test-wrap" id="esl-mini-wrap-894"><div class="esl-test-header"><div class="esl-test-header__meta"> <span class="esl-badge-diff">mixed</span> <span class="esl-badge-type">Knowledge Check · 5 questions</span></div><h2 style="margin:0 0 4px;font-size:clamp(16px,2.5vw,20px);font-weight:700;color:#fff;line-height:1.3"> Articles Practice Quiz (A1-B2)</h2></div><div class="esl-test-progress-bar"><div class="esl-progress-track"><div class="esl-progress-fill" id="esl-mini-fill-894"
57style="width:20%"></div></div> <span class="esl-progress-label" id="esl-mini-label-894">1 / 5</span></div><div class="esl-test-body"><section class="esl-question-block esl-active"
58id="mini-question-894-1"
59aria-label="Question 1 of 5"
60data-qid="9367"
61data-type="mcq"
62><div class="esl-question-num">Q1</div><h3 class="esl-question-heading">Question 1: I have ___ cat.</h3><fieldset><legend class="esl-sr-only">Question 1 options</legend><div class="esl-options" role="radiogroup"><div class="esl-option"
63data-aid="37403"
64data-correct="1"
65> <input type="radio" id="mini-q9367-opt0" name="mini-q9367" value="37403" class="esl-sr-only"> <label for="mini-q9367-opt0"> <span class="esl-option-letter">A</span> <span class="esl-option-text">a</span> </label></div><div class="esl-option"
66data-aid="37404"
67data-correct="0"
68> <input type="radio" id="mini-q9367-opt1" name="mini-q9367" value="37404" class="esl-sr-only"> <label for="mini-q9367-opt1"> <span class="esl-option-letter">B</span> <span class="esl-option-text">the</span> </label></div><div class="esl-option"
69data-aid="37405"
70data-correct="0"
71> <input type="radio" id="mini-q9367-opt2" name="mini-q9367" value="37405" class="esl-sr-only"> <label for="mini-q9367-opt2"> <span class="esl-option-letter">C</span> <span class="esl-option-text">an</span> </label></div><div class="esl-option"
72data-aid="37406"
73data-correct="0"
74> <input type="radio" id="mini-q9367-opt3" name="mini-q9367" value="37406" class="esl-sr-only"> <label for="mini-q9367-opt3"> <span class="esl-option-letter">D</span> <span class="esl-option-text">some</span> </label></div></div><div class="esl-check-row"> <button class="esl-check-btn" data-qid="9367" type="button"> Check answer </button></div><div class="esl-question-feedback" id="esl-mini-fb-9367"
75aria-live="polite" role="status"> <span class="esl-fb-icon"></span> <span class="esl-fb-text"></span><div class="esl-fb-exp">&quot;a&quot; is correct because we use the indefinite article &quot;a&quot; before a singular countable noun starting with a consonant sound when mentioning it for the first time. &quot;An&quot; is used before vowel sounds, &quot;the&quot; implies a specific cat already known, and &quot;some&quot; is used with plural or uncountable nouns.</div></div><div class="esl-report-wrap" style="margin-top:12px;border-top:1px solid #f1f5f9;padding-top:10px"> <button type="button" class="esl-report-toggle-btn" style="background:none;border:none;color:#64748b;font-size:12px;cursor:pointer;padding:4px 0;display:flex;align-items:center;gap:6px;font-family:inherit;text-decoration:none"
76data-qid="9367"
77data-testid="894"
78data-testtype="post_lesson"
79data-testlevel="mixed"> <span style="font-size:14px">🚩</span> Found a problem with this question? </button><div class="esl-report-form-wrap" style="display:none"><div style="font-size:13px;font-weight:700;color:#0f172a;margin-bottom:10px">Report an issue with this question</div> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Issue type <span style="color:#dc2626">*</span></label> <select class="esl-rep-type" style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;margin-bottom:10px;background:#fff;font-family:inherit"><option value="">— Select issue type —</option><option value="wrong_answer">Wrong answer marked as correct</option><option value="multiple_correct">More than one correct answer</option><option value="unclear">Question is unclear or ambiguous</option><option value="grammar_spelling">Grammar / spelling issue</option><option value="wrong_explanation">Explanation is incorrect</option><option value="technical">Technical / display issue</option><option value="other">Other</option> </select> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Description <small style="font-weight:400">(optional)</small></label><textarea class="esl-rep-desc" placeholder="Briefly describe the problem…" rows="2"
80                                  style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;font-family:inherit;resize:vertical;box-sizing:border-box;margin-bottom:10px"></textarea><label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Email <small style="font-weight:400">
80(optional, for reply)</small></label> <input type="email" class="esl-rep-email" placeholder="[email protected]"
81style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;box-sizing:border-box;margin-bottom:12px;font-family:inherit"><div style="display:flex;gap:8px;align-items:center"> <button type="button" class="esl-rep-submit-btn"
82style="padding:9px 18px;background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit"> Submit Report </button> <button type="button" class="esl-rep-cancel-btn"
83style="padding:9px 14px;background:#f1f5f9;color:#475569;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit"> Cancel </button></div><div class="esl-rep-msg" style="margin-top:8px;font-size:13px"></div></div></div></fieldset></section><section class="esl-question-block"
84id="mini-question-894-2"
85aria-label="Question 2 of 5"
86data-qid="9371"
87data-type="true_false"
88><div class="esl-question-num">Q2</div><h3 class="esl-question-heading">Question 2: We use &quot;an&quot; before the word &quot;university&quot; because it starts with the letter &quot;u.&quot;</h3><fieldset><legend class="esl-sr-only">Question 2 options</legend><div class="esl-options" role="radiogroup"><div class="esl-option"
89data-aid="37416"
90data-correct="0"
91> <input type="radio" id="mini-q9371-opt0" name="mini-q9371" value="37416" class="esl-sr-only"> <label for="mini-q9371-opt0"> <span class="esl-option-letter">A</span> <span class="esl-option-text">True</span> </label></div><div class="esl-option"
92data-aid="37417"
93data-correct="1"
94> <input type="radio" id="mini-q9371-opt1" name="mini-q9371" value="37417" class="esl-sr-only"> <label for="mini-q9371-opt1"> <span class="esl-option-letter">B</span> <span class="esl-option-text">False</span> </label></div></div><div class="esl-check-row"> <button class="esl-check-btn" data-qid="9371" type="button"> Check answer </button></div><div class="esl-question-feedback" id="esl-mini-fb-9371"
95aria-live="polite" role="status"> <span class="esl-fb-icon"></span> <span class="esl-fb-text"></span><div class="esl-fb-exp">False because the choice between &quot;a&quot; and &quot;an&quot; depends on the sound, not the letter. &quot;University&quot; begins with the consonant sound /juː/, so we say &quot;a university,&quot; not &quot;an university.&quot;</div></div><div class="esl-report-wrap" style="margin-top:12px;border-top:1px solid #f1f5f9;padding-top:10px"> <button type="button" class="esl-report-toggle-btn" style="background:none;border:none;color:#64748b;font-size:12px;cursor:pointer;padding:4px 0;display:flex;align-items:center;gap:6px;font-family:inherit;text-decoration:none"
96data-qid="9371"
97data-testid="894"
98data-testtype="post_lesson"
99data-testlevel="mixed"> <span style="font-size:14px">🚩</span> Found a problem with this question? </button><div class="esl-report-form-wrap" style="display:none"><div style="font-size:13px;font-weight:700;color:#0f172a;margin-bottom:10px">Report an issue with this question</div> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Issue type <span style="color:#dc2626">*</span></label> <select class="esl-rep-type" style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;margin-bottom:10px;background:#fff;font-family:inherit"><option value="">— Select issue type —</option><option value="wrong_answer">Wrong answer marked as correct</option><option value="multiple_correct">More than one correct answer</option><option value="unclear">Question is unclear or ambiguous</option><option value="grammar_spelling">Grammar / spelling issue</option><option value="wrong_explanation">Explanation is incorrect</option><option value="technical">Technical / display issue</option><option value="other">Other</option> </select> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Description <small style="font-weight:400">(optional)</small></label><textarea class="esl-rep-desc" placeholder="Briefly describe the problem…" rows="2"
100                                  style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;font-family:inherit;resize:vertical;box-sizing:border-box;margin-bottom:10px"></textarea><label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Email <small style="font-weight:400">
100(optional, for reply)</small></label> <input type="email" class="esl-rep-email" placeholder="[email protected]"
101style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;box-sizing:border-box;margin-bottom:12px;font-family:inherit"><div style="display:flex;gap:8px;align-items:center"> <button type="button" class="esl-rep-submit-btn"
102style="padding:9px 18px;background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit"> Submit Report </button> <button type="button" class="esl-rep-cancel-btn"
103style="padding:9px 14px;background:#f1f5f9;color:#475569;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit"> Cancel </button></div><div class="esl-rep-msg" style="margin-top:8px;font-size:13px"></div></div></div></fieldset></section><section class="esl-question-block"
104id="mini-question-894-3"
105aria-label="Question 3 of 5"
106data-qid="9375"
107data-type="ordering"
108><div class="esl-question-num">Q3</div><h3 class="esl-question-heading">Question 3: Put these words in the correct order to form a sentence:</h3><fieldset><legend class="esl-sr-only">Question 3 options</legend><ul class="esl-order-list" role="group" id="order-9375"><li class="esl-order-item" data-aid="37431" data-pos="2" draggable="true"> <span class="esl-order-handle"></span> <span class="esl-order-text">plays</span> <span class="esl-order-num"></span> <span class="esl-order-arrows"><button type="button" class="esl-order-arrow esl-order-up" aria-label="Move up">▲</button><button type="button" class="esl-order-arrow esl-order-down" aria-label="Move down">▼</button></span></li><li class="esl-order-item" data-aid="37432" data-pos="3" draggable="true"> <span class="esl-order-handle"></span> <span class="esl-order-text">the piano</span> <span class="esl-order-num"></span> <span class="esl-order-arrows"><button type="button" class="esl-order-arrow esl-order-up" aria-label="Move up">▲</button><button type="button" class="esl-order-arrow esl-order-down" aria-label="Move down">▼</button></span></li><li class="esl-order-item" data-aid="37433" data-pos="4" draggable="true"> <span class="esl-order-handle"></span> <span class="esl-order-text">beautifully</span> <span class="esl-order-num"></span> <span class="esl-order-arrows"><button type="button" class="esl-order-arrow esl-order-up" aria-label="Move up">▲</button><button type="button" class="esl-order-arrow esl-order-down" aria-label="Move down">▼</button></span></li><li class="esl-order-item" data-aid="37430" data-pos="1" draggable="true"> <span class="esl-order-handle"></span> <span class="esl-order-text">She</span> <span class="esl-order-num"></span> <span class="esl-order-arrows"><button type="button" class="esl-order-arrow esl-order-up" aria-label="Move up">▲</button><button type="button" class="esl-order-arrow esl-order-down" aria-label="Move down">▼</button></span></li></ul><p class="esl-q-hint">Drag items or use arrows to arrange them in the correct order.</p><div class="esl-check-row"> <button class="esl-check-btn" data-qid="9375" type="button"> Check answer </button></div><div class="esl-question-feedback" id="esl-mini-fb-9375"
109aria-live="polite" role="status"> <span class="esl-fb-icon"></span> <span class="esl-fb-text"></span><div class="esl-fb-exp">The correct order is &quot;She plays the piano beautifully&quot; because musical instruments require the definite article &quot;the&quot; (e.g., play the piano, play the guitar).</div></div><div class="esl-report-wrap" style="margin-top:12px;border-top:1px solid #f1f5f9;padding-top:10px"> <button type="button" class="esl-report-toggle-btn" style="background:none;border:none;color:#64748b;font-size:12px;cursor:pointer;padding:4px 0;display:flex;align-items:center;gap:6px;font-family:inherit;text-decoration:none"
110data-qid="9375"
111data-testid="894"
112data-testtype="post_lesson"
113data-testlevel="mixed"> <span style="font-size:14px">🚩</span> Found a problem with this question? </button><div class="esl-report-form-wrap" style="display:none"><div style="font-size:13px;font-weight:700;color:#0f172a;margin-bottom:10px">Report an issue with this question</div> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Issue type <span style="color:#dc2626">*</span></label> <select class="esl-rep-type" style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;margin-bottom:10px;background:#fff;font-family:inherit"><option value="">— Select issue type —</option><option value="wrong_answer">Wrong answer marked as correct</option><option value="multiple_correct">More than one correct answer</option><option value="unclear">Question is unclear or ambiguous</option><option value="grammar_spelling">Grammar / spelling issue</option><option value="wrong_explanation">Explanation is incorrect</option><option value="technical">Technical / display issue</option><option value="other">Other</option> </select> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Description <small style="font-weight:400">(optional)</small></label><textarea class="esl-rep-desc" placeholder="Briefly describe the problem…" rows="2"
114                                  style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;font-family:inherit;resize:vertical;box-sizing:border-box;margin-bottom:10px"></textarea><label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Email <small style="font-weight:400">
114(optional, for reply)</small></label> <input type="email" class="esl-rep-email" placeholder="[email protected]"
115style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;box-sizing:border-box;margin-bottom:12px;font-family:inherit"><div style="display:flex;gap:8px;align-items:center"> <button type="button" class="esl-rep-submit-btn"
116style="padding:9px 18px;background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit"> Submit Report </button> <button type="button" class="esl-rep-cancel-btn"
117style="padding:9px 14px;background:#f1f5f9;color:#475569;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit"> Cancel </button></div><div class="esl-rep-msg" style="margin-top:8px;font-size:13px"></div></div></div></fieldset></section><section class="esl-question-block"
118id="mini-question-894-4"
119aria-label="Question 4 of 5"
120data-qid="9379"
121data-type="matching"
122><div class="esl-question-num">Q4</div><h3 class="esl-question-heading">Question 4: Match each phrase to the correct article rule.</h3><fieldset><legend class="esl-sr-only">Question 4 options</legend><div class="esl-match-wrap" role="group" id="match-9379"><div class="esl-match-col esl-match-col--left"></div><div class="esl-match-col esl-match-col--arrows" id="arrows-9379"></div><div class="esl-match-col esl-match-col--right"></div></div><p class="esl-q-hint">Select an item on the left, then tap its match on the right.</p> <input type="hidden" class="esl-match-answer" data-qid="9379"><div class="esl-check-row"> <button class="esl-check-btn" data-qid="9379" type="button"> Check answer </button></div><div class="esl-question-feedback" id="esl-mini-fb-9379"
123aria-live="polite" role="status"> <span class="esl-fb-icon"></span> <span class="esl-fb-text"></span><div class="esl-fb-exp">{&quot;&quot;content&quot;&quot;: &quot;&quot;Zero article with languages&quot;&quot;</div></div><div class="esl-report-wrap" style="margin-top:12px;border-top:1px solid #f1f5f9;padding-top:10px"> <button type="button" class="esl-report-toggle-btn" style="background:none;border:none;color:#64748b;font-size:12px;cursor:pointer;padding:4px 0;display:flex;align-items:center;gap:6px;font-family:inherit;text-decoration:none"
124data-qid="9379"
125data-testid="894"
126data-testtype="post_lesson"
127data-testlevel="mixed"> <span style="font-size:14px">🚩</span> Found a problem with this question? </button><div class="esl-report-form-wrap" style="display:none"><div style="font-size:13px;font-weight:700;color:#0f172a;margin-bottom:10px">Report an issue with this question</div> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Issue type <span style="color:#dc2626">*</span></label> <select class="esl-rep-type" style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;margin-bottom:10px;background:#fff;font-family:inherit"><option value="">— Select issue type —</option><option value="wrong_answer">Wrong answer marked as correct</option><option value="multiple_correct">More than one correct answer</option><option value="unclear">Question is unclear or ambiguous</option><option value="grammar_spelling">Grammar / spelling issue</option><option value="wrong_explanation">Explanation is incorrect</option><option value="technical">Technical / display issue</option><option value="other">Other</option> </select> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Description <small style="font-weight:400">(optional)</small></label><textarea class="esl-rep-desc" placeholder="Briefly describe the problem…" rows="2"
128                                  style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;font-family:inherit;resize:vertical;box-sizing:border-box;margin-bottom:10px"></textarea><label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Email <small style="font-weight:400">
128(optional, for reply)</small></label> <input type="email" class="esl-rep-email" placeholder="[email protected]"
129style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;box-sizing:border-box;margin-bottom:12px;font-family:inherit"><div style="display:flex;gap:8px;align-items:center"> <button type="button" class="esl-rep-submit-btn"
130style="padding:9px 18px;background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit"> Submit Report </button> <button type="button" class="esl-rep-cancel-btn"
131style="padding:9px 14px;background:#f1f5f9;color:#475569;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit"> Cancel </button></div><div class="esl-rep-msg" style="margin-top:8px;font-size:13px"></div></div></div></fieldset></section><section class="esl-question-block"
132id="mini-question-894-5"
133aria-label="Question 5 of 5"
134data-qid="9383"
135data-type="mcq"
136><div class="esl-question-num">Q5</div><h3 class="esl-question-heading">Question 5: She gave me ___ useful piece of advice about my career.</h3><fieldset><legend class="esl-sr-only">Question 5 options</legend><div class="esl-options" role="radiogroup"><div class="esl-option"
137data-aid="37453"
138data-correct="1"
139> <input type="radio" id="mini-q9383-opt0" name="mini-q9383" value="37453" class="esl-sr-only"> <label for="mini-q9383-opt0"> <span class="esl-option-letter">A</span> <span class="esl-option-text">a</span> </label></div><div class="esl-option"
140data-aid="37454"
141data-correct="0"
142> <input type="radio" id="mini-q9383-opt1" name="mini-q9383" value="37454" class="esl-sr-only"> <label for="mini-q9383-opt1"> <span class="esl-option-letter">B</span> <span class="esl-option-text">an</span> </label></div><div class="esl-option"
143data-aid="37455"
144data-correct="0"
145> <input type="radio" id="mini-q9383-opt2" name="mini-q9383" value="37455" class="esl-sr-only"> <label for="mini-q9383-opt2"> <span class="esl-option-letter">C</span> <span class="esl-option-text">no article</span> </label></div><div class="esl-option"
146data-aid="37456"
147data-correct="0"
148> <input type="radio" id="mini-q9383-opt3" name="mini-q9383" value="37456" class="esl-sr-only"> <label for="mini-q9383-opt3"> <span class="esl-option-letter">D</span> <span class="esl-option-text">the</span> </label></div></div><div class="esl-check-row"> <button class="esl-check-btn" data-qid="9383" type="button"> Check answer </button></div><div class="esl-question-feedback" id="esl-mini-fb-9383"
149aria-live="polite" role="status"> <span class="esl-fb-icon"></span> <span class="esl-fb-text"></span><div class="esl-fb-exp">&quot;a&quot; is correct because &quot;useful&quot; begins with the consonant sound /juː/, not a vowel sound, so we use &quot;a&quot; rather than &quot;an.&quot; &quot;The&quot; would require prior mention or shared knowledge of this advice. &quot;No article&quot; is ungrammatical before a singular countable noun like &quot;piece.&quot;</div></div><div class="esl-report-wrap" style="margin-top:12px;border-top:1px solid #f1f5f9;padding-top:10px"> <button type="button" class="esl-report-toggle-btn" style="background:none;border:none;color:#64748b;font-size:12px;cursor:pointer;padding:4px 0;display:flex;align-items:center;gap:6px;font-family:inherit;text-decoration:none"
150data-qid="9383"
151data-testid="894"
152data-testtype="post_lesson"
153data-testlevel="mixed"> <span style="font-size:14px">🚩</span> Found a problem with this question? </button><div class="esl-report-form-wrap" style="display:none"><div style="font-size:13px;font-weight:700;color:#0f172a;margin-bottom:10px">Report an issue with this question</div> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Issue type <span style="color:#dc2626">*</span></label> <select class="esl-rep-type" style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;margin-bottom:10px;background:#fff;font-family:inherit"><option value="">— Select issue type —</option><option value="wrong_answer">Wrong answer marked as correct</option><option value="multiple_correct">More than one correct answer</option><option value="unclear">Question is unclear or ambiguous</option><option value="grammar_spelling">Grammar / spelling issue</option><option value="wrong_explanation">Explanation is incorrect</option><option value="technical">Technical / display issue</option><option value="other">Other</option> </select> <label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Description <small style="font-weight:400">(optional)</small></label><textarea class="esl-rep-desc" placeholder="Briefly describe the problem…" rows="2"
154                                  style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;font-family:inherit;resize:vertical;box-sizing:border-box;margin-bottom:10px"></textarea><label style="font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:4px">Email <small style="font-weight:400">
154(optional, for reply)</small></label> <input type="email" class="esl-rep-email" placeholder="[email protected]"
155style="width:100%;padding:8px 10px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;box-sizing:border-box;margin-bottom:12px;font-family:inherit"><div style="display:flex;gap:8px;align-items:center"> <button type="button" class="esl-rep-submit-btn"
156style="padding:9px 18px;background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit"> Submit Report </button> <button type="button" class="esl-rep-cancel-btn"
157style="padding:9px 14px;background:#f1f5f9;color:#475569;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit"> Cancel </button></div><div class="esl-rep-msg" style="margin-top:8px;font-size:13px"></div></div></div></fieldset></section></div><div class="esl-test-nav"> <button class="esl-btn esl-btn-ghost" id="esl-mini-prev-894"
158type="button" style="visibility:hidden">← Back</button> <button class="esl-btn esl-btn-primary" id="esl-mini-next-894"
159type="button">Next →</button> <button class="esl-btn esl-btn-submit" id="esl-mini-submit-894"
160type="button" style="display:none"
161data-test-id="894"
162data-logged-in="0"> Submit ✓ </button></div></div></section> 
162<script id="esl-mini-driver-894">(function(){
163      var REST     = 'https://7esl.com/wp-json/esl/v1/';
164      var NONCE    = 'cd616dd652';
165      var TESTID   = 894;
166      var TOTAL    = 5;
167      var FULLCOUNT= 20;
168      var FULLURL  = 'https://7esl.com/practice/grammar/articles-test/';
169      var LOGGED   = 0 === 1;
170      var PURL     = 'https://7esl.com/profile/';
171      /* v1.9.29 (C4) — chuyên mục của chính bài này, dùng khi không có việc
172         tiếp theo riêng cho người đang xem. Xem khối chú thích ở đầu file. */
173      var CATNAME  = '';
174      var CATURL   = '';
175      var MINI_XP_MAX   = 5;   // fixed max = 5 XP
176      var FULL_TEST_XP  = 22;   // full test DB xp_reward
177      var PID      = 894;
178
179      var current  = 0, answers = {}, checked = 0, correct_count = 0;
180      var started  = Date.now();
181
182      var panel   = document.getElementById('esl-panel-test');
183      var wrap    = document.getElementById('esl-mini-wrap-'+PID);
184      var btnPrev = document.getElementById('esl-mini-prev-'+PID);
185      var btnNext = document.getElementById('esl-mini-next-'+PID);
186      var btnSub  = document.getElementById('esl-mini-submit-'+PID);
187      var fill    = document.getElementById('esl-mini-fill-'+PID);
188      var lbl     = document.getElementById('esl-mini-label-'+PID);
189      var blocks  = Array.from(panel.querySelectorAll('.esl-question-block'));
190
191      function showBlock(n){
192        blocks.forEach(function(b,i){ b.classList.toggle('esl-active', i===n); });
193        if(fill) fill.style.width = Math.round((n+1)/TOTAL*100)+'%';
194        if(lbl)  lbl.textContent  = (n+1)+' / '+TOTAL;
195        btnPrev.style.visibility = n===0 ? 'hidden' : 'visible';
196        btnNext.style.display    = n===TOTAL-1 ? 'none' : '';
197        if(n===TOTAL-1 && checked>0) btnSub.style.display='';
198      }
199
200      btnPrev.addEventListener('click', function(){ if(current>0){ current--; showBlock(current); }});
201      btnNext.addEventListener('click', function(){
202        if(current<TOTAL-1){ current++; showBlock(current);
203          if(current===TOTAL-1 && checked>0) btnSub.style.display='';
204        }
205      });
206      btnSub.addEventListener('click', doSubmit);
207
208      /* Option click */
209      panel.addEventListener('click', function(e){
210        var opt = e.target.closest('.esl-option');
211        if(opt){
212          var block = opt.closest('.esl-question-block');
213          if(!block || block.classList.contains('esl-checked')) return;
214          block.querySelectorAll('.esl-option').forEach(function(o){
215            o.classList.remove('esl-selected');
216            var r = o.querySelector('input[type="radio"]'); if(r) r.checked = false;
217          });
218          opt.classList.add('esl-selected');
219          var radio = opt.querySelector('input[type="radio"]'); if(radio) radio.checked = true;
220          answers[block.dataset.qid] = opt.dataset.aid;
221          return;
222        }
223
224        /* ── Matching ── */
225        var matchItem = e.target.closest('.esl-match-item');
226        if(matchItem){
227          var block = matchItem.closest('.esl-question-block');
228          if(!block || block.classList.contains('esl-checked')) return;
229          var side = matchItem.getAttribute('data-side');
230          var wrap = block.querySelector('.esl-match-wrap');
231          if(side === 'left'){
232            wrap.querySelectorAll('.esl-match-item[data-side="left"]').forEach(function(i){ i.classList.remove('esl-match-active'); });
233            matchItem.classList.toggle('esl-match-active', !matchItem.classList.contains('esl-match-active'));
234          } else {
235            var selLeft = wrap.querySelector('.esl-match-item[data-side="left"].esl-match-active');
236            if(!selLeft) return;
237            // Remove stale pairings
238            wrap.querySelectorAll('.esl-match-item[data-side="left"]').forEach(function(l){
239              if(l.getAttribute('data-matched') === matchItem.getAttribute('data-aid')) l.removeAttribute('data-matched');
240            });
241            selLeft.setAttribute('data-matched', matchItem.getAttribute('data-aid'));
242            selLeft.classList.remove('esl-match-active');
243            // Sync paired visual
244            wrap.querySelectorAll('.esl-match-item[data-side="left"]').forEach(function(l){
245              l.classList.toggle('esl-match-paired', !!l.getAttribute('data-matched'));
246            });
247            var pairedRids = [];
248            wrap.querySelectorAll('.esl-match-item[data-side="left"]').forEach(function(l){
249              if(l.getAttribute('data-matched')) pairedRids.push(l.getAttribute('data-matched'));
250            });
251            wrap.querySelectorAll('.esl-match-item[data-side="right"]').forEach(function(r){
252              r.classList.toggle('esl-match-paired', pairedRids.indexOf(r.getAttribute('data-aid')) !== -1);
253            });
254            // Build answer map {leftAid: rightAid}
255            var ansMap = {};
256            wrap.querySelectorAll('.esl-match-item[data-side="left"]').forEach(function(l){
257              if(l.getAttribute('data-matched')) ansMap[l.getAttribute('data-aid')] = l.getAttribute('data-matched');
258            });
259            answers[block.dataset.qid] = ansMap;
260          }
261          return;
262        }
263
264        /* ── Sentence building ── */
265        var chip = e.target.closest('.esl-word-chip');
266        if(chip){
267          var block = chip.closest('.esl-question-block');
268          if(!block || block.classList.contains('esl-checked')) return;
269          var sbAns  = block.querySelector('.esl-sentence-answer');
270          var sbBank = block.querySelector('.esl-sentence-bank');
271          if(chip.classList.contains('esl-word-in-answer')){
272            // Return to bank
273            chip.remove();
274            var orig = sbBank.querySelector('[data-aid="'+chip.getAttribute('data-aid')+'"].esl-word-used');
275            if(!orig) orig = sbBank.querySelector('[data-aid="'+chip.getAttribute('data-aid')+'"]');
276            if(orig) orig.style.opacity=''; orig && (orig.style.pointerEvents='');
277            if(!sbAns.querySelector('.esl-word-chip')){
278              var ph = document.createElement('span');
279              ph.className = 'esl-sentence-placeholder';
280              ph.textContent = 'Tap words below to build the sentence';
281              sbAns.appendChild(ph);
282            }
283          } else {
284            // Add to answer
285            if(chip.style.opacity === '0.3' || chip.style.opacity === '.3') return;
286            chip.style.opacity = '0.3';
287            chip.style.pointerEvents = 'none';
288            var ansChip = document.createElement('span');
289            ansChip.className = 'esl-word-chip esl-word-in-answer';
290            ansChip.setAttribute('data-aid', chip.getAttribute('data-aid'));
291            ansChip.textContent = chip.textContent;
292            // Styled via CSS class esl-word-in-answer
293            var ph = sbAns.querySelector('.esl-sentence-placeholder');
294            if(ph) ph.remove();
295            sbAns.appendChild(ansChip);
296            sbAns.style.borderColor = '#27a9cb';
297            sbAns.style.background = 'rgba(39,169,203,.04)';
298          }
299          answers[block.dataset.qid] = Array.from(sbAns.querySelectorAll('.esl-word-chip')).map(function(c){ return c.getAttribute('data-aid'); });
300          return;
301        }
302
303        var cb = e.target.closest('.esl-check-btn');
304        if(cb){ doCheck(cb); return; }
305
306        /* ── Bug Report ── */
307        var repToggle = e.target.closest('.esl-report-toggle-btn');
308        if (repToggle) {
309          var fw = repToggle.nextElementSibling;
310          if (fw && fw.classList.contains('esl-report-form-wrap')) {
311            var isHidden = fw.style.display === 'none';
312            fw.style.display = isHidden ? 'block' : 'none';
313            if (isHidden) { var s = fw.querySelector('.esl-rep-type'); if(s) s.focus(); }
314          }
315          return;
316        }
317        var repCancel = e.target.closest('.esl-rep-cancel-btn');
318        if (repCancel) {
319          var fw = repCancel.closest('.esl-report-form-wrap');
320          if (fw) fw.style.display = 'none';
321          return;
322        }
323        var repSubmit = e.target.closest('.esl-rep-submit-btn');
324        if (repSubmit) {
325          var fw    = repSubmit.closest('.esl-report-form-wrap');
326          var repWrap = repSubmit.closest('.esl-report-wrap');
327          var tog   = repWrap ? repWrap.querySelector('.esl-report-toggle-btn') : null;
328          var qid2  = tog ? (tog.getAttribute('data-qid') || '') : '';
329          var ttype2= tog ? (tog.getAttribute('data-testtype') || '') : '';
330          var tlvl2 = tog ? (tog.getAttribute('data-testlevel') || '') : '';
331          var typeEl2  = fw.querySelector('.esl-rep-type');
332          var descEl2  = fw.querySelector('.esl-rep-desc');
333          var emailEl2 = fw.querySelector('.esl-rep-email');
334          var msgEl2   = fw.querySelector('.esl-rep-msg');
335          if (!typeEl2.value) {
336            msgEl2.innerHTML = '<span style="color:#dc2626">\u26A0\uFE0F Please select an issue type.</span>';
337            typeEl2.style.borderColor = '#dc2626'; return;
338          }
339          typeEl2.style.borderColor = '#e2e8f0';
340          var userAns2 = answers[qid2] !== undefined ? JSON.stringify(answers[qid2]) : '';
341          repSubmit.disabled = true; repSubmit.textContent = 'Sending\u2026';
342          msgEl2.innerHTML = '';
343          fetch(REST + 'questions/' + qid2 + '/report', {
344            method: 'POST',
345            headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': NONCE },
346            credentials: 'include',
347            body: JSON.stringify({
348              report_type: typeEl2.value, description: descEl2.value,
349              email: emailEl2.value, user_answer: userAns2, correct_answer: '',
350              page_url: window.location.href, test_type: ttype2, test_level: tlvl2
351            })
352          }).then(function(r){ return r.json(); }).then(function(j){
353            if (j.success) {
354              msgEl2.innerHTML = '<span style="color:#16a34a">\u2713 Thanks! We\'ll review this question soon.</span>';
355              repSubmit.textContent = 'Sent \u2713'; repSubmit.style.background = '#16a34a';
356              typeEl2.value=''; descEl2.value=''; emailEl2.value='';
357              setTimeout(function(){ fw.style.display='none'; }, 2800);
358            } else {
359              msgEl2.innerHTML = '<span style="color:#dc2626">\u26A0\uFE0F '+(j.message||'Failed.')+'</span>';
360              repSubmit.disabled=false; repSubmit.textContent='Submit Report';
361            }
362          }).catch(function(){
363            msgEl2.innerHTML = '<span style="color:#dc2626">\u26A0\uFE0F Network error.</span>';
364            repSubmit.disabled=false; repSubmit.textContent='Submit Report';
365          });
366          return;
367        }
368      });
369
370      /* ── Ordering drag-drop ── */
371      panel.addEventListener('dragstart', function(e){
372        var item = e.target.closest('.esl-order-item');
373        if(!item) return;
374        var block = item.closest('.esl-question-block');
375        if(block && block.classList.contains('esl-checked')) { e.preventDefault(); return; }
376        e.dataTransfer.effectAllowed = 'move';
377        e.dataTransfer.setData('text/plain', item.getAttribute('data-aid'));
378        setTimeout(function(){ item.classList.add('esl-order-dragging'); }, 0);
379      });
380      panel.addEventListener('dragend', function(e){
381        var item = e.target.closest('.esl-order-item');
382        if(item) item.classList.remove('esl-order-dragging');
383        panel.querySelectorAll('.esl-order-item').forEach(function(i){ i.classList.remove('esl-order-over'); });
384      });
385      panel.addEventListener('dragover', function(e){
386        var item = e.target.closest('.esl-order-item');
387        if(!item) return;
388        e.preventDefault();
389        panel.querySelectorAll('.esl-order-item').forEach(function(i){ i.classList.remove('esl-order-over'); });
390        item.classList.add('esl-order-over');
391      });
392      panel.addEventListener('drop', function(e){
393        var target = e.target.closest('.esl-order-item');
394        if(!target) return;
395        e.preventDefault();
396        var fromId = e.dataTransfer.getData('text/plain');
397        var list   = target.closest('.esl-order-list');
398        var fromEl = list ? list.querySelector('[data-aid="'+fromId+'"]') : null;
399        if(!fromEl || fromEl === target) return;
400        var items = Array.from(list.children);
401        var fi = items.indexOf(fromEl), ti = items.indexOf(target);
402        list.insertBefore(fromEl, fi < ti ? target.nextSibling : target);
403        var block = list.closest('.esl-question-block');
404        if(block) answers[block.dataset.qid] = Array.from(list.querySelectorAll('.esl-order-item')).map(function(i){ return i.getAttribute('data-aid'); });
405      });
406
407      panel.addEventListener('input', function(e){
408        if(!e.target.classList.contains('esl-fill-input')) return;
409        var block = e.target.closest('.esl-question-block');
410        if(block) answers[block.dataset.qid] = e.target.value;
411      });
412
413      /* ── Ordering arrows (touch-friendly) ── */
414      panel.addEventListener('click', function(e){
415        var arrow = e.target.closest('.esl-order-arrow');
416        if(!arrow) return;
417        var item = arrow.closest('.esl-order-item');
418        var block = item ? item.closest('.esl-question-block') : null;
419        if(!block || block.classList.contains('esl-checked')) return;
420        var list = item.closest('.esl-order-list');
421        if(!list) return;
422        var isUp = arrow.classList.contains('esl-order-up');
423        var sibling = isUp ? item.previousElementSibling : item.nextElementSibling;
424        if(!sibling) return;
425        // Animate swap
426        item.style.transition = 'transform .2s ease';
427        sibling.style.transition = 'transform .2s ease';
428        if(isUp) { list.insertBefore(item, sibling); }
429        else     { list.insertBefore(sibling, item); }
430        item.style.animation = 'esl-order-pop .25s ease';
431        setTimeout(function(){ item.style.animation = ''; }, 250);
432        answers[block.dataset.qid] = Array.from(list.querySelectorAll('.esl-order-item')).map(function(i){ return i.getAttribute('data-aid'); });
433      });
434
435      /* ── Mini confetti burst ── */
436      function miniConfetti(el){
437        var colors = ['#27a9cb','#16a34a','#f59e0b','#8b5cf6','#ef4444','#06b6d4'];
438        var rect = el.getBoundingClientRect();
439        for(var i=0;i<12;i++){
440          var p = document.createElement('div');
441          p.className = 'esl-confetti-particle';
442          p.style.left = (rect.left + rect.width/2 + (Math.random()-0.5)*60) + 'px';
443          p.style.top = (rect.top + window.scrollY - 10) + 'px';
444          p.style.background = colors[Math.floor(Math.random()*colors.length)];
445          p.style.animationDuration = (.5+Math.random()*.5)+'s';
446          p.style.animationDelay = (Math.random()*.15)+'s';
447          document.body.appendChild(p);
448          setTimeout(function(){ p.remove(); }, 1200);
449        }
450      }
451
452      panel.addEventListener('keydown', function(e){
453        if(e.key===' '||e.key==='Enter'){
454          var opt=e.target.closest('.esl-option'); if(opt){e.preventDefault();opt.click();}
455        }
456      });
457
458      function doCheck(btn){
459        var block = btn.closest('.esl-question-block');
460        if(!block||block.classList.contains('esl-checked')) return;
461        block.classList.add('esl-checked');
462        btn.disabled=true;
463        var type=block.dataset.type, qid=block.dataset.qid, isCorrect=false;
464
465        if(type==='fill_blank'){
466          var inp=block.querySelector('.esl-fill-input');
467          var val=inp?inp.value.trim().toLowerCase():'';
468          var acc=(block.dataset.correctAnswers||'').split('||').map(function(s){return s.trim().toLowerCase();});
469          isCorrect=acc.some(function(a){return a===val;});
470          if(inp){inp.disabled=true;inp.classList.add(isCorrect?'esl-correct':'esl-wrong');}
471        } else if(type==='matching'){
472          // Matching: check pairs via data-matched attributes
473          var matchWrap=block.querySelector('.esl-match-wrap');
474          if(matchWrap){
475            var pairs={},correct=0,total=0;
476            matchWrap.querySelectorAll('.esl-match-item[data-side="left"]').forEach(function(l){
477              var matched=l.getAttribute('data-matched');
478              var pg=l.getAttribute('data-pair');
479              var rightEl=matchWrap.querySelector('.esl-match-item[data-side="right"][data-pair="'+pg+'"]');
480              total++;
481              if(matched&&rightEl&&matched===rightEl.getAttribute('data-aid')){
482                correct++;l.classList.add('esl-match-correct');
483                if(rightEl)rightEl.classList.add('esl-match-correct');
484              } else {
485                l.classList.add('esl-match-wrong');
486                if(rightEl)rightEl.classList.add('esl-match-wrong');
487              }
488            });
489            isCorrect=(correct===total&&total>0);
490            // Always show correct pairs table after checking
491            if(!block.querySelector('.esl-match-answer-key')){
492              var key=document.createElement('div');
493              key.className='esl-match-answer-key';
494              var rows='<div style="font-weight:600;color:#0f172a;margin-bottom:6px">✓ Correct pairs:</div>';
495              matchWrap.querySelectorAll('.esl-match-item[data-side="left"]').forEach(function(l){
496                var pg=l.getAttribute('data-pair');
497                var rightEl=matchWrap.querySelector('.esl-match-item[data-side="right"][data-pair="'+pg+'"]');
498                var userMatchedEl=matchWrap.querySelector('.esl-match-item[data-side="right"][data-aid="'+l.getAttribute('data-matched')+'"]');
499                var isOk=l.classList.contains('esl-match-correct');
500                rows+='<div style="display:flex;align-items:center;gap:8px;padding:5px 8px;margin-bottom:4px;border-radius:6px;background:'+(isOk?'#f0fdf4':'#fff8f8')+'">'+
501                  '<span style="color:'+(isOk?'#16a34a':'#dc2626')+';font-size:15px;flex-shrink:0">'+(isOk?'✓':'✗')+'</span>'+
502                  '<span style="flex:1;color:#0f172a">'+l.textContent+'</span>'+
503                  '<span style="color:#94a3b8;flex-shrink:0">→</span>'+
504                  '<span style="flex:1;color:'+(isOk?'#16a34a':'#16a34a')+'">'+( rightEl?rightEl.textContent:'' )+'</span>'+
505                '</div>';
506                if(!isOk && userMatchedEl){
507                  rows+='<div style="font-size:11px;color:#dc2626;padding:0 8px 6px 31px">You chose: '+userMatchedEl.textContent+'</div>';
508                }
509              });
510              key.innerHTML=rows;
511              matchWrap.parentNode.insertBefore(key, matchWrap.nextSibling);
512            }
513          }
514          matchWrap&&matchWrap.querySelectorAll('.esl-match-item').forEach(function(i){i.style.pointerEvents='none';});
515        } else if(type==='ordering'){
516          var ordList=block.querySelector('.esl-order-list');
517          if(ordList){
518            var items=Array.from(ordList.querySelectorAll('.esl-order-item'));
519            // Sort by data-pos (1-based) to get correct sequence
520            var correctSeq=items.slice().sort(function(a,b){
521              return parseInt(a.getAttribute('data-pos'),10)-parseInt(b.getAttribute('data-pos'),10);
522            }).map(function(i){ return i.getAttribute('data-aid'); });
523            var userSeq=items.map(function(i){ return i.getAttribute('data-aid'); });
524            var allCorrect=userSeq.join(',')=== correctSeq.join(',');
525            items.forEach(function(item,idx){
526              item.style.pointerEvents='none';
527              var isItemOk=item.getAttribute('data-aid')===correctSeq[idx];
528              item.classList.add(isItemOk?'esl-order-correct':'esl-order-wrong');
529            });
530            isCorrect=allCorrect;
531            if(!allCorrect){
532              // Show correct order as hint below list
533              var hint=block.querySelector('.esl-order-correct-hint');
534              if(!hint){
535                hint=document.createElement('p');
536                hint.className='esl-order-correct-hint';
537                ordList.parentNode.insertBefore(hint, ordList.nextSibling);
538              }
539              hint.innerHTML='<strong>Correct order:</strong> '+correctSeq.map(function(aid){
540                var el=ordList.querySelector('[data-aid="'+aid+'"]');
541                return el?el.querySelector('.esl-order-text').textContent:'';
542              }).join(' → ');
543            }
544          }
545        } else if(type==='sentence_building'){
546          var sbAns=block.querySelector('.esl-sentence-answer');
547          if(sbAns){
548            var chips=Array.from(sbAns.querySelectorAll('.esl-word-chip'));
549            var sbBank=block.querySelector('.esl-sentence-bank');
550            var sbWrap=block.querySelector('.esl-sentence-wrap');
551            // Get all bank chips (including used) for content lookup
552            var allBankChips=sbBank?Array.from(sbBank.querySelectorAll('.esl-word-chip')):[];
553            function getTextByAid(aid){
554              for(var i=0;i<allBankChips.length;i++){
555                if(allBankChips[i].getAttribute('data-aid')===String(aid)) return allBankChips[i].textContent;
556              }
557              return '';
558            }
559            var correctOrder=(block.getAttribute('data-correct-order')||'').split(',').filter(Boolean);
560            // Compare by TEXT content (handles duplicate words like two "to")
561            var userTexts=chips.map(function(c){ return c.textContent.trim(); });
562            var correctTexts=correctOrder.map(function(aid){ return getTextByAid(aid).trim(); });
563            isCorrect = userTexts.join(' ') === correctTexts.join(' ');
564            // Lock all chips
565            chips.forEach(function(c){ c.style.pointerEvents='none'; });
566            allBankChips.forEach(function(c){ c.style.pointerEvents='none'; });
567            // Show correct sentence hint AFTER the wrap (not between answer and bank)
568            var hintTarget = sbWrap || sbAns;
569            var sbHint=block.querySelector('.esl-sb-correct-hint');
570            if(!sbHint){
571              sbHint=document.createElement('div');
572              sbHint.className='esl-sb-correct-hint';
573              hintTarget.parentNode.insertBefore(sbHint, hintTarget.nextSibling);
574            }
575            sbHint.innerHTML='<span style="font-weight:600;color:#16a34a">✓ Correct sentence:</span> <span style="color:#0f172a">'+
576              correctTexts.join(' ')+'</span>';
577          }
578        } else {
579          var sel=block.querySelector('.esl-option.esl-selected');
580          isCorrect=!!sel&&sel.dataset.correct==='1';
581          block.querySelectorAll('.esl-option').forEach(function(o){
582            if(o.dataset.correct==='1') o.classList.add('esl-correct');
583            else if(o.classList.contains('esl-selected')) o.classList.add('esl-wrong');
584            o.style.pointerEvents='none';
585          });
586        }
587
588        if(isCorrect) correct_count++;
589        checked++;
590        // Analytics: answer checked
591        window.dataLayer && window.dataLayer.push({event:'quiz_answer',test_id:894,question_index:checked,question_type:type,is_correct:isCorrect});
592        // Sound feedback
593        if(window.eslSFX){ isCorrect ? eslSFX.correct() : eslSFX.wrong(); }
594
595        var fb = document.getElementById('esl-mini-fb-'+qid);
596        if(fb){
597          fb.classList.add('esl-show', isCorrect?'esl-fb-correct':'esl-fb-wrong');
598          var icon=fb.querySelector('.esl-fb-icon'), txt=fb.querySelector('.esl-fb-text');
599          if(icon) icon.textContent = isCorrect?'✓':'✗';
600          var correctMsgs = ['Correct!','Great job!','Nailed it!','Perfect!','Well done!'];
601          var wrongMsgs   = ['Not quite.','Incorrect.','Keep trying!','Almost!'];
602          if(txt) txt.textContent = isCorrect
603            ? correctMsgs[Math.floor(Math.random()*correctMsgs.length)]
604            : wrongMsgs[Math.floor(Math.random()*wrongMsgs.length)];
605          // Confetti on correct
606          if(isCorrect && typeof miniConfetti==='function') miniConfetti(fb);
607        }
608
609        // Add correct/wrong visual to sentence answer area
610        if(type==='sentence_building'){
611          var sbAnsEl = block.querySelector('.esl-sentence-answer');
612          if(sbAnsEl) sbAnsEl.classList.add(isCorrect?'esl-sb-correct':'esl-sb-wrong');
613        }
614
615        if(current===TOTAL-1){
616          btnSub.style.display='';
617          setTimeout(function(){ btnSub.scrollIntoView({behavior:'smooth',block:'nearest'}); },400);
618        }
619      }
620
621      function doSubmit(){
622        if(btnSub.disabled) return;
623        btnSub.disabled=true; btnSub.textContent='Submitting…';
624        var timeSpent = Math.round((Date.now()-started)/1000);
625
626        if(LOGGED){
627          /* Logged-in: submit to API — xp_cap=MINI_XP_MAX (5) so server caps correctly */
628          fetch(REST+'tests/'+TESTID+'/submit',{
629            method:'POST',
630            headers:{'Content-Type':'application/json','X-WP-Nonce':NONCE},
631            body:JSON.stringify({answers:answers, time_spent:timeSpent, xp_cap:MINI_XP_MAX})
632          }).then(function(r){return r.json();})
633          .then(function(res){
634            if(res && res.score_pct!==undefined){ showLoggedResult(res, correct_count); }
635            else { showLoggedResult(null, correct_count); }
636          }).catch(function(){ showLoggedResult(null, correct_count); });
637        } else {
638          /* Guest: park the answers, then show the capture card. */
639          var parked = eslParkResult(TESTID, answers, timeSpent, MINI_XP_MAX);
640          eslPingGuestResult(TESTID);
641          showGuestResult(correct_count, parked);
642        }
643      }
644
645      /* ── v1.6.17 — park a guest result so signing in can CLAIM it ─────────
646         Until now "Sign up to save your score" was not true: nothing was kept
647         and the account started at zero. We now stash the raw answers, and a
648         site-wide helper replays them through the normal submit endpoint the
649         moment this browser is logged in. Same scoring, same XP, same streak,
650         same mistake notebook — no second code path. */
651      function eslParkResult(testId, ans, secs, xpCap){
652        try{
653          // Nothing answered = nothing worth claiming. Parking {} would hand a
654          // brand-new account a 0% result row, 1 XP and a streak day for free.
655          var any = false, k;
656          for(k in ans){ if(Object.prototype.hasOwnProperty.call(ans,k)){ any = true; break; } }
657          if(!any) return false;
658          var payload = {id:testId, answers:ans, time_spent:secs||0, ts:Date.now(), tries:0};
659          if(xpCap) payload.xp_cap = xpCap;
660          window.localStorage.setItem(PKEY, JSON.stringify(payload));
661          // Short on purpose. This cookie is the only thing linking a parked
662          // result to whoever logs in next, and shared computers are normal in
663          // schools and libraries — a fortnight-old result must never land in
664          // a stranger's history, XP, streak and mistake notebook.
665          document.cookie = PKEY + '=1; path=/; max-age=' + PTTL + '; SameSite=Lax';
666          return true;
667        }catch(e){ return false; }
668      }
669      var PKEY = 'esl_pending_result';
670      var PTTL = 7200;
671      function eslPingGuestResult(testId){
672        try{
673          fetch(REST+'growth/guest-result',{
674            method:'POST', credentials:'same-origin',
675            headers:{'Content-Type':'application/json'},
676            body:JSON.stringify({test:testId})
677          })['catch'](function(){});
678        }catch(e){}
679      }
680      // Only /login/ reads redirect_to (forum/shortcodes/login.php). The signup
681      // handler routes by audience instead, so adding it there would be dead
682      // weight in the URL.
683      function eslClaimUrl(base){
684        var u = base + '?src=quiz_result';
685        if(base.indexOf('/login') === 0){
686          try{ u += '&redirect_to=' + encodeURIComponent(location.href.split('#')[0]); }catch(e){}
687        }
688        return u;
689      }
690
691      /* ══ v1.9.29 (C4) — "WHAT NEXT?" ════════════════════════════════════
692       *
693       * Trước bản này màn hình kết quả có đúng hai đường ra, và một trong hai
694       * chỉ tồn tại khi bài có đề đầy đủ riêng. Với phần lớn trong 3.772 bài
695       * có quiz, đường ra duy nhất là "Try again" — tải lại chính trang vừa
696       * làm xong. Ngõ cụt, trên 96% số bài có lưu lượng thật từ Google.
697       *
698       * Ba nguồn, theo thứ tự ưu tiên:
699       *   1. việc tiếp theo RIÊNG của người đang xem  (REST trả về, per-user)
700       *   2. chuyên mục của chính bài này              (dựng sẵn, cache-safe)
701       *   3. giao bài cho lớp                          (chỉ khi nút giao bài
702       *      đã xác minh có mặt trên trang — xem dưới)
703       */
704      function eslEsc(s){
705        return String(s == null ? '' : s)
706          .replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')
707          .replace(/"/g,'&quot;').replace(/'/g,'&#39;');
708      }
709      /* Một gợi ý trỏ về ĐÚNG trang đang mở còn tệ hơn không gợi ý gì: nó
710         trông như một đường ra nhưng không đưa người ta đi đâu cả. */
711      function eslSamePage(u){
712        try{
713          var a = document.createElement('a'); a.href = u;
714          return a.pathname.replace(/\/+$/,'') === location.pathname.replace(/\/+$/,'');
715        }catch(e){ return false; }
716      }
717      function eslNextBlock(res){
718        var n = (res && res.next_step && res.next_step.url) ? res.next_step : null;
719        if (n && eslSamePage(n.url)) { n = null; }
720
721        var rows = '';
722        if (n) {
723          rows += '<a class="esl-c4row" href="'+eslEsc(n.url)+'">'
724                + '<span class="esl-c4row__t">'+eslEsc(n.title)+'</span>'
725                + (n.why ? '<span class="esl-c4row__w">'+eslEsc(n.why)+'</span>' : '')
726                + '<span class="esl-c4row__go">'+eslEsc(n.cta || 'Start')+' →</span></a>';
727        } else if (CATURL) {
728          rows += '<a class="esl-c4row" href="'+eslEsc(CATURL)+'">'
729                + '<span class="esl-c4row__t">More '+eslEsc(CATNAME)+'</span>'
730                + '<span class="esl-c4row__w">Lessons and quizzes on the same topic</span>'
731                + '<span class="esl-c4row__go">Browse →</span></a>';
732        }
733
734        /* GIÁO VIÊN. Không hỏi cookie, không hỏi vai trò: chỉ hỏi "nút giao
735           bài có trên trang này không". Nút đó do core dựng và đã đi qua
736           esl_class_ui_eligible() — tức là giáo viên ĐÃ XÁC MINH, đã đăng
737           nhập. Dùng sự có mặt của nó làm cổng thì không có gì để giả mạo,
738           và không thêm một byte nào cho người khác. */
739        if (document.querySelector('[data-esl-as="open"]')) {
740          rows += '<button type="button" class="esl-c4row" data-esl-c4="assign">'
741                + '<span class="esl-c4row__t">Set this for your class</span>'
742                + '<span class="esl-c4row__w">They get it as homework, and you see each score</span>'
743                + '<span class="esl-c4row__go">Assign →</span></button>';
744        }
745
746        if (!rows) { return ''; }
747        return '<div class="esl-c4next"><p class="esl-c4next__h">What next?</p>'+rows+'</div>';
748      }
749      /* Nút giao bài đã có sẵn trên trang và đã mang đủ data-src / data-ref /
750         data-title của ĐÚNG bài này. Bấm hộ nó là mở đúng hộp thoại đó, với
751         đúng dữ liệu đó — không nhân bản một đường giao bài thứ hai, và nếu
752         core đổi cách giao bài thì chỗ này tự đi theo. */
753      function eslWireC4(root){
754        if (!root) { return; }
755        var b = root.querySelector('[data-esl-c4="assign"]');
756        if (!b) { return; }
757        b.addEventListener('click', function(){
758          var t = document.querySelector('[data-esl-as="open"]');
759          if (t) { t.click(); }
760        });
761      }
762
763      var PASS_THRESHOLD = Math.ceil(TOTAL * 0.6); // 60% = 3/5
764      function showLoggedResult(res, correctN){
765        var shownTotal = TOTAL;
766        // v1.6.21 — the server now grades exactly these 5 questions, and it is
767        // the one that knows the test's real pass_score and awards partial
768        // credit on matching questions. Take its numbers when we have them;
769        // the local estimate is the offline fallback only.
770        var pct    = Math.round(correctN / TOTAL * 100);
771        var passed = correctN >= PASS_THRESHOLD;
772        if (res && res.score_pct !== undefined && res.score_pct !== null) {
773          var spct = parseInt(res.score_pct, 10);
774          if (!isNaN(spct)) { pct = spct; }
775          passed = !!res.passed;
776          // Take the headline count from the same place as the percentage.
777          // The local tally treats every question as worth one point, but the
778          // server weights by q.points and gives matching questions partial
779          // credit — so "4/5 correct" beside "100%" was possible.
780          if (res.detail) {
781            var sc = 0, sn = 0, dk;
782            for (dk in res.detail) {
783              if (!Object.prototype.hasOwnProperty.call(res.detail, dk)) { continue; }
784              sn++;
785              if (res.detail[dk] && res.detail[dk].correct) { sc++; }
786            }
787            // Denominator too: TOTAL was baked into this page when it was
788            // cached, and the graded slice can be smaller if the test shrank.
789            if (sn > 0) { correctN = sc; shownTotal = sn; }
790          }
791        }
792        // Analytics: mini quiz completed
793        window.dataLayer && window.dataLayer.push({event:'quiz_complete',test_id:894,score_pct:pct,passed:passed,logged_in:true,total_questions:shownTotal,questions_answered:checked,quiz_type:'mini'});
794        // Sound effects
795        if(window.eslSFX){
796          setTimeout(function(){ passed ? eslSFX.pass() : eslSFX.fail(); }, 300);
797          if(passed) setTimeout(function(){ eslSFX.xp(); }, 900);
798          if(pct === 100) setTimeout(function(){ eslSFX.perfect(); }, 400);
799        }
800        // XP: prefer what the server actually stored (v1.6.21 — the mini quiz
801        // is graded on its own 5 questions now, and a repeat that does not beat
802        // the learner's best mini score legitimately earns 0). Fall back to the
803        // local estimate only when the request failed and res is null.
804        var xp = (res && res.xp_earned !== undefined && res.xp_earned !== null)
805                   ? parseInt(res.xp_earned, 10)
806                   : Math.max(1, Math.round(pct / 100 * MINI_XP_MAX));
807        if (isNaN(xp) || xp < 0) { xp = 0; }
808        var html = '<div class="esl-result-screen" style="padding:28px 24px;text-align:center">';
809        html += '<div style="font-size:48px;margin-bottom:8px">'+(correctN===shownTotal?'🏆':correctN>=3?'👏':'💪')+'</div>';
810        html += '<h3 class="esl-result-title" style="margin-bottom:6px">You got '+correctN+'/'+shownTotal+' correct!</h3>';
811        if(xp>0){
812          html += '<div class="esl-xp-toast" style="margin:12px auto">⚡ +'+xp+' XP earned!</div>';
813        }
814        var stk = res && res.streak ? res.streak : 0;
815        if(stk>=1){
816          html += '<div style="margin:0 auto 6px;color:#475569;font-size:13px">🔥 Day '+stk+' of your streak'+(stk>=2?' — don\'t break it tomorrow.':' — come back tomorrow to make it 2.')+'</div>';
817        }
818        html += '<div class="esl-result-stats" style="margin:16px 0">';
819        html += '<div class="esl-result-stat"><strong>'+pct+'%</strong><span>Score</span></div>';
820        html += '<div class="esl-result-stat"><strong>'+correctN+'/'+shownTotal+'</strong><span>Correct</span></div>';
821        html += '</div>';
822
823        /* CTA to full test */
824        if(FULLURL && FULLCOUNT>TOTAL){
825          html += '<a href="'+FULLURL+'" style="display:inline-flex;align-items:center;gap:8px;background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;padding:13px 24px;border-radius:50px;font-size:14px;font-weight:700;text-decoration:none;margin-bottom:12px">';
826          html += '🚀 Take the Full '+FULLCOUNT+'-Question Test — Earn up to +'+FULL_TEST_XP+' XP</a>';
827          html += '<p style="font-size:12px;color:#64748b;margin:0">Complete the full test to climb the leaderboard!</p>';
828        }
829        html += eslNextBlock(res);
830        html += '<div style="margin-top:14px"><button class="esl-btn esl-btn-outline" onclick="location.reload()">Try again</button></div>';
831        html += '</div>';
832        wrap.innerHTML = html;
833        eslWireC4(wrap);
834      }
835
836      function showGuestResult(correctN, parked){
837        // Analytics: mini quiz completed (guest) + signup prompt
838        var pctG = Math.round(correctN / TOTAL * 100);
839        window.dataLayer && window.dataLayer.push({event:'quiz_complete',test_id:894,score_pct:pctG,logged_in:false,total_questions:TOTAL,quiz_type:'mini'});
840        window.dataLayer && window.dataLayer.push({event:'signup_prompt_shown',test_id:894,trigger:'quiz_complete'});
841        var html = '<div class="esl-result-screen" style="padding:28px 24px;text-align:center">';
842        html += '<div style="font-size:48px;margin-bottom:8px">'+(correctN===TOTAL?'\uD83C\uDFC6':correctN>=3?'\uD83D\uDC4F':'\uD83D\uDCAA')+'</div>';
843        html += '<h3 class="esl-result-title" style="margin-bottom:6px">You got '+correctN+'/'+TOTAL+' correct \u2014 '+pctG+'%</h3>';
844        html += '<div style="background:rgba(39,169,203,.08);border:1.5px solid rgba(39,169,203,.25);border-radius:12px;padding:16px 18px;margin:16px 0;text-align:left">';
845        if(parked){
846          html += '<p style="margin:0 0 10px;font-size:15px;font-weight:800;color:#0f172a">Keep this result \u2014 free account</p>';
847          html += '<ul style="margin:0 0 14px;padding-left:18px;font-size:13.5px;color:#334155;line-height:1.75">';
848          html += '<li>This score is saved and the XP is added \u2014 nothing is retyped</li>';
849          html += '<li>\uD83D\uDD25 Your daily streak starts today</li>';
850          html += '<li>Every question you missed goes to your Mistake Notebook to redo</li>';
851          html += '</ul>';
852        } else {
853          html += '<p style="margin:0 0 12px;font-size:15px;font-weight:800;color:#0f172a">Free account \u2014 save your scores, XP and streak</p>';
854        }
855        html += '<div style="display:flex;gap:10px;flex-wrap:wrap">';
856        html += '<a href="'+eslClaimUrl('/signup/')+'" style="background:linear-gradient(135deg,#0f7ea4,#27a9cb);color:#fff;padding:11px 22px;border-radius:50px;font-size:13.5px;font-weight:800;text-decoration:none">'+(parked?'Save my result \u2014 free':'Create a free account')+'</a>';
857        html += '<a href="'+eslClaimUrl('/login/')+'" style="background:#f4f8fb;border:1.5px solid #e3ebf3;color:#0f172a;padding:11px 20px;border-radius:50px;font-size:13.5px;font-weight:700;text-decoration:none">I already have one</a>';
858        html += '</div>';
859        html += '<p style="margin:10px 0 0;font-size:11.5px;color:#94a3b8">Free forever. No card. All 80+ tools stay free either way.</p>';
860        html += '</div>';
861        if(FULLURL && FULLCOUNT>TOTAL){
862          html += '<p style="font-size:13px;color:#475569;margin:0 0 8px">Ready for the full '+FULLCOUNT+'-question test?</p>';
863          html += '<a href="'+FULLURL+'" style="display:inline-flex;align-items:center;gap:6px;border:1.5px solid #27a9cb;color:#0f7ea4;padding:10px 20px;border-radius:50px;font-size:13px;font-weight:700;text-decoration:none;margin-bottom:12px">View Full Test \u2192</a>';
864        }
865        html += eslNextBlock(null);
866        html += '<div style="margin-top:14px"><button class="esl-btn esl-btn-outline" onclick="location.reload()">Try again</button></div>';
867        html += '</div>';
868        wrap.innerHTML = html;
869        eslWireC4(wrap);
870      }
871
872      showBlock(0);
873    })();</script>
873 <aside class="esl-fulltest-cta" aria-label="Full test"><div class="esl-fulltest-cta__text"><p class="esl-fulltest-cta__eyebrow">Full assessment</p><p class="esl-fulltest-cta__headline">Articles Practice Test (A1-B2) — Grammar Exercises with Answers</p><p class="esl-fulltest-cta__sub">20 questions &middot; timed mode &middot; full feedback</p></div> <a class="esl-fulltest-cta__btn" href="https://7esl.com/practice/grammar/articles-test/"> Take the full test <svg viewBox="0 0 24 24" aria-hidden="true"><polyline points="9 18 15 12 9 6"/></svg> </a></aside></section><section class="sevenesl-helpful-widget inside-article" data-helpful-object-type="term" data-helpful-object-id="37395" data-helpful-storage-key="sevenesl_helpful_term_37395"><div class="sevenesl-helpful-widget__inner"><div class="sevenesl-helpful-widget__copy"><p class="sevenesl-helpful-widget__eyebrow">Quick Feedback</p><h2 class="sevenesl-helpful-widget__title">Is this article helpful?</h2></div><div class="sevenesl-helpful-widget__actions" role="group" aria-label="Was this article helpful?"> <button type="button" class="sevenesl-helpful-button is-yes" data-helpful-vote="yes" aria-pressed="false"> <span class="sevenesl-helpful-button__icon" aria-hidden="true">😍</span> <span class="sevenesl-helpful-button__label">Yes</span> <span class="sevenesl-helpful-button__count" data-helpful-count="yes">23</span> </button> <button type="button" class="sevenesl-helpful-button is-no" data-helpful-vote="no" aria-pressed="false"> <span class="sevenesl-helpful-button__icon" aria-hidden="true">☹️</span> <span class="sevenesl-helpful-button__label">No</span> <span class="sevenesl-helpful-button__count" data-helpful-count="no">0</span> </button></div><p class="sevenesl-helpful-widget__status" data-helpful-status aria-live="polite"></p></div></section><section class="sevenesl-helpful-related inside-article" aria-label="Other Students Also Like"><div class="sevenesl-helpful-related__header"><p class="sevenesl-helpful-related__eyebrow">Related posts</p><h2 class="sevenesl-helpful-related__title">Other Students Also Like</h2></div><div class="sevenesl-helpful-related__grid"><article class="sevenesl-helpful-related-card"> <a class="sevenesl-helpful-related-card__link" href="https://7esl.com/a-versus-an/"> <span class="sevenesl-helpful-related-card__kicker">Articles</span><div class="sevenesl-helpful-related-card__top"> <span class="sevenesl-helpful-related-card__meta">😍 5</span></div><h3 class="sevenesl-helpful-related-card__title">A vs. An: Mastering the Basics of English Articles</h3><p class="sevenesl-helpful-related-card__summary">When speaking or writing in English, you will notice that there are two forms of the indefinite article, ‘a’ and…</p> </a></article><article class="sevenesl-helpful-related-card"> <a class="sevenesl-helpful-related-card__link" href="https://7esl.com/use-no-article-rules/"> <span class="sevenesl-helpful-related-card__kicker">Articles</span><div class="sevenesl-helpful-related-card__top"> <span class="sevenesl-helpful-related-card__meta">😍 3</span></div><h3 class="sevenesl-helpful-related-card__title">When to Use No Article in English with 7 Useful Rules</h3><p class="sevenesl-helpful-related-card__summary">Understanding when to use no article in English is essential for mastering grammar. This article covers key rules and provides…</p> </a></article><article class="sevenesl-helpful-related-card"> <a class="sevenesl-helpful-related-card__link" href="https://7esl.com/rules-for-using-the/"> <span class="sevenesl-helpful-related-card__kicker">Articles</span><div class="sevenesl-helpful-related-card__top"> <span class="sevenesl-helpful-related-card__meta">😍 3</span></div><h3 class="sevenesl-helpful-related-card__title">When to Use THE: Essential Rules for English Learners</h3><p class="sevenesl-helpful-related-card__summary">The article covers key information about the definite article &quot;THE,&quot; including its rules and proper usage. You will learn when…</p> </a></article></div></section><section class="sevenesl-archive-list sevenesl-category-article-list inside-article"><div class="sevenesl-section-heading"><div><p class="sevenesl-section-heading__eyebrow">Curated list</p><h2 class="title-custom-list">More Articles in Articles</h2></div><div class="sevenesl-section-heading__meta">5 articles</div></div><ol class="custom-list sevenesl-archive-posts sevenesl-archive-posts--numbered">
873<li> <a href="https://7esl.com/a-versus-an/"> <span class="sevenesl-archive-posts__title">A vs. An: Mastering the Basics of English Articles</span> </a></li><li> <a href="https://7esl.com/articles-with-countable-and-uncountable-nouns/"> <span class="sevenesl-archive-posts__title">Articles with Countable and Uncountable Nouns</span> </a></li><li> <a href="https://7esl.com/article-worksheets/"> <span class="sevenesl-archive-posts__title">Mastering Articles in English: Practice Exercises &#038; Downloadable Worksheets</span> </a></li><li> <a href="https://7esl.com/use-no-article-rules/"> <span class="sevenesl-archive-posts__title">When to Use No Article in English with 7 Useful Rules</span> </a></li><li> <a href="https://7esl.com/rules-for-using-the/"> <span class="sevenesl-archive-posts__title">When to Use THE: Essential Rules for English Learners</span> </a></li></ol></section></main></div><div class="widget-area sidebar is-right-sidebar" id="right-sidebar"><div class="inside-right-sidebar"><aside class="widget sevenesl-sidebar-search-widget" aria-label="Search 7ESL"><form role="search" method="get" class="sevenesl-sidebar-search-form" action="https://7esl.com/" data-sevenesl-popup-search="true"><label class="screen-reader-text" for="sevenesl-sidebar-search-input-1">Search 7ESL</label><div class="sevenesl-sidebar-search-form__inner"><input type="search" id="sevenesl-sidebar-search-input-1" class="sevenesl-sidebar-search-form__field" placeholder="Search" value="" name="s" autocomplete="off" /><button type="submit" class="sevenesl-sidebar-search-form__button" aria-label="Search"><svg viewBox="0 0 24 24" focusable="false" aria-hidden="true"><path d="M10.5 4.75a5.75 5.75 0 1 0 0 11.5a5.75 5.75 0 0 0 0-11.5Zm0-1.5a7.25 7.25 0 1 1 0 14.5a7.25 7.25 0 0 1 0-14.5Zm6.23 12.42l3.52 3.52a.75.75 0 1 1-1.06 1.06l-3.52-3.52a.75.75 0 1 1 1.06-1.06Z" fill="currentColor"></path></svg></button></div></form></aside><aside id="text-6" class="widget inner-padding widget_text"><div class="textwidget"><div class="esl-lbw "><div class="esl-lbw__head"><span aria-hidden="true">🏆</span> Weekly Top 5</div><div class="esl-lbw__list"> <a href="https://7esl.com/profile/?u=3673" class="esl-lbw__row" title="anita silvia"> <span class="esl-lbw__rank">🥇</span> <picture decoding="async" class="esl-lbw__av" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;">
874<source type="image/webp" srcset="https://7esl.com/wp-content/uploads/nsl_avatars/f157ed89af0aa1baaed5758d7d743a23.png.webp"/>
875<img decoding="async" src="https://7esl.com/wp-content/uploads/nsl_avatars/f157ed89af0aa1baaed5758d7d743a23.png" alt="" width="34" height="34" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;"/>
876</picture>
877 <span class="esl-lbw__name">anita silvia</span> <span class="esl-lbw__xp">+372 XP</span> </a> <a href="https://7esl.com/profile/?u=8778" class="esl-lbw__row" title="Ý Ngô Ngọc Như"> <span class="esl-lbw__rank">🥈</span> <picture decoding="async" class="esl-lbw__av" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;">
878<source type="image/webp" srcset="https://7esl.com/wp-content/uploads/nsl_avatars/1a67f04c49106cf9c7ad32578cba5566.jpg.webp"/>
879<img decoding="async" src="https://7esl.com/wp-content/uploads/nsl_avatars/1a67f04c49106cf9c7ad32578cba5566.jpg" alt="" width="34" height="34" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;"/>
880</picture>
881 <span class="esl-lbw__name">Ý Ngô Ngọc Như</span> <span class="esl-lbw__xp">+268 XP</span> </a> <a href="https://7esl.com/profile/?u=9114" class="esl-lbw__row" title="z Jry"> <span class="esl-lbw__rank">🥉</span> <picture decoding="async" class="esl-lbw__av" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;">
882<source type="image/webp" srcset="https://7esl.com/wp-content/uploads/nsl_avatars/0aa6ab9aaac3d37a6cf20255654b7f9d.png.webp"/>
883<img decoding="async" src="https://7esl.com/wp-content/uploads/nsl_avatars/0aa6ab9aaac3d37a6cf20255654b7f9d.png" alt="" width="34" height="34" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;"/>
884</picture>
885 <span class="esl-lbw__name">z Jry</span> <span class="esl-lbw__xp">+195 XP</span> </a> <a href="https://7esl.com/profile/?u=9220" class="esl-lbw__row" title="Kayden Stoops"> <span class="esl-lbw__rank esl-lbw__rank--num">4</span> <picture decoding="async" class="esl-lbw__av" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;">
886<source type="image/webp" srcset="https://7esl.com/wp-content/uploads/nsl_avatars/879f511e94301182d0643ed3c8b57c81.png.webp"/>
887<img decoding="async" src="https://7esl.com/wp-content/uploads/nsl_avatars/879f511e94301182d0643ed3c8b57c81.png" alt="" width="34" height="34" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;"/>
888</picture>
889 <span class="esl-lbw__name">Kayden Stoops</span> <span class="esl-lbw__xp">+190 XP</span> </a> <a href="https://7esl.com/profile/?u=9068" class="esl-lbw__row" title="chino Mandarin"> <span class="esl-lbw__rank esl-lbw__rank--num">5</span> <picture decoding="async" class="esl-lbw__av" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;">
890<source type="image/webp" srcset="https://7esl.com/wp-content/uploads/nsl_avatars/c3c943c14a5debfe267a045b5aff6b43.png.webp"/>
891<img decoding="async" src="https://7esl.com/wp-content/uploads/nsl_avatars/c3c943c14a5debfe267a045b5aff6b43.png" alt="" width="34" height="34" loading="lazy" onerror="this.onerror=null;this.src=&#039;https://www.gravatar.com/avatar/?d=mp&#039;;"/>
892</picture>
893 <span class="esl-lbw__name">chino Mandarin</span> <span class="esl-lbw__xp">+152 XP</span> </a></div><div class="esl-lbw__foot">Updated 11 min ago</div></div></div></aside>
893<aside id="nav_menu-19" class="widget inner-padding widget_nav_menu sevenesl-interesting-topics-widget sevenesl-topic-widget"><h2 class="widget-title">Interesting Topics</h2><div class="menu-sidebar-container"><ul id="menu-sidebar" class="menu"><li id="menu-item-102385" class="menu-item menu-item-type-taxonomy menu-item-object-category current-category-ancestor menu-item-102385"><a href="https://7esl.com/category/grammar/">Grammar</a></li><li id="menu-item-102393" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-102393"><a href="https://7esl.com/category/vocabulary/">Vocabulary</a></li><li id="menu-item-102387" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102387"><a href="https://7esl.com/category/visual-vocabulary/">Visual Vocabulary</a></li><li id="menu-item-102386" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102386"><a href="https://7esl.com/category/writing/">Writing</a></li><li id="menu-item-102392" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102392"><a href="https://7esl.com/category/speaking/">Speaking</a></li><li id="menu-item-102388" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102388"><a href="https://7esl.com/category/words-list/">Words List</a></li><li id="menu-item-102467" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102467"><a href="https://7esl.com/category/slang/">Slang</a></li><li id="menu-item-102466" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102466"><a href="https://7esl.com/category/internet-slang/">Internet Slang</a></li><li id="menu-item-102468" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-102468"><a href="https://7esl.com/category/idioms/">Idioms</a></li><li id="menu-item-102390" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102390"><a href="https://7esl.com/category/foreign-language/">Foreign Words</a></li><li id="menu-item-102391" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102391"><a href="https://7esl.com/category/positive-words/">Positive Words &amp; Phrases</a></li><li id="menu-item-102389" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102389"><a href="https://7esl.com/category/business-english/">Business English</a></li><li id="menu-item-102394" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-102394"><a href="https://7esl.com/category/american-and-british-english/">British vs. American English</a></li></ul></div></aside></div></div></div></div><div class="site-footer"></div><a title="Scroll back to top" aria-label="Scroll back to top" rel="nofollow" href="#" class="generate-back-to-top" data-scroll-speed="400" data-start-scroll="300" role="button"> <span class="gp-icon icon-arrow-up"><svg viewBox="0 0 330 512" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M305.863 314.916c0 2.266-1.133 4.815-2.832 6.514l-14.157 14.163c-1.699 1.7-3.964 2.832-6.513 2.832-2.265 0-4.813-1.133-6.512-2.832L164.572 224.276 53.295 335.593c-1.699 1.7-4.247 2.832-6.512 2.832-2.265 0-4.814-1.133-6.513-2.832L26.113 321.43c-1.699-1.7-2.831-4.248-2.831-6.514s1.132-4.816 2.831-6.515L158.06 176.408c1.699-1.7 4.247-2.833 6.512-2.833 2.265 0 4.814 1.133 6.513 2.833L303.03 308.4c1.7 1.7 2.832 4.249 2.832 6.515z" fill-rule="nonzero" /></svg></span> </a><footer class="escx-foot"><div class="escx-wrap escx-foot__top"><div class="escx-foot__brand"> <a href="https://7esl.com/" class="escx-logo escx-logo--foot"> <img loading="lazy" src="https://7esl.com/wp-content/plugins/7esl-core/assets/images/logo-7esl-light.svg" alt="7ESL" width="139" height="36"
894onerror="this.style.display='none';this.nextElementSibling.style.display='inline-flex'"> <span style="display:none;align-items:center;gap:8px">7<b>ESL</b></span> </a><p>Established in 2017, 7ESL is a leading global English-learning platform &mdash; clear lessons, practical tools, fun games and exam practice to help millions learn, teach and master English.</p><div class="escx-foot__social"> <a href="https://www.facebook.com/7ESLAI" aria-label="Facebook"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg></a> <a href="https://www.pinterest.com/7english/" aria-label="Pinterest"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2a10 10 0 0 0-3.6 19.3c-.1-.9-.1-2.2.1-3.1l1.2-5s-.3-.6-.3-1.5c0-1.4.8-2.4 1.8-2.4.9 0 1.3.6 1.3 1.4 0 .9-.5 2.1-.8 3.3-.2 1 .5 1.7 1.4 1.7 1.7 0 3-1.8 3-4.4 0-2.3-1.6-3.9-4-3.9-2.7 0-4.3 2-4.3 4.1 0 .8.3 1.7.7 2.1a.3.3 0 0 1 .1.3l-.3 1.1c0 .2-.1.2-.3.1-1.2-.5-1.9-2.3-1.9-3.7 0-3 2.2-5.7 6.3-5.7 3.3 0 5.9 2.4 5.9 5.5 0 3.3-2.1 5.9-5 5.9-1 0-1.9-.5-2.2-1.1 0 0-.5 1.9-.6 2.3-.2.8-.8 1.9-1.2 2.5A10 10 0 1 0 12 2z"/>
894</svg></a> <a href="https://www.youtube.com/channel/UCPDQgXju7hqEGBwzLIeI7Zw" aria-label="YouTube"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M23 12s0-3.5-.4-5.2a2.7 2.7 0 0 0-1.9-1.9C18.9 4.5 12 4.5 12 4.5s-6.9 0-8.7.4a2.7 2.7 0 0 0-1.9 1.9C1 8.5 1 12 1 12s0 3.5.4 5.2a2.7 2.7 0 0 0 1.9 1.9c1.8.4 8.7.4 8.7.4s6.9 0 8.7-.4a2.7 2.7 0 0 0 1.9-1.9C23 15.5 23 12 23 12zM10 15.5v-7l6 3.5z"/></svg></a> <a href="https://x.com/7eslenglish" aria-label="X"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M18 2h3l-7 8 8 12h-6l-5-7-5 7H3l8-9L3 2h6l4 6z"/></svg></a></div></div><div class="escx-foot__col"><h5>Learn</h5> <a href="https://7esl.com/grammar/">Grammar</a> <a href="https://7esl.com/vocabulary/">Vocabulary</a> <a href="https://7esl.com/idioms/">Idioms</a> <a href="https://7esl.com/phrasal-verbs/">Phrasal Verbs</a> <a href="https://7esl.com/pronunciation/">Pronunciation</a> <a href="https://7esl.com/writing/">Writing</a> <a href="https://7esl.com/courses/">Free Courses</a></div><div class="escx-foot__col"><h5>Courses by level</h5> <a href="https://7esl.com/courses/kindergarten-english/">Kindergarten</a> <a href="https://7esl.com/courses/a1-english/">A1 &mdash; Beginner</a> <a href="https://7esl.com/courses/a2-english/">A2 &mdash; Elementary</a> <a href="https://7esl.com/courses/b1-english/">B1 &mdash; Intermediate</a> <a href="https://7esl.com/courses/b2-english/">B2 &mdash; Upper-Int.</a> <a href="https://7esl.com/courses/c1-english/">C1 &mdash; Advanced</a> <a href="https://7esl.com/courses/c2-english/">C2 &mdash; Mastery</a></div><div class="escx-foot__col"><h5>Tools &amp; Games</h5> <a href="https://7esl.com/tools/">All Tools</a> <a href="https://7esl.com/learning-tools/">Learning Tools</a> <a href="https://7esl.com/writing-tools/">Writing Tools</a> <a href="https://7esl.com/word-tools/">Word Tools</a> <a href="https://7esl.com/teacher-tools/">Teacher Tools</a> <a href="https://7esl.com/picture-vocabulary/">Picture Vocabulary</a> <a href="https://7esl.com/word-games/">Word Games</a> <a href="https://7esl.com/vocabulary-games/">Vocabulary Games</a> <a href="https://7esl.com/games/">All Games</a></div><div class="escx-foot__col"><h5>Tests &amp; Resources <span class="escx-tag escx-tag--hot">HOT</span></h5> <a href="https://7esl.com/english-level-test/">Level Test</a> <a href="https://7esl.com/exams/">Exam Practice</a> <a href="https://7esl.com/tests/">All Tests</a> <a href="https://7esl.com/category/esl-resources/worksheets/">Free Worksheets</a> <a href="https://7esl.com/category/esl-resources/esl-pdfs/">Free PDF Books</a> <a href="https://7esl.com/tutors/">Find a Tutor</a> <a href="https://7esl.com/forum/">Forums</a></div><div class="escx-foot__col"><h5>For Teachers</h5> <a href="https://7esl.com/teacher-tools/">Teacher Tools</a> <a href="https://7esl.com/category/esl-resources/worksheets/">Worksheets</a> <a href="https://7esl.com/category/esl-resources/esl-pdfs/">PDF Books</a> <a href="https://7esl.com/picture-vocabulary/">Picture Vocabulary</a> <a href="https://7esl.com/kids-games/">Kids Games</a> <a href="https://7esl.com/tutor-register/">Become a Tutor</a> <a href="https://7esl.com/signup/"><strong style="color:#cfe0ec">Free account &rarr;</strong></a></div></div><div class="escx-foot__bottom"><div class="escx-wrap"><div>&copy; 2026 7ESL. All rights reserved.</div><div class="escx-foot__legal"> <a href="https://7esl.com/about/">About</a> <a href="https://7esl.com/editorial-policy/">Editorial Policy</a> <a href="https://7esl.com/privacy-policy/">Privacy</a> <a href="https://7esl.com/terms-of-service/">Terms</a> <a href="https://7esl.com/contact/">Contact</a></div></div></div></footer><div class="escx-dbg" id="escxDbg"></div><aside class="escx-drawer" id="escxDrawer" aria-label="Mobile menu"><div class="escx-drawer__h"> <a href="https://7esl.com/" class="escx-logo"><img loading="lazy" src="https://7esl.com/wp-content/plugins/7esl-core/assets/images/logo-7esl-dark.svg" alt="7ESL" width="116" height="30"></a> <button class="escx-icbtn" id="escxDclose" style="display:grid" aria-label="Close menu"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg></button></div> <details><summary>
894Learn <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#888" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></summary><div class="escx-sub"><a href="https://7esl.com/grammar/">Grammar</a><a href="https://7esl.com/vocabulary/">Vocabulary</a><a href="https://7esl.com/idioms/">Idioms</a><a href="https://7esl.com/pronunciation/">Pronunciation</a><a href="https://7esl.com/courses/">Courses</a></div></details> <details><summary>Tests <span class="escx-badge escx-badge--hot">HOT</span><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#888" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></summary><div class="escx-sub"><a href="https://7esl.com/english-level-test/">Level Test</a><a href="https://7esl.com/exams/">Exam Practice</a><a href="https://7esl.com/practice/">Practice Tests</a></div></details> <details><summary>Tools <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#888" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></summary><div class="escx-sub"><a href="https://7esl.com/tools/">All Tools</a><a href="https://7esl.com/learning-tools/">Learning Tools</a><a href="https://7esl.com/writing-tools/">Writing Tools</a><a href="https://7esl.com/word-tools/">Word Game Tools</a><a href="https://7esl.com/picture-vocabulary/">Picture Vocabulary</a><a href="https://7esl.com/teacher-tools/">Teacher Tools</a><a href="https://7esl.com/how-to-pronounce/">Pronunciation Tools</a><a href="https://7esl.com/spelling-tools/">Spelling Tools</a></div></details> <details><summary>Games <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#888" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></summary><div class="escx-sub"><a href="https://7esl.com/word-games/">Word Games</a><a href="https://7esl.com/vocabulary-games/">Vocabulary Games</a><a href="https://7esl.com/grammar-games/">Grammar Games</a><a href="https://7esl.com/kids-games/">Kids Games</a><a href="https://7esl.com/pronunciation-games/">Pronunciation Games</a></div></details> <details data-aud-hide="teacher"><summary>Tutors <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#888" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></summary><div class="escx-sub"><a href="https://7esl.com/tutors/">Find a Tutor</a></div></details> <details><summary>For Teachers <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#888" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></summary><div class="escx-sub"><a href="https://7esl.com/teacher-tools/">Teacher Tools</a><a href="https://7esl.com/category/esl-resources/worksheets/">Worksheets</a><a href="https://7esl.com/category/esl-resources/esl-pdfs/">PDF Books</a><a href="https://7esl.com/kids-games/">Kids Games</a><a data-aud-hide="learner kid ask none" href="https://7esl.com/tutor-register/">Become a Tutor</a></div></details> <details><summary>Download <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#888" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></summary><div class="escx-sub"><a href="https://7esl.com/app/">Mobile App</a><a href="https://7esl.com/category/esl-resources/worksheets/">Worksheets</a><a href="https://7esl.com/category/esl-resources/esl-pdfs/">PDF Books</a></div></details> <details><summary>Forums</summary><div class="escx-sub"><a href="https://7esl.com/forum/">Community Forum</a></div></details><div class="escx-drawer__btns"> <a class="escx-btn escx-btn--ghost" href="https://7esl.com/login/">Login</a> <a class="escx-btn escx-btn--pri" href="https://7esl.com/signup/">Sign up free</a></div></aside> 
894<script type="speculationrules">{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/generatepress/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}</script>
894 
894<script>function isOldIOSDevice() {
895                const userAgent = navigator.userAgent || navigator.vendor || window.opera;
896
897                // Check if it's an iOS device
898                const isIOS = /iPad|iPhone|iPod/.test(userAgent) && !window.MSStream;
899
900                if (!isIOS) return false;
901
902                // Extract iOS version from userAgent
903                const match = userAgent.match(/OS (\d+)_/);
904                if (match && match.length > 1) {
905                    const majorVersion = parseInt(match[1], 10);
906
907                    // Example: Consider iOS 12 and below as old
908                    return majorVersion <= 12;
909                }
910
911                // If version not found, assume not old
912                return false;
913            }
914            if (isOldIOSDevice()) {
915                document.addEventListener('DOMContentLoaded', function() {
916                    setTimeout(() => {
917                        document.querySelectorAll('audio:not(.plyr audio)').forEach(function(audio, index) {
918                            audio.setAttribute('controls', '')
919                        });
920                    }, 3000);
921                });
922            }
923            // ios old devices</script>
923 <svg width="0" height="0" class="h5ap_svg_hidden" style="display: none;"> <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 511.997 511.997" id="exchange"> <path d="M467.938 87.164L387.063 5.652c-7.438-7.495-19.531-7.54-27.02-.108s-7.54 19.525-.108 27.014l67.471 68.006-67.42 67.42c-7.464 7.457-7.464 19.557 0 27.014 3.732 3.732 8.616 5.598 13.507 5.598s9.781-1.866 13.513-5.591l80.876-80.876c7.443-7.44 7.463-19.495.056-26.965z"></path> <path d="M455.005 81.509H56.995c-10.552 0-19.104 8.552-19.104 19.104v147.741c0 10.552 8.552 19.104 19.104 19.104s19.104-8.552 19.104-19.104V119.718h378.905c10.552 0 19.104-8.552 19.104-19.104.001-10.552-8.551-19.105-19.103-19.105zM83.964 411.431l67.42-67.413c7.457-7.457 7.464-19.55 0-27.014-7.463-7.464-19.563-7.464-27.02 0l-80.876 80.869c-7.444 7.438-7.47 19.493-.057 26.963l80.876 81.512a19.064 19.064 0 0013.564 5.649c4.865 0 9.731-1.847 13.456-5.54 7.489-7.432 7.54-19.525.108-27.02l-67.471-68.006z"></path> <path d="M454.368 238.166c-10.552 0-19.104 8.552-19.104 19.104v135.005H56.995c-10.552 0-19.104 8.552-19.104 19.104s8.552 19.104 19.104 19.104h397.38c10.552 0 19.104-8.552 19.098-19.104V257.271c-.001-10.552-8.553-19.105-19.105-19.105z"></path> </symbol> </svg> <svg width="0" height="0" class="h5ap_svg_hidden" style="display: none;"> <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 477.88 477.88" id="shuffle"> <path d="M472.897 124.269a.892.892 0 01-.03-.031l-.017.017-68.267-68.267c-6.78-6.548-17.584-6.36-24.132.42-6.388 6.614-6.388 17.099 0 23.713l39.151 39.151h-95.334c-65.948.075-119.391 53.518-119.467 119.467-.056 47.105-38.228 85.277-85.333 85.333h-102.4C7.641 324.072 0 331.713 0 341.139s7.641 17.067 17.067 17.067h102.4c65.948-.075 119.391-53.518 119.467-119.467.056-47.105 38.228-85.277 85.333-85.333h95.334l-39.134 39.134c-6.78 6.548-6.968 17.353-.419 24.132 6.548 6.78 17.353 6.968 24.132.419.142-.137.282-.277.419-.419l68.267-68.267c6.674-6.657 6.687-17.463.031-24.136z"></path> <path d="M472.897 329.069l-.03-.03-.017.017-68.267-68.267c-6.78-6.548-17.584-6.36-24.132.42-6.388 6.614-6.388 17.099 0 23.712l39.151 39.151h-95.334a85.209 85.209 0 01-56.9-21.726c-7.081-6.222-17.864-5.525-24.086 1.555-6.14 6.988-5.553 17.605 1.319 23.874a119.28 119.28 0 0079.667 30.43h95.334l-39.134 39.134c-6.78 6.548-6.968 17.352-.42 24.132 6.548 6.78 17.352 6.968 24.132.42.142-.138.282-.277.42-.42l68.267-68.267c6.673-6.656 6.686-17.462.03-24.135zM199.134 149.702a119.28 119.28 0 00-79.667-30.43h-102.4C7.641 119.272 0 126.913 0 136.339s7.641 17.067 17.067 17.067h102.4a85.209 85.209 0 0156.9 21.726c7.081 6.222 17.864 5.525 24.086-1.555 6.14-6.989 5.553-17.606-1.319-23.875z"></path> </symbol> </svg> 
923<script>const single_player = document.querySelectorAll(".h5ap_single_button");
924			single_player.forEach(item => {
925				const audio = item.querySelector("audio");
926				audio.volume = 0.6;
927				item.querySelector('.play').addEventListener("click", function() {
928					single_player.forEach(player => {
929						player.querySelector("audio")?.pause();
930					})
931					setTimeout(() => {
932						audio.currentTime = 0;
933						audio.play();
934					}, 0);
935
936				});
937
938				item.querySelector('.pause').style.display = 'none';
939				item.querySelector('.pause').addEventListener("click", function() {
940					audio.pause();
941				});
942
943				audio.addEventListener("ended", () => {
944					item.querySelector(".play").style.display = 'inline-block';
945					item.querySelector(".pause").style.display = 'none';
946				});
947
948				audio.addEventListener("pause", () => {
949					item.querySelector(".play").style.display = 'inline-block';
950					item.querySelector(".pause").style.display = 'none';
951				});
952				audio.addEventListener("play", () => {
953					item.querySelector(".play").style.display = 'none';
954					item.querySelector(".pause").style.display = 'inline-block';
955				});
956
957			})</script>
957 
957<script id="generate-a11y">!function(){"use strict";if("querySelector"in document&&"addEventListener"in window){var e=document.body;e.addEventListener("pointerdown",(function(){e.classList.add("using-mouse")}),{passive:!0}),e.addEventListener("keydown",(function(){e.classList.remove("using-mouse")}),{passive:!0})}}();</script>
957 
957<script id="esl-membership-js-after">(function(){
958	var root=document.querySelector('.esl-pricing');
959	function bill(){var b=document.querySelector('.esl-bill.active');return b?b.getAttribute('data-interval'):'month';}
960	// billing toggle
961	document.querySelectorAll('.esl-bill').forEach(function(btn){
962		btn.addEventListener('click',function(){
963			document.querySelectorAll('.esl-bill').forEach(function(x){x.classList.remove('active');});
964			btn.classList.add('active');
965			var iv=bill();
966			document.querySelectorAll('.esl-price .amt').forEach(function(a){
967				var v=iv==='year'?a.getAttribute('data-y'):a.getAttribute('data-m');
968				if(v){a.textContent='$'+v;}
969			});
970			document.querySelectorAll('.esl-price .per').forEach(function(p){p.textContent=iv==='year'?'/yr':'/mo';});
971			/* v1.9.48 — thẻ gói ghế tự tính giá của nó (số ghế × giá ghế), nên nó
972			   phải được báo để tính lại. Một sự kiện, không phải một biến toàn cục. */
973			document.dispatchEvent(new CustomEvent('esl-bill'));
974			syncBuy(iv);
975		});
976	});
977	/* v1.7.0 — hide a Buy button whose (plan x interval) has no gateway id on
978	   this install. Same rule, same data-combos attribute and same mechanism as
979	   the PayPal button below, so there is one way this works, not two. A
980	   button with no data-combos (nothing configured to filter on) is always
981	   left alone: this must never be able to hide a CTA it does not understand. */
982	function syncBuy(iv){
983		document.querySelectorAll('.esl-buy[data-combos]').forEach(function(b){
984			var combos=(b.getAttribute('data-combos')||'').split(',');
985			var want=b.getAttribute('data-plan')+'_'+iv;
986			b.hidden=(combos.indexOf(want)===-1);
987		});
988	}
989	syncBuy(bill());
990	if(!root) return;
991	var rest=root.getAttribute('data-rest'),nonce=root.getAttribute('data-nonce');
992	var logged=root.getAttribute('data-logged')==='1',login=root.getAttribute('data-login');
993	var msg=root.querySelector('.esl-pay-msg'),choice=root.querySelector('.esl-pay-choice');
994	var pending=null;
995	function post(path,body){
996		return fetch(rest+path,{method:'POST',headers:{'Content-Type':'application/json','X-WP-Nonce':nonce},body:JSON.stringify(body||{})}).then(function(r){return r.json();});
997	}
998	root.querySelectorAll('.esl-buy').forEach(function(btn){
999		btn.addEventListener('click',function(){
1000			if(!logged){window.location.href=login;return;}
1001			pending={plan:btn.getAttribute('data-plan'),interval:bill()};
1002			/* v1.9.47 — nếu kỳ hạn đang chọn KHÔNG được cấu hình cho gói này thì
1003			   đổi sang kỳ hạn còn lại thay vì để người ta bấm rồi nhận "Price not
1004			   configured". Trường hợp thật và rất dễ xảy ra: anh Đức tạo mỗi giá
1005			   tháng cho Teacher Pro, còn nút gạt năm thì đang bật vì gói Pro có
1006			   giá năm. */
1007			var myCombos=(btn.getAttribute('data-combos')||'').split(',');
1008			if(myCombos.length&&myCombos[0]!==''&&myCombos.indexOf(pending.plan+'_'+pending.interval)===-1){
1009				var other=pending.interval==='year'?'month':'year';
1010				if(myCombos.indexOf(pending.plan+'_'+other)!==-1)pending.interval=other;
1011			}
1012			/* Gói ghế gửi kèm số ghế. Đọc từ CHÍNH ô người dùng vừa
1013			   gõ, không từ một bản sao — hai nguồn thì cái sai lại là cái người
1014			   ta trả tiền. Máy chủ vẫn kẹp lại lần nữa; ở đây chỉ để con số đi
1015			   đúng chỗ. */
1016			var seatsId=btn.getAttribute('data-seats-from');
1017			if(seatsId){
1018				var si=document.getElementById(seatsId);
1019				var sv=si?parseInt(si.value,10):0;
1020				if(sv>0)pending.seats=sv;
1021			}
1022			// Show PayPal only for combinations that are actually configured on
1023			// this site — otherwise the visitor taps it and PayPal answers
1024			// "Plan not configured".
1025			var ppBtn=root.querySelector('.esl-pay-paypal');
1026			if(ppBtn){
1027				var combos=(ppBtn.getAttribute('data-combos')||'').split(',');
1028				var want=pending.plan+'_'+pending.interval;
1029				ppBtn.hidden=(combos.indexOf(want)===-1);
1030			}
1031			choice.style.display='block';msg.textContent='';
1032			choice.scrollIntoView({behavior:'smooth',block:'center'});
1033		});
1034	});
1035	var cancel=root.querySelector('.esl-pay-cancel');
1036	if(cancel)cancel.addEventListener('click',function(){choice.style.display='none';pending=null;});
1037	function go(gw){
1038		if(!pending)return;
1039		msg.textContent='Redirecting to secure checkout…';
1040		post('/'+gw+'/checkout',pending).then(function(res){
1041			if(res&&res.url){window.location.href=res.url;}
1042			else{msg.textContent=(res&&res.message)?res.message:'Checkout is not available yet. Please try the other method.';}
1043		}).catch(function(){msg.textContent='Network error. Please try again.';});
1044	}
1045	// v1.6.07: audience switch. A CSS swap on one attribute — no reflow of the
1046	// price table, no second request, no second URL.
1047	function setAud(a,remember){
1048		if(a!=='learner'&&a!=='teacher')return;
1049		root.setAttribute('data-audience',a);
1050		root.querySelectorAll('.esl-aud').forEach(function(x){
1051			var on=x.getAttribute('data-aud')===a;
1052			x.classList.toggle('active',on);
1053			x.setAttribute('aria-pressed',on?'true':'false');
1054		});
1055		// Headlines are single-copy in the DOM (see the PHP above), so swap text.
1056		root.querySelectorAll('[data-aud-h1],[data-aud-pro]').forEach(function(h){
1057			var t=h.getAttribute('data-'+a);
1058			if(t)h.textContent=t;
1059		});
1060		/* v1.9.48 — và cùng lẽ đó với KHOÁ GÓI. Thẻ Pro bán hai sản phẩm Stripe
1061		   khác nhau tuỳ người xem; nếu chỉ đổi chữ mà không đổi khoá thì một giáo
1062		   viên bấm "Choose Pro" và tiền rơi vào sản phẩm của luồng người học —
1063		   đúng cái việc tách sản phẩm sinh ra để tránh. Đổi cả data-combos, nếu
1064		   không phép lọc PayPal và phép đổi kỳ hạn sẽ nhìn vào danh sách của gói
1065		   kia. */
1066		root.querySelectorAll('[data-plan-learner]').forEach(function(b){
1067			var p=b.getAttribute('data-plan-'+a);
1068			if(p)b.setAttribute('data-plan',p);
1069			var c=b.getAttribute('data-combos-'+a);
1070			if(c!==null)b.setAttribute('data-combos',c);
1071		});
1072		// v1.9.46 — cung le do voi ANH: mot the trong DOM, doi nguon. Hai the
1073		// roi an mot bang CSS la tai ve hai anh va vut di mot.
1074		// <source> dung srcset, <img> dung src — sai thuoc tinh thi khong bao
1075		// loi, chi la anh khong bao gio doi.
1076		root.querySelectorAll('[data-aud-src]').forEach(function(m){
1077			var u=m.getAttribute('data-'+a);
1078			if(!u)return;
1079			if(m.tagName==='SOURCE')m.setAttribute('srcset',u);
1080			else m.setAttribute('src',u);
1081		});
1082		if(remember){try{localStorage.setItem('esl_aud',a);}catch(e){}}
1083	}
1084	root.querySelectorAll('.esl-aud').forEach(function(btn){
1085		btn.addEventListener('click',function(){
1086			var want=btn.getAttribute('data-aud');
1087			if(want&&root.getAttribute('data-audience')!==want)setAud(want,true);
1088		});
1089	});
1090	// Remembered choice, but only when the server was guessing. A signed-in
1091	// user's own answer at sign-up always wins over an old click.
1092	if(root.getAttribute('data-aud-src')==='guess'){
1093		var saved=null;try{saved=localStorage.getItem('esl_aud');}catch(e){}
1094		if(saved&&saved!==root.getAttribute('data-audience'))setAud(saved,false);
1095	}
1096	var ps=root.querySelector('.esl-pay-stripe'),pp=root.querySelector('.esl-pay-paypal');
1097	if(ps)ps.addEventListener('click',function(){go('stripe');});
1098	if(pp)pp.addEventListener('click',function(){go('paypal');});
1099	var mb=root.querySelector('.esl-manage-billing');
1100	if(mb)mb.addEventListener('click',function(e){e.preventDefault();post('/stripe/portal',{}).then(function(r){if(r&&r.url)window.location.href=r.url;});});
1101	// Auto-start when arriving as ?plan=basic (e.g. straight after signup).
1102	var qp=new URLSearchParams(window.location.search),wantPlan=qp.get('plan');
1103	if(wantPlan&&logged){var b=root.querySelector('.esl-buy[data-plan="'+wantPlan+'"]');if(b)b.click();}
1104})();
1105//# sourceURL=esl-membership-js-after</script>
1105 
1105<script id="generate-menu-js-before">var generatepressMenu = {"toggleOpenedSubMenus":true,"openSubMenuLabel":"Open Sub-Menu","closeSubMenuLabel":"Close Sub-Menu"};
1106//# sourceURL=generate-menu-js-before</script>
1106 
1106<script id="generate-back-to-top-js-before">var generatepressBackToTop = {"smooth":true};
1107//# sourceURL=generate-back-to-top-js-before</script>
1107 
1107<script id="breeze-lazy-js-after">document.addEventListener("DOMContentLoaded", function () {
1108							if ( "function" !== typeof window.LazyLoad && "function" !== typeof LazyLoad ) {
1109								return;
1110							}
1111
1112							var breezeLazyLoad = window.LazyLoad || LazyLoad;
1113
1114							window.lazyLoadInstance = new breezeLazyLoad({
1115						    elements_selector: ".br-lazy",
1116						    data_src: "breeze",
1117						    data_srcset: "brsrcset",
1118						    data_sizes: "brsizes",
1119						    class_loaded: "br-loaded",
1120						    threshold: 300,
1121								    });
1122						});
1123//# sourceURL=breeze-lazy-js-after</script>
1123 
1123<script id="esl-tests-js-js-extra">var eslTests = {"ajaxUrl":"https://7esl.com/wp-admin/admin-ajax.php","restUrl":"https://7esl.com/wp-json/esl/v1/","nonce":"cd616dd652","userId":"0","is_paid":"0","profileUrl":"https://7esl.com/profile/"};
1124//# sourceURL=esl-tests-js-js-extra</script>
1124 
1124<script id="esl-article-tabs-js-js-extra">var eslArticleTabs = {"context":"category","contextId":"37395","postId":"0","testId":"894","xpReward":"5","testTitle":"Articles Practice Test (A1-B2) \u2014 Grammar Exercises with Answers","loggedIn":"","passScore":"60","timeLimit":"600"};
1125//# sourceURL=esl-article-tabs-js-js-extra</script>
1125 
1125<script id="sevenesl-sidebar-search-js-extra">var seveneslSidebarSearch = {"ajaxUrl":"https://7esl.com/wp-admin/admin-ajax.php","nonce":"be959ec6b5","homeUrl":"https://7esl.com/"};
1126//# sourceURL=sevenesl-sidebar-search-js-extra</script>
1126 
1126<script id="sevenesl-helpful-vote-js-extra">var seveneslHelpfulVote = {"ajaxUrl":"https://7esl.com/wp-admin/admin-ajax.php","nonce":"d19eea5a4d"};
1127//# sourceURL=sevenesl-helpful-vote-js-extra</script>
1127 
1127<script type="text/javascript">(function (undefined) {let scriptOptions={"_localizedStrings":{"redirect_overlay_title":"Hold On","redirect_overlay_text":"You are being redirected to another page,<br>it may take a few seconds.","webview_notification_text":"The selected provider doesn't support embedded browsers!"},"_targetWindow":"prefer-popup","_redirectOverlay":"overlay-with-spinner-and-message","_unsupportedWebviewBehavior":""};
1128/**
1129 * Used when Cross-Origin-Opener-Policy blocked the access to the opener. We can't have a reference of the opened windows, so we should attempt to refresh only the windows that has opened popups.
1130 */
1131window._nslHasOpenedPopup = false;
1132window._nslWebViewNoticeElement = null;
1133
1134window.NSLPopup = function (url, title, w, h) {
1135
1136    /**
1137     * Cross-Origin-Opener-Policy blocked the access to the opener
1138     */
1139    if (typeof BroadcastChannel === "function") {
1140        const _nslLoginBroadCastChannel = new BroadcastChannel('nsl_login_broadcast_channel');
1141        _nslLoginBroadCastChannel.onmessage = (event) => {
1142            if (window?._nslHasOpenedPopup && event.data?.action === 'redirect') {
1143                window._nslHasOpenedPopup = false;
1144
1145                const url = event.data?.href;
1146                _nslLoginBroadCastChannel.close();
1147                if (typeof window.nslRedirect === 'function') {
1148                    window.nslRedirect(url);
1149                } else {
1150                    window.opener.location = url;
1151                }
1152            }
1153        };
1154    }
1155
1156    const userAgent = navigator.userAgent,
1157        mobile = function () {
1158            return /\b(iPhone|iP[ao]d)/.test(userAgent) ||
1159                /\b(iP[ao]d)/.test(userAgent) ||
1160                /Android/i.test(userAgent) ||
1161                /Mobile/i.test(userAgent);
1162        },
1163        screenX = window.screenX !== undefined ? window.screenX : window.screenLeft,
1164        screenY = window.screenY !== undefined ? window.screenY : window.screenTop,
1165        outerWidth = window.outerWidth !== undefined ? window.outerWidth : document.documentElement.clientWidth,
1166        outerHeight = window.outerHeight !== undefined ? window.outerHeight : document.documentElement.clientHeight - 22,
1167        targetWidth = mobile() ? null : w,
1168        targetHeight = mobile() ? null : h,
1169        left = parseInt(screenX + (outerWidth - targetWidth) / 2, 10),
1170        right = parseInt(screenY + (outerHeight - targetHeight) / 2.5, 10),
1171        features = [];
1172    if (targetWidth !== null) {
1173        features.push('width=' + targetWidth);
1174    }
1175    if (targetHeight !== null) {
1176        features.push('height=' + targetHeight);
1177    }
1178    features.push('left=' + left);
1179    features.push('top=' + right);
1180    features.push('scrollbars=1');
1181
1182    const newWindow = window.open(url, title, features.join(','));
1183
1184    if (window.focus) {
1185        newWindow.focus();
1186    }
1187
1188    window._nslHasOpenedPopup = true;
1189
1190    return newWindow;
1191};
1192
1193let isWebView = null;
1194
1195function checkWebView() {
1196    if (isWebView === null) {
1197        function _detectOS(ua) {
1198            if (/Android/.test(ua)) {
1199                return "Android";
1200            } else if (/iPhone|iPad|iPod/.test(ua)) {
1201                return "iOS";
1202            } else if (/Windows/.test(ua)) {
1203                return "Windows";
1204            } else if (/Mac OS X/.test(ua)) {
1205                return "Mac";
1206            } else if (/CrOS/.test(ua)) {
1207                return "Chrome OS";
1208            } else if (/Firefox/.test(ua)) {
1209                return "Firefox OS";
1210            }
1211            return "";
1212        }
1213
1214        function _detectBrowser(ua) {
1215            let android = /Android/.test(ua);
1216
1217            if (/Opera Mini/.test(ua) || / OPR/.test(ua) || / OPT/.test(ua)) {
1218                return "Opera";
1219            } else if (/CriOS/.test(ua)) {
1220                return "Chrome for iOS";
1221            } else if (/Edge/.test(ua)) {
1222                return "Edge";
1223            } else if (android && /Silk\//.test(ua)) {
1224                return "Silk";
1225            } else if (/Chrome/.test(ua)) {
1226                return "Chrome";
1227            } else if (/Firefox/.test(ua)) {
1228                return "Firefox";
1229            } else if (android) {
1230                return "AOSP";
1231            } else if (/MSIE|Trident/.test(ua)) {
1232                return "IE";
1233            } else if (/Safari\//.test(ua)) {
1234                return "Safari";
1235            }
1235 else if (/AppleWebKit/.test(ua)) {
1236                return "WebKit";
1237            }
1238            return "";
1239        }
1240
1241        function _detectBrowserVersion(ua, browser) {
1242            if (browser === "Opera") {
1243                return /Opera Mini/.test(ua) ? _getVersion(ua, "Opera Mini/") :
1244                    / OPR/.test(ua) ? _getVersion(ua, " OPR/") :
1245                        _getVersion(ua, " OPT/");
1246            } else if (browser === "Chrome for iOS") {
1247                return _getVersion(ua, "CriOS/");
1248            } else if (browser === "Edge") {
1249                return _getVersion(ua, "Edge/");
1250            } else if (browser === "Chrome") {
1251                return _getVersion(ua, "Chrome/");
1252            } else if (browser === "Firefox") {
1253                return _getVersion(ua, "Firefox/");
1254            } else if (browser === "Silk") {
1255                return _getVersion(ua, "Silk/");
1256            } else if (browser === "AOSP") {
1257                return _getVersion(ua, "Version/");
1258            } else if (browser === "IE") {
1259                return /IEMobile/.test(ua) ? _getVersion(ua, "IEMobile/") :
1260                    /MSIE/.test(ua) ? _getVersion(ua, "MSIE ")
1261                        :
1262                        _getVersion(ua, "rv:");
1263            } else if (browser === "Safari") {
1264                return _getVersion(ua, "Version/");
1265            } else if (browser === "WebKit") {
1266                return _getVersion(ua, "WebKit/");
1267            }
1268            return "0.0.0";
1269        }
1270
1271        function _getVersion(ua, token) {
1272            try {
1273                return _normalizeSemverString(ua.split(token)[1].trim().split(/[^\w\.]/)[0]);
1274            } catch (o_O) {
1275            }
1276            return "0.0.0";
1277        }
1278
1279        function _normalizeSemverString(version) {
1280            const ary = version.split(/[\._]/);
1281            return (parseInt(ary[0], 10) || 0) + "." +
1282                (parseInt(ary[1], 10) || 0) + "." +
1283                (parseInt(ary[2], 10) || 0);
1284        }
1285
1286        function _isWebView(ua, os, browser, version, options) {
1287            switch (os + browser) {
1288                case "iOSSafari":
1289                    return false;
1290                case "iOSWebKit":
1291                    return _isWebView_iOS(options);
1292                case "AndroidAOSP":
1293                    return false;
1294                case "AndroidChrome":
1295                    return parseFloat(version) >= 42 ? /; wv/.test(ua) : /\d{2}\.0\.0/.test(version) ? true : _isWebView_Android(options);
1296            }
1297            return false;
1298        }
1299
1300        function _isWebView_iOS(options) {
1301            const document = (window["document"] || {});
1302
1303            if ("WEB_VIEW" in options) {
1304                return options["WEB_VIEW"];
1305            }
1306            return !("fullscreenEnabled" in document || "webkitFullscreenEnabled" in document || false);
1307        }
1308
1309        function _isWebView_Android(options) {
1310            if ("WEB_VIEW" in options) {
1311                return options["WEB_VIEW"];
1312            }
1313            return !("requestFileSystem" in window || "webkitRequestFileSystem" in window || false);
1314        }
1315
1316        const options = {},
1317            nav = window.navigator || {},
1318            ua = nav.userAgent || "",
1319            os = _detectOS(ua),
1320            browser = _detectBrowser(ua),
1321            browserVersion = _detectBrowserVersion(ua, browser);
1322
1323        isWebView = _isWebView(ua, os, browser, browserVersion, options);
1324    }
1325
1326    return isWebView;
1327}
1328
1329function isAllowedWebViewForUserAgent(provider) {
1330    const facebookAllowedWebViews = [
1331        'Instagram',
1332        'FBAV',
1333        'FBAN'
1334    ];
1335    let whitelist = [];
1336
1337    if (provider && provider === 'facebook') {
1338        whitelist = facebookAllowedWebViews;
1339    }
1340
1341    const nav = window.navigator || {},
1342        ua = nav.userAgent || "";
1343
1344    if (whitelist.length && ua.match(new RegExp(whitelist.join('|')))) {
1345        return true;
1346    }
1347
1348    return false;
1349}
1350
1351function disableButtonInWebView(providerButtonElement) {
1352    if (providerButtonElement) {
1353        providerButtonElement.classList.add('nsl-disabled-provider');
1354        providerButtonElement.setAttribute('href', '#');
1355
1356        providerButtonElement.addEventListener('pointerdown', (e) => {
1357            const closeNotice = function () {
1358                if (window._nslWebViewNoticeElement) {
1359                    window._nslWebViewNoticeElement.remove();
1360                    window._nslWebViewNoticeElement = null;
1361                }
1362            };
1363
1364            closeNotice();
1365
1366            window._nslWebViewNoticeElement = document.createElement('div');
1367            window._nslWebViewNoticeElement.id = "nsl-notices-fallback";
1368            window._nslWebViewNoticeElement.role = 'alert';
1369            window._nslWebViewNoticeElement.ariaLive = 'assertive';
1370            window._nslWebViewNoticeElement.ariaAtomic = 'true';
1371
1372            window._nslWebViewNoticeElement.addEventListener('pointerdown', closeNotice);
1373
1374            window._nslWebViewNoticeElement.addEventListener('keydown', function (e) {
1375                if (e.key === 'Enter') {
1376                    e.preventDefault();
1377                    closeNotice();
1378                }
1379            });
1380            const webviewNoticeHTML = '<div class="error"><p>' + scriptOptions._localizedStrings.webview_notification_text + '</p></div>';
1381
1382            window._nslWebViewNoticeElement.insertAdjacentHTML("afterbegin", webviewNoticeHTML);
1383            document.body.appendChild(window._nslWebViewNoticeElement);
1384        });
1385    }
1386
1387}
1388
1389window._nslDOMReady(function () {
1390
1391    window.nslRedirect = function (url) {
1392        if (scriptOptions._redirectOverlay) {
1393            const overlay = document.createElement('div');
1394            overlay.id = "nsl-redirect-overlay";
1395            let overlayHTML = '';
1396            const overlayContainer = "<div id='nsl-redirect-overlay-container'>",
1397                overlayContainerClose = "</div>",
1398                overlaySpinner = "<div id='nsl-redirect-overlay-spinner'></div>",
1399                overlayTitle = "<p id='nsl-redirect-overlay-title'>" + scriptOptions._localizedStrings.redirect_overlay_title + "</p>",
1400                overlayText = "<p id='nsl-redirect-overlay-text'>" + scriptOptions._localizedStrings.redirect_overlay_text + "</p>";
1401
1402            switch (scriptOptions._redirectOverlay) {
1403                case "overlay-only":
1404                    break;
1405                case "overlay-with-spinner":
1406                    overlayHTML = overlayContainer + overlaySpinner + overlayContainerClose;
1407                    break;
1408                default:
1409                    overlayHTML = overlayContainer + overlaySpinner + overlayTitle + overlayText + overlayContainerClose;
1410                    break;
1411            }
1412
1413            overlay.insertAdjacentHTML("afterbegin", overlayHTML);
1414            document.body.appendChild(overlay);
1415        }
1416
1417        window.location = url;
1418    };
1419
1420    let targetWindow = scriptOptions._targetWindow || 'prefer-popup',
1421        lastPopup = false;
1422
1423
1424    document.addEventListener('click', function (e) {
1425        if (e.target) {
1426            const buttonLinkElement = e.target.closest('a[data-plugin="nsl"][data-action="connect"]') || e.target.closest('a[data-plugin="nsl"][data-action="link"]');
1427            if (buttonLinkElement) {
1428                if (lastPopup && !lastPopup.closed) {
1429                    e.preventDefault();
1430                    lastPopup.focus();
1431                } else {
1432
1433                    let href = buttonLinkElement.href,
1434                        success = false;
1435                    if (href.indexOf('?') !== -1) {
1436                        href += '&';
1437                    } else {
1438                        href += '?';
1439                    }
1440
1441                    const redirectTo = buttonLinkElement.dataset.redirect;
1442                    if (redirectTo === 'current') {
1443                        href += 'redirect=' + encodeURIComponent(window.location.href) + '&';
1444                    } else if (redirectTo && redirectTo !== '') {
1445                        href += 'redirect=' + encodeURIComponent(redirectTo) + '&';
1446                    }
1447
1448                    if (targetWindow !== 'prefer-same-window' && checkWebView()) {
1449                        targetWindow = 'prefer-same-window';
1450                    }
1451
1452                    if (targetWindow === 'prefer-popup') {
1453                        lastPopup = NSLPopup(href + 'display=popup', 'nsl-social-connect', buttonLinkElement.dataset.popupwidth, buttonLinkElement.dataset.popupheight);
1454                        if (lastPopup) {
1455                            success = true;
1456                            e.preventDefault();
1457                        }
1458                    } else if (targetWindow === 'prefer-new-tab') {
1459                        const newTab = window.open(href + 'display=popup', '_blank');
1460                        if (newTab) {
1461                            if (window.focus) {
1462                                newTab.focus();
1463                            }
1464                            success = true;
1465                            window._nslHasOpenedPopup = true;
1466                            e.preventDefault();
1467                        }
1468                    }
1469
1470                    if (!success) {
1471                        window.location = href;
1472                        e.preventDefault();
1473                    }
1474                }
1475            }
1476        }
1477    });
1478
1479    let buttonCountChanged = false;
1480
1481    const googleLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="google"]');
1482    if (googleLoginButtons.length && checkWebView()) {
1483        googleLoginButtons.forEach(function (googleLoginButton) {
1484            if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') {
1485                disableButtonInWebView(googleLoginButton);
1486            } else {
1487                googleLoginButton.remove();
1488                buttonCountChanged = true;
1489            }
1490        });
1491    }
1492
1493    const facebookLoginButtons = document.querySelectorAll(' a[data-plugin="nsl"][data-provider="facebook"]');
1494    if (facebookLoginButtons.length && checkWebView() && /Android/.test(window.navigator.userAgent) && !isAllowedWebViewForUserAgent('facebook')) {
1495        facebookLoginButtons.forEach(function (facebookLoginButton) {
1496            if (scriptOptions._unsupportedWebviewBehavior === 'disable-button') {
1497                disableButtonInWebView(facebookLoginButton);
1498            } else {
1499                facebookLoginButton.remove();
1500                buttonCountChanged = true;
1501            }
1502        });
1503    }
1504
1505    const separators = document.querySelectorAll('div.nsl-separator');
1506    if (buttonCountChanged && separators.length) {
1507        separators.forEach(function (separator) {
1508            const separatorParentNode = separator.parentNode;
1509            if (separatorParentNode) {
1510                const separatorButtonContainer = separatorParentNode.querySelector('div.nsl-container-buttons');
1511                if (separatorButtonContainer && !separatorButtonContainer.hasChildNodes()) {
1512                    separator.remove();
1513                }
1514            }
1515        })
1516    }
1517});})();</script>
1517<div id="sevenesl-search-modal" class="sevenesl-search-modal" hidden aria-hidden="true"><div class="sevenesl-search-modal__dialog" role="dialog" aria-modal="true" aria-labelledby="sevenesl-search-modal-title"> <button class="sevenesl-search-modal__close" data-sevenesl-search-close aria-label="Close search popup"> <span aria-hidden="true">×</span> </button><div class="sevenesl-search-modal__header"><div class="sevenesl-search-modal__heading"><p class="sevenesl-search-modal__label">Search 7ESL</p><h2 id="sevenesl-search-modal-title">Find the right article faster</h2></div><form class="sevenesl-search-modal__form" role="search" method="get" action="https://7esl.com/"> <span class="sevenesl-search-modal__search-icon" aria-hidden="true"> <svg viewBox="0 0 24 24" focusable="false" aria-hidden="true"><path d="M10.5 4.75a5.75 5.75 0 1 0 0 11.5a5.75 5.75 0 0 0 0-11.5Zm0-1.5a7.25 7.25 0 1 1 0 14.5a7.25 7.25 0 0 1 0-14.5Zm6.23 12.42l3.52 3.52a.75.75 0 1 1-1.06 1.06l-3.52-3.52a.75.75 0 1 1 1.06-1.06Z" fill="currentColor"></path></svg> </span> <input type="search" class="sevenesl-search-modal__input" name="s" placeholder="Search articles, grammar, vocabulary..." autocomplete="off" /> <button type="submit" class="sevenesl-search-modal__submit">Search</button></form></div><div class="sevenesl-search-modal__summary"></div><div class="sevenesl-search-modal__status"></div><div class="sevenesl-search-modal__results"></div></div></div>
1517<script type="text/javascript">window.addEventListener("DOMContentLoaded",(e=>{document.querySelectorAll('img[loading="lazy"]').forEach((e=>{e.getBoundingClientRect().top<=window.innerHeight&&(e.loading="eager")}))}));</script>
1517 
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-functions-js-sticky.min-243a12dcd23b.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-assets-js-thinklab-7afb6f893f72.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-assets-js-menu.min-826f0eef6b5f.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-assets-js-back-to-top.min-888dfb066496.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-js-js-front-end-breeze-lazy-load.min-396a30523880.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-tests-assets-tests-b5cb7b06fc8e.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-assets-js-toc-c4a67bd4f5d3.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-tests-assets-esl-sounds-c2ac284eee28.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-tests-assets-article-tabs-b45bfbf528f1.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-assets-js-site-chrome-7fff92bb9ee3.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-assets-js-sidebar-search-1483100a9f2b.js?ver=1790251294"></script>
1517<script type="text/javascript" src="https://7esl.com/wp-content/cache/breeze-minification/js/breeze_category-grammar-articles-1-112735-assets-js-helpful-vote-3b9a9ab89cab.js?ver=1790251294"></script>
1517</body></html>
1518<!-- Cache served by breeze CACHE - Last modified: Thu, 24 Sep 2026 12:01:34 GMT -->

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.