95

Is there any existing addon spec for markdown that includes support for RTL languages?

What I'm hoping for is something like

This paragraph is left to right
<- This paragraph is right to left

Or something... I can tweak my parser to handle this but I want to make sure it doesn't exist already.

j0k
  • 22,600
  • 28
  • 79
  • 90
Karim
  • 18,347
  • 13
  • 61
  • 70

10 Answers10

93

Actually as my friend Aevyz reminded me, Markdown parses HTML in it.

You won't need to change your parser. The quickest path to solve that I could think of is this:

<div dir="rtl">

سلام دنیا

مرحبا العالم

שלום בעולם

ہیلو دنیا
</div>

So you need to add literally two lines to turn a whole document or an arbitrary section of it into RTL. It will be more compatible than an own script.

Makan
  • 2,508
  • 4
  • 24
  • 39
  • Among online editors, this https://jbt.github.io/markdown-editor/ has adopted the HTML in... – Makan Aug 30 '18 at 11:04
  • 4
    But unfortunately markdown attributes not working in HTML tags :( – ttrasn Jul 30 '20 at 05:33
  • Can you elaborate? Which attributes? If you mean `dir="rtl"`, this attribute is not a "markdown attribute". It belongs to HTML anyway. – Makan Jul 30 '20 at 07:18
39

Not exactly markdown, but this is how you can override paragraph direction in StackExchange questions and answers (this method does not work for comments):

add &#x202b; (RIGHT-TO-LEFT EMBEDDING) in the beginning of a paragraph does control the direction of this paragraph (auto-reset on <br/> or empty line):

&#x202b;test מה זה? YES<br/>
test1 מה זה? NO
test2 מה זה? NO

&#x202b;test1 מה זה? YES
test2 מה זה? YES

‫test מה זה? YES
test1 מה זה? NO test2 מה זה? NO

‫test1 מה זה? YES test2 מה זה? YES

Alex Cohn
  • 56,089
  • 9
  • 113
  • 307
  • 2
    On Github issues using ‫ also provides correct results. A little trick is that I need to enclose the RTL paragraph in

    or Github cannot render it.
    – Chih-Hsuan Yen Nov 27 '15 at 14:20
  • You forgot to close the RLE with PDF (`‬`). But these days, use neither. __Use `⁧` and close with `⁩`__ the isolating versions of the former called RLI and PDI. – Robert Siemer Feb 20 '20 at 13:48
  • @RobertSiemer I did not forget to close RLE; the StackExchange implementation resets on new line. – Alex Cohn Feb 22 '20 at 08:57
  • @AlexCohn Would you recommend using it anyway? – Robert Siemer Feb 23 '20 at 23:20
  • @RobertSiemer The question is what you want to achieve; luckily, it's easy to preview the result and change it if it's not to your liking. I believe that for some strings, the isolating BiDi control chars are better, but not averywhere. – Alex Cohn Feb 24 '20 at 15:47
23

Here is a JavaScript implementation of Markdown, which (according to the commit comments) adds support for RTL languages, namely Arabic, Hebrew, Syriac, Thaana. And it seems trivially easy to add more languages.

https://github.com/hasenj/showdown/

It's based on Showdown, http://attacklab.net/showdown.

It seems to automatically understand whether or not to render the text from right to left.
Consider this code snippet: (from the very first commit at GitHub)

var p_tag = "<p>";
var rtl_p_tag = "<p style='direction:rtl; text-align: right'>";

// Check for RTL paragraphs: paragraphs that start with a character
// from an RTL script.
// RTL scripts are: Arabic, Hebrew, Syriac, Thaana
// Unicode ranges reference: http://www.ssec.wisc.edu/~tomw/java/unicode.html
var first_char = str.charCodeAt(str.search(/\S/)); //first non-white-space char
if(first_char >= 1424 && first_char <= 1983) 
{
    p_tag = rtl_p_tag;
}

    str = _RunSpanGamut(str);
    str = str.replace(/^([ \t]*)/g, p_tag);

Hope this helps,
Magnus

hasen
  • 161,647
  • 65
  • 194
  • 231
KajMagnus
  • 11,308
  • 15
  • 79
  • 127
16

I don't find anything in markdown standard for bidi texts. I use my own editor : rtlmd

Dariush Abbasi
  • 460
  • 1
  • 4
  • 15
11

Just use dir="auto" like the below example and it will work as you wanted:

 <div dir="auto">
                با استفاده از attribute dir با مقدار auto در HTML می تونید به طور خودکار RTL رو هم داشته باشید.
  </div>
SeyyedKhandon
  • 5,197
  • 8
  • 37
  • 68
11

you can use:

<div align="right">
   این متن test است
</div>


or:

<div dir="auto" align="right">
   این متن test است
</div>


or (recommended):

<div dir="auto">
   این متن test است
</div>
Ali Shariatian
  • 111
  • 1
  • 3
9

מעניין. עכשיו אני רואה שבעצם יש גם לאתר הזה פה תמיכה בעברית וכתיבה מימין לשמאל. הבעיה היא שזה כותב טוב, אבל בתרגום בתיבה למטה שמציגה כמו שזה אמור להראות זה לא עובד טוב.

The above paragraph was written in Hebrew RTL and was displayed correctly in the input box but not in the preview one. However, there was no support for mixing - having one paragraph RTL and another one LTR. Seems someone needs to port the above Hebrew support in Markdown also for MarkdownSharp, SO's version. Shouldn't be too hard.

Avi
  • 15,696
  • 9
  • 39
  • 54
  • 6
    Not markdown, but adding ‫ (RIGHT-TO-LEFT EMBEDDING) in the beginning of a paragraph does control the direction of this paragraph (auto-reset on
    or empty line).
    – Alex Cohn Jan 07 '14 at 06:47
6

You can simply add everything between span tags like below:

<span dir="rtl" align="right">
      این یک test است
</span>

You may want to check this link to see an example in action.

Koorosh
  • 457
  • 5
  • 14
0

when I use align it looks better, but has no indents in bullets and numbering

Gute1
  • 1
  • 1
    As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Mar 07 '23 at 02:06
0

Since the markdown accepts html, using this trick might be useful:

<style>*{direction: rtl}</style>

متن راست به چپ rtl text

## **rtl title عنوان راست به چپ**

I use this in VSCode Jupyter Notebooks, and the good thing is you can still use markdown tags (which is not possible when you wrap the content in <div dir="rtl"> or any other HTML tag).

Shahriar
  • 1,855
  • 2
  • 21
  • 45