Giter Club home page Giter Club logo

python-creole's Introduction

about python-creole

python-creole is a OpenSource (GPL) Python lib for converting markups. python-creole is pure python. No external libs needed.

Compatible Python Versions (see tox config in pyproject.toml):

  • 3.9, 3.8, 3.7
  • PyPy3

Existing converters:

  • creole -> html
  • html -> creole markup
  • reSt -> html (for clean html code)
  • html -> reStructuredText markup (only a subset of reSt supported)
  • html -> textile markup (not completed yet)
  • html -> markdown markup

The creole2html part based on the creole markup parser and emitter from the MoinMoin project by Radomir Dopieralski and Thomas Waldmann.

Build Status on github
Coverage Status on coveralls.io coveralls.io/r/jedie/python-creole
Status on landscape.io landscape.io/github/jedie/python-creole/master
PyPi version pypi.org/project/python-creole/

install

Python packages available on: http://pypi.python.org/pypi/python-creole/

~$ pip install python-creole

To setup a virtualenv via Poetry, see unittests section below.

example

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):

>>> 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)

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

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

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.:

>>> 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. 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:

  • creole2html
  • html2creole
  • html2rest
  • html2textile
  • html2markdown

Here the --help output from html2creole:

$ html2creole --help
usage: html2creole [-h] [-v] [--encoding ENCODING] sourcefile destination

python-creole is an open-source (GPL) markup converter in pure Python for:
creole2html, html2creole, html2ReSt, html2textile

positional arguments:
  sourcefile           source file to convert
  destination          Output filename

optional arguments:
  -h, --help           show this help message and exit
  -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:

$ html2creole foobar.html foobar.creole

documentation

We store documentation/examples into the project wiki:

How to handle unknown html tags in html2creole:

Contributers should take a look at this page:

Creole Markup Cheat Sheet can be found here: http://www.wikicreole.org/wiki/CheatSheet

Creole Markup Cheat Sheet

unittests

# clone repository (or use your fork):
~$ git clone https://github.com/jedie/python-creole.git
~$ cd python-creole

# install or update poetry:
~/python-creole$ make install-poetry

# install python-creole via poetry:
~/python-creole$ make install

# Run pytest:
~/python-creole$ make pytest

# 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
install-poetry       install or update poetry
install              install python-creole via poetry
update               Update the dependencies as according to the pyproject.toml file
lint                 Run code formatters and linter
fix-code-style       Fix code formatting
tox-listenvs         List all tox test environments
tox                  Run pytest via tox with all environments
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 How to do this, read: https://github.com/jedie/python-creole/wiki/Use-In-Setup

Note: In this case you must install docutils! See above.

