{"id":6854,"date":"2025-05-13T17:09:05","date_gmt":"2025-05-13T15:09:05","guid":{"rendered":"https:\/\/libiweb.com\/?p=6854"},"modified":"2025-05-13T17:09:06","modified_gmt":"2025-05-13T15:09:06","slug":"6854-2","status":"publish","type":"post","link":"https:\/\/libiweb.com\/cs\/6854-2\/","title":{"rendered":""},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Local SEO Page Maker<\/title>\n    <style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            margin: 20px;\n            background-color: #f4f7f6;\n            color: #333;\n        }\n        .container {\n            display: flex;\n            gap: 20px;\n            margin-bottom: 20px;\n        }\n        .input-area {\n            flex: 1;\n            background-color: #fff;\n            padding: 15px;\n            border-radius: 8px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        textarea {\n            width: 95%;\n            min-height: 150px;\n            padding: 10px;\n            border: 1px solid #ccc;\n            border-radius: 4px;\n            font-size: 14px;\n            margin-top: 5px;\n        }\n        label {\n            font-weight: bold;\n            display: block;\n            margin-bottom: 5px;\n        }\n        button {\n            display: block;\n            margin: 20px auto;\n            padding: 12px 25px;\n            background-color: #007bff;\n            color: white;\n            border: none;\n            border-radius: 5px;\n            font-size: 16px;\n            cursor: pointer;\n            transition: background-color 0.3s ease;\n        }\n        button:hover {\n            background-color: #0056b3;\n        }\n        #results-area {\n            margin-top: 20px;\n        }\n        .location-cluster {\n            margin-bottom: 20px;\n            padding: 15px;\n            border-radius: 8px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n            border-left: 5px solid; \/* Color will be set by JS *\/\n        }\n        .location-cluster h3 {\n            margin-top: 0;\n            border-bottom: 1px solid #eee;\n            padding-bottom: 10px;\n        }\n        .page-suggestion {\n            background-color: #f9f9f9;\n            padding: 10px;\n            margin-bottom: 10px;\n            border-radius: 4px;\n            border: 1px solid #e0e0e0;\n        }\n        .page-suggestion p {\n            margin: 5px 0;\n            font-size: 0.9em;\n        }\n        .page-suggestion strong {\n            font-size: 1em;\n            color: #2c3e50;\n        }\n        #summary {\n            background-color: #e9ecef;\n            padding: 15px;\n            border-radius: 8px;\n            margin-bottom: 20px;\n            text-align: center;\n            font-size: 1.1em;\n        }\n        .brand-placeholder {\n            font-style: italic;\n            color: #7f8c8d;\n        }\n    <\/style>\n<\/head>\n<body>\n\n    <h1>Local SEO Service Page Generator<\/h1>\n    <p>Enter your services and target locations to get suggestions for SEO-optimized service pages.<\/p>\n\n    <div class=\"container\">\n        <div class=\"input-area\">\n            <label for=\"services\">Services (one per line):<\/label>\n            <textarea id=\"services\" placeholder=\"e.g.,\nRoof Repair\nGutter Cleaning\nSiding Installation\"><\/textarea>\n        <\/div>\n        <div class=\"input-area\">\n            <label for=\"locations\">Locations (one per line):<\/label>\n            <textarea id=\"locations\" placeholder=\"e.g.,\nSpringfield\nShelbyville\nOgdenville\"><\/textarea>\n        <\/div>\n    <\/div>\n\n    <button onclick=\"generatePages()\">Generate Page Suggestions<\/button>\n\n    <div id=\"summary\"><\/div>\n    <div id=\"results-area\"><\/div>\n\n    <script>\n        \/\/ Predefined list of colors for locations\n        const locationColors = [\n            '#3498db', '#e74c3c', '#2ecc71', '#f1c40f', '#9b59b6',\n            '#1abc9c', '#e67e22', '#34495e', '#d35400', '#c0392b'\n        ];\n\n        function generatePages() {\n            const servicesInput = document.getElementById('services').value.trim();\n            const locationsInput = document.getElementById('locations').value.trim();\n            const resultsArea = document.getElementById('results-area');\n            const summaryArea = document.getElementById('summary');\n\n            resultsArea.innerHTML = ''; \/\/ Clear previous results\n            summaryArea.innerHTML = ''; \/\/ Clear previous summary\n\n            if (!servicesInput || !locationsInput) {\n                summaryArea.innerHTML = '<p style=\"color: red;\">Please enter at least one service and one location.<\/p>';\n                return;\n            }\n\n            const services = servicesInput.split('\\n').map(s => s.trim()).filter(s => s);\n            const locations = locationsInput.split('\\n').map(l => l.trim()).filter(l => l);\n\n            if (services.length === 0 || locations.length === 0) {\n                summaryArea.innerHTML = '<p style=\"color: red;\">Please ensure services and locations are entered correctly (one per line).<\/p>';\n                return;\n            }\n\n            let totalPages = 0;\n            let colorIndex = 0;\n\n            locations.forEach(location => {\n                const locationClusterDiv = document.createElement('div');\n                locationClusterDiv.className = 'location-cluster';\n                \/\/ Cycle through colors\n                const currentColor = locationColors[colorIndex % locationColors.length];\n                locationClusterDiv.style.borderColor = currentColor;\n                locationClusterDiv.style.backgroundColor = lightenColor(currentColor, 0.9); \/\/ Lighter background\n\n                const locationHeader = document.createElement('h3');\n                locationHeader.textContent = `Location Cluster: ${location}`;\n                locationHeader.style.color = currentColor;\n                locationClusterDiv.appendChild(locationHeader);\n\n                const pagesList = document.createElement('ul');\n                pagesList.style.listStyleType = 'none';\n                pagesList.style.paddingLeft = '0';\n\n                services.forEach(service => {\n                    totalPages++;\n                    const pageSuggestionDiv = document.createElement('div');\n                    pageSuggestionDiv.className = 'page-suggestion';\n\n                    \/\/ --- Title Generation ---\n                    \/\/ Example 1: Best [Service] in [Location] | Your Brand\n                    \/\/ Example 2: Expert [Service] Services in [Location]\n                    const titleExample1 = `Best ${service} in ${location} | <span class=\"brand-placeholder\">[Your Brand Name]<\/span>`;\n                    const titleExample2 = `Expert ${service} Services in ${location} | <span class=\"brand-placeholder\">[Your Brand Name]<\/span>`;\n\n                    \/\/ --- Meta Description Generation ---\n                    \/\/ Example 1: Looking for reliable ${service} in ${location}? [Your Brand Name] offers top-quality solutions. Contact us today!\n                    \/\/ Example 2: Get professional ${service} services in ${location}. [Your Brand Name] delivers expert results. Free quote available.\n                    const metaExample1 = `Looking for reliable ${service.toLowerCase()} in ${location}? <span class=\"brand-placeholder\">[Your Brand Name]<\/span> offers top-quality solutions tailored to your needs. Contact us today for a free consultation!`;\n                    const metaExample2 = `Get professional ${service.toLowerCase()} services in ${location}. <span class=\"brand-placeholder\">[Your Brand Name]<\/span> delivers expert results and outstanding customer care. Free quote available.`;\n\n                    \/\/ --- URL Slug Suggestion ---\n                    const slug = `${service.toLowerCase().replace(\/\\s+\/g, '-')}-in-${location.toLowerCase().replace(\/\\s+\/g, '-')}`;\n\n                    pageSuggestionDiv.innerHTML = `\n                        <h4>Target Page: ${service} in ${location}<\/h4>\n                        <p><strong>Suggested URL Slug:<\/strong> <code>\/${slug}<\/code><\/p>\n                        <p><strong>Title Example 1:<\/strong> ${titleExample1}<\/p>\n                        <p><strong>Title Example 2:<\/strong> ${titleExample2}<\/p>\n                        <p><strong>Meta Description Example 1:<\/strong> ${metaExample1}<\/p>\n                        <p><strong>Meta Description Example 2:<\/strong> ${metaExample2}<\/p>\n                    `;\n                    pagesList.appendChild(pageSuggestionDiv);\n                });\n\n                locationClusterDiv.appendChild(pagesList);\n                resultsArea.appendChild(locationClusterDiv);\n                colorIndex++;\n            });\n\n            summaryArea.innerHTML = `\n                <p><strong>Total SEO Pages Suggested: ${totalPages}<\/strong><\/p>\n                <p>Found <strong>${locations.length} location clusters<\/strong> and <strong>${services.length} core services<\/strong>.<\/p>\n                <p><em>Remember to replace <span class=\"brand-placeholder\">[Your Brand Name]<\/span> with your actual brand name and customize content to be unique and valuable.<\/em><\/p>\n            `;\n        }\n\n        \/\/ Helper function to lighten a hex color for background\n        function lightenColor(hex, percent) {\n            hex = hex.replace(\/^#\/, '');\n            const r = parseInt(hex.substring(0, 2), 16);\n            const g = parseInt(hex.substring(2, 4), 16);\n            const b = parseInt(hex.substring(4, 6), 16);\n\n            const newR = Math.min(255, r + (255 - r) * percent);\n            const newG = Math.min(255, g + (255 - g) * percent);\n            const newB = Math.min(255, b + (255 - b) * percent);\n\n            return `rgb(${Math.round(newR)}, ${Math.round(newG)}, ${Math.round(newB)})`;\n        }\n\n    <\/script>\n\n<\/body>\n<\/html>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Local SEO Page Maker<\/title>\n    <!-- jsPDF library for PDF generation -->\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n    <!-- html2canvas library for capturing HTML content for PDF -->\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"><\/script>\n\n    <style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            margin: 20px;\n            background-color: #f4f7f6;\n            color: #333;\n        }\n        .container {\n            display: flex;\n            gap: 20px;\n            margin-bottom: 20px;\n        }\n        .input-area {\n            flex: 1;\n            background-color: #fff;\n            padding: 15px;\n            border-radius: 8px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        textarea {\n            width: 95%;\n            min-height: 150px;\n            padding: 10px;\n            border: 1px solid #ccc;\n            border-radius: 4px;\n            font-size: 14px;\n            margin-top: 5px;\n        }\n        label {\n            font-weight: bold;\n            display: block;\n            margin-bottom: 5px;\n        }\n        button, .action-button { \/* Updated for download buttons *\/\n            display: inline-block; \/* Changed for side-by-side buttons *\/\n            margin: 20px 10px 20px 0; \/* Adjusted margin *\/\n            padding: 12px 25px;\n            background-color: #007bff;\n            color: white;\n            border: none;\n            border-radius: 5px;\n            font-size: 16px;\n            cursor: pointer;\n            transition: background-color 0.3s ease;\n            text-decoration: none; \/* For anchor tag style *\/\n        }\n        button:hover, .action-button:hover {\n            background-color: #0056b3;\n        }\n        #results-area {\n            margin-top: 20px;\n        }\n        .location-cluster {\n            margin-bottom: 20px;\n            padding: 15px;\n            border-radius: 8px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n            border-left: 5px solid; \/* Color will be set by JS *\/\n        }\n        .location-cluster h3 {\n            margin-top: 0;\n            border-bottom: 1px solid #eee;\n            padding-bottom: 10px;\n        }\n        .page-suggestion {\n            background-color: #f9f9f9;\n            padding: 10px;\n            margin-bottom: 10px;\n            border-radius: 4px;\n            border: 1px solid #e0e0e0;\n        }\n        .page-suggestion p {\n            margin: 5px 0;\n            font-size: 0.9em;\n        }\n        .page-suggestion strong {\n            font-size: 1em;\n            color: #2c3e50;\n        }\n        #summary {\n            background-color: #e9ecef;\n            padding: 15px;\n            border-radius: 8px;\n            margin-bottom: 20px;\n            text-align: center;\n            font-size: 1.1em;\n        }\n        .brand-placeholder {\n            font-style: italic;\n            color: #7f8c8d;\n        }\n        #actions-container { \/* New container for CTA and download buttons *\/\n            margin-top: 30px;\n            text-align: center;\n            padding-top: 20px;\n            border-top: 1px solid #ddd;\n        }\n        .cta-link { \/* Styling for the \"Get Expert Assistance\" link *\/\n            display: inline-block;\n            padding: 12px 25px;\n            background-color: #28a745;\n            color: white;\n            text-decoration: none;\n            border-radius: 5px;\n            font-size: 16px;\n            font-weight: bold;\n            margin-right: 10px;\n            transition: background-color 0.3s ease;\n        }\n        .cta-link:hover {\n            background-color: #218838;\n        }\n        .download-buttons button { \/* Specific styling for download buttons if needed *\/\n            background-color: #6c757d;\n        }\n        .download-buttons button:hover {\n            background-color: #5a6268;\n        }\n    <\/style>\n<\/head>\n<body>\n\n    <h1>Local SEO Service Page Generator<\/h1>\n    <p>Enter your services and target locations to get suggestions for SEO-optimized service pages.<\/p>\n\n    <div class=\"container\">\n        <div class=\"input-area\">\n            <label for=\"services\">Services (one per line):<\/label>\n            <textarea id=\"services\" placeholder=\"e.g.,\nRoof Repair\nGutter Cleaning\nSiding Installation\"><\/textarea>\n        <\/div>\n        <div class=\"input-area\">\n            <label for=\"locations\">Locations (one per line):<\/label>\n            <textarea id=\"locations\" placeholder=\"e.g.,\nSpringfield\nShelbyville\nOgdenville\"><\/textarea>\n        <\/div>\n    <\/div>\n\n    <div style=\"text-align: center;\"> <!-- Centering the generate button -->\n        <button onclick=\"generatePages()\">Generate Page Suggestions<\/button>\n    <\/div>\n\n    <div id=\"summary\"><\/div>\n    <div id=\"results-container-for-pdf\"> <!-- Added a wrapper for PDF content -->\n        <div id=\"results-area\"><\/div>\n    <\/div>\n    <div id=\"actions-container\" style=\"display: none;\"> <!-- Hidden initially -->\n        <a href=\"https:\/\/libiweb.com\/contact\/\" target=\"_blank\" class=\"cta-link\">Get Expert Assistance<\/a>\n        <div class=\"download-buttons\" style=\"display: inline-block; margin-top: 10px;\">\n            <button onclick=\"downloadPDF()\" class=\"action-button\">Download as PDF<\/button>\n            <button onclick=\"downloadCSV()\" class=\"action-button\">Download as CSV<\/button>\n            <!-- Download as DOCX is more complex and typically requires server-side or more extensive libraries -->\n            <!-- <button onclick=\"downloadDOCX()\" class=\"action-button\">Download as DOCX<\/button> -->\n        <\/div>\n    <\/div>\n\n    <script>\n        const { jsPDF } = window.jspdf; \/\/ Destructure jsPDF from window\n\n        \/\/ Predefined list of colors for locations\n        const locationColors = [\n            '#3498db', '#e74c3c', '#2ecc71', '#f1c40f', '#9b59b6',\n            '#1abc9c', '#e67e22', '#34495e', '#d35400', '#c0392b'\n        ];\n\n        let currentServices = [];\n        let currentLocations = [];\n\n        function generatePages() {\n            const servicesInput = document.getElementById('services').value.trim();\n            const locationsInput = document.getElementById('locations').value.trim();\n            const resultsArea = document.getElementById('results-area');\n            const summaryArea = document.getElementById('summary');\n            const actionsContainer = document.getElementById('actions-container');\n\n            resultsArea.innerHTML = ''; \/\/ Clear previous results\n            summaryArea.innerHTML = ''; \/\/ Clear previous summary\n            actionsContainer.style.display = 'none'; \/\/ Hide actions initially\n\n            if (!servicesInput || !locationsInput) {\n                summaryArea.innerHTML = '<p style=\"color: red;\">Please enter at least one service and one location.<\/p>';\n                return;\n            }\n\n            currentServices = servicesInput.split('\\n').map(s => s.trim()).filter(s => s);\n            currentLocations = locationsInput.split('\\n').map(l => l.trim()).filter(l => l);\n\n            if (currentServices.length === 0 || currentLocations.length === 0) {\n                summaryArea.innerHTML = '<p style=\"color: red;\">Please ensure services and locations are entered correctly (one per line).<\/p>';\n                return;\n            }\n\n            let totalPages = 0;\n            let colorIndex = 0;\n\n            currentLocations.forEach(location => {\n                const locationClusterDiv = document.createElement('div');\n                locationClusterDiv.className = 'location-cluster';\n                const currentColor = locationColors[colorIndex % locationColors.length];\n                locationClusterDiv.style.borderColor = currentColor;\n                locationClusterDiv.style.backgroundColor = lightenColor(currentColor, 0.9);\n\n                const locationHeader = document.createElement('h3');\n                locationHeader.textContent = `Location Cluster: ${location}`;\n                locationHeader.style.color = currentColor;\n                locationClusterDiv.appendChild(locationHeader);\n\n                const pagesList = document.createElement('ul');\n                pagesList.style.listStyleType = 'none';\n                pagesList.style.paddingLeft = '0';\n\n                currentServices.forEach(service => {\n                    totalPages++;\n                    const pageSuggestionDiv = document.createElement('div');\n                    pageSuggestionDiv.className = 'page-suggestion';\n\n                    const slug = `${service.toLowerCase().replace(\/\\s+\/g, '-')}-in-${location.toLowerCase().replace(\/\\s+\/g, '-')}`;\n\n                    \/\/ --- Combined Title & Meta Examples ---\n                    const titleMetaPairs = [\n                        {\n                            title: `Best ${service} in ${location} | <span class=\"brand-placeholder\">[Your Brand Name]<\/span>`,\n                            meta: `Looking for reliable ${service.toLowerCase()} in ${location}? <span class=\"brand-placeholder\">[Your Brand Name]<\/span> offers top-quality solutions tailored to your needs. Contact us today for a free consultation!`\n                        },\n                        {\n                            title: `Expert ${service} Services in ${location} | <span class=\"brand-placeholder\">[Your Brand Name]<\/span>`,\n                            meta: `Get professional ${service.toLowerCase()} services in ${location}. <span class=\"brand-placeholder\">[Your Brand Name]<\/span> delivers expert results and outstanding customer care. Free quote available.`\n                        },\n                        {\n                            title: `${service} ${location} - Affordable & Professional | <span class=\"brand-placeholder\">[Your Brand Name]<\/span>`,\n                            meta: `Need ${service.toLowerCase()} in ${location}? <span class=\"brand-placeholder\">[Your Brand Name]<\/span> provides affordable and professional services. Call now for a quick estimate!`\n                        }\n                    ];\n\n                    let contentHTML = `<h4>Target Page: ${service} in ${location}<\/h4>\n                                       <p><strong>Suggested URL Slug:<\/strong> <code>\/${slug}<\/code><\/p>`;\n\n                    titleMetaPairs.forEach((pair, index) => {\n                        contentHTML += `<p><strong>Title Suggestion ${index + 1}:<\/strong> ${pair.title}<\/p>\n                                        <p><strong>Meta Description Suggestion ${index + 1}:<\/strong> ${pair.meta}<\/p>`;\n                    });\n\n                    pageSuggestionDiv.innerHTML = contentHTML;\n                    pagesList.appendChild(pageSuggestionDiv);\n                });\n\n                locationClusterDiv.appendChild(pagesList);\n                resultsArea.appendChild(locationClusterDiv);\n                colorIndex++;\n            });\n\n            summaryArea.innerHTML = `\n                <p><strong>Total SEO Pages Suggested: ${totalPages}<\/strong><\/p>\n                <p>Found <strong>${currentLocations.length} location clusters<\/strong> and <strong>${currentServices.length} core services<\/strong>.<\/p>\n                <p><em>Remember to replace <span class=\"brand-placeholder\">[Your Brand Name]<\/span> with your actual brand name and customize content to be unique and valuable.<\/em><\/p>\n            `;\n\n            if (totalPages > 0) {\n                actionsContainer.style.display = 'block'; \/\/ Show actions if results are generated\n            }\n        }\n\n        function lightenColor(hex, percent) {\n            hex = hex.replace(\/^#\/, '');\n            const r = parseInt(hex.substring(0, 2), 16);\n            const g = parseInt(hex.substring(2, 4), 16);\n            const b = parseInt(hex.substring(4, 6), 16);\n            const newR = Math.min(255, r + (255 - r) * percent);\n            const newG = Math.min(255, g + (255 - g) * percent);\n            const newB = Math.min(255, b + (255 - b) * percent);\n            return `rgb(${Math.round(newR)}, ${Math.round(newG)}, ${Math.round(newB)})`;\n        }\n\n        async function downloadPDF() {\n            const { jsPDF } = window.jspdf;\n            const pdf = new jsPDF('p', 'pt', 'a4');\n            const resultsContainer = document.getElementById('results-container-for-pdf'); \/\/ Target the wrapper\n\n            \/\/ Temporarily make all content visible for capture if it's complex and paginated\n            \/\/ For this simple layout, it might not be strictly necessary but good practice for complex content\n            const originalDisplayStyle = resultsContainer.style.display;\n            resultsContainer.style.display = 'block'; \/\/ Ensure it's block for html2canvas\n\n            const canvas = await html2canvas(resultsContainer, {\n                scale: 2, \/\/ Increase scale for better quality\n                useCORS: true \/\/ If you ever add external images\n            });\n\n            resultsContainer.style.display = originalDisplayStyle; \/\/ Restore original display\n\n            const imgData = canvas.toDataURL('image\/png');\n            const imgProps = pdf.getImageProperties(imgData);\n            const pdfWidth = pdf.internal.pageSize.getWidth();\n            const pdfHeight = (imgProps.height * pdfWidth) \/ imgProps.width;\n\n            let heightLeft = pdfHeight;\n            let position = 0;\n            const pageHeight = pdf.internal.pageSize.getHeight() - 40; \/\/ A4 height in points, with margin\n\n            pdf.addImage(imgData, 'PNG', 20, position + 20, pdfWidth - 40, pdfHeight);\n            heightLeft -= pageHeight;\n\n            while (heightLeft >= 0) {\n                position = heightLeft - pdfHeight;\n                pdf.addPage();\n                pdf.addImage(imgData, 'PNG', 20, position + 20, pdfWidth - 40, pdfHeight);\n                heightLeft -= pageHeight;\n            }\n            pdf.save('local-seo-page-suggestions.pdf');\n        }\n\n\n        function downloadCSV() {\n            let csvContent = \"Location,Service,Suggested URL Slug,Title Suggestion 1,Meta Suggestion 1,Title Suggestion 2,Meta Suggestion 2,Title Suggestion 3,Meta Suggestion 3\\n\"; \/\/ CSV Header\n\n            currentLocations.forEach(location => {\n                currentServices.forEach(service => {\n                    const slug = `\/${service.toLowerCase().replace(\/\\s+\/g, '-')}-in-${location.toLowerCase().replace(\/\\s+\/g, '-')}`;\n\n                    \/\/ Recreate titleMetaPairs for CSV export to ensure consistency\n                    const titleMetaPairs = [\n                        {\n                            title: `Best ${service} in ${location} | [Your Brand Name]`,\n                            meta: `Looking for reliable ${service.toLowerCase()} in ${location}? [Your Brand Name] offers top-quality solutions tailored to your needs. Contact us today for a free consultation!`\n                        },\n                        {\n                            title: `Expert ${service} Services in ${location} | [Your Brand Name]`,\n                            meta: `Get professional ${service.toLowerCase()} services in ${location}. [Your Brand Name] delivers expert results and outstanding customer care. Free quote available.`\n                        },\n                        {\n                            title: `${service} ${location} - Affordable & Professional | [Your Brand Name]`,\n                            meta: `Need ${service.toLowerCase()} in ${location}? [Your Brand Name] provides affordable and professional services. Call now for a quick estimate!`\n                        }\n                    ];\n\n                    \/\/ Function to escape commas and quotes for CSV\n                    const escapeCSV = (text) => {\n                        if (text === undefined || text === null) return '';\n                        text = text.toString().replace(\/<span class=\"brand-placeholder\">\\[Your Brand Name\\]<\\\/span>\/g, '[Your Brand Name]'); \/\/ Remove span for CSV\n                        text = text.replace(\/\"\/g, '\"\"'); \/\/ Escape double quotes\n                        if (text.includes(',') || text.includes('\\n') || text.includes('\"')) {\n                            text = `\"${text}\"`; \/\/ Enclose in double quotes if it contains comma, newline, or quote\n                        }\n                        return text;\n                    };\n\n                    let row = [\n                        escapeCSV(location),\n                        escapeCSV(service),\n                        escapeCSV(slug)\n                    ];\n\n                    titleMetaPairs.forEach(pair => {\n                        row.push(escapeCSV(pair.title));\n                        row.push(escapeCSV(pair.meta));\n                    });\n                    csvContent += row.join(\",\") + \"\\n\";\n                });\n            });\n\n            const blob = new Blob([csvContent], { type: 'text\/csv;charset=utf-8;' });\n            const link = document.createElement(\"a\");\n            if (link.download !== undefined) { \/\/ Feature detection\n                const url = URL.createObjectURL(blob);\n                link.setAttribute(\"href\", url);\n                link.setAttribute(\"download\", \"local-seo-page-suggestions.csv\");\n                link.style.visibility = 'hidden';\n                document.body.appendChild(link);\n                link.click();\n                document.body.removeChild(link);\n            }\n        }\n\n        \/\/ Note: Direct client-side DOCX generation is complex.\n        \/\/ It typically requires libraries like 'docx' (npm package, often used with Node.js or bundlers)\n        \/\/ or server-side processing. For a simple HTML\/JS setup, CSV and PDF are more straightforward.\n        \/\/ function downloadDOCX() {\n        \/\/     alert(\"DOCX download is a more complex feature and typically requires server-side processing or larger client-side libraries not included in this basic example.\");\n        \/\/ }\n\n    <\/script>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Local SEO Page Maker Local SEO Service Page Generator Enter your services and target locations to get suggestions for SEO-optimized service pages. Services (one per line): Locations (one per line): Generate Page Suggestions Local SEO Page Maker Local SEO Service Page Generator Enter your services and target locations to get suggestions for SEO-optimized service pages. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[43],"tags":[],"class_list":["post-6854","post","type-post","status-publish","format-standard","hentry","category-insights"],"blocksy_meta":[],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/posts\/6854","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/comments?post=6854"}],"version-history":[{"count":1,"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/posts\/6854\/revisions"}],"predecessor-version":[{"id":6859,"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/posts\/6854\/revisions\/6859"}],"wp:attachment":[{"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/media?parent=6854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/categories?post=6854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/libiweb.com\/cs\/wp-json\/wp\/v2\/tags?post=6854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}