Jump to content

MarkdownImporter – Convert uploaded .md files to HTML Repeater items


Recommended Posts

Posted

Hey everyone,
on a recent client project we had to deal with a large number of Markdown files that needed to end up as regular HTML content on ProcessWire pages. Converting them manually or piping them through external tools wasn't an option – too many files, too tedious, and the content had to be stored as actual HTML in rich textfields, not just formatted at runtime.
So we built a small module that handles this directly inside ProcessWire.

How it works
The module creates a file upload field (md_import_files) and a Repeater field (md_import_items) with a standard title field and a richtext body field (md_import_body) inside. The body field automatically uses TinyMCE if installed, otherwise CKEditor. You add both fields (md_import_files,md_import_items) to any template, upload your .md files, hit save – each file gets converted to HTML via PW's core TextformatterMarkdownExtra and stored as a separate Repeater item. The source filename goes into the items title, processed files are removed from the upload automatically.

Template output
The Repeater items are regular PW pages, so output is straightforward:

foreach ($page->md_import_items as $item) {
    echo "<section>";
    echo "<h2>{$item->title}</h2>";
    echo "<div>{$item->md_import_body}</div>";
    echo "</section>";
}

Tag mappings
One thing we needed right away: control over how certain Markdown elements end up in HTML. For example, #headings in Markdown become <h1> – but on most websites <h1> is reserved for the page title. The module has a simple config (Modules → Configure → Markdown Importer) where you define tag mappings, one per line:

h1:h2
h2:h3
strong:b
blockquote:aside
hr:br

This performs a simple 1:1 tag replacement after conversion, preserving all attributes. Works well for standalone or equivalent elements like headings, inline formatting, blockquotes, or void elements like hr:br. Note that it doesn't handle nested structures – mapping table:ul for example would only replace the outer <table> tag while leaving thead, tr, td etc. untouched.

Requirements

  • ProcessWire 3.0.0+
  • FieldtypeRepeater (core)
  • TextformatterMarkdownExtra (core)

GitHub: github.com/frameless-at/MarkdownImporter
Modules Directory: https://processwire.com/modules/markdown-importer/

Happy to hear if anyone finds this useful or has suggestions for improvements.
Cheers, Mike

  • Like 4

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...