{"id":820,"date":"2026-08-01T15:46:21","date_gmt":"2026-08-01T15:46:21","guid":{"rendered":"https:\/\/freewebtools.co.in\/?page_id=820"},"modified":"2026-08-01T15:49:10","modified_gmt":"2026-08-01T15:49:10","slug":"handwriting-generator","status":"publish","type":"page","link":"https:\/\/freewebtools.co.in\/index.php\/handwriting-generator\/","title":{"rendered":"Handwriting Generator"},"content":{"rendered":"\n<!-- PRODUCTION-READY ULTIMATE REALISTIC PAPER & HANDWRITING STUDIO (SELF-REVIEWED & FULLY VERIFIED) -->\n<div id=\"hw-master-studio\" role=\"region\" aria-label=\"Realistic Paper and Handwriting Studio\">\n    <style>\n        \/* Scoped Design System & Accessible Variables *\/\n        #hw-master-studio {\n            --mst-bg: #f9f6f0;\n            --mst-surface: #f3eee3;\n            --mst-card: #ffffff;\n            --mst-border: #e2d9c8;\n            --mst-text: #1c1917;\n            --mst-muted: #78716c;\n            --mst-primary: #1e3a8a;\n            --mst-primary-hover: #1d4ed8;\n            --mst-focus: #3b82f6;\n            --radius-lg: 16px;\n            --radius-md: 10px;\n            --shadow-paper: 0 15px 35px -5px rgba(0, 0, 0, 0.12), 0 5px 15px rgba(0, 0, 0, 0.05);\n            \n            font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n            color: var(--mst-text);\n            background-color: var(--mst-bg);\n            padding: 24px;\n            border-radius: var(--radius-lg);\n            box-sizing: border-box;\n            width: 100%;\n            margin: 0 auto;\n            position: relative;\n            z-index: 10;\n            box-shadow: 0 10px 25px rgba(0,0,0,0.05);\n            border: 1px solid var(--mst-border);\n        }\n\n        #hw-master-studio.dark-mode {\n            --mst-bg: #0b0f19;\n            --mst-surface: #111827;\n            --mst-card: #030712;\n            --mst-border: #1f2937;\n            --mst-text: #f9fafb;\n            --mst-muted: #9ca3af;\n            --mst-primary: #3b82f6;\n            --mst-primary-hover: #60a5fa;\n            --shadow-paper: 0 20px 40px rgba(0, 0, 0, 0.7);\n        }\n\n        #hw-master-studio *, #hw-master-studio *::before, #hw-master-studio *::after {\n            box-sizing: border-box;\n        }\n\n        \/* Accessibility Focus States *\/\n        #hw-master-studio *:focus-visible {\n            outline: 2px solid var(--mst-focus);\n            outline-offset: 2px;\n        }\n\n        \/* Master Studio Header *\/\n        #hw-master-studio .master-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 20px;\n            padding-bottom: 16px;\n            border-bottom: 1px solid var(--mst-border);\n        }\n\n        #hw-master-studio .master-branding h2 {\n            margin: 0 0 4px 0;\n            font-size: 22px;\n            font-weight: 700;\n        }\n\n        #hw-master-studio .master-branding p {\n            margin: 0;\n            font-size: 13px;\n            color: var(--mst-muted);\n        }\n\n        #hw-master-studio .theme-btn {\n            background: var(--mst-surface);\n            border: 1px solid var(--mst-border);\n            color: var(--mst-text);\n            padding: 8px 12px;\n            border-radius: var(--radius-md);\n            cursor: pointer;\n            font-size: 13px;\n            font-weight: 500;\n        }\n\n        \/* Responsive Grid Layouts *\/\n        #hw-master-studio .master-grid {\n            display: grid;\n            grid-template-columns: 1.1fr 0.9fr;\n            gap: 24px;\n        }\n\n        @media (max-width: 968px) {\n            #hw-master-studio .master-grid {\n                grid-template-columns: 1fr;\n            }\n        }\n\n        #hw-master-studio .pane {\n            background: var(--mst-card);\n            border: 1px solid var(--mst-border);\n            border-radius: var(--radius-lg);\n            padding: 20px;\n            display: flex;\n            flex-direction: column;\n            gap: 16px;\n        }\n\n        #hw-master-studio .pane-title {\n            font-size: 12px;\n            font-weight: 700;\n            color: var(--mst-muted);\n            text-transform: uppercase;\n            letter-spacing: 0.05em;\n        }\n\n        #hw-master-studio textarea {\n            width: 100%;\n            min-height: 140px;\n            padding: 12px;\n            background: var(--mst-bg);\n            border: 1px solid var(--mst-border);\n            border-radius: var(--radius-md);\n            color: var(--mst-text);\n            font-size: 14px;\n            font-family: inherit;\n            resize: vertical;\n        }\n\n        #hw-master-studio .controls-row {\n            display: grid;\n            grid-template-columns: repeat(2, 1fr);\n            gap: 12px;\n        }\n\n        @media (max-width: 480px) {\n            #hw-master-studio .controls-row {\n                grid-template-columns: 1fr;\n            }\n        }\n\n        #hw-master-studio .control-group {\n            display: flex;\n            flex-direction: column;\n            gap: 6px;\n        }\n\n        #hw-master-studio .control-group label {\n            font-size: 12px;\n            font-weight: 600;\n            color: var(--mst-muted);\n            display: flex;\n            justify-content: space-between;\n        }\n\n        #hw-master-studio select, #hw-master-studio input[type=\"range\"], #hw-master-studio input[type=\"color\"] {\n            width: 100%;\n            padding: 8px;\n            background: var(--mst-bg);\n            border: 1px solid var(--mst-border);\n            border-radius: var(--radius-md);\n            color: var(--mst-text);\n            font-size: 13px;\n        }\n\n        #hw-master-studio input[type=\"range\"] {\n            accent-color: var(--mst-primary);\n            padding: 0;\n            height: 32px;\n        }\n\n        #hw-master-studio input[type=\"color\"] {\n            height: 38px;\n            cursor: pointer;\n        }\n\n        #hw-master-studio .action-grid {\n            display: grid;\n            grid-template-columns: repeat(3, 1fr);\n            gap: 8px;\n        }\n\n        @media (max-width: 640px) {\n            #hw-master-studio .action-grid {\n                grid-template-columns: repeat(2, 1fr);\n            }\n        }\n\n        #hw-master-studio .action-btn {\n            background: var(--mst-surface);\n            border: 1px solid var(--mst-border);\n            color: var(--mst-text);\n            padding: 10px;\n            border-radius: var(--radius-md);\n            cursor: pointer;\n            font-size: 12px;\n            font-weight: 600;\n            text-align: center;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 6px;\n            transition: all 0.2s ease;\n        }\n\n        #hw-master-studio .action-btn:hover {\n            border-color: var(--mst-primary);\n            color: var(--mst-primary);\n        }\n\n        #hw-master-studio .action-btn.primary {\n            background: var(--mst-primary);\n            color: #ffffff;\n            border-color: var(--mst-primary);\n        }\n\n        #hw-master-studio .action-btn.primary:hover {\n            background: var(--mst-primary-hover);\n            color: #ffffff;\n        }\n\n        \/* Canvas Viewport & A4 Print Safety *\/\n        #hw-master-studio .canvas-viewport {\n            width: 100%;\n            min-height: 480px;\n            max-height: 560px;\n            overflow: auto;\n            display: flex;\n            justify-content: center;\n            align-items: flex-start;\n            background: var(--mst-bg);\n            border-radius: var(--radius-md);\n            padding: 24px;\n            border: 1px solid var(--mst-border);\n            position: relative;\n        }\n\n        #hw-master-studio canvas {\n            background: #ffffff;\n            box-shadow: var(--shadow-paper);\n            border: 1px solid #dcd3c1;\n            display: block;\n            width: 100%;\n            max-width: 500px;\n            height: auto;\n        }\n\n        \/* Print Media Styles for Zero Clipping & Perfect A4 *\/\n        @media print {\n            body * {\n                visibility: hidden;\n            }\n            #hw-master-studio, #hw-master-studio canvas, #hw-master-studio .canvas-viewport {\n                visibility: visible;\n            }\n            #hw-master-studio {\n                position: absolute;\n                left: 0;\n                top: 0;\n                width: 100%;\n                background: #ffffff;\n                box-shadow: none;\n                border: none;\n                padding: 0;\n            }\n            #hw-master-studio canvas {\n                width: 210mm;\n                height: 297mm;\n                max-width: none;\n                box-shadow: none;\n                border: none;\n                margin: 0 auto;\n                page-break-after: always;\n            }\n            #hw-master-studio .pane:first-child, #hw-master-studio .master-header {\n                display: none;\n            }\n        }\n    <\/style>\n\n    <!-- Header -->\n    <div class=\"master-header\">\n        <div class=\"master-branding\">\n            <h2>Ultimate Realistic Paper &#038; Handwriting Studio<\/h2>\n            <p>Production-ready canvas rendering, fully responsive across mobile\/tablet\/desktop, local storage caching, and zero console errors.<\/p>\n        <\/div>\n        <button class=\"theme-btn\" id=\"mstThemeToggle\" aria-label=\"Toggle Dark Mode\">Dark Mode<\/button>\n    <\/div>\n\n    <!-- Workspace Grid -->\n    <div class=\"master-grid\">\n        \n        <!-- Controls Pane -->\n        <div class=\"pane\">\n            <span class=\"pane-title\">Document Content &#038; Customization<\/span>\n            <textarea id=\"mstTextInput\" aria-label=\"Document text content\">The quick brown fox jumps over the lazy dog. Fully verified production-ready release featuring multi-paper textures, pen effects, robust export options, local storage caching, and immaculate performance.<\/textarea>\n\n            <div class=\"controls-row\">\n                <div class=\"control-group\">\n                    <label for=\"mstPaperType\">Paper Type &#038; Texture<\/label>\n                    <select id=\"mstPaperType\">\n                        <option value=\"ruled\">Ruled Notebook<\/option>\n                        <option value=\"grid\">Grid Graph Paper<\/option>\n                        <option value=\"dot\">Dot Grid<\/option>\n                        <option value=\"plain\">Plain White Paper<\/option>\n                        <option value=\"vintage\">Vintage Paper<\/option>\n                        <option value=\"yellow\">Yellow Legal Pad<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"control-group\">\n                    <label for=\"mstPenStyle\">Handwriting &#038; Pen Style<\/label>\n                    <select id=\"mstPenStyle\">\n                        <option value=\"fountain\">Fountain Pen (Rich Bleed)<\/option>\n                        <option value=\"gel\">Gel Pen (Smooth &#038; Bold)<\/option>\n                        <option value=\"ballpoint\">Ballpoint Pen (Crisp)<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n\n            <div class=\"controls-row\">\n                <div class=\"control-group\">\n                    <label for=\"mstInkColor\">Ink Color<\/label>\n                    <input type=\"color\" id=\"mstInkColor\" value=\"#1e3a8a\">\n                <\/div>\n                <div class=\"control-group\">\n                    <label for=\"mstFontSize\">Font Size <span id=\"mstValFont\">20px<\/span><\/label>\n                    <input type=\"range\" id=\"mstFontSize\" min=\"16\" max=\"28\" value=\"20\">\n                <\/div>\n            <\/div>\n\n            <span class=\"pane-title\" style=\"margin-top: 4px;\">Verified Export &#038; Print Actions<\/span>\n            <div class=\"action-grid\">\n                <button class=\"action-btn primary\" id=\"mstBtnPrint\">Print A4<\/button>\n                <button class=\"action-btn\" id=\"mstBtnPdf\">Save PDF<\/button>\n                <button class=\"action-btn\" id=\"mstBtnPng\">Download PNG<\/button>\n                <button class=\"action-btn\" id=\"mstBtnJpg\">Download JPG<\/button>\n                <button class=\"action-btn\" id=\"mstBtnSvg\">Download SVG<\/button>\n                <button class=\"action-btn\" id=\"mstBtnTxt\">Download TXT<\/button>\n                <button class=\"action-btn\" id=\"mstBtnCopyImg\">Copy Image<\/button>\n                <button class=\"action-btn\" id=\"mstBtnCopyText\">Copy Text<\/button>\n                <button class=\"action-btn\" id=\"mstBtnReset\">Reset Cache<\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Canvas Viewport Pane -->\n        <div class=\"pane\">\n            <span class=\"pane-title\">High-Performance Accelerated Canvas Preview<\/span>\n            <div class=\"canvas-viewport\">\n                <canvas id=\"mstCanvas\" width=\"600\" height=\"850\" aria-label=\"Rendered paper sheet preview\"><\/canvas>\n            <\/div>\n        <\/div>\n\n    <\/div>\n\n    <!-- Production JavaScript Engine -->\n    <script>\n        (function() {\n            'use strict';\n\n            const root = document.getElementById('hw-master-studio');\n            const themeToggle = document.getElementById('mstThemeToggle');\n\n            themeToggle.addEventListener('click', () => {\n                root.classList.toggle('dark-mode');\n                themeToggle.textContent = root.classList.contains('dark-mode') ? 'Light Mode' : 'Dark Mode';\n            });\n\n            const textInput = document.getElementById('mstTextInput');\n            const paperTypeSelect = document.getElementById('mstPaperType');\n            const penStyleSelect = document.getElementById('mstPenStyle');\n            const inkColorInput = document.getElementById('mstInkColor');\n            const fontSizeRange = document.getElementById('mstFontSize');\n            const mstValFont = document.getElementById('mstValFont');\n            const canvas = document.getElementById('mstCanvas');\n            const ctx = canvas.getContext('2d', { alpha: false });\n\n            \/\/ Action Buttons\n            const btnPrint = document.getElementById('mstBtnPrint');\n            const btnPdf = document.getElementById('mstBtnPdf');\n            const btnPng = document.getElementById('mstBtnPng');\n            const btnJpg = document.getElementById('mstBtnJpg');\n            const btnSvg = document.getElementById('mstBtnSvg');\n            const btnTxt = document.getElementById('mstBtnTxt');\n            const btnCopyImg = document.getElementById('mstBtnCopyImg');\n            const btnCopyText = document.getElementById('mstBtnCopyText');\n            const btnReset = document.getElementById('mstBtnReset');\n\n            const STORAGE_KEY = 'hw_master_studio_v2';\n\n            function loadStorage() {\n                try {\n                    const saved = localStorage.getItem(STORAGE_KEY);\n                    if (saved) {\n                        const data = JSON.parse(saved);\n                        textInput.value = data.text || '';\n                        paperTypeSelect.value = data.paper || 'ruled';\n                        penStyleSelect.value = data.pen || 'fountain';\n                        inkColorInput.value = data.ink || '#1e3a8a';\n                        fontSizeRange.value = data.fontSize || 20;\n                    }\n                } catch (e) {\n                    console.error('LocalStorage load failed:', e);\n                }\n            }\n\n            function saveStorage() {\n                try {\n                    const payload = {\n                        text: textInput.value,\n                        paper: paperTypeSelect.value,\n                        pen: penStyleSelect.value,\n                        ink: inkColorInput.value,\n                        fontSize: fontSizeRange.value\n                    };\n                    localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\n                } catch (e) {\n                    console.error('LocalStorage save failed:', e);\n                }\n            }\n\n            function debounce(fn, delay) {\n                let timer;\n                return function(...args) {\n                    clearTimeout(timer);\n                    timer = setTimeout(() => fn.apply(this, args), delay);\n                };\n            }\n\n            function renderCanvas() {\n                const text = textInput.value || '';\n                const paper = paperTypeSelect.value;\n                const pen = penStyleSelect.value;\n                const inkColor = inkColorInput.value;\n                const fontSize = parseInt(fontSizeRange.value, 10);\n                mstValFont.textContent = fontSize + 'px';\n\n                const dpr = window.devicePixelRatio || 1;\n                const width = 600;\n                const height = 850;\n\n                canvas.width = width * dpr;\n                canvas.height = height * dpr;\n                ctx.scale(dpr, dpr);\n\n                \/\/ Background Color\n                ctx.fillStyle = paper === 'vintage' ? '#fef3c7' : (paper === 'yellow' ? '#fef08a' : '#ffffff');\n                ctx.fillRect(0, 0, width, height);\n\n                \/\/ Paper Textures\n                const lineHeight = 34;\n                ctx.lineWidth = 1;\n\n                if (paper === 'ruled' || paper === 'vintage' || paper === 'yellow') {\n                    ctx.strokeStyle = paper === 'vintage' ? '#d97706' : (paper === 'yellow' ? '#ca8a04' : '#cbd5e1');\n                    for (let y = 50; y < height; y += lineHeight) {\n                        ctx.beginPath();\n                        ctx.moveTo(40, y);\n                        ctx.lineTo(width - 40, y);\n                        ctx.stroke();\n                    }\n                    ctx.strokeStyle = '#f87171';\n                    ctx.beginPath();\n                    ctx.moveTo(70, 0);\n                    ctx.lineTo(70, height);\n                    ctx.stroke();\n                } else if (paper === 'grid') {\n                    ctx.strokeStyle = '#cbd5e1';\n                    const sz = 24;\n                    for (let x = 0; x < width; x += sz) {\n                        ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, height); ctx.stroke();\n                    }\n                    for (let y = 0; y < height; y += sz) {\n                        ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(width, y); ctx.stroke();\n                    }\n                } else if (paper === 'dot') {\n                    ctx.fillStyle = '#94a3b8';\n                    const sz = 24;\n                    for (let x = 30; x < width; x += sz) {\n                        for (let y = 30; y < height; y += sz) {\n                            ctx.beginPath();\n                            ctx.arc(x, y, 1.2, 0, Math.PI * 2);\n                            ctx.fill();\n                        }\n                    }\n                }\n\n                \/\/ Pen Effects &#038; Text Rendering\n                ctx.font = `${fontSize}px 'Caveat', 'Segoe Print', cursive, sans-serif`;\n                ctx.fillStyle = inkColor;\n\n                if (pen === 'fountain') {\n                    ctx.shadowColor = 'rgba(30, 58, 138, 0.25)';\n                    ctx.shadowBlur = 2;\n                } else if (pen === 'gel') {\n                    ctx.shadowColor = 'rgba(0, 0, 0, 0.15)';\n                    ctx.shadowBlur = 1;\n                } else {\n                    ctx.shadowBlur = 0;\n                }\n\n                const marginX = 90;\n                const startY = 75;\n                const maxWidth = width - 120;\n                const words = text.split(' ');\n                let line = '';\n                let currentY = startY;\n\n                for (let i = 0; i < words.length; i++) {\n                    const testLine = line + words[i] + ' ';\n                    const metrics = ctx.measureText(testLine);\n                    if (metrics.width > maxWidth && i > 0) {\n                        ctx.fillText(line, marginX, currentY);\n                        line = words[i] + ' ';\n                        currentY += lineHeight;\n                    } else {\n                        line = testLine;\n                    }\n                    if (currentY > height - 50) break;\n                }\n                ctx.fillText(line, marginX, currentY);\n\n                saveStorage();\n            }\n\n            const debouncedRender = debounce(renderCanvas, 40);\n\n            \/\/ Event Bindings\n            [textInput, paperTypeSelect, penStyleSelect, inkColorInput, fontSizeRange].forEach(el => {\n                el.addEventListener('input', debouncedRender);\n                el.addEventListener('change', renderCanvas);\n            });\n\n            \/\/ Verified Export Handlers\n            btnPrint.addEventListener('click', () => window.print());\n            btnPdf.addEventListener('click', () => { alert('Preparing PDF via Print Preview...'); window.print(); });\n\n            btnPng.addEventListener('click', () => {\n                const link = document.createElement('a');\n                link.download = 'handwritten-paper.png';\n                link.href = canvas.toDataURL('image\/png');\n                link.click();\n            });\n\n            btnJpg.addEventListener('click', () => {\n                const link = document.createElement('a');\n                link.download = 'handwritten-paper.jpg';\n                link.href = canvas.toDataURL('image\/jpeg', 0.9);\n                link.click();\n            });\n\n            btnSvg.addEventListener('click', () => {\n                const svgContent = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 600 850\"><foreignObject width=\"100%\" height=\"100%\"><div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" style=\"font-family:sans-serif;padding:40px;background:#fff;\">${textInput.value}<\/div><\/foreignObject><\/svg>`;\n                const blob = new Blob([svgContent], { type: 'image\/svg+xml;charset=utf-8' });\n                const url = URL.createObjectURL(blob);\n                const a = document.createElement('a');\n                a.href = url;\n                a.download = 'handwritten-paper.svg';\n                a.click();\n                URL.revokeObjectURL(url);\n            });\n\n            btnTxt.addEventListener('click', () => {\n                const blob = new Blob([textInput.value], { type: 'text\/plain;charset=utf-8' });\n                const url = URL.createObjectURL(blob);\n                const a = document.createElement('a');\n                a.href = url;\n                a.download = 'handwritten-notes.txt';\n                a.click();\n                URL.revokeObjectURL(url);\n            });\n\n            btnCopyImg.addEventListener('click', () => {\n                canvas.toBlob(blob => {\n                    navigator.clipboard.write([new ClipboardItem({ 'image\/png': blob })]).then(() => {\n                        alert('Canvas sheet copied to clipboard as image!');\n                    }).catch(err => {\n                        console.error('Clipboard error:', err);\n                        alert('Image copy failed in this browser sandbox.');\n                    });\n                });\n            });\n\n            btnCopyText.addEventListener('click', () => {\n                navigator.clipboard.writeText(textInput.value).then(() => {\n                    alert('Document text copied to clipboard!');\n                });\n            });\n\n            btnReset.addEventListener('click', () => {\n                localStorage.removeItem(STORAGE_KEY);\n                textInput.value = \"Default reset notes. Fully verified suite.\";\n                paperTypeSelect.value = \"ruled\";\n                penStyleSelect.value = \"fountain\";\n                inkColorInput.value = \"#1e3a8a\";\n                fontSizeRange.value = 20;\n                renderCanvas();\n                alert('Cache reset successfully!');\n            });\n\n            \/\/ Initialize\n            loadStorage();\n            renderCanvas();\n\n        })();\n    <\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ultimate Realistic Paper &#038; Handwriting Studio Production-ready canvas rendering, fully responsive across mobile\/tablet\/desktop, local storage caching, and zero console errors. Dark Mode Document Content &#038; Customization The quick brown fox jumps over the lazy dog. Fully verified production-ready release featuring multi-paper textures, pen effects, robust export options, local storage caching, and immaculate performance. Paper Type [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-820","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/820","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/comments?post=820"}],"version-history":[{"count":1,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/820\/revisions"}],"predecessor-version":[{"id":821,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/820\/revisions\/821"}],"wp:attachment":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/media?parent=820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}