summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Diemer <git@jensdiemer.de>2022-08-21 00:49:35 +0200
committerGitHub <noreply@github.com>2022-08-21 00:49:35 +0200
commit97de7930b7ebbeac615231c6eed1ac6783de5821 (patch)
tree4d03cac9c53992d389e85294b2ba7287699aabb7
parent66340e67f7fee7be0fcd8249d60c676476b31be9 (diff)
parent89d6ad7ac88868932911e8926866445bc3b89cb4 (diff)
downloadcreole-97de7930b7ebbeac615231c6eed1ac6783de5821.tar.gz
Merge pull request #69 from jedie/dev
fix markdown newlines
-rw-r--r--README.md28
-rw-r--r--creole/emitter/html2markdown_emitter.py23
-rw-r--r--creole/tests/test_creole2markdown.py56
-rw-r--r--creole/tests/test_cross_compare_markdown.py18
-rw-r--r--creole/tests/test_html2markdown.py21
5 files changed, 120 insertions, 26 deletions
diff --git a/README.md b/README.md
index 1401102..270274b 100644
--- a/README.md
+++ b/README.md
@@ -28,10 +28,10 @@ The creole2html part based on the creole markup parser and emitter from the Moin
# install
Python packages available on: [http://pypi.python.org/pypi/python-creole/](http://pypi.python.org/pypi/python-creole/)
-
```
~$ pip install python-creole
```
+
To setup a virtualenv via Poetry, see `unittests` section below.
# example
@@ -39,91 +39,91 @@ To setup a virtualenv via Poetry, see `unittests` section below.
## creole2html
Convert creole markup to html code:
-
```
>>> from creole import creole2html
>>> creole2html("This is **creole //markup//**")
'<p>This is <strong>creole <i>markup</i></strong></p>\n'
```
+
## html2creole
Convert html code back into creole markup:
-
```
>>> from creole import html2creole
>>> html2creole('<p>This is <strong>creole <i>markup</i></strong></p>\n')
'This is **creole //markup//**'
```
+
## rest2html
Convert ReStructuredText into clean html code (needs [docutils](http://pypi.python.org/pypi/docutils/)):
-
```
>>> from creole.rest2html.clean_writer import rest2html
>>> rest2html(u"A ReSt link to `PyLucid CMS <http://www.pylucid.org>`_ :)")
'<p>A ReSt link to <a href="http://www.pylucid.org">PyLucid CMS</a> :)</p>\\n'
```
+
(more information: [rest2html wiki page](https://github.com/jedie/python-creole/wiki/rest2html))
## html2rest
Convert html code into ReStructuredText markup:
-
```
>>> from creole import html2rest
>>> html2rest('<p>This is <strong>ReStructuredText</strong> <em>markup</em>!</p>')
'This is **ReStructuredText** *markup*!'
```
+
## html2textile
Convert html code into textile markup
-
```
>>> from creole import html2textile
>>> html2textile('<p>This is <strong>textile <i>markup</i></strong>!</p>')
'This is *textile __markup__*!'
```
+
See also: [http://github.com/jedie/python-creole/blob/master/demo.py](http://github.com/jedie/python-creole/blob/master/demo.py)
## html2markdown
Convert html code into textile markup
-
```
>>> from creole import html2markdown
>>> html2markdown('<p>This is <strong>markdown <i>markup</i></strong>!</p>')
'This is **markdown _markup_**!'
```
+
See also: [http://github.com/jedie/python-creole/blob/main/demo.py](http://github.com/jedie/python-creole/blob/main/demo.py)
# Image size additional
You can pass image width/height in image tags, e.g.:
-
```
>>> from creole import creole2html
>>> creole_markup="""{{foobar.jpg|image title|90x160}}"""
>>> creole2html(creole_markup)
'<p><img src="foobar.jpg" title="image title" alt="image title" width="90" height="160" /></p>'
```
-The third part (`90x160`) is not in creole standard, you can force a _strict_ mode, e.g.:
+The third part (`90x160`) is not in creole standard, you can force a _strict_ mode, e.g.:
```
>>> creole2html(creole_markup, strict=True)
'<p><img src="foobar.jpg" title="image title|90x160" alt="image title|90x160" /></p>'
```
+
# Source code highlighting support
You can find a example macro which highlight source code thanks to the pygments
library. It is located here: [/creole/shared/example_macros.py](https://github.com/jedie/python-creole/blob/main/creole/shared/example_macros.py).
Here is how to use it:
-
```
>>> from creole import creole2html
>>> from creole.shared.example_macros import code
>>> creole_markup="""<<code ext=".py">>#some code\nprint('coucou')\n<</code>>"""
>>> creole2html(creole_markup, macros={'code': code})
```
+
# commandline interface
If you have python-creole installed, you will get these simple CLI scripts:
@@ -136,7 +136,6 @@ If you have python-creole installed, you will get these simple CLI scripts:
* html2markdown
Here the `--help` output from `html2creole`:
-
```
$ html2creole --help
usage: html2creole [-h] [-v] [--encoding ENCODING] sourcefile destination
@@ -153,11 +152,12 @@ optional arguments:
-v, --version show program's version number and exit
--encoding ENCODING Codec for read/write file (default encoding: utf-8)
```
-Example to convert a html file into a creole file:
+Example to convert a html file into a creole file:
```
$ html2creole foobar.html foobar.creole
```
+
# documentation
We store documentation/examples into the project wiki:
@@ -180,7 +180,6 @@ Creole Markup Cheat Sheet can be found here: [http://www.wikicreole.org/wiki/Che
![Creole Markup Cheat Sheet](http://www.wikicreole.org/imageServlet?page=CheatSheet%2Fcreole_cheat_sheet.png&width=340 "Creole Markup Cheat Sheet")
## unittests
-
```
# clone repository (or use your fork):
~$ git clone https://github.com/jedie/python-creole.git
@@ -198,10 +197,10 @@ Creole Markup Cheat Sheet can be found here: [http://www.wikicreole.org/wiki/Che
# Run pytest via tox with all environments:
~/python-creole$ make tox
```
+
## make targets
To see all make targets, just call `make`:
-
```
~/python-creole$ make
help List all commands
@@ -216,6 +215,7 @@ pytest Run pytest
update-readmes update README.rst and README.md from README.creole
publish Release new version to PyPi
```
+
## Use creole in README
With python-creole you can convert a README on-the-fly from creole into ReStructuredText in setup.py
diff --git a/creole/emitter/html2markdown_emitter.py b/creole/emitter/html2markdown_emitter.py
index 866e090..848add0 100644
--- a/creole/emitter/html2markdown_emitter.py
+++ b/creole/emitter/html2markdown_emitter.py
@@ -35,7 +35,7 @@ class MarkdownEmitter(BaseEmitter):
self._table = MarkupTable(head_prefix='', debug_msg=self.debug_msg)
self.emit_children(node)
content = self._table.get_markdown_table()
- return f'{content}\n\n'
+ return f'\n{content}\n'
def tr_emit(self, node):
self._table.add_tr()
@@ -70,29 +70,28 @@ class MarkdownEmitter(BaseEmitter):
if class_value:
if class_value.startswith('language-'):
language = class_value.partition('-')[2]
- return f'```{language}{code}```\n\n'
+ return f'\n```{language}{code}```\n'
- return f'```{code}```\n\n'
+ return f'\n```{code}```\n'
- return f'```{self.deentity.replace_all(pre_content)}```\n'
+ return f'\n```{self.deentity.replace_all(pre_content)}```\n'
def blockdata_pass_emit(self, node: DocNode):
- return f'{node.content}\n\n'
+ return f'\n{node.content}\n'
# --------------------------------------------------------------------------
def p_emit(self, node: DocNode):
- result = self.emit_children(node)
- if self._inner_list == '':
- result += '\n\n'
- return result
+ return f'\n{self.emit_children(node)}\n'
def br_emit(self, node: DocNode):
return '\n'
def headline_emit(self, node: DocNode):
prefix = '#' * node.level
- return f'{prefix} {self.emit_children(node)}\n\n'
+ if node.parent not in ('document', 'headline', 'p'):
+ prefix = f'\n{prefix}'
+ return f'{prefix} {self.emit_children(node)}\n'
# --------------------------------------------------------------------------
@@ -130,7 +129,7 @@ class MarkdownEmitter(BaseEmitter):
# --------------------------------------------------------------------------
def hr_emit(self, node: DocNode):
- return '----\n\n'
+ return '\n----\n'
def a_emit(self, node: DocNode):
link_text = self.emit_children(node)
@@ -156,7 +155,7 @@ class MarkdownEmitter(BaseEmitter):
def list_emit(self, node: DocNode):
content = self.emit_children(node)
if node.level == 1:
- content += '\n\n'
+ return f'\n{content}\n'
return content
ul_emit = list_emit
diff --git a/creole/tests/test_creole2markdown.py b/creole/tests/test_creole2markdown.py
new file mode 100644
index 0000000..6c6fa89
--- /dev/null
+++ b/creole/tests/test_creole2markdown.py
@@ -0,0 +1,56 @@
+from inspect import cleandoc
+
+from creole.tests.utils.base_unittest import BaseCreoleTest
+
+
+class Creole2MarkdownTests(BaseCreoleTest):
+ def creole2markdown(self, creole_string, html_string, markdown_string, debug=False):
+ self.assert_creole2html(raw_creole=creole_string, raw_html=html_string, debug=debug)
+ self.assert_html2markdown(
+ markdown_string=markdown_string,
+ html_string=html_string,
+ )
+
+ def test_basic(self):
+ self.creole2markdown(
+ creole_string='= Headline =',
+ html_string='<h1>Headline</h1>',
+ markdown_string='# Headline',
+ debug=True,
+ )
+
+ def test_newline(self):
+ self.creole2markdown(
+ creole_string=cleandoc(
+ '''
+ A Test line
+ e.g.:
+ {{{
+ print('foobar')
+ }}}
+ Text below.
+ '''
+ ),
+ html_string=cleandoc(
+ '''
+ <p>A Test line<br />
+ e.g.:</p>
+ <pre>
+ print('foobar')
+ </pre>
+ <p>Text below.</p>
+ '''
+ ),
+ markdown_string=cleandoc(
+ '''
+ A Test line
+ e.g.:
+ ```
+ print('foobar')
+ ```
+
+ Text below.
+ '''
+ ),
+ debug=True,
+ )
diff --git a/creole/tests/test_cross_compare_markdown.py b/creole/tests/test_cross_compare_markdown.py
index 181e36d..730b94f 100644
--- a/creole/tests/test_cross_compare_markdown.py
+++ b/creole/tests/test_cross_compare_markdown.py
@@ -81,7 +81,25 @@ class CrossCompareMarkdownTests(BaseCreoleTest):
markdown_string='----',
html_string='<hr />',
)
+ self.cross_compare_markdown(
+ markdown_string=cleandoc(
+ '''
+ before
+ ----
+
+ after
+ '''
+ ),
+ html_string=cleandoc(
+ '''
+ <p>before</p>
+ <hr />
+ <p>after</p>
+ '''
+ ),
+ # debug=True,
+ )
def test_typeface_basic(self):
self.cross_compare_markdown(
markdown_string='_emphasis_',
diff --git a/creole/tests/test_html2markdown.py b/creole/tests/test_html2markdown.py
index c587928..2651339 100644
--- a/creole/tests/test_html2markdown.py
+++ b/creole/tests/test_html2markdown.py
@@ -140,5 +140,26 @@ class MarkdownTests(BaseCreoleTest):
<p>Text after the table.</p>
'''
),
+ debug=True,
+ )
+ self.assert_html2markdown(
+ markdown_string=cleandoc(
+ '''
+ A table:
+
+ | A1 | B1 |
+
+ Text after.
+ '''
+ ),
+ html_string=cleandoc(
+ '''
+ <p>A table:</p>
+ <table>
+ <tr><td>A1</td><td>B1</td></tr>
+ </table>
+ <p>Text after.</p>
+ '''
+ ),
# debug=True,
)