90 lines
2.5 KiB
Vue
90 lines
2.5 KiB
Vue
// 格式化浏览器书签
|
|
export function walkBookmarksTree(root) {
|
|
const result = []
|
|
// 深度优先遍历
|
|
const walk = (node, list) => {
|
|
const els = node.children
|
|
if (els && els.length > 0) {
|
|
for (let i = 0; i < els.length; i++) {
|
|
const item = els[i]
|
|
// p标签或h3标签直接跳过
|
|
if (item.tagName === 'P' || item.tagName === 'H3') {
|
|
continue
|
|
}
|
|
// 文件夹不用创建元素
|
|
if (item.tagName === 'DL') {
|
|
walk(els[i], list)
|
|
} else { // DT节点
|
|
let child = null
|
|
// 判断是否是文件夹
|
|
const children = item.children
|
|
let isDir = false
|
|
for (let j = 0; j < children.length; j++) {
|
|
if (children[j].tagName === 'H3' || children[j].tagName === 'DL') {
|
|
isDir = true
|
|
}
|
|
}
|
|
// 文件夹
|
|
if (isDir) {
|
|
child = {
|
|
type: item.tagName === 'DT' ? item.querySelector('h3') ? item.querySelector('h3').innerText : '' : '',
|
|
folder: true,
|
|
children: []
|
|
}
|
|
walk(els[i], child.children)
|
|
} else { // 书签
|
|
const _item = item.querySelector('a')
|
|
if (_item) {
|
|
child = {
|
|
title: _item?.innerText,
|
|
url: _item?.href
|
|
}
|
|
}
|
|
}
|
|
child && list.push(child)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
walk(root, result)
|
|
const myBookmark = result.filter(v => v.folder)
|
|
return flagBrowerList(myBookmark)
|
|
}
|
|
|
|
// 降维书签数据
|
|
const flagBrowerList = v => {
|
|
const res = []
|
|
const flatten = (v) => {
|
|
for (let i = 0; i < v.length; i++) {
|
|
if (v[i].folder) {
|
|
flatten(v[i].children)
|
|
const result = v[i]
|
|
result.children = result.children.filter(v => !v.folder)
|
|
res.push(result)
|
|
}
|
|
}
|
|
}
|
|
flatten(v)
|
|
return res
|
|
}
|
|
|
|
// 导出数据为JSON下载
|
|
export function exportBookmark() {
|
|
if (localStorage.getItem('BOOKMARK')) {
|
|
var content = localStorage.getItem('BOOKMARK')
|
|
var eleLink = document.createElement('a')
|
|
eleLink.download = 'kestrel-bookmark.json'
|
|
eleLink.style.display = 'none'
|
|
// 字符内容转变成blob地址
|
|
var blob = new Blob([content])
|
|
eleLink.href = URL.createObjectURL(blob)
|
|
// 触发点击
|
|
document.body.appendChild(eleLink)
|
|
eleLink.click()
|
|
// 然后移除
|
|
document.body.removeChild(eleLink)
|
|
} else {
|
|
this.$message.warning('暂无可导出数据')
|
|
}
|
|
}
|