{"id":3135,"date":"2026-09-05T04:58:54","date_gmt":"2026-09-05T04:58:54","guid":{"rendered":"https:\/\/digitalbridgehub.com\/acrossysdigital\/?page_id=3135"},"modified":"2026-09-09T08:15:02","modified_gmt":"2026-09-09T08:15:02","slug":"grammar-checker","status":"publish","type":"page","link":"https:\/\/digitalbridgehub.com\/acrossysdigital\/tools\/grammar-checker\/","title":{"rendered":"Grammar Checker"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3135\" class=\"elementor elementor-3135\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-35cef22 e-flex e-con-boxed qodef-elementor-content-no e-con e-parent\" data-id=\"35cef22\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fa56078 elementor-widget elementor-widget-shortcode\" data-id=\"fa56078\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\r\n<div class=\"aitool-wrapper\">\r\n    <div class=\"aitool-header\">\r\n        <h2>Grammar and Style Checker<\/h2>\r\n        <p>Analyze text for grammatical inaccuracies, spelling errors, punctuation issues, and stylistic improvements<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"aitool-body\">\r\n        <div class=\"aitool-calc-grid\">\r\n            <!-- Left Input Column -->\r\n            <div class=\"aitool-card\">\r\n                <div class=\"aitool-card-header\">\r\n                    <span class=\"aitool-card-title\">Source Text<\/span>\r\n                    <span class=\"aitool-card-badge\">Input<\/span>\r\n                <\/div>\r\n                <div class=\"aitool-card-body\">\r\n                    <div class=\"aitool-row\">\r\n                        <label for=\"grm-lang\">Document Language<\/label>\r\n                        <select id=\"grm-lang\">\r\n                            <option value=\"en-US\" selected>English (United States)<\/option>\r\n                            <option value=\"en-GB\">English (United Kingdom)<\/option>\r\n                            <option value=\"en-AU\">English (Australia)<\/option>\r\n                            <option value=\"de-DE\">German<\/option>\r\n                            <option value=\"fr\">French<\/option>\r\n                            <option value=\"es\">Spanish<\/option>\r\n                            <option value=\"pt-BR\">Portuguese (Brazil)<\/option>\r\n                            <option value=\"it\">Italian<\/option>\r\n                            <option value=\"nl\">Dutch<\/option>\r\n                            <option value=\"auto\">Auto-detect Language<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n\r\n                    <div class=\"aitool-row\">\r\n                        <label for=\"grm-input\">Input Content *<\/label>\r\n                        <textarea id=\"grm-input\" rows=\"12\" placeholder=\"Type or paste text here to inspect...\"><\/textarea>\r\n                        <div class=\"serp-char-row\">\r\n                            <span id=\"grm-stats-counter\">0 words | 0 characters<\/span>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"aitool-buttons\">\r\n                        <button type=\"button\" id=\"grm-check-btn\" class=\"aitool-btn aitool-btn-primary\">Inspect Text<\/button>\r\n                        <button type=\"button\" id=\"grm-apply-btn\" class=\"aitool-btn aitool-btn-copy\" style=\"display: none;\">Apply All Corrections<\/button>\r\n                        <button type=\"button\" id=\"grm-clear-btn\" class=\"aitool-btn aitool-btn-secondary\">Clear<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- Right Column: Results & Analysis -->\r\n            <div class=\"aitool-sticky-panel\">\r\n                <div class=\"aitool-card\">\r\n                    <div class=\"aitool-card-header\">\r\n                        <span class=\"aitool-card-title\">Analysis Overview<\/span>\r\n                        <span class=\"aitool-card-badge\" id=\"grm-status-badge\">Idle<\/span>\r\n                    <\/div>\r\n                    <div class=\"aitool-card-body\">\r\n                        <div class=\"aitool-metric-grid\">\r\n                            <div class=\"aitool-metric-card highlight\">\r\n                                <div class=\"aitool-mc-label\">Issues Detected<\/div>\r\n                                <div class=\"aitool-mc-val\" id=\"grm-issue-count\">0<\/div>\r\n                            <\/div>\r\n                            <div class=\"aitool-metric-card\">\r\n                                <div class=\"aitool-mc-label\">Total Words<\/div>\r\n                                <div class=\"aitool-mc-val\" id=\"grm-word-metric\">0<\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div id=\"grm-results-container\" style=\"margin-top: 15px; display: flex; flex-direction: column; gap: 12px;\">\r\n                            <div class=\"aitool-card-highlight\" style=\"margin-bottom: 0;\">\r\n                                <div class=\"aitool-card-highlight-label\">Awaiting Execution<\/div>\r\n                                <div class=\"aitool-card-content\" style=\"color: var(--BodyTxtColor);\">\r\n                                    Enter content in the editor and select Inspect Text to review suggestions.\r\n                                <\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <!-- Issue Stream -->\r\n        <div class=\"aitool-card\" id=\"grm-issues-card\" style=\"display: none; margin-top: 25px;\">\r\n            <div class=\"aitool-card-header\">\r\n                <span class=\"aitool-card-title\">Identified Issues<\/span>\r\n                <span class=\"aitool-card-badge\" id=\"grm-issues-badge\">0 Found<\/span>\r\n            <\/div>\r\n            <div class=\"aitool-card-body\" id=\"grm-issues-list\" style=\"display: flex; flex-direction: column; gap: 12px;\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"aitool-info-box\" style=\"margin-top: 25px;\">\r\n            <strong>Proofreading Guidelines:<\/strong>\r\n            <ul style=\"margin: 10px 0 0 20px; line-height: 1.7;\">\r\n                <li>Context matters: Specialized technical terms, acronyms, or proper brand names may register as spelling flags. Verify before applying replacements.<\/li>\r\n                <li>Apply All Corrections replaces every flagged error with its primary suggested replacement. Review text after mass updates to preserve intentional phrasing.<\/li>\r\n                <li>Selecting the correct regional language variant (for example, US versus UK English) avoids false-positive spelling discrepancies.<\/li>\r\n            <\/ul>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\njQuery(document).ready(function ($) {\r\n    var matchData    = [];\r\n    var originalText = '';\r\n\r\n    var $input       = $('#grm-input');\r\n    var $lang        = $('#grm-lang');\r\n    var $checkBtn    = $('#grm-check-btn');\r\n    var $applyBtn    = $('#grm-apply-btn');\r\n    var $clearBtn    = $('#grm-clear-btn');\r\n\r\n    var $counter     = $('#grm-stats-counter');\r\n    var $statusBadge = $('#grm-status-badge');\r\n    var $issueCount  = $('#grm-issue-count');\r\n    var $wordMetric  = $('#grm-word-metric');\r\n\r\n    var $resultsContainer = $('#grm-results-container');\r\n    var $issuesCard       = $('#grm-issues-card');\r\n    var $issuesList       = $('#grm-issues-list');\r\n    var $issuesBadge      = $('#grm-issues-badge');\r\n\r\n    function escapeHtml(text) {\r\n        if (!text) return '';\r\n        return String(text).replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;')\r\n                           .replace(\/>\/g, '&gt;').replace(\/\"\/g, '&quot;').replace(\/'\/g, '&#39;');\r\n    }\r\n\r\n    function updateMetrics(text) {\r\n        var trimmed = text.trim();\r\n        var words = trimmed === '' ? 0 : trimmed.split(\/\\s+\/).length;\r\n        var chars = text.length;\r\n\r\n        $counter.text(words + ' words | ' + chars + ' characters');\r\n        $wordMetric.text(words);\r\n    }\r\n\r\n    function generatePreview(text, matches) {\r\n        if (!matches.length) return escapeHtml(text);\r\n        var output = '';\r\n        var pointer = 0;\r\n        var sorted = matches.slice().sort(function (a, b) { return a.offset - b.offset; });\r\n\r\n        for (var i = 0; i < sorted.length; i++) {\r\n            var m = sorted[i];\r\n            var replacement = m.replacements.length ? m.replacements[0].value : null;\r\n\r\n            output += escapeHtml(text.substring(pointer, m.offset));\r\n\r\n            if (replacement) {\r\n                output += '<span style=\"background: rgba(229, 126, 37, 0.2); color: var(--PrimaryColor); padding: 1px 4px; border-radius: var(--Radius_Small); font-weight: 600; border-bottom: 2px dashed var(--PrimaryColor);\">' + escapeHtml(replacement) + '<\/span>';\r\n            } else {\r\n                output += '<span style=\"background: rgba(239, 68, 68, 0.2); color: #ef4444; padding: 1px 4px; border-radius: var(--Radius_Small); font-weight: 600;\">' + escapeHtml(text.substr(m.offset, m.length)) + '<\/span>';\r\n            }\r\n\r\n            pointer = m.offset + m.length;\r\n        }\r\n\r\n        output += escapeHtml(text.substring(pointer));\r\n        return output;\r\n    }\r\n\r\n    function generateReplacementText(text, matches) {\r\n        if (!matches.length) return text;\r\n        var output = '';\r\n        var pointer = 0;\r\n        var sorted = matches.slice().sort(function (a, b) { return a.offset - b.offset; });\r\n\r\n        for (var i = 0; i < sorted.length; i++) {\r\n            var m = sorted[i];\r\n            var replacement = m.replacements.length ? m.replacements[0].value : text.substr(m.offset, m.length);\r\n            output += text.substring(pointer, m.offset) + replacement;\r\n            pointer = m.offset + m.length;\r\n        }\r\n\r\n        output += text.substring(pointer);\r\n        return output;\r\n    }\r\n\r\n    $input.on('input', function () {\r\n        updateMetrics($(this).val());\r\n    });\r\n\r\n    $checkBtn.on('click', function () {\r\n        var text = $input.val();\r\n        if (!text.trim()) {\r\n            alert('Please supply text for analysis.');\r\n            return;\r\n        }\r\n\r\n        $checkBtn.prop('disabled', true).text('Inspecting...');\r\n        $statusBadge.text('Running').css('color', 'var(--PrimaryColor)');\r\n\r\n        $resultsContainer.html('<div class=\"aitool-loading\"><span class=\"aitool-loading-spinner\">\u27f3<\/span> Contacting verification service...<\/div>');\r\n\r\n        $.ajax({\r\n            url: 'https:\/\/api.languagetool.org\/v2\/check',\r\n            type: 'POST',\r\n            data: {\r\n                text: text,\r\n                language: $lang.val()\r\n            },\r\n            success: function (res) {\r\n                matchData = res.matches || [];\r\n                originalText = text;\r\n\r\n                var correctedHtml = generatePreview(text, matchData);\r\n                $issueCount.text(matchData.length);\r\n\r\n                var previewHtml = '<div class=\"aitool-card-highlight\" style=\"margin-bottom:0;\">';\r\n                previewHtml += '<div class=\"aitool-card-highlight-label\">Verified Preview<\/div>';\r\n                previewHtml += '<div class=\"aitool-card-content\" style=\"color:var(--AccentTxtColor);\">' + correctedHtml.replace(\/\\n\/g, '<br>') + '<\/div>';\r\n                previewHtml += '<\/div>';\r\n\r\n                $resultsContainer.html(previewHtml);\r\n\r\n                if (matchData.length > 0) {\r\n                    $statusBadge.text('Action Required').css('color', '#ef4444');\r\n                    $applyBtn.show();\r\n                    $issuesCard.show();\r\n                    $issuesBadge.text(matchData.length + ' Found');\r\n\r\n                    var listHtml = '';\r\n                    for (var i = 0; i < matchData.length; i++) {\r\n                        var m = matchData[i];\r\n                        var category = (m.rule && m.rule.category) ? m.rule.category.id : 'GENERAL';\r\n                        var originalFragment = text.substr(m.offset, m.length);\r\n                        var suggestion = m.replacements.length ? m.replacements[0].value : 'No immediate recommendation';\r\n\r\n                        listHtml += '<div class=\"aitool-card-highlight\" style=\"background:var(--BodyBGColor); border-left-color:var(--PrimaryColor); margin-bottom:0;\">';\r\n                        listHtml += '<div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:6px;\">';\r\n                        listHtml += '<span class=\"aitool-card-badge\">' + escapeHtml(category) + '<\/span>';\r\n                        listHtml += '<\/div>';\r\n                        listHtml += '<div style=\"font-size:13px; color:var(--AccentTxtColor);\">';\r\n                        listHtml += '<span style=\"text-decoration:line-through; color:#ef4444;\">' + escapeHtml(originalFragment) + '<\/span>';\r\n                        listHtml += ' &rarr; <strong style=\"color:#22c55e;\">' + escapeHtml(suggestion) + '<\/strong>';\r\n                        listHtml += '<\/div>';\r\n                        listHtml += '<div style=\"font-size:12px; color:var(--BodyTxtColor); margin-top:4px;\">' + escapeHtml(m.message) + '<\/div>';\r\n                        listHtml += '<\/div>';\r\n                    }\r\n\r\n                    $issuesList.html(listHtml);\r\n                } else {\r\n                    $statusBadge.text('Clean').css('color', '#22c55e');\r\n                    $applyBtn.hide();\r\n                    $issuesCard.hide();\r\n                    $issuesList.empty();\r\n                }\r\n            },\r\n            error: function (xhr) {\r\n                var message = 'Inspection service unavailable. Please re-attempt shortly.';\r\n                if (xhr.status === 429) {\r\n                    message = 'Rate limit reached. Please wait a brief moment before re-submitting.';\r\n                }\r\n                $statusBadge.text('Failed').css('color', '#ef4444');\r\n                $resultsContainer.html('<div class=\"aitool-error\">' + escapeHtml(message) + '<\/div>');\r\n            },\r\n            complete: function () {\r\n                $checkBtn.prop('disabled', false).text('Inspect Text');\r\n            }\r\n        });\r\n    });\r\n\r\n    $applyBtn.on('click', function () {\r\n        if (!originalText || !matchData.length) return;\r\n        var corrected = generateReplacementText(originalText, matchData);\r\n        $input.val(corrected);\r\n        updateMetrics(corrected);\r\n\r\n        matchData = [];\r\n        originalText = corrected;\r\n\r\n        $statusBadge.text('Corrected').css('color', '#22c55e');\r\n        $issueCount.text('0');\r\n\r\n        $resultsContainer.html(\r\n            '<div class=\"aitool-card-highlight\" style=\"background:rgba(34,197,94,0.08); border-left-color:#22c55e; margin-bottom:0;\">' +\r\n            '<div class=\"aitool-card-highlight-label\" style=\"color:#22c55e;\">Complete<\/div>' +\r\n            '<div class=\"aitool-card-content\" style=\"color:var(--AccentTxtColor);\">All replacements successfully transferred to input editor. Select Inspect Text to re-verify.<\/div>' +\r\n            '<\/div>'\r\n        );\r\n\r\n        $applyBtn.hide();\r\n        $issuesCard.hide();\r\n        $issuesList.empty();\r\n    });\r\n\r\n    $clearBtn.on('click', function () {\r\n        $input.val('');\r\n        updateMetrics('');\r\n        matchData = [];\r\n        originalText = '';\r\n\r\n        $statusBadge.text('Idle').css('color', 'var(--BodyTxtColor)');\r\n        $issueCount.text('0');\r\n        $applyBtn.hide();\r\n        $issuesCard.hide();\r\n        $issuesList.empty();\r\n\r\n        $resultsContainer.html(\r\n            '<div class=\"aitool-card-highlight\" style=\"margin-bottom:0;\">' +\r\n            '<div class=\"aitool-card-highlight-label\">Awaiting Execution<\/div>' +\r\n            '<div class=\"aitool-card-content\" style=\"color:var(--BodyTxtColor);\">Enter content in the editor and select Inspect Text to review suggestions.<\/div>' +\r\n            '<\/div>'\r\n        );\r\n    });\r\n\r\n    updateMetrics($input.val());\r\n});\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":3234,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-3135","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/pages\/3135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/comments?post=3135"}],"version-history":[{"count":4,"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/pages\/3135\/revisions"}],"predecessor-version":[{"id":3139,"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/pages\/3135\/revisions\/3139"}],"up":[{"embeddable":true,"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/pages\/3234"}],"wp:attachment":[{"href":"https:\/\/digitalbridgehub.com\/acrossysdigital\/wp-json\/wp\/v2\/media?parent=3135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}