Files
2026-09-24 16:25:22 +08:00

267 lines
5.7 KiB
HTML

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link href="./css/default.min.css" type="text/css" rel="stylesheet" />
<link href="./css/katex.min.css" type="text/css" rel="stylesheet" />
<style>
body,
html {
background: transparent;
margin: 0;
padding: 0;
}
* {
/* padding: 0;
margin: 0; */
}
p,
h1,
h3,
h2,
h4,
h5,
h6 {
margin: 8px 0;
}
hr {
border-width: 1px;
}
</style>
</head>
<body>
<div id="layout">
</div>
<script src="./js/uni.webview.1.5.5.js"></script>
<script src="./js/highlight.min.js"></script>
<script src="./js/marked-highlight.js"></script>
<script src="./js/marked-tables.js"></script>
<script src="./js/katex.js"></script>
<script src="./js/marked.min.js"></script>
<script src="./js/marked-katex-extension.js"></script>
<script type="text/javascript">
var md;
function getBodyHeight() {
var targetDiv = document.body.querySelector("#layout")
let height = targetDiv.scrollHeight
document.body.style.height = (height) + 'px'
window.parent.postMessage({
action: 'offsetHeight',
data: height + 5,
iframeId: iframeId
}, '*');
uni.postMessage({
data: {
action: 'offsetHeight',
data: height
}
})
}
var targetDiv = document.querySelector("#layout")
// 创建一个观察者对象并传入回调函数
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === 'childList' || mutation.type === 'attributes') {
getBodyHeight()
}
});
});
// 配置观察选项:
var config = {
attributes: true,
childList: true,
characterData: true,
subtree: true
};
// 选择需要观察变动的节点
observer.observe(targetDiv, config);
// 监听 div 的点击事件
targetDiv.addEventListener('click', function(event) {
let attr = {
text: "",
attr: "",
tag: ""
}
// 检查点击的目标是否是 <a> 标签
if (event.target.tagName === 'A') {
// 阻止默认行为(如跳转)
event.preventDefault();
attr.text = event.target.textContent
attr.attr = event.target.href
attr.tag = "a"
} else if (event.target.tagName === 'IMG') {
attr.attr = event.target.src
attr.tag = "img"
}
if (attr.attr != '') {
window.parent.postMessage({
action: 'click',
data: attr,
iframeId: iframeId
}, '*');
uni.postMessage({
data: {
action: 'click',
data: attr
}
})
}
});
function processMarkdown(markdown) {
// 1. 分割成行
const lines = markdown.split('\n');
let inCodeBlock = false;
let codeBlockIndentation = 0;
let processedLines = [];
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const trimmedLine = line.trimLeft();
// 检测代码块开始
if (trimmedLine.startsWith('```')) {
if (!inCodeBlock) {
// 进入代码块
inCodeBlock = true;
// 记录代码块的缩进级别
codeBlockIndentation = line.length - trimmedLine.length;
// 移除开始标记的缩进
processedLines.push(trimmedLine);
} else {
// 退出代码块
inCodeBlock = false;
// 移除结束标记的缩进
processedLines.push(trimmedLine);
}
} else if (inCodeBlock) {
// 代码块内的内容保持原有缩进
processedLines.push(line);
} else {
// 非代码块内容保持不变
processedLines.push(line);
}
}
return processedLines.join('\n');
}
function markdown(nr, isHtml) {
let content = ''
if (typeof nr == 'string') {
let cto = JSON.parse(nr);
if (cto.render == 'android') {
content = decodeURIComponent(atob(cto.value))
} else {
content = decodeURIComponent(cto.value)
}
} else {
if (nr.render == 'android') {
content = decodeURIComponent(atob(nr.value))
} else {
content = decodeURIComponent(nr.value)
}
}
if (isHtml) {
document.querySelector("#layout").innerHTML = content
return;
}
document.getElementById('layout').innerHTML = md.parse(processMarkdown(content));
}
function setBodyStyle(stylenr, isHtml) {
targetDiv.style = stylenr;
}
function getHtml() {
window.parent.postMessage({
action: 'toValue',
data: targetDiv.innerhtml,
iframeId: iframeId
}, '*');
uni.postMessage({
data: {
action: 'toValue',
data: targetDiv.innerhtml
}
})
}
// 在iframe内部执行以下代码
var frameElement = window.frameElement;
var iframeId = frameElement == null ? "" : frameElement.getAttribute('id');
// 等待初始化完毕
document.addEventListener('UniAppJSBridgeReady', () => {
md = new marked.Marked(
markedHighlight({
emptyLangClass: 'hljs',
langPrefix: 'hljs language-',
highlight(code, lang, info) {
// const language = hljs.getLanguage(lang) ? lang : 'plaintext';
// return hljs.highlight(code, {
// language
// }).value;
}
})
);
md.use(extendedTables());
md.use(markedKatex({
throwOnError: false
}));
md.setOptions({
breaks: true,
gfm: true,
});
window.parent.postMessage({
action: 'onJSBridgeReady',
data: '',
iframeId: iframeId
}, '*');
uni.postMessage({
data: {
action: 'onJSBridgeReady'
}
})
})
</script>
</body>
</html>