Fixed uncaught reference error when search plugin is disabled

This commit is contained in:
squidfunk 2018-01-22 18:55:45 +01:00 committed by Martin Donath
parent 4b5c45c656
commit 4f5677d584
6 changed files with 178 additions and 172 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -167,7 +167,7 @@
{% endblock %}
</div>
{% block scripts %}
<script src="{{ base_url }}/assets/javascripts/application.5f9a6f1b.js"></script>
<script src="{{ base_url }}/assets/javascripts/application.cb27f861.js"></script>
{% if lang.t("search.language") != "en" %}
{% set languages = lang.t("search.language").split(",") %}
{% if languages | length and languages[0] != "" %}

View File

@ -1 +1 @@
<script>!function(e,a,t,n,o,c,i){e.GoogleAnalyticsObject=o,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=1*new Date,c=a.createElement(t),i=a.getElementsByTagName(t)[0],c.async=1,c.src="https://www.google-analytics.com/analytics.js",i.parentNode.insertBefore(c,i)}(window,document,"script",0,"ga"),ga("create","{{ config.google_analytics[0] }}","{{ config.google_analytics[1] }}"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var a=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",a,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
<script>!function(e,a,t,n,o,c,i){e.GoogleAnalyticsObject=o,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=1*new Date,c=a.createElement(t),i=a.getElementsByTagName(t)[0],c.async=1,c.src="https://www.google-analytics.com/analytics.js",i.parentNode.insertBefore(c,i)}(window,document,"script",0,"ga"),ga("create","{{ config.google_analytics[0] }}","{{ config.google_analytics[1] }}"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");if(Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var a=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",a,e.href)})}),document.forms.search){var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}</script>

View File

