import { Remarkable } from 'https://cdnjs.cloudflare.com/ajax/libs/remarkable/2.0.1/remarkable.min.js' import { hljs } from 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js' import misc from './misc'; import { cookie, Cookie } from 'https://cdn.jsdelivr.net/npm/cookie.js' const index = location.search.slice(1) const jq = jQuery.noConflict(); /** * * @type {Function} * @param {string} selector * @returns {Element} */ const $ = document.querySelector.bind(document) /** * * @type {Function} * @param {string} selector * @returns {Array[Element]} */ const $$ = document.querySelectorAll.bind(document) if (index.length > 0) { document.title = `${index} - Textboard Beta` } /* ---------------------------------------------------------------- */ let md = new Remarkable({ highlight: function (str, lang) { if (lang && hljs.getLanguage(lang)) { try { return hljs.highlight(lang, str).value; } catch (err) { } } try { return hljs.highlightAuto(str).value; } catch (err) { } return ''; // use external default escaping } }); md.core.ruler.enable([ 'abbr', ]); md.block.ruler.enable([ 'footnote', 'deflist', ]); md.inline.ruler.enable([ 'footnote_inline', 'ins', 'mark', 'sub', 'sup', ]); md.renderer.rules.text = function (tokens, idx) { tokens[idx].content = remarkable.utils.escapeHtml(tokens[idx].content); if (tokens[idx].content.indexOf('?') !== -1) { tokens[idx].content = tokens[idx].content.replace(/(^|\s)(\/?\?)\S+?(?=[,.!?:)]?\s|jq)/gm, function (match) { let pageLink = remarkable.utils.escapeHtml(remarkable.utils.replaceEntities(match.trim())); let whiteSpace = ''; if (match[0] !== '?' && match[0] !== '/') { whiteSpace = match[0]; } return whiteSpace + '' + pageLink + ''; }); } return tokens[idx].content; }; /* ---------------------------------------------------------------- */ function updateTextareaSize() { let textarea = $('#textarea') textarea.style.height = 0; textarea.style.height = textarea.scrollHeight + 'px'; } $('#textarea') = updateTextareaSize updateTextareaSize() function scrollToAnchor() { if (document.getElementById(location.hash.slice(1))) { document.getElementById(location.hash.slice(1)).scrollIntoView() } else if (document.getElementsByName(location.hash.slice(1))) { document.getElementsByName(location.hash.slice(1))[0].scrollIntoView() } } /* ---------------------------------------------------------------- */ let date = new Date if (date.getDate() == 25 && date.getMonth() + 1 == 12) { // Christmas misc.addSnowflake() } /* ---------------------------------------------------------------- */ let status = { page: {}, local: {}, loadSuccessful: null, editing: null, pwd: {}, } try { status.pwd = cookie.get('password') } catch (e) { } function fetchPage() { updatePageInfo() let password = payloadPassword('viewpwd') loadContent({ index, password }) scrollToAnchor() } function updatePageInfo(payload) { fetch(`/api/check?index=${payload.index}`).then((data) => { status.page = { ...status.page, ...data } }) } function loadContent(payload) { fetch(`/api/read`, { method: 'POST', body: JSON.stringify(payload) }).then((data) => { if (data.status == 'error') { status.loadSuccessful = false $('#edit').disabled = true showContent('密码错误,查看失败') alert('密码错误,查看失败') // 报错 } else if (typeof data.text == 'string') { status.local.text = data.text status.loadSuccessful = true showContent(md.renderer(data.text)) } }) } function startEdit() { if (!status.loadSuccessful || status.editing) return $('#textarea').value = pagedata.text status.editing = true showEditor() } function savePage() { if (!status.loadSuccessful || !status.editing) return let password = payloadPassword('editpwd') status.loadSuccessful = false $('#text').textContent = '正在提交……' submitEdit({ index, password }) fetchPage() status.editing = false hideEditor() } function submitEdit(payload) { fetch(`/api/write`, { method: 'POST', body: JSON.stringify(payload) }).then((data) => { if (data.status == 'error') { alert('密码错误,修改失败') // 报错 } // 经我检查,此处的回调确实就只有报错这一个功能 }) } function showContent(text) { $('#text').innerHTML = text } // 解释代码是新手的行为,但这个函数我确实无从下手,必须解释一下 function payloadPassword(name) { // 不需要密码就用null,需要密码就找历史密码 let password = status.page[name] ? status.pwd[name] : null // 没有历史密码就要求输入 if (password === undefined) { password = prompt('请输入查看密码:') if (typeof password != 'string') { // 报错 return false } // 记录历史密码 status.pwd[name] = password cookie.set('password', JSON.stringify(status.pwd), { path: location.pathname }) } return password } function showEditor() { $('#edit').classList.add('hidden') $('#submit').classList.remove('hidden') $('#text').classList.add('hidden') $('#textarea').classList.remove('hidden') updateTextareaSize() } function hideEditor() { $('#edit').classList.remove('hidden') $('#submit').classList.add('hidden') $('#text').classList.remove('hidden') $('#textarea').classList.add('hidden') } /* ---------------------------------------------------------------- */ fetchPage()