所有文件提交
This commit is contained in:
@@ -72,20 +72,16 @@
|
||||
})
|
||||
}
|
||||
|
||||
let highlight = 'undefined'
|
||||
let syntaxHighlighter = config.syntax_highlighter
|
||||
let highlightEnable = syntaxHighlighter ? ['highlight.js', 'prismjs'].includes(syntaxHighlighter) : (config.highlight.enable || config.prismjs.enable)
|
||||
if (highlightEnable) {
|
||||
const { copy, language, height_limit, fullpage, macStyle } = theme.code_blocks
|
||||
highlight = JSON.stringify({
|
||||
plugin: syntaxHighlighter ? syntaxHighlighter : config.highlight.enable ? 'highlight.js' : 'prismjs',
|
||||
highlightCopy: copy,
|
||||
highlightLang: language,
|
||||
highlightHeightLimit: height_limit,
|
||||
highlightFullpage: fullpage,
|
||||
highlightMacStyle: macStyle
|
||||
})
|
||||
}
|
||||
let highlightProvider = config.syntax_highlighter || (config.highlight.enable ? 'highlight.js' : config.prismjs.enable ? 'prismjs' : null)
|
||||
const { copy, language, height_limit, fullpage, macStyle, shrink } = theme.code_blocks
|
||||
let highlight = JSON.stringify({
|
||||
plugin: highlightProvider,
|
||||
highlightCopy: copy,
|
||||
highlightLang: language,
|
||||
highlightHeightLimit: height_limit,
|
||||
highlightFullpage: fullpage,
|
||||
highlightMacStyle: macStyle
|
||||
})
|
||||
|
||||
script.
|
||||
const GLOBAL_CONFIG = {
|
||||
|
||||
@@ -10,24 +10,17 @@ nav#nav
|
||||
span.site-name=(page.title || config.title)
|
||||
span.site-name
|
||||
i.fa-solid.fa-circle-arrow-left
|
||||
span= '' + _p('post.back_to_home')
|
||||
span= ' ' + _p('post.back_to_home')
|
||||
|
||||
#menus
|
||||
//- if theme.search.use
|
||||
//- #search-button
|
||||
//- span.site-page.social-icon.search
|
||||
//- i.fas.fa-search.fa-fw
|
||||
//- span= ' ' + _p('search.title')
|
||||
if theme.search.use
|
||||
#search-button
|
||||
span.site-page.social-icon.search
|
||||
i.fas.fa-search.fa-fw
|
||||
span= ' ' + _p('search.title')
|
||||
if theme.menu
|
||||
!= partial('includes/header/menu_item', {}, {cache: true})
|
||||
#nav-right
|
||||
if theme.search.use || true
|
||||
#random-post-button
|
||||
a.site-page.social-icon#random-post-link(href='javascript:void(0);' onclick='randomPost()')
|
||||
i.fas.fa-solid.fa-shuffle
|
||||
#search-button
|
||||
a.site-page.social-icon.search-typesense-trigger
|
||||
i.fas.fa-search.fa-fw
|
||||
|
||||
#toggle-menu
|
||||
span.site-page
|
||||
i.fas.fa-bars.fa-fw
|
||||
@@ -41,7 +41,6 @@ html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside
|
||||
|
||||
#body-wrap(class=pageType)
|
||||
include ./header/index.pug
|
||||
include ./others/memos_home.pug
|
||||
|
||||
main#content-inner.layout(class=hideAside)
|
||||
if body
|
||||
@@ -57,5 +56,4 @@ html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside
|
||||
!=partial('includes/footer', {}, {cache: true})
|
||||
|
||||
include ./rightside.pug
|
||||
include ./additional-js.pug
|
||||
include ./rightmenu.pug
|
||||
include ./additional-js.pug
|
||||
@@ -1,6 +1,6 @@
|
||||
mixin indexPostUI()
|
||||
- const indexLayout = theme.index_layout
|
||||
- const masonryLayoutClass = (indexLayout === 6 || indexLayout === 7) ? 'masonry' : ''
|
||||
- const masonryLayoutClass = [6, 7].includes(indexLayout) ? 'masonry' : ''
|
||||
#recent-posts.recent-posts.nc(class=masonryLayoutClass)
|
||||
.recent-post-items
|
||||
each article, index in page.posts.data
|
||||
@@ -8,17 +8,17 @@ mixin indexPostUI()
|
||||
- const link = article.link || article.path
|
||||
- const title = article.title || _p('no_title')
|
||||
- const leftOrRight = indexLayout === 3 ? (index % 2 === 0 ? 'left' : 'right') : (indexLayout === 2 ? 'right' : '')
|
||||
- const post_cover = article.cover
|
||||
- const no_cover = article.cover === false || !theme.cover.index_enable ? 'no-cover' : ''
|
||||
- const postCover = article.cover
|
||||
- const noCover = article.cover === false || !theme.cover.index_enable ? 'no-cover' : ''
|
||||
|
||||
if post_cover && theme.cover.index_enable
|
||||
if postCover && theme.cover.index_enable
|
||||
.post_cover(class=leftOrRight)
|
||||
a(href=url_for(link) title=title)
|
||||
if article.cover_type === 'img'
|
||||
img.post-bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title)
|
||||
img.post-bg(src=url_for(postCover) onerror=`this.onerror=null;this.src='${url_for(theme.error_img.post_page)}'` alt=title)
|
||||
else
|
||||
div.post-bg(style=`background: ${post_cover}`)
|
||||
.recent-post-info(class=no_cover)
|
||||
div.post-bg(style=`background: ${postCover}`)
|
||||
.recent-post-info(class=noCover)
|
||||
a.article-title(href=url_for(link) title=title)
|
||||
if globalPageType === 'home' && (article.top || article.sticky > 0)
|
||||
i.fas.fa-thumbtack.sticky
|
||||
@@ -35,13 +35,13 @@ mixin indexPostUI()
|
||||
span.article-meta-label=_p('post.updated')
|
||||
time.post-meta-date-updated(datetime=date_xml(article.updated) title=_p('post.updated') + ' ' + full_date(article.updated))= date(article.updated, config.date_format)
|
||||
else
|
||||
- const data_type_updated = theme.post_meta.page.date_type === 'updated'
|
||||
- const date_type = data_type_updated ? 'updated' : 'date'
|
||||
- const date_icon = data_type_updated ? 'fas fa-history' : 'far fa-calendar-alt'
|
||||
- const date_title = data_type_updated ? _p('post.updated') : _p('post.created')
|
||||
i(class=date_icon)
|
||||
span.article-meta-label= date_title
|
||||
time(datetime=date_xml(article[date_type]) title=date_title + ' ' + full_date(article[date_type]))= date(article[date_type], config.date_format)
|
||||
- const isUpdatedType = theme.post_meta.page.date_type === 'updated'
|
||||
- const dateType = isUpdatedType ? 'updated' : 'date'
|
||||
- const dateIcon = isUpdatedType ? 'fas fa-history' : 'far fa-calendar-alt'
|
||||
- const dateTitle = isUpdatedType ? _p('post.updated') : _p('post.created')
|
||||
i(class=dateIcon)
|
||||
span.article-meta-label= dateTitle
|
||||
time(datetime=date_xml(article[dateType]) title=dateTitle + ' ' + full_date(article[dateType]))= date(article[dateType], config.date_format)
|
||||
if theme.post_meta.page.categories && article.categories.data.length > 0
|
||||
span.article-meta
|
||||
span.article-meta-separator |
|
||||
@@ -69,7 +69,10 @@ mixin indexPostUI()
|
||||
span.article-meta-label= ' ' + _p('card_post_count')
|
||||
|
||||
if theme.comments.card_post_count && theme.comments.use
|
||||
case theme.comments.use[0]
|
||||
- const commentSystem = theme.comments.use[0]
|
||||
- const commentLink = url_for(link) + '#post-comment'
|
||||
|
||||
case commentSystem
|
||||
when 'Disqus'
|
||||
when 'Disqusjs'
|
||||
+countBlockInIndex
|
||||
@@ -77,30 +80,30 @@ mixin indexPostUI()
|
||||
i.fa-solid.fa-spinner.fa-spin
|
||||
when 'Valine'
|
||||
+countBlockInIndex
|
||||
a(href=url_for(link) + '#post-comment')
|
||||
a(href=commentLink)
|
||||
span.valine-comment-count(data-xid=url_for(link))
|
||||
i.fa-solid.fa-spinner.fa-spin
|
||||
when 'Waline'
|
||||
+countBlockInIndex
|
||||
a(href=url_for(link) + '#post-comment')
|
||||
a(href=commentLink)
|
||||
span.waline-comment-count(data-path=url_for(link))
|
||||
i.fa-solid.fa-spinner.fa-spin
|
||||
when 'Twikoo'
|
||||
+countBlockInIndex
|
||||
a.twikoo-count(href=url_for(link) + '#post-comment')
|
||||
a.twikoo-count(href=commentLink)
|
||||
i.fa-solid.fa-spinner.fa-spin
|
||||
when 'Facebook Comments'
|
||||
+countBlockInIndex
|
||||
a(href=url_for(link) + '#post-comment')
|
||||
a(href=commentLink)
|
||||
span.fb-comments-count(data-href=urlNoIndex(article.permalink))
|
||||
when 'Remark42'
|
||||
+countBlockInIndex
|
||||
a(href=url_for(link) + '#post-comment')
|
||||
a(href=commentLink)
|
||||
span.remark42__counter(data-url=urlNoIndex(article.permalink))
|
||||
i.fa-solid.fa-spinner.fa-spin
|
||||
when 'Artalk'
|
||||
+countBlockInIndex
|
||||
a(href=url_for(link) + '#post-comment')
|
||||
a(href=commentLink)
|
||||
span.artalk-count(data-page-key=url_for(link))
|
||||
i.fa-solid.fa-spinner.fa-spin
|
||||
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
.category-lists!= list_categories()
|
||||
<div id="categories-chart" data-parent="true" style="height: 300px; padding: 10px;"></div>
|
||||
.category-lists!= list_categories()
|
||||
@@ -1,3 +1,2 @@
|
||||
.tag-cloud-list.text-center
|
||||
!=cloudTags({source: site.tags, orderby: page.orderby || 'random', order: page.order || 1, minfontsize: 1.2, maxfontsize: 1.5, limit: 0, unit: 'em'})
|
||||
<div id="tags-chart" data-length="10" style="height: 300px; padding: 10px;"></div>
|
||||
!=cloudTags({source: site.tags, orderby: page.orderby || 'random', order: page.order || 1, minfontsize: 1.2, maxfontsize: 1.5, limit: 0, unit: 'em', custom_colors: page.custom_colors})
|
||||
|
||||
@@ -24,7 +24,7 @@ script.
|
||||
const options = { ...params, responsive: "resize" }
|
||||
|
||||
// Render the music score using ABCJS.renderAbc
|
||||
ABCJS.renderAbc(ele, ele.innerHTML, options)
|
||||
ABCJS.renderAbc(ele, ele.textContent, options)
|
||||
}
|
||||
}, 100)
|
||||
}
|
||||
|
||||
@@ -1,11 +1,275 @@
|
||||
script.
|
||||
(() => {
|
||||
const parseViewBox = viewBox => {
|
||||
if (!viewBox) return null
|
||||
const parts = viewBox.trim().split(/[\s,]+/).map(n => Number(n))
|
||||
if (parts.length !== 4 || parts.some(n => Number.isNaN(n))) return null
|
||||
return parts
|
||||
}
|
||||
|
||||
const getSvgViewBox = svg => {
|
||||
const attr = parseViewBox(svg.getAttribute('viewBox'))
|
||||
if (attr) return attr
|
||||
|
||||
// Fallback: use bbox to build a viewBox
|
||||
try {
|
||||
const bbox = svg.getBBox()
|
||||
if (bbox && bbox.width && bbox.height) return [bbox.x, bbox.y, bbox.width, bbox.height]
|
||||
} catch (e) {
|
||||
// getBBox may fail on some edge cases; ignore
|
||||
}
|
||||
|
||||
const w = Number(svg.getAttribute('width')) || 0
|
||||
const h = Number(svg.getAttribute('height')) || 0
|
||||
if (w > 0 && h > 0) return [0, 0, w, h]
|
||||
return [0, 0, 100, 100]
|
||||
}
|
||||
|
||||
const setSvgViewBox = (svg, vb) => {
|
||||
svg.setAttribute('viewBox', `${vb[0]} ${vb[1]} ${vb[2]} ${vb[3]}`)
|
||||
}
|
||||
|
||||
const clamp = (v, min, max) => Math.max(min, Math.min(max, v))
|
||||
|
||||
const openSvgInNewTab = ({ source, initViewBox }) => {
|
||||
const getClonedSvg = () => {
|
||||
if (typeof source === 'string') {
|
||||
const template = document.createElement('template')
|
||||
template.innerHTML = source.trim()
|
||||
const svg = template.content.querySelector('svg')
|
||||
return svg ? svg.cloneNode(true) : null
|
||||
}
|
||||
if (source && typeof source.cloneNode === 'function') {
|
||||
return source.cloneNode(true)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
const clone = getClonedSvg()
|
||||
if (!clone) return
|
||||
if (initViewBox && initViewBox.length === 4) {
|
||||
clone.setAttribute('viewBox', initViewBox.join(' '))
|
||||
}
|
||||
if (!clone.getAttribute('xmlns')) clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg')
|
||||
if (!clone.getAttribute('xmlns:xlink') && clone.outerHTML.includes('xlink:')) {
|
||||
clone.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink')
|
||||
}
|
||||
// inject background to match current theme
|
||||
const isDark = document.documentElement.getAttribute('data-theme') === 'dark'
|
||||
const bg = getComputedStyle(document.body).backgroundColor || (isDark ? '#1e1e1e' : '#ffffff')
|
||||
if (!clone.style.background) clone.style.background = bg
|
||||
|
||||
const serializer = new XMLSerializer()
|
||||
const svgSource = serializer.serializeToString(clone)
|
||||
const htmlSource = `<!doctype html><html><head><meta charset="utf-8" />
|
||||
<style>
|
||||
html, body { width: 100%; height: 100%; margin: 0; display: flex; align-items: center; justify-content: center; background: ${bg}; }
|
||||
svg { max-width: 100%; max-height: 100%; height: auto; width: auto; }
|
||||
</style>
|
||||
</head><body>${svgSource}</body></html>`
|
||||
const blob = new Blob([htmlSource], { type: 'text/html;charset=utf-8' })
|
||||
const url = URL.createObjectURL(blob)
|
||||
window.open(url, '_blank', 'noopener')
|
||||
setTimeout(() => URL.revokeObjectURL(url), 30000)
|
||||
}
|
||||
|
||||
const attachMermaidViewerButton = wrap => {
|
||||
let btn = wrap.querySelector('.mermaid-open-btn')
|
||||
if (!btn) {
|
||||
btn = document.createElement('button')
|
||||
btn.type = 'button'
|
||||
btn.className = 'mermaid-open-btn'
|
||||
wrap.appendChild(btn)
|
||||
}
|
||||
|
||||
btn.innerHTML = '<i class="fa fa-search fa-fw" aria-hidden="true"></i>'
|
||||
|
||||
if (!btn.__mermaidViewerBound) {
|
||||
btn.addEventListener('click', e => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
const svg = wrap.__mermaidOriginalSvg || wrap.querySelector('svg')
|
||||
if (!svg) return
|
||||
const initViewBox = wrap.__mermaidInitViewBox
|
||||
if (typeof svg === 'string') {
|
||||
openSvgInNewTab({ source: svg, initViewBox })
|
||||
return
|
||||
}
|
||||
openSvgInNewTab({ source: svg, initViewBox })
|
||||
})
|
||||
btn.__mermaidViewerBound = true
|
||||
}
|
||||
}
|
||||
|
||||
// Zoom around a point (px, py) in the SVG viewport (in viewBox coordinates)
|
||||
const zoomAtPoint = (vb, factor, px, py) => {
|
||||
const w = vb[2] * factor
|
||||
const h = vb[3] * factor
|
||||
const nx = px - (px - vb[0]) * factor
|
||||
const ny = py - (py - vb[1]) * factor
|
||||
return [nx, ny, w, h]
|
||||
}
|
||||
|
||||
const initMermaidGestures = wrap => {
|
||||
const svg = wrap.querySelector('svg')
|
||||
if (!svg) return
|
||||
|
||||
// Ensure viewBox exists so gestures always work
|
||||
const initVb = getSvgViewBox(svg)
|
||||
wrap.__mermaidInitViewBox = initVb
|
||||
wrap.__mermaidCurViewBox = initVb.slice()
|
||||
setSvgViewBox(svg, initVb)
|
||||
|
||||
// Avoid binding multiple times on themeChange/pjax
|
||||
if (wrap.__mermaidGestureBound) return
|
||||
wrap.__mermaidGestureBound = true
|
||||
|
||||
// Helper: map client (viewport) coordinate -> viewBox coordinate
|
||||
const clientToViewBox = (clientX, clientY) => {
|
||||
const rect = svg.getBoundingClientRect()
|
||||
const vb = wrap.__mermaidCurViewBox || getSvgViewBox(svg)
|
||||
const x = vb[0] + (clientX - rect.left) * (vb[2] / rect.width)
|
||||
const y = vb[1] + (clientY - rect.top) * (vb[3] / rect.height)
|
||||
return { x, y, rect, vb }
|
||||
}
|
||||
|
||||
const state = {
|
||||
pointers: new Map(),
|
||||
startVb: null,
|
||||
startDist: 0,
|
||||
startCenter: null
|
||||
}
|
||||
|
||||
const clampVb = vb => {
|
||||
const init = wrap.__mermaidInitViewBox || vb
|
||||
const minW = init[2] * 0.1
|
||||
const maxW = init[2] * 10
|
||||
const minH = init[3] * 0.1
|
||||
const maxH = init[3] * 10
|
||||
vb[2] = clamp(vb[2], minW, maxW)
|
||||
vb[3] = clamp(vb[3], minH, maxH)
|
||||
return vb
|
||||
}
|
||||
|
||||
const setCurVb = vb => {
|
||||
vb = clampVb(vb)
|
||||
wrap.__mermaidCurViewBox = vb
|
||||
setSvgViewBox(svg, vb)
|
||||
}
|
||||
|
||||
const onPointerDown = e => {
|
||||
// Allow only primary button for mouse
|
||||
if (e.pointerType === 'mouse' && e.button !== 0) return
|
||||
svg.setPointerCapture(e.pointerId)
|
||||
state.pointers.set(e.pointerId, { x: e.clientX, y: e.clientY })
|
||||
|
||||
if (state.pointers.size === 1) {
|
||||
state.startVb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice()
|
||||
} else if (state.pointers.size === 2) {
|
||||
const pts = [...state.pointers.values()]
|
||||
const dx = pts[0].x - pts[1].x
|
||||
const dy = pts[0].y - pts[1].y
|
||||
state.startDist = Math.hypot(dx, dy)
|
||||
state.startVb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice()
|
||||
state.startCenter = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 }
|
||||
}
|
||||
}
|
||||
|
||||
const onPointerMove = e => {
|
||||
if (!state.pointers.has(e.pointerId)) return
|
||||
state.pointers.set(e.pointerId, { x: e.clientX, y: e.clientY })
|
||||
|
||||
// Pan with 1 pointer
|
||||
if (state.pointers.size === 1 && state.startVb) {
|
||||
const p = [...state.pointers.values()][0]
|
||||
const prev = { x: e.clientX - e.movementX, y: e.clientY - e.movementY }
|
||||
// movementX/Y unreliable on touch, compute from stored last position
|
||||
const last = wrap.__mermaidLastSinglePointer || p
|
||||
const dxClient = p.x - last.x
|
||||
const dyClient = p.y - last.y
|
||||
wrap.__mermaidLastSinglePointer = p
|
||||
|
||||
const { rect } = clientToViewBox(p.x, p.y)
|
||||
const vb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice()
|
||||
const dx = dxClient * (vb[2] / rect.width)
|
||||
const dy = dyClient * (vb[3] / rect.height)
|
||||
setCurVb([vb[0] - dx, vb[1] - dy, vb[2], vb[3]])
|
||||
return
|
||||
}
|
||||
|
||||
// Pinch zoom with 2 pointers
|
||||
if (state.pointers.size === 2 && state.startVb && state.startDist > 0) {
|
||||
const pts = [...state.pointers.values()]
|
||||
const dx = pts[0].x - pts[1].x
|
||||
const dy = pts[0].y - pts[1].y
|
||||
const dist = Math.hypot(dx, dy)
|
||||
if (!dist) return
|
||||
const factor = state.startDist / dist // dist bigger => zoom in (viewBox smaller)
|
||||
|
||||
const cx = (pts[0].x + pts[1].x) / 2
|
||||
const cy = (pts[0].y + pts[1].y) / 2
|
||||
const centerClient = { x: cx, y: cy }
|
||||
|
||||
const pxy = clientToViewBox(centerClient.x, centerClient.y)
|
||||
const cpx = pxy.x
|
||||
const cpy = pxy.y
|
||||
|
||||
const vb = zoomAtPoint(state.startVb, factor, cpx, cpy)
|
||||
setCurVb(vb)
|
||||
}
|
||||
}
|
||||
|
||||
const onPointerUpOrCancel = e => {
|
||||
state.pointers.delete(e.pointerId)
|
||||
if (state.pointers.size === 0) {
|
||||
state.startVb = null
|
||||
state.startDist = 0
|
||||
state.startCenter = null
|
||||
wrap.__mermaidLastSinglePointer = null
|
||||
} else if (state.pointers.size === 1) {
|
||||
// reset single pointer baseline to avoid jump
|
||||
wrap.__mermaidLastSinglePointer = [...state.pointers.values()][0]
|
||||
}
|
||||
}
|
||||
|
||||
// Wheel zoom (mouse/trackpad)
|
||||
const onWheel = e => {
|
||||
// ctrlKey on mac trackpad pinch; we treat both as zoom
|
||||
e.preventDefault()
|
||||
const delta = e.deltaY
|
||||
const zoomFactor = delta > 0 ? 1.1 : 0.9
|
||||
const { x, y } = clientToViewBox(e.clientX, e.clientY)
|
||||
const vb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice()
|
||||
setCurVb(zoomAtPoint(vb, zoomFactor, x, y))
|
||||
}
|
||||
|
||||
const onDblClick = () => {
|
||||
const init = wrap.__mermaidInitViewBox
|
||||
if (!init) return
|
||||
wrap.__mermaidCurViewBox = init.slice()
|
||||
setSvgViewBox(svg, init)
|
||||
}
|
||||
|
||||
svg.addEventListener('pointerdown', onPointerDown)
|
||||
svg.addEventListener('pointermove', onPointerMove)
|
||||
svg.addEventListener('pointerup', onPointerUpOrCancel)
|
||||
svg.addEventListener('pointercancel', onPointerUpOrCancel)
|
||||
svg.addEventListener('wheel', onWheel, { passive: false })
|
||||
svg.addEventListener('dblclick', onDblClick)
|
||||
}
|
||||
|
||||
const runMermaid = ele => {
|
||||
window.loadMermaid = true
|
||||
const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? '!{theme.mermaid.theme.dark}' : '!{theme.mermaid.theme.light}'
|
||||
|
||||
ele.forEach((item, index) => {
|
||||
const mermaidSrc = item.firstElementChild
|
||||
|
||||
// Clear old render (themeChange/pjax will rerun)
|
||||
const oldSvg = item.querySelector('svg')
|
||||
if (oldSvg) oldSvg.remove()
|
||||
item.__mermaidGestureBound = false
|
||||
|
||||
const config = mermaidSrc.dataset.config ? JSON.parse(mermaidSrc.dataset.config) : {}
|
||||
if (!config.theme) {
|
||||
config.theme = theme
|
||||
@@ -17,8 +281,12 @@ script.
|
||||
const renderFn = mermaid.render(mermaidID, mermaidDefinition)
|
||||
const renderMermaid = svg => {
|
||||
mermaidSrc.insertAdjacentHTML('afterend', svg)
|
||||
if (!{theme.mermaid.zoom_pan}) initMermaidGestures(item)
|
||||
item.__mermaidOriginalSvg = svg
|
||||
if (!{theme.mermaid.open_in_new_tab}) attachMermaidViewerButton(item)
|
||||
}
|
||||
|
||||
|
||||
// mermaid v9 and v10 compatibility
|
||||
typeof renderFn === 'string' ? renderMermaid(renderFn) : renderFn.then(({ svg }) => renderMermaid(svg))
|
||||
})
|
||||
@@ -52,4 +320,4 @@ script.
|
||||
|
||||
btf.addGlobalFn('encrypt', loadMermaid, 'mermaid')
|
||||
window.pjax ? loadMermaid() : document.addEventListener('DOMContentLoaded', loadMermaid)
|
||||
})()
|
||||
})()
|
||||
|
||||
@@ -3,5 +3,4 @@ if theme.aside.card_announcement.enable
|
||||
.item-headline
|
||||
i.fas.fa-bullhorn.fa-shake
|
||||
span= _p('aside.card_announcement')
|
||||
.announcement_content!= theme.aside.card_announcement.content
|
||||
#welcome-ip-location-info
|
||||
.announcement_content!= theme.aside.card_announcement.content
|
||||
@@ -5,10 +5,10 @@ if theme.aside.card_tags.enable
|
||||
i.fas.fa-tags
|
||||
span= _p('aside.card_tags')
|
||||
|
||||
- let { limit, orderby, order } = theme.aside.card_tags
|
||||
- let { limit, orderby, order, custom_colors } = theme.aside.card_tags
|
||||
- limit = limit === 0 ? 0 : limit || 40
|
||||
|
||||
if theme.aside.card_tags.color
|
||||
.card-tag-cloud!= cloudTags({source: site.tags, orderby: orderby, order: order, minfontsize: 1.15, maxfontsize: 1.45, limit: limit, unit: 'em', page: 'index'})
|
||||
.card-tag-cloud!= cloudTags({source: site.tags, orderby: orderby, order: order, minfontsize: 1.15, maxfontsize: 1.45, limit: limit, unit: 'em', page: 'index', custom_colors: custom_colors})
|
||||
else
|
||||
.card-tag-cloud!= tagcloud({orderby: orderby, order: order, min_font: 1.1, max_font: 1.5, amount: limit , color: true, start_color: '#999', end_color: '#99a9bf', unit: 'em'})
|
||||
.card-tag-cloud!= tagcloud({orderby: orderby, order: order, min_font: 1.1, max_font: 1.5, amount: limit, color: true, start_color: '#999', end_color: '#99a9bf', unit: 'em'})
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
else
|
||||
!=partial('includes/widget/card_author', {}, {cache: true})
|
||||
!=partial('includes/widget/card_announcement', {}, {cache: true})
|
||||
!=partial('includes/widget/card_poem', {}, {cache: true})
|
||||
!=partial('includes/widget/card_top_self', {}, {cache: true})
|
||||
.sticky_layout
|
||||
if showToc
|
||||
@@ -22,7 +21,6 @@
|
||||
//- page
|
||||
!=partial('includes/widget/card_author', {}, {cache: true})
|
||||
!=partial('includes/widget/card_announcement', {}, {cache: true})
|
||||
!=partial('includes/widget/card_poem', {}, {cache: true})
|
||||
!=partial('includes/widget/card_top_self', {}, {cache: true})
|
||||
|
||||
.sticky_layout
|
||||
|
||||
Reference in New Issue
Block a user