history

  • *dev*
    • TBC
  • v1.5.0.rc3 - 2022-08-20
    • NEW: html2markdown
    • creole2html bugfixes:
      • replace wrong <tt> with <code>
      • Add newline after lists
    • Remove deprecated "parser_kwargs" and "emitter_kwargs"
    • Rename git master branch to main.
  • v1.4.10 - 2021-05-11
    • Update some string formatting to f-strings
    • Replace some join() list comprehension with generators
    • Test on github actions also under MacOS
    • Remove Travis CI (All tests already running via github actions)
  • v1.4.9 - 2020-11-4
  • v1.4.8 - 2020-10-17 - compare v1.4.7...v1.4.8
  • v1.4.7 - 2020-10-17 - compare v1.4.6...v1.4.7
    • update_rst_readme() will touch README.rst if there are not change (timestamp will not changed in file)
    • Run tests with Python 3.9, too.
    • Some meta updates to project setup
  • v1.4.6 - 2020-02-13 - compare v1.4.5...v1.4.6
    • less restricted dependency specification
  • v1.4.5 - 2020-02-13 - compare v1.4.4...v1.4.5
  • v1.4.4 - 2020-02-07 - compare v1.4.3...v1.4.4
    • Fix #44: Move poetry-publish to dev-dependencies and lower docutils requirement to ^0.15
    • some code style updated
    • Always update README.rst before publish
  • v1.4.3 - 2020-02-01 - compare v1.4.2...v1.4.3
  • v1.4.2 - 2020-02-01 - compare v1.4.1...v1.4.2
    • Update CI configs on github and travis
    • Update Makefile: add make publish and make update-rst-readme
    • Add generated README.rst in repository to fix install problems about missing readme
  • v1.4.1 - 2020-01-19 - compare v1.4.0...v1.4.1
  • v1.4.0 - 2020-01-19 - compare v1.3.2...v1.4.0
    • modernize project:
      • use poetry
      • Add a Makefile
      • use pytest and tox
      • remove Python v2 support
      • Test with Python v3.6, v3.7 and v3.8
  • v1.3.2 - 2018-02-27 - compare v1.3.1...v1.3.2
    • Adding optional img size to creole2html and html2creole contributed by John Dupuy
    • run tests also with python 3.5 and 3.6
  • v1.3.1 - 2015-08-15 - compare v1.3.0...v1.3.1
    • Bugfix for "Failed building wheel for python-creole"
  • v1.3.0 - 2015-06-02 - compare v1.2.2...v1.3.0
    • Refactory internal file structure
    • run unittests and doctests with nose
    • Refactor CLI tests
    • skip official support for Python 2.6
    • small code cleanups and fixes.
    • use json.dumps() instead of repr() in some cases
  • v1.2.2 - 2015-04-05 - compare v1.2.1...v1.2.2
    • Bugfix textile unittests if url scheme is unknown
    • migrate google-code Wiki to github and remove google-code links
  • v1.2.1 - 2014-09-14 - compare v1.2.0...v1.2.1
    • Use origin PyPi code to check generated reStructuredText in setup.py
    • Update unitest for textile v2.1.8
  • v1.2.0 - 2014-05-15 - compare v1.1.1...v1.2.0
    • NEW: Add <<code>> example macro (Source code highlighting with pygments) - implemented by Julien Enselme
    • NEW: Add <<toc>> macro to create a table of contents list
    • Bugfix for: AttributeError: 'CreoleParser' object has no attribute '_escaped_char_repl'
    • Bugfix for: AttributeError: 'CreoleParser' object has no attribute '_escaped_url_repl'
    • API Change: Callable macros will raise a TypeError instead of create a DeprecationWarning (Was removed in v0.5)
  • v1.1.1 - 2013-11-08
    • Bugfix: Setup script exited with error: can't copy 'README.creole': doesn't exist or not a regular file
  • v1.1.0 - 2013-10-28
    • NEW: Simple commandline interface added.
  • v1.0.7 - 2013-08-07
    • Bugfix in 'clean reStructuredText html writer' if docutils => v0.11 used.
    • Bugfix for PyPy 2.1 usage
  • v1.0.6 - 2012-10-15
    • Security fix in rest2html: Disable "file_insertion_enabled" and "raw_enabled" as default.
  • v1.0.5 - 2012-09-03
    • made automatic protocol links more strict: Only whitespace before and at the end are allowed.
    • Bugfix: Don't allow ftp:/broken (Only one slash) to be a link.
  • v1.0.4 - 2012-06-11
    • html2rest: Handle double link/image substitution and raise better error messages
    • Bugfix in unittests (include test README file in python package). Thanks to Wen Heping for reporting this.
  • v1.0.3 - 2012-06-11
    • Bugfix: AttributeError: 'module' object has no attribute 'interesting_cdata' from HTMLParser patch. Thanks to Wen Heping for reporting this.
    • Fix a bug in get_long_description() ReSt test for Py3k and his unittests.
    • Use Travis CI, too.
  • v1.0.2 - 2012-04-04
  • v1.0.1 - 2011-11-16
  • v1.0.0 - 2011-10-20
    • Change API: Replace 'parser_kwargs' and 'emitter_kwargs' with separate arguments. (More information on API Wiki Page)
  • v0.9.2
    • Turn zip_safe in setup.py on and change unittests API.
  • v0.9.1
    • Many Bugfixes, tested with CPython 2.6, 2.7, 3.2 and PyPy v1.6
  • v0.9.0
  • v0.8.5
    • Bugfix in html2creole: ignore links without href
  • v0.8.4
  • v0.8.3
  • v0.8.2
    • Bugfix in get_long_description() error handling (local variable 'long_description_origin' referenced before assignment)
  • v0.8.1
    • Bugfix for installation under python 2.5
    • Note: setup helper changed: rename GetLongDescription(...) to get_long_description(...)
  • v0.8
  • v0.7.3
    • Bugfix in html2rest:
      • table without <th> header
      • new line after table
      • create reference hyperlinks in table cells intead of embedded urls.
      • Don't always use raise_unknown_node()
    • Add child content to raise_unknown_node()
  • v0.7.2
    • Activate ---- to <hr> in html2rest
    • Update demo.py
  • v0.7.1
    • Bugfix if docutils are not installed
    • API change: rest2html is now here: from creole.rest2html.clean_writer import rest2html
  • v0.7.0
    • NEW: Add a html2reStructuredText converter (only a subset of reSt supported)
  • v0.6.1
    • Bugfix: separate lines with one space in "wiki style line breaks" mode
  • v0.6
    • NEW: html2textile converter
    • some API changed!
  • v0.5
    • API changed:
      • Html2CreoleEmitter optional argument 'unknown_emit' takes now a callable for handle unknown html tags.
      • No macros used as default in creole2html converting.
      • We remove the support for callable macros. Only dict and modules are allowed.
    • remove unknown html tags is default behaviour in html2creole converting.
    • restructure and cleanup sourcecode files.
  • v0.4
    • only emit children of empty tags like div and span (contributed by Eric O'Connell)
    • remove inter wiki links and doesn't check the protocol
  • v0.3.3
    • Use <tt> when {{{ ... }}} is inline and not <pre>, see: PyLucid Forum Thread
    • Bugfix in html2creole: insert newline before new list. TODO: apply to all block tags: issues 16
  • v0.3.2
  • v0.3.1
    • Make argument 'block_rules' in Parser() optional
  • v0.3.0
    • creole2html() has the optional parameter 'blog_line_breaks' to switch from default blog to wiki line breaks
  • v0.2.8
    • bugfix in setup.py
  • v0.2.7
    • handle obsolete non-closed <br> tag
  • v0.2.6
    • bugfix in setup.py
    • Cleanup DocStrings
    • add unittests
  • v0.2.5
    • creole2html: Bugfix if "--", "//" etc. stands alone, see also: issues 12
    • Note: bold, italic etc. can't cross line any more.
  • v0.2.4
    • creole2html: ignore file extensions in image tag
  • v0.2.3
    • html2creole bugfix/enhanced: convert image tag without alt attribute:
      • see also: issues 6
      • Thanks Betz Stefan alias 'encbladexp'
  • v0.2.2
    • html2creole bugfix: convert <a href="/url/">Search & Destroy</a>
  • v0.2.1
    • html2creole bugfixes in:
      • converting tables: ignore tbody tag and better handling p and a tags in td
      • converting named entity
  • v0.2
    • remove all django template tag stuff: issues 3
    • html code always escaped
  • v0.1.1
    • improve macros stuff, patch by Vitja Makarov: issues 2
  • v0.1.0

first source code was written 27.11.2008: Forum thread (de)

Project links

GitHub https://github.com/jedie/python-creole
Wiki https://github.com/jedie/python-creole/wiki
PyPi https://pypi.org/project/python-creole/

donation

python-creole's People

Contributors

drd avatar jedie avatar jenselme avatar johnad avatar jone avatar jugmac00 avatar tjni avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-creole's Issues

<<toc>> and chaotic headlines...

e.g.:

def test_toc_chaotic_headlines(self):
    self.assert_creole2html(r"""
        <<toc>>
        = level 1
        === level 3
        == level 2
        ==== level 4
        = level 1
    """, """
        <ul>
            <li><a href="#level 1">level 1</a></li>
        </ul>
        <a name="level 1"><h1>level 1</h1></a>
        <a name="level 3"><h3>level 3</h3></a>
        <a name="level 2"><h2>level 2</h2></a>
        <a name="level 4"><h4>level 4</h4></a>
        <a name="level 1"><h1>level 1</h1></a>
    """)

This is a passed test. But should the output looks like this?!?
IMHO we should create empty <ul> levels, or?

Fail to install with python 3.5

Hi,

I just tried to install python-creole with pip install creole on python 3.5 and I get this error message:

Collecting creole
  Using cached creole-1.2.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-cpqal4_a/creole/setup.py", line 4, in <module>
        import creole
      File "/tmp/pip-build-cpqal4_a/creole/creole/__init__.py", line 28, in <module>
        from creole.rules import Rules
      File "/tmp/pip-build-cpqal4_a/creole/creole/rules.py", line 144
        self.wiki = ur'''(?P<wiki>[%s]\w+[%s]\w+)''' % (up_case, up_case)
                                                   ^
    SyntaxError: invalid syntax

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-cpqal4_a/creole

error: can't copy 'README.creole': doesn't exist or not a regular file

I use "pip install python-creole" to install ,but have this error!

running install_data

error: can't copy 'README.creole': doesn't exist or not a regular file


Command C:\Python27\python2.7.exe -c "import setuptools;file='C:\Documents
and Settings\Administrator\build\python-creole\setup.py';exec(compile(open(_
file_).read().replace('\r\n', '\n'), file, 'exec'))" install --single-vers
ion-externally-managed --record c:\docume1\admini1\locals~1\temp\pip-bq6pnv-re
cord\install-record.txt failed with error code 1
Storing complete log in C:\Documents and Settings\Administrator\Application Data
\pip\pip.log

