defmodule Cmark do alias Cmark.Parser @moduledoc """ Compiles Markdown formatted text into HTML or one of the other supported target formats. Provides: HTML - `to_html/1` - `to_html/2` - `to_html/3` - `to_html_each/2` - `to_html_each/3` XML - `to_xml/1` - `to_xml/2` - `to_xml/3` - `to_xml_each/2` - `to_xml_each/3` Manpage - `to_man/1` - `to_man/2` - `to_man/3` - `to_man_each/2` - `to_man_each/3` CommonMark - `to_commonmark/1` - `to_commonmark/2` - `to_commonmark/3` - `to_commonmark_each/2` - `to_commonmark_each/3` LaTeX - `to_latex/1` - `to_latex/2` - `to_latex/3` - `to_latex_each/2` - `to_latex_each/3` """ ##### HTML ##### @doc ~S""" Compiles one or more (list) Markdown documents to HTML and returns result. ## Examples iex> "test" |> Cmark.to_html "

test

\n" iex> ["test 1", "test 2"] |> Cmark.to_html ["

test 1

\n", "

test 2

\n"] """ def to_html(data), do: Parser.parse(:html, data) @doc ~S""" Compiles one or more (list) Markdown documents to HTML using provided options and returns result. Options are passed as a list of atoms. Available options are: * `:sourcepos` - Include a `data-sourcepos` attribute on all block elements. * `:softbreak` - Render `softbreak` elements as hard line breaks. * `:normalize` - Normalize tree by consolidating adjacent text nodes. * `:smart` - Convert straight quotes to curly, --- to em dashes, -- to en dashes. * `:validate_utf8` - Validate UTF-8 in the input before parsing, replacing illegal sequences with the replacement character U+FFFD. * `:safe` - Suppress raw HTML and unsafe links (`javascript:`, `vbscript:`, `file:`, and `data:`, except for `image/png`, `image/gif`, `image/jpeg`, or `image/webp` mime types). Raw HTML is replaced by a placeholder HTML comment. Unsafe links are replaced by empty strings. ## Examples iex> Cmark.to_html(~s(Use option to enable "smart" quotes.), [:smart]) "

Use option to enable “smart” quotes.

\n" iex> Cmark.to_html([~s(Something "smart"), ~s(em---dashed)], [:smart]) ["

Something “smart”

\n", "

em—dashed

\n"] ----- Compiles one or more (list) Markdown documents to HTML and calls function with result. ## Examples iex> callback = fn (result) -> "HTML is #{result}" |> String.strip end iex> Cmark.to_html("test", callback) "HTML is

test

" iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("
") iex> end iex> Cmark.to_html(["list", "test"], callback) "

list


test

" """ def to_html(data, options_or_callback), do: Parser.parse(:html, data, options_or_callback) @doc ~S""" Compiles one or more (list) Markdown documents to HTML using provided options and calls function with result. ## Examples iex> callback = fn (result) -> {:ok, result} end iex> Cmark.to_html(~s(Something "smart" and ... ---you get it!), callback, [:smart]) {:ok, "

Something “smart” and … —you get it!

\n"} iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("
") iex> end iex> Cmark.to_html(["en-dash --", "ellipsis..."], callback, [:smart]) "

en-dash –


ellipsis…

" """ def to_html(data, callback, options), do: Parser.parse(:html, data, callback, options) @doc ~S""" Compiles a list of Markdown documents to HTML and calls function for each item. ## Examples iex> callback = fn (result) -> "HTML is #{result |> String.strip}" end iex> Cmark.to_html_each(["list", "test"], callback) ["HTML is

list

", "HTML is

test

"] """ def to_html_each(data, callback), do: Parser.parse_each(:html, data, callback) @doc ~S""" Compiles a list of Markdown documents to HTML using provided options and calls function for each item. ## Examples iex> callback = fn (result) -> "HTML is #{result |> String.strip}" end iex> Cmark.to_html_each(["list --", "test..."], callback, [:smart]) ["HTML is

list –

", "HTML is

test…

"] """ def to_html_each(data, callback, options), do: Parser.parse_each(:html, data, callback, options) ##### XML ##### @doc ~S""" Compiles one or more (list) Markdown documents to XML and returns result. ## Examples iex> "test" |> Cmark.to_xml "\n \n \n test\n \n" iex> ["test 1", "test 2"] |> Cmark.to_xml ["\n \n \n test 1\n \n", "\n \n \n test 2\n \n"] """ def to_xml(data), do: Parser.parse(:xml, data) @doc ~S""" Compiles one or more (list) Markdown documents to XML using provided options and returns result. Options are passed as a list of atoms. For details see `Cmark.to_xml/2`. ## Examples iex> Cmark.to_xml(~s(Use option to enable "smart" quotes.), [:smart]) "\n \n \n Use option to enable \n smart\n \n quotes\n . \n\n" iex> Cmark.to_xml([~s(Something "smart"), ~s(em---dashed)], [:smart]) ["\n \n \n Something \n smart\n \n \n\n", "\n \n \n em \n dashed\n \n\n"] ----- Compiles one or more (list) Markdown documents to XML and calls function with result. ## Examples iex> callback = fn (result) -> "XML is #{result}" |> String.strip end iex> Cmark.to_xml("test", callback) "XML is \n \n \n test\n " iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("") iex> end iex> Cmark.to_xml(["list", "test"], callback) "\n \n \n list\n \n \n \n test\n " """ def to_xml(data, options_or_callback), do: Parser.parse(:xml, data, options_or_callback) @doc ~S""" Compiles one or more (list) Markdown documents to XML using provided options and calls function with result. ## Examples iex> callback = fn (result) -> {:ok, result} end iex> Cmark.to_xml(~s(Something "smart" and ... ---you get it!), callback, [:smart]) {:ok, "\n \n \n Something \n smart\n \n and \n \n \n you get it\n !\n \n"} iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("") iex> end iex> Cmark.to_xml(["en-dash --", "ellipsis..."], callback, [:smart]) "\n \n \n en\n - dash \n \n \n \n \n ellipsis\n \n" """ def to_xml(data, callback, options), do: Parser.parse(:xml, data, callback, options) @doc ~S""" Compiles a list of Markdown documents to XML and calls function for each item. ## Examples iex> callback = fn (result) -> "XML is #{result |> String.strip}" end iex> Cmark.to_xml_each(["list", "test"], callback) ["XML is \n \n \n list\n ", "XML is \n \n \n test\n "] """ def to_xml_each(data, callback), do: Parser.parse_each(:xml, data, callback) @doc ~S""" Compiles a list of Markdown documents to XML using provided options and calls function for each item. ## Examples iex> callback = fn (result) -> "XML is #{result |> String.strip}" end iex> Cmark.to_xml_each(["list --", "test..."], callback, [:smart]) ["XML is \n \n \n list \n \n", "XML is \n \n \n test\n \n"] """ def to_xml_each(data, callback, options), do: Parser.parse_each(:xml, data, callback, options) ##### Manpage ##### @doc ~S""" Compiles one or more (list) Markdown documents to Manpage and returns result. ## Examples iex> "test" |> Cmark.to_man ".PP\ntest\n" iex> ["test 1", "test 2"] |> Cmark.to_man [".PP\ntest 1\n", ".PP\ntest 2\n"] """ def to_man(data), do: Parser.parse(:man, data) @doc ~S""" Compiles one or more (list) Markdown documents to Manpage using provided options and returns result. Options are passed as a list of atoms. For details see `Cmark.to_man/2`. ## Examples iex> Cmark.to_man(~s(Use option to enable "smart" quotes.), [:smart]) ".PP\nUse option to enable \\[lq]smart\\[rq] quotes.\n" iex> Cmark.to_man([~s(Something "smart"), ~s(em---dashed)], [:smart]) [".PP\nSomething \\[lq]smart\\[rq]\n", ".PP\nem\\[em]dashed\n"] ----- Compiles one or more (list) Markdown documents to Manpage and calls function with result. ## Examples iex> callback = fn (result) -> "Manpage is #{result}" |> String.strip end iex> Cmark.to_man("test", callback) "Manpage is .PP\ntest" iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("%%joiner%%") iex> end iex> Cmark.to_man(["list", "test"], callback) ".PP\nlist%%joiner%%.PP\ntest" """ def to_man(data, options_or_callback), do: Parser.parse(:man, data, options_or_callback) @doc ~S""" Compiles one or more (list) Markdown documents to Manpage using provided options and calls function with result. ## Examples iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("%%joiner%%") iex> end iex> Cmark.to_man(["en-dash --", "ellipsis..."], callback, [:smart]) ".PP\nen\\-dash \\[en]%%joiner%%.PP\nellipsis…" """ def to_man(data, callback, options), do: Parser.parse(:man, data, callback, options) @doc ~S""" Compiles a list of Markdown documents to Manpage and calls function for each item. ## Examples iex> callback = fn (result) -> {:ok, result} end iex> Cmark.to_man(~s(Something "smart" and ... ---you get it!), callback, [:smart]) {:ok, ".PP\nSomething \\[lq]smart\\[rq] and … \\[em]you get it!\n"} iex> callback = fn (result) -> "Manpage is #{result |> String.strip}" end iex> Cmark.to_man_each(["list", "test"], callback) ["Manpage is .PP\nlist", "Manpage is .PP\ntest"] """ def to_man_each(data, callback), do: Parser.parse_each(:man, data, callback) @doc ~S""" Compiles a list of Markdown documents to Manpage using provided options and calls function for each item. ## Examples iex> callback = fn (result) -> "Manpage is #{result |> String.strip}" end iex> Cmark.to_man_each(["list --", "test..."], callback, [:smart]) ["Manpage is .PP\nlist \\[en]", "Manpage is .PP\ntest…"] """ def to_man_each(data, callback, options), do: Parser.parse_each(:man, data, callback, options) ##### CommonMark ##### @doc ~S""" Compiles one or more (list) Markdown documents to CommonMark and returns result. ## Examples iex> "test" |> Cmark.to_commonmark "test\n" iex> ["test 1", "test 2"] |> Cmark.to_commonmark ["test 1\n", "test 2\n"] """ def to_commonmark(data), do: Parser.parse(:commonmark, data) @doc ~S""" Compiles one or more (list) Markdown documents to CommonMark using provided options and returns result. Options are passed as a list of atoms. For details see `Cmark.to_commonmark/2`. ## Examples iex> Cmark.to_commonmark(~s(Use option to enable "smart" quotes.), [:smart]) "Use option to enable “smart” quotes.\n" iex> Cmark.to_commonmark([~s(Something "smart"), ~s(em---dashed)], [:smart]) ["Something “smart”\n", "em—dashed\n"] ----- Compiles one or more (list) Markdown documents to CommonMark and calls function with result. ## Examples iex> callback = fn (result) -> "CommonMark is #{result}" |> String.strip end iex> Cmark.to_commonmark("test", callback) "CommonMark is test" iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("%%joiner%%") iex> end iex> Cmark.to_commonmark(["list", "test"], callback) "list%%joiner%%test" """ def to_commonmark(data, options_or_callback), do: Parser.parse(:commonmark, data, options_or_callback) @doc ~S""" Compiles one or more (list) Markdown documents to CommonMark using provided options and calls function with result. ## Examples iex> callback = fn (result) -> {:ok, result} end iex> Cmark.to_commonmark(~s(Something "smart" and ... ---you get it!), callback, [:smart]) {:ok, "Something “smart” and … —you get it\\!\n"} iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("%%joiner%%") iex> end iex> Cmark.to_commonmark(["en-dash --", "ellipsis..."], callback, [:smart]) "en-dash –%%joiner%%ellipsis…" """ def to_commonmark(data, callback, options), do: Parser.parse(:commonmark, data, callback, options) @doc ~S""" Compiles a list of Markdown documents to CommonMark and calls function for each item. ## Examples iex> callback = fn (result) -> "CommonMark is #{result |> String.strip}" end iex> Cmark.to_commonmark_each(["list", "test"], callback) ["CommonMark is list", "CommonMark is test"] """ def to_commonmark_each(data, callback), do: Parser.parse_each(:commonmark, data, callback) @doc ~S""" Compiles a list of Markdown documents to CommonMark using provided options and calls function for each item. ## Examples iex> callback = fn (result) -> "CommonMark is #{result |> String.strip}" end iex> Cmark.to_commonmark_each(["list --", "test..."], callback, [:smart]) ["CommonMark is list –", "CommonMark is test…"] """ def to_commonmark_each(data, callback, options), do: Parser.parse_each(:commonmark, data, callback, options) ##### LaTeX ##### @doc ~S""" Compiles one or more (list) Markdown documents to LaTeX and returns result. ## Examples iex> "test" |> Cmark.to_latex "test\n" iex> ["test 1", "test 2"] |> Cmark.to_latex ["test 1\n", "test 2\n"] """ def to_latex(data), do: Parser.parse(:latex, data) @doc ~S""" Compiles one or more (list) Markdown documents to LaTeX using provided options and returns result. Options are passed as a list of atoms. For details see `Cmark.to_latex/2`. ## Examples iex> Cmark.to_latex(~s(Use option to enable "smart" quotes.), [:smart]) "Use option to enable ``smart'' quotes.\n" iex> Cmark.to_latex([~s(Something "smart"), ~s(em---dashed)], [:smart]) ["Something ``smart''\n", "em---dashed\n"] ----- Compiles one or more (list) Markdown documents to LaTeX and calls function with result. ## Examples iex> callback = fn (result) -> "LaTeX is #{result}" |> String.strip end iex> Cmark.to_latex("test", callback) "LaTeX is test" iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("%%joiner%%") iex> end iex> Cmark.to_latex(["list", "test"], callback) "list%%joiner%%test" """ def to_latex(data, options_or_callback), do: Parser.parse(:latex, data, options_or_callback) @doc ~S""" Compiles one or more (list) Markdown documents to LaTeX using provided options and calls function with result. ## Examples iex> callback = fn (result) -> {:ok, result} end iex> Cmark.to_latex(~s(Something "smart" and ... ---you get it!), callback, [:smart]) {:ok, "Something ``smart'' and \\ldots{} ---you get it!\n"} iex> callback = fn (results) -> iex> Enum.map(results, &String.strip/1) |> Enum.join("%%joiner%%") iex> end iex> Cmark.to_latex(["en-dash --", "ellipsis..."], callback, [:smart]) "en-dash --%%joiner%%ellipsis\\ldots{}" """ def to_latex(data, callback, options), do: Parser.parse(:latex, data, callback, options) @doc ~S""" Compiles a list of Markdown documents to LaTeX and calls function for each item. ## Examples iex> callback = fn (result) -> "LaTeX is #{result |> String.strip}" end iex> Cmark.to_latex_each(["list", "test"], callback) ["LaTeX is list", "LaTeX is test"] """ def to_latex_each(data, callback), do: Parser.parse_each(:latex, data, callback) @doc ~S""" Compiles a list of Markdown documents to LaTeX using provided options and calls function for each item. ## Examples iex> callback = fn (result) -> "LaTeX is #{result |> String.strip}" end iex> Cmark.to_latex_each(["list --", "test..."], callback, [:smart]) ["LaTeX is list --", "LaTeX is test\\ldots{}"] """ def to_latex_each(data, callback, options), do: Parser.parse_each(:latex, data, callback, options) end