1from __future__ import print_function, unicode_literals
2
3import io
4import os
5import sys
6import errno
7
8from .app import Grip
9from .readers import DirectoryReader, StdinReader, TextReader
10from .renderers import GitHubRenderer, OfflineRenderer
11
12
13def create_app(path=None, user_content=False, context=None, username=None,
14               password=None, render_offline=False, render_wide=False,
15               render_inline=False, api_url=None, title=None, text=None,
16               autorefresh=None, quiet=None, grip_class=None):
17    """
18    Creates a Grip application with the specified overrides.
19    """
20    # Customize the app
21    if grip_class is None:
22        grip_class = Grip
23
24    # Customize the reader
25    if text is not None:
26        display_filename = DirectoryReader(path, True).filename_for(None)
27        source = TextReader(text, display_filename)
28    elif path == '-':
29        source = StdinReader()
30    else:
31        source = DirectoryReader(path)
32
33    # Customize the renderer
34    if render_offline:
35        renderer = OfflineRenderer(user_content, context)
36    elif user_content or context or api_url:
37        renderer = GitHubRenderer(user_content, context, api_url)
38    else:
39        renderer = None
40
41    # Optional basic auth
42    auth = (username, password) if username or password else None
43
44    # Create the customized app with default asset manager
45    return grip_class(source, auth, renderer, None, render_wide,
46                      render_inline, title, autorefresh, quiet)
47
48
49def serve(path=None, host=None, port=None, user_content=False, context=None,
50          username=None, password=None, render_offline=False,
51          render_wide=False, render_inline=False, api_url=None, title=None,
52          autorefresh=True, browser=False, quiet=None, grip_class=None):
53    """
54    Starts a server to render the specified file or directory containing
55    a README.
56    """
57    app = create_app(path, user_content, context, username, password,
58                     render_offline, render_wide, render_inline, api_url,
59                     title, None, autorefresh, quiet, grip_class)
60    app.run(host, port, open_browser=browser)
61
62
63def clear_cache(grip_class=None):
64    """
65    Clears the cached styles and assets.
66    """
67    if grip_class is None:
68        grip_class = Grip
69    grip_class(StdinReader()).clear_cache()
70
71
72def render_page(path=None, user_content=False, context=None,
73                username=None, password=None,
74                render_offline=False, render_wide=False, render_inline=False,
75                api_url=None, title=None, text=None, quiet=None,
76                grip_class=None):
77    """
78    Renders the specified markup text to an HTML page and returns it.
79    """
80    return create_app(path, user_content, context, username, password,
81                      render_offline, render_wide, render_inline, api_url,
82                      title, text, False, quiet, grip_class).render()
83
84
85def render_content(text, user_content=False, context=None, username=None,
86                   password=None, render_offline=False, api_url=None):
87    """
88    Renders the specified markup and returns the result.
89    """
90    renderer = (GitHubRenderer(user_content, context, api_url)
91                if not render_offline else
92                OfflineRenderer(user_content, context))
93    auth = (username, password) if username or password else None
94    return renderer.render(text, auth)
95
96
97def export(path=None, user_content=False, context=None,
98           username=None, password=None, render_offline=False,
99           render_wide=False, render_inline=True, out_filename=None,
100           api_url=None, title=None, quiet=False, grip_class=None):
101    """
102    Exports the rendered HTML to a file.
103    """
104    export_to_stdout = out_filename == '-'
105    if out_filename is None:
106        if path == '-':
107            export_to_stdout = True
108        else:
109            filetitle, _ = os.path.splitext(
110                os.path.relpath(DirectoryReader(path).root_filename))
111            out_filename = '{0}.html'.format(filetitle)
112
113    if not export_to_stdout and not quiet:
114        print('Exporting to', out_filename, file=sys.stderr)
115
116    page = render_page(path, user_content, context, username, password,
117                       render_offline, render_wide, render_inline, api_url,
118                       title, None, quiet, grip_class)
119
120    if export_to_stdout:
121        try:
122            print(page)
123        except IOError as ex:
124            if ex.errno != 0 and ex.errno != errno.EPIPE:
125                raise
126    else:
127        with io.open(out_filename, 'w', encoding='utf-8') as f:
128            f.write(page)
129