1"""
2    python-creole
3    ~~~~~~~~~~~~~
4
5    :sourcecode:
6      https://github.com/jedie/python-creole
7
8    :PyPi:
9      https://pypi.org/project/python-creole/
10
11    :copyleft: 2008-2020 by python-creole team, see AUTHORS for more details.
12    :license: GNU GPL v3 or above, see LICENSE for more details.
13"""
14
15
16import warnings
17
18from creole.emitter.creol2html_emitter import HtmlEmitter
19from creole.emitter.html2creole_emitter import CreoleEmitter
20from creole.emitter.html2rest_emitter import ReStructuredTextEmitter
21from creole.emitter.html2textile_emitter import TextileEmitter
22from creole.parser.creol2html_parser import CreoleParser
23from creole.parser.html_parser import HtmlParser
24
25
26__version__ = "1.4.9"
27__api__ = "1.0"  # Creole 1.0 spec - http://wikicreole.org/
28
29VERSION_STRING = __version__  # remove in future
30API_STRING = __api__  # remove in future
31
32
33def creole2html(markup_string, debug=False,
34                parser_kwargs=None, emitter_kwargs=None,
35                block_rules=None, blog_line_breaks=True,
36                macros=None, verbose=None, stderr=None,
37                strict=False,
38                ):
39    """
40    convert creole markup into html code
41
42    >>> creole2html('This is **creole //markup//**!')
43    '<p>This is <strong>creole <i>markup</i></strong>!</p>'
44
45    Info: parser_kwargs and emitter_kwargs are deprecated
46    """
47    assert isinstance(markup_string, str), "given markup_string must be unicode!"
48
49    parser_kwargs2 = {
50        "block_rules": block_rules,
51        "blog_line_breaks": blog_line_breaks,
52        "debug": debug,
53    }
54    if parser_kwargs is not None:
55        warnings.warn(
56            "parser_kwargs argument in creole2html would be removed in the future!",
57            PendingDeprecationWarning)
58        parser_kwargs2.update(parser_kwargs)
59
60    # Create document tree from creole markup
61    document = CreoleParser(markup_string, **parser_kwargs2).parse()
62    if debug:
63        document.debug()
64
65    emitter_kwargs2 = {
66        "macros": macros,
67        "verbose": verbose,
68        "stderr": stderr,
69        "strict": strict,
70    }
71    if emitter_kwargs is not None:
72        warnings.warn(
73            "emitter_kwargs argument in creole2html would be removed in the future!",
74            PendingDeprecationWarning)
75        emitter_kwargs2.update(emitter_kwargs)
76
77    # Build html code from document tree
78    return HtmlEmitter(document, **emitter_kwargs2).emit()
79
80
81def parse_html(html_string, debug=False):
82    """ create the document tree from html code """
83    assert isinstance(html_string, str), "given html_string must be unicode!"
84
85    h2c = HtmlParser(debug=debug)
86    document_tree = h2c.feed(html_string)
87    if debug:
88        h2c.debug()
89    return document_tree
90
91
92def html2creole(
93    html_string,
94    debug=False,
95    parser_kwargs=None,
96    emitter_kwargs=None,
97    unknown_emit=None,
98    strict=False,
99):
100    """
101    convert html code into creole markup
102
103    >>> html2creole('<p>This is <strong>creole <i>markup</i></strong>!</p>')
104    'This is **creole //markup//**!'
105    """
106    if parser_kwargs is not None:
107        warnings.warn(
108            "parser_kwargs argument in html2creole would be removed in the future!",
109            PendingDeprecationWarning)
110
111    document_tree = parse_html(html_string, debug=debug)
112
113    emitter_kwargs2 = {
114        "unknown_emit": unknown_emit,
115        "strict": strict,
116    }
117    if emitter_kwargs is not None:
118        warnings.warn(
119            "emitter_kwargs argument in html2creole would be removed in the future!",
120            PendingDeprecationWarning)
121        emitter_kwargs2.update(emitter_kwargs)
122
123    # create creole markup from the document tree
124    emitter = CreoleEmitter(document_tree, debug=debug, **emitter_kwargs2)
125    return emitter.emit()
126
127
128def html2textile(html_string, debug=False,
129                 parser_kwargs=None, emitter_kwargs=None,
130                 unknown_emit=None
131                 ):
132    """
133    convert html code into textile markup
134
135    >>> html2textile('<p>This is <strong>textile <i>markup</i></strong>!</p>')
136    'This is *textile __markup__*!'
137    """
138    if parser_kwargs is not None:
139        warnings.warn(
140            "parser_kwargs argument in html2textile would be removed in the future!",
141            PendingDeprecationWarning)
142
143    document_tree = parse_html(html_string, debug=debug)
144
145    emitter_kwargs2 = {
146        "unknown_emit": unknown_emit,
147    }
148    if emitter_kwargs is not None:
149        warnings.warn(
150            "emitter_kwargs argument in html2textile would be removed in the future!",
151            PendingDeprecationWarning)
152        emitter_kwargs2.update(emitter_kwargs)
153
154    # create textile markup from the document tree
155    emitter = TextileEmitter(document_tree, debug=debug, **emitter_kwargs2)
156    return emitter.emit()
157
158
159def html2rest(html_string, debug=False,
160              parser_kwargs=None, emitter_kwargs=None,
161              unknown_emit=None
162              ):
163    """
164    convert html code into ReStructuredText markup
165
166    >>> html2rest('<p>This is <strong>ReStructuredText</strong> <em>markup</em>!</p>')
167    'This is **ReStructuredText** *markup*!'
168    """
169    if parser_kwargs is not None:
170        warnings.warn("parser_kwargs argument in html2rest would be removed in the future!", PendingDeprecationWarning)
171
172    document_tree = parse_html(html_string, debug=debug)
173
174    emitter_kwargs2 = {
175        "unknown_emit": unknown_emit,
176    }
177    if emitter_kwargs is not None:
178        warnings.warn(
179            "emitter_kwargs argument in html2rest would be removed in the future!",
180            PendingDeprecationWarning)
181        emitter_kwargs2.update(emitter_kwargs)
182
183    # create ReStructuredText markup from the document tree
184    emitter = ReStructuredTextEmitter(document_tree, debug=debug, **emitter_kwargs2)
185    return emitter.emit()
186