=== Marklane - Publish Markdown without the post editor. ===
Contributors: cck23
Tags: markdown, import, importer, frontmatter, mermaid
Requires at least: 5.6
Tested up to: 7.0
Requires PHP: 8.0
Stable tag: 1.6.4
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Turn Markdown drafts into WordPress posts with titles, categories, images, and publish status set in one workflow—without opening the post editor.

== Description ==

Turn a Markdown draft into a ready-to-publish WordPress post **without opening the post editor**.

Select a Markdown file and set the title, categories, tags, publish status, date, and featured image in one workflow. Then **publish or update the post without opening the WordPress post editor**. Marklane keeps your writing in Markdown and handles the WordPress publishing details for you.

Use **Dry Run** to check the planned changes before saving. **Re-import** the same source to update an existing post by slug instead of creating a duplicate.

Use YAML frontmatter when you want control over the post. Marklane can apply the title, slug, post type, status, date, categories, tags, featured image, and Polylang language links in one import. When frontmatter is omitted, it derives the title from the first H1 or filename and the slug from the filename.

Re-import the same Markdown source as your draft evolves. Marklane matches an existing post by slug instead of creating duplicates, so your local writing workflow and your WordPress publishing workflow can work together.

For the complete workflow and examples, see the [Marklane guide](https://happas.jp/en/marklane/).

Publish faster:

* **One-workflow post setup:** set the title, slug, status, date, categories, tags, featured image, and language links from Markdown frontmatter
* **Dry Run preview:** review the planned create/update action, taxonomy assignment, image resolution, warnings, and errors before saving
* **Publish or update without the post editor:** create a new post or update an existing post by slug
* Media Library image resolution: resolve relative Markdown image paths and `featuredImage` against existing attachments
* Polylang support: connect translated posts from `lang` and `translations` frontmatter
* Markdown-first publishing: import prepared Markdown files from the WordPress admin

Optional enhancements:

* Mermaid rendering: turn ` ```mermaid ` code blocks into front-end diagrams when enabled
* Extended Markdown: render common callout syntax such as GitHub alerts and Zenn messages when enabled
* Math rendering: render `$$...$$` display formulas when enabled
* Light front-end loading: Mermaid and math assets load only on pages that contain matching content
* CommonMark + GFM conversion: parse Markdown with `league/commonmark`

Marklane is a good fit when:

* articles are written locally in Markdown
* WordPress is used as the publishing destination
* editors want to keep the source file manageable inside WordPress
* repeated imports and post updates are part of the workflow

Frontmatter quick reference:

Marklane reads YAML frontmatter at the top of the Markdown file. Common keys include:

* `title`
* `slug`
* `postType`
* `excerpt`
* `status`
* `date`
* `category`
* `tags`
* `featuredImage`
* `lang`
* `translations`

`title` falls back to the first H1 and then the filename. `slug` falls back to the filename. `postType` defaults to `post`, and `status` defaults to `draft`.

For more frontmatter keys and examples, see the [frontmatter guide](https://happas.jp/en/marklane/#yaml-frontmatter-example).

Known limitations:

* Does not create custom post types or taxonomy definitions
* Does not import ZIP archives
* Does not import through REST API or WP-CLI
* Does not download external image URLs automatically

== Installation ==

1. In the WordPress admin screen, go to `Plugins > Add New`.
2. Search for `Marklane`.
3. Click `Install Now`, then activate the plugin.
4. Open `Tools > Marklane`.
5. Upload a Markdown file or select one from the Media Library.
6. Run a dry run to preview the result.
7. Run the import to create or update the post.

If you prefer manual installation, upload the plugin folder to `/wp-content/plugins/` and activate it from the `Plugins` screen.

== Frequently Asked Questions ==

= What can I set with frontmatter? =

You can set values such as:

* `title`
* `slug`
* `postType`
* `excerpt`
* `status`
* `date`
* `category`
* `tags`
* `featuredImage`
* `lang`
* `translations`

`postType` defaults to `post`. Public registered post types are allowed by default, except attachments. Site-specific overrides can be applied with the `marklane_whitelist` filter.
If `title` is omitted, Marklane uses the first H1 and then the filename. If `slug` is omitted, Marklane derives it from the filename.

= Can it update an existing post? =

Yes.

The plugin matches an existing post by `slug + post_type`, or by `slug + post_type + lang` when Polylang is in use.

= What does Dry Run show? =

Dry Run shows the planned action before saving anything, including:

* whether the import will create a new post or update an existing one
* which existing post was matched
* taxonomy assignment results
* relative image and `featuredImage` resolution
* warnings and errors raised during the import

= How are images resolved? =

Relative image paths are resolved against Media Library images in the same directory as the selected Markdown attachment.
When Markdown and supporting images are uploaded together, the supporting images are stored as flat Media Library files, so nested folder paths are not preserved.

The `featuredImage` frontmatter field follows the same rule and sets the post thumbnail when the target image is already registered in the Media Library. If [FIFU](https://wordpress.org/plugins/featured-image-from-url/) is active, `featuredImage` can also point to an external URL.

For more predictable results, use fully unique filenames and, if possible, disable WordPress's year/month based upload folders before uploading the Markdown file and related images.

= Can I enable Japanese strong-emphasis compatibility behavior? =

Yes. Marklane keeps `league/commonmark` as the Markdown converter and uses strict CommonMark behavior by default. If your Japanese writing workflow needs text such as `**「text」**続き` to render as strong text, enable the CJK compatibility pass:

`add_filter('marklane_enable_markdown_compatibility_preprocessing', '__return_true');`

Advanced sites can replace the matching pattern with the `marklane_markdown_compatibility_strong_boundary_pattern` filter. For example, use a custom pattern for Japanese quoted text followed by a letter or number.

= Can it render Mermaid diagrams? =

Yes, optionally.

Enable Mermaid rendering from `Tools > Marklane`, and Marklane will load the diagram renderer only on front-end pages that contain `language-mermaid` code blocks. The post content is still stored as a normal fenced code block, so disabling the option simply returns the front end to plain code blocks. Advanced sites can replace the script URL with the `marklane_mermaid_script_src` filter.

= Can it render GitHub alerts or Zenn-style callouts? =

Yes, optionally.

Enable Extended Markdown from `Tools > Marklane`, and Marklane will render common callout syntax such as GitHub / Obsidian / GitLab blockquote alerts. Zenn / Docusaurus / Quarto `:::` callouts are normalized during import, then enhanced on the front end. `:::details` is rendered as a native collapsible details element without JavaScript. External embed syntax such as tweets, cards, or videos is not expanded. Advanced sites can limit enabled normalization profiles with the `marklane_extended_markdown_profiles` filter.

= Can it render math formulas? =

Yes, optionally. Enable Math rendering from `Tools > Marklane`, and Marklane will render display formulas written as `$$...$$` only on front-end pages that contain math blocks. Inline math is not expanded. Under the hood, Marklane converts formulas to browser-native MathML with a bundled local renderer.

= Can my theme override these styles? =

Yes. Extended Markdown callouts, Mermaid rendering, and Math rendering use ordinary HTML and CSS classes, so themes can override them with their own CSS. Marklane outputs classes such as `marklane-callout`, `marklane-rendered-block`, `marklane-mermaid`, `marklane-math`, and `marklane-math-display`. Each callout type exposes one color variable, such as `--marklane-callout-color-note` or `--marklane-callout-color-warning`; Marklane derives its background and border colors with `color-mix()`.

= Does it work with Polylang? =

Yes.

When Polylang is active, you can use `lang` and `translations` in frontmatter to connect translated posts.

== Screenshots ==

1. Import screen with Markdown upload, related image selection, post status options, Dry Run, and import controls.

== Changelog ==

= 1.6.4 =
* Improve existing-post matching and restoration during re-imports.
* Strengthen validation when resolving supplementary images and media.

= 1.6.3 =
* Improve script loading reliability.
* Improve Mermaid and math rendering reliability.
* Strengthen permission checks during imports.
* Strengthen relative media path validation.

= 1.6.2 =
* Load Extended Markdown assets only on pages that contain callouts.
* Fix callout detection so markers outside blockquotes do not trigger unnecessary assets.

For the complete release history, see the [Marklane changelog](https://happas.jp/en/marklane/changelog/).