@ -276,27 +276,174 @@ function initialize(config) { // eslint-disable-line func-style
"[data-md-component=navigation] [data-md-toggle]", "change",
new Material.Nav.Scrolling("[data-md-component=navigation] nav")))
/* Component: search body lock for mobile */
new Material.Event.MatchMedia("(max-width: 959px)",
new Material.Event.Listener("[data-md-toggle=search]", "change",
new Material.Search.Lock("[data-md-toggle=search]")))
/* Initialize search, if available */
if (document.querySelector("[data-md-component=search]")) {
/* Component: search results */
new Material.Event.Listener("[data-md-component=query]", [
"focus", "keyup", "change"
], new Material.Search.Result("[data-md-component=result]", () => {
return fetch(`${config.url.base}/${
config.version < "0.17" ? "mkdocs" : "search"
}/search_index.json`, {
credentials: "same-origin"
}).then(response => response.json())
.then(data => {
return data.docs.map(doc => {
doc.location = config.url.base + doc.location
return doc
/* Component: search body lock for mobile */
new Material.Event.MatchMedia("(max-width: 959px)",
new Material.Event.Listener("[data-md-toggle=search]", "change",
new Material.Search.Lock("[data-md-toggle=search]")))
/* Component: search results */
new Material.Event.Listener("[data-md-component=query]", [
"focus", "keyup", "change"
], new Material.Search.Result("[data-md-component=result]", () => {
return fetch(`${config.url.base}/${
config.version < "0.17" ? "mkdocs" : "search"
}/search_index.json`, {
credentials: "same-origin"
}).then(response => response.json())
.then(data => {
return data.docs.map(doc => {
doc.location = config.url.base + doc.location
return doc
})
})
})
})).listen()
})).listen()
/* Listener: focus input after form reset */
new Material.Event.Listener("[data-md-component=reset]", "click", () => {
setTimeout(() => {
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
query.focus()
}, 10)
}).listen()
/* Listener: focus input after opening search */
new Material.Event.Listener("[data-md-toggle=search]", "change", ev => {
setTimeout(toggle => {
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
if (toggle.checked) {
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
query.focus()
}
}, 400, ev.target)
}).listen()
/* Listener: open search on focus */
new Material.Event.MatchMedia("(min-width: 960px)",
new Material.Event.Listener("[data-md-component=query]", "focus", () => {
const toggle = document.querySelector("[data-md-toggle=search]")
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
if (!toggle.checked) {
toggle.checked = true
toggle.dispatchEvent(new CustomEvent("change"))
}
}))
/* Listener: keyboard handlers */ // eslint-disable-next-line complexity
new Material.Event.Listener(window, "keydown", ev => { // TODO: split up into component to reduce complexity
const toggle = document.querySelector("[data-md-toggle=search]")
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
/* Abort if meta key (macOS) or ctrl key (Windows) is pressed */
if (ev.metaKey || ev.ctrlKey)
return
/* Search is open */
if (toggle.checked) {
/* Enter: prevent form submission */
if (ev.keyCode === 13) {
if (query === document.activeElement) {
ev.preventDefault()
/* Go to current active/focused link */
const focus = document.querySelector(
"[data-md-component=search] [href][data-md-state=active]")
if (focus instanceof HTMLLinkElement) {
window.location = focus.getAttribute("href")
/* Close search */
toggle.checked = false
toggle.dispatchEvent(new CustomEvent("change"))
query.blur()
}
}
/* Escape or Tab: close search */
} else if (ev.keyCode === 9 || ev.keyCode === 27) {
toggle.checked = false
toggle.dispatchEvent(new CustomEvent("change"))
query.blur()
/* Horizontal arrows and backspace: focus input */
} else if ([8, 37, 39].indexOf(ev.keyCode) !== -1) {
if (query !== document.activeElement)
query.focus()
/* Vertical arrows: select previous or next search result */
} else if ([38, 40].indexOf(ev.keyCode) !== -1) {
const key = ev.keyCode
/* Retrieve all results */
const links = Array.prototype.slice.call(
document.querySelectorAll(
"[data-md-component=query], [data-md-component=search] [href]"))
/* Retrieve current active/focused result */
const focus = links.find(link => {
if (!(link instanceof HTMLElement))
throw new ReferenceError
return link.dataset.mdState === "active"
})
if (focus)
focus.dataset.mdState = ""
/* Calculate index depending on direction, add length to form ring */
const index = Math.max(0, (
links.indexOf(focus) + links.length + (key === 38 ? -1 : +1)
) % links.length)
/* Set active state and focus */
if (links[index]) {
links[index].dataset.mdState = "active"
links[index].focus()
}
/* Prevent scrolling of page */
ev.preventDefault()
ev.stopPropagation()
/* Return false prevents the cursor position from changing */
return false
}
/* Search is closed and we're not inside a form */
} else if (document.activeElement && !document.activeElement.form) {
/* F/S: Open search if not in input field */
if (ev.keyCode === 70 || ev.keyCode === 83) {
query.focus()
ev.preventDefault()
}
}
}).listen()
/* Listener: focus query if in search is open and character is typed */
new Material.Event.Listener(window, "keypress", () => {
const toggle = document.querySelector("[data-md-toggle=search]")
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
if (toggle.checked) {
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
if (query !== document.activeElement)
query.focus()
}
}).listen()
}
/* Listener: handle tabbing context for better accessibility */
new Material.Event.Listener(document.body, "keydown", ev => {
@ -337,149 +484,6 @@ function initialize(config) { // eslint-disable-line func-style
}
}))
/* Listener: focus input after form reset */
new Material.Event.Listener("[data-md-component=reset]", "click", () => {
setTimeout(() => {
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
query.focus()
}, 10)
}).listen()
/* Listener: focus input after opening search */
new Material.Event.Listener("[data-md-toggle=search]", "change", ev => {
setTimeout(toggle => {
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
if (toggle.checked) {
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
query.focus()
}
}, 400, ev.target)
}).listen()
/* Listener: open search on focus */
new Material.Event.MatchMedia("(min-width: 960px)",
new Material.Event.Listener("[data-md-component=query]", "focus", () => {
const toggle = document.querySelector("[data-md-toggle=search]")
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
if (!toggle.checked) {
toggle.checked = true
toggle.dispatchEvent(new CustomEvent("change"))
}
}))
/* Listener: keyboard handlers */ // eslint-disable-next-line complexity
new Material.Event.Listener(window, "keydown", ev => { // TODO: split up into component to reduce complexity
const toggle = document.querySelector("[data-md-toggle=search]")
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
/* Abort if meta key (macOS) or ctrl key (Windows) is pressed */
if (ev.metaKey || ev.ctrlKey)
return
/* Search is open */
if (toggle.checked) {
/* Enter: prevent form submission */
if (ev.keyCode === 13) {
if (query === document.activeElement) {
ev.preventDefault()
/* Go to current active/focused link */
const focus = document.querySelector(
"[data-md-component=search] [href][data-md-state=active]")
if (focus instanceof HTMLLinkElement) {
window.location = focus.getAttribute("href")
/* Close search */
toggle.checked = false
toggle.dispatchEvent(new CustomEvent("change"))
query.blur()
}
}
/* Escape or Tab: close search */
} else if (ev.keyCode === 9 || ev.keyCode === 27) {
toggle.checked = false
toggle.dispatchEvent(new CustomEvent("change"))
query.blur()
/* Horizontal arrows and backspace: focus input */
} else if ([8, 37, 39].indexOf(ev.keyCode) !== -1) {
if (query !== document.activeElement)
query.focus()
/* Vertical arrows: select previous or next search result */
} else if ([38, 40].indexOf(ev.keyCode) !== -1) {
const key = ev.keyCode
/* Retrieve all results */
const links = Array.prototype.slice.call(
document.querySelectorAll(
"[data-md-component=query], [data-md-component=search] [href]"))
/* Retrieve current active/focused result */
const focus = links.find(link => {
if (!(link instanceof HTMLElement))
throw new ReferenceError
return link.dataset.mdState === "active"
})
if (focus)
focus.dataset.mdState = ""
/* Calculate index depending on direction, add length to form ring */
const index = Math.max(0, (
links.indexOf(focus) + links.length + (key === 38 ? -1 : +1)
) % links.length)
/* Set active state and focus */
if (links[index]) {
links[index].dataset.mdState = "active"
links[index].focus()
}
/* Prevent scrolling of page */
ev.preventDefault()
ev.stopPropagation()
/* Return false prevents the cursor position from changing */
return false
}
/* Search is closed and we're not inside a form */
} else if (document.activeElement && !document.activeElement.form) {
/* F/S: Open search if not in input field */
if (ev.keyCode === 70 || ev.keyCode === 83) {
query.focus()
ev.preventDefault()
}
}
}).listen()
/* Listener: focus query if in search is open and character is typed */
new Material.Event.Listener(window, "keypress", () => {
const toggle = document.querySelector("[data-md-toggle=search]")
if (!(toggle instanceof HTMLInputElement))
throw new ReferenceError
if (toggle.checked) {
const query = document.querySelector("[data-md-component=query]")
if (!(query instanceof HTMLInputElement))
throw new ReferenceError
if (query !== document.activeElement)
query.focus()
}
}).listen()
/* Retrieve facts for the given repository type */
;(() => {
const el = document.querySelector("[data-md-source]")

View File

@ -49,11 +49,13 @@
});
/* Register handler to log search on blur */
var query = document.forms.search.query;
query.addEventListener("blur", function() {
if (this.value) {
var path = document.location.pathname;
ga("send", "pageview", path + "?q=" + this.value);
}
});
if (document.forms.search) {
var query = document.forms.search.query;
query.addEventListener("blur", function() {
if (this.value) {
var path = document.location.pathname;
ga("send", "pageview", path + "?q=" + this.value);
}
});
}
</script>