jira2markdown is a text converter from JIRA markup to YouTrack Markdown using parsing expression grammars. The Markdown implementation in YouTrack follows the CommonMark specification with extensions. Thus, jira2markdown can be used to convert text to any Markdown syntax with minimal modifications.
fromjira2markdownimportconvertconvert("Some *Jira text* formatting [example|https://example.com].")# >>> Some **Jira text** formatting [example](https://example.com).# To convert user mentions provide a mapping Jira internal account id to username # as a second argument to convert functionconvert("[Winston Smith|~accountid:internal-id] woke up with the word 'Shakespeare' on his lips",{"internal-id":"winston",})# >>> @winston woke up with the word 'Shakespeare' on his lips
Conversion tables
Headings
Jira
Markdown
h1. Biggest heading
# Biggest heading
h2. Bigger heading
## Bigger heading
h3. Big heading
### Big heading
h4. Normal heading
#### Normal heading
h5. Small heading
##### Small heading
h6. Smallest heading
###### Smallest heading
Text Effects
Jira
Markdown
*strong*
**strong**
_emphasis_
Not converted (the same syntax)
??citation??
<q>citation</q>
-deleted-
~~deleted~~
+inserted+
inserted
^superscript^
<sup>superscript</sup>
~subscript~
<sub>subscript</sub>
{{monospaced}}
`monospaced`
bq. Some block quoted text
> Some block quoted text
{quote}Content to be quoted{quote}
> Content to be quoted
{color:red}red text!{color}
<font color="red">red text!</font>
Text Breaks
Jira
Markdown
\\
Line break
---
—
--
–
Links
Jira
Markdown
[#anchor]
Not converted
[^attachment.ext]
[attachment.ext](attachment.ext)
[http://www.example.com]
<http://www.example.com>
[Example|http://example.com]
[Example](http://example.com)
[mailto:box@example.com]
<box@example.com>
[file:///c:/temp/foo.txt]
Not converted
{anchor:anchorname}
Not converted
[~username]
@username
Lists
Jira
Markdown
* some
* bullet
** indented
** bullets
* points
- some
- bullet
- indented
- bullets
- points
# a
# numbered
# list
1. a
1. numbered
1. list
# a
# numbered
#* with
#* nested
#* bullet
# list
1. a
1. numbered
- with
- nested
- bullet
1. list
* a
* bulleted
*# with
*# nested
*# numbered
* list
- a
- bulleted
1. with
1. nested
1. numbered
- list
To customize the list of markup elements send it as an optional argument to convert:
fromjira2markdownimportconvertfromjira2markdown.elementsimportMarkupElementsfromjira2markdown.markup.linksimportLinkfromjira2markdown.markup.text_effectsimportBold# Only bold and link tokens will be converted hereelements=MarkupElements([Link,Bold])convert("Some Jira text here",elements=elements)
Keep in mind that the order of markup elements is important! Elements are matching first from top to bottom in the list.
To override some elements in the default element list use insert_after/replace methods:
fromjira2markdownimportconvertfromjira2markdown.elementsimportMarkupElementsfromjira2markdown.markup.baseimportAbstractMarkupfromjira2markdown.markup.linksimportLinkfromjira2markdown.markup.text_effectsimportColorclassCustomColor(Color):...classMyElement(AbstractMarkup):...elements=MarkupElements()elements.replace(Color,CustomColor)elements.insert_after(Link,MyElement)convert("Some Jira text here",elements=elements)