I have written a mild extension to allow image size

I've written almost trivial change on my fork of python-creole and would be happy to send a pull request to the repo.

I currently use creole for allowing users to create text content on a variety of my websites. The problem I've encounted is that creole's image support is not properly complete. It allows for people to add inline images, for example:

{{my_image.png | My Image}}

which in turn, renders the html:

<img src="my_image.png" title="My Image" alt="My Image" />

But when the web page is requested, it is, by default, forcing the web browser to load (or start loading) any images before it can stably render the web page. That is because the rendering engine does not know how big the picture should be yet.

If there are one or two images on a small page; that is not a big deal. But for dozens of pictures on a large page; or where the images are being pulled from another domain, this can wreak havoc on the user viewing the page. The page will "bounce around" while loading the pictures. It can get really bad on a mobile device.

How can this be solved? Well, I could write a macro of some kind. A <<sized_image ...>> of some kind. But there are two non-technical problems with that:

  1. Creole's philosophy is that "there should only be one way of doing something". I've now created two ways of doing the same thing: display an image.
  2. Macro's are generally meant for exceptional cases. Myself, I use the <<pre>> and <<code>> macros already. I've also written an <<anchor>> macro for adding link anchors. But those are rare use items. Adding images is far more common.

My fix?

I added an option to creole2html:

