mirror of
https://github.com/jerryc127/hexo-theme-butterfly.git
synced 2025-09-15 12:58:48 +08:00
Merge branch 'dev' of https://github.com/jerryc127/hexo-theme-butterfly into dev
This commit is contained in:
commit
628d1bbe52
57
layout/includes/third-party/abcjs/abcjs.pug
vendored
57
layout/includes/third-party/abcjs/abcjs.pug
vendored
@ -1,17 +1,46 @@
|
|||||||
script.
|
script.
|
||||||
(() => {
|
(function() {
|
||||||
const abcjsInit = () => {
|
const abcjsInit = function() {
|
||||||
const abcjsFn = () => setTimeout(() => {
|
const abcjsFn = function() {
|
||||||
document.querySelectorAll(".abc-music-sheet").forEach(ele => {
|
setTimeout(function() {
|
||||||
if (ele.children.length > 0) return
|
const sheets = document.querySelectorAll(".abc-music-sheet")
|
||||||
ABCJS.renderAbc(ele, ele.innerHTML, {responsive: 'resize'})
|
for (let i = 0; i < sheets.length; i++) {
|
||||||
})
|
const ele = sheets[i]
|
||||||
}, 100)
|
if (ele.children.length > 0) continue
|
||||||
|
|
||||||
typeof ABCJS === 'object' ? abcjsFn()
|
// Parse parameters from data-params attribute
|
||||||
: btf.getScript('!{url_for(theme.asset.abcjs_basic_js)}').then(abcjsFn)
|
let params = {}
|
||||||
|
const dp = ele.getAttribute("data-params")
|
||||||
|
if (dp) {
|
||||||
|
try {
|
||||||
|
params = JSON.parse(dp)
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Failed to parse data-params:", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merge parsed parameters with the responsive option
|
||||||
|
// Ensures params content appears before responsive
|
||||||
|
const options = { ...params, responsive: "resize" }
|
||||||
|
|
||||||
|
// Render the music score using ABCJS.renderAbc
|
||||||
|
ABCJS.renderAbc(ele, ele.innerHTML, options)
|
||||||
|
}
|
||||||
|
}, 100)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof ABCJS === "object") {
|
||||||
|
abcjsFn()
|
||||||
|
} else {
|
||||||
|
btf.getScript("!{url_for(theme.asset.abcjs_basic_js)}").then(abcjsFn)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.pjax ? abcjsInit() : window.addEventListener('load', abcjsInit)
|
if (window.pjax) {
|
||||||
btf.addGlobalFn('encrypt', abcjsInit, 'abcjs')
|
abcjsInit()
|
||||||
})()
|
} else {
|
||||||
|
window.addEventListener("load", abcjsInit)
|
||||||
|
}
|
||||||
|
|
||||||
|
btf.addGlobalFn("encrypt", abcjsInit, "abcjs")
|
||||||
|
})()
|
||||||
|
|||||||
7
layout/includes/third-party/pjax.pug
vendored
7
layout/includes/third-party/pjax.pug
vendored
@ -59,7 +59,10 @@ script.
|
|||||||
|
|
||||||
document.addEventListener('pjax:error', e => {
|
document.addEventListener('pjax:error', e => {
|
||||||
if (e.request.status === 404) {
|
if (e.request.status === 404) {
|
||||||
window.location.href = e.request.responseURL
|
const usePjax = !{theme.pjax && theme.pjax.enable}
|
||||||
|
!{theme.error_404 && theme.error_404.enable}
|
||||||
|
? (usePjax ? pjax.loadUrl('!{url_for("/404.html")}') : window.location.href = '!{url_for("/404.html")}')
|
||||||
|
: window.location.href = e.request.responseURL
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})()
|
})()
|
||||||
|
|||||||
@ -6,17 +6,45 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const score = (args, content) => {
|
const score = (args, content) => {
|
||||||
|
// Escape HTML tags and some special characters, including curly braces
|
||||||
const escapeHtmlTags = s => {
|
const escapeHtmlTags = s => {
|
||||||
const lookup = {
|
const lookup = {
|
||||||
'&': '&',
|
'&': '&',
|
||||||
'"': '"',
|
'"': '"',
|
||||||
'\'': ''',
|
"'": ''',
|
||||||
'<': '<',
|
'<': '<',
|
||||||
'>': '>'
|
'>': '>',
|
||||||
|
'{': '{',
|
||||||
|
'}': '}'
|
||||||
}
|
}
|
||||||
return s.replace(/[&"'<>]/g, c => lookup[c])
|
return s.replace(/[&"'<>{}]/g, c => lookup[c])
|
||||||
}
|
}
|
||||||
return `<div class="abc-music-sheet">${escapeHtmlTags(content)}</div>`
|
|
||||||
|
const trimmed = content.trim()
|
||||||
|
// Split content using six dashes as a delimiter
|
||||||
|
const parts = trimmed.split('------')
|
||||||
|
|
||||||
|
if (parts.length < 2) {
|
||||||
|
// If no delimiter is found, treat the entire content as the score
|
||||||
|
return `<div class="abc-music-sheet">${escapeHtmlTags(trimmed)}</div>`
|
||||||
|
}
|
||||||
|
|
||||||
|
// First part is parameters (JSON string), the rest is the score content
|
||||||
|
const paramPart = parts[0].trim()
|
||||||
|
const scorePart = parts.slice(1).join('------').trim()
|
||||||
|
|
||||||
|
let paramsObj = {}
|
||||||
|
try {
|
||||||
|
paramsObj = JSON.parse(paramPart)
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Failed to parse JSON in score tag:", e)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use double quotes for data-params attribute value,
|
||||||
|
// ensuring JSON internal double quotes are escaped
|
||||||
|
return `<div class="abc-music-sheet" data-params="${escapeHtmlTags(JSON.stringify(paramsObj))}">
|
||||||
|
${escapeHtmlTags(scorePart)}
|
||||||
|
</div>`
|
||||||
}
|
}
|
||||||
|
|
||||||
hexo.extend.tag.register('score', score, { ends: true })
|
hexo.extend.tag.register("score", score, { ends: true })
|
||||||
Loading…
Reference in New Issue
Block a user