diff --git a/datasette/templates/table.html b/datasette/templates/table.html index c841e1be..6fa1781b 100644 --- a/datasette/templates/table.html +++ b/datasette/templates/table.html @@ -124,7 +124,7 @@

View and edit SQL

{% endif %} - + {% if suggested_facets %} {% include "_suggested_facets.html" %} @@ -186,6 +186,20 @@ window._setColumnTypeData = {{ set_column_type_ui|tojson }}; {% endfor %}

+
+
+

+ Markdown options: + {% if expandable_columns %}{% endif %} + {% if next_url and settings.allow_csv_stream %}{% endif %} + + + {% for key, value in url_markdown_hidden_args %} + + {% endfor %} +

+
+
{% endif %} diff --git a/datasette/views/base.py b/datasette/views/base.py index 08e9c6a5..c3a36f5a 100644 --- a/datasette/views/base.py +++ b/datasette/views/base.py @@ -206,16 +206,21 @@ class DataView(BaseView): async def as_csv(self, request, database): return await stream_csv(self.ds, self.data, request, database) + async def as_markdown(self, request, database): + return await stream_markdown(self.ds, self.data, request, database) + async def get(self, request): db = await self.ds.resolve_database(request) database = db.name database_route = db.route - _format = request.url_vars["format"] + _format = request.url_vars["format"] or request.args.get("_format") data_kwargs = {} if _format == "csv": return await self.as_csv(request, database_route) + elif _format == "markdown": + return await self.as_markdown(request, database_route) if _format is None: # HTML views default to expanding all foreign key labels diff --git a/datasette/views/database.py b/datasette/views/database.py index 44d24fb9..10018afc 100644 --- a/datasette/views/database.py +++ b/datasette/views/database.py @@ -40,7 +40,7 @@ from . import Context class DatabaseView(View): async def get(self, request, datasette): - format_ = request.url_vars.get("format") or "html" + format_ = request.url_vars.get("format") or request.args.get("_format") or "html" await datasette.refresh_schemas() @@ -591,7 +591,7 @@ class QueryView(View): if params.get("_timelimit"): extra_args["custom_time_limit"] = int(params["_timelimit"]) - format_ = request.url_vars.get("format") or "html" + format_ = request.url_vars.get("format") or request.args.get("_format") or "html" query_error = None results = None diff --git a/datasette/views/table.py b/datasette/views/table.py index 0930d3a0..82844774 100644 --- a/datasette/views/table.py +++ b/datasette/views/table.py @@ -976,7 +976,7 @@ async def table_view_traced(datasette, request): if request.method == "POST": return Response.text("Method not allowed", status=405) - format_ = request.url_vars.get("format") or "html" + format_ = request.url_vars.get("format") or request.args.get("_format") or "html" extra_extras = None context_for_html_hack = False default_labels = False @@ -2072,6 +2072,12 @@ async def table_view_data( path_with_format(request=request, format="csv", extra_qs=url_csv_args) ) url_csv_path = url_csv.split("?")[0] + # Markdown export URL + url_markdown_args = {**url_labels_extra} + url_markdown = datasette.urls.path( + path_with_format(request=request, format="markdown", extra_qs=url_markdown_args) + ) + url_markdown_path = url_markdown.split("?")[0] data.update( { "url_csv": url_csv, @@ -2082,6 +2088,13 @@ async def table_view_data( if key not in ("_labels", "_facet", "_size") ] + [("_size", "max")], + "url_markdown": url_markdown, + "url_markdown_path": url_markdown_path, + "url_markdown_hidden_args": [ + (key, value) + for key, value in urllib.parse.parse_qsl(request.query_string) + if key not in ("_labels", "_facet", "_size", "_max_rows") + ], } ) # if no sort specified AND table has a single primary key, diff --git a/test.md b/test.md new file mode 100644 index 00000000..1f8623cf --- /dev/null +++ b/test.md @@ -0,0 +1,1564 @@ + + + + big: logs: 5,000 rows + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file