-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Expand file tree
/
Copy pathpage-loader.js
More file actions
286 lines (215 loc) · 11 KB
/
Copy pathpage-loader.js
File metadata and controls
286 lines (215 loc) · 11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
let newLink = "";
let newVersion = "";
let currentVersion = "";
let fileRequested = "";
// Get the base URL dynamically
function getBaseUrl() {
const path = window.location.pathname;
const pathParts = path.split('/').filter(part => part.length > 0);
// Check if we're in the openshift-docs subdirectory for github pages
if (pathParts.length > 0 && pathParts[0] === 'openshift-docs') {
return `${window.location.protocol}//${window.location.host}/openshift-docs/`;
}
// If not in the openshift-docs subdirectory, use the root
return `${window.location.protocol}//${window.location.host}/`;
}
const baseUrl = getBaseUrl();
// Use relative paths in the mappings
const urlMappings = {
"openshift-acs": "acs/",
"openshift-builds": "builds/",
"openshift-enterprise": "container-platform/",
"openshift-gitops": "gitops/",
"openshift-lightspeed": "lightspeed/",
"openshift-origen": "",
"openshift-pipelines": "pipelines/",
"openshift-serverless": "serverless/",
"openshift-telco": "container-platform-telco/",
"openshift-logging": "logging/",
};
function versionSelector(list) {
"use strict";
newVersion = list[list.selectedIndex].value;
if (dk === "openshift-origen") {
currentVersion = window.location.pathname.split("/")[1];
} else {
const path = window.location.pathname;
const pathParts = path.split('/').filter(part => part.length > 0);
// Check if we're in the openshift-docs subdirectory for github pages
if (pathParts.length > 0 && pathParts[0] === 'openshift-docs') {
currentVersion = pathParts[2];
} else {
// If not in the openshift-docs subdirectory
currentVersion = pathParts[1];
}
}
// Get the correct URL path from the urlMappings and prepend the base URL
let productPath = urlMappings[dk];
let fullBaseUrl = baseUrl + productPath;
//Handle special OCP case
if (["3.0", "3.1", "3.2"].includes(newVersion) && dk === "openshift-enterprise") {
fullBaseUrl = "https://docs.openshift.com/enterprise/";
}
if ((dk === "openshift-enterprise" || dk === "openshift-origen") && currentVersion.charAt(0) !== newVersion.charAt(0)){
fileRequested = "/welcome/index.html";
} else {
const versionIndex = window.location.pathname.lastIndexOf(currentVersion) + currentVersion.length;
fileRequested = window.location.pathname.substring(versionIndex);
}
newLink = `${fullBaseUrl}${newVersion}${fileRequested}`;
// without doing async loads, there is no way to know if the path actually
// exists - so we will just have to load
// window.location = newLink;
// testing async validations
$.ajax({
type: 'HEAD',
url: newLink,
success: function() {
window.location.href = newLink;
},
error: function(jqXHR, exception) {
if(jqXHR.status == 404) {
list.value = currentVersion;
const confirmMessage = `This page doesn't exist in version ${newVersion}. Click OK to search the ${newVersion} docs OR Cancel to stay on this page.`;
if(confirm(confirmMessage)) {
let searchUrl;
if (["3.0", "3.1", "3.2"].includes(newVersion) && dk === "openshift-enterprise") {
searchUrl = `https://google.com/search?q=site:${baseUrl}${newVersion} ${document.title}`;
} else {
searchUrl = `https://google.com/search?q=site:${urlMappings[dk]}${newVersion} ${document.title}`;
}
window.location.href = searchUrl;
} else {
// do nothing, user doesn't want to search
}
} else {
window.location.href = newLink; // assumption here is that we can follow through with a redirect
}
}
});
}
// checks what language was selected and then sends the user to the portal for their localized version
function selectLang(langList) {
var lang = langList[langList.selectedIndex].value;
var winPath = window.location.pathname;
console.log("Lang: " + lang);
console.log("Win Path: " + winPath);
var currentVersion = document.getElementById("version-selector").value;
console.log("CurrentVersion: " + currentVersion);
// path for the file to reference on portal (the last bit removes .html)
var path = winPath.substring(winPath.lastIndexOf(currentVersion) + (currentVersion.length + 1), winPath.length - 5);
var parts = path.split("/");
console.log(parts);
// map things to html-single. While plain HTML is preferred, it is harder to map and get all anchors right. html-single ensures there is no 404 and the user at least lands on the right book
console.log(parts[parts.length-1]);
var anchorid = parts[parts.length-1];
var book = parts[0];
// add changed book names here
if(book == "updating") book = "updating_clusters";
if(book == "virt") book = "openshift_virtualization";
if(book == "post_installation_configuration") book = "post-installation_configuration";
// var section = parts[1].replace(/\_/g, "-"); // replace underscore with dash
// var section = subGroup.toLowerCase().replace(" ", "-");
// console.log(section);
// var subsection = parts[2].replace(/\_/g, "-");
// console.log(subsection);
// path = book + "/" + section + "#" + subsection;
path = book + "#" + anchorid;
console.log("Path: " + path);
var portalBaseURL = "https://access.redhat.com/documentation";
var finalURL = portalBaseURL + "/" + lang + "/openshift_container_platform/" + currentVersion + "/html-single/" + path;
console.log("Final URL: " + finalURL);
window.location.href = finalURL;
}
// sets the current version in the drop down and sets up suggest an edit options
function selectVersion(currentVersion) {
// currentVersion = "3.11"; // for testing
// set the version selector to what the current version is
var el = document.getElementById("version-selector");
if(el) {
el.value = currentVersion;
}
// check the docs referrer to add warning box based on whether we are coming from rosa docs or elsewhere
addReferrer();
// the rest creates an suggest an edit element for h1 and h2 elements
// only enabled at the moment on the 3.11 docs
if(currentVersion != "3.11") return;
var is3 = (currentVersion.charAt(0) == 3);
var is4 = (currentVersion.charAt(0) == 4);
// in version 4 and version 3 books are put together differently. In 3,
// the WYSIWYG (mostly) and there are not many includes. In 4, everything
// (mostly) is an include and the wrapper is just an assembly.
// in version 3, there are generally no modules, and the page you are on, is
// the page you will edit, so the logic is a bit different.
// there is always just one h1 whether you are on version 4 or 3.
// In 4, this is the main assembly, in 3, this is the file to edit.
// in version 4 it assumes that the h2 section's id is correctly named as per the file that it resides in. This is the convention.
// we start with adding suggest an edit to the main assembly/file
var h1s = document.getElementsByTagName('h1');
var h1 = h1s[0]; // there is only one ever
// main file to edit is the file path after the version to the html at
// the end.
// Example: https://docs.openshift.com/container-platform/4.4/updating/updating-cluster-within-minor.html
// file path is updating/updating-cluster-within-minor.adoc
mainFileToEdit =
window.location.pathname.substring(
window.location.pathname.lastIndexOf(currentVersion) +
currentVersion.length, window.location.pathname.length - 4);
// rest api is put together automatically, so ignore
if(mainFileToEdit.includes("rest_api")) return;
var fn = mainFileToEdit + "adoc"; // add adoc to file name
var message = "message=[Suggested Edit] for " + fn + "' target='_new' id='" + fn + "' style='font-size: x-small; display: inline; visibility: hidden'>Suggest an edit</a>";
// in 4, edit the file in master, so it can cped to the right places. In 3,
// edit in the branch
h1.innerHTML += " <a href='https://github.com/openshift/openshift-docs/edit/" + (is4? "master" : ("enterprise-" + currentVersion)) + "/" + fn + "?" + message;
// add mouseover and out to the h1 tag to show or hide the link
// unlike the links added to h2, here it is at [0], the only 'a' tag
// added
h1.addEventListener("mouseover", function() {
this.getElementsByTagName('a')[0].style.visibility = "visible";
});
h1.addEventListener("mouseout", function() {
this.getElementsByTagName('a')[0].style.visibility = "hidden";
});
if(is4) { // in version 4 also allow to edit subsections which are modules
// all h2 elements map to modules
var h2s = document.getElementsByTagName('h2');
var i;
for (i = 0; i < h2s.length; i++) {
var h2 = h2s[i];
var splitFile = h2.id.split("_", 1)[0]; // file ids are of the format: filename_context
if(splitFile === h2.id) { continue; } // nothing was found, don't create an edit file link
// this overwrites the global fn for h1 from earlier
var fn = splitFile + ".adoc"; // add adoc to file name
// we are going to allow the PR to open against the master branch
h2.innerHTML += " <a href='https://github.com/openshift/openshift-docs/edit/master/modules/" + fn + "?" + "message=[Suggested Edit] for " + fn + "' target='_new' id='" + fn + "' style='font-size: x-small; display: inline; visibility: hidden'>Suggest an edit</a>";
// add mouseover and out to the h2 tag to show or hide the link
// in 4, the h2 also has an 'a' tag already, so the tag we are looking for
// here is the second one ([1] and not [0])
h2.addEventListener("mouseover", function() {
this.getElementsByTagName('a')[1].style.visibility = "visible";
});
h2.addEventListener("mouseout", function() {
this.getElementsByTagName('a')[1].style.visibility = "hidden";
});
}
}
}
function addReferrer() {
// grab target element reference
// we want to add a notice to the top of the OCP docs page if the reader is coming from ROSA docs
// check the referrer
// alert(document.referrer);
// var ref = "http://127.0.0.1/addreferrer";
// var ref = "http://127.0.0.1/addreferrer/authentication/understanding-authentication.html";
var ref = "https://docs.openshift.com/rosa";
if(document.referrer && document.referrer.startsWith(ref) && !document.location.href.startsWith(ref)) {
// get the first section/header
var elements = document.getElementsByClassName('sect1');
var requiredElement = elements[0];
// the warning text
var text = '<div class="admonitionblock important"><table><tbody><tr><td class="icon"><i class="fa icon-important" title="Important"></i></td><td class="content"><div class="paragraph"><p>This is the <b>OpenShift Container Platform</b> documentation. There may be some sections that don\'t apply to ROSA docs.</p><p>Click <a href="' + document.referrer + '">here</a> to go back to the page you came from or browse the full <a href="https://docs.openshift.com/rosa/welcome/index.html">ROSA documentation</a>.</p></div></td></tr></tbody></table></div>';
// insert the element before target element
requiredElement.insertAdjacentHTML("beforebegin", text);
}
}