dobo 2.0.1 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/FUNDING.yml +0 -0
- package/.github/workflows/repo-lockdown.yml +0 -0
- package/.jsdoc.conf.json +0 -0
- package/LICENSE +0 -0
- package/README.md +2 -2
- package/docs/Dobo.html +0 -0
- package/docs/data/search.json +0 -0
- package/docs/fonts/Inconsolata-Regular.ttf +0 -0
- package/docs/fonts/OpenSans-Regular.ttf +0 -0
- package/docs/fonts/WorkSans-Bold.ttf +0 -0
- package/docs/global.html +0 -0
- package/docs/index.html +0 -0
- package/docs/index.js.html +0 -0
- package/docs/lib_collect-connections.js.html +0 -0
- package/docs/lib_collect-drivers.js.html +0 -0
- package/docs/lib_collect-features.js.html +0 -0
- package/docs/lib_collect-schemas.js.html +0 -0
- package/docs/lib_index.js.html +0 -0
- package/docs/method_model_create.js.html +0 -0
- package/docs/method_model_drop.js.html +0 -0
- package/docs/method_model_exists.js.html +0 -0
- package/docs/method_record_count.js.html +0 -0
- package/docs/method_record_create.js.html +0 -0
- package/docs/method_record_find-all.js.html +0 -0
- package/docs/method_record_find-one.js.html +0 -0
- package/docs/method_record_find.js.html +0 -0
- package/docs/method_record_get.js.html +0 -0
- package/docs/method_record_remove.js.html +0 -0
- package/docs/method_record_update.js.html +0 -0
- package/docs/method_record_upsert.js.html +0 -0
- package/docs/method_sanitize_body.js.html +0 -0
- package/docs/method_sanitize_date.js.html +0 -0
- package/docs/method_sanitize_id.js.html +0 -0
- package/docs/method_validate.js.html +0 -0
- package/docs/module-Lib.html +0 -0
- package/docs/scripts/core.js +476 -477
- package/docs/scripts/core.min.js +0 -0
- package/docs/scripts/resize.js +36 -36
- package/docs/scripts/search.js +105 -105
- package/docs/scripts/search.min.js +0 -0
- package/docs/scripts/third-party/Apache-License-2.0.txt +0 -0
- package/docs/scripts/third-party/fuse.js +1 -1
- package/docs/scripts/third-party/hljs-line-num-original.js +282 -285
- package/docs/scripts/third-party/hljs-line-num.js +1 -1
- package/docs/scripts/third-party/hljs-original.js +1195 -1202
- package/docs/scripts/third-party/hljs.js +1 -1
- package/docs/scripts/third-party/popper.js +1 -1
- package/docs/scripts/third-party/tippy.js +1 -1
- package/docs/scripts/third-party/tocbot.js +508 -509
- package/docs/scripts/third-party/tocbot.min.js +0 -0
- package/docs/static/bitcoin.jpeg +0 -0
- package/docs/static/home.md +0 -0
- package/docs/static/logo-ecosystem.png +0 -0
- package/docs/static/logo.png +0 -0
- package/docs/styles/clean-jsdoc-theme-base.css +0 -0
- package/docs/styles/clean-jsdoc-theme-dark.css +0 -0
- package/docs/styles/clean-jsdoc-theme-light.css +0 -0
- package/docs/styles/clean-jsdoc-theme-scrollbar.css +0 -0
- package/docs/styles/clean-jsdoc-theme-without-scrollbar.min.css +0 -0
- package/docs/styles/clean-jsdoc-theme.min.css +0 -0
- package/extend/bajo/intl/en-US.json +66 -28
- package/extend/bajo/intl/id.json +55 -27
- package/extend/bajoCli/applet/clear-record.js +22 -0
- package/extend/bajoCli/applet/connection.js +0 -0
- package/extend/bajoCli/applet/count-record.js +27 -0
- package/extend/bajoCli/applet/create-aggregate.js +33 -0
- package/extend/bajoCli/applet/create-histogram.js +33 -0
- package/extend/bajoCli/applet/create-record.js +39 -0
- package/extend/bajoCli/applet/find-record.js +27 -0
- package/extend/bajoCli/applet/get-record.js +27 -0
- package/extend/bajoCli/applet/lib/post-process.js +10 -17
- package/extend/bajoCli/applet/model.js +22 -0
- package/extend/bajoCli/applet/rebuild-model.js +91 -0
- package/extend/bajoCli/applet/remove-record.js +27 -0
- package/extend/bajoCli/applet/update-record.js +44 -0
- package/extend/bajoCli/applet.js +0 -0
- package/extend/dobo/driver/memory.js +170 -0
- package/extend/dobo/feature/created-at.js +9 -7
- package/extend/dobo/feature/dt.js +0 -0
- package/extend/dobo/feature/immutable.js +30 -0
- package/extend/dobo/feature/int-id.js +0 -0
- package/extend/dobo/feature/removed-at.js +32 -54
- package/extend/dobo/feature/updated-at.js +14 -12
- package/extend/waibuMpa/route/attachment/@model/@id/@field/@file.js +2 -6
- package/extend/waibuStatic/virtual.json +0 -0
- package/index.js +284 -371
- package/lib/collect-connections.js +49 -21
- package/lib/collect-drivers.js +19 -33
- package/lib/collect-features.js +24 -17
- package/lib/collect-models.js +321 -0
- package/lib/factory/action.js +161 -0
- package/lib/factory/connection.js +62 -0
- package/lib/factory/driver.js +372 -0
- package/lib/factory/feature.js +33 -0
- package/lib/factory/model/_util.js +402 -0
- package/lib/factory/model/build.js +15 -0
- package/lib/factory/model/clear-record.js +17 -0
- package/lib/factory/model/count-record.js +17 -0
- package/lib/factory/model/create-aggregate.js +17 -0
- package/lib/factory/model/create-attachment.js +29 -0
- package/lib/factory/model/create-histogram.js +17 -0
- package/lib/factory/model/create-record.js +35 -0
- package/lib/factory/model/drop.js +15 -0
- package/lib/factory/model/exists.js +21 -0
- package/lib/factory/model/find-all-record.js +71 -0
- package/lib/factory/model/find-attachment.js +29 -0
- package/lib/factory/model/find-one-record.js +19 -0
- package/{method/record/find.js → lib/factory/model/find-record.js} +103 -115
- package/lib/factory/model/get-attachment.js +15 -0
- package/lib/factory/model/get-record.js +79 -0
- package/lib/factory/model/list-attachment.js +37 -0
- package/lib/{add-fixtures.js → factory/model/load-fixtures.js} +69 -67
- package/lib/factory/model/remove-attachment.js +15 -0
- package/lib/factory/model/remove-record.js +59 -0
- package/lib/factory/model/sanitize-body.js +56 -0
- package/lib/factory/model/sanitize-id.js +7 -0
- package/lib/factory/model/sanitize-record.js +26 -0
- package/lib/factory/model/update-attachment.js +9 -0
- package/lib/factory/model/update-record.js +81 -0
- package/lib/factory/model/upsert-record.js +95 -0
- package/{method → lib/factory/model}/validate.js +38 -52
- package/lib/factory/model.js +150 -0
- package/lib/index.js +0 -0
- package/package.json +8 -4
- package/wiki/APPLETS.md +0 -0
- package/wiki/CHANGES.md +50 -0
- package/wiki/CONFIG.md +0 -0
- package/wiki/CONTRIBUTING.md +0 -0
- package/wiki/DEV-GUIDE.md +0 -0
- package/wiki/ECOSYSTEM.md +0 -0
- package/wiki/GETTING-STARTED.md +10 -10
- package/wiki/QUERY-LANGUAGE.md +0 -0
- package/wiki/USER-GUIDE.md +0 -0
- package/extend/bajoCli/applet/model-clear.js +0 -11
- package/extend/bajoCli/applet/model-rebuild.js +0 -101
- package/extend/bajoCli/applet/record-create.js +0 -43
- package/extend/bajoCli/applet/record-find.js +0 -28
- package/extend/bajoCli/applet/record-get.js +0 -24
- package/extend/bajoCli/applet/record-remove.js +0 -24
- package/extend/bajoCli/applet/record-update.js +0 -47
- package/extend/bajoCli/applet/schema.js +0 -22
- package/extend/bajoCli/applet/stat-count.js +0 -24
- package/lib/build-bulk-action.js +0 -12
- package/lib/check-unique.js +0 -39
- package/lib/collect-schemas.js +0 -91
- package/lib/exec-feature-hook.js +0 -13
- package/lib/exec-validation.js +0 -21
- package/lib/generic-prop-sanitizer.js +0 -32
- package/lib/handle-attachment-upload.js +0 -16
- package/lib/mem-db/conn-sanitizer.js +0 -8
- package/lib/mem-db/instantiate.js +0 -41
- package/lib/mem-db/method/model/clear.js +0 -6
- package/lib/mem-db/method/model/create.js +0 -5
- package/lib/mem-db/method/model/drop.js +0 -5
- package/lib/mem-db/method/model/exists.js +0 -5
- package/lib/mem-db/method/record/create.js +0 -12
- package/lib/mem-db/method/record/find.js +0 -20
- package/lib/mem-db/method/record/get.js +0 -9
- package/lib/mem-db/method/record/remove.js +0 -13
- package/lib/mem-db/method/record/update.js +0 -15
- package/lib/mem-db/method/stat/count.js +0 -11
- package/lib/mem-db/start.js +0 -25
- package/lib/merge-attachment-info.js +0 -16
- package/lib/multi-rel-rows.js +0 -42
- package/lib/resolve-method.js +0 -16
- package/lib/sanitize-schema.js +0 -198
- package/lib/single-rel-rows.js +0 -38
- package/method/attachment/copy-uploaded.js +0 -34
- package/method/attachment/create.js +0 -29
- package/method/attachment/find.js +0 -27
- package/method/attachment/get-path.js +0 -12
- package/method/attachment/get.js +0 -12
- package/method/attachment/pre-check.js +0 -9
- package/method/attachment/remove.js +0 -11
- package/method/attachment/update.js +0 -7
- package/method/bulk/create.js +0 -46
- package/method/model/clear.js +0 -22
- package/method/model/create.js +0 -32
- package/method/model/drop.js +0 -31
- package/method/model/exists.js +0 -37
- package/method/record/clear.js +0 -24
- package/method/record/count.js +0 -66
- package/method/record/create.js +0 -111
- package/method/record/find-all.js +0 -41
- package/method/record/find-one.js +0 -70
- package/method/record/get.js +0 -89
- package/method/record/remove.js +0 -72
- package/method/record/update.js +0 -104
- package/method/record/upsert.js +0 -51
- package/method/sanitize/body.js +0 -85
- package/method/sanitize/date.js +0 -27
- package/method/sanitize/id.js +0 -17
- package/method/stat/aggregate.js +0 -23
- package/method/stat/histogram.js +0 -26
package/docs/scripts/core.js
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
1
|
/* global document */
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
const accordionLocalStorageKey = 'accordion-id'
|
|
3
|
+
const themeLocalStorageKey = 'theme'
|
|
4
|
+
const fontSizeLocalStorageKey = 'font-size'
|
|
5
|
+
const html = document.querySelector('html')
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const MAX_FONT_SIZE = 30
|
|
8
|
+
const MIN_FONT_SIZE = 10
|
|
9
9
|
|
|
10
10
|
// eslint-disable-next-line no-undef
|
|
11
|
-
|
|
11
|
+
const localStorage = window.localStorage
|
|
12
12
|
|
|
13
|
-
function getTheme() {
|
|
14
|
-
|
|
13
|
+
function getTheme () {
|
|
14
|
+
let theme = localStorage.getItem(themeLocalStorageKey)
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
if (theme) return theme
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
theme = document.body.getAttribute('data-theme')
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
switch (theme) {
|
|
21
|
+
case 'dark':
|
|
22
|
+
case 'light':
|
|
23
|
+
return theme
|
|
24
|
+
case 'fallback-dark':
|
|
25
|
+
if (
|
|
26
|
+
// eslint-disable-next-line no-undef
|
|
27
|
+
window.matchMedia('(prefers-color-scheme)').matches &&
|
|
28
28
|
// eslint-disable-next-line no-undef
|
|
29
29
|
window.matchMedia('(prefers-color-scheme: light)').matches
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
) {
|
|
31
|
+
return 'light'
|
|
32
|
+
}
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
return 'dark'
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
case 'fallback-light':
|
|
37
|
+
if (
|
|
38
|
+
// eslint-disable-next-line no-undef
|
|
39
|
+
window.matchMedia('(prefers-color-scheme)').matches &&
|
|
40
40
|
// eslint-disable-next-line no-undef
|
|
41
41
|
window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
) {
|
|
43
|
+
return 'dark'
|
|
44
|
+
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
return 'light'
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
default:
|
|
49
|
+
return 'dark'
|
|
50
|
+
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
function localUpdateTheme(theme) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
function localUpdateTheme (theme) {
|
|
54
|
+
const body = document.body
|
|
55
|
+
const svgUse = document.querySelectorAll('.theme-svg-use')
|
|
56
|
+
const iconID = theme === 'dark' ? '#light-theme-icon' : '#dark-theme-icon'
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
body.setAttribute('data-theme', theme)
|
|
59
|
+
body.classList.remove('dark', 'light')
|
|
60
|
+
body.classList.add(theme)
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
svgUse.forEach(function (svg) {
|
|
63
|
+
svg.setAttribute('xlink:href', iconID)
|
|
64
|
+
})
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
function updateTheme(theme) {
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
function updateTheme (theme) {
|
|
68
|
+
localUpdateTheme(theme)
|
|
69
|
+
localStorage.setItem(themeLocalStorageKey, theme)
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
function toggleTheme() {
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
function toggleTheme () {
|
|
73
|
+
const body = document.body
|
|
74
|
+
const theme = body.getAttribute('data-theme')
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
const newTheme = theme === 'dark' ? 'light' : 'dark'
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
updateTheme(newTheme)
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
(function () {
|
|
82
|
-
|
|
82
|
+
const theme = getTheme()
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
})()
|
|
84
|
+
updateTheme(theme)
|
|
85
|
+
})()
|
|
86
86
|
|
|
87
87
|
/**
|
|
88
88
|
* Function to set accordion id to localStorage.
|
|
89
89
|
* @param {string} id Accordion id
|
|
90
90
|
*/
|
|
91
|
-
function setAccordionIdToLocalStorage(id) {
|
|
92
|
-
|
|
91
|
+
function setAccordionIdToLocalStorage (id) {
|
|
92
|
+
/**
|
|
93
93
|
* @type {object}
|
|
94
94
|
*/
|
|
95
|
-
|
|
95
|
+
const ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey))
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
ids[id] = id
|
|
98
|
+
localStorage.setItem(accordionLocalStorageKey, JSON.stringify(ids))
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
102
|
* Function to remove accordion id from localStorage.
|
|
103
103
|
* @param {string} id Accordion id
|
|
104
104
|
*/
|
|
105
|
-
function removeAccordionIdFromLocalStorage(id) {
|
|
106
|
-
|
|
105
|
+
function removeAccordionIdFromLocalStorage (id) {
|
|
106
|
+
/**
|
|
107
107
|
* @type {object}
|
|
108
108
|
*/
|
|
109
|
-
|
|
109
|
+
const ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey))
|
|
110
110
|
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
delete ids[id]
|
|
112
|
+
localStorage.setItem(accordionLocalStorageKey, JSON.stringify(ids))
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
/**
|
|
@@ -117,374 +117,374 @@ function removeAccordionIdFromLocalStorage(id) {
|
|
|
117
117
|
*
|
|
118
118
|
* @returns {object}
|
|
119
119
|
*/
|
|
120
|
-
function getAccordionIdsFromLocalStorage() {
|
|
121
|
-
|
|
120
|
+
function getAccordionIdsFromLocalStorage () {
|
|
121
|
+
/**
|
|
122
122
|
* @type {object}
|
|
123
123
|
*/
|
|
124
|
-
|
|
124
|
+
const ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey))
|
|
125
125
|
|
|
126
|
-
|
|
126
|
+
return ids || {}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
function toggleAccordion(element) {
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
function toggleAccordion (element) {
|
|
130
|
+
const currentNode = element
|
|
131
|
+
const isCollapsed = currentNode.getAttribute('data-isopen') === 'false'
|
|
132
132
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
133
|
+
if (isCollapsed) {
|
|
134
|
+
currentNode.setAttribute('data-isopen', 'true')
|
|
135
|
+
setAccordionIdToLocalStorage(currentNode.id)
|
|
136
|
+
} else {
|
|
137
|
+
currentNode.setAttribute('data-isopen', 'false')
|
|
138
|
+
removeAccordionIdFromLocalStorage(currentNode.id)
|
|
139
|
+
}
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
function initAccordion() {
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
function initAccordion () {
|
|
143
|
+
if (
|
|
144
|
+
localStorage.getItem(accordionLocalStorageKey) === undefined ||
|
|
145
145
|
localStorage.getItem(accordionLocalStorageKey) === null
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
146
|
+
) {
|
|
147
|
+
localStorage.setItem(accordionLocalStorageKey, '{}')
|
|
148
|
+
}
|
|
149
|
+
const allAccordion = document.querySelectorAll('.sidebar-section-title')
|
|
150
|
+
const ids = getAccordionIdsFromLocalStorage()
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
152
|
+
allAccordion.forEach(function (item) {
|
|
153
|
+
item.addEventListener('click', function () {
|
|
154
|
+
toggleAccordion(item)
|
|
155
|
+
})
|
|
156
|
+
if (item.id in ids) {
|
|
157
|
+
toggleAccordion(item)
|
|
158
|
+
}
|
|
159
|
+
})
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
function isSourcePage() {
|
|
163
|
-
|
|
162
|
+
function isSourcePage () {
|
|
163
|
+
return Boolean(document.querySelector('#source-page'))
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
function bringElementIntoView(element, updateHistory = true) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
166
|
+
function bringElementIntoView (element, updateHistory = true) {
|
|
167
|
+
// If element is null then we are not going further
|
|
168
|
+
if (!element) {
|
|
169
|
+
return
|
|
170
|
+
}
|
|
171
171
|
|
|
172
|
-
|
|
172
|
+
/**
|
|
173
173
|
* tocbotInstance is defined in layout.tmpl
|
|
174
174
|
* It is defined when we are initializing tocbot.
|
|
175
175
|
*
|
|
176
176
|
*/
|
|
177
|
+
// eslint-disable-next-line no-undef
|
|
178
|
+
if (tocbotInstance) {
|
|
179
|
+
setTimeout(
|
|
180
|
+
// eslint-disable-next-line no-undef
|
|
181
|
+
() => tocbotInstance.updateTocListActiveElement(element),
|
|
182
|
+
60
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
const navbar = document.querySelector('.navbar-container')
|
|
186
|
+
const body = document.querySelector('.main-content')
|
|
187
|
+
const elementTop = element.getBoundingClientRect().top
|
|
188
|
+
|
|
189
|
+
let offset = 16
|
|
190
|
+
|
|
191
|
+
if (navbar) {
|
|
192
|
+
offset += navbar.scrollHeight
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (body) {
|
|
196
|
+
body.scrollBy(0, elementTop - offset)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (updateHistory) {
|
|
177
200
|
// eslint-disable-next-line no-undef
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
// eslint-disable-next-line no-undef
|
|
181
|
-
() => tocbotInstance.updateTocListActiveElement(element),
|
|
182
|
-
60
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
var navbar = document.querySelector('.navbar-container');
|
|
186
|
-
var body = document.querySelector('.main-content');
|
|
187
|
-
var elementTop = element.getBoundingClientRect().top;
|
|
188
|
-
|
|
189
|
-
var offset = 16;
|
|
190
|
-
|
|
191
|
-
if (navbar) {
|
|
192
|
-
offset += navbar.scrollHeight;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (body) {
|
|
196
|
-
body.scrollBy(0, elementTop - offset);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (updateHistory) {
|
|
200
|
-
// eslint-disable-next-line no-undef
|
|
201
|
-
history.pushState(null, null, '#' + element.id);
|
|
202
|
-
}
|
|
201
|
+
history.pushState(null, null, '#' + element.id)
|
|
202
|
+
}
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
// eslint-disable-next-line no-unused-vars
|
|
206
|
-
function bringLinkToView(event) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
206
|
+
function bringLinkToView (event) {
|
|
207
|
+
event.preventDefault()
|
|
208
|
+
event.stopPropagation()
|
|
209
|
+
const id = event.currentTarget.getAttribute('href')
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
211
|
+
if (!id) {
|
|
212
|
+
return
|
|
213
|
+
}
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
const element = document.getElementById(id.slice(1))
|
|
216
216
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
217
|
+
if (element) {
|
|
218
|
+
bringElementIntoView(element)
|
|
219
|
+
}
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
function bringIdToViewOnMount() {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
222
|
+
function bringIdToViewOnMount () {
|
|
223
|
+
if (isSourcePage()) {
|
|
224
|
+
return
|
|
225
|
+
}
|
|
226
226
|
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
// eslint-disable-next-line no-undef
|
|
228
|
+
let id = window.location.hash
|
|
229
229
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
230
|
+
if (id === '') {
|
|
231
|
+
return
|
|
232
|
+
}
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
let element = document.getElementById(id.slice(1))
|
|
235
235
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
236
|
+
if (!element) {
|
|
237
|
+
id = decodeURI(id)
|
|
238
|
+
element = document.getElementById(id.slice(1))
|
|
239
|
+
}
|
|
240
240
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
if (element) {
|
|
242
|
+
bringElementIntoView(element, false)
|
|
243
|
+
}
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
function createAnchorElement(id) {
|
|
247
|
-
|
|
246
|
+
function createAnchorElement (id) {
|
|
247
|
+
const anchor = document.createElement('a')
|
|
248
248
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
249
|
+
anchor.textContent = '#'
|
|
250
|
+
anchor.href = '#' + id
|
|
251
|
+
anchor.classList.add('link-anchor')
|
|
252
|
+
anchor.onclick = bringLinkToView
|
|
253
253
|
|
|
254
|
-
|
|
254
|
+
return anchor
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
-
function addAnchor() {
|
|
258
|
-
|
|
257
|
+
function addAnchor () {
|
|
258
|
+
const main = document.querySelector('.main-content').querySelector('section')
|
|
259
259
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
260
|
+
const h1 = main.querySelectorAll('h1')
|
|
261
|
+
const h2 = main.querySelectorAll('h2')
|
|
262
|
+
const h3 = main.querySelectorAll('h3')
|
|
263
|
+
const h4 = main.querySelectorAll('h4')
|
|
264
264
|
|
|
265
|
-
|
|
265
|
+
const targets = [h1, h2, h3, h4]
|
|
266
266
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
267
|
+
targets.forEach(function (target) {
|
|
268
|
+
target.forEach(function (heading) {
|
|
269
|
+
const anchor = createAnchorElement(heading.id)
|
|
270
270
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
271
|
+
heading.classList.add('has-anchor')
|
|
272
|
+
heading.append(anchor)
|
|
273
|
+
})
|
|
274
|
+
})
|
|
275
275
|
}
|
|
276
276
|
|
|
277
277
|
/**
|
|
278
278
|
*
|
|
279
279
|
* @param {string} value
|
|
280
280
|
*/
|
|
281
|
-
function copy(value) {
|
|
282
|
-
|
|
281
|
+
function copy (value) {
|
|
282
|
+
const el = document.createElement('textarea')
|
|
283
283
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
284
|
+
el.value = value
|
|
285
|
+
document.body.appendChild(el)
|
|
286
|
+
el.select()
|
|
287
|
+
document.execCommand('copy')
|
|
288
|
+
document.body.removeChild(el)
|
|
289
289
|
}
|
|
290
290
|
|
|
291
|
-
function showTooltip(id) {
|
|
292
|
-
|
|
291
|
+
function showTooltip (id) {
|
|
292
|
+
const tooltip = document.getElementById(id)
|
|
293
293
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
294
|
+
tooltip.classList.add('show-tooltip')
|
|
295
|
+
setTimeout(function () {
|
|
296
|
+
tooltip.classList.remove('show-tooltip')
|
|
297
|
+
}, 3000)
|
|
298
298
|
}
|
|
299
299
|
|
|
300
300
|
/* eslint-disable-next-line */
|
|
301
301
|
function copyFunction(id) {
|
|
302
|
-
|
|
303
|
-
|
|
302
|
+
// selecting the pre element
|
|
303
|
+
const code = document.getElementById(id)
|
|
304
304
|
|
|
305
|
-
|
|
306
|
-
|
|
305
|
+
// selecting the ol.linenums
|
|
306
|
+
let element = code.querySelector('.linenums')
|
|
307
307
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
308
|
+
if (!element) {
|
|
309
|
+
// selecting the code block
|
|
310
|
+
element = code.querySelector('code')
|
|
311
|
+
}
|
|
312
312
|
|
|
313
|
-
|
|
314
|
-
|
|
313
|
+
// copy
|
|
314
|
+
copy(element.innerText.trim().replace(/(^\t)/gm, ''))
|
|
315
315
|
|
|
316
|
-
|
|
317
|
-
|
|
316
|
+
// show tooltip
|
|
317
|
+
showTooltip('tooltip-' + id)
|
|
318
318
|
}
|
|
319
319
|
|
|
320
|
-
function hideTocOnSourcePage() {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
320
|
+
function hideTocOnSourcePage () {
|
|
321
|
+
if (isSourcePage()) {
|
|
322
|
+
document.querySelector('.toc-container').style.display = 'none'
|
|
323
|
+
}
|
|
324
324
|
}
|
|
325
325
|
|
|
326
|
-
function getPreTopBar(id, lang = '') {
|
|
327
|
-
|
|
328
|
-
|
|
326
|
+
function getPreTopBar (id, lang = '') {
|
|
327
|
+
// tooltip
|
|
328
|
+
const tooltip = '<div class="tooltip" id="tooltip-' + id + '">Copied!</div>'
|
|
329
329
|
|
|
330
|
-
|
|
331
|
-
|
|
330
|
+
// template of copy to clipboard icon container
|
|
331
|
+
const copyToClipboard =
|
|
332
332
|
'<button aria-label="copy code" class="icon-button copy-code" onclick="copyFunction(\'' +
|
|
333
333
|
id +
|
|
334
334
|
'\')"><svg class="sm-icon" alt="click to copy"><use xlink:href="#copy-icon"></use></svg>' +
|
|
335
335
|
tooltip +
|
|
336
|
-
'</button>'
|
|
336
|
+
'</button>'
|
|
337
337
|
|
|
338
|
-
|
|
338
|
+
const langNameDiv =
|
|
339
339
|
'<div class="code-lang-name-container"><div class="code-lang-name">' +
|
|
340
340
|
lang.toLocaleUpperCase() +
|
|
341
|
-
'</div></div>'
|
|
341
|
+
'</div></div>'
|
|
342
342
|
|
|
343
|
-
|
|
343
|
+
const topBar =
|
|
344
344
|
'<div class="pre-top-bar-container">' +
|
|
345
345
|
langNameDiv +
|
|
346
346
|
copyToClipboard +
|
|
347
|
-
'</div>'
|
|
347
|
+
'</div>'
|
|
348
348
|
|
|
349
|
-
|
|
349
|
+
return topBar
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
-
function getPreDiv() {
|
|
353
|
-
|
|
352
|
+
function getPreDiv () {
|
|
353
|
+
const divElement = document.createElement('div')
|
|
354
354
|
|
|
355
|
-
|
|
355
|
+
divElement.classList.add('pre-div')
|
|
356
356
|
|
|
357
|
-
|
|
357
|
+
return divElement
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
-
function processAllPre() {
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
360
|
+
function processAllPre () {
|
|
361
|
+
const targets = document.querySelectorAll('pre')
|
|
362
|
+
const footer = document.querySelector('#PeOAagUepe')
|
|
363
|
+
const navbar = document.querySelector('#VuAckcnZhf')
|
|
364
364
|
|
|
365
|
-
|
|
366
|
-
|
|
365
|
+
let navbarHeight = 0
|
|
366
|
+
let footerHeight = 0
|
|
367
367
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
368
|
+
if (footer) {
|
|
369
|
+
footerHeight = footer.getBoundingClientRect().height
|
|
370
|
+
}
|
|
371
371
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
372
|
+
if (navbar) {
|
|
373
|
+
navbarHeight = navbar.getBoundingClientRect().height
|
|
374
|
+
}
|
|
375
375
|
|
|
376
|
-
|
|
377
|
-
|
|
376
|
+
// eslint-disable-next-line no-undef
|
|
377
|
+
const preMaxHeight = window.innerHeight - navbarHeight - footerHeight - 250
|
|
378
378
|
|
|
379
|
-
|
|
380
|
-
|
|
379
|
+
targets.forEach(function (pre, idx) {
|
|
380
|
+
const parent = pre.parentNode
|
|
381
381
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
382
|
+
if (parent && parent.getAttribute('data-skip-pre-process') === 'true') {
|
|
383
|
+
return
|
|
384
|
+
}
|
|
385
385
|
|
|
386
|
-
|
|
387
|
-
|
|
386
|
+
const div = getPreDiv()
|
|
387
|
+
const id = 'ScDloZOMdL' + idx
|
|
388
388
|
|
|
389
|
-
|
|
390
|
-
|
|
389
|
+
const lang = pre.getAttribute('data-lang') || 'code'
|
|
390
|
+
const topBar = getPreTopBar(id, lang)
|
|
391
391
|
|
|
392
|
-
|
|
392
|
+
div.innerHTML = topBar
|
|
393
393
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
394
|
+
pre.style.maxHeight = preMaxHeight + 'px'
|
|
395
|
+
pre.id = id
|
|
396
|
+
pre.classList.add('prettyprint')
|
|
397
|
+
pre.parentNode.insertBefore(div, pre)
|
|
398
|
+
div.appendChild(pre)
|
|
399
|
+
})
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
-
function highlightAndBringLineIntoView() {
|
|
403
|
-
|
|
404
|
-
|
|
402
|
+
function highlightAndBringLineIntoView () {
|
|
403
|
+
// eslint-disable-next-line no-undef
|
|
404
|
+
const lineNumber = window.location.hash.replace('#line', '')
|
|
405
405
|
|
|
406
|
-
|
|
407
|
-
|
|
406
|
+
try {
|
|
407
|
+
const selector = '[data-line-number="' + lineNumber + '"'
|
|
408
408
|
|
|
409
|
-
|
|
409
|
+
const element = document.querySelector(selector)
|
|
410
410
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
411
|
+
element.scrollIntoView()
|
|
412
|
+
element.parentNode.classList.add('selected')
|
|
413
|
+
} catch (error) {
|
|
414
|
+
console.error(error)
|
|
415
|
+
}
|
|
416
416
|
}
|
|
417
417
|
|
|
418
|
-
function getFontSize() {
|
|
419
|
-
|
|
418
|
+
function getFontSize () {
|
|
419
|
+
let currentFontSize = 16
|
|
420
420
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
421
|
+
try {
|
|
422
|
+
currentFontSize = Number.parseInt(
|
|
423
|
+
html.style.fontSize.split('px')[0],
|
|
424
|
+
10
|
|
425
|
+
)
|
|
426
|
+
} catch (error) {
|
|
427
|
+
console.log(error)
|
|
428
|
+
}
|
|
429
429
|
|
|
430
|
-
|
|
430
|
+
return currentFontSize
|
|
431
431
|
}
|
|
432
432
|
|
|
433
|
-
function localUpdateFontSize(fontSize) {
|
|
434
|
-
|
|
433
|
+
function localUpdateFontSize (fontSize) {
|
|
434
|
+
html.style.fontSize = fontSize + 'px'
|
|
435
435
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
436
|
+
const fontSizeText = document.querySelector(
|
|
437
|
+
'#b77a68a492f343baabea06fad81f651e'
|
|
438
|
+
)
|
|
439
439
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
440
|
+
if (fontSizeText) {
|
|
441
|
+
fontSizeText.innerHTML = fontSize
|
|
442
|
+
}
|
|
443
443
|
}
|
|
444
444
|
|
|
445
|
-
function updateFontSize(fontSize) {
|
|
446
|
-
|
|
447
|
-
|
|
445
|
+
function updateFontSize (fontSize) {
|
|
446
|
+
localUpdateFontSize(fontSize)
|
|
447
|
+
localStorage.setItem(fontSizeLocalStorageKey, fontSize)
|
|
448
448
|
}
|
|
449
449
|
|
|
450
450
|
(function () {
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
}
|
|
460
|
-
updateFontSize(n);
|
|
461
|
-
} else {
|
|
462
|
-
updateFontSize(fontSize);
|
|
451
|
+
const fontSize = getFontSize()
|
|
452
|
+
const fontSizeInLocalStorage = localStorage.getItem(fontSizeLocalStorageKey)
|
|
453
|
+
|
|
454
|
+
if (fontSizeInLocalStorage) {
|
|
455
|
+
const n = Number.parseInt(fontSizeInLocalStorage, 10)
|
|
456
|
+
|
|
457
|
+
if (n === fontSize) {
|
|
458
|
+
return
|
|
463
459
|
}
|
|
464
|
-
|
|
460
|
+
updateFontSize(n)
|
|
461
|
+
} else {
|
|
462
|
+
updateFontSize(fontSize)
|
|
463
|
+
}
|
|
464
|
+
})()
|
|
465
465
|
|
|
466
466
|
// eslint-disable-next-line no-unused-vars
|
|
467
|
-
function incrementFont(event) {
|
|
468
|
-
|
|
467
|
+
function incrementFont (event) {
|
|
468
|
+
const n = getFontSize()
|
|
469
469
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
470
|
+
if (n < MAX_FONT_SIZE) {
|
|
471
|
+
updateFontSize(n + 1)
|
|
472
|
+
}
|
|
473
473
|
}
|
|
474
474
|
|
|
475
475
|
// eslint-disable-next-line no-unused-vars
|
|
476
|
-
function decrementFont(event) {
|
|
477
|
-
|
|
476
|
+
function decrementFont (event) {
|
|
477
|
+
const n = getFontSize()
|
|
478
478
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
479
|
+
if (n > MIN_FONT_SIZE) {
|
|
480
|
+
updateFontSize(n - 1)
|
|
481
|
+
}
|
|
482
482
|
}
|
|
483
483
|
|
|
484
|
-
function fontSizeTooltip() {
|
|
485
|
-
|
|
484
|
+
function fontSizeTooltip () {
|
|
485
|
+
const fontSize = getFontSize()
|
|
486
486
|
|
|
487
|
-
|
|
487
|
+
return `
|
|
488
488
|
<div class="font-size-tooltip">
|
|
489
489
|
<button aria-label="decrease-font-size" class="icon-button ${
|
|
490
490
|
fontSize >= MAX_FONT_SIZE ? 'disabled' : ''
|
|
@@ -510,217 +510,216 @@ function fontSizeTooltip() {
|
|
|
510
510
|
</button>
|
|
511
511
|
</div>
|
|
512
512
|
|
|
513
|
-
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
function initTooltip() {
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
513
|
+
`
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function initTooltip () {
|
|
517
|
+
// add tooltip to navbar item
|
|
518
|
+
// eslint-disable-next-line no-undef
|
|
519
|
+
tippy('.theme-toggle', {
|
|
520
|
+
content: 'Toggle Theme',
|
|
521
|
+
delay: 500
|
|
522
|
+
})
|
|
523
|
+
|
|
524
|
+
// eslint-disable-next-line no-undef
|
|
525
|
+
tippy('.search-button', {
|
|
526
|
+
content: 'Search',
|
|
527
|
+
delay: 500
|
|
528
|
+
})
|
|
529
529
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
530
|
+
// eslint-disable-next-line no-undef
|
|
531
|
+
tippy('.font-size', {
|
|
532
|
+
content: 'Change font size',
|
|
533
|
+
delay: 500
|
|
534
|
+
})
|
|
535
535
|
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
536
|
+
// eslint-disable-next-line no-undef
|
|
537
|
+
tippy('.codepen-button', {
|
|
538
|
+
content: 'Open code in CodePen',
|
|
539
|
+
placement: 'left'
|
|
540
|
+
})
|
|
541
541
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
542
|
+
// eslint-disable-next-line no-undef
|
|
543
|
+
tippy('.copy-code', {
|
|
544
|
+
content: 'Copy this code',
|
|
545
|
+
placement: 'left'
|
|
546
|
+
})
|
|
547
547
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
548
|
+
// eslint-disable-next-line no-undef
|
|
549
|
+
tippy('.font-size', {
|
|
550
|
+
content: fontSizeTooltip(),
|
|
551
|
+
trigger: 'click',
|
|
552
|
+
interactive: true,
|
|
553
|
+
allowHTML: true,
|
|
554
|
+
placement: 'left'
|
|
555
|
+
})
|
|
556
556
|
}
|
|
557
557
|
|
|
558
|
-
function fixTable() {
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
for (const table of tables) {
|
|
562
|
-
if (table.classList.contains('hljs-ln')) {
|
|
563
|
-
// don't want to wrap code blocks.
|
|
564
|
-
return;
|
|
565
|
-
}
|
|
558
|
+
function fixTable () {
|
|
559
|
+
const tables = document.querySelectorAll('table')
|
|
566
560
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
div.appendChild(table);
|
|
561
|
+
for (const table of tables) {
|
|
562
|
+
if (table.classList.contains('hljs-ln')) {
|
|
563
|
+
// don't want to wrap code blocks.
|
|
564
|
+
return
|
|
572
565
|
}
|
|
573
|
-
}
|
|
574
566
|
|
|
575
|
-
|
|
576
|
-
var mobileMenuContainer = document.querySelector('#mobile-sidebar');
|
|
577
|
-
var target = document.querySelector('#mobile-menu');
|
|
578
|
-
var svgUse = target.querySelector('use');
|
|
567
|
+
const div = document.createElement('div')
|
|
579
568
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
target.setAttribute('data-isopen', 'false');
|
|
585
|
-
}
|
|
586
|
-
if (svgUse) {
|
|
587
|
-
svgUse.setAttribute('xlink:href', '#menu-icon');
|
|
588
|
-
}
|
|
569
|
+
div.classList.add('table-div')
|
|
570
|
+
table.parentNode.insertBefore(div, table)
|
|
571
|
+
div.appendChild(table)
|
|
572
|
+
}
|
|
589
573
|
}
|
|
590
574
|
|
|
591
|
-
function
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
575
|
+
function hideMobileMenu () {
|
|
576
|
+
const mobileMenuContainer = document.querySelector('#mobile-sidebar')
|
|
577
|
+
const target = document.querySelector('#mobile-menu')
|
|
578
|
+
const svgUse = target.querySelector('use')
|
|
595
579
|
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
580
|
+
if (mobileMenuContainer) {
|
|
581
|
+
mobileMenuContainer.classList.remove('show')
|
|
582
|
+
}
|
|
583
|
+
if (target) {
|
|
584
|
+
target.setAttribute('data-isopen', 'false')
|
|
585
|
+
}
|
|
586
|
+
if (svgUse) {
|
|
587
|
+
svgUse.setAttribute('xlink:href', '#menu-icon')
|
|
588
|
+
}
|
|
605
589
|
}
|
|
606
590
|
|
|
607
|
-
function
|
|
608
|
-
|
|
609
|
-
|
|
591
|
+
function showMobileMenu () {
|
|
592
|
+
const mobileMenuContainer = document.querySelector('#mobile-sidebar')
|
|
593
|
+
const target = document.querySelector('#mobile-menu')
|
|
594
|
+
const svgUse = target.querySelector('use')
|
|
610
595
|
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
596
|
+
if (mobileMenuContainer) {
|
|
597
|
+
mobileMenuContainer.classList.add('show')
|
|
598
|
+
}
|
|
599
|
+
if (target) {
|
|
600
|
+
target.setAttribute('data-isopen', 'true')
|
|
601
|
+
}
|
|
602
|
+
if (svgUse) {
|
|
603
|
+
svgUse.setAttribute('xlink:href', '#close-icon')
|
|
604
|
+
}
|
|
616
605
|
}
|
|
617
606
|
|
|
618
|
-
function
|
|
619
|
-
|
|
607
|
+
function onMobileMenuClick () {
|
|
608
|
+
const target = document.querySelector('#mobile-menu')
|
|
609
|
+
const isOpen = target.getAttribute('data-isopen') === 'true'
|
|
620
610
|
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
611
|
+
if (isOpen) {
|
|
612
|
+
hideMobileMenu()
|
|
613
|
+
} else {
|
|
614
|
+
showMobileMenu()
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
function initMobileMenu () {
|
|
619
|
+
const menu = document.querySelector('#mobile-menu')
|
|
620
|
+
|
|
621
|
+
if (menu) {
|
|
622
|
+
menu.addEventListener('click', onMobileMenuClick)
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
function addHrefToSidebarTitle () {
|
|
627
|
+
const titles = document.querySelectorAll('.sidebar-title-anchor')
|
|
625
628
|
|
|
626
|
-
function
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
// eslint-disable-next-line no-undef
|
|
631
|
-
title.setAttribute('href', baseURL);
|
|
632
|
-
});
|
|
629
|
+
titles.forEach(function (title) {
|
|
630
|
+
// eslint-disable-next-line no-undef
|
|
631
|
+
title.setAttribute('href', baseURL)
|
|
632
|
+
})
|
|
633
633
|
}
|
|
634
634
|
|
|
635
|
-
function highlightActiveLinkInSidebar() {
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
635
|
+
function highlightActiveLinkInSidebar () {
|
|
636
|
+
const list = document.location.href.split('/')
|
|
637
|
+
const targetURL = decodeURI(list[list.length - 1])
|
|
638
|
+
let element = document.querySelector(`.sidebar a[href*='${targetURL}']`)
|
|
639
639
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
640
|
+
if (!element) {
|
|
641
|
+
try {
|
|
642
|
+
element = document.querySelector(
|
|
643
643
|
`.sidebar a[href*='${targetURL.split('#')[0]}']`
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
644
|
+
)
|
|
645
|
+
} catch (e) {
|
|
646
|
+
console.error(e)
|
|
647
647
|
|
|
648
|
-
|
|
649
|
-
}
|
|
648
|
+
return
|
|
650
649
|
}
|
|
650
|
+
}
|
|
651
651
|
|
|
652
|
-
|
|
652
|
+
if (!element) return
|
|
653
653
|
|
|
654
|
-
|
|
655
|
-
|
|
654
|
+
element.parentElement.classList.add('active')
|
|
655
|
+
element.scrollIntoView()
|
|
656
656
|
}
|
|
657
657
|
|
|
658
|
-
function onDomContentLoaded() {
|
|
659
|
-
|
|
658
|
+
function onDomContentLoaded () {
|
|
659
|
+
const themeButton = document.querySelectorAll('.theme-toggle')
|
|
660
|
+
|
|
661
|
+
initMobileMenu()
|
|
662
|
+
|
|
663
|
+
if (themeButton) {
|
|
664
|
+
themeButton.forEach(function (button) {
|
|
665
|
+
button.addEventListener('click', toggleTheme)
|
|
666
|
+
})
|
|
667
|
+
}
|
|
660
668
|
|
|
661
|
-
|
|
669
|
+
// Highlighting code
|
|
662
670
|
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
671
|
+
// eslint-disable-next-line no-undef
|
|
672
|
+
hljs.addPlugin({
|
|
673
|
+
'after:highlightElement': function (obj) {
|
|
674
|
+
// Replace 'code' with result.language when
|
|
675
|
+
// we are able to cross-check the correctness of
|
|
676
|
+
// result.
|
|
677
|
+
obj.el.parentNode.setAttribute('data-lang', 'code')
|
|
667
678
|
}
|
|
679
|
+
})
|
|
680
|
+
// eslint-disable-next-line no-undef
|
|
681
|
+
hljs.highlightAll()
|
|
682
|
+
// eslint-disable-next-line no-undef
|
|
683
|
+
hljs.initLineNumbersOnLoad({
|
|
684
|
+
singleLine: true
|
|
685
|
+
})
|
|
668
686
|
|
|
669
|
-
|
|
687
|
+
// Highlight complete
|
|
670
688
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
});
|
|
686
|
-
|
|
687
|
-
// Highlight complete
|
|
688
|
-
|
|
689
|
-
initAccordion();
|
|
690
|
-
addAnchor();
|
|
691
|
-
processAllPre();
|
|
692
|
-
hideTocOnSourcePage();
|
|
693
|
-
setTimeout(function () {
|
|
694
|
-
bringIdToViewOnMount();
|
|
695
|
-
if (isSourcePage()) {
|
|
696
|
-
highlightAndBringLineIntoView();
|
|
697
|
-
}
|
|
698
|
-
}, 1000);
|
|
699
|
-
initTooltip();
|
|
700
|
-
fixTable();
|
|
701
|
-
addHrefToSidebarTitle();
|
|
702
|
-
highlightActiveLinkInSidebar();
|
|
689
|
+
initAccordion()
|
|
690
|
+
addAnchor()
|
|
691
|
+
processAllPre()
|
|
692
|
+
hideTocOnSourcePage()
|
|
693
|
+
setTimeout(function () {
|
|
694
|
+
bringIdToViewOnMount()
|
|
695
|
+
if (isSourcePage()) {
|
|
696
|
+
highlightAndBringLineIntoView()
|
|
697
|
+
}
|
|
698
|
+
}, 1000)
|
|
699
|
+
initTooltip()
|
|
700
|
+
fixTable()
|
|
701
|
+
addHrefToSidebarTitle()
|
|
702
|
+
highlightActiveLinkInSidebar()
|
|
703
703
|
}
|
|
704
704
|
|
|
705
705
|
// eslint-disable-next-line no-undef
|
|
706
|
-
window.addEventListener('DOMContentLoaded', onDomContentLoaded)
|
|
706
|
+
window.addEventListener('DOMContentLoaded', onDomContentLoaded)
|
|
707
707
|
|
|
708
708
|
// eslint-disable-next-line no-undef
|
|
709
709
|
window.addEventListener('hashchange', (event) => {
|
|
710
|
-
|
|
710
|
+
const url = new URL(event.newURL)
|
|
711
711
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
})
|
|
712
|
+
if (url.hash !== '') {
|
|
713
|
+
bringIdToViewOnMount(url.hash)
|
|
714
|
+
}
|
|
715
|
+
})
|
|
716
716
|
|
|
717
717
|
// eslint-disable-next-line no-undef
|
|
718
718
|
window.addEventListener('storage', (event) => {
|
|
719
|
-
|
|
719
|
+
if (event.newValue === 'undefined') return
|
|
720
720
|
|
|
721
|
-
|
|
721
|
+
initTooltip()
|
|
722
722
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
});
|
|
723
|
+
if (event.key === themeLocalStorageKey) localUpdateTheme(event.newValue)
|
|
724
|
+
if (event.key === fontSizeLocalStorageKey) { localUpdateFontSize(event.newValue) }
|
|
725
|
+
})
|