2018-12-03 10:36:10 +00:00
|
|
|
__author__ = "Peter Molnar"
|
2019-01-05 11:55:40 +00:00
|
|
|
__copyright__ = "Copyright 2017-2019, Peter Molnar"
|
2018-12-03 10:36:10 +00:00
|
|
|
__license__ = "apache-2.0"
|
|
|
|
__maintainer__ = "Peter Molnar"
|
|
|
|
__email__ = "mail@petermolnar.net"
|
|
|
|
|
Back To Pandoc
So, Python Markdown is a bottomless pit of horrors, including crippling parsing bugs,
random out of nowhere, lack of features. It's definitely much faster, than
Pandoc, but Pandoc doesn't go full retard where there's a regex in a fenced code block,
that happens to be a regex for markdown elements.
Also added some ugly post string replacements to make Pandoc fenced code output work
with Prism:
instead of the Pandoc <pre class="codelang"><code>, Prism wants
<pre><code class="language-codelang>, so I added a regex sub, because it's 00:32.
2018-08-04 00:28:55 +01:00
|
|
|
import subprocess
|
|
|
|
import logging
|
|
|
|
|
2018-08-04 09:30:26 +01:00
|
|
|
|
2019-02-25 22:40:01 +00:00
|
|
|
class PandocBase(str):
|
|
|
|
in_format = 'html'
|
|
|
|
in_options = []
|
|
|
|
out_format = 'plain'
|
|
|
|
out_options = []
|
|
|
|
columns = None
|
|
|
|
|
|
|
|
def __init__(self, text):
|
|
|
|
self.source = text
|
|
|
|
conv_to = '--to=%s' % (self.out_format)
|
|
|
|
if (len(self.out_options)):
|
|
|
|
conv_to = '%s+%s' % (
|
|
|
|
conv_to,
|
|
|
|
'+'.join(self.out_options)
|
2018-08-04 09:30:26 +01:00
|
|
|
)
|
2019-01-15 21:28:58 +00:00
|
|
|
|
2019-02-25 22:40:01 +00:00
|
|
|
conv_from = '--from=%s' % (self.in_format)
|
|
|
|
if (len(self.in_options)):
|
|
|
|
conv_from = '%s+%s' % (
|
|
|
|
conv_from,
|
|
|
|
'+'.join(self.in_options)
|
|
|
|
)
|
|
|
|
|
|
|
|
cmd = [
|
2019-01-15 21:28:58 +00:00
|
|
|
'pandoc',
|
|
|
|
'-o-',
|
2019-02-25 22:40:01 +00:00
|
|
|
conv_to,
|
|
|
|
conv_from,
|
2019-01-15 21:28:58 +00:00
|
|
|
'--quiet',
|
2019-02-25 22:40:01 +00:00
|
|
|
'--no-highlight'
|
|
|
|
]
|
|
|
|
if self.columns:
|
|
|
|
cmd.append(self.columns)
|
|
|
|
|
2019-01-15 21:28:58 +00:00
|
|
|
p = subprocess.Popen(
|
2019-02-25 22:40:01 +00:00
|
|
|
tuple(cmd),
|
2019-01-15 21:28:58 +00:00
|
|
|
stdin=subprocess.PIPE,
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
stderr=subprocess.PIPE,
|
|
|
|
)
|
|
|
|
|
|
|
|
stdout, stderr = p.communicate(input=text.encode())
|
|
|
|
if stderr:
|
|
|
|
logging.warning(
|
|
|
|
"Error during pandoc covert:\n\t%s\n\t%s",
|
|
|
|
cmd,
|
|
|
|
stderr
|
|
|
|
)
|
|
|
|
r = stdout.decode('utf-8').strip()
|
2019-02-25 22:40:01 +00:00
|
|
|
self.result = r
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return str(self.result)
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return str(self.result)
|
|
|
|
|
|
|
|
|
|
|
|
class PandocMarkdown(PandocBase):
|
|
|
|
in_format = 'markdown'
|
|
|
|
in_options = [
|
|
|
|
'footnotes',
|
|
|
|
'pipe_tables',
|
|
|
|
'strikeout',
|
|
|
|
# 'superscript',
|
|
|
|
# 'subscript',
|
|
|
|
'raw_html',
|
|
|
|
'definition_lists',
|
|
|
|
'backtick_code_blocks',
|
|
|
|
'fenced_code_attributes',
|
|
|
|
'shortcut_reference_links',
|
|
|
|
'lists_without_preceding_blankline',
|
|
|
|
'autolink_bare_uris',
|
|
|
|
]
|
|
|
|
out_format = 'html5'
|
|
|
|
out_options = []
|
|
|
|
|
|
|
|
|
|
|
|
class PandocHTML(PandocBase):
|
|
|
|
in_format = 'html'
|
|
|
|
in_options = []
|
|
|
|
out_format = 'markdown'
|
|
|
|
out_options = [
|
|
|
|
'footnotes',
|
|
|
|
'pipe_tables',
|
|
|
|
'strikeout',
|
|
|
|
# 'superscript',
|
|
|
|
# 'subscript',
|
|
|
|
'raw_html',
|
|
|
|
'definition_lists',
|
|
|
|
'backtick_code_blocks',
|
|
|
|
'fenced_code_attributes',
|
|
|
|
'shortcut_reference_links',
|
|
|
|
'lists_without_preceding_blankline',
|
|
|
|
'autolink_bare_uris',
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
class PandocTXT(PandocBase):
|
|
|
|
in_format = 'markdown'
|
|
|
|
in_options = [
|
|
|
|
'footnotes',
|
|
|
|
'pipe_tables',
|
|
|
|
'strikeout',
|
|
|
|
# 'superscript',
|
|
|
|
# 'subscript',
|
|
|
|
'raw_html',
|
|
|
|
'definition_lists',
|
|
|
|
'backtick_code_blocks',
|
|
|
|
'fenced_code_attributes',
|
|
|
|
'shortcut_reference_links',
|
|
|
|
'lists_without_preceding_blankline',
|
|
|
|
'autolink_bare_uris',
|
|
|
|
]
|
|
|
|
out_format = 'plain'
|
|
|
|
out_options = []
|
|
|
|
columns = '--columns=72'
|
|
|
|
|
|
|
|
|
|
|
|
#class PandocMarkdown(str):
|
|
|
|
#def __new__(cls, text):
|
|
|
|
#""" Pandoc command line call with piped in- and output """
|
|
|
|
#cmd = (
|
|
|
|
#'pandoc',
|
|
|
|
#'-o-',
|
|
|
|
#'--from=markdown+%s' % (
|
|
|
|
#'+'.join([
|
|
|
|
#'footnotes',
|
|
|
|
#'pipe_tables',
|
|
|
|
#'strikeout',
|
|
|
|
## 'superscript',
|
|
|
|
## 'subscript',
|
|
|
|
#'raw_html',
|
|
|
|
#'definition_lists',
|
|
|
|
#'backtick_code_blocks',
|
|
|
|
#'fenced_code_attributes',
|
|
|
|
#'shortcut_reference_links',
|
|
|
|
#'lists_without_preceding_blankline',
|
|
|
|
#'autolink_bare_uris',
|
|
|
|
#])
|
|
|
|
#),
|
|
|
|
#'--to=html5',
|
|
|
|
#'--quiet',
|
|
|
|
#'--no-highlight'
|
|
|
|
#)
|
|
|
|
#p = subprocess.Popen(
|
|
|
|
#cmd,
|
|
|
|
#stdin=subprocess.PIPE,
|
|
|
|
#stdout=subprocess.PIPE,
|
|
|
|
#stderr=subprocess.PIPE,
|
|
|
|
#)
|
|
|
|
|
|
|
|
#stdout, stderr = p.communicate(input=text.encode())
|
|
|
|
#if stderr:
|
|
|
|
#logging.warning(
|
|
|
|
#"Error during pandoc covert:\n\t%s\n\t%s",
|
|
|
|
#cmd,
|
|
|
|
#stderr
|
|
|
|
#)
|
|
|
|
#r = stdout.decode('utf-8').strip()
|
|
|
|
#return str.__new__(cls, r)
|
|
|
|
|
|
|
|
|
|
|
|
#class PandocHTML(str):
|
|
|
|
#def __new__(cls, text):
|
|
|
|
#""" Pandoc command line call with piped in- and output """
|
|
|
|
#cmd = (
|
|
|
|
#'pandoc',
|
|
|
|
#'-o-',
|
|
|
|
#'--to=markdown+%s' % (
|
|
|
|
#'+'.join([
|
|
|
|
#'footnotes',
|
|
|
|
#'pipe_tables',
|
|
|
|
#'strikeout',
|
|
|
|
## 'superscript',
|
|
|
|
## 'subscript',
|
|
|
|
#'raw_html',
|
|
|
|
#'definition_lists',
|
|
|
|
#'backtick_code_blocks',
|
|
|
|
#'fenced_code_attributes',
|
|
|
|
#'shortcut_reference_links',
|
|
|
|
#'lists_without_preceding_blankline',
|
|
|
|
#'autolink_bare_uris',
|
|
|
|
#])
|
|
|
|
#),
|
|
|
|
#'--from=html',
|
|
|
|
#'--quiet',
|
|
|
|
#)
|
|
|
|
#p = subprocess.Popen(
|
|
|
|
#cmd,
|
|
|
|
#stdin=subprocess.PIPE,
|
|
|
|
#stdout=subprocess.PIPE,
|
|
|
|
#stderr=subprocess.PIPE,
|
|
|
|
#)
|
|
|
|
|
|
|
|
#stdout, stderr = p.communicate(input=text.encode())
|
|
|
|
#if stderr:
|
|
|
|
#logging.warning(
|
|
|
|
#"Error during pandoc covert:\n\t%s\n\t%s",
|
|
|
|
#cmd,
|
|
|
|
#stderr
|
|
|
|
#)
|
|
|
|
#r = stdout.decode('utf-8').strip()
|
|
|
|
#return str.__new__(cls, r)
|