diff options
Diffstat (limited to 'site/static/js/404.js')
-rw-r--r-- | site/static/js/404.js | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/site/static/js/404.js b/site/static/js/404.js new file mode 100644 index 0000000..cecf83f --- /dev/null +++ b/site/static/js/404.js @@ -0,0 +1,122 @@ +(function () { + + // regexes as strings + // NOTE: + // these patterns should NOT contain capturing groups (parentheses) + // because they might be combined with other regexes + var DOCS_VERSION_PATTERN = "(?:[\\d\\.]+x?|dev|latest)"; + var DOCS_LANGUAGE_PATTERN = "\\w\\w(?:-\\w\\w)?"; + var DOCS_VERSION_PATH_PATTERN = "docs\\/" + DOCS_LANGUAGE_PATTERN + "\\/" + DOCS_VERSION_PATTERN; + + function splitDocsURL(url) { + var splitPattern = new RegExp("(" + DOCS_VERSION_PATH_PATTERN + ")"); + return url.split(splitPattern); + } + + function transformOldURL(oldURL) { + var splitURL = splitDocsURL(oldURL); + + var baseURL = splitURL[0]; + var versionString = splitURL[1]; + var pageExtension = splitURL.slice(2).join(""); + + // get rid of the fragment and replace underscores with slashes + // also remove the ".md" extension + pageExtension = pageExtension.split("#")[0]; + pageExtension = pageExtension.replace(".md", ""); + pageExtension = pageExtension.replace(/_/g, "/"); + + // undo special cases of paths that really do contain underscores + // NOTE: + // this list is complete; in the pre-migration docs, no other + // directories or files contained underscores + pageExtension = pageExtension.replace("config/ref", "config_ref"); + pageExtension = pageExtension.replace("plugin/ref", "plugin_ref"); + pageExtension = pageExtension.replace("display/name", "display_name"); + pageExtension = pageExtension.replace("platform/plugin/versioning/ref", "platform_plugin_versioning_ref"); + + return baseURL + versionString + pageExtension; + } + + function getDevURL(url) { + var replaceWhat = new RegExp("docs\\/(" + DOCS_LANGUAGE_PATTERN + ")\\/" + DOCS_VERSION_PATTERN); + var replaceWith = "docs/$1/dev"; + return url.replace(replaceWhat, replaceWith); + } + + function getRootURL(url) { + var splitURL = splitDocsURL(url); + var baseURL = splitURL[0]; + var versionString = splitURL[1]; + + return baseURL + versionString + "/"; + } + + function isDocsURL(url) { + var testPattern = new RegExp(DOCS_VERSION_PATH_PATTERN); + return testPattern.test(url); + } + + function showNewRedirect(url) { + $("#new-redirect-link").attr("href", url); + $("#not-found-redirect-alert").css("display", "block"); + } + + function showDevRedirect(url) { + $("#dev-redirect-link").attr("href", url); + $("#no-version-redirect-alert").css("display", "block"); + } + + function showRootRedirect(url) { + $("#root-redirect-link").attr("href", url); + $("#no-page-redirect-alert").css("display", "block"); + } + + function main() { + + var url = window.location.href; + + if (!isDocsURL(url)) { + return; + } + + // get related URLs + var rootURL = getRootURL(url); + var devURL = getDevURL(url); + var newURL = transformOldURL(url); + + // try the root URL + $.ajax({ + url: rootURL, + statusCode: { + + // if the root exists, check if the new URL exists + 200: function () { + $.ajax({ + url: newURL, + statusCode: { + + // redirect to the new URL if it exists + 200: function () { + showNewRedirect(newURL) + }, + + // if the new URL doesn't exist, redirect to root + 404: function() { + showRootRedirect(rootURL) + } + } + }); + }, + + // if root doesn't exist, assume that the version + // is invalid and redirect to dev + 404: function () { + showDevRedirect(devURL) + } + } + }); + } + + main(); +}()); |