mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-15 00:03:28 +01:00
fixes based on feedback from @ldko!
templates: - add placeholder footer.html, head.html templates - allow 'base_html', 'footer_html', 'head_html', 'header_html' to be added via wb-manager 'add-template' cmd - automatically add 'base.html' when adding a copy of other templates, as jinja2 extends looks for templates locally ui tweaks: - vueui: support logo loaded from ui.logo - make logo link to home page - home page: don't show collection title if title is empty documentation tweaks: - clarify static_path is for loading path - clarify footer and head templates are empty by default - remove extra is_framed from top frame template documentation bump to 2.7.0b1
This commit is contained in:
parent
18c09266e6
commit
613754307c
@ -60,6 +60,15 @@ When using the custom banner, it is possible to configure a logo by setting ``ui
|
||||
|
||||
If omitted, the standard pywb logo will be used by default.
|
||||
|
||||
If set, the logo should point to a file in the static directory (default is ``static`` but can be changed via the ``static_dir`` config option).
|
||||
|
||||
For example, to use the file ``./static/my-logo.png`` as the logo, set:
|
||||
|
||||
.. code:: yaml
|
||||
|
||||
ui:
|
||||
logo: my-logo.png
|
||||
|
||||
|
||||
Updating the Vue UI
|
||||
-------------------
|
||||
|
@ -61,6 +61,9 @@ can also be overriden:
|
||||
* ``footer.html`` -- Template for adding content as the "footer" of the ``<body>`` tag of the ``base`` template
|
||||
|
||||
|
||||
Note: The default pywb ``head.html`` and ``footer.html`` are currently blank. They can be populated to customize the rendering, add analytics, etc... as needed.
|
||||
|
||||
|
||||
The ``base.html`` template also provides five blocks that can be supplied by templates that extend it.
|
||||
|
||||
* ``title`` -- Block for supplying the title for the page
|
||||
@ -157,7 +160,7 @@ Template variables:
|
||||
|
||||
* ``{{ ui }}`` - an optional ``ui`` dictionary from ``config.yaml``, if any
|
||||
|
||||
* ``{{ static_prefix }}`` - the prefix from which static files will be accessed from, e.g. ``http://localhost:8080/static/``
|
||||
* ``{{ static_prefix }}`` - the prefix from which static files will be accessed from, e.g. ``http://localhost:8080/static/``.
|
||||
|
||||
|
||||
Replay and Banner Templates
|
||||
@ -186,6 +189,8 @@ Template variables:
|
||||
|
||||
* ``{{ wb_prefix }}`` - the collection prefix, e.g. ``http://localhost:8080/pywb/``
|
||||
|
||||
* ``{{ host_prefix }}`` - the pywb server origin, e.g. ``http://localhost:8080``
|
||||
|
||||
* ``{{ config }}`` - provides the contents of the ``config.yaml`` as a dictionary.
|
||||
|
||||
* ``{{ ui }}`` - an optional ``ui`` dictionary from ``config.yaml``, if any.
|
||||
@ -232,10 +237,10 @@ Template variables:
|
||||
|
||||
* ``{{ wb_url }}`` - A complete ``WbUrl`` object, which contains the ``url``, ``timestamp`` and ``mod`` properties, representing the replay url.
|
||||
|
||||
* ``{{ is_framed }}`` - true/false if currently in framed mode.
|
||||
|
||||
* ``{{ wb_prefix }}`` - the collection prefix, e.g. ``http://localhost:8080/pywb/``
|
||||
|
||||
* ``{{ is_proxy }}`` - set to true if page is being loaded via an HTTP/S proxy (checks if WSGI env has ``wsgiprox.proxy_host`` set)
|
||||
|
||||
|
||||
|
||||
.. _custom-top-frame:
|
||||
@ -332,7 +337,7 @@ The following template variables are available to all templates.
|
||||
|
||||
* ``{{ env.pywb_proxy_magic }}`` - if set, indicates pywb is accessed via proxy. See :ref:`https-proxy`
|
||||
|
||||
* ``{{ static_prefix }}`` - path to use for loading static files.
|
||||
* ``{{ static_prefix }}`` - URL path to use for loading static files.
|
||||
|
||||
|
||||
UI Configuration
|
||||
|
@ -66,7 +66,7 @@ It is possible to change these settings via ``config.yaml``:
|
||||
|
||||
* ``static_prefix`` - sets the URL path used in pywb to serve static content (default ``static``)
|
||||
|
||||
* ``static_dir`` - sets the directory name used to read static files (default ``static``)
|
||||
* ``static_dir`` - sets the directory name used to read static files on disk (default ``static``)
|
||||
|
||||
While pywb can serve static files, it is recommended to use an existing web server to serve static files, especially if already using it in production.
|
||||
|
||||
|
@ -15,6 +15,11 @@ banner_html: banner.html
|
||||
head_insert_html: head_insert.html
|
||||
frame_insert_html: frame_insert.html
|
||||
|
||||
base_html: base.html
|
||||
header_html: header.html
|
||||
footer_html: footer.html
|
||||
head_html: head.html
|
||||
|
||||
query_html: query.html
|
||||
search_html: search.html
|
||||
not_found_html: not_found.html
|
||||
@ -39,6 +44,12 @@ html_templates:
|
||||
- not_found_html
|
||||
|
||||
- home_html
|
||||
|
||||
- base_html
|
||||
- header_html
|
||||
- head_html
|
||||
- footer_html
|
||||
|
||||
- error_html
|
||||
- proxy_cert_download_html
|
||||
- proxy_select_html
|
||||
|
@ -237,17 +237,20 @@ directory structure expected by pywb
|
||||
v = defaults[n]
|
||||
print('- {0}: (pywb/{1})'.format(n, v))
|
||||
|
||||
def _confirm_overwrite(self, full_path, msg):
|
||||
def _confirm_overwrite(self, full_path, msg, ignore=False):
|
||||
if not os.path.isfile(full_path):
|
||||
return True
|
||||
|
||||
if ignore:
|
||||
return False
|
||||
|
||||
res = get_input(msg)
|
||||
try:
|
||||
res = strtobool(res)
|
||||
except ValueError:
|
||||
res = False
|
||||
|
||||
if not res:
|
||||
if not res and not ignore:
|
||||
raise IOError('Skipping, {0} already exists'.format(full_path))
|
||||
|
||||
def _get_template_path(self, template_name, verb):
|
||||
@ -268,7 +271,7 @@ directory structure expected by pywb
|
||||
|
||||
return full_path, filename
|
||||
|
||||
def add_template(self, template_name, force=False):
|
||||
def add_template(self, template_name, force=False, ignore=False):
|
||||
full_path, filename = self._get_template_path(template_name, 'add')
|
||||
|
||||
msg = ('Template file "{0}" ({1}) already exists. ' +
|
||||
@ -276,7 +279,11 @@ directory structure expected by pywb
|
||||
msg = msg.format(full_path, template_name)
|
||||
|
||||
if not force:
|
||||
self._confirm_overwrite(full_path, msg)
|
||||
res = self._confirm_overwrite(full_path, msg, ignore)
|
||||
if ignore and not res:
|
||||
return
|
||||
|
||||
os.makedirs(os.path.dirname(full_path), exist_ok=True)
|
||||
|
||||
data = resource_string('pywb', filename)
|
||||
with open(full_path, 'w+b') as fh:
|
||||
@ -286,6 +293,9 @@ directory structure expected by pywb
|
||||
msg = 'Copied default template "{0}" to "{1}"'
|
||||
print(msg.format(filename, full_path))
|
||||
|
||||
if template_name != "base_html":
|
||||
self.add_template("base_html", force=False, ignore=True)
|
||||
|
||||
def remove_template(self, template_name, force=False):
|
||||
full_path, filename = self._get_template_path(template_name, 'remove')
|
||||
|
||||
|
2
pywb/templates/footer.html
Normal file
2
pywb/templates/footer.html
Normal file
@ -0,0 +1,2 @@
|
||||
## place content to be added at the very end of the <body> tag here
|
||||
|
1
pywb/templates/head.html
Normal file
1
pywb/templates/head.html
Normal file
@ -0,0 +1 @@
|
||||
## place optional content to be injected into the <head> of every page here
|
@ -1,3 +1,4 @@
|
||||
## place content to be added at the very beginning of the <body> tag here
|
||||
<header>
|
||||
{% if not err_msg and locales|length > 1 %}
|
||||
<div class="language-select">
|
||||
|
@ -10,7 +10,7 @@
|
||||
{% for route in routes %}
|
||||
<li>
|
||||
<a href="{{ env['pywb.app_prefix'] + ('/' + env.pywb_lang if env.pywb_lang else '') + '/' + route }}">{{ '/' + route }}</a>
|
||||
{% if all_metadata and all_metadata[route] %}
|
||||
{% if all_metadata and all_metadata[route] and all_metadata[route].title %}
|
||||
({{ all_metadata[route].title }})
|
||||
{% endif %}
|
||||
</li>
|
||||
|
@ -66,7 +66,7 @@
|
||||
renderCal.init();
|
||||
|
||||
{% else %}
|
||||
VueUI.main("{{ static_prefix }}", "{{ url }}", "{{ prefix }}");
|
||||
VueUI.main("{{ static_prefix }}", "{{ url }}", "{{ prefix }}", "{{ ui.logo }}");
|
||||
|
||||
{% endif %}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
__version__ = '2.7.0b0'
|
||||
__version__ = '2.7.0b1'
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(__version__)
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div class="app" :class="{expanded: showTimelineView}" data-app="webrecorder-replay-app">
|
||||
<div class="banner">
|
||||
<div class="line">
|
||||
<div class="logo"><img :src="config.logoImg" /></div>
|
||||
<div class="logo"><a href="/"><img :src="config.logoImg" /></a></div>
|
||||
<div class="timeline-wrap">
|
||||
<div class="line">
|
||||
<div class="breadcrumbs-wrap">
|
||||
|
@ -6,16 +6,17 @@ import Vue from "vue/dist/vue.esm.browser";
|
||||
|
||||
|
||||
// ===========================================================================
|
||||
export function main(staticPrefix, url, prefix, timestamp) {
|
||||
new CDXLoader(staticPrefix, url, prefix, timestamp);
|
||||
export function main(staticPrefix, url, prefix, timestamp, logoUrl) {
|
||||
new CDXLoader(staticPrefix, url, prefix, timestamp, logoUrl);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
class CDXLoader {
|
||||
constructor(staticPrefix, url, prefix, timestamp) {
|
||||
constructor(staticPrefix, url, prefix, timestamp, logoUrl) {
|
||||
this.opts = {};
|
||||
this.prefix = prefix;
|
||||
this.staticPrefix = staticPrefix;
|
||||
this.logoUrl = logoUrl;
|
||||
|
||||
this.isReplay = (timestamp !== undefined);
|
||||
|
||||
@ -44,8 +45,7 @@ class CDXLoader {
|
||||
|
||||
this.opts.initialView = {url, timestamp};
|
||||
|
||||
// TODO: make configurable
|
||||
this.opts.logoImg = staticPrefix + "/pywb-logo-sm.png";
|
||||
this.opts.logoImg = this.staticPrefix + (this.logoUrl ? this.logoUrl : "/pywb-logo-sm.png");
|
||||
|
||||
this.loadCDX(queryURL).then((cdxList) => {
|
||||
this.app = this.initApp(cdxList, this.opts, (snapshot) => this.loadSnapshot(snapshot));
|
||||
|
Loading…
x
Reference in New Issue
Block a user