You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
GFM alerts ↔ org special blocks: > [!NOTE] ↔ #+begin_note, a
title on the marker line ↔ the block's parameters
(> [!TIP] Stretch first ↔ #+begin_tip Stretch first). A query
block, and a type Obsidian's callouts read otherwise (a.b), stay
org text; Logseq md keeps writing special blocks as org does.
Obsidian md writes an alert as a callout, its type lower case
(> [!note]), and keeps a callout's fold as the block's parameters'
leading token (> [!tip]- T ↔ #+begin_tip - T).
The docs are on the site: docs/ and CONTEXT.md render as pages under /docs/, listed on a generated index linked from every page's nav
(ADR 0009); a link between docs stays on the site, and code is
highlighted in binarypoetry.ch's colors. The text keeps VitePress's
reading width, about 90 characters a line, and on a wide screen a
page's sections are listed beside it, the one being read marked,
and on a wider one every doc.
The Web UI lists the licenses of the third-party packages it is
built from, runtime and development, on a licenses page
(licenses.html), with each package's license text (ADR 0008),
linked from the footer of the landing and converter pages.
An image's size has a Spelling, images (ADR 0007): "html"
writes an image link sized by #+ATTR_HTML: :width/:height as <img src alt width height> and reads that <img> back; under "markdown", the default, the attribute line stays verbatim.
Obsidian md reads an image's size (, |300x200) as its #+ATTR_HTML: :width/:height line and writes
it back, for an image alone in its paragraph outside a list;
translating Obsidian md to or from Vanilla md turns one into the
other. An embed's size (![[image.png|300]]) stays as written.
Logseq's image size ([[image.png]]{:width 300}, in Logseq md {:width 300}, :height too) is the image's #+ATTR_HTML: line in Vanilla org and back, for an image line below
a block's title that is a paragraph of its own. A block's title is
a headline, which org cannot size, so a title image keeps its size.
Changed
Breaking: options are named by format and side (ADR 0007). The
config's [markdownToOrg] and [orgToMarkdown] sections are gone,
with an error naming their replacements: [markdown], [markdown.input], [markdown.output] and [org.output]. markdownStyle is [markdown.output.style], recordStyle is [org.output] recordMarkdownStyle (CLI --record-markdown-style),
and the library options are renamed to match (style, recordMarkdownStyle).
Breaking:useHtml and interpretHtml give way to a Spelling
per construct (definitionList, underline, superscript, subscript): "markdown" or "html", set for both sides in [markdown] or per side. The library's spelling and per-construct interpretHtml replace them; CLI --html replaces --interpret-html and sets both sides.
Breaking: org descriptive lists are written as Markdown
definition lists (term / : definition) rather than as their
org text (- term :: definition), and read back from them. A
Markdown list item holding :: stays a list item, and a
fixed-width line's : is escaped (\: text), as a line below text
that starts with a colon now starts a definition. A descriptive list
nested in a list item does not survive a round trip as one (a known
limitation of the Markdown parser): it comes back as the item's text.
Translating Markdown honours the Markdown options, as normalizing
does: a block holding a construct they concern is converted on its
own, in the Spelling they name; the rest stays as written.
The Web UI's options are grouped by the side they act on, showing
only those of the sides the conversion has (normalizing Org goes
through Markdown, so its HTML options show too), and a compact table
sets each construct's HTML reading and Spelling.
The Web UI's demos show a special block as a GFM alert and a link to
a headline, and Obsidian Markdown has its own demo: wikilinks, a
callout, an image's size and a task.
The Web UI's landing page keeps its text to the docs' reading width,
about 90 characters a line, centered as the docs' text is, and lists
what morg does in four points instead of one long paragraph; the
detail is in the docs.
The Web UI and the docs draw arrows (→, ↔) outside code in
DejaVu Sans, subset to them, centered on the lowercase letters:
Arial's sat low and small beside them. DejaVu's license is on the
licenses page.
Logseq org and Logseq md write a block's begin and end lines in
upper case (#+BEGIN_SRC sh, #+END_QUOTE), as Logseq does; org →
md → org changed them to Emacs's lower case (#+begin_src), a
special block's to mixed case (#+begin_TIP). Vanilla org keeps
lower case.
Fixed
Obsidian md → org reads a %%comment%% as an org comment (# …)
alone in its paragraph, else as an html snippet
(@@html:<!--comment-->@@), and an inline footnote ^[note] as a
footnote, numbered on from the page's own; both were plain text,
and the footnote came back escaped (^\[note]), no footnote in
Obsidian. Org → md writes an inline comment as Obsidian's own
(%%comment%%), others as an HTML comment, and a footnote. Md → org
and Obsidian md → Vanilla md read no comment in a wikilink or a diary
timestamp's <%%(.
Two quotes next to each other in a list item or a definition stay
two: Markdown read them, written without a blank line between them,
as one.
A special block's parameters (#+begin_tip Stretch first) survive
org → md: uniorg reads and writes none, so they were dropped without
a warning; morg reads them from the block's begin line.
An org descriptive list no definition list can hold (an item with a
checkbox, or without a term) survives a round trip again: its - term :: definition text is written below a <!-- morg_descriptive_list --> comment, which reads it back as
descriptive; it came back a plain list.
Spelled in HTML, such a list is written the same way: as a <dl>, it
lost its checkboxes and gained empty terms. So is one whose
definition holds blocks (an image, a nested list, a second
paragraph), which a <dl> dropped.
Reading <sup> or <sub> as org (interpretHtml) keeps the HTML
where a blank precedes it (x <sup>s</sup>): org reads a script
only after a non-blank character, so it came back as the text ^{s}.
List item text after a quote or table (- a\n > b\n\n c) stays
apart from it: org → md wrote no blank line between them, so
Markdown read the text into the quote, gaining a > each round
trip, or as a table row.
HTML in a list item (org's #+begin_export html) stays an HTML
block in Markdown, and so does text after it: org → md kept the
item's indentation in the HTML, which Markdown then read as text.
HTML in a Markdown list item keeps its own indentation in org: md →
org lost up to the item's indentation from each line, each round
trip.
Markup right after other markup (`a`*,*) comes back from org
without a stray &#xNAN; between them.
Empty nested list items right below an item's text (- a\n -)
survive org → md: Markdown read the text over a lone - as a
heading, losing one item each round trip.
An org #+OPTIONS: line keeps an author's ^:{} where it is: org →
md took it out from anywhere, md → org put it back last.
An indented code line org escapes with a comma (,* x after the
indentation, in a src or export block) keeps its indentation in
Markdown: uniorg dropped it with the comma.
A Markdown code block without a language, or an HTML block, whose
line org would read as a headline or keyword (* x, #+end_example)
gets org's comma escape in its example or export block; that line
ended the block or became a headline. Org → md drops the comma of an
example block's line too, which uniorg left in (in a CRLF file
too), but keeps the escapes
of a block in a drawer or special block, which travels as org text.
Adjacent Markdown tables stay apart in org: md → org wrote them
with no blank line between them, which org reads as one table.
An org table keeps its #+NAME:, #+CAPTION:, #+RESULTS: (an
empty one too) and other affiliated keywords, and its #+TBLFM:
formulas, as lines around the Markdown table; both were lost
without a warning (the keywords by uniorg), in a CRLF file too.
Several #+TBLFM: lines stay apart: uniorg joined them into one.
Org links within a file survive a round trip: a link to a headline
([[*Some Heading]], or a fuzzy [[Some Heading]]) is a link to the
heading's GitHub slug (#some-heading), a link to a <<target>> or
a #+NAME: one to #name, and md → org links them back. They came
back as file: links to files of that name. A Markdown anchor of a
heading ([setup](#getting-started)) becomes a heading link, which
Emacs follows; it was a custom ID link that found nothing.
An org link to a // path keeps its % as written: org → md
percent-encoded it, md → org read the scheme-relative url as it is,
so %25 gained a 25 each round trip.
Org keyword lines (#+AUTHOR: Jan <jan@x.org>, #+CALL:) go back
to org as written: md → org read them as Markdown, so an address or
url became a link nested once more each round trip, and escaped them
(\n:nil in #+OPTIONS: gained a zero-width space).
A headline's property values that Markdown may read as syntax (a
url, *, _) are written below a <!-- morg_properties -->
comment, and md → org takes the lines below it back as written; it
read them as Markdown. Unmarked key:: value lines below a heading
are Markdown, as a person writes them (an Obsidian Dataview field),
and convert as before.
An org element written verbatim to Markdown (fixed-width lines, a
drawer, a special block) with keywords in front (#+RESULTS:) goes
back to org as written: md → org read it as Markdown, so a babel
result's `x` became ~x~, its trailing spaces a line break.
Markup in an org block or drawer written verbatim to Markdown
(*b* in a #+begin_note) stays org markup: md → org escaped it
with a zero-width space, which org then read as text.
A definition's text after its nested list (- T :: a\n - b\n c)
stays apart from the list: org → md wrote no blank line between
them, so Markdown read the text into the list's last item.
A Markdown list item's paragraphs stay apart in org: md → org wrote
them with no blank line between them, which org reads as one
paragraph.
Fixed-width lines and keywords in an org list item go back to org as
written: org → md wrote them into the item's text, where md → org
read them as text (: git clone git@x.org:a gained a zero-width
space and a mail link). They are a paragraph of their own now, set
apart by blank lines, which makes the Markdown list loose.
A Logseq block's properties drawer below a CLOSED: or an indented SCHEDULED:/DEADLINE: line stays its properties: Logseq md read
the drawer as text, whose :END: gained a zero-width space.
Translated to Vanilla Markdown, a CLOSED: line is a closed:: line
and back; a closed::, scheduled:: or deadline:: line holding no
timestamp stays a property.
Obsidian md → Vanilla md keeps a comment's --> in it
(%%a-->b%% → <!--a-->b-->): it closed the HTML comment early,
showing the rest.
Obsidian md → Vanilla md writes a comment in an inline footnote
into the footnote's definition (^[a %%c%% b]); the two overlapped,
garbling the text after the reference.
Text after a Markdown footnote definition stays apart from it in
org: md → org wrote no blank line between them, and org ends a
definition only at two, so it read the text into the footnote.
A table's #+NAME:, #+CAPTION: and other affiliated keywords
survive in a quote, a center or a special block, where they were
dropped without a warning, and on a table that leads the file, where
they went to the frontmatter and came back apart from the table.
A Logseq query block's #+NAME: stays above its query code block
in Vanilla md: the code block held it, and the block's begin line,
which came back as a second, broken block in it.
A Logseq query block (#+BEGIN_QUERY) survives Obsidian md: it is
a logseq-query code block there and back. It was a query code
block, which Obsidian runs as its own search, and came back a source
block (#+begin_src query).
An HTML comment that starts a list item (- <!--d-->) stays a
comment: md → org wrote it on the bullet's line (- # d), where org
reads text, and it came back visible (- \# d).
A Logseq block that starts with a comment (- <!--d-->, Obsidian - %%d%%) keeps it a comment in Logseq org, below an empty title:
the title is text, so * # d showed it, and it came back visible.