Merge pull request #17 from xuanqb/patch-1

fix:安卓端渲染失败
This commit is contained in:
小能饼干 2025-04-12 13:39:37 +08:00 committed by GitHub
commit e478eb5a83
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 89 additions and 70 deletions

View File

@ -1,75 +1,94 @@
<div class="md-content">
{{Front}}
{{Front}}
</div>
<!-- https://github.com/markdown-it/markdown-it -->
<script defer src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/markdown-it/12.3.2/markdown-it.min.js"></script>
<!-- 代码高亮库 -->
<script defer src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/highlight.js/11.4.0/highlight.min.js"></script>
<script defer>
'use strict'
// 在anki中通过窗口查看调试信息 没控制台啊
function consoleLog(str) {
var div = document.createElement('div')
div.innerHTML = str
document.body.appendChild(div)
}
<script>
var getResources = [
getScript("https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/markdown-it/12.3.2/markdown-it.min.js"),
getScript("https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/highlight.js/11.4.0/highlight.min.js"),
];
// 加载资源并初始化
Promise.all(getResources)
.then(() => {
parseMarkDownFn();
})
.catch(error => {
consoleLog('Failed to load required resources: ' + error);
});
function getScript(url) {
return new Promise((resolve, reject) => {
const script = document.createElement("script");
script.onload = resolve;
script.onerror = () => reject(new Error(`Failed to load script from ${url}`));
script.src = url;
document.head.appendChild(script);
});
}
// 在anki中通过窗口查看调试信息 没控制台啊
function consoleLog(str) {
var div = document.createElement('div')
div.innerHTML = str
document.body.appendChild(div)
}
// 清除br标签
// anki自动生成的<br>全部干掉 严格按照原生换行来写
var clearBR = (str) => {
str = str.replace(/<br>/g, '\r\n')
return str
}
// 清除空格实体字符
var clearBlankNbsp = (str) => {
str = str.replace(/&nbsp;/g, ' ')
return str
}
// 反转义 HTML 实体,确保卡片中所有的符号正常
// Eg. #include <stdio.h>
var unescapeHTMLEntities = (innerHTML) =>
Object.assign(document.createElement('textarea'), { innerHTML }).value
// 解析入口main方法
var parseMarkDownFn = () => {
const md = markdownit({
html: true, // 若为 false 将导致 anki 自带的公式渲染失效。
linkify: true,
typographer: true,
breaks: true,
highlight: function (str, lang) {
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(str, { language: lang }).value
} catch (__) { }
}
return '' // use external default escaping
},
})
document.querySelectorAll('.md-content').forEach((div, index) => {
console.log('查找到的容器元素', div)
// 需要去除首尾空格 不然markdown-it会解析错误
var text = unescapeHTMLEntities(div.innerHTML).trim()
console.log('text', text)
// 清除br标签
// anki自动生成的<br>全部干掉 严格按照原生换行来写
var clearBR = (str) => {
str = str.replace(/<br>/g, '\r\n')
return str
}
text = clearBR(text)
// 👇关键核心md转换
var html = md.render(text)
var newDiv = document.createElement('div')
var hr = document.createElement('hr')
newDiv.innerHTML = html
// 激活github-markdown-css
newDiv.className = 'markdown-body'
div.parentNode.insertBefore(newDiv, div.nextSibling)
// 清除空格实体字符
var clearBlankNbsp = (str) => {
str = str.replace(/&nbsp;/g, ' ')
return str
}
// 反转义 HTML 实体,确保卡片中所有的符号正常
// Eg. #include <stdio.h>
var unescapeHTMLEntities = (innerHTML) =>
Object.assign(document.createElement('textarea'), { innerHTML }).value
// 解析入口main方法
var parseMarkDownFn = () => {
const md = markdownit({
html: true, // 若为 false 将导致 anki 自带的公式渲染失效。
linkify: true,
typographer: true,
breaks: true,
highlight: function (str, lang) {
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(str, { language: lang }).value
} catch (__) {}
}
return '' // use external default escaping
},
})
document.querySelectorAll('.md-content').forEach((div, index) => {
console.log('查找到的容器元素', div)
// 需要去除首尾空格 不然markdown-it会解析错误
var text = unescapeHTMLEntities(div.innerHTML).trim()
console.log('text', text)
// 清除br标签
text = clearBR(text)
// 👇关键核心md转换
var html = md.render(text)
var newDiv = document.createElement('div')
var hr = document.createElement('hr')
newDiv.innerHTML = html
// 激活github-markdown-css
newDiv.className = 'markdown-body'
div.parentNode.insertBefore(newDiv, div.nextSibling)
index === 1 ? div.parentNode.insertBefore(hr, div.nextSibling) : null
div.className = `x-${index}`
div.style.display = 'none'
// 不能从body直接插入元素 anki 不刷新的
})
}
parseMarkDownFn();
</script>
index === 1 ? div.parentNode.insertBefore(hr, div.nextSibling) : null
div.className = `x-${index}`
div.style.display = 'none'
// 不能从body直接插入元素 anki 不刷新的
})
}
</script>