diff --git a/css/kunai/site/navbar.css b/css/kunai/site/navbar.css
index b64d515..2e2f413 100644
--- a/css/kunai/site/navbar.css
+++ b/css/kunai/site/navbar.css
@@ -48,7 +48,7 @@ nav[role="navigation"] {
height: 0;
padding: 32px 32px 0 0;
margin: 0 4px 0 0;
- background-image: url(https://cpprefjp.github.io/static/original-icons/cpprefjp-icon-v2.0-transparent.png);
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='26.000004mm' height='26.000004mm' viewBox='0 0 26.000004 26.000004' version='1.1' id='svg1' xmlns='http://www.w3.org/2000/svg' xmlns:svg='http://www.w3.org/2000/svg'%3E%3Cdefs id='defs1'%3E%3CclipPath clipPathUnits='userSpaceOnUse' id='clipPath12'%3E%3Crect style='fill:%232ca9e1;stroke:none;stroke-width:0.45729;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0' id='rect13' width='26' height='26' x='92.05806' y='113.9539' /%3E%3C/clipPath%3E%3C/defs%3E%3Cg id='layer1' transform='translate(-92.058062,-113.95391)'%3E%3Cg id='g12' clip-path='url(%23clipPath12)'%3E%3Cpath id='path2-6' style='fill:none;stroke:%2300a3af;stroke-width:1.05833;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none' d='m 92.803909,132.76018 -9.95492,5.62988 -9.85309,-5.80628 0.10185,-11.43616 9.95493,-5.62987 9.85308,5.80627 z' /%3E%3Cpath id='path2-2' style='fill:none;stroke:%2300a3af;stroke-width:1.05833;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none' d='m 137.01837,132.76018 -9.95492,5.62988 -9.85309,-5.80628 0.10185,-11.43616 9.95493,-5.62988 9.85308,5.80628 z' /%3E%3Cpath id='path2-9' style='fill:none;stroke:%2300a3af;stroke-width:2.11666;stroke-linecap:round;stroke-linejoin:round' d='m 112.76826,132.84545 -7.86126,4.70835 -9.038106,-5.38578 0.09342,-10.60799 9.131526,-5.22216 7.51379,4.6151' /%3E%3Cpath style='fill:%232ca9e1;stroke:none;stroke-width:0.945904;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0' id='path3-6' d='m 68.619675,152.01895 -1.306347,-4.85182 -4.851829,-1.30635 4.851829,-1.30635 1.306347,-4.85183 1.306346,4.85183 4.851829,1.30635 -4.851829,1.30635 z' transform='matrix(0.8119288,0,0,0.82328669,47.479406,6.8605971)' /%3E%3Cpath style='fill:%232ca9e1;stroke:none;stroke-width:0.945904;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0' id='path3-6-1' d='m 68.619675,152.01895 -1.306347,-4.85182 -4.851829,-1.30635 4.851829,-1.30635 1.306347,-4.85183 1.306346,4.85183 4.851829,1.30635 -4.851829,1.30635 z' transform='matrix(0.8119288,0,0,0.82328669,55.018249,6.8605971)' /%3E%3Cg id='g5' transform='translate(0.20305)'%3E%3Cpath id='path2-6-4' style='fill:none;stroke:%2300a3af;stroke-width:1.05833;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none' d='m 103.65447,152.06483 -9.954911,5.62988 -9.85309,-5.80628 0.10185,-11.43616 9.95493,-5.62987 9.853071,5.80627 z' /%3E%3Cpath id='path2-5' style='fill:none;stroke:%2300a3af;stroke-width:1.05833;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none' d='m 125.7617,152.06483 -9.95492,5.62988 -9.85308,-5.80628 0.10184,-11.43616 9.95493,-5.62988 9.85308,5.80628 z' /%3E%3C/g%3E%3Cg id='g6' transform='translate(0.0998685)'%3E%3Cpath id='path2-6-4-9' style='fill:none;stroke:%2300a3af;stroke-width:1.05833;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none' d='m 103.75765,113.45553 -9.954908,5.62988 -9.85309,-5.80628 0.10185,-11.43616 9.95493,-5.629874 9.853068,5.806274 z' /%3E%3Cpath id='path2-5-1' style='fill:none;stroke:%2300a3af;stroke-width:1.05833;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none' d='m 125.86488,113.45553 -9.95492,5.62988 -9.85308,-5.80628 0.10184,-11.43616 9.95493,-5.629884 9.85308,5.806284 z' /%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
background-size: contain;
background-repeat: no-repeat;
}
diff --git a/js/kunai.js b/js/kunai.js
index 671c1ee..852a2e3 100644
--- a/js/kunai.js
+++ b/js/kunai.js
@@ -107,6 +107,7 @@ class Kunai {
async onDatabase(db) {
// this.log.debug(`onDatabase`, db)
+ UI.Badge.onDatabase(db)
await this.ui.sidebar.onDatabase(db)
await this.ui.sidebar.treeview.onPageID(this.meta.page_id)
}
@@ -116,10 +117,73 @@ class Kunai {
await this.initSidebar()
+ // Dynamically set the base_url
+ const dynamic_base_url = (() => {
+ // Determine the location of the website base
+ const current_script = document.currentScript || document.querySelector('script[src*="static/kunai/js/kunai.js"]')
+ if (current_script) {
+ // Try to determine the base_url based on the location of this script
+ // ({base_url}/static/kunai/js/kunai.js).
+ const url_kunai = current_script.getAttribute("src")
+ const url = url_kunai.replace(/\bstatic\/kunai\/js\/kunai\.js([?#].*)?$/, "")
+ if (url != url_kunai) return url == "" ? "/" : url
+ }
+ // Fallback case assuming that the website is hosted at the top level
+ return "/"
+ })()
+
+ // Determine the project website URL, which is assumed to be stored in
+ // or in .
+ const online_base_url = (() => {
+ const meta = document.querySelector('meta[name="twitter:url"]') || document.querySelector('meta[property="og:url"]')
+ if (meta && meta.content) {
+ const m = meta.content.toString().match(/^https?:\/\/[^/]*\//)
+ if (m) return m[0]
+ }
+ return null
+ })()
+
+ const database_url = (() => {
+ // Determine the location of the database file "crsearch.json".
+ const current_script = document.currentScript || document.querySelector('script[src*="kunai/js/kunai.js"]')
+ if (current_script) {
+ // A special care is needed for local HTML files (file://...). When a
+ // HTML in a local file system is directly opened in a Web browser,
+ // "static/crsearch/crsearch.json" cannot be read using XHR due to the
+ // CORS (cross-origin resource sharing) policy for the local files.
+ if (/^file:\/\//.test(current_script.src)) {
+ const url_kunai = current_script.getAttribute("src")
+
+ // When the current script file (kunai.js) is located in an expected
+ // path in the tree, we try to load the local database file
+ // "crsearch/crsearch.js" in JSONP format.
+ const url = url_kunai.replace(/\bkunai\/js\/kunai\.js([?#].*)?$/, "crsearch/crsearch.js")
+ if (url != url_kunai) return url
+
+ // Try to download "crsearch.json" from the project website.
+ if (online_base_url)
+ return online_base_url + "static/crsearch/crsearch.json"
+ }
+
+ // Try to determine the position of crsearch.json
+ // ({base_url}/static/crsearch/crsearch.json) based on the location of
+ // this script ({base_url}/static/kunai/js/kunai.js).
+ const url_kunai = current_script.getAttribute("src")
+ const url = url_kunai.replace(/\bkunai\/js\/kunai\.js([?#].*)?$/, "crsearch/crsearch.json")
+ if (url != url_kunai) return url
+ }
+
+ // Fallback case assuming that the website is hosted at the top level
+ return "/static/crsearch/crsearch.json"
+ })();
+
let crs = new CRSearch({
onDatabase: this.onDatabase.bind(this),
+ base_url: dynamic_base_url,
+ online_base_url: online_base_url
})
- crs.database('/static/crsearch/crsearch.json')
+ crs.database(database_url)
let e = $('.crsearch')
await crs.searchbox(e)
diff --git a/js/kunai/ui.js b/js/kunai/ui.js
index 98d0db2..1745f55 100644
--- a/js/kunai/ui.js
+++ b/js/kunai/ui.js
@@ -1,4 +1,5 @@
export {Content} from './ui/content'
export {Sidebar} from './ui/sidebar'
export {Navbar} from './ui/navbar'
-
+import * as Badge from './ui/badge'
+export {Badge}
diff --git a/js/kunai/ui/badge.js b/js/kunai/ui/badge.js
index adc0f14..0abe2e0 100644
--- a/js/kunai/ui/badge.js
+++ b/js/kunai/ui/badge.js
@@ -1,3 +1,13 @@
+let base_url = null
+const unresolved_links = []
+
+const onDatabase = (db) => {
+ base_url = db.base_url.toString()
+ for (let a_elem of unresolved_links)
+ a_elem.attr('href', base_url.replace(/\/$/, '') + a_elem.attr('href'))
+ unresolved_links.length = 0
+}
+
const sanitize = (badges) => {
let i = 0
@@ -46,15 +56,18 @@ const sanitize = (badges) => {
const lang_path = cppv ? `/lang/cpp${cppv}` :
named_version ? `/lang/${named_version}` :
`/lang`
+ const a_elem = $('', {href: `${lang_path}.html`})
+ .append($(''))
+ // .append($('').text(clean_txt))
+ .appendTo(b.empty())
- b.empty().append(
- $('', {href: `${lang_path}.html`})
- .append($(''))
- // .append($('').text(clean_txt))
- )
+ if (base_url)
+ a_elem.attr('href', base_url.replace(/\/$/, '') + a_elem.attr('href'))
+ else
+ unresolved_links.push(a_elem)
}
return i
}
-export {sanitize}
+export {onDatabase, sanitize}
diff --git a/js/kunai/ui/content.js b/js/kunai/ui/content.js
index 68f3027..29f55e4 100644
--- a/js/kunai/ui/content.js
+++ b/js/kunai/ui/content.js
@@ -12,7 +12,7 @@ const _hitElementRects = (elem, x, y) => {
class Content {
constructor(log) {
this.log = log.makeContext('Content')
- this.log.debug('initialzing...')
+ this.log.debug('initializing...')
this.log.debug(`found ${Badge.sanitize($('main[role="main"] div[itemtype="http://schema.org/Article"] .content-body span.cpp'))} badges`)
diff --git a/js/kunai/ui/sidebar.js b/js/kunai/ui/sidebar.js
index b00301d..5caaecc 100644
--- a/js/kunai/ui/sidebar.js
+++ b/js/kunai/ui/sidebar.js
@@ -5,7 +5,7 @@ import {KC} from 'crsearch'
class Sidebar {
constructor(log) {
this.log = log.makeContext('Sidebar')
- this.log.info('initialzing...')
+ this.log.info('initializing...')
this.kc = new KC.Config({
'article.md': require('../../../kunai_configs/current/article.md').default,
diff --git a/js/kunai/ui/treeview.js b/js/kunai/ui/treeview.js
index 30ad613..2c10993 100644
--- a/js/kunai/ui/treeview.js
+++ b/js/kunai/ui/treeview.js
@@ -283,7 +283,7 @@ class Treeview {
this.opts = Object.assign({}, opts)
this.legacy = this.opts.legacy
- this.log.debug('initialzing...')
+ this.log.debug('initializing...')
if (this.legacy) {
const c = Badge.sanitize(this.e.find('.cpp-sidebar'))