creole2html(text, allow_img_size=True)

Which allows another pipe symbol followed by comma-separated width and height:

{{my_image.png | My Image | 160, 90 }}

which renders:

<img src="my_image.png" title="My Image" alt="My Image" width="160" height="90" />

By default, allow_img_size==False since, by default, the library should process creole sticking to the pure specfication.

Interested in this option? If so, let me know. I'll add it to the documentation, add a test case, and then send a pull request.

Don't copy README.creole to $PWD

Hello!
I have a work folder cloned from git and virtualenv in ./bin/
I have ./bin in .gitignore, just in case.

I installing pip packets like ./bin/pip install python-creole==1.3.2 and getting a README.creole in my git folder.
I wasn't glad when found dirty git.

./bin/pip uninstall python-creole
Found existing installation: python-creole 1.3.2
Uninstalling python-creole-1.3.2:
  Would remove:
    /tmp/test/test5/README.creole
    /tmp/test/test5/bin/creole2html
    /tmp/test/test5/bin/html2creole
    /tmp/test/test5/bin/html2rest
    /tmp/test/test5/bin/html2textile
    /tmp/test/test5/lib/python3.6/site-packages/creole/*
    /tmp/test/test5/lib/python3.6/site-packages/python_creole-1.3.2.dist-info/*

Please, consider not to copy this file anywhere

easier solution for <<doc>>

Maybe change the <<doc>> code with:

def headlines2html(headlines):
    cur_level = 0
    result = []
    for level, content in headlines:
        while level>cur_level:
            result.append('\t'*cur_level+'<ul>')
            cur_level += 1
        while level<cur_level:
            cur_level -= 1
            result.append('\t'*cur_level+'</ul>')
        result.append('{0}<li><a href="#{1}">{1}</a></li>'.format('\t'*cur_level, content))
    while cur_level:
        cur_level -= 1
        result.append('\t'*cur_level+'</ul>')
    return "\n".join(result)


headlines = [
    (1, u'headline 1 level 1'),
    (2, u'headline 2 level 2'),
    (2, u'headline 3 level 2'),
    (4, u'headline 4 level 4'),
    (1, u'headline 5 level 1'),
    (3, u'headline 6 level 3')
]

print(headlines2html(headlines))

based on code from http://www.python-forum.de/viewtopic.php?p=258144#p258144

TypeError: expected string or buffer

./setup.py --long-description

...
File "/home/jens/PyLucid_env/src/python-creole/creole/rest2html/clean_writer.py", line 102, in starttag
part = '%s="%s"' % (name.lower(), self.attval(value))
File "/home/jens/PyLucid_env/local/lib/python2.7/site-packages/docutils/writers/html4css1/init.py", line 367, in attval
encoded = self.encode(whitespace.sub(' ', text))
TypeError: expected string or buffer

docutils dependency causing conflict with botocore

Since the refactoring work to move to poetry and pyproject, a dependency on docutils>=0.16 has been added to the project dependencies.

botocore seems to also have a dependency on docutils >=0.15, <0.16, which makes both packages not installable at the same time.

On the last version before the refactor (1.3.2 i think) there were no documented dependencies in setup.py

Questions:

  • Is the docutils really a dependency to run the code, or just a dev-dependency ?
  • Can the requirement be lowered to >=0.15 ?
  • Otherwise can it be marked as an optional dependency ?
  • Unrelated, but I also noticed that poetry-publish is marked as dependency, shouldn't this really be a dev dependency ?

Thanks a lot !

problem with html2creole AttributeError: 'NoneType' object has no attribute 'parent'

I'm getting an error when running the following code

f = open("/tmp/test.html","r")
html2creole(unicode(fr,errors='ignore'))

In [54]: html2creole(unicode(fr,errors='ignore'))

In [53]: html2creole(unicode(fr,errors='ignore'))

AttributeError Traceback (most recent call last)

/tmp/ in ()

/usr/local/lib/python2.7/dist-packages/creole/init.pyc in html2creole(html_string, debug, parser_kwargs, emitter_kwargs, unknown_emit)
110 warnings.warn("parser_kwargs argument in html2creole would be removed in the future!", PendingDeprecationWarning)
111
--> 112 document_tree = parse_html(html_string, debug=debug)
113
114 emitter_kwargs2 = {

/usr/local/lib/python2.7/dist-packages/creole/init.pyc in parse_html(html_string, debug)
91
92 h2c = HtmlParser(debug=debug)
---> 93 document_tree = h2c.feed(html_string)
94 if debug:
95 h2c.debug()

/usr/local/lib/python2.7/dist-packages/creole/html_parser/parser.pyc in feed(self, raw_data)
157 # print("-"*79)

158

--> 159 HTMLParser2.feed(self, data)
160
161 return self.root

/usr/lib/python2.7/HTMLParser.pyc in feed(self, data)
107 """
108 self.rawdata = self.rawdata + data
--> 109 self.goahead(0)
110
111 def close(self):

/usr/lib/python2.7/HTMLParser.pyc in goahead(self, end)
151 k = self.parse_starttag(i)
152 elif startswith("</", i):
--> 153 k = self.parse_endtag(i)
154 elif startswith("<!--", i):
155 k = self.parse_comment(i)

/usr/local/lib/python2.7/dist-packages/creole/shared/html_parser.pyc in parse_endtag(self, i)
98 return j
99 # --- changed end -----------------------------------------------------

--> 100 self.handle_endtag(tag.lower())
101 self.clear_cdata_mode()
102 return j
/usr/local/lib/python2.7/dist-packages/creole/html_parser/parser.pyc in handle_endtag(self, tag)
255 self._go_up()
256 else:
--> 257 self.cur = self.cur.parent
258
259 #-------------------------------------------------------------------------

Here's the actual html code (I don't know if I can attach files)

<html>
 <head>
  <title>
   Regions - Online Help - EN
  </title>
  <link href="AppStyles.css" type="text/css" rel="stylesheet" />
  <link href="pagestyles.css" type="text/css" rel="stylesheet" />
  <link href="style_blue.css" type="text/css" rel="stylesheet" />
  <script type="text/javascript" src="static_page.js">
  </script>
  <meta http-equiv="Cache-Control" content="no-cache" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="expires" content="FRI, 13 APR 1999 01:00:00 GMT" />
  <meta name="ROBOTS" content="NOINDEX, NOFOLLOW, NOARCHIVE" />
 </head>
 <body class="page_body">
  <p>
   <span class="breadcrumbs">
    <a href="Welcome.htm" title="">
     Home
    </a>
    &nbsp;&gt;&nbsp;
    <a href="Welcome.htm" title="">
     Welcome
    </a>
    &nbsp;&gt;&nbsp;
    <a href="reporting1.htm" title="">
     Reporting
    </a>
    &nbsp;&gt;&nbsp;
    <a href="regions.htm" title="">
     Regions
    </a>
   </span>
  </p>
  <p>
   <span class="heading">
    Regions
   </span>
  </p>
  <p>
   This demographic report allows you to view the regional breakdown of mentions by country.&nbsp;
   <br />
   Viewed via the
   <img alt="" style="border:0px solid;" src="./images/regions.gif" />
   icon in the
   <strong>
    Icon Panel
   </strong>
   . It can also be viewed by double-clicking on the
   <strong>
    <a href="summary_dashboard1.htm">
     Summary&nbsp;Dashboard
    </a>
   </strong>
   and selecting the&nbsp;appropriate&nbsp;option. &nbsp;This has two components,
   <strong>
    Report
   </strong>
   and
   <strong>
   </strong>
   <strong>
    <a href="data_explorer.htm">
     Data Explorer
    </a>
   </strong>
   .
  </p>
  <br />
  <span style="font-size: 18px;">
   <strong>
    Report
   </strong>
  </span>
  <br />
  <br />
  <img alt="" style="border:0px solid;" src="./images/Regions.png" />
  <br />
  <br />
  You can change the way that the mentions are displayed using the drop down list accessed via the
  <img alt="" style="border:0px solid;" src="./images/config-over.gif" />
  icon.
  <br />
  <br />
  <strong>
   <span style="font-size: 16px;">
   </span>
  </strong>
  <strong>
   <a href="data_explorer.htm">
    Data Explorer
   </a>
  </strong>
  <br />
  <br />
  The
  <strong>
  </strong>
  <strong>
   <a href="data_explorer.htm">
    Data Explorer
   </a>
  </strong>
  displays the mentions that make up the data shown in the
  <strong>
   Report
  </strong>
  panel. In addition there is the ability to filter the mentions by country via the filter located to the right of the
  <strong>
   Email
  </strong>
  button.&nbsp;
 </body>
</html>

Deprecation warnings on Python 3.7

/home/jugmac00/Projects/bliss_deployment/work/_/home/jugmac00/.batou-shared-eggs/python_creole-1.3.2-py3.7.egg/creole/parser/creol2html_parser.py:48
  /home/jugmac00/Projects/bliss_deployment/work/_/home/jugmac00/.batou-shared-eggs/python_creole-1.3.2-py3.7.egg/creole/parser/creol2html_parser.py:48: DeprecationWarning: Flags not at the start of the expression '(?P<image>\n         ' (truncated)
    re.VERBOSE | re.UNICODE

/home/jugmac00/Projects/bliss_deployment/work/_/home/jugmac00/.batou-shared-eggs/python_creole-1.3.2-py3.7.egg/creole/parser/creol2html_parser.py:56
  /home/jugmac00/Projects/bliss_deployment/work/_/home/jugmac00/.batou-shared-eggs/python_creole-1.3.2-py3.7.egg/creole/parser/creol2html_parser.py:56: DeprecationWarning: Flags not at the start of the expression '\n            \\| \\s*\n' (truncated)
    cell_re = re.compile(SpecialRules.cell, re.VERBOSE | re.UNICODE)

/home/jugmac00/Projects/bliss_deployment/work/_/home/jugmac00/.batou-shared-eggs/python_creole-1.3.2-py3.7.egg/creole/parser/creol2html_parser.py:59
  /home/jugmac00/Projects/bliss_deployment/work/_/home/jugmac00/.batou-shared-eggs/python_creole-1.3.2-py3.7.egg/creole/parser/creol2html_parser.py:59: DeprecationWarning: Flags not at the start of the expression '(?P<link>\n          ' (truncated)
    inline_re = re.compile('|'.join(INLINE_RULES), INLINE_FLAGS)

creole2html using blog_line_breaks=False breaks headlines

>>> import creole
>>> creole.__version__
'1.4.10'
>>> creole2html("\n== heading \n\nWiki style\\\\line breaks.", blog_line_breaks=False)
'<p>== heading </p>\n\n<p>Wiki style<br />\nline breaks.</p>'
>>> creole2html("\n== heading \n\nWiki style\\\\line breaks.", blog_line_breaks=True)
'<h2>heading</h2>\n\n<p>Wiki style<br />\nline breaks.</p>'

IMO using blog_line_breaks=True as default is not a good idea as it does not adhere to the creole 1.0 standard.

(ERROR/3) Undefined substitution referenced

Hello,

using html2rest to convert the attached test.html.txt results in a file containing a single line indented with 2 spaces:
title some text\\|test|.. |test| image:: test.jpg
and when I convert that file with rst2html and other converters from Debian's docutils 0.12+dfsg-1 I get:
test.rst:1: (ERROR/3) Undefined substitution referenced: "test".

thank you,
Daniele

linebreaks

Sorry if this is more of a question. Is there an easy way to keep double line breaks as a paragraph <p> and allow single linebreaks to output <br>?

Test failures for Python 3.6

python3 -m venv venv
. venv/bin/activate
pip install nose

python setup.py nosetests

...
FAIL: test_creole2html (creole.tests.test_cli.CreoleCLITests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 33, in test_creole2html
    cli_str="creole2html",
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 86, in _test_convert
    verbose=False,
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 62, in assertSubprocess
    popen_args2, retcode2, stdout2 = self.subprocess(popen_args, verbose)
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 48, in subprocess
    self.fail("Error subprocess call with %r: %s" % (popen_args, err))
AssertionError: Error subprocess call with ['creole2html', '/tmp/tmppu8uj9b3', '/tmp/tmpvee3cf5j']: [Errno 2] No such file or directory: 'creole2html': 'creole2html'
    """Fail immediately, with the given message."""
>>  raise self.failureException("Error subprocess call with ['creole2html', '/tmp/tmppu8uj9b3', '/tmp/tmpvee3cf5j']: [Errno 2] No such file or directory: 'creole2html': 'creole2html'")
    

======================================================================
FAIL: test_html2creole (creole.tests.test_cli.CreoleCLITests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 40, in test_html2creole
    cli_str="html2creole",
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 86, in _test_convert
    verbose=False,
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 62, in assertSubprocess
    popen_args2, retcode2, stdout2 = self.subprocess(popen_args, verbose)
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 48, in subprocess
    self.fail("Error subprocess call with %r: %s" % (popen_args, err))
AssertionError: Error subprocess call with ['html2creole', '/tmp/tmp9k5nqo3f', '/tmp/tmpbfn54j47']: [Errno 2] No such file or directory: 'html2creole': 'html2creole'
    """Fail immediately, with the given message."""
>>  raise self.failureException("Error subprocess call with ['html2creole', '/tmp/tmp9k5nqo3f', '/tmp/tmpbfn54j47']: [Errno 2] No such file or directory: 'html2creole': 'html2creole'")
    

======================================================================
FAIL: test_html2rest (creole.tests.test_cli.CreoleCLITests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 51, in test_html2rest
    cli_str="html2rest",
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 86, in _test_convert
    verbose=False,
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 62, in assertSubprocess
    popen_args2, retcode2, stdout2 = self.subprocess(popen_args, verbose)
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 48, in subprocess
    self.fail("Error subprocess call with %r: %s" % (popen_args, err))
AssertionError: Error subprocess call with ['html2rest', '/tmp/tmpv0mbo16n', '/tmp/tmpja2_3n4v']: [Errno 2] No such file or directory: 'html2rest': 'html2rest'
    """Fail immediately, with the given message."""
>>  raise self.failureException("Error subprocess call with ['html2rest', '/tmp/tmpv0mbo16n', '/tmp/tmpja2_3n4v']: [Errno 2] No such file or directory: 'html2rest': 'html2rest'")
    

======================================================================
FAIL: test_html2textile (creole.tests.test_cli.CreoleCLITests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 58, in test_html2textile
    cli_str="html2textile",
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 86, in _test_convert
    verbose=False,
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 62, in assertSubprocess
    popen_args2, retcode2, stdout2 = self.subprocess(popen_args, verbose)
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 48, in subprocess
    self.fail("Error subprocess call with %r: %s" % (popen_args, err))
AssertionError: Error subprocess call with ['html2textile', '/tmp/tmpefk9xzdo', '/tmp/tmphbkeu11_']: [Errno 2] No such file or directory: 'html2textile': 'html2textile'
    """Fail immediately, with the given message."""
>>  raise self.failureException("Error subprocess call with ['html2textile', '/tmp/tmpefk9xzdo', '/tmp/tmphbkeu11_']: [Errno 2] No such file or directory: 'html2textile': 'html2textile'")
    

======================================================================
FAIL: test_version (creole.tests.test_cli.CreoleCLITests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jugmac00/Projects/python-creole/creole/tests/test_cli.py", line 104, in test_version
    verbose=False,
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 62, in assertSubprocess
    popen_args2, retcode2, stdout2 = self.subprocess(popen_args, verbose)
  File "/home/jugmac00/Projects/python-creole/creole/tests/utils/unittest_subprocess.py", line 48, in subprocess
    self.fail("Error subprocess call with %r: %s" % (popen_args, err))
AssertionError: Error subprocess call with ['creole2html', '--version']: [Errno 2] No such file or directory: 'creole2html': 'creole2html'
    """Fail immediately, with the given message."""
>>  raise self.failureException("Error subprocess call with ['creole2html', '--version']: [Errno 2] No such file or directory: 'creole2html': 'creole2html'")
    

----------------------------------------------------------------------
Ran 236 tests in 1.254s

FAILED (failures=5)

Tox is broken

When I check out current master and run tox...

❯ tox
py39 inst-nodeps: /home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py39 installed: docutils==0.16,python-creole @ file:///home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py39 run-test-pre: PYTHONHASHSEED='2726393709'
py39 run-test: commands[0] | make install
Found Poetry version 1.0.10, ok.
poetry install
Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in pyproject.toml. You may be getting outdated dependencies. Run update to update them.

[SolverProblemError]
Because python-creole depends on pyupgrade (*) which doesn't match any versions, version solving failed.
Makefile:29: recipe for target 'install' failed
make: *** [install] Error 1
ERROR: InvocationError for command /usr/bin/make install (exited with code 2)
py38 inst-nodeps: /home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py38 installed: docutils==0.16,python-creole @ file:///home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py38 run-test-pre: PYTHONHASHSEED='2726393709'
py38 run-test: commands[0] | make install
Found Poetry version 1.0.10, ok.
poetry install
Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in pyproject.toml. You may be getting outdated dependencies. Run update to update them.

[SolverProblemError]
Because python-creole depends on pyupgrade (*) which doesn't match any versions, version solving failed.
Makefile:29: recipe for target 'install' failed
make: *** [install] Error 1
ERROR: InvocationError for command /usr/bin/make install (exited with code 2)
py37 inst-nodeps: /home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py37 installed: docutils==0.16,python-creole @ file:///home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py37 run-test-pre: PYTHONHASHSEED='2726393709'
py37 run-test: commands[0] | make install
Found Poetry version 1.0.10, ok.
poetry install
Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in pyproject.toml. You may be getting outdated dependencies. Run update to update them.

[SolverProblemError]
Because python-creole depends on pyupgrade (*) which doesn't match any versions, version solving failed.
Makefile:29: recipe for target 'install' failed
make: *** [install] Error 1
ERROR: InvocationError for command /usr/bin/make install (exited with code 2)
py36 inst-nodeps: /home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py36 installed: docutils==0.16,python-creole @ file:///home/jugmac00/Projects/python-creole/.tox/.tmp/package/1/python-creole-1.4.8.tar.gz
py36 run-test-pre: PYTHONHASHSEED='2726393709'
py36 run-test: commands[0] | make install
Found Poetry version 1.0.10, ok.
poetry install
Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in pyproject.toml. You may be getting outdated dependencies. Run update to update them.

[SolverProblemError]
Because python-creole depends on pyupgrade (*) which doesn't match any versions, version solving failed.
Makefile:29: recipe for target 'install' failed
make: *** [install] Error 1
ERROR: InvocationError for command /usr/bin/make install (exited with code 2)
________________________________________________________ summary _________________________________________________________
ERROR:   py39: commands failed
ERROR:   py38: commands failed
ERROR:   py37: commands failed
ERROR:   py36: commands failed

macro error with PyPy

the macros doesn't work with newer PyPy version:

  File "/home/pypy/PyLucid_env/site-packages/creole/creole2html/parser.py", line 431, in _replace
    replace_method = getattr(self, '_%s_repl' % name)
AttributeError: 'CreoleParser' object has no attribute '_inline_macro_repl'

Provide `tox.ini` for easier local testing

With tox / https://tox.readthedocs.io/en/latest/ it is easier to test multiple python versions locally.

A basic tox.ini could look like this:

[tox]
envlist =
    py27,
    py36,
    py37,
    py38

[testenv]
deps =
    nose
commands =
    python setup.py nosetests

This currently fails as docutils is not installed:

❯ tox -e=py36
GLOB sdist-make: /home/jugmac00/Projects/python-creole/setup.py
ERROR: invocation failed (exit code 1), logfile: /home/jugmac00/Projects/python-creole/.tox/log/GLOB-0.log
======================================================= log start =======================================================
Test creole2rest and raise an error, if rendering failed...
Traceback (most recent call last):
  File "/home/jugmac00/Projects/python-creole/creole/rest_tools/pypi_rest2html.py", line 26, in <module>
    import docutils
ModuleNotFoundError: No module named 'docutils'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "setup.py", line 39, in <module>
    long_description = get_long_description(PACKAGE_ROOT)
  File "/home/jugmac00/Projects/python-creole/creole/setup_utils.py", line 121, in get_long_description
    from creole.rest_tools.pypi_rest2html import pypi_rest2html
  File "/home/jugmac00/Projects/python-creole/creole/rest_tools/pypi_rest2html.py", line 36, in <module>
    raise DocutilsImportError(msg)
creole.exceptions.DocutilsImportError: No module named 'docutils' - You can't use rest2html! Please install: http://pypi.python.org/pypi/docutils

I guess both docutils and pygments should be listed in the setup.py as extra_require

add html2rest

It would be great to have a reSt Emitter.

If this exist, if would write all my README files in creole and convert it on-thy-fly in setup.py to reSt for pypi ;)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.