Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MDR, a markdown runner

LinuxMacOsWindowsLine Count

mdr is a smallprogram and markup designed to facilitate documentation and testing. It can both generate documentation pages and generate and actualaly test small code examples in your documentation. (This ensures any code examples you present to your users actually work.)

logo

I started this tool to help with Gwion's development, but it is not tied in any way to this project.

Let's go over the basic functionality... 😄

How to write documentation pages with mdr

For how to do a basic documentation page, see this page's original source.

How to write code examples with mdr

Let's write our first code example created from our documentation page, which also shows off templating and how to have the code automatically compiled and tested.

Define a program structure

hello_world.c

@[[ Includes ]]
intmain(intargc, char**argv) {
@[[ Print ]]
}

We fill in the Includes template variable as follows:

Filling in template variables

As we need the puts function, we need stdio headers.

Includes

#include <stdio.h>

We also fill in the print function we use above:

Print

puts("Hello, World!");

Compiling the example code

Now, let's compile hello_world.c to make sure this test code owrks.

exec: cc hello_world.c -o hello_world

Yes, there should be no output, and that's good news since that means no compilation errors.

Including a code file or other output

Let's look at hello_world.c:

exec: cat hello_world.c

#include <stdio.h>
int main(int argc, char** argv) {
puts("Hello, World!");
}

That's the content of the source file we generated (and compiled). You can see how this can be used for arbitrary shell commands to generate output.

Testing example code

Then we run our test program:

exec: ./hello_world

Hello, World!

Do we read Hello World! ? Assuming yes, let's continue.

More test

exec: [ "$(./hello_world)" = "Hello, World!" ] && echo "OK" || echo "NOT_OK"

OK

Building mdr

As a C program, it seemed natural to use make as a build system.

make

Testing mdr

Also using make:

make test

You can also try

bash scripts/test.sh

Installing mdr

As easy as before, just type.

make install

or just copy mdr somewhere in your path.

Using mdr

To generate this doc page itself, use this command in the repository root:

mdr README.mdr

generated from this file

About

MDR, the markdown runner

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages