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