{"id":825,"date":"2026-04-04T09:29:12","date_gmt":"2026-04-04T09:29:12","guid":{"rendered":"https:\/\/primetoolhub.com\/?page_id=825"},"modified":"2026-08-08T06:24:29","modified_gmt":"2026-08-08T06:24:29","slug":"markdown-to-pdf-converter","status":"publish","type":"page","link":"https:\/\/schoolict.net\/tools\/markdown-to-pdf-converter\/","title":{"rendered":"Markdown to PDF Converter"},"content":{"rendered":"\n<div class=\"pth-hero-section\">\n    <div class=\"pth-hero-content\">\n        <h2>Markdown to PDF Converter<\/h2>\n        <p>Convert Markdown to PDF instantly with our free offline converter. Write in Markdown, preview the live A4 page, and download a styled PDF securely.<\/p>\n\n        <div id=\"pth-toc-placeholder\"><\/div>\n    <\/div>\n\n    <div class=\"pth-hero-image\">\n        <img decoding=\"async\" data-no-lazy=\"1\" width=\"450\" height=\"253\" src=\"https:\/\/schoolict.net\/tools\/wp-content\/uploads\/2026\/05\/Markdown-to-PDF-Converter-1024x572.jpeg\" alt=\"markdown to pdf converter\">\n    <\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Table of Contents<\/h2><nav><ul><li><a href=\"#\ud83d\udfe5-textual-compilation-with-a-markdown-to-pdf-converter\">\ud83d\udfe5 Textual Compilation with a Markdown to PDF Converter<\/a><\/li><li><a href=\"#\ud83d\udfe7-abstract-syntax-trees-and-dom-painting\">\ud83d\udfe7 Abstract Syntax Trees and DOM Painting<\/a><\/li><li><a href=\"#\ud83d\udfe8-buffer-serialization-and-cryptographic-privacy\">\ud83d\udfe8 Buffer Serialization and Cryptographic Privacy<\/a><\/li><li><a href=\"#\ud83d\udfe9-typographic-standards-and-extensibility\">\ud83d\udfe9 Typographic Standards and Extensibility<\/a><\/li><\/ul><\/nav><\/div>\n\n\n<!-- External Libraries (Strictly CDN, No CSS Frameworks) -->\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.1\/css\/all.min.css\">\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.2\/codemirror.min.css\">\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.2\/theme\/monokai.min.css\">\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/highlight.js\/11.9.0\/styles\/github.min.css\">\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.2\/codemirror.min.js\" data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.2\/mode\/markdown\/markdown.min.js\" data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\"><\/script>\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/marked\/marked.min.js\" data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/highlight.js\/11.9.0\/highlight.min.js\" data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\"><\/script>\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/turndown\/dist\/turndown.js\" data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\"><\/script>\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/turndown-plugin-gfm\/dist\/turndown-plugin-gfm.js\" data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\"><\/script>\r\n<script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">window.MathJax={tex:{inlineMath:[['$','$'],['\\\\(','\\\\)']],displayMath:[['$$','$$'],['\\\\[','\\\\]']]},startup:{typeset:false}};<\/script>\r\n<script async src=\"https:\/\/cdn.jsdelivr.net\/npm\/mathjax@3\/es5\/tex-mml-chtml.js\" data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\"><\/script>\r\n\r\n<style>\r\n\/* CRITICAL: Master Skeleton Scoped CSS *\/\r\n#pth-mdstudio-wrapper { font-family: 'Inter', system-ui, sans-serif; max-width: 1400px; margin: 0 auto; box-sizing: border-box; background: #f8fafc; padding: 20px; border-radius: 16px; color: #0f172a; }\r\n#pth-mdstudio-wrapper * { box-sizing: border-box; min-width: 0; }\r\n#pth-mdstudio-wrapper .pth-card { background: #ffffff; border: 1px solid #e2e8f0; border-radius: 12px; padding: 20px; margin-bottom: 25px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05); }\r\n#pth-mdstudio-wrapper .pth-tool-title { font-size: 28px; font-weight: 800; color: #3b82f6; margin: 0; }\r\n#pth-mdstudio-wrapper .pth-flex-layout { display: grid; grid-template-columns: 1fr; gap: 20px; align-items: start; transition: 0.3s ease; }\r\n\r\n\/* Tool Specific CSS *\/\r\n#mds { font-family: 'Inter', system-ui, sans-serif; background: #f1f5f9; border-radius: 14px; overflow: hidden; width: 100%; color: #0f172a; border: 1px solid #334155; }\r\n#mds * { box-sizing: border-box; min-width: 0; }\r\n#mds-hdr { background: #1e293b; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; min-height: 48px; border-bottom: 1px solid #0f172a; }\r\n#mds-hdr-l { display: flex; align-items: center; gap: 12px; height: 100%; flex-wrap: wrap; }\r\n#mds-hdr h2 { margin: 0; font-size: 15px; font-weight: 800; color: #f1f5f9; display: flex; align-items: center; gap: 8px; }\r\n#mds-hdr i.logo { color: #f87171; font-size: 18px; }\r\n\r\n\/* Menus in Header *\/\r\n.mds-menu-wrap { position: relative; display: flex; align-items: center; }\r\n.mds-menu-btn { background: transparent; border: none; color: #94a3b8; font-size: 13px; font-weight: 600; padding: 8px 12px; cursor: pointer; display: flex; align-items: center; gap: 6px; transition: 0.2s; border-radius: 5px; font-family: inherit; }\r\n.mds-menu-btn:hover, .mds-menu-wrap.active .mds-menu-btn { background: #334155; color: #f1f5f9; }\r\n.mds-menu-drop { position: absolute; top: 100%; left: 0; background: #1e293b; border: 1px solid #334155; border-radius: 0 0 8px 8px; box-shadow: 0 12px 32px rgba(0,0,0,0.6); display: none; flex-direction: column; z-index: 9999; min-width: 220px; padding: 8px; }\r\n.mds-menu-drop.mds-drop-right { left: auto; right: 0; border-radius: 8px 0 8px 8px; }\r\n.mds-menu-wrap.active .mds-menu-drop { display: flex; animation: mdsfd .15s ease; }\r\n.mds-m-item { background: none; border: none; color: #cbd5e1; font-size: 13px; font-weight: 500; padding: 10px 14px; cursor: pointer; display: flex; align-items: center; gap: 10px; border-radius: 5px; width: 100%; text-align: left; transition: 0.1s; font-family: inherit; }\r\n.mds-m-item:hover { background: #334155; color: #f1f5f9; }\r\n.mds-m-item i { width: 16px; text-align: center; color: #64748b; }\r\n.mds-m-item:hover i { color: #94a3b8; }\r\n.mds-m-item .kk { margin-left: auto; font-size: 11px; color: #475569; background: #0f172a; padding: 2px 6px; border-radius: 4px; font-family: monospace; font-weight: bold; }\r\n.mds-m-item.active-doc { background: #334155; color: #fff; }\r\n.mds-m-item.active-doc i { color: #10b981; }\r\n.mds-menu-drop hr { border: none; border-top: 1px solid #334155; margin: 4px 0; }\r\n#doc-list { display: flex; flex-direction: column; max-height: 240px; overflow-y: auto; }\r\n\r\n#mds-hdr-r { display: flex; align-items: center; gap: 10px; }\r\n.mds-export-btn { background: #10b981; color: #fff; padding: 7px 14px; border-radius: 6px; }\r\n.mds-export-btn:hover, .mds-menu-wrap.active .mds-export-btn { background: #059669; color: #fff; }\r\n\r\n\/* Body & Split Layout *\/\r\n#mds-body { display: flex; height: 80vh; min-height: 620px; background: #334155; transition: none; }\r\n#mds-L { flex-basis: 50%; display: flex; flex-direction: column; background: #1e1e1e; min-width: 200px; overflow: hidden; transition: flex-basis .25s; }\r\n#mds-R { flex-basis: 50%; display: flex; flex-direction: column; background: #94a3b8; min-width: 0; overflow: hidden; transition: flex-basis .25s, opacity .25s; }\r\n#mds-body.editor-full #mds-L { flex-basis: 100%; }\r\n#mds-body.editor-full #mds-resizer { display: none; }\r\n#mds-body.editor-full #mds-R { flex-basis: 0; opacity: 0; overflow: hidden; pointer-events: none; }\r\n#mds-resizer { width: 8px; background: #475569; cursor: col-resize; display: flex; align-items: center; justify-content: center; color: #94a3b8; font-size: 10px; flex-shrink: 0; transition: background .15s; }\r\n#mds-resizer:hover, #mds-resizer.active { background: #3b82f6; }\r\n\r\n\/* Find & Replace panel *\/\r\n.mds-find { display: none; align-items: center; gap: 6px; padding: 8px 10px; background: #111827; border-bottom: 1px solid #0f172a; flex-wrap: wrap; }\r\n.mds-find.open { display: flex; }\r\n.mds-find input[type=\"text\"] { background: #1e293b; border: 1px solid #334155; color: #e2e8f0; padding: 5px 8px; border-radius: 5px; font-size: 12px; outline: none; font-family: inherit; }\r\n.mds-find input[type=\"text\"]:focus { border-color: #3b82f6; }\r\n.mds-find .fin { width: 140px; }\r\n.mds-find label { display: flex; align-items: center; gap: 4px; font-size: 11px; color: #94a3b8; font-weight: 700; cursor: pointer; }\r\n.mds-find .fcount { font-size: 11px; color: #64748b; font-weight: 600; margin-left: auto; }\r\n\r\n\/* Secondary Toolbar *\/\r\n.mds-tb { display: flex; align-items: center; justify-content: space-between; padding: 9px 13px; background: #2d3748; border-bottom: 1px solid #1a202c; flex-wrap: wrap; gap: 7px; flex-shrink: 0; }\r\n.mds-tb.lt { background: #fff; border-bottom: 1px solid #e2e8f0; }\r\n.mds-tlbl { font-size: 11px; font-weight: 800; color: #94a3b8; text-transform: uppercase; letter-spacing: .8px; margin: 0; }\r\n.mds-tb.lt .mds-tlbl { color: #475569; }\r\n.mds-row { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }\r\n.mb { background: transparent; color: #94a3b8; border: none; padding: 6px 9px; border-radius: 5px; font-size: 13px; font-weight: 700; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; font-family: inherit; transition: 0.15s; }\r\n.mb:hover { background: #334155; color: #f1f5f9; }\r\n.mb.primary { background: #334155; color: #f1f5f9; }\r\n.mb.primary:hover { background: #475569; }\r\n.mb.sep { width: 1px; height: 18px; background: #475569; padding: 0; pointer-events: none; margin: 0 4px; }\r\n.mds-tb.lt .mb { background: #f1f5f9; color: #334155; border: 1px solid #cbd5e1; }\r\n.mds-tb.lt .mb:hover { background: #e2e8f0; }\r\n\r\n\/* Editor *\/\r\n.mds-ew { flex: 1; overflow: hidden; display: flex; flex-direction: column; }\r\n.mds-ew .CodeMirror { flex: 1; height: 100%!important; font-family: 'Courier New', monospace; font-size: 15px; }\r\n.mds-sb { background: #111827; color: #6b7280; font-size: 11px; padding: 5px 13px; display: flex; justify-content: space-between; align-items: center; font-weight: 600; flex-shrink: 0; }\r\n.mds-sb .sv { color: #10b981; } .mds-sb .sg { color: #f59e0b; }\r\n.mds-sb .docname { color: #93c5fd; font-weight: 700; }\r\n\r\n\/* Selects *\/\r\n.mds-sg select { background: #1e293b; border: 1px solid #334155; color: #cbd5e1; padding: 5px 8px; border-radius: 5px; font-size: 12px; font-weight: 600; outline: none; cursor: pointer; }\r\n.mds-sg select:focus { border-color: #3b82f6; }\r\n\r\n\/* Preview *\/\r\n.mds-prev { flex: 1; overflow-y: auto; padding: 22px 14px; background: #94a3b8; }\r\n.mds-a4 { background: #fff; width: 100%; max-width: 820px; min-height: 1060px; padding: 46px 54px; box-shadow: 0 6px 20px rgba(0,0,0,.16); margin: 0 auto 20px; border-radius: 3px; }\r\n#mds-out { font-family: Georgia, 'Times New Roman', serif; line-height: 1.65; color: #1e293b; font-size: 15px; }\r\n#mds-out h1, #mds-out h2, #mds-out h3, #mds-out h4 { color: #0f172a; margin-top: 1.25em; margin-bottom: .4em; font-weight: 800; font-family: 'Inter', system-ui, sans-serif; scroll-margin-top: 20px; }\r\n#mds-out h1:first-child, #mds-out h2:first-child { margin-top: 0; }\r\n#mds-out h1 { font-size: 2.1em; border-bottom: 2.5px solid #e2e8f0; padding-bottom: 9px; }\r\n#mds-out h2 { font-size: 1.65em; border-bottom: 1px solid #f1f5f9; padding-bottom: 5px; }\r\n#mds-out p { margin-bottom: 1em; }\r\n#mds-out ul, #mds-out ol { margin-bottom: 1em; padding-left: 1.8em; }\r\n#mds-out li { margin-bottom: .25em; }\r\n#mds-out code { background: #f1f5f9; padding: .15em .4em; border-radius: 4px; font-family: 'Courier New', monospace; font-size: .88em; color: #be123c; }\r\n#mds-out pre { background: #f8fafc; padding: 13px; border-radius: 6px; overflow-x: auto; border: 1px solid #e2e8f0; margin-bottom: 1em; }\r\n#mds-out pre code { background: transparent; color: #334155; padding: 0; }\r\n#mds-out blockquote { border-left: 4px solid #3b82f6; padding: 9px 14px; margin-left: 0; color: #64748b; font-style: italic; background: #f8fafc; border-radius: 0 4px 4px 0; }\r\n#mds-out table { width: 100%; border-collapse: collapse; margin-bottom: 1.3em; }\r\n#mds-out th, #mds-out td { padding: 8px 12px; border: 1px solid #e2e8f0; text-align: left; }\r\n#mds-out th { background: #f8fafc; font-weight: 700; color: #0f172a; font-family: 'Inter', system-ui, sans-serif; }\r\n#mds-out tr:nth-child(even) td { background: #fafafa; }\r\n#mds-out img { max-width: 100%; height: auto; border-radius: 4px; margin: 10px 0; display: block; }\r\n#mds-out hr { border: none; border-top: 2px solid #e2e8f0; margin: 1.4em 0; }\r\n#mds-out a { color: #3b82f6; }\r\n.mds-pbv { width: 100%; border-top: 2px dashed #94a3b8; margin: 32px 0; position: relative; text-align: center; }\r\n.mds-pbv::after { content: \"\\2702 Page Break\"; position: absolute; top: -10px; left: 50%; transform: translateX(-50%); background: #f1f5f9; padding: 1px 9px; font-size: 11px; color: #94a3b8; font-weight: 700; border-radius: 12px; }\r\n#mds-out.theme-modern { font-family: 'Inter', system-ui, sans-serif; font-size: 14px; }\r\n#mds-out.theme-modern h1, #mds-out.theme-modern h2 { color: #3b82f6; border-color: #dbeafe; }\r\n#mds-out.theme-modern blockquote { border-color: #e11d48; background: #fff1f2; color: #9f1239; }\r\n\r\n\/* Auto Table of Contents *\/\r\n#mds-out .mds-toc { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 14px 20px; margin-bottom: 1.4em; font-family: 'Inter', system-ui, sans-serif; }\r\n#mds-out .mds-toc-title { font-weight: 800; font-size: .95em; color: #0f172a; margin-bottom: 6px; display: flex; align-items: center; gap: 7px; }\r\n#mds-out .mds-toc ul { list-style: none; padding-left: 0; margin: 0; }\r\n#mds-out .mds-toc li { margin: 3px 0; }\r\n#mds-out .mds-toc li.lvl-3 { padding-left: 18px; }\r\n#mds-out .mds-toc li.lvl-4 { padding-left: 36px; }\r\n#mds-out .mds-toc a { text-decoration: none; font-size: .9em; font-style: normal; }\r\n#mds-out .mds-toc a:hover { text-decoration: underline; }\r\n\r\n\/* GitHub-style Callouts *\/\r\n.mds-callout { border-left: 4px solid #64748b; background: #f8fafc; border-radius: 0 6px 6px 0; padding: 12px 16px; margin: 0 0 1.1em; font-style: normal; color: #334155; }\r\n.mds-callout .mds-callout-head { font-family: 'Inter', system-ui, sans-serif; font-weight: 800; font-size: .92em; display: flex; align-items: center; gap: 8px; margin-bottom: 5px; text-transform: none; }\r\n.mds-callout p { margin: 0 0 .5em; }\r\n.mds-callout p:last-child { margin-bottom: 0; }\r\n.mds-callout-note { border-left-color: #3b82f6; background: #eff6ff; }\r\n.mds-callout-note .mds-callout-head { color: #1d4ed8; }\r\n.mds-callout-tip { border-left-color: #10b981; background: #ecfdf5; }\r\n.mds-callout-tip .mds-callout-head { color: #047857; }\r\n.mds-callout-important { border-left-color: #8b5cf6; background: #f5f3ff; }\r\n.mds-callout-important .mds-callout-head { color: #6d28d9; }\r\n.mds-callout-warning { border-left-color: #f59e0b; background: #fffbeb; }\r\n.mds-callout-warning .mds-callout-head { color: #b45309; }\r\n.mds-callout-caution { border-left-color: #ef4444; background: #fef2f2; }\r\n.mds-callout-caution .mds-callout-head { color: #b91c1c; }\r\n\r\n\/* Help Dropdown Special *\/\r\n.pth-help-row { display: flex; justify-content: space-between; align-items: center; padding: 6px 4px; font-size: 12px; color: #cbd5e1; }\r\n.pth-help-row code { background: #0f172a; padding: 2px 6px; border-radius: 4px; color: #f87171; font-family: 'Courier New', monospace; font-weight: bold; font-size: 11px; }\r\n\r\n\/* Toast & Custom Modals *\/\r\n#mds-toast { position: fixed; bottom: 18px; right: 18px; background: #10b981; color: #fff; padding: 11px 18px; border-radius: 8px; box-shadow: 0 6px 20px rgba(0,0,0,.18); display: none; align-items: center; gap: 8px; z-index: 2147483647; font-weight: 700; font-size: 13px; font-family: 'Inter', sans-serif; }\r\n#mds-toast.on { display: flex; animation: mdsti .28s ease; }\r\n#mds-toast.err { background: #ef4444; }\r\n.mds-modal-overlay { display: none; position: fixed; inset: 0; background: rgba(15, 23, 42, 0.7); z-index: 2147483647; align-items: center; justify-content: center; backdrop-filter: blur(3px); }\r\n.mds-modal-overlay.show { display: flex; animation: mdsfd .2s ease; }\r\n.mds-modal { background: #1e293b; border: 1px solid #334155; border-radius: 12px; padding: 24px; width: 360px; max-width: 92%; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5); text-align: left; }\r\n.mds-modal h3 { margin: 0 0 14px; font-size: 18px; color: #f8fafc; font-weight: 800; }\r\n.mds-modal p { margin: 0 0 20px; font-size: 14px; color: #94a3b8; line-height: 1.5; }\r\n.mds-modal label.fld { display: block; font-size: 12px; color: #94a3b8; font-weight: 700; margin-bottom: 12px; }\r\n.mds-modal label.fld input[type=\"text\"] { width: 100%; margin-top: 5px; background: #0f172a; border: 1px solid #334155; color: #f1f5f9; padding: 8px 10px; border-radius: 6px; font-size: 13px; outline: none; font-family: inherit; }\r\n.mds-modal label.fld input:focus { border-color: #3b82f6; }\r\n.mds-modal label.chk { display: flex; align-items: center; gap: 8px; font-size: 13px; color: #cbd5e1; font-weight: 600; margin-bottom: 20px; cursor: pointer; }\r\n.pth-ms-modal-btns { display: flex; gap: 10px; justify-content: flex-end; }\r\n.pth-ms-modal-btns button { padding: 8px 16px; border-radius: 6px; font-weight: 700; font-size: 13px; cursor: pointer; border: none; font-family: inherit; }\r\n.pth-ms-modal-btns .btn-cancel { background: #334155; color: #f1f5f9; }\r\n.pth-ms-modal-btns .btn-ok { background: #3b82f6; color: #fff; }\r\n.pth-ms-modal-btns .btn-danger { background: #e11d48; color: #fff; }\r\n\r\n@keyframes mdsfd { from { opacity: 0; transform: translateY(-7px); } to { opacity: 1; transform: translateY(0); } }\r\n@keyframes mdsti { from { transform: translateY(50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }\r\n\r\n@media(max-width:860px){\r\n  #mds-body { flex-direction: column; height: auto; min-height: 860px; }\r\n  #mds-L, #mds-R { flex-basis: 440px!important; width: 100%; }\r\n  #mds-resizer { width: 100%; height: 8px; cursor: row-resize; }\r\n  #mds-body.editor-full #mds-L { flex-basis: 100%!important; }\r\n  #mds-body.editor-full #mds-R { flex-basis: 0!important; }\r\n}\r\n<\/style>\r\n\r\n<div id=\"pth-mdstudio-wrapper\">\r\n    <div class=\"pth-flex-layout\">\r\n        <div class=\"pth-main-col\">\r\n\r\n            <div id=\"mds\">\r\n              <!-- TOP MENU BAR -->\r\n              <div id=\"mds-hdr\">\r\n                <div id=\"mds-hdr-l\">\r\n                  <h2><i class=\"fas fa-file-pdf logo\"><\/i> Markdown Studio Pro<\/h2>\r\n\r\n                  <div class=\"mds-menu-wrap\" id=\"mw-file\">\r\n                    <button class=\"mds-menu-btn\">File <i class=\"fas fa-caret-down\" style=\"font-size:10px\"><\/i><\/button>\r\n                    <div class=\"mds-menu-drop\">\r\n                      <button class=\"mds-m-item\" id=\"mi-new\"><i class=\"fas fa-file-plus\"><\/i> New Document<\/button>\r\n                      <button class=\"mds-m-item\" id=\"mi-import\"><i class=\"fas fa-file-import\"><\/i> Open .md File<\/button>\r\n                      <button class=\"mds-m-item\" id=\"mi-setup\"><i class=\"fas fa-sliders\"><\/i> Document Setup<\/button>\r\n                      <hr>\r\n                      <button class=\"mds-m-item\" id=\"mi-save-md\"><i class=\"fas fa-file-download\"><\/i> Save as .md <span class=\"kk\">Ctrl+Shift+S<\/span><\/button>\r\n                      <hr>\r\n                      <button class=\"mds-m-item\" id=\"mi-clear\"><i class=\"fas fa-trash-alt\" style=\"color:#f87171\"><\/i> Clear Document<\/button>\r\n                    <\/div>\r\n                  <\/div>\r\n\r\n                  <div class=\"mds-menu-wrap\" id=\"mw-docs\">\r\n                    <button class=\"mds-menu-btn\">Docs <i class=\"fas fa-caret-down\" style=\"font-size:10px\"><\/i><\/button>\r\n                    <div class=\"mds-menu-drop\" id=\"docs-drop\">\r\n                      <button class=\"mds-m-item\" id=\"doc-new\"><i class=\"fas fa-plus\"><\/i> New Document<\/button>\r\n                      <button class=\"mds-m-item\" id=\"doc-rename\"><i class=\"fas fa-pen\"><\/i> Rename Current<\/button>\r\n                      <button class=\"mds-m-item\" id=\"doc-delete\" style=\"color:#f87171\"><i class=\"fas fa-trash\"><\/i> Delete Current<\/button>\r\n                      <hr>\r\n                      <div id=\"doc-list\"><\/div>\r\n                    <\/div>\r\n                  <\/div>\r\n\r\n                  <div class=\"mds-menu-wrap\" id=\"mw-insert\">\r\n                    <button class=\"mds-menu-btn\">Insert <i class=\"fas fa-caret-down\" style=\"font-size:10px\"><\/i><\/button>\r\n                    <div class=\"mds-menu-drop\">\r\n                      <button class=\"mds-m-item\" id=\"mi-img\"><i class=\"fas fa-image\"><\/i> Local Image<\/button>\r\n                      <button class=\"mds-m-item\" id=\"mi-table\"><i class=\"fas fa-table\"><\/i> Table<\/button>\r\n                      <button class=\"mds-m-item\" id=\"mi-math\"><i class=\"fas fa-square-root-variable\"><\/i> Math Formula<\/button>\r\n                      <button class=\"mds-m-item\" id=\"mi-toc\"><i class=\"fas fa-list-ol\"><\/i> Table of Contents<\/button>\r\n                      <button class=\"mds-m-item\" id=\"mi-callout\"><i class=\"fas fa-circle-info\"><\/i> Callout Box<\/button>\r\n                      <button class=\"mds-m-item\" id=\"mi-pb\"><i class=\"fas fa-scissors\"><\/i> Page Break<\/button>\r\n                    <\/div>\r\n                  <\/div>\r\n\r\n                  <div class=\"mds-menu-wrap\" id=\"mw-templates\">\r\n                    <button class=\"mds-menu-btn\">Templates <i class=\"fas fa-caret-down\" style=\"font-size:10px\"><\/i><\/button>\r\n                    <div class=\"mds-menu-drop\">\r\n                      <button class=\"mds-m-item tpl-btn\" data-tpl=\"assignment\"><i class=\"fas fa-flask\"><\/i> Physics Lab<\/button>\r\n                      <button class=\"mds-m-item tpl-btn\" data-tpl=\"readme\"><i class=\"fas fa-box\"><\/i> README.md<\/button>\r\n                      <button class=\"mds-m-item tpl-btn\" data-tpl=\"meeting\"><i class=\"fas fa-users\"><\/i> Meeting Notes<\/button>\r\n                    <\/div>\r\n                  <\/div>\r\n\r\n                  <div class=\"mds-menu-wrap\" id=\"mw-help\">\r\n                    <button class=\"mds-menu-btn\">Help <i class=\"fas fa-caret-down\" style=\"font-size:10px\"><\/i><\/button>\r\n                    <div class=\"mds-menu-drop\" style=\"width: 290px; padding: 12px;\">\r\n                        <h4 style=\"margin: 0 0 10px; font-size:13px; color:#f1f5f9; border-bottom:1px solid #334155; padding-bottom:6px; font-weight:800;\"><i class=\"fas fa-keyboard\" style=\"color:#3b82f6\"><\/i> Shortcuts<\/h4>\r\n                        <div class=\"pth-help-row\"><span>Bold \/ Italic<\/span> <code>Ctrl+B \/ Ctrl+I<\/code><\/div>\r\n                        <div class=\"pth-help-row\"><span>Export PDF<\/span> <code>Ctrl+S<\/code><\/div>\r\n                        <div class=\"pth-help-row\"><span>Find &amp; Replace<\/span> <code>Ctrl+H<\/code><\/div>\r\n                        <div class=\"pth-help-row\"><span>Refresh preview<\/span> <code>Ctrl+Enter<\/code><\/div>\r\n                        <div class=\"pth-help-row\"><span>Full width editor<\/span> <code>Ctrl+Shift+E<\/code><\/div>\r\n\r\n                        <h4 style=\"margin: 12px 0 8px; font-size:12px; color:#3b82f6; border-bottom:1px solid #334155; padding-bottom:6px;\"><i class=\"fas fa-book-open\"><\/i> Markdown<\/h4>\r\n                        <div class=\"pth-help-row\"><span>Callout<\/span> <code>&gt; [!NOTE]<\/code><\/div>\r\n                        <div class=\"pth-help-row\"><span>Math<\/span> <code>$$ E=mc^2 $$<\/code><\/div>\r\n                        <div class=\"pth-help-row\"><span>Image<\/span> <code>![alt](URL)<\/code><\/div>\r\n                        <div class=\"pth-help-row\"><span>Rich paste<\/span> <code>Ctrl+V &rarr; MD<\/code><\/div>\r\n                    <\/div>\r\n                  <\/div>\r\n\r\n                <\/div>\r\n                <div id=\"mds-hdr-r\">\r\n                  <button class=\"mb primary\" id=\"b-expand\" title=\"Toggle full-width editor\">\r\n                    <i class=\"fas fa-expand-alt\" id=\"b-expand-icon\"><\/i> <span id=\"b-expand-txt\">Editor<\/span>\r\n                  <\/button>\r\n                  <div class=\"mds-menu-wrap\" id=\"mw-export\">\r\n                    <button class=\"mds-menu-btn mds-export-btn\"><i class=\"fas fa-file-export\"><\/i> Export <i class=\"fas fa-caret-down\" style=\"font-size:10px\"><\/i><\/button>\r\n                    <div class=\"mds-menu-drop mds-drop-right\">\r\n                      <button class=\"mds-m-item\" id=\"ex-pdf\"><i class=\"fas fa-file-pdf\" style=\"color:#ef4444\"><\/i> PDF Document <span class=\"kk\">Ctrl+S<\/span><\/button>\r\n                      <button class=\"mds-m-item\" id=\"ex-word\"><i class=\"fas fa-file-word\" style=\"color:#2563eb\"><\/i> Word (.doc)<\/button>\r\n                      <button class=\"mds-m-item\" id=\"ex-txt\"><i class=\"fas fa-file-lines\" style=\"color:#64748b\"><\/i> Plain Text (.txt)<\/button>\r\n                      <hr>\r\n                      <button class=\"mds-m-item\" id=\"ex-md\"><i class=\"fab fa-markdown\"><\/i> Markdown (.md)<\/button>\r\n                    <\/div>\r\n                  <\/div>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <!-- SECONDARY TOOLBAR -->\r\n              <div class=\"mds-tb\" style=\"padding: 6px 12px;\">\r\n                <div class=\"mds-row\">\r\n                  <button class=\"mb\" id=\"b-bold\" title=\"Bold Ctrl+B\"><b>B<\/b><\/button>\r\n                  <button class=\"mb\" id=\"b-italic\" title=\"Italic Ctrl+I\"><i>I<\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-strike\" title=\"Strikethrough\"><s>S<\/s><\/button>\r\n                  <button class=\"mb\" id=\"b-h1\" title=\"Heading 1\"><b>H1<\/b><\/button>\r\n                  <button class=\"mb\" id=\"b-h2\" title=\"Heading 2\"><b>H2<\/b><\/button>\r\n                  <button class=\"mb\" id=\"b-h3\" title=\"Heading 3\"><b>H3<\/b><\/button>\r\n                  <span class=\"mb sep\"><\/span>\r\n                  <button class=\"mb\" id=\"b-ul\" title=\"Bullet List\"><i class=\"fas fa-list-ul\"><\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-ol\" title=\"Numbered List\"><i class=\"fas fa-list-ol\"><\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-quote\" title=\"Blockquote\"><i class=\"fas fa-quote-right\"><\/i><\/button>\r\n                  <span class=\"mb sep\"><\/span>\r\n                  <button class=\"mb\" id=\"b-link\" title=\"Link\"><i class=\"fas fa-link\"><\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-img-btn\" title=\"Image\"><i class=\"fas fa-image\"><\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-code\" title=\"Code\"><i class=\"fas fa-code\"><\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-table\" title=\"Table\"><i class=\"fas fa-table\"><\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-math\" title=\"Math\"><i class=\"fas fa-square-root-variable\"><\/i><\/button>\r\n                  <span class=\"mb sep\"><\/span>\r\n                  <button class=\"mb\" id=\"b-toc\" title=\"Insert Table of Contents\"><i class=\"fas fa-list-ol\"><\/i> TOC<\/button>\r\n                  <button class=\"mb\" id=\"b-find\" title=\"Find & Replace (Ctrl+H)\"><i class=\"fas fa-magnifying-glass\"><\/i><\/button>\r\n                  <button class=\"mb\" id=\"b-pb\" title=\"Page Break\"><i class=\"fas fa-scissors\"><\/i> Break<\/button>\r\n                <\/div>\r\n                <div class=\"mds-row mds-sg\" style=\"gap: 6px;\">\r\n                  <select id=\"s-theme\"><option value=\"\" selected>GitHub<\/option><option value=\"theme-modern\">Modern<\/option><\/select>\r\n                  <select id=\"s-fs\"><option value=\"14px\">14px<\/option><option value=\"15px\" selected>15px<\/option><option value=\"16px\">16px<\/option><\/select>\r\n                  <select id=\"s-fmt\"><option value=\"A4\" selected>A4<\/option><option value=\"Letter\">Letter<\/option><\/select>\r\n                  <select id=\"s-ori\"><option value=\"portrait\" selected>Portrait<\/option><option value=\"landscape\">Landscape<\/option><\/select>\r\n                <\/div>\r\n              <\/div>\r\n\r\n              <!-- BODY -->\r\n              <div id=\"mds-body\">\r\n                <div id=\"mds-L\">\r\n                  <!-- Find & Replace panel -->\r\n                  <div class=\"mds-find\" id=\"mds-find\">\r\n                    <input type=\"text\" class=\"fin\" id=\"mds-find-in\" placeholder=\"Find\">\r\n                    <input type=\"text\" class=\"fin\" id=\"mds-rep-in\" placeholder=\"Replace with\">\r\n                    <label title=\"Regular expression\"><input type=\"checkbox\" id=\"mds-find-re\"> .*<\/label>\r\n                    <label title=\"Case sensitive\"><input type=\"checkbox\" id=\"mds-find-cs\"> Aa<\/label>\r\n                    <button class=\"mb\" id=\"mds-find-next\" style=\"color:#e2e8f0\">Next<\/button>\r\n                    <button class=\"mb\" id=\"mds-rep-one\" style=\"color:#e2e8f0\">Replace<\/button>\r\n                    <button class=\"mb\" id=\"mds-rep-all\" style=\"color:#e2e8f0\">All<\/button>\r\n                    <span class=\"fcount\" id=\"mds-find-count\"><\/span>\r\n                    <button class=\"mb\" id=\"mds-find-x\" style=\"color:#94a3b8\"><i class=\"fas fa-xmark\"><\/i><\/button>\r\n                  <\/div>\r\n                  <div class=\"mds-ew\"><textarea id=\"mds-raw\"><\/textarea><\/div>\r\n                  <div class=\"mds-sb\">\r\n                    <span id=\"mds-stats\"><i class=\"fas fa-chart-bar\"><\/i> 0 Words | 0 Chars<\/span>\r\n                    <span><span class=\"docname\" id=\"mds-docname\">Document 1<\/span> &nbsp;<span id=\"mds-save\" class=\"sv\"><i class=\"fas fa-cloud-arrow-up\"><\/i> Auto-saved<\/span><\/span>\r\n                  <\/div>\r\n                <\/div>\r\n\r\n                <div id=\"mds-resizer\"><i class=\"fas fa-grip-lines-vertical\"><\/i><\/div>\r\n\r\n                <div id=\"mds-R\">\r\n                  <div class=\"mds-tb lt\">\r\n                    <p class=\"mds-tlbl\"><i class=\"fas fa-eye\" style=\"color:#3b82f6\"><\/i> Live Preview<\/p>\r\n                    <div class=\"mds-row\">\r\n                      <button class=\"mb\" id=\"b-fs\"><i class=\"fas fa-expand\"><\/i> Fullscreen<\/button>\r\n                    <\/div>\r\n                  <\/div>\r\n                  <div class=\"mds-prev\" id=\"mds-scroll\">\r\n                    <div class=\"mds-a4\" id=\"mds-a4\">\r\n                      <div id=\"mds-out\"><\/div>\r\n                    <\/div>\r\n                  <\/div>\r\n                <\/div>\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <!-- Hidden inputs -->\r\n            <input type=\"file\" id=\"img-inp\" accept=\"image\/*\" style=\"display:none\">\r\n            <input type=\"file\" id=\"md-inp\" accept=\".md,.txt\" style=\"display:none\">\r\n\r\n            <!-- Confirm Modal -->\r\n            <div id=\"pth-ms-modal-overlay\" class=\"mds-modal-overlay\">\r\n                <div class=\"mds-modal\">\r\n                    <h3 id=\"pth-ms-modal-title\">Confirm Action<\/h3>\r\n                    <p id=\"pth-ms-modal-msg\">Are you sure you want to proceed?<\/p>\r\n                    <div class=\"pth-ms-modal-btns\">\r\n                        <button id=\"pth-ms-modal-cancel\" class=\"btn-cancel\">Cancel<\/button>\r\n                        <button id=\"pth-ms-modal-ok\" class=\"btn-ok\">Confirm<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- Document Setup Modal -->\r\n            <div id=\"mds-setup-overlay\" class=\"mds-modal-overlay\">\r\n                <div class=\"mds-modal\">\r\n                    <h3><i class=\"fas fa-sliders\" style=\"color:#3b82f6\"><\/i> Document Setup<\/h3>\r\n                    <label class=\"fld\">Title<input type=\"text\" id=\"set-title\" placeholder=\"My Document\"><\/label>\r\n                    <label class=\"fld\">Author<input type=\"text\" id=\"set-author\" placeholder=\"Your name\"><\/label>\r\n                    <label class=\"fld\">Date<input type=\"text\" id=\"set-date\" placeholder=\"July 17, 2026\"><\/label>\r\n                    <label class=\"chk\"><input type=\"checkbox\" id=\"set-cover\"> Add a cover page when exporting to PDF<\/label>\r\n                    <div class=\"pth-ms-modal-btns\">\r\n                        <button id=\"set-cancel\" class=\"btn-cancel\">Cancel<\/button>\r\n                        <button id=\"set-save\" class=\"btn-ok\">Save<\/button>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div id=\"mds-toast\"><i class=\"fas fa-check-circle\"><\/i> <span id=\"toast-msg\">Done<\/span><\/div>\r\n\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<style id=\"mds-print\">\r\n@media print{\r\n  body>*{display:none!important}\r\n  #mds-print-root{display:block!important;position:static;width:100%;background:#fff}\r\n  #mds-print-root .pb-body{\r\n    font-family:Georgia,'Times New Roman',serif;\r\n    font-size:15px;line-height:1.65;color:#1e293b;\r\n  }\r\n  #mds-print-root .pb-body.theme-modern{font-family:'Inter',system-ui,sans-serif;font-size:14px}\r\n  #mds-print-root h1,#mds-print-root h2,#mds-print-root h3,#mds-print-root h4{\r\n    font-family:'Inter',system-ui,sans-serif;color:#0f172a;\r\n    page-break-after:avoid;break-after:avoid;margin-top:1.2em;margin-bottom:.4em;font-weight:800\r\n  }\r\n  #mds-print-root .pb-body.theme-modern h1,#mds-print-root .pb-body.theme-modern h2{color:#3b82f6}\r\n  #mds-print-root h1{font-size:2em;border-bottom:2px solid #e2e8f0;padding-bottom:8px}\r\n  #mds-print-root h2{font-size:1.6em;border-bottom:1px solid #f1f5f9;padding-bottom:5px}\r\n  #mds-print-root h3{font-size:1.2em}\r\n  #mds-print-root p{margin-bottom:.9em}\r\n  #mds-print-root p,#mds-print-root blockquote,#mds-print-root pre,#mds-print-root table,#mds-print-root tr,#mds-print-root img,#mds-print-root .mds-callout{\r\n    page-break-inside:avoid;break-inside:avoid\r\n  }\r\n  #mds-print-root ul,#mds-print-root ol{padding-left:1.8em;margin-bottom:.9em}\r\n  #mds-print-root li{margin-bottom:.2em}\r\n  #mds-print-root code{background:#f1f5f9;padding:.12em .35em;border-radius:3px;font-family:'Courier New',monospace;font-size:.87em;color:#be123c}\r\n  #mds-print-root pre{background:#f8fafc;padding:12px;border-radius:5px;border:1px solid #e2e8f0;white-space:pre-wrap;word-break:break-word;margin-bottom:.9em}\r\n  #mds-print-root pre code{background:transparent;color:#334155;padding:0}\r\n  #mds-print-root blockquote{border-left:4px solid #3b82f6;padding:8px 13px;margin-left:0;color:#64748b;font-style:italic;background:#f8fafc}\r\n  #mds-print-root .pb-body.theme-modern blockquote{border-color:#e11d48;background:#fff1f2;color:#9f1239}\r\n  #mds-print-root .mds-callout{border-left:4px solid #64748b;background:#f8fafc;padding:11px 15px;margin:0 0 1em;color:#334155;font-style:normal;border-radius:0 5px 5px 0}\r\n  #mds-print-root .mds-callout .mds-callout-head{font-family:'Inter',system-ui,sans-serif;font-weight:800;font-size:.9em;margin-bottom:4px}\r\n  #mds-print-root .mds-callout-note{border-left-color:#3b82f6;background:#eff6ff}\r\n  #mds-print-root .mds-callout-tip{border-left-color:#10b981;background:#ecfdf5}\r\n  #mds-print-root .mds-callout-important{border-left-color:#8b5cf6;background:#f5f3ff}\r\n  #mds-print-root .mds-callout-warning{border-left-color:#f59e0b;background:#fffbeb}\r\n  #mds-print-root .mds-callout-caution{border-left-color:#ef4444;background:#fef2f2}\r\n  #mds-print-root .mds-toc{background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;padding:12px 18px;margin-bottom:1.2em}\r\n  #mds-print-root .mds-toc-title{font-family:'Inter',system-ui,sans-serif;font-weight:800;margin-bottom:5px}\r\n  #mds-print-root .mds-toc ul{list-style:none;padding-left:0;margin:0}\r\n  #mds-print-root .mds-toc li.lvl-3{padding-left:16px}\r\n  #mds-print-root .mds-toc li.lvl-4{padding-left:32px}\r\n  #mds-print-root .mds-toc a{text-decoration:none;color:#3b82f6}\r\n  #mds-print-root table{width:100%;border-collapse:collapse;margin-bottom:1em}\r\n  #mds-print-root th,#mds-print-root td{padding:7px 11px;border:1px solid #e2e8f0;text-align:left;font-size:.92em}\r\n  #mds-print-root th{background:#f8fafc;font-weight:700;font-family:'Inter',system-ui,sans-serif;color:#0f172a}\r\n  #mds-print-root tr:nth-child(even) td{background:#fafafa}\r\n  #mds-print-root img{max-width:100%;height:auto;display:block;border-radius:3px;margin:9px 0}\r\n  #mds-print-root hr{border:none;border-top:1.5px solid #e2e8f0;margin:1.2em 0}\r\n  #mds-print-root a{color:#3b82f6}\r\n  #mds-print-root .mds-cover{page-break-after:always;break-after:page;text-align:center;padding-top:32vh}\r\n  #mds-print-root .mds-cover .mds-cover-title{font-family:'Inter',system-ui,sans-serif;font-size:2.6em;font-weight:800;color:#0f172a;border:none;margin:0 0 18px}\r\n  #mds-print-root .mds-cover .mds-cover-author{font-size:1.15em;color:#475569;margin-bottom:6px}\r\n  #mds-print-root .mds-cover .mds-cover-date{font-size:1em;color:#94a3b8}\r\n  .mds-pbv{display:none!important}\r\n  .pb-marker{display:block;page-break-after:always;break-after:page;height:0;margin:0;padding:0}\r\n  @page{margin:18mm 20mm}\r\n}\r\n<\/style>\r\n\r\n<script data-no-optimize=\"1\" data-no-minify=\"1\" data-cfasync=\"false\">\r\n(function(){\r\n\/* Angle-bracket and closing-tag helpers.\r\n   WordPress + LiteSpeed mangle hex escape sequences for the angle brackets and any\r\n   raw structural closing tag inside a script, which kills the whole block and every\r\n   button. We build every angle bracket and every closing tag from concatenated\r\n   pieces and keep this file pure ASCII. *\/\r\nvar LT = String.fromCharCode(60); \/* < *\/\r\nvar GT = String.fromCharCode(62); \/* > *\/\r\nvar CT = LT + '\/';                \/* closing-tag opener \"<\/\" *\/\r\n\r\nvar TEMPLATES = {\r\n    assignment: '# Physics Assignment: Energy & Motion\\n\\n**Student Name:** John Doe  \\n**Date:** May 29, 2026\\n\\n---\\n\\n## 1. Introduction to Relativity\\n\\nAlbert Einstein\\'s theory of special relativity expresses the equivalence of mass and energy through one of the most famous equations in physics.\\n\\n### Core Formula\\n\\nThe energy $E$ of a particle in its rest frame is given by:\\n\\n$$ E = mc^2 $$\\n\\n> [!NOTE]\\n> Imagination is more important than knowledge. For knowledge is limited, whereas imagination embraces the entire world.\\n\\n' + LT + 'div class=\"pb\"' + GT + CT + 'div' + GT + '\\n\\n## 2. Experimental Data Analysis\\n\\nBelow is a record of our experimental observations comparing velocity and kinetic energy.\\n\\n| Trial No. | Mass (kg) | Velocity (m\/s) | KE (J) |\\n| :---: | :---: | :---: | :---: |\\n| 1 | 5.0 | 10 | 250 |\\n| 2 | 5.0 | 20 | 1000 |\\n| 3 | 10.0 | 10 | 500 |\\n\\n### Task Checklist\\n\\n- [x] Calibrate measuring instruments.\\n- [x] Record initial mass and velocity.\\n- [ ] Calculate final kinetic energy outputs.\\n- [ ] Submit lab report.',\r\n\r\n    readme: '# Project Name\\n\\n> A short, punchy description of what this project does.\\n\\n## Features\\n\\n- Feature one\\n- Feature two\\n\\n> [!TIP]\\n> Run the installer with administrator privileges for best results.\\n\\n## Installation\\n\\n```bash\\nnpm install project-name\\n```\\n\\n## API Reference\\n\\n| Method | Params | Returns |\\n| :----- | :----- | :------ |\\n| `init()` | options | Promise |\\n',\r\n\r\n    meeting: '# Meeting Notes\\n\\n**Date:** May 29, 2026\\n**Attendees:** Alice, Bob\\n\\n---\\n\\n## Agenda\\n\\n1. Project status update\\n2. Blockers\\n\\n> [!IMPORTANT]\\n> Final decision on the release date must be made today.\\n\\n## Decisions Made\\n\\n- Decided to push release to Friday\\n\\n## Action Items\\n\\n- [ ] Alice \\u2014 Update roadmap\\n- [ ] Bob \\u2014 Fix bugs\\n'\r\n};\r\n\r\nvar CALLOUT_META = {\r\n    note:      { icon: 'fa-circle-info',          label: 'Note' },\r\n    tip:       { icon: 'fa-lightbulb',            label: 'Tip' },\r\n    important: { icon: 'fa-comment-dots',         label: 'Important' },\r\n    warning:   { icon: 'fa-triangle-exclamation', label: 'Warning' },\r\n    caution:   { icon: 'fa-fire',                 label: 'Caution' }\r\n};\r\n\r\nvar STORE_KEY = 'mds_v4';\r\nvar OLD_KEY = 'mds_v3';\r\n\r\nvar ed, ctimer, isRes = false, editorFull = false, tdService = null;\r\nvar STATE = { v: 4, active: '', docs: [] };\r\nvar findPos = 0;\r\nvar booted = false;\r\n\r\nfunction g(id){ return document.getElementById(id); }\r\n\r\nfunction uid(){ return 'd' + Date.now() + Math.floor(Math.random() * 1000); }\r\n\r\nfunction escHtml(s){\r\n  return String(s)\r\n    .replace(\/&\/g, '&amp;')\r\n    .replace(new RegExp(LT, 'g'), '&lt;')\r\n    .replace(new RegExp(GT, 'g'), '&gt;')\r\n    .replace(\/\"\/g, '&quot;');\r\n}\r\n\r\n\/* Icon-span builder so we never place a raw tag literal inside a string. *\/\r\nfunction icon(cls){ return LT + 'i class=\"' + cls + '\"' + GT + CT + 'i' + GT; }\r\n\r\nfunction toast(msg, err){\r\n  var t = g('mds-toast');\r\n  t.className = 'on' + (err ? ' err' : '');\r\n  g('toast-msg').textContent = msg;\r\n  clearTimeout(t._t);\r\n  t._t = setTimeout(function(){ t.className = ''; }, 3200);\r\n}\r\n\r\nfunction confirmDialog(title, msg, confirmText, callback, danger){\r\n  var overlay = g('pth-ms-modal-overlay');\r\n  var okBtn = g('pth-ms-modal-ok');\r\n  var cancelBtn = g('pth-ms-modal-cancel');\r\n\r\n  g('pth-ms-modal-title').textContent = title;\r\n  g('pth-ms-modal-msg').textContent = msg;\r\n  okBtn.textContent = confirmText;\r\n  okBtn.className = danger ? 'btn-danger' : 'btn-ok';\r\n\r\n  overlay.classList.add('show');\r\n\r\n  var cleanup = function(){\r\n    overlay.classList.remove('show');\r\n    okBtn.replaceWith(okBtn.cloneNode(true));\r\n    cancelBtn.replaceWith(cancelBtn.cloneNode(true));\r\n  };\r\n\r\n  g('pth-ms-modal-ok').addEventListener('click', function(){ cleanup(); callback(); });\r\n  g('pth-ms-modal-cancel').addEventListener('click', function(){ cleanup(); });\r\n}\r\n\r\n\/* Text-input modal used instead of the native browser dialog (house rule). *\/\r\nfunction promptDialog(title, msg, defValue, confirmText, callback){\r\n  var overlay = g('pth-ms-modal-overlay');\r\n  var okBtn = g('pth-ms-modal-ok');\r\n  var cancelBtn = g('pth-ms-modal-cancel');\r\n  var msgEl = g('pth-ms-modal-msg');\r\n\r\n  g('pth-ms-modal-title').textContent = title;\r\n  msgEl.textContent = msg;\r\n  okBtn.textContent = confirmText;\r\n  okBtn.className = 'btn-ok';\r\n\r\n  var field = document.createElement('input');\r\n  field.type = 'text';\r\n  field.value = defValue || '';\r\n  field.className = 'pth-ms-prompt-input';\r\n  field.style.cssText = 'width:100%;margin-top:12px;background:#0f172a;border:1px solid #334155;color:#f1f5f9;padding:8px 10px;border-radius:6px;font-size:13px;outline:none;font-family:inherit;';\r\n  msgEl.parentNode.insertBefore(field, msgEl.nextSibling);\r\n\r\n  overlay.classList.add('show');\r\n  setTimeout(function(){ field.focus(); field.select(); }, 40);\r\n\r\n  var cleanup = function(){\r\n    overlay.classList.remove('show');\r\n    if(field.parentNode){ field.parentNode.removeChild(field); }\r\n    okBtn.replaceWith(okBtn.cloneNode(true));\r\n    cancelBtn.replaceWith(cancelBtn.cloneNode(true));\r\n  };\r\n\r\n  var commit = function(){ var val = field.value; cleanup(); callback(val); };\r\n\r\n  field.addEventListener('keydown', function(e){ if(e.key === 'Enter'){ e.preventDefault(); commit(); } });\r\n  g('pth-ms-modal-ok').addEventListener('click', commit);\r\n  g('pth-ms-modal-cancel').addEventListener('click', function(){ cleanup(); });\r\n}\r\n\r\n\/* ---------- Multi-document state ---------- *\/\r\nfunction activeDoc(){\r\n  for(var i = 0; i < STATE.docs.length; i++){ if(STATE.docs[i].id === STATE.active) return STATE.docs[i]; }\r\n  return STATE.docs[0];\r\n}\r\n\r\nfunction persist(){\r\n  try { localStorage.setItem(STORE_KEY, JSON.stringify(STATE)); } catch(e){}\r\n}\r\n\r\nfunction loadState(){\r\n  var raw = null;\r\n  try { raw = localStorage.getItem(STORE_KEY); } catch(e){}\r\n  if(raw){\r\n    try {\r\n      var parsed = JSON.parse(raw);\r\n      if(parsed && parsed.docs && parsed.docs.length){ STATE = parsed; return; }\r\n    } catch(e){}\r\n  }\r\n  \/* Migrate an old single-document autosave if present. *\/\r\n  var legacy = null;\r\n  try { legacy = localStorage.getItem(OLD_KEY); } catch(e){}\r\n  var first = { id: uid(), name: 'Document 1', content: (legacy && legacy.trim()) ? legacy : TEMPLATES.assignment, meta: { title: '', author: '', date: '', cover: false } };\r\n  STATE = { v: 4, active: first.id, docs: [ first ] };\r\n  persist();\r\n}\r\n\r\nfunction renderDocList(){\r\n  var box = g('doc-list');\r\n  box.innerHTML = '';\r\n  for(var i = 0; i < STATE.docs.length; i++){\r\n    (function(d){\r\n      var b = document.createElement('button');\r\n      b.className = 'mds-m-item' + (d.id === STATE.active ? ' active-doc' : '');\r\n      b.innerHTML = icon('fas fa-file-lines') + ' ' + escHtml(d.name);\r\n      b.addEventListener('click', function(e){ e.stopPropagation(); switchDoc(d.id); closeAllMenus(); });\r\n      box.appendChild(b);\r\n    })(STATE.docs[i]);\r\n  }\r\n  g('mds-docname').textContent = activeDoc().name;\r\n}\r\n\r\nfunction switchDoc(id){\r\n  if(id === STATE.active) return;\r\n  activeDoc().content = ed.getValue();\r\n  persist();\r\n  STATE.active = id;\r\n  ed.setValue(activeDoc().content || '');\r\n  ed.clearHistory();\r\n  compile(); stats(); renderDocList();\r\n  toast('Switched to \"' + activeDoc().name + '\"');\r\n}\r\n\r\nfunction newDoc(){\r\n  activeDoc().content = ed.getValue();\r\n  var d = { id: uid(), name: 'Document ' + (STATE.docs.length + 1), content: '', meta: { title: '', author: '', date: '', cover: false } };\r\n  STATE.docs.push(d);\r\n  STATE.active = d.id;\r\n  persist();\r\n  ed.setValue(''); ed.clearHistory(); compile(); stats(); renderDocList();\r\n  toast('New document created');\r\n}\r\n\r\nfunction renameDoc(){\r\n  var cur = activeDoc();\r\n  promptDialog('Rename Document', 'Enter a new name for this document:', cur.name, 'Rename', function(name){\r\n    if(name && name.trim()){ cur.name = name.trim(); persist(); renderDocList(); toast('Renamed'); }\r\n  });\r\n}\r\n\r\nfunction deleteDoc(){\r\n  if(STATE.docs.length <= 1){ toast('Cannot delete the only document', true); return; }\r\n  var cur = activeDoc();\r\n  confirmDialog('Delete Document', 'Delete \"' + cur.name + '\" permanently? This cannot be undone.', 'Delete', function(){\r\n    var idx = 0, i;\r\n    for(i = 0; i < STATE.docs.length; i++){ if(STATE.docs[i].id === cur.id){ idx = i; break; } }\r\n    STATE.docs.splice(idx, 1);\r\n    STATE.active = STATE.docs[Math.max(0, idx - 1)].id;\r\n    persist();\r\n    ed.setValue(activeDoc().content || ''); ed.clearHistory(); compile(); stats(); renderDocList();\r\n    toast('Document deleted');\r\n  }, true);\r\n}\r\n\r\n\/* ---------- Editor status ---------- *\/\r\nfunction stats(){\r\n  var v = ed.getValue();\r\n  var w = v.trim() === '' ? 0 : v.trim().split(\/\\s+\/).length;\r\n  g('mds-stats').innerHTML = icon('fas fa-chart-bar') + ' ' + w + ' Words | ' + v.length + ' Chars';\r\n}\r\n\r\nfunction save(){\r\n  activeDoc().content = ed.getValue();\r\n  persist();\r\n  g('mds-save').className = 'sv';\r\n  g('mds-save').innerHTML = icon('fas fa-cloud-arrow-up') + ' Auto-saved';\r\n}\r\n\r\n\/* ---------- Rendering pipeline ---------- *\/\r\nfunction processRaw(raw){\r\n  var pbHtml = LT + 'div class=\"mds-pbv\"' + GT + CT + 'div' + GT + LT + 'div class=\"pb-marker\"' + GT + CT + 'div' + GT;\r\n  var reBreak = new RegExp(LT + 'div class=\"page-break\"' + GT + CT + 'div' + GT, 'gi');\r\n  var rePb = new RegExp(LT + 'div class=\"pb\"' + GT + CT + 'div' + GT, 'gi');\r\n  return raw.replace(reBreak, pbHtml).replace(rePb, pbHtml);\r\n}\r\n\r\nfunction toMarkup(raw){\r\n  return (typeof marked.parse === 'function') ? marked.parse(processRaw(raw)) : marked(processRaw(raw));\r\n}\r\n\r\nfunction slugify(s){\r\n  return String(s).toLowerCase().replace(\/[^\\w\\s-]\/g, '').replace(\/\\s+\/g, '-').replace(\/-+\/g, '-').replace(\/^-+|-+$\/g, '');\r\n}\r\n\r\nfunction transformCallout(bq){\r\n  var m = bq.textContent.match(\/^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\/i);\r\n  if(!m) return;\r\n  var type = m[1].toLowerCase();\r\n  var meta = CALLOUT_META[type];\r\n  if(!meta) return;\r\n  \/* Remove the \"[!TYPE]\" marker text from the rendered blockquote. *\/\r\n  bq.innerHTML = bq.innerHTML.replace(\/\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\/i, '');\r\n  bq.className = 'mds-callout mds-callout-' + type;\r\n  var head = document.createElement('div');\r\n  head.className = 'mds-callout-head';\r\n  head.innerHTML = icon('fas ' + meta.icon) + ' ' + meta.label;\r\n  bq.insertBefore(head, bq.firstChild);\r\n}\r\n\r\nfunction enhance(container){\r\n  \/* 1) Stable heading ids for anchor links \/ TOC. *\/\r\n  var hs = container.querySelectorAll('h1,h2,h3,h4');\r\n  var used = {}, i;\r\n  for(i = 0; i < hs.length; i++){\r\n    var base = slugify(hs[i].textContent) || 'section';\r\n    var id = base, n = 2;\r\n    while(used[id]){ id = base + '-' + n; n++; }\r\n    used[id] = 1; hs[i].id = id;\r\n  }\r\n  \/* 2) GitHub-style callouts. *\/\r\n  var bqs = container.querySelectorAll('blockquote');\r\n  for(i = 0; i < bqs.length; i++){ transformCallout(bqs[i]); }\r\n  \/* 3) Syntax highlighting. *\/\r\n  if(window.hljs){\r\n    var codes = container.querySelectorAll('pre code');\r\n    for(i = 0; i < codes.length; i++){ try { hljs.highlightElement(codes[i]); } catch(e){} }\r\n  }\r\n}\r\n\r\nfunction compile(){\r\n  var out = g('mds-out');\r\n  out.innerHTML = toMarkup(ed.getValue());\r\n  out.className = g('s-theme').value;\r\n  out.style.fontSize = g('s-fs').value;\r\n  enhance(out);\r\n  if(window.MathJax && MathJax.typesetPromise) MathJax.typesetPromise([out]).catch(function(){});\r\n}\r\n\r\n\/* ---------- Editor helpers ---------- *\/\r\nfunction wrap(pre, suf, def){\r\n  var doc = ed.getDoc(), sel = doc.getSelection(), cur = doc.getCursor();\r\n  if(sel){ doc.replaceSelection(pre + sel + suf); }\r\n  else {\r\n    doc.replaceRange(pre + def + suf, cur);\r\n    if(def) doc.setSelection({line: cur.line, ch: cur.ch + pre.length}, {line: cur.line, ch: cur.ch + pre.length + def.length});\r\n  }\r\n  ed.focus();\r\n}\r\n\r\nfunction insertTOC(){\r\n  var lines = ed.getValue().split('\\n');\r\n  var items = [], i, inFence = false;\r\n  for(i = 0; i < lines.length; i++){\r\n    if(\/^\\s*```\/.test(lines[i])){ inFence = !inFence; continue; }\r\n    if(inFence) continue;\r\n    var m = lines[i].match(\/^(#{1,4})\\s+(.+?)\\s*#*\\s*$\/);\r\n    if(m){ items.push({ lvl: m[1].length, text: m[2].trim() }); }\r\n  }\r\n  if(!items.length){ toast('Add some headings first', true); return; }\r\n  var md = LT + 'div class=\"mds-toc\"' + GT + '\\n'\r\n    + LT + 'p class=\"mds-toc-title\"' + GT + icon('fas fa-list-ol') + ' Table of Contents' + CT + 'p' + GT + '\\n\\n';\r\n  for(i = 0; i < items.length; i++){\r\n    var indent = '';\r\n    if(items[i].lvl === 2) indent = '';\r\n    else if(items[i].lvl === 3) indent = '  ';\r\n    else if(items[i].lvl >= 4) indent = '    ';\r\n    if(items[i].lvl === 1) continue; \/* skip the document title *\/\r\n    md += indent + '- [' + items[i].text + '](#' + slugify(items[i].text) + ')\\n';\r\n  }\r\n  md += CT + 'div' + GT + '\\n\\n';\r\n  ed.setValue(md + ed.getValue());\r\n  ed.setCursor({ line: 0, ch: 0 });\r\n  compile();\r\n  toast('Table of contents inserted');\r\n}\r\n\r\nfunction toggleEditorFull(){\r\n  editorFull = !editorFull;\r\n  var body = g('mds-body');\r\n  body.classList.toggle('editor-full', editorFull);\r\n  g('b-expand-icon').className = editorFull ? 'fas fa-compress-alt' : 'fas fa-expand-alt';\r\n  g('b-expand-txt').textContent = editorFull ? 'Split View' : 'Editor';\r\n  setTimeout(function(){ ed.refresh(); }, 260);\r\n  toast(editorFull ? 'Editor expanded to full width' : 'Split view restored');\r\n}\r\n\r\n\/* ---------- Find & Replace ---------- *\/\r\nfunction buildRegex(global){\r\n  var term = g('mds-find-in').value;\r\n  if(!term) return null;\r\n  var flags = (global ? 'g' : '') + (g('mds-find-cs').checked ? '' : 'i');\r\n  if(g('mds-find-re').checked){\r\n    try { return new RegExp(term, flags); } catch(e){ toast('Invalid regex', true); return null; }\r\n  }\r\n  return new RegExp(term.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&'), flags);\r\n}\r\n\r\nfunction findNext(){\r\n  var re = buildRegex(false);\r\n  if(!re) return;\r\n  var text = ed.getValue();\r\n  re.lastIndex = 0;\r\n  var searchFrom = findPos;\r\n  var slice = text.slice(searchFrom);\r\n  var m = re.exec(slice);\r\n  if(!m && searchFrom > 0){ searchFrom = 0; slice = text; m = re.exec(slice); }\r\n  if(!m){ toast('No matches', true); g('mds-find-count').textContent = '0'; return; }\r\n  var start = searchFrom + m.index;\r\n  var end = start + m[0].length;\r\n  ed.setSelection(ed.posFromIndex(start), ed.posFromIndex(end));\r\n  ed.scrollIntoView({ from: ed.posFromIndex(start), to: ed.posFromIndex(end) }, 60);\r\n  findPos = end;\r\n  ed.focus();\r\n}\r\n\r\nfunction replaceOne(){\r\n  var sel = ed.getSelection();\r\n  if(sel){\r\n    var re = buildRegex(false);\r\n    if(re && re.test(sel)){\r\n      re.lastIndex = 0;\r\n      ed.replaceSelection(sel.replace(re, g('mds-rep-in').value));\r\n    }\r\n  }\r\n  findNext();\r\n}\r\n\r\nfunction replaceAll(){\r\n  var re = buildRegex(true);\r\n  if(!re) return;\r\n  var text = ed.getValue();\r\n  var count = (text.match(re) || []).length;\r\n  if(!count){ toast('No matches', true); return; }\r\n  ed.setValue(text.replace(re, g('mds-rep-in').value));\r\n  findPos = 0;\r\n  compile();\r\n  toast(count + ' replacement' + (count > 1 ? 's' : '') + ' made');\r\n}\r\n\r\nfunction toggleFind(show){\r\n  var p = g('mds-find');\r\n  var open = (typeof show === 'boolean') ? show : !p.classList.contains('open');\r\n  p.classList.toggle('open', open);\r\n  if(open){ findPos = 0; g('mds-find-in').focus(); }\r\n  else { ed.focus(); }\r\n}\r\n\r\n\/* ---------- Exports ---------- *\/\r\nfunction buildPrintRoot(){\r\n  var ex = g('mds-print-root');\r\n  if(ex) ex.parentNode.removeChild(ex);\r\n\r\n  var theme = g('s-theme').value, fs = g('s-fs').value;\r\n  var meta = activeDoc().meta || {};\r\n  var cover = '';\r\n  if(meta.cover && meta.title){\r\n    cover = LT + 'div class=\"mds-cover\"' + GT\r\n      + LT + 'h1 class=\"mds-cover-title\"' + GT + escHtml(meta.title) + CT + 'h1' + GT\r\n      + (meta.author ? LT + 'div class=\"mds-cover-author\"' + GT + escHtml(meta.author) + CT + 'div' + GT : '')\r\n      + (meta.date ? LT + 'div class=\"mds-cover-date\"' + GT + escHtml(meta.date) + CT + 'div' + GT : '')\r\n      + CT + 'div' + GT;\r\n  }\r\n\r\n  var root = document.createElement('div');\r\n  root.id = 'mds-print-root';\r\n  var inner = document.createElement('div');\r\n  inner.className = 'pb-body' + (theme ? ' ' + theme : '');\r\n  inner.style.fontSize = fs;\r\n  inner.innerHTML = cover + toMarkup(ed.getValue());\r\n  enhance(inner);\r\n  root.appendChild(inner);\r\n  document.body.appendChild(root);\r\n  return { root: root, inner: inner };\r\n}\r\n\r\nfunction exportPDF(){\r\n  if(!ed.getValue().trim()) return toast('Document is empty!', true);\r\n  var fmt = g('s-fmt').value, ori = g('s-ori').value;\r\n  var built = buildPrintRoot();\r\n\r\n  var pss = g('mds-ps') || document.createElement('style');\r\n  pss.id = 'mds-ps';\r\n  pss.textContent = '@media print{ @page { size:' + fmt + ' ' + ori + '; margin:18mm 20mm; } @page { @bottom-right { content: counter(page); font-size:10px; color:#64748b; } } }';\r\n  document.head.appendChild(pss);\r\n\r\n  function doPrint(){\r\n    toast('Print dialog opening \\u2014 choose \"Save as PDF\"');\r\n    setTimeout(function(){\r\n      window.print();\r\n      setTimeout(function(){ if(built.root.parentNode) built.root.parentNode.removeChild(built.root); }, 1800);\r\n    }, 350);\r\n  }\r\n  if(window.MathJax && MathJax.typesetPromise){ MathJax.typesetPromise([built.inner]).then(doPrint).catch(doPrint); }\r\n  else { setTimeout(doPrint, 300); }\r\n}\r\n\r\nfunction wordCss(){\r\n  return \"body{font-family:Georgia,'Times New Roman',serif;font-size:12pt;line-height:1.5;color:#1e293b}\"\r\n    + \"h1,h2,h3,h4{font-family:'Segoe UI',Arial,sans-serif;color:#0f172a;font-weight:bold}\"\r\n    + \"h1{font-size:22pt;border-bottom:1.5pt solid #cccccc;padding-bottom:4pt}\"\r\n    + \"h2{font-size:17pt;border-bottom:.75pt solid #eeeeee;padding-bottom:3pt}h3{font-size:14pt}\"\r\n    + \"code{font-family:'Courier New',monospace;background:#f1f5f9;color:#be123c}\"\r\n    + \"pre{background:#f8fafc;border:.75pt solid #e2e8f0;padding:8pt;white-space:pre-wrap}\"\r\n    + \"blockquote{border-left:3pt solid #3b82f6;padding:4pt 10pt;color:#555555;background:#f8fafc}\"\r\n    + \".mds-callout{border-left:3pt solid #64748b;background:#f4f6f8;padding:8pt 12pt;margin-bottom:8pt}\"\r\n    + \".mds-callout-head{font-family:'Segoe UI',Arial,sans-serif;font-weight:bold;margin-bottom:3pt}\"\r\n    + \"table{border-collapse:collapse;width:100%}th,td{border:.75pt solid #cccccc;padding:5pt}\"\r\n    + \"th{background:#f2f2f2;font-weight:bold}img{max-width:100%}\"\r\n    + \".mds-cover{text-align:center;margin-bottom:24pt}.mds-cover-title{font-size:26pt}\";\r\n}\r\n\r\nfunction exportWord(){\r\n  if(!ed.getValue().trim()) return toast('Document is empty!', true);\r\n  var built = buildPrintRoot();\r\n  var bodyHtml = built.inner.innerHTML;\r\n  if(built.root.parentNode) built.root.parentNode.removeChild(built.root);\r\n  var pre = LT + 'html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns=\"http:\/\/www.w3.org\/TR\/REC-html40\"' + GT\r\n    + LT + 'head' + GT + LT + 'meta charset=\"utf-8\"' + GT\r\n    + LT + 'style' + GT + wordCss() + CT + 'style' + GT + CT + 'head' + GT + LT + 'body' + GT;\r\n  var post = CT + 'body' + GT + CT + 'html' + GT;\r\n  var blob = new Blob(['\\ufeff', pre + bodyHtml + post], { type: 'application\/msword' });\r\n  downloadBlob(blob, (docFileName() || 'document') + '.doc');\r\n  toast('Word file exported');\r\n}\r\n\r\nfunction exportText(){\r\n  var built = buildPrintRoot();\r\n  var text = built.inner.innerText || built.inner.textContent || '';\r\n  if(built.root.parentNode) built.root.parentNode.removeChild(built.root);\r\n  if(!text.trim()) return toast('Document is empty!', true);\r\n  downloadBlob(new Blob([text], { type: 'text\/plain' }), (docFileName() || 'document') + '.txt');\r\n  toast('Plain text exported');\r\n}\r\n\r\nfunction exportMD(){\r\n  var txt = ed.getValue();\r\n  if(!txt.trim()) return toast('Nothing to export', true);\r\n  downloadBlob(new Blob([txt], { type: 'text\/markdown' }), (docFileName() || 'document') + '.md');\r\n  toast('Saved as .md');\r\n}\r\n\r\nfunction docFileName(){\r\n  var meta = activeDoc().meta || {};\r\n  var base = (meta.title && meta.title.trim()) ? meta.title : activeDoc().name;\r\n  return slugify(base) || 'document';\r\n}\r\n\r\nfunction downloadBlob(blob, name){\r\n  var url = URL.createObjectURL(blob);\r\n  var a = document.createElement('a');\r\n  a.href = url; a.download = name;\r\n  document.body.appendChild(a); a.click(); document.body.removeChild(a);\r\n  setTimeout(function(){ URL.revokeObjectURL(url); }, 1000);\r\n}\r\n\r\n\/* ---------- Document setup ---------- *\/\r\nfunction openSetup(){\r\n  var meta = activeDoc().meta || {};\r\n  g('set-title').value = meta.title || '';\r\n  g('set-author').value = meta.author || '';\r\n  g('set-date').value = meta.date || '';\r\n  g('set-cover').checked = !!meta.cover;\r\n  g('mds-setup-overlay').classList.add('show');\r\n}\r\n\r\nfunction saveSetup(){\r\n  activeDoc().meta = {\r\n    title: g('set-title').value,\r\n    author: g('set-author').value,\r\n    date: g('set-date').value,\r\n    cover: g('set-cover').checked\r\n  };\r\n  persist();\r\n  g('mds-setup-overlay').classList.remove('show');\r\n  toast('Document setup saved');\r\n}\r\n\r\n\/* ---------- Menus ---------- *\/\r\nfunction closeAllMenus(){\r\n  var menus = document.querySelectorAll('.mds-menu-wrap');\r\n  for(var i = 0; i < menus.length; i++) menus[i].classList.remove('active');\r\n}\r\n\r\n\/* ---------- Init ---------- *\/\r\nfunction init(){\r\n  if(booted) return;\r\n  if(typeof CodeMirror === 'undefined'){ setTimeout(init, 200); return; }\r\n  booted = true;\r\n\r\n  if(typeof marked !== 'undefined') marked.setOptions({ breaks: true, gfm: true });\r\n\r\n  \/* Turndown for rich paste (HTML -> Markdown). *\/\r\n  if(typeof TurndownService !== 'undefined'){\r\n    tdService = new TurndownService({ headingStyle: 'atx', codeBlockStyle: 'fenced', bulletListMarker: '-' });\r\n    if(typeof turndownPluginGfm !== 'undefined'){ try { tdService.use(turndownPluginGfm.gfm); } catch(e){} }\r\n  }\r\n\r\n  loadState();\r\n\r\n  var ta = g('mds-raw');\r\n  ta.value = activeDoc().content || '';\r\n\r\n  ed = CodeMirror.fromTextArea(ta, { mode: 'markdown', theme: 'monokai', lineNumbers: true, lineWrapping: true, indentUnit: 2 });\r\n\r\n  setTimeout(function(){ ed.refresh(); compile(); stats(); renderDocList(); }, 150);\r\n\r\n  ed.on('change', function(){\r\n    g('mds-save').className = 'sg';\r\n    g('mds-save').innerHTML = icon('fas fa-pen') + ' Typing...';\r\n    stats();\r\n    clearTimeout(ctimer);\r\n    ctimer = setTimeout(function(){ compile(); save(); }, 430);\r\n  });\r\n\r\n  \/* Rich paste: convert pasted HTML to Markdown. *\/\r\n  ed.on('paste', function(cm, e){\r\n    if(!tdService || !e.clipboardData) return;\r\n    var html = e.clipboardData.getData('text\/html');\r\n    if(html && html.trim()){\r\n      e.preventDefault();\r\n      var md = tdService.turndown(html);\r\n      cm.replaceSelection(md);\r\n      toast('Pasted as Markdown');\r\n    }\r\n  });\r\n\r\n  document.addEventListener('keydown', function(e){\r\n    if(e.ctrlKey && !e.shiftKey && e.key === 'b'){ e.preventDefault(); wrap('**','**','Bold text'); }\r\n    if(e.ctrlKey && !e.shiftKey && e.key === 'i'){ e.preventDefault(); wrap('*','*','Italic text'); }\r\n    if(e.ctrlKey && !e.shiftKey && e.key === 's'){ e.preventDefault(); exportPDF(); }\r\n    if(e.ctrlKey && (e.key === 'h' || e.key === 'H')){ e.preventDefault(); toggleFind(); }\r\n    if(e.ctrlKey && e.key === 'Enter'){ e.preventDefault(); compile(); toast('Preview refreshed'); }\r\n    if(e.ctrlKey && e.shiftKey && (e.key === 'E' || e.key === 'e')){ e.preventDefault(); toggleEditorFull(); }\r\n    if(e.ctrlKey && e.shiftKey && (e.key === 'S' || e.key === 's')){ e.preventDefault(); exportMD(); }\r\n    if(e.key === 'Escape'){ closeAllMenus(); toggleFind(false); g('mds-setup-overlay').classList.remove('show'); }\r\n  });\r\n\r\n  g('b-expand').addEventListener('click', toggleEditorFull);\r\n\r\n  \/* Export menu *\/\r\n  g('ex-pdf').addEventListener('click', exportPDF);\r\n  g('ex-word').addEventListener('click', exportWord);\r\n  g('ex-txt').addEventListener('click', exportText);\r\n  g('ex-md').addEventListener('click', exportMD);\r\n\r\n  \/* Formatting buttons *\/\r\n  g('b-bold').addEventListener('click', function(){ wrap('**','**','Bold'); });\r\n  g('b-italic').addEventListener('click', function(){ wrap('*','*','Italic'); });\r\n  g('b-strike').addEventListener('click', function(){ wrap('~~','~~','Strikethrough'); });\r\n  g('b-h1').addEventListener('click', function(){ wrap('# ','','Heading 1'); });\r\n  g('b-h2').addEventListener('click', function(){ wrap('## ','','Heading 2'); });\r\n  g('b-h3').addEventListener('click', function(){ wrap('### ','','Heading 3'); });\r\n  g('b-ul').addEventListener('click', function(){ wrap('- ','','List item'); });\r\n  g('b-ol').addEventListener('click', function(){ wrap('1. ','','List item'); });\r\n  g('b-quote').addEventListener('click', function(){ wrap('> ','','Quote text'); });\r\n  g('b-link').addEventListener('click', function(){\r\n    promptDialog('Insert Link', 'Enter the URL for this link:', 'https:\/\/', 'Insert', function(url){\r\n      if(url) wrap('[','](' + url + ')','link text');\r\n    });\r\n  });\r\n  g('b-code').addEventListener('click', function(){ wrap('```\\n','\\n```','code here'); });\r\n  g('b-math').addEventListener('click', function(){ wrap('\\n$$ ',' $$\\n','E = mc^2'); });\r\n  g('b-table').addEventListener('click', function(){ wrap('\\n| Header 1 | Header 2 | Header 3 |\\n| :------- | :------: | -------: |\\n| Cell 1   | Cell 2   | Cell 3   |\\n','',''); });\r\n  g('b-toc').addEventListener('click', insertTOC);\r\n  g('b-find').addEventListener('click', function(){ toggleFind(); });\r\n  g('b-pb').addEventListener('click', function(){ wrap('\\n' + LT + 'div class=\"pb\"' + GT + CT + 'div' + GT + '\\n','',''); toast('Page break inserted'); });\r\n\r\n  \/* Menu toggling *\/\r\n  var menuWraps = document.querySelectorAll('.mds-menu-wrap');\r\n  for(var i = 0; i < menuWraps.length; i++){\r\n    menuWraps[i].addEventListener('click', function(e){\r\n      e.stopPropagation();\r\n      var isActive = this.classList.contains('active');\r\n      closeAllMenus();\r\n      if(!isActive) this.classList.add('active');\r\n    });\r\n  }\r\n  document.addEventListener('click', closeAllMenus);\r\n\r\n  \/* File menu *\/\r\n  g('mi-new').addEventListener('click', function(){\r\n    confirmDialog('New Document', 'Create a new blank document? Your current document stays saved in Docs.', 'Create', function(){ newDoc(); });\r\n  });\r\n  g('mi-clear').addEventListener('click', function(){\r\n    confirmDialog('Clear Document', 'Clear all text in this document? This cannot be undone.', 'Clear All', function(){\r\n      ed.setValue(''); ed.clearHistory(); compile(); save(); toast('Document cleared');\r\n    }, true);\r\n  });\r\n  g('mi-save-md').addEventListener('click', exportMD);\r\n  g('mi-import').addEventListener('click', function(){ g('md-inp').click(); });\r\n  g('mi-setup').addEventListener('click', openSetup);\r\n\r\n  \/* Docs menu *\/\r\n  g('doc-new').addEventListener('click', function(e){ e.stopPropagation(); newDoc(); });\r\n  g('doc-rename').addEventListener('click', function(e){ e.stopPropagation(); renameDoc(); });\r\n  g('doc-delete').addEventListener('click', function(e){ e.stopPropagation(); deleteDoc(); });\r\n\r\n  \/* Insert menu *\/\r\n  g('mi-img').addEventListener('click', function(){ g('img-inp').click(); });\r\n  g('b-img-btn').addEventListener('click', function(){ g('img-inp').click(); });\r\n  g('mi-table').addEventListener('click', function(){ g('b-table').click(); });\r\n  g('mi-math').addEventListener('click', function(){ g('b-math').click(); });\r\n  g('mi-toc').addEventListener('click', insertTOC);\r\n  g('mi-callout').addEventListener('click', function(){ wrap('\\n> [!NOTE]\\n> ','','Your note here'); toast('Callout inserted'); });\r\n  g('mi-pb').addEventListener('click', function(){ g('b-pb').click(); });\r\n\r\n  \/* Templates *\/\r\n  var tplBtns = document.querySelectorAll('.tpl-btn');\r\n  for(var j = 0; j < tplBtns.length; j++){\r\n    tplBtns[j].addEventListener('click', function(){\r\n      var key = this.getAttribute('data-tpl');\r\n      if(TEMPLATES[key]){\r\n        confirmDialog('Load Template', 'Load this template? Current text will be replaced.', 'Load', function(){\r\n          ed.setValue(TEMPLATES[key]); ed.clearHistory(); compile(); save(); toast('Template loaded');\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  \/* Find & Replace handlers *\/\r\n  g('mds-find-next').addEventListener('click', findNext);\r\n  g('mds-rep-one').addEventListener('click', replaceOne);\r\n  g('mds-rep-all').addEventListener('click', replaceAll);\r\n  g('mds-find-x').addEventListener('click', function(){ toggleFind(false); });\r\n  g('mds-find-in').addEventListener('keydown', function(e){ if(e.key === 'Enter'){ e.preventDefault(); findNext(); } });\r\n  g('mds-find-in').addEventListener('input', function(){ findPos = 0; });\r\n\r\n  \/* Document setup modal *\/\r\n  g('set-save').addEventListener('click', saveSetup);\r\n  g('set-cancel').addEventListener('click', function(){ g('mds-setup-overlay').classList.remove('show'); });\r\n\r\n  \/* File inputs *\/\r\n  g('img-inp').addEventListener('change', function(e){\r\n    var f = e.target.files[0]; if(!f) return;\r\n    if(f.size > 3 * 1024 * 1024){ toast('Image too large (max 3MB)', true); this.value = ''; return; }\r\n    var r = new FileReader();\r\n    r.onload = function(ev){ wrap('\\n![' + f.name + '](' + ev.target.result + ')\\n','',''); toast('Image embedded'); };\r\n    r.readAsDataURL(f); this.value = '';\r\n  });\r\n  g('md-inp').addEventListener('change', function(e){\r\n    var f = e.target.files[0]; if(!f) return;\r\n    var r = new FileReader();\r\n    r.onload = function(ev){ ed.setValue(ev.target.result); toast('File imported'); };\r\n    r.readAsText(f); this.value = '';\r\n  });\r\n\r\n  g('s-theme').addEventListener('change', compile);\r\n  g('s-fs').addEventListener('change', compile);\r\n\r\n  \/* Preview fullscreen *\/\r\n  g('b-fs').addEventListener('click', function(){\r\n    var body = g('mds-body');\r\n    body.classList.toggle('is-fs');\r\n    if(body.classList.contains('is-fs')){\r\n      body.style.position = 'fixed'; body.style.top = '0'; body.style.left = '0';\r\n      body.style.width = '100vw'; body.style.height = '100vh'; body.style.zIndex = '999990'; body.style.borderRadius = '0';\r\n      document.body.style.overflow = 'hidden';\r\n      this.innerHTML = icon('fas fa-compress') + ' Exit FS';\r\n    } else {\r\n      body.style.position = ''; body.style.top = ''; body.style.left = '';\r\n      body.style.width = ''; body.style.height = ''; body.style.zIndex = ''; body.style.borderRadius = '';\r\n      document.body.style.overflow = 'auto';\r\n      this.innerHTML = icon('fas fa-expand') + ' Fullscreen';\r\n    }\r\n    setTimeout(function(){ ed.refresh(); }, 300);\r\n  });\r\n\r\n  \/* Resizer *\/\r\n  var res = g('mds-resizer');\r\n  res.addEventListener('mousedown', function(e){ e.preventDefault(); isRes = true; res.classList.add('active'); document.body.style.cursor = 'col-resize'; });\r\n  document.addEventListener('mousemove', function(e){\r\n    if(!isRes) return;\r\n    var rect = g('mds-body').getBoundingClientRect();\r\n    if(window.innerWidth > 860){\r\n      var pct = ((e.clientX - rect.left) \/ rect.width) * 100;\r\n      pct = Math.max(20, Math.min(80, pct));\r\n      g('mds-L').style.flexBasis = pct + '%';\r\n      g('mds-R').style.flexBasis = (100 - pct) + '%';\r\n    }\r\n    e.preventDefault();\r\n  });\r\n  document.addEventListener('mouseup', function(){ if(isRes){ isRes = false; res.classList.remove('active'); document.body.style.cursor = ''; ed.refresh(); } });\r\n}\r\n\r\nif(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); }\r\nelse { setTimeout(init, 10); }\r\n})();\r\n<\/script>\n\n\n\n<style>\n.pth-feature-wrap { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 30px; }\n.pth-feat-box { border: 1px solid #e2e8f0; background: #ffffff; padding: 24px; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.02); transition: all 0.3s ease; }\n.pth-feat-box:hover { border-color: #bfdbfe; transform: translateY(-3px); box-shadow: 0 10px 15px -3px rgba(0,0,0,0.05); }\n.pth-feat-title { font-size: 1.1rem; font-weight: 800; color: #0f172a; margin-bottom: 10px; display: flex; align-items: center; gap: 10px; }\n.pth-feat-text { font-size: 0.9rem; color: #475569; line-height: 1.6; margin: 0; }\n.pth-steps-wrap { border: 1px solid #e2e8f0; background: #ffffff; padding: 40px 30px; border-radius: 16px; text-align: center; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.02); margin-bottom: 40px; }\n.pth-steps-title { font-size: 1.2rem; font-weight: 800; color: #1e293b; text-transform: uppercase; margin-bottom: 35px; letter-spacing: 1px; }\n.pth-steps-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 30px; }\n.pth-step-item { display: flex; flex-direction: column; align-items: center; }\n.pth-step-num { width: 45px; height: 45px; background: #3b82f6; color: #ffffff; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 800; font-size: 1.2rem; margin-bottom: 15px; box-shadow: 0 4px 10px rgba(59,130,246,0.3); }\n.pth-step-name { font-weight: 800; color: #0f172a; margin-bottom: 8px; font-size: 1.05rem; }\n.pth-step-desc { font-size: 0.9rem; color: #64748b; line-height: 1.5; margin: 0; }\n<\/style>\n<div class=\"pth-feature-wrap\">\n    <div class=\"pth-feat-box\">\n        <div class=\"pth-feat-title\">\ud83d\udfe2 Abstract Syntax Parsing<\/div>\n        <p class=\"pth-feat-text\">The internal compiler tokenizes the raw text strings locally, translating markdown notation into structurally compliant HTML nodes inside your browser memory.<\/p>\n    <\/div>\n    <div class=\"pth-feat-box\">\n        <div class=\"pth-feat-title\">\ud83d\udd35 Dynamic DOM Painting<\/div>\n        <p class=\"pth-feat-text\">The engine recalculates the visual output synchronously as you type, rendering specific CSS typographical themes like GitHub or Modern Clean immediately.<\/p>\n    <\/div>\n    <div class=\"pth-feat-box\">\n        <div class=\"pth-feat-title\">\ud83d\udfe3 Client-Side Serialization<\/div>\n        <p class=\"pth-feat-text\">This Markdown to PDF Converter bypasses server interactions completely, mapping the generated HTML5 canvas directly into a downloadable binary blob array.<\/p>\n    <\/div>\n<\/div>\n<div class=\"pth-steps-wrap\">\n    <div class=\"pth-steps-title\">How to Compile Text with the Markdown to PDF Converter<\/div>\n    <div class=\"pth-steps-grid\">\n        <div class=\"pth-step-item\">\n            <div class=\"pth-step-num\">1<\/div>\n            <div class=\"pth-step-name\">Inject Syntax Buffer<\/div>\n            <p class=\"pth-step-desc\">Enter your raw text into the CodeMirror editor or upload an existing file directly into the local memory stack.<\/p>\n        <\/div>\n        <div class=\"pth-step-item\">\n            <div class=\"pth-step-num\">2<\/div>\n            <div class=\"pth-step-name\">Define Output Geometry<\/div>\n            <p class=\"pth-step-desc\">Select the exact physical page dimensions, choosing between A4, Letter, or Legal sizing parameters.<\/p>\n        <\/div>\n        <div class=\"pth-step-item\">\n            <div class=\"pth-step-num\">3<\/div>\n            <div class=\"pth-step-name\">Apply Typography<\/div>\n            <p class=\"pth-step-desc\">Instruct the Markdown to PDF Converter to apply your preferred CSS theme to the structural elements.<\/p>\n        <\/div>\n        <div class=\"pth-step-item\">\n            <div class=\"pth-step-num\">4<\/div>\n            <div class=\"pth-step-name\">Extract Binary File<\/div>\n            <p class=\"pth-step-desc\">Trigger the rendering protocol to download the compiled high-resolution document locally.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n\n\n<div id=\"start-seo-article\"><\/div>\n\n\n\n<h2 id=\"\ud83d\udfe5-textual-compilation-with-a-markdown-to-pdf-converter\" class=\"wp-block-heading\">\ud83d\udfe5 Textual Compilation with a Markdown to PDF Converter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Software documentation and technical writing require highly structured syntax processing to generate readable output formats. A Markdown to PDF Converter operates as a specialized local compiler that bridges raw string characters with finalized binary document arrays. By executing a Markdown to PDF Converter, engineers and writers can write natively in plain text while algorithmically generating correctly formatted, print-ready documents without needing complex word-processing applications.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe7-abstract-syntax-trees-and-dom-painting\" class=\"wp-block-heading\">\ud83d\udfe7 Abstract Syntax Trees and DOM Painting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When inputting characters into the editor block, the system does not merely apply visual styles. The internal Marked.js engine parses the string, breaking it into an abstract syntax tree of headers, paragraphs, and code blocks. The Markdown to PDF Converter maps these tokens into actual Document Object Model (DOM) elements simultaneously. This execution loop happens completely offline, meaning the live preview pane updates in milliseconds without generating external HTTP requests.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udfe2 Code blocks calculate syntax highlighting parameters mathematically before rendering the background boundaries.<\/li>\n\n\n\n<li>\ud83d\udd35 The user specifies exact orientation vectors, instructing the compiler to structure the matrix for portrait or landscape rendering.<\/li>\n\n\n\n<li>\ud83d\udfe3 CSS overriding logic forces the DOM to apply specific typographical spacing rules, such as GitHub&#8217;s standard padding variables.<\/li>\n\n\n\n<li>\ud83d\udfe4 Local processing isolates the text strings entirely within the active browser tab.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"\ud83d\udfe8-buffer-serialization-and-cryptographic-privacy\" class=\"wp-block-heading\">\ud83d\udfe8 Buffer Serialization and Cryptographic Privacy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Transferring proprietary company documentation or confidential legal notes to external rendering APIs creates extreme data vulnerability. Therefore, this Markdown to PDF Converter secures your textual data by running the HTML2PDF scripts entirely on the client side. The compiler translates the painted DOM into an HTML5 Canvas, converts that canvas into a highly compressed JPEG matrix, and serializes the array into a final PDF blob directly inside your local volatile memory.<\/p>\n\n\n\n<h2 id=\"\ud83d\udfe9-typographic-standards-and-extensibility\" class=\"wp-block-heading\">\ud83d\udfe9 Typographic Standards and Extensibility<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Understanding lightweight markup languages fundamentally improves development velocity. For an academic overview of the syntax structures powering these parsing algorithms, developers should read the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Markdown\" target=\"_blank\" rel=\"noreferrer noopener\">Wikipedia documentation on Markdown<\/a>. If your technical writing pipeline demands additional offline syntax adjustments before serialization, you can systematically browse the <a href=\"https:\/\/schoolict.net\/tools\/free-web-tools-directory-prime-tool-hub\/\">Prime Tool Hub directory<\/a> to locate integrated text formatters alongside this Markdown to PDF Converter.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Markdown to PDF Converter Convert Markdown to PDF instantly with our free offline converter. Write in Markdown, preview the live A4 page, and download a styled PDF securely. \ud83d\udfe2 Abstract Syntax Parsing The internal compiler tokenizes the raw text strings locally, translating markdown notation into structurally compliant HTML nodes inside your browser memory. \ud83d\udd35 Dynamic &#8230; <a title=\"Markdown to PDF Converter\" class=\"read-more\" href=\"https:\/\/schoolict.net\/tools\/markdown-to-pdf-converter\/\" aria-label=\"Read more about Markdown to PDF Converter\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":3460,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-825","page","type-page","status-publish","has-post-thumbnail"],"_links":{"self":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/comments?post=825"}],"version-history":[{"count":2,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/825\/revisions"}],"predecessor-version":[{"id":6978,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/pages\/825\/revisions\/6978"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media\/3460"}],"wp:attachment":[{"href":"https:\/\/schoolict.net\/tools\/wp-json\/wp\/v2\/media?parent=